概述
from flask import Flask, redirect, url_for
from werkzeug.routing import BaseConverter
app = Flask(
__name__,
static_url_path="/python",
static_folder="static",
template_folder="templates"
)
"""
解析1:在flask中app的请求方式是GET、OPTIONS、HEAD,如果我们要添加其他的访问方式就要在配置路由的时候带上methods并传递请求方式
解析2:如果有两个一样的访问路径和请求方式,app.url_map先打印出来的会把后面的都覆盖掉,所以注意访问路径和请求方式决定是否是同一个请求
解析3:多个请求地址对应一个视图函数时可以用多个装饰器装饰
解析4:使用url_for函数进行路径反推,通过视图函数的名字找到视图对应的url路径,好处是避免改一处动全身
"""
# 最基础的路由
@app.route("/index")
def index():
return '<h1>Hello World</h1></br><h2>DEBUG=True</h2>'
@app.route("/request/post", methods=["GET","POST"])
def request_post():
return '<h1>set post success</h1>'
# 带上请求方式的路由,进行是否是同一个请求验证
@app.route("/hello", methods=["POST"])
def hello1():
return '<h1>hello1</h1>'
@app.route("/hello", methods=["GET"])
def hello2():
return '<h1>hello2</h1>'
@app.route("/hello", methods=["GET"])
def hello3():
return '<h1>hello3</h1>'
# 多个路由对一个视图
@app.route("/hi1")
@app.route("/hi2")
def hellomany():
return '<h1>many hi</h1>'
# url_for函数展示
@app.route("/login", methods=["GET"])
def login():
url = url_for("index")
return redirect(url)
"""
解析1:转换器的固有写法<转换器名:参数名>
解析2:正则匹配获取路径参数,转换器有int、float、str、path(接受斜线)
解析3:访问http://127.0.0.1:5000/goods/123abc,如果是不加转换器则匹配goods_id=123abc,默认除了/外的所有普通字符串
解析4:访问http://127.0.0.1:5000/goods/123,如果是int转换器则匹配goods_id=123,什么样的转换器匹配什么样的字符
"""
# 不加转换器
@app.route("/goods/<goods_id>")
def goods_detail1(goods_id):
return "goods detail all %s" % goods_id
# 加转换器int
@app.route("/goods/<int:goods_id>")
def goods_detail2(goods_id):
return "goods detail int %s" % goods_id
"""
手动实现转换器
1.定义自己的转换器
2.设置将自定义的转换器添加到flask应用中
3.使用自定义的转换器
"""
"""
解析1:路由自定义的转换器格式为<转换器名(匹配规则):参数名>,匹配规则就是转换器的参数regex
解析2:转换器实现继承自werkzeug.routing中的BaseConverter,BaseConverter是所有转换器的基类map接收路由映射信息,regex接收自定义正则匹配规则
解析3:app.url_map.converters是一个字典对象,可以建立路由和转换器之间的联系,当访问send_sms函数时路由会通过converters找到对应的转换器类
解析4:自定义转换器中必须知道:
url_map是一个固定的第一个参数,是在手动实现转换器第二步时flask自动会把路由映射信息传给他,在自定义的转换器中用不到,是传递给父类使用的
self.regex是固定的,来自父类的,用来存正则表达式,flask会去使用这个属性来进行路由的正则匹配
to_python方法是BaseConverter中werkzeug约定了自动实现to_python方法,返回正则匹配的结果给视图函数的参数,我们可以对结果进一步处理
to_url方法是使用url_for的时候会被调用,返回url_for传递的参数
列子说明:
访问http://127.0.0.1:5000/head调用head()视图,遇到url_for函数flask会自动调用to_url()方法
返回phone所对应的值18411111111,而url_for把返回的参数交给视图函数"send_sms"对应的路由处理,
最终返回url="/send/18411111111",重定向url访问send_sms函数视图,路由先解析发现url中有要匹配
的数据,于是通过app.url_map.converters找到对应转换器RegexConverter,flask把路由信息传递给
url_map交给BaseConverter基类使用,同时把re转换器后面带的正则匹配规则交由regex传递给BaseConverter
基类,当url重定向给send_sms视图函数时,url经过路由,flask会自动调用to_python把18411111111匹
配出来作为参数传递进来,经过之后会返回给send_sms视图参数phone,即phone参数是to_python的返回值。
"""
# 1.定义自己的万能转换器
class RegexConverter(BaseConverter):
def __init__(self, url_map, regex):
super().__init__(url_map)
self.regex = regex
def to_python(self, value):
return value
def to_url(self, value):
return value
# 2.设置将自定义的转换器添加到flask应用中
app.url_map.converters["re"] = RegexConverter
# 3.使用自定义的转换器
@app.route("/send/<re(r'1[358]d{9}'):phone>")
def send_sms(phone):
return "send sms to %s" % phone
@app.route("/head")
def head():
url = url_for("send_sms", phone="18411111111")
return redirect(url)
if __name__ == '__main__':
# 打印flask路由配置映射信息
print(app.url_map)
app.run(host="0.0.0.0", port=5000, debug=True)
最后
以上就是火星上帅哥为你收集整理的Flask入门篇(二)路由配置的全部内容,希望文章能够帮你解决Flask入门篇(二)路由配置所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复