Flask - 响应对象,request,session
一.Flask简介
Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask使用BSD授权。
Flask被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。
二.Flask的response对象
1.HttpResoponse
该对象在flask中表现为直接返回字符串格式的值.
from flask import Flask # 创建Flask对象 app = Flask(__name__) # 添加视图函数 @app.route('/home') def home(): return 'Home' # 启动Flask实例,开启debug app.run(debug=True)
2.render_template
从flask中引入render_template,该对象配合jinja2进行模板渲染展示。
from flask import (redirect,
render_template)
@app.route("/") def index(): name = 'alex' # 渲染模版 return render_template('index.html', name=name)
3.redirect
路由重定向
@app.route("/login", methods=['GET', 'POST']) def login(): if request.method == 'GET': return render_template('login.html') if request.form.get('username') in account_info.keys() and \ request.form.get('password') == account_info[request.form.get('username')][0]: session['username'] = request.form.get('username') #登录成功跳转到'/' return redirect('/') else: return "用户名或密码错误!"
4.jsonify
返回标准的json数据
from flask import jsonify @app.route("/json") def json_data(): # 将字典序列化成标准的json字符串,返回响应时在在响应头中加入content_type为application/json return jsonify({"name": 'alex'})


5.send_file
from flask import send_file @app.route("/file") def files(): # 打开文件并返回文件内容,并将文件类型加入到响应头中 return send_file('nv.jpg')

6.make_response
视图函数在返回响应时其实是可以接收三个参数的:
- 响应字符串
- 响应状态码
- 响应头
@app.route('/') def index(): user_agent = request.headers.get('User-Agent') # 成功请求默认返回是200,这里改成201,修改Content-Type return (f'<p>Your browser is {user_agent}</p>', 201, {'Content-Type': 'text/html'})
make_response也接收上面3个参数,并且返回一个response对象,有时候我们需要在视图函数中进行这种转换,然后在响应对象上调用各种方法,进一步设置响应。
from flask import Flask, request, make_response @app.route('/') def index(): user_agent = request.headers.get('User-Agent') # res为响应体对象 res = make_response(f'<p>Your browser is {user_agent}</p>', 201, {'Content-Type': 'text/html'}) # 在响应体上设置一个cookie res.set_cookie('name', 'alex') return res
7.abort
还有一种特殊的响应有abort函数生成,用于处理错误
user_dict = { 1: 'alex', 2: 'wusir', 3: 'mjj', } def load_user(id): return user_dict[id] if id in user_dict else None @app.route('/user/<int:id>') def get_user(id): user = load_user(id) if not user: abort(404) return f'<h1>Hello,{user}</h1>'
三.flask中的request
request包含请求的全部信息,request需要从flask中导入。
request.method # 请求方式 request.form # 存放FormData中的数据 to_dict 序列化成字典 request.args # 获取URL中的数据 to_dict 序列化成字典 request.url # 访问的完整路径 request.path # 路由地址 request.host # 主机地址 request.values # 获取 FormData and URL中的数据 不要用to_dict request.json # 如果提交时请求头中的Content-Type:application/json 字典操作 request.data # 如果提交时请求头中的Content-Type 无法被识别 将请求体中的原始数据存放 byte request.cookies # 获取Cookie中的数据 request.headers # 获取请求头 request.files # 序列化文件存储 save()
@app.route("/login", methods=['GET', 'POST']) def login(): # 获取请求方式 if request.method == 'GET': return render_template('login.html') # 获取formdata中的数据 if request.form.get('username') in account_info.keys() and \ request.form.get('password') == account_info[request.form.get('username')][0]: session['username'] = request.form.get('username') return redirect('/') else: return "用户名或密码错误!"
四.jinja2模板语法
{{}} 引用变量 执行函数
{%%} 逻辑代码
|safe Markup 安全标签字符串
@app.template_global()
@app.template_filter()
{% macro create_input(na,ty) %}
{{ na }} : <input type="{{ ty }}" name="{{ na }}">
{% endmacro %}
{{ create_input("username","text") }}
后续具体补充
五.Flask 中的 Session
app.secret_key = "加密字符串" # 用于序列化和反序列化 session信息
# 设置secret_key app.secret_key = 'asbhwui189asdnw' # 定义校验登录装饰器 def login_require(func): def warrper(*args, **kwargs): # 判断session获取 if not session.get('username'): return redirect('/login') return func(*args, **kwargs) return warrper
@app.route("/login", methods=['GET', 'POST']) def login(): # 获取请求方式 if request.method == 'GET': return render_template('login.html') # 获取formdata中的数据 if request.form.get('username') in account_info.keys() and \ request.form.get('password') == account_info[request.form.get('username')][0]: # 登录成功设置session session['username'] = request.form.get('username') return redirect('/') else: return "用户名或密码错误!"
由于Flask中默认Session 存放位置 - 客户端的Cookies中
所以Session需要加密 用到 secret_key
请求进入视图函数 带上cookie 将Session从cookie序列化出来 通过secret_key 反序列化成字典
浙公网安备 33010602011771号