Flask学习笔记(3)
重定向
要将用户重定向到另一个端点,请使用 redirect()
函数
from flask import redirect
@app.route('demo')
def demo():
return redirect('https://www.baidu.com')
返回 JSON
import json
from flask import Flask, jsonify
@app.route('/demo')
def demo():
json_dict = {
"user_id": 10,
"user_name": "zhangsan"
}
return json.dumps(json_dict)
# return jsonify(json_dict)
注意:
return json.dumps() 和 return jsonify()的区别在与return jsonify() 会设置响应头 Content-Type:application/json。
自定义状态码和响应头
元组方式
可以返回一个元组,元组必须是(response, status, headers)的形式,且至少包含一个元素。status 值会覆盖状态码,headers 可以是一个列表或字典。
@app.route('/')
def index():
# return '状态码为404', 404
# return '状态码为404', 404, [('name', 'zhangsan')]
return '状态码为404', 404, {'name': 'lisi'}
make_response
from flask import Flask, make_response
@app.route('/')
def index():
res = make_response('测试 make_response')
res.headers['language'] = 'python'
res.status = " 404"
return res
cookie
设置 cookie
cookie 是从响应中得到的,所以我们可以在 Flask 返回的响应中即 make_response 中设置 cookie。要设置 cookie,可以使用 set_cookie
方法。
@app.route('/set_cookie')
def set_cookie():
res = make_response('set cookie ok')
res.set_cookie('username', 'aaa')
return res
设置 cookie 过期时间:
from datetime import datetime
res.set_cookie('username', 'aaa', max_age=3600) # 设置cookie 3600秒过期
res.set_cookie('userage', "18", expires=datetime(2021, 2, 1)) # 设置cookie,2021年2月1后过期
读取 cookie
@app.route('/get_cookie')
def get_cookie():
res = request.cookies.get('username')
return res
删除 cookie
@app.route('/delete_cookie')
def delete_cookie():
res = make_response('hello world!')
res.delete_cookie('username')
return res
session
需要先设置 SECRET_KEY
class DefaultConfig(object):
SECRET_KEY = 'gha2il4pm6le7jf'
app.config.from_object(DefaultConfig)
# 或者直接设置
app.secret_key='gha2il4pm6le7jf'
设置 session
@app.route('/set_session')
def set_session():
session['username'] = 'zhangsan'
return 'set session ok'
读取 session
@app.route('/get_session')
def get_session():
username = session.get('username')
return 'get session username {}'.format(username)
删除 session
有以下三种方式删除 session
session.pop(key)
del session[key]
session.clear()
异常处理
异常主动抛出
abort 方法
抛出一个给定状态码的 HTTPException 或者指定响应。
abort(500)
示例:
@app.route('/test_abort')
def test_abort():
user_id = request.args.get('user_id')
if user_id is None:
abort(400)
return 'user id {}'.format(user_id)
捕获错误
errorhandler 装饰器
注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法。
统一处理状态码为 500 的错误:
@app.errorhandler(500)
def internal_server_error(e):
print(e)
return '服务器找不到了'
捕获指定的异常:
@app.errorhandler(ZeroDivisionError)
def zero_division_error(e):
print(e)
return '除数不能为0'
请求钩子
请求钩子指的是在执行视图函数前后执行的一些函数,例如:在处理第一个请求时,建立数据库连接,在每次请求开始前,根据需求进行权限检验,在请求结束时,指定数据的交互格式等。
Flask 提供了以下四种请求钩子:
- before_first_request:在处理第一次请求前执行,可以做一些初始化的操作。
- before_request:在每次请求前执行。
- after_request:如果没有抛出错误,在每次请求之后调用。
- teardown_request:在每次请求之后调用,会接受一个参数,参数是服务器出现的错误信息。
示例:
# 在第一次请求之前调用
@app.before_first_request
def before_first_request():
print('before_first_request')
# 在每一次请求前都会执行
@app.before_request
def before_request():
print('before_request')
# 在请求之后运行
@app.after_request
def after_request(response):
print('after_request')
response.headers["Content-Type"] = "application/json"
return response
# 在每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息
@app.teardown_request
def teardown_request(error):
print('teardown_request: {}'.format(error))
上下文
flask 中有两种上下文:请求上下文和应用上下文
请求上下文
在 flask 中,直接使用 request 这个对象获取相关的数据,request 对象就是请求上下文的对象,保存了本次请求的相关数据,请求上下文对象有:request 和 session。
- request:封装了 HTTP 请求的内容,针对的是 http 请求。
- session:用来记录请求会话中的信息,针对的是用户信息。
应用上下文
应用上下文对象有:current_app、g
current_app
应用程序上下文,用于存储应用程序中的变量,可以通过 current_app.name 打印当前 app 的名称,也可以在 current_app 中存储一些变量。
示例:
app.py
import json
from datetime import datetime
from flask import Flask, request, abort
from werkzeug.routing import BaseConverter
app = Flask(__name__)
app.user_info = 'user info'
@app.route('/user')
def get_user_id():
user_id = request.args.get('user_id')
print(app.user_info)
if user_id is None:
abort(400)
return 'user id {}'.format(user_id)
from user import bp
app.register_blueprint(bp)
if __name__ == '__main__':
app.run(debug=True)
user.py
from flask import Blueprint, current_app
bp = Blueprint('user', __name__)
@bp.route('/bp')
def view_func():
print(current_app.name)
print(current_app.user_info)
return 'ok'
作用:current_app
就是当前运行的 flask app,在不方便操作 flask 的 app 对象时,可以操作 current_app
就等价于操作 app 对象。
g 对象
g 作为 flask 程序全局的临时变量,我们可以通过它在一次请求调用的多个函数间传递一些数据。每次请求都会重设这个变量。
from flask import Flask, g
app = Flask(__name__)
def query_user():
uid = g.user_id
uname = g.user_name
print('user_id = {},user_name={}'.format(uid, uname))
@app.route('/')
def get_user_frofile():
user_id = 123
user_name = '小明'
g.user_id = user_id
g.user_name = user_name
query_user()
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)