zoukankan      html  css  js  c++  java
  • Flask中的CBV以及正则表达式

    Flask中的CBV以及正则表达式

    一.CBV

    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
    

    二.正则表达式

    #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()
    
  • 相关阅读:
    01背包--小P寻宝记——粗心的基友
    StringIndexOutOfBoundsException
    2014秋C++ 第8周项目 分支程序设计
    【JavaScript】正則表達式
    专业函数画图软件Origin
    设计模式学习–Decorator
    python使用requests模块模拟登陆知乎
    分享几个比较好的站点
    【转载】selenium之 定位以及切换frame(iframe)
    判断Selenium加载完成
  • 原文地址:https://www.cnblogs.com/pythonywy/p/11600416.html
Copyright © 2011-2022 走看看