一、路由系统
在入门中我们提到了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()