简单示例如下
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来体会转换器的作用
- http://127.0.0.1:5000/book/python/author
- http://127.0.0.1:5000/book/13/price
- http://127.0.0.1:5000/book/price-ge/22.3
- 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方法来添加路由规则,因此,他们最终的效果是一样的
设置method
http协议中,有很多种请求方法
一个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)
flask请求对象request
request是flask框架的全局对象,你可以通过它来获得当前进入的请求数据,如果是在多线程环境下,flask可以保证你所使用的request对象就是当前这个线程所处理的请求。
既然request是请求对象,那么合理的猜测是通过它,我们可以获得当前请求的全部信息,例如请求的method,path, url, headers,cookies,请求的参数,请求的body.....
事实上也的确如此,下面的服务端代码和客户端代码,将互相配合向你演示如何使用request获得有关当前请求的重要信息
服务端代码
标签:return,python,app,URL,price,flask,book,route,路由 From: https://www.cnblogs.com/Vincent-yuan/p/17155481.html