zoukankan      html  css  js  c++  java
  • Flask框架实现给视图函数增加装饰器操作示例

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    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()

    另一种写法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import functools
    def wapper(func):
      @functools.wraps(func)
      def inner(*args,**kwargs):
        return func(*args,**kwargs)
      return inner
    '''
    functools.wraps()相当于保留元信息
    说白了就是,如果不加这个装饰器,那么你打印detail的__name__它就是inner了,
    如果在装饰器中加了functools这个装饰器,那么相当于给__name__重新赋值,inner.__name__ = func.__name_-
    其函数的名字得以保留。
    '''
    @wapper
    def detail():
      pass
    print(detail.__name__)
     
  • 相关阅读:
    用户描述
    课堂练习
    一阶段11.21
    一阶段11.20
    一阶段 11.19
    自己动手写spring(五) bean的生命周期管理
    自己动手写spring(四) 整合xml与注解方式
    自己动手写spring(三) 支持注解方式
    自己动手写spring(二) 创建一个bean工厂
    自己动手写spring(一) 使用digester
  • 原文地址:https://www.cnblogs.com/fengchong/p/10235624.html
Copyright © 2011-2022 走看看