zoukankan      html  css  js  c++  java
  • Flask:路由系统;CBV的代码案例

    参考链接:https://www.cnblogs.com/xiaoyuanqujing/articles/11715484.html#_label5

    一.路由使用

    1.# 最简单使用
    @app.route('路由地址')
    
    # 示例
    from  flask import Flask
    app=Flask(__name__)
    @app.route('/')
    def index():
        return "ok"
    
    if __name__ == '__main__':
        app.run()
    2.#其他使用方式
    @app.route('地址<类型:参数名>',methods=['请求方式1','请求方式2',..],endpoint='别名')
    
    app.add_url_rule('地址<类型:参数名>',view_func=函数名,endpoint="别名",methods=['请求方式1','请求方式2',..])
    
    # 示例
    # @app.route('/login',methods=['POST',"GET"],endpoint="sb")
    def login(nid):
        print(type(nid),nid)
        return "ojbk_login"
    #1.rule --->就是路由
    #2.enpoint,取别名,如果没有就用当前函数名,不能重复
    #3.defaults = None, 默认值, 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'} 为函数提供参数
    示例:
    @app.route('/',defaults = {"name":18})
    def hello_world(name):
    print(name)
    return 'Hello World!'
    #4.methods=["POST","GET"]
    #5.view_func 就我们endpoint,指向的函数,也就请求该路由的时候,要响应函数
    app.add_url_rule('/login/<string:nid>',view_func=login,endpoint="sb",methods=['POST',"GET"])

    二 .路由带参和转换器(类似于django有名分组)

    1.第一种方式:(默认参数为字符串类型)

    # 第一种传参方式
    @app.route('地址<参数名>')
    def 函数名(参数名):
      pass
    # 示例 @app.route('/student_list/<student_id>/') def student_list(student_id): return '学生{}号的信息'.format(student_id)

    2.第二种方式:加过滤条件(转换器)

    # 过滤条件
    @app.route('路由地址<数据类型:参数名>')
    def 函数名(参数名):
      pass
    # 示例 @app.route('/student_list/<int:student_id>/') def article_detail(student_id): return '学生{}号的信息'.format(student_id)

    2.1.注意有以下几种转换器(过滤太监)

    1.主要有这几种类型过滤:
    
      string: 默认的数据类型,接收没有任何斜杠"  /"的字符串
    
      int: 整型
    
      float: 浮点型
    
      path: 和string类型相似,但是接受斜杠,如:可以接受参数/aa/bb/cc/多条放在一起
    
      uuid: 只接受uuid格式的字符串字符串,
    any:接收任意类型 ​ ✔提示:uuid为全宇宙唯一的串
    2.函数的参数一定要带有参数名

    默认转换器

    DEFAULT_CONVERTERS = {
        'default':          UnicodeConverter,
        'string':           UnicodeConverter,
        'any':              AnyConverter,
        'path':             PathConverter,
        'int':              IntegerConverter,
        'float':            FloatConverter,
        'uuid':             UUIDConverter,
    }

    2.3.自定义正则转换器

    flask路由不支持正则匹配所以要自定义,但是正则用的很少如需要使用正则可以直接使用"any”转换器

    1.代码逻辑思路:

    #1导入模块:from werkzeug.routing import BaseConverter
    
    #2.自定义类继承BaseConverter,然后实现__inti__, def to_python(self, 
    value):to_url(self, value)方法
    
    #3.添加自定义类: app.url_map.converters['任意名'] = 自定义类名
    
    #4.路由使用:@app.route('/index/<regex1("正则表达式"):nid>'),regex1='谁便,regex1("正则表达式")
    
    注意:
    #1.to_python:接收到regex1("正则表达式")匹配出来的结果,处理后返回给是函数,一定要return
    #2.to_url:接收到反向解析的的参数,处理后return的结果才是我们拼接到我们路由上

    2.2.具体代码示例:此示例只能匹配整型

    from flask import Flask,url_for
    app = Flask(__name__)
    # 1.导入正则模块
    from werkzeug.routing import BaseConverter
    
    # 2.自定义继承BaseConverter
    class RegexConverter(BaseConverter):
        """
        自定义URL匹配正则表达式
        """
        def __init__(self, map, regex):
            super(RegexConverter, self).__init__(map)
            self.regex = regex
    
        def to_python(self, value):
            """
            1.value :路由匹配时,正则表达式匹配到的值
            2.也可在此写别的逻辑处理value并返回
            3.return返回值:会被视图函数接收
            """
            print(value)
            return int(value)
    
        def to_url(self, value):
            """
            1.value:,url_fo反向解析时,传递的动态参数值
            2.return返回值:生成URL中的参数
            """
            print(value)
            val = super(RegexConverter, self).to_url(value)
            return val
    # 3.添加自定义类:app.url_map.converters['任意名'] = 自定义类
    app.url_map.converters['regex'] = RegexConverter
    
    # 4.使用:@app.route('/index/<任意名("正则表达式"):nid>')
    @app.route('/index/<regex("d+"):nid>')
    def index(nid):
        print(nid)
        print(url_for('index', nid='888'))
        return 'Index'
    
    if __name__ == '__main__':
        app.run()

    三.路由的严格模式

    链接:https://www.cnblogs.com/xiaoyuanqujing/articles/11644016.html#_label0

    1.路由严格模式设置

    1.是否严格模式:对URL最后的 / 符号是否严格要求
    strict_slashes = None
        '''
            @app.route('/index', strict_slashes=False)
            #访问http://www.xx.com/index/ 或http://www.xx.com/index均可
            @app.route('/index', strict_slashes=True)
            #仅访问http://www.xx.com/index
        '''
    2.#重定向到指定地址
    redirect_to = 路由地址, 
        '''
            @app.route('/index/<int:nid>', redirect_to='/home/<nid>')
        '''

    四 .路由反向解析

    作用:url_for利用函数的别名获取对用的路由地址

    1.获取没有传参的路由:url_for(别名)

    
    
    from flask import Flask,url_for

    app = Flask(__name__)
    def login(name):
        print(name,type(name))
        return name
    app.add_url_rule('/login/',methods=['POST','GET'],view_func=login,endpoint='sb')
    
    def index():
        real_url=url_for('sb')
        return real_url
    app.add_url_rule('/index/',view_func=index,methods=['POST',"GET"])
    
    if __name__ == '__main__':
        app.run()

    2.获取传参的路由:url_for(别名,别名=值)

    如果想获取动态路由,必须以关键字实参的形式为动态的path部分赋值,注意动态的path部分必须被赋值,
    @app.route('/demo2/')
    def demo2():    
        student_url = url_for('student', id=5, name='mark') # id 就是动态path的key 必须赋值name 将作为查询字符串传入
        print(student_url) # /student/5/?name=mark
        return student_url
    
    @app.route(
    '/student/<int:id>/') def student(id): return 'student {}'.format(id)

    五.CBV

    from flask import Flask, views, request, url_for
    from functools import wraps
    
    def login_verify(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            user_name = request.args.get('user')
            password = request.args.get('password')
            if user_name == 'mark' and password == '123':
                return func(*args,**kwargs)
            else:
                return '请登录'
        return wrapper
    
    
    class CBVTest(views.MethodView):
    
        methods = ['GET','POST']  # 指定可以接收的方法有什么,也可以这行代码不写
        decorators = [login_verify,]  # 指定自定义的装饰器
    
        def get(self):
            print(url_for('cbvtest'))
            return 'cbv_get'
        def post(self):
            return 'cbv_post'
    app.add_url_rule('/cbvtest',view_func=CBVTest.as_view(name='cbvtest'),endpoint='end_demo')

     

  • 相关阅读:
    jvm类加载
    SpringMVC拦截器踩坑日记
    ConcurrentHashMap源码
    HashMap源码
    Linux搭建数据质量监控 Griffin
    那些说代码管理不方便的,我估计是你不会用git(Git源码管理)
    VS2019 开发AngularJS(TypeScript)代码缩进处理
    Arraylist和Map哪个性能更好
    dynamics crm 团队及团队模板
    无法加载文件或程序集 PublicKeyToken=null'或其依赖之一,需要强名称的程序集
  • 原文地址:https://www.cnblogs.com/tfzz/p/11838692.html
Copyright © 2011-2022 走看看