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()

 

posted @ 2019-09-28 00:38  市丸银  阅读(132)  评论(0编辑  收藏  举报