目录
装饰器
定义装饰器,判断请求头中,是否存在用户名?
- 存在,认为用户是合法用户,允许通过
- 不存在,拒绝用户
from flask import request
def login_auth(func):
def wrapper(*args, **kwargs):
# 1. 获取用户请求头中的 用户名 信息
username = request.headers.get('USERNAME')
# 2. 判断用户名
if username:
# 2.1 存在,继续执行
return func(*args, **kwargs)
else:
# 2.2 不存在,拒绝访问
return {
'msg': '认证失败'
}, 401
return wrapper
所有方法添加装饰器
from flask_restful import Resource
from utils.auth import login_auth
# 图书的所有操作:增、查 都需要通过装饰器验证权限
class BookResource(Resource):
method_decorators = [login_auth]
def get(self):
return ['图书1', '图书2']
def post(self):
return {
'name': '图书3'
}, 201
为单个方法指定装饰器
from flask_restful import Resource
from utils.auth import login_auth
# 此时,只有图书的 添加操作需要 通过装饰器验证权限,而查询操作就不需要验证权限
class BookResource(Resource):
method_decorators = {
'post': [login_auth]
}
def get(self):
return ['图书1', '图书2']
def post(self):
return {
'name': '图书3'
}, 201
session
视图函数中操作时实质就是字典
当请求刚进来时,flask会帮我们读取cookie中某个key对应的值,将这个值解密并反序列化成为一个字典,放入内存,以便视图函数使用。
当请求结束时,flask会读取内存中字典的值,进行序列化和加密,再写入到用户的cookie中
# 设置值
session['key']=value
# 取值
session.get('hey')
# session的配置文件
"SESSION_COOKIE_NAME": "session",
"SESSION_COOKIE_DOMAIN": None,
"SESSION_COOKIE_PATH": None,
"SESSION_COOKIE_HTTPONLY": True,
"SESSION_COOKIE_SECURE": False,
"SESSION_COOKIE_SAMESITE": None,
"SESSION_REFRESH_EACH_REQUEST": True, # 每次请求后,过期时间都刷新
PERMANENT_SESSION_LIFETIME=timedelta(days=1) #设置session的过期时间
特殊装饰器
前俩类似django中间件
@app.before_request # 在请求执行前执行
@app.after_request # 在所有请求执行完之后执行,这个装饰的函数必须接收一个response参数,并且需要返回出去
# before_request装饰的函数,谁先定义谁先执行
# after_request装饰的函数,谁后定义谁先执行
# 如果在before_request中有返回值,那么后面的before_request请求装饰的函数不会再执行,直接到最后一个after_request装饰的函数执行;这点要区别于django1.10版本以后的中间件执行流程。
@app.before_first_request # 它装饰的函数在你启动后第一次请求才执行
@app.template_global
@app.template_filter
@app.errorhandler(404) # 没找到页面时可以返回一个404页面
def not_found(arg):
print(arg)
return '没找到'