Restful URL - 变量规则
简单来说,Restful URL可以看做是对 URL 参数的替代。
编辑server.py:
from flask import Flask
app = Flask(__name__)
@app.route('/user/<username>')
def user(username):
print(username)
print(type(username))
return 'hello ' + username
@app.route('/user/<username>/friends')
def user_friends(username):
print(username)
print(type(username))
return 'In user_friends get username: ' + username
if __name__ == '__main__':
app.run(port=5000, debug=True)
运行server.py。使用浏览器访问http://127.0.0.1:5000/user/Loen,server.py将输出:
而访问http://127.0.0.1:5000/user/Loen/
浏览器访问http://127.0.0.1:5000/user/Loen/friends,可以看到
转换类型
由上面的示例可以看出,使用 Restful URL 得到的变量默认为str对象。我们可以用flask内置的转换机制,即在route中指定转换类型。
编写server.py:
from flask import Flask
app = Flask(__name__)
@app.route('/page/<int:num>')
def page(num):
print(num)
print(type(num))
return 'hello world'
if __name__ == '__main__':
app.run(port=5000, debug=True)
@app.route('/page/int:num')会将num变量自动转换成int类型。
运行上面的程序,在浏览器中访问 http://127.0.0.1:5000/page/1,server.py控制台将输出如下内容:
如果访问的是http://127.0.0.1:5000/page/loen,我们会得到404响应。
有3个默认的转换器:
int 接受整数
float 同 int ,但是接受浮点数
path 和默认的相似,但也接受斜线
编写转换器
自定义的转换器是一个继承werkzeug.routing.BaseConverter的类,修改to_python和to_url方法即可。
to_python方法用于将url中的变量转换后供被@app.route包装的函数使用,to_url方法用于flask.url_for中的参数转换。
下面是一个示例,将server.py修改如下:
from flask import Flask, url_for
from werkzeug.routing import BaseConverter
class MyIntConverter(BaseConverter):
def __init__(self, url_map):
super(MyIntConverter, self).__init__(url_map)
def to_python(self, value):
return int(value)
def to_url(self, value):
return value * 2
app = Flask(__name__)
app.url_map.converters['my_int'] = MyIntConverter
@app.route('/page/<my_int:num>')
def page(num):
print(num)
print(url_for('page', num='145')) # page 对应的是 page函数 ,num 对应对应`/page/<my_int:num>`中的num,必须是str
return 'hello world'
if __name__ == '__main__':
app.run(port=5000, debug=True)
浏览器访问http://127.0.0.1:5000/page/28后,server.py的输出信息是:
28
/page/145145