Flask:URL路由

URL路由就是告诉Flask框架当访问某个URL时指定哪个函数去处理,也可以理解为URL和处理函数之间的映射或绑定,这个处理函数一般叫做视图函数,一个视图函数可以绑定多个URL。

添加路由绑定常用的有两种方式:

  • @app.route(“URL规则”)
  • app.add_url_rule(“URL规则”, view_func=处理函数)

注: 查看源代码可以发现,上面的装饰器内部其实是使用下面的方式进行绑定URL的

URL规则

URL必须以正斜杠(/)开头

  • URL以正斜杠结尾: 访问地址末尾加不加正斜杠都会交给这个视图函数进行处理,如果没有以正斜杠结尾会被Flask重定向到带斜线的规范URL去
  • URL不以正斜杠结尾: 访问地址加上了正斜杠则会报404错误

    动态URL

    有时候我们访问互联网上的新闻或博文时经常见到如下的URL:/page/121、/article/2311,在Django中一般通过URL正则即可实现(如:r”article/(\d+)”),而Flask提供了更优雅的方式:把URL上可变的部分抽取成一个变量,变量部分将会传入视图函数
    格式:<[转换器:]变量名>,转换器部分是可选的稍后再做介绍
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from flask import Flask

    app = Flask(__name__)

    @app.route("/page/<id>")
    def page(id):
    return "Page %s" % id

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

注:变量名与视图函数参数必须是相同的名字

内置转换器

转换器名匹配规则
string默认的处理方式,匹配没有正斜杠(/)的字符串
int匹配整型
float匹配浮点型
path与string相似,但允许有正斜杠(/)
uuid匹配UUID值
any(值,值…)匹配指定的几个值,值不能出现层级(如:a/b)

自定义转换器

以上内置的转换器对于一般应用已经够用了,如果想更精细控制就需要自定义转换了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from flask import Flask
from werkzeug.routing import BaseConverter

class RegexpConverter(BaseConverter):
def __init__(self, url_map, *args):
super(RegexpConverter, self).__init__(url_map)
self.regex = args[0]

app = Flask(__name__)
# 注册转换器
app.url_map.converters["r"] = RegexpConverter

# 控制最多只能接收4个数字
@app.route("/page/<r('\d{,4}'):id>")
def page(id):
return "Page %s" % id

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

注:args[0]为传入的第一个参数,如果有需求转换器也可以像any一样传入多个参数

处理函数

处理函数又叫视图函数,如果视图函数返回的是字符串则Flask会将其封装成 Response 响应对象,也可以自己手动生成一个Response对象进行返回

1
2
3
4
5
6
7
8
9
10
11
from flask import Flask, make_response

app = Flask(__name__)

@app.route("/")
def index():
resp = make_response("Hello World")
return resp

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

这样做有一个好处就是可以对响应进行精细的定制(如:相应头、状态码等),以后也可以通过响应对象给客户端设置COOKIE

  • 本文作者: Harmel
  • 本文链接: http://www.harmel.cn/2018/08/flask-route.html
  • 版权声明: 文章如无特别说明,则表明该文章为原创文章,如需要转载,请注明出处。
  • 本站说明: 本站使用阿里云服务器,如果您喜欢我的网站,欢迎收藏,能捐赠支持一下就再好不过了。