目录
Flask介绍和安装
python web框架
同步框架:
- Django:大而全(3.x以后支持异步)
- flask:小而精,插件的支持
异步框架:Sanic、FastAPI
flask介绍
Flask是一个基于Python开发并且依赖jinja2模板(DTL)和Werkzeug WSGI(符合wsgi协议的web服务器,wsgiref)服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
flask安装
pip install flask
简单使用
from flask import Flask
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
return 'hello world'
if __name__ == '__main__':
# 运行
app.run()
访问:
http://127.0.0.1:5000/
请求与响应
请求
flask中获取请求的数据都是通过全局的模块:request。虽然是全局,但是用起来确实各自独立的。
from flask import request
请求方法 | 作用 |
---|---|
request.method | 请求方式 |
request.args | get 请求参数 |
request.form | post 请求参数 |
request.values | get,post请求的参数总和 |
request.files | 文件 |
request.cookies | 请求cookies |
request.headers | 请求头 |
request.path | 服务器地址后面的路径(不带get请求参数) |
request.full_path | 服务器地址后面的路径(带get请求参数) |
request.url | 带服务器地址的路径(带get请求参数) |
request.base_url | 带服务器地址的路径(不带get请求参数) |
request.url_root | 服务器IP地址:端口 |
request.host_url | 服务器IP地址:端口 |
request.host | 服务器IP地址:端口(不带http) |
响应
返回字符串
类比django中HttpResponse('字符串')
from flask import Flask
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
return '字符串'
if __name__ == '__main__':
# 运行
app.run()
返回模板(网页)
类比django中Render(request,模板,{})
from flask import Flask, render_template
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
return render_template(模板, 参数1=?, 参数2=?)
if __name__ == '__main__':
# 运行
app.run()
返回重定向
类比django中Redirect('路由')
from flask import Flask, redirect
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
return redirect('路由')
if __name__ == '__main__':
# 运行
app.run()
返回json
类比django中JsonResponse
from flask import Flask, jsonify
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
return jsonify(字典或列表..)
if __name__ == '__main__':
# 运行
app.run()
响应包装
方法:
from flask import make_response
使用:
res = make_response(render_template('home.html'))
# 写入cookie
res.set_cookie('name','lqz')
# 删除cookie
res.delete_cookie('name')
# 添加响应头
res.headers[''] = ''
# 返回
return res
登录案例
功能:登录成功cookie保存,没有登录时无法访问特定页面。
目录结构:
项目名
├── templates -- 网页文件夹,必须叫templates
├ ├── detail.html -- 单用户详情页
├ ├── index.html -- 用户列表
├ └── login.html -- 登录页面
└── login.py -- 功能实现
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>用户列表</h1>
<table>
{% for k,v in user_dict.items() %}
<tr>
<td>{
{ k }}</td>
<td>{
{ v.name }}</td>
<td>{
{ v['name']}}</td>
<td>{
{ v.get('name')}}</td>
<td><a href="/detail/{
{ k }}">查看详细</a></td>
</tr>
{% endfor %}
</table>
</body>
</html>
detail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>详细信息 {
{ info.name }}</h1>
<div>
{
{ info.text }}
</div>
</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
用户名<input type="text" name="username">
密码<input type="password" name="password">
<input type="submit" value="登录">
<p>{
{ error }}</p>
</form>
</body>
</html>
login.py
from flask import Flask, render_template, redirect, jsonify, request, session
from functools import wraps
app = Flask('main')
app.secret_key = 'abcdd' # 如果要使用session,必须写秘钥
# 用户信息,暂时用全局变量存储
USERS = {
1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}
# 登录装饰器,判断是否登录
def login_decorator(func):
@wraps(func) # 装饰器修复技术
def inner(*args, **kwargs):
username = session.get('username')
if username:
return func(*args, **kwargs)
else:
# 没有登录返回登录页面
return redirect('/login')
return inner
@app.route('/')
@login_decorator
def index():
return render_template('index.html', user_dict=USERS)
@app.route('/detail/<int:pk>')
@login_decorator
def detail(pk):
return render_template('detail.html', info=USERS.get(pk))
# 只接受get和post请求
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
username = request.form.get('username')
password = request.form.get('password')
# 判断是否登录成功
if username == 'tom' and password == '123':
# cookie保存
session['username'] = 'tom'
# 成功跳转到http://127.0.0.1:5000/
return redirect('/')
else:
# 登录失败给页面传参显示错误信息
return render_template('login.html', error='用户名或密码错误')
if __name__ == '__main__':
# 运行
app.run()
配置文件写法
第一种:
app.secret_key='asfasdf'
app.deb