Flask提供的内置对象常用的有request, session, g。这些对象可以在模板或请求函数中直接使用。
目录
request对象
首先需要从flask模块导入request
from flask import request
request.args.get() 获取Get请求URL参数
request.form['username'] 获取表单username内容
from flask import request
@app.route('/login', methods=['POST', 'GET'])
def login():
if request.method == 'POST':
if request.form['user'] == 'admin':
return 'Admin login successfully!'
else:
return 'No such user!'
title = request.args.get('title', 'Default')
return render_template('login.html', title=title)
session对象
会话可以用来保存请求的一些状态,以便于在请求之间共享信息。
from flask import Flask, session, redirect, url_for, escape, request
app = Flask(__name__)
# 实际使用不能使用简单的值,可以使用os.urandom(24)生成复杂秘钥
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
@app.route('/')
def index():
if 'username' in session:
return 'Logged in as %s' % escape(session['username'])
return 'You are not logged in'
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
return '''
<form method="post">
<p><input type=text name=username>
<p><input type=submit value=Login>
</form>
'''
要设置一个密钥app.secret_key,越复杂越好,防止CSRF攻击。
可以用命令行生成一个高强度的秘钥
$ python -c 'import os; print(os.urandom(16))'
在退出的时候清除用户数据
@app.route('/logout')
def logout():
session.pop('user', None)
return redirect(url_for('login'))
要注意基于cookie的session使用,Flask会把session里面设置的Object序列化到cookie里,如果发现请求之间的一些值不能保持,就要比较页面响应的cookie大小跟浏览器支持的大小。要使用服务器端session保持可以使用一些第三方的扩展。
响应
参考官方文档:https://flask.palletsprojects.com/en/1.1.x/quickstart/#accessing-request-data
返回的值会自动转换成一个response对象。
(1)如果返回是字符串,会自动转换成一个以字符串为响应体(response body),状态码为200,mime-type为text/html,其它参数默认的响应(response)对象。
(2)如果返回的是字典,调用jsonify()创建响应对象返回。
(3)如果返回的是元组,元组要符合下面的格式:(response, status), (response, headers), 或 (response, status, headers)。
(4)如果返回的数据不是以上的类型,Flask会返回一个符合WSGI应用的响应对象。
下面是返回字典数据例子:
返回的是字典数据,Flask自动转换成Json数据:
@app.route("/me")
def me_api():
user = get_current_user()
return {
"username": user.username,
"theme": user.theme,
"image": url_for("user_image", filename=user.image),
}
可以使用jsonify()创建成Json数据类型返回:
@app.route("/users")
def users_api():
users = get_all_users()
return jsonify([user.to_json() for user in users])
下面是返回元组数据的例子:
@app.errorhandler(404)
def not_found(error):
# 元组格式(response, status)
return render_template('error.html'), 404
可以使用make_response包装返回的表达式,更加精细控制返回的对象,例如设置响应头等信息。
@app.errorhandler(404)
def not_found(error):
resp = make_response(render_template('error.html'), 404)
resp.headers['X-Something'] = 'A value'
return resp
make_response方法就是用来构建response对象的,第二个参数代表响应状态码,缺省就是”200”。
Cookie使用
request的cookies属性获取cookie,response对象的set_cookie方法设置cookie
读cookies:
from flask import request
@app.route('/')
def index():
username = request.cookies.get('username')
# use cookies.get(key) instead of cookies[key] to not get a
# KeyError if the cookie is missing.
设置cookies:
from flask import make_response
@app.route('/')
def index():
resp = make_response(render_template(...))
resp.set_cookie('username', 'the username')
return resp
全局对象g
flask.g是Flask一个全局对象,作用范围就在一个请求(也就是一个线程)里,它不能在多个请求间共享。