• Flask 给视图函数增加装饰器


    在@app.route的情况下增加装饰器的写法:

     1 from flask import Flask,request,render_template,redirect,session,url_for,views
     2 from flask import render_template
     3 
     4 app = Flask(__name__) #实例化flask对象
     5 app.debug = True   #能够随时更改自动重启,不加的话每次更改代码需要手动重启
     6 app.config['SECRET_KEY'] = '123456'   #secret_key,用于给session加密
     7 
     8 
     9 
    10 @app.route('/login',methods=['GET','POST'],endpoint='t1') #endpoint是url的别名,相当于django中Url的name
    11 def login():
    12     if request.method == "GET":
    13         # res = request.query_string
    14         # print(res)  获取通过GET请求url传过来的参数
    15         return render_template('login.html')
    16     else:
    17         user = request.form.get('user')
    18         pwd = request.form.get('pwd')
    19         if user == 'tom' and pwd == '123':
    20             session['userinfo'] = user   #设置session
    21             return render_template('hello.html')
    22         return render_template('login.html', error='用户名或密码错误')
    23 
    24 def wapper(func):
    25     def inner(*args,**kwargs):
    26         user = session.get('user_info')
    27         if not user:
    28             return redirect('/login')
    29         return func(*args,**kwargs)
    30     return inner
    31 
    32 
    33 @app.route('/detail/<int:nid>',methods=['GET'],endpoint='n1')
    34 @wapper
    35 def detail(nid):
    36     print(nid)
    37     return render_template('hello.html')
    38 '''
    39 如果给一个视图函数增加装饰器,应该加在app.route下面,这样的效果就是,
    40 装饰器将下面的所有内容包裹,然后路由对应到这大的包裹中来。
    41 需要注意endpoint要注明,如果不注明endpoint则默认用函数名来定义,
    42 此时所有的函数名都叫inner了,所以需要注明endpoint,只是为了区分。
    43 '''
    44 
    45 if __name__ == '__main__':
    46     app.run()

    另一种写法:

     1 import functools
     2 def wapper(func):
     3     @functools.wraps(func)
     4     def inner(*args,**kwargs):
     5         return func(*args,**kwargs)
     6     return inner
     7 '''
     8 functools.wraps()相当于保留元信息
     9 说白了就是,如果不加这个装饰器,那么你打印detail的__name__它就是inner了,
    10 因为加了装饰器,效果等同于inner=inner(detail()),
    11 如果在装饰器中加了functools这个装饰器,那么相当于给__name__重新赋值,inner.__name__ = func.__name_-
    12 其函数的名字得以保留。
    13 '''
    14 
    15 @wapper
    16 def detail():
    17     pass
    18 
    19 print(detail.__name__)

    flask的get_flashed_messages,flash

     1 from flask import Flask,get_flashed_messages,flash
     2 app = Flask(__name__)
     3 app.secret_key = 'asdf'
     4 @app.route('/get')
     5 def get():
     6     data = get_flashed_messages()
     7     print(data)
     8     return 'Hello world'
     9 
    10 @app.route('/set')
    11 def set():
    12     flash('info info')
    13     '''
    14     闪现效果,相当于set视图函数执行2次,会在一个列表中存储两个flash函数的内容,
    15     当执行get_flashed_messages的时候则会取出该列表,并清空,类似字典的Pop。
    16     具体用处不大。。。
    17     '''
    18     return 'Hello world'
    19 
    20 if __name__ == '__main__':
    21     app.run()

    flash还可以通过category参数给Flash内容归类,通过不同类别取不同内容。

  • 相关阅读:
    2.15 STL复习
    20190214Test(栈与队列)
    STL列表链式前向星
    链式前向星(邻接表)
    Priority_queue详解
    List详解
    NOIP2019计划
    第二章笔记
    第一章笔记
    本地文件上传GitHub
  • 原文地址:https://www.cnblogs.com/ArmoredTitan/p/8870819.html
Copyright © 2020-2023  润新知