当前位置 : 主页 > 编程语言 > python >

Flask路由+视图补充

来源:互联网 收集:自由互联 发布时间:2021-06-25
一、路由设置的两种方法 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_ur

一、路由设置的两种方法

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()
网友评论