zoukankan      html  css  js  c++  java
  • 四 .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()

     

  • 相关阅读:
    Java+7入门经典 -1 简介
    优化算法动画演示Alec Radford's animations for optimization algorithms
    如何写科技论文How to write a technical paper
    开始学习深度学习和循环神经网络Some starting points for deep learning and RNNs
    用500行Julia代码开始深度学习之旅 Beginning deep learning with 500 lines of Julia
    用10张图来看机器学习Machine learning in 10 pictures
    ICLR 2013 International Conference on Learning Representations深度学习论文papers
    ICLR 2014 International Conference on Learning Representations深度学习论文papers
    卷积神经网络CNN(Convolutional Neural Networks)没有原理只有实现
    卷积神经网络Convolutional Neural Networks
  • 原文地址:https://www.cnblogs.com/lovershowtime/p/11735954.html
Copyright © 2011-2022 走看看