路由

在讲解最小的flask应用时,提到了装饰器route,它的作用就是将处理请求的函数绑定到URL上(URL必须以反斜杠开头),这种设计体现了解耦的思想。

不同的请求被路由到不同处理函数上,这个函数称之为视图。路由保存了URL和处理函数之间的映射关系,映射关系的建立是通过route装饰器完成的

下面是简单的示例

from flask import Flask
app = Flask(__name__)


@app.route('/hello')
def hello():
    return 'hello'


@app.route('/books')
def books():
    return 'books'


if __name__ == '__main__':
    app.run(debug=True)

变量规则

上面的示例中,不论是/hello 还是 /books,URL都是固定的,但URL可不都是固定的,比如/book/1/price 这种restful风格的URL,中间的1是某个book的id,如果用GET方法来请求这个URL,则表示希望获取id为1的book的价格。

这种URL的某一部分是变化的,这一次请求是/book/1/price,下一次请求或许会变成/book/21/price,你无法为每一个URL绑定一个处理函数。

为了解决这种情况,flask允许你在URL设置动态变化的部分,给URL添加变量部分,像/book/1/price 这种URL,就可以这样绑定

@app.route('/book/<int:id>/price')
def price(id):
    return str(id)

这种URL变量部分的规则为 <converter:variable_name> ,variable_name将作为参数传递给所绑定的函数,而且可以根据converter转换器对variable_name进行转换

converter转换器有下面几种

转换器 说明
int 接受整数
float 接受浮点数
path 接受带斜线的path

如果不标注转换器类型,则默认转为字符串,下面是这几种转换器的例子

# 不指定转换器
@app.route('/book/<name>/author')
def author(name):
    return name


# 转换器为int
@app.route('/book/<int:id>/price')
def price(id):
    return str(id)


# 转换器为float
@app.route('/book/price-ge/<float:price>')
def books_by_price(price):
    return str(price)


# 转换器为path
@app.route('/book/<path:book_info>')
def books_by_path(book_info):
    return book_info

启动服务,一次在浏览器里访问下面的URL来体会转换器的作用

  1. http://127.0.0.1:5000/book/python/author
  2. http://127.0.0.1:5000/book/13/price
  3. http://127.0.0.1:5000/book/price-ge/22.3
  4. http://127.0.0.1:5000/book/2019/09/sales

路由规则管理

添加路由规则,除了使用route装饰器外,还可以使用add_url_rule方法直接添加,下面两段代码在功能作用上是一样的

1、使用route添加路由规则

@app.route('/add_url')
def add_rule():
    return 'add url rule'

2、使用add_url_rule添加路由规则

def add_rule():
    return 'add url rule'


app.add_url_rule('/add_url', 'add_rule', add_rule)

在route装饰器中,调用了add_url_rule方法来添加路由规则,因此,他们最终的效果是一样的,有关路由规则,更深层次的学习可以参考 todo

设置method

http协议中,有很多种请求方法,关于这方面的知识,请参考这篇文章todo

一个URL,我们可以使用不同的方法来请求,在创建路由规则时,我们可以指定这个URL支持哪些请求方法

@app.route('/users', methods=['GET', 'POST'])
def users():
    return 'ok'

在route装饰器中设置methods,如果不设置该参数,则默认支持GET方法。

users函数既要处理GET请求,又要处理POST请求,那么如何区分它们呢? 这就要用到请求对象request

from flask import Flask, request
app = Flask(__name__)


@app.route('/users', methods=['GET', 'POST'])
def users():
    if request.method == 'GET':
        return 'get'
    if request.method == 'POST':
        return 'post'

    return 'ok'


if __name__ == '__main__':
    app.run(debug=True)

关于请求对象request,我后面的文章会做详细的讲解,目前,你只需要了解这么多即可

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案