目录
什么是路由?
Flask中的路由
基本路由
动态路由
路由中的HTTP方法
路由函数返回
在Web开发中,路由是将URL映射到相应的处理函数的过程。Flask是一个轻量级的Web应用框架,提供了简单而强大的路由机制,使得开发者能够轻松地将用户请求的URL映射到Python函数。
什么是路由?
在Web应用中,路由决定了用户请求的URL应该由哪个函数来处理。当用户在浏览器中输入一个URL或者点击一个链接时,Web服务器需要知道如何处理这个请求,这就是路由的作用。
Flask中的路由
Flask使用装饰器@app.route()
来定义路由。这个装饰器告诉Flask哪个URL应该触发对应的函数。
基本路由
最基本的路由是将URL直接映射到函数。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello, Flask!'
if __name__ == '__main__':
app.run(debug=True)
在上面这个例子中,我们定义了一个路由/
,当用户访问应用的根目录时,会触发home
函数,并返回字符串"Hello, Flask!"。
动态路由
Flask还允许我们定义动态路由,即URL中包含变量的部分。
@app.route('/user/<username>')
def show_user_profile(username):
return f'User {username}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post {post_id}'
在这两个例子中,<username>
和<int:post_id>
是动态部分,Flask会将URL中对应的部分作为参数传递给函数。<username>
可以匹配任何字符串,而<int:post_id>
则限制只能匹配整数。
测试结果如下
路由规则支持不同类型的参数和匹配规则,post_id前的int为路由
规则的类型,以下为常见的路由规则:
- 字符串(默认): 匹配任意字符串。
- 整数(
<int:name>
): 匹配整数值。 - 浮点数(
<float:value>
): 匹配浮点数值。 - 路径(
<path:name>
): 匹配任意字符,包括斜杠/
。
路由中的HTTP方法
默认情况下,路由只响应GET请求。Flask允许我们指定路由响应特定的HTTP方法。
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return do_the_login()
else:
return show_the_login_form()
上面的例子中,/login
路由可以响应GET和POST请求。根据请求的方法,执行不同的函数。测试结果如下。
路由函数返回
视图函数可以返回多种类型的响应:
- 字符串:返回纯文本响应。
- HTML:返回 HTML 页面。
- JSON:返回 JSON 数据。
- Response 对象:自定义响应。
附全篇所有代码,以供测试使用
from flask import Flask, request, jsonify, Response
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello, Flask!'
@app.route('/user/<username>')
def show_user_profile(username):
return f'User {username}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post {post_id}'
@app.route('/json')
def json_response():
data = {'key': 'value'}
return jsonify(data)
@app.route('/custom')
def custom_response():
response = Response('Custom response with headers', status=200)
response.headers['X-Custom-Header'] = 'Value'
return response
def do_the_login():
return f'post请求,进行登录'
def show_the_login_form():
return f'get请求,展示登录表单'
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return do_the_login()
else:
return show_the_login_form()
if __name__ == '__main__':
app.run(debug=True)
测试结果如下