在 @app.route 的情况下增加装饰器的写法:
- from flask import Flask,request,render_template,redirect,session,url_for,views
- from flask import render_template
- app = Flask(__name__) #实例化 flask 对象
- app.debug = True #能够随时更改自动重启, 不加的话每次更改代码需要手动重启
- app.config['SECRET_KEY'] = '123456' #secret_key, 用于给 session 加密
- @app.route('/login',methods=['GET','POST'],endpoint='t1') #endpoint 是 url 的别名, 相当于 django 中 Url 的 name
- def login():
- if request.method == "GET":
- # res = request.query_string
- # print(res) 获取通过 GET 请求 url 传过来的参数
- return render_template('login.html')
- else:
- user = request.form.get('user')
- pwd = request.form.get('pwd')
- if user == 'tom' and pwd == '123':
- session['userinfo'] = user #设置 session
- return render_template('hello.html')
- return render_template('login.html', error='用户名或密码错误')
- def wapper(func):
- def inner(*args,**kwargs):
- user = session.get('user_info')
- if not user:
- return redirect('/login')
- return func(*args,**kwargs)
- return inner
- @app.route('/detail/<int:nid>',methods=['GET'],endpoint='n1')
- @wapper
- def detail(nid):
- print(nid)
- return render_template('hello.html')
'''
如果给一个视图函数增加装饰器, 应该加在 app.route 下面, 这样的效果就是,
装饰器将下面的所有内容包裹, 然后路由对应到这大的包裹中来.
需要注意 endpoint 要注明, 如果不注明 endpoint 则默认用函数名来定义,
此时所有的函数名都叫 inner 了, 所以需要注明 endpoint, 只是为了区分.
'''if __name__ =='__main__':
app.run()
另一种写法:
import functools
def wapper(func):
@functools.wraps(func)
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner
'''
functools.wraps() 相当于保留元信息
说白了就是, 如果不加这个装饰器, 那么你打印 detail 的__name__它就是 inner 了,
因为加了装饰器, 效果等同于 inner=inner(detail()),
如果在装饰器中加了 functools 这个装饰器, 那么相当于给__name__重新赋值, inner.__name__ = func.__name_-
其函数的名字得以保留.
'''
@wapper
def detail():
pass
print(detail.__name__)
flask 的 get_flashed_messages,flash
from flask import Flask,get_flashed_messages,flash
app = Flask(__name__)
app.secret_key = 'asdf'
@app.route('/get')
def get():
data = get_flashed_messages()
print(data)
return 'Hello world'
@app.route('/set')
def set():
flash('info info')
'''
闪现效果, 相当于 set 视图函数执行 2 次, 会在一个列表中存储两个 flash 函数的内容,
当执行 get_flashed_messages 的时候则会取出该列表, 并清空, 类似字典的 Pop.
具体用处不大...
'''return'Hello world'if __name__ =='__main__':
app.run()
flash 还可以通过 category 参数给 Flash 内容归类, 通过不同类别取不同内容.
来源: https://www.cnblogs.com/fu-yong/p/9172315.html