一、路由系统

  在入门中我们提到了flask框架中的两种路由形式,现在将以第一种形式,详细介绍其中的各个参数。具体参数如下:

#@app.route和app.add_url_rule参数:
rule                                         #URL规则
view_func                                    #视图函数名称
defaults = None                              #默认值, 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'}为函数提供参数
endpoint = None                              #名称,用于反向生成URL,即: url_for('名称')
methods = None                               #允许的请求方式,如:["GET", "POST"]
strict_slashes = None                        #对URL最后的 / 符号是否严格要求,
'''
如:
1、@app.route('/index', strict_slashes=False)访问:http: // www.xx.com / index / 
或http: // www.xx.com / index均可
2、@app.route('/index', strict_slashes=True)仅访问http: // www.xx.com / index
'''
redirect_to = None                          #重定向到指定地址
subdomain = None                            #子域名访问

1、带参数路径

  常见五种路由如下,其中带参数的路由,需要指定参数的类型,不指定类型时即为默认的字符串类型

@app.route('/user/<username>')
@app.route('/post/<int:post_id>')
@app.route('/post/<float:post_id>')
@app.route('/post/<path:path>')
@app.route('/login', methods=['GET', 'POST'])

   如下实例,视图函数中的参数可以通过如下两种方式获得:一种就是我们说的如下形式的带参数的路径,另一种就是我们通过在路由中的default参数进行传值,这两种的形式的参数都可以在视图函数中进行获得和使用。

from flask import Flask
app=Flask(__name__)

@app.route("/index/<int:nid>",defaults={"cid":123})
def index(nid,cid):
    print(nid,cid)
    return "from index"

if __name__ == '__main__':
    app.run()

 2、url反向解析

  在路由中的endpoint参数即为url的url别名,通过url别名,利用url_for()可以获得反向解析的路径,如下为但参数的反向解析实例,不带参数的路径在反向解析的时候不用给其参数即可。

from flask import Flask,url_for
app=Flask(__name__)
@app.route("/index/<int:nid>",endpoint="xxx")
def index(nid):
    v=url_for("xxx",nid=nid)                           #带参数形式的反向解析
    print(v)
    return "ok"

3、重定向参数

  在我们的路由中,我们redirect_to这样一个参数,通过给其配置一个路径,则在请求当前路由的时候,不再访问当前路由所装饰的视图函数,而是访问重定向参数设置对应的路由下视图函数,实例如下:

from flask import Flask
app=Flask(__name__)
@app.route("/old",redirect_to="/new")                 #当访问/old路径时,会重定向到访问/new对应的视图
def old():
    return "old"

@app.route("/new")
def new():
    return "new"

4、子域名访问

(1)静态域名

  在路由中,有这样的subdomain参数,通过它可以定义我们子域名访问限制,具体实例如下:

from flask import Flask
app=Flask(__name__)
app.config['SERVER_NAME'] = 'bjg.com:5000'   #必须有这样的设置
@app.route("/index",subdomain="admin")
def index():
    return "index"

  上例的的解释为:我们想要访问index视图函数,必须要通过admin.bjg.com:5000/index这个路径进行访问才可以访问到,即subdomain参数数限制了我们访问的域名。为了让我的上例测试成功,我们必须对admin.bjg.com域名进行解析,DNS解析一般会先从我们电脑上的文件中进行解析,如果解析不成功就会到公网上解析。为了测试,我们只需要在我们的电脑上进行上述域名的ip对应设置,让测试在电脑上完成。具体步骤如下:

1、找到路径C:\Windows\System32\drivers\etc
2、在此路径的hosts文件中设置:
        127.0.01         admin.bjg.com

(2)动态域名

  如上设置,我们会把域名限制死,不会很灵活,通过如下的参数的形式,只要能解析成功的域名我们都可以访问,如下:

from flask import Flask
app=Flask(__name__)
app.config['SERVER_NAME'] = 'bjg.com:5000'  #必须有这样的设置
@app.route("/index",subdomain='<xxx>')
def index(xxx):
    return "%s.bjg.com" %xxx

'''
假如有如下形式的域名解析关系,均可以成功访问index视图:
sss.bjg.com     127.0.0.1
yyy.bjg.com     127.0.0.1
zzz.bjg.com     127.0.0.1

访问形式:
sss.bjg.com :5000/index
yyy.bjg.com :5000/index
zzz.bjg.com :5000/index
'''

 5、自定义正则路由匹配

  具体实现请参考如下实例:

from flask import Flask,url_for

app = Flask(__name__)

# 定义转换的类
from werkzeug.routing import BaseConverter
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

# 添加到converts中
app.url_map.converters['xxx'] = RegexConverter

# 进行使用
@app.route('/index/<xxx("\d+"):nid>',endpoint='xx')
def index(nid):
    url_for('xx',nid=123)
    return "Index"

if __name__ == '__main__':
    app.run()
View Code

相关文章:

  • 2022-12-23
  • 2021-08-21
  • 2022-02-05
  • 2022-02-18
  • 2022-12-23
  • 2021-10-05
  • 2022-12-23
  • 2021-06-11
猜你喜欢
  • 2021-12-11
  • 2021-11-30
  • 2021-07-11
  • 2022-01-03
  • 2021-05-14
  • 2021-12-29
  • 2022-12-23
相关资源
相似解决方案