• Flask路由+视图补充


    一、路由设置的两种方法

    1、装饰器

    @app.route('/index/')
    def index():
        return 'Hello World!'

    2、源码

    route->decorator->add_url_rule(rule, endpoint, f, **options)

    def index():
        return 'Hello World!'
    
    
    app.add_url_rule('/index/', None, index)

    注意:endpoint的值不能一致

    二、参数

    rule                            URL规则
    view_func                   视图函数名称
    endpoint=None             名称,用于反向生成URL,即: url_for('名称')
    methods=None             允许的请求方式,如:["GET","POST"]
    strict_slashes=None      对URL最后的 / 符号是否严格要求,
    redirect_to=None          重定向到指定地址
    
    defaults=None              默认值,当URL中无参数,函数需要参数时,使用defaults={'k':'v'}为函数提供参数
    subdomain=None,          子域名访问

    endpoint、metods、前面有介绍

    1、redirect_to 重定向

    当访问rule时,重定向到目标网址

    作用:网站升级维护时,用户通过此方法不用知道新网站的地址,就可以从旧网址跳到指定的网址

    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route('/index/', redirect_to='https://www.bootcss.com/')
    def index():
        return 'Hello World!'
    
    
    # app.add_url_rule('/index/', None, index)
    
    
    if __name__ == '__main__':
        app.run()

    2、strict_slashes

    strict_slashes=Flask    # 对url最后一个斜杠要求不严

    3、子域名(了解)

    from flask import Flask
    
    app = Flask(import_name=__name__)
    app.config['SERVER_NAME'] = 'api.com:5000'
    """
    127.0.0.1   api.com
    127.0.0.1   web.api.com
    127.0.0.1   admin.api.com
    
    """
    
    # http://admin.api.com:5000/admin
    @app.route("/admin", subdomain="admin")
    def admin_index():
        return "admin.your-domain.tld"
    
    
    # http://web.api.com:5000/
    @app.route("/", subdomain="web")
    def web_index():
        return "web.your-domain.tld"
    
    
    # http://sdsdf.api.com:5000/
    # http://sdfsdf.api.com:5000/
    # http://asdf.api.com:5000/
    
    @app.route("/dynamic", subdomain="<username>")
    def username_index(username):
        """Dynamic subdomains are also supported
        Try going to user1.your-domain.tld/dynamic"""
        return username + ".your-domain.tld"
    
    
    if __name__ == '__main__':
        app.run()

    三、CBV(几乎不用)

    from functools import wraps
    from flask import Flask, views
    app = Flask(__name__)
    
    
    # 4
    def wrapper(func):
        @wraps(func)
        def inner(*args, **kwargs):
            return func(*args, **kwargs)
    
        return inner
    
    
    # 1
    class UserView(views.MethodView):
        # 3
        methods = ['GET']
        decorators = [wrapper]
    
        def get(self, *args, **kwargs):
            return 'GET'
    
        def post(self, *args, **kwargs):
            return 'POST'
    
    
    # 2
    app.add_url_rule('/user/', None, UserView.as_view('endpoint'))
    
    if __name__ == '__main__':
        app.run()

    四、自定义正则

    from flask import Flask,url_for
    from werkzeug.routing import BaseConverter
    app = Flask(__name__)
    
    
    # 步骤一:定制类
    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))   # 4 <class 'int'>
        print(url_for('index', nid=110))    # /index/110/
        return "index"
    
    
    if __name__ == '__main__':
        app.run()
  • 相关阅读:
    配置使用EF常见的一些问题及解决方案
    js定时器的使用(实例讲解)
    MySQL Workbench 修改快捷键
    Linux CentOS 启动 网卡
    Linux CentOS 安装 VMware Tools
    Linux 群晖 DokuWiki 安装
    Linux CentOS 系统安装 和 相关配置
    接口 Postman 提交json对象到后台 Request Payload
    PHP 文件上传
    电商系统 项目管理 GIT的使用
  • 原文地址:https://www.cnblogs.com/wt7018/p/11601175.html
Copyright © 2020-2023  润新知