Flask-认识路由(URL)
1.指定路由地址
通过route()装饰器把一个函数绑定到对应的 URL 上
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello World'
通过路由地址‘/’就可以调用index()函数,‘/hello’可以调用hello()函数
2.给路由传递参数
给 URL 添加变量部分,你可以把这些特殊的字段标记为 <variable_name> , 这个部分将会作为命名参数传递到你的函数。
@app.route('/user/<username>')#默认是string类型
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % username
3.指定参数的类型或匹配规则(转换器)
规则可以用 <converter:variable_name> 指定一个可选的转换器。
系统自带转换器如下:
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
如果不指定参数类型,默认当做string处理
@app.route('/user/<username>')#等同于<string:username>
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % username
@app.route('/post/<int:post_id>')#输入float类型则无法匹配
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id
4.自定义匹配规则
在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问
具体实现步骤为:
- 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
- 自定义转换器:自定义类继承于转换器基类
- 添加转换器到默认的转换器字典中
- 使用自定义转换器实现自定义匹配规则
demo:
# coding:utf-8
from flask import Flask
from werkzeug.routing import BaseConverter
class RegexConverter(BaseConverter):
def __init__(self,url_name,*args):
super().__init__(url_name)
self.regex = args[0] #将接收的第一个参数当做匹配规则
def to_python(self, value): #value 值代表匹配到的值
return int(value) # 在视图函数中可以查看参数的类型,由之前默认的 str 已变成 int 类型的值
app = Flask(__name__)
# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re
app.url_map.converters['re'] = RegexConverter
@app.route("/demo/<re('\d{6}'):postal_code>")
def demo(postal_code):
print(type(postal_code)) #<class 'int'>
return '邮编是:%s'% postal_code
if __name__ == '__main__':
app.run()
5.指定请求方式
HTTP (与 Web 应用会话的协议)有许多不同的访问 URL 方法。默认情况下,路由只回应 GET请求,但是通过 route()装饰器传递methods参数可以改变这个行为。
如果存在GET,那么也会替你自动地添加HEAD方法,无需干预。
@app.route('/login', methods=['GET', 'POST'])
def login():
return request.method
6.构造URL
通过url_for()函数可以给指定的函数构造 URL。它接受函数名作为第一个参数,也接受对应 URL 规则的变量部分的命名参数。未知变量部分会添加到 URL 末尾作为查询参数。
# coding:utf-8
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/')
def index():
pass
@app.route('/login')
def login():
pass
@app.route('/user/<username>')
def profile(username):
pass
@app.route('/test')
def test():
print(url_for('index'))
print(url_for('login'))
print(url_for('login',next='/'))
print(url_for('profile',username='John Smith'))
return 'test'
if __name__ == '__main__':
app.run()
开启服务器后,浏览器输入http://127.0.0.1/test,终端上会显示以下内容:
/
/login
/login?next=%2F
/user/John%20Smith
给静态文件生成 URL ,使用特殊的 'static' 端点名:
url_for('static',filename='home.png')
可以直接在模板中去使用,<img src="url_for('static',filename='home.jpg')">等同于<img src='/static/home.png'>