0
点赞
收藏
分享

微信扫一扫

【瞎老弟flask】04-flask配置路由

宁静的猫 2022-02-26 阅读 72

配置路由

配置路由可以理解为设置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 + "&nbsp;&nbsp;&nbsp;rule: " + rule.rule + "</div>"
    return tmp

定义该路由之后,只要通过http://localhost:5000/routes,就可以查看到所有的路由配置 

点击查看瞎老弟flask系列全部文章

举报

相关推荐

0 条评论