配置路由
配置路由可以理解为设置url,只需要通过route装饰器,将函数绑定到url上,就可以实现地址的访问
from flask import Flask
app = Flask(__name__)
# 为app.route设置"/index"
# 则可以通过http://localhost:5000/index这个地址进行访问
@app.route("/index")
def index():
return "<h1>index</h1>"
# 为app.route设置"/test"
# 则可以通过http://localhost:5000/test这个地址进行访问
@app.route("/test")
def test():
return "<h1>test</h1>"
注意,在配置路由的过程中,后边添加/或者没有添加/都是可以的
如果你设置的路由为app.route("/index"),那么访问http://localhost:5000/index的时候,会直接请求成功
如果你设置的路由为app.route("/index/"),那么访问http://localhost:5000/index的时候,flask会自动将其重定向到http://localhost:5000/index/
但是最好不要同时添加带/和不带/的两个版本,这样可能导致不确定的行为
为同一响应配置多个路由
比如说,你希望同时将首页配置为/和/index,那么只需要使用多个装饰器,就可以将同一响应解析为多个地址
from flask import Flask
app = Flask(__name__)
@app.route("/")
@app.route("/index")
def index():
return "index"
这样配置之后,就可以同时通过/或者/index完成对首页的访问了
动态路由规则
通过将url的一部分设置在<>中,并在定义函数时接受该参数,就可以在url中添加变量
from flask import Flask
app = Flask(__name__)
@app.route("/test/<var>")
def test(var):
return var
# 1,在定义路由的时候,通过<var>添加变量规则
# 2,在定义函数的时候,通过参数接受变量
# 3,在函数中,可以直接使用该变量
此时,访问地址http://localhost:5000/test/123,就可以看到网页上显示了123
不可信数据的转义
需要注意的是,如果像我们上边的案例那样直接使用用户给出的内容,是非常危险的
由于没有对来源不可信的数据进行过滤和转义,很容易导致被不好的用户注入
例如,在刚刚的程序中,如果访问地址
http://localhost:5000/test/<input%20type="text"%20name="test"%20autofocus="autofocus"%20οnfοcus="alert('qq:xialaodi')">
就会看到注入后的页面。这是非常糟糕的,因此必须小心处理来源不可信的数据
在flask中,提供了markupsafe,通过其中的escape对数据进行处理,可以得到转义后的内容
from flask import Flask
from markupsafe import escape
app = Flask(__name__)
@app.route("/test/<var>")
def test(var):
return escape(var)
通过escape()进行转义之后,再访问刚刚的注入地址,就可以正常的显示文本内容了
动态路由转换器
如果你希望限制变量的类型,那么可以通过转换器完成这一点
转换器 | 描述 |
---|---|
string | 接受不包含/的字符串 |
int | 接受正整数 |
float | 接受正浮点数 |
path | 接受其中可以包含/的字符串 |
uuid | 接受uuid的字符串 |
定义的时候,通过<转换器:变量名>完成
from flask import Flask
from markupsafe import escape
app = Flask(__name__)
@app.route("/test/<int:num>")
def test(num):
print(type(num))
return escape(num)
@app.route("/test2/<path:str>")
def test2(str): # 将str作为参数,会导致覆盖掉内置的str,不过这里为了省事,也没考虑很多
print(type(str))
return escape(str)
按照这种方式完成定义以后,如果你访问test地址,那么在/之后只能添加数字,例如你可以访问http://localhost:5000/test/123456,但是如果访问http://localhost:5000/test/abcd就会导致404
而如果你访问test2地址,那么在/之后可以添加任意内容,包括继续包含/也是可以的
自定义动态路由转换器
在flask中默认提供了string,int等路由规则的转换器,但是这仍然不能满足全部的需求
当然,我们可以选择接受字符串,然后再自行进行字符串的匹配,决定视图的处理,但是这很麻烦
在flask中,还提供了一种自定义路由转换器的方法,通过这种方法,就可以定义自己的转换器了
from flask import Flask
# 导入基础的BaseConverter
from werkzeug.routing import BaseConverter
# 通过继承BaseConverter,自定义一个动态路由转换器
class XialaodiConverter(BaseConverter):
# 通过regex变量,定义转换规则
regex = r"xialaodi\d+"
app = Flask(__name__)
# 在app中注册转换器
app.url_map.converters["xialaodi"] = XialaodiConverter
# 在定义路由中使用转换器
@app.route("/csdn/<xialaodi:x>")
def converter_test(x):
return x
查看配置的所有路由
截止到目前为止,已经配置了很多路由了,那么,想要查看所有配置的路由规则应该如何做呢
如果是在命令行中查看的话,可以使用flask routes指令
和启动时需要输入flask run一样,直接输入flask routes,可以查看到配置的路由规则
如果是需要在程序中访问的话,可以使用app.url_map,这里面保存了所有路由信息
以下配置了一个简单的路由页面
@app.route("/routes")
def routes():
tmp = ""
for rule in app.url_map.iter_rules():
tmp += "<div style='font-size: 25px'>" + "endpoint: " + rule.endpoint + " rule: " + rule.rule + "</div>"
return tmp
定义该路由之后,只要通过http://localhost:5000/routes,就可以查看到所有的路由配置
点击查看瞎老弟flask系列全部文章