1、引入(装饰器的问题):
一旦添加上装饰器,被装饰的函数的函数名称和文档信息都会被装饰器修改成wrapper和wrapper函数对应的文档,显然,这不是我们希望看到的。而且,如果被装饰的函数是多个视图函数的话,就会造成路由访问不到视图函数(因为多个视图函数的名字都一样了(都变成了
wrapper
))
解决:
方法一:使用python自带的functools
工具,再对装饰器进行再装饰。
方法二:使用装饰器调用的方式。
2、要求用户登录的接口
from flask import Flask, session, g, abort
import functools
app = Flask(__name__)
app.secret_key = 'dsadwdad' # 秘钥
# 需求:在`钩子函数`中统一提取用户信息,使用g变量存储用户信息
# 需求:将判断用户是否登录的代码封装到装饰器中
# 为了减少代码冗余,将用户信息提取的代码统一封装到钩子函数中
@app.before_request
def process_user():
user_name = session.get('user_name')
user_id = session.get('user_id')
g.user_name = user_name
g.user_id = user_id
# 要求用户必须登录的装饰器
def login_required(view_func):
@functools.wraps(view_func)
def wrapper(*args, **kwargs):
if g.user_name and g.user_id:
return view_func(*args, **kwargs)
else:
abort(401)
return wrapper
@app.route('/index')
def index_view():
if g.user_name and g.user_id:
return f'欢迎━(*`∀´*)ノ亻!{g.user_name}'
else:
return "<a href='/login'>去登录,点我</a>"
@app.route('/login', methods=['get', 'post'])
def login():
session['user_name'] = 'Tom'
session['user_id'] = 1
return '登录成功。。。'
# 注意顺序:先添加路由装饰器,再添加登录装饰器
@app.route('/comment')
@login_required
def comment():
"""评论接口"""
print(g.user_name)
print(g.user_id)
return '评论成功'
if __name__ == '__main__':
app.run(debug=True)