路由是 Flask 框架的核心功能之一,它负责将 URL 映射到相应的视图函数。
路由装饰器
@app.route('/') - 基本路由
@app.route('/path') - 指定路径
@app.route('/path', methods=['GET', 'POST']) - 指定HTTP方法
基本路由示例
from flask import Flask
app = Flask(__name__)
# 主页路由
@app.route('/')
def index():
return 'Welcome to Home Page'
# 关于页面
@app.route('/about')
def about():
return 'About Us Page'
# 联系页面
@app.route('/contact')
def contact():
return 'Contact Page'
if __name__ == '__main__':
app.run(debug=True)
动态路由
from flask import Flask
app = Flask(__name__)
# 字符串参数
@app.route('/user/<username>')
def show_user(username):
return f'User: {username}'
# 整数参数
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post ID: {post_id}'
# 浮点数参数
@app.route('/price/<float:price>')
def show_price(price):
return f'Price: ${price:.2f}'
# 路径参数(包含斜杠)
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
return f'Subpath: {subpath}'
# UUID参数
@app.route('/uuid/<uuid:uuid_val>')
def show_uuid(uuid_val):
return f'UUID: {uuid_val}'
HTTP 方法处理
from flask import Flask, request, jsonify
app = Flask(__name__)
# 同时处理 GET 和 POST 请求
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
# 处理登录逻辑
return f'Welcome {username}!'
else:
# 显示登录表单
return '<form method="post"><input type="text" name="username" placeholder="Username"><input type="password" name="password" placeholder="Password"><input type="submit" value="Login"></form>'
# 只处理 POST 请求
@app.route('/api/users', methods=['POST'])
def create_user():
data = request.get_json()
# 处理创建用户逻辑
return jsonify({"status": "success", "user": data})
# 只处理 GET 请求
@app.route('/api/users', methods=['GET'])
def get_users():
users = [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
return jsonify(users)
URL 构建
from flask import Flask, url_for, redirect
app = Flask(__name__)
@app.route('/')
def index():
# 构建其他路由的URL
user_url = url_for('show_user', username='john')
post_url = url_for('show_post', post_id=123)
return f'<h1>Home Page</h1><a href="{user_url}">View John\'s profile</a><br><a href="{post_url}">View Post 123</a>'
@app.route('/user/<username>')
def show_user(username):
return f'User: {username}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post ID: {post_id}'
# 重定向示例
@app.route('/old-route')
def old_route():
# 重定向到新路由
return redirect(url_for('index'))
请求对象
from flask import Flask, request
app = Flask(__name__)
@app.route('/example', methods=['GET', 'POST'])
def example():
# 获取查询参数
name = request.args.get('name', 'Guest')
# 获取表单数据
if request.method == 'POST':
username = request.form.get('username')
email = request.form.get('email')
# 获取 JSON 数据
if request.is_json:
data = request.get_json()
# 获取文件上传
file = request.files.get('file')
# 获取请求头
user_agent = request.headers.get('User-Agent')
# 获取 cookies
session_id = request.cookies.get('session_id')
return f'Method: {request.method}<br>Name: {name}<br>User Agent: {user_agent}<br>Path: {request.path}<br>URL: {request.url}'
响应对象
from flask import Flask, make_response, jsonify, redirect
app = Flask(__name__)
@app.route('/')
def index():
return "Hello World" # 默认返回 200 OK
@app.route('/json')
def return_json():
return jsonify({"status": "success", "message": "Hello JSON"})
@app.route('/custom')
def custom_response():
response = make_response("Custom Response")
response.status_code = 201
response.headers["Content-Type"] = "text/plain"
response.set_cookie("username", "john")
return response
@app.route('/redirect')
def redirect_example():
return redirect("/")
@app.route('/not-found')
def not_found():
return "Page not found", 404
@app.route('/error')
def server_error():
return "Internal Server Error", 500
提示: 这是一个重要的概念,需要特别注意理解和掌握。
注意: 这是一个常见的错误点,请避免犯同样的错误。
评论
请 登录 后发表评论