• 四 .Flask 模板 中间件 特殊装饰器 CBV 正则 基础知识(使用)


    一 Flask 模板 中间件 特殊装饰器  CBV 正则

    1 .Flask 模板语法直接看面效果

    https://www.cnblogs.com/lovershowtime/p/11349576.html    模板  和Django模板类似

    edit.html

    <form> asdfasdf asdfasdf asdf asdf 哈啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 </form>
    login.html

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <h1>模板11111111</h1> {% block content %} {% endblock %} </body> </html>
    show.html

    {% extends "login.html"%} {# 引入继承模板 语法#} {% block content %} {# 继承模板 语法#} {{users.0}} {{users[0]}} {{txt}} <!--{{txt|safe}}--> {{func(6)}} {# 单个函数使用#} {{sb(1,9)}} {# 这个装饰器 是全局装饰器直接调用 传参数#} {{ 1|db(2,3) }} {#@app.template_filter() 使用这个装饰器 必须这样传参数#} {% if 1|db(2,3) %} <div>333</div> {% else %} <div>999</div> {% endif %} {% include "edit.html" %} {#引入其他模板#} {# 这Flask 里面的宏定义(相当一个函数)#} {% macro ccccc(name, type='text', value='') %} <h1>哈哈哈哈</h1> <input type="{{ type }}" name="{{ name }}" value="{{ value }}"> <input type="submit" value="提交"> {% endmacro %} {{ ccccc('n1') }} {# 这里相当于调用#} {{ ccccc('n2') }} {# 这里相当于调用#} {{ ccccc('n3') }} {# 这里相当于调用#} {% endblock %}
    app.py

    from
    flask import Flask, request,jsonify,json,render_template,redirect,url_for,session,Markup,flash,get_flashed_messages app=Flask(__name__) # 全局定义函数 @app.template_global() # 这个装饰器 装饰的函数可以全局使用 可以不用传参到模板中 而模板中可以直接使用或者调用 def sb(a1, a2): # {{sb(1,9)}} return a1 + a2 # 全局定义函数 @app.template_filter() # 这个装饰器过滤 装饰的函数可以全局使用 可以不用传参到模板中 而模板中可以直接使用或者调用 def db(a1, a2, a3): # {{ 1|db(2,3) }} 传参方式 return a1 + a2 + a3 def func(arg): # 单个函数需要传参数到模板 使用 return arg + 1 @app.route('/tpl/') def tpl(): context = { 'users':['李四','展示给乌鸡','啦啦啦啦'], 'txt':Markup("<input type='text' />"), 'func':func } return render_template('show.html',**context) if __name__=="__main__": app.run()



    2 .Flask 中间件

    https://www.cnblogs.com/lovershowtime/p/11384508.html     django 中间件 但是和Flask中间件不一样

    - call方法什么时候出发?
                - 用户发起请求时,才执行。
            - 任务:在执行call方法之前,做一个操作,call方法执行之后做一个操作。

    class Middleware(object):
         def __init__(self,old):
                self.old = old

         def __call__(self, *args, **kwargs):
                ret = self.old(*args, **kwargs)
                    return ret


    if __name__ == '__main__':
      app.wsgi_app = Middleware(app.wsgi_app)
       app.run()

    from flask import Flask
    app = Flask(__name__)
    @app.route('/index')
    def index():
        print('index')
        return "Index"
    
    class Middleware(object):
        def __init__(self,old):
            self.old = old
        def __call__(self, *args, **kwargs):
            ret = self.old(*args, **kwargs)
            return ret
    
    if __name__ == '__main__':
        app.wsgi_app = Middleware(app.wsgi_app)
        app.run()

     3. 特殊装饰器(有点向django中间)

          @app.template_global                 在模板中使用  定义全局使用的装饰器 (使用方法请看上面模板)
           
           @app.template_filter                  在模板中使用  定义全局使用的装饰器
    
    

    @app.before_request  重点

    @app.after_request   重点

    before_request 没有返回 值的情况下 看图

    from
    flask import Flask app = Flask(__name__) @app.before_request def aa(): print('aa1') @app.after_request def bb(cc): print('bb22') return cc @app.route("/index/") def index(): print("index") return "index1111" @app.route("/home/") def home(): print("home") return "home22222222" if __name__ == '__main__': app.run()


    
    
    before_request 有 返回值的情况下 看图
    from flask import Flask
    app = Flask(__name__)
    @app.before_request
    def aa():
        print('aa1')
        return "哈哈哈哈1111"
    
    @app.after_request
    def bb(cc):
        print('bb22')
        return cc
    
    @app.route("/index/")
    def index():
          print("index")
    
          return "index1111"
    @app.route("/home/")
    def home():
          print("home")
          return "home22222222"
    if __name__ == '__main__':
        app.run()

    from flask import Flask
    app = Flask(__name__)
    @app.before_first_request   不常用 了解
    def x1():
        print('123123')
    
    @app.route('/index/')
    def index():
        print('index')
        return "Index"
    
    @app.route('/home/')
    def order():
        print('order')
        return "order"
    
    @app.errorhandler(404)         不常用 了解
    def not_found(arg):
    print(arg) return "没找到"

    if __name__ == '__main__':
    app.run()


     4. CBV(一路径对应一个类)

    import functools
    from flask import Flask,views
    app = Flask(__name__)
    
    装饰器
    def wrapper(func):
        @functools.wraps(func)
        def inner(*args,**kwargs):
            return func(*args,**kwargs)
        return inner
    
    
    class UserView(views.MethodView):
        # methods = ['GET']          # 添加请求方法   如果添加了 下面整个方法 都是get请求
        # decorators = [wrapper,]   # 添加装饰器
    
        def get(self,*args,**kwargs):
            return 'GET'
    
        def post(self,*args,**kwargs):
            return 'POST'
    
    app.add_url_rule('/home/',None,UserView.as_view(name="aa"))   # name=endpoint  别名参数 参数必传   CBV url只能这么写
    
    if __name__ == '__main__':
        app.run()
    def auth(func):
        def inner(*args, **kwargs):
            print('before')
            result = func(*args, **kwargs)
            print('after')
            return result
    
        return inner
    
    class IndexView(views.View):
        methods = ['GET']
        decorators = [auth, ]
    
        def dispatch_request(self):
            print('Index')
            return 'Index!'
    #如果不传name,这所有返回的都是view,这样就会报错,所有人家必须你要传递参数
    #然后他传递给view_func的其实就是你视图类中的dispatch_request方法。这样我们没有办法,在一个视图类中写多种请求方式
    app.add_url_rule('/index', view_func=IndexView.as_view(name='index'))  # name=endpoint
    #或者,通常用此方式
      class IndexView(views.MethodView):
                methods = ['GET']
                #cbv添加装饰,用这个,我们看as_view中就知道了
                decorators = [auth, ]
                def get(self):
                    return 'Index.GET'
                
                def post(self):
                    return 'Index.POST'
    #如果我们继承了MethodView,他帮我们重写了,dispatch_request方法,他给我们做了一个分发,通过请求,来执行不同的函数
    app.add_url_rule('/index', view_func=IndexView.as_view(name='index'))  # name=endpoint

    5 . Flask正则 (注意flask默认不支持正则)

    from flask import Flask,url_for
    
    app = Flask(__name__)
    
    # 步骤一:定制类
    from werkzeug.routing import BaseConverter
    
    class RegexConverter(BaseConverter):
        """
        自定义URL匹配正则表达式
        """
        def __init__(self, map, regex):
            super(RegexConverter, self).__init__(map)
            self.regex = regex
        def to_python(self, value):
            """
            路由匹配时,匹配成功后传递给视图函数中参数的值
            :param value:
            :return:
            """
            return int(value)
    
        def to_url(self, value):
            """
            使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
            :param value:
            :return:
            """
            val = super(RegexConverter, self).to_url(value)
            return val
    
    # 步骤二:添加到转换器
    app.url_map.converters['reg'] = RegexConverter
    
    """
    1. 用户发送请求
    2. flask内部进行正则匹配
    3. 调用to_python(正则匹配的结果)方法
    4. to_python方法的返回值会交给视图函数的参数
    
    """
    
    
    # 步骤三:使用自定义正则
    @app.route('/index/<reg("d+"):nid>')
    def index(nid):
        print(nid,type(nid))
    
        print(url_for('index',nid=987))
        return "index"
    
    if __name__ == '__main__':
        app.run()
    #1 写类,继承BaseConverter
    #2 注册:app.url_map.converters['regex'] = RegexConverter
    # 3 使用:@app.route('/index/<regex("d+"):nid>')  正则表达式会当作第二个参数传递到类中
    from flask import Flask, views, url_for
    from werkzeug.routing import BaseConverter
    
    app = Flask(import_name=__name__)
    
    class RegexConverter(BaseConverter):
        """
        自定义URL匹配正则表达式
        """
        def __init__(self, map, regex):
            super(RegexConverter, self).__init__(map)
            self.regex = regex
    
        def to_python(self, value):
            """
            路由匹配时,匹配成功后传递给视图函数中参数的值
            """
            return int(value)
    
        def to_url(self, value):
            """
            使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
            """
            val = super(RegexConverter, self).to_url(value)
            return val
        
    # 添加到flask中
    app.url_map.converters['regex'] = RegexConverter
    @app.route('/index/<regex("d+"):nid>')  #这里是调用to_python方法.且先执行to_python再运行index函数
    def index(nid):
        print(url_for('index', nid='888'))  #这里其实调用to_url方法
        return 'Index'
    
    if __name__ == '__main__':
        app.run()

     

  • 相关阅读:
    Unity3d热更新全书-加载(一)从AssetBundle说起
    Unity3D热更新全书-脚本(三) C#LightEvil语法与调试
    Unity3D热更新全书-脚本(二) 两级分化
    Unity3D热更新全书-脚本(一) 初识脚本
    Unity3D热更新全书-何谓热更新,为何热更新,如何热更新
    C#Light/Evil合体啦
    C#最良心脚本语言C#Light/Evil,XamarinWP8Unity热更新最良心方案,再次进化.
    C#Light 再推荐,顺便介绍WP8 功能展示项目
    任意两张带透明图像的一种形状过渡效果
    FileFilter
  • 原文地址:https://www.cnblogs.com/lovershowtime/p/11735954.html
Copyright © 2020-2023  润新知