文章目录
- from flask import Flask app = Flask(__name__) @app.route(‘/user/<username>’) def show_user_profile(username): return f’User: {username}’ 访问 /user/alice,返回 User: alice <username> 是路径参数
- 可以指定参数类型: <int:id>:只匹配整数 <float:score>:只匹配浮点数 <path:subpath>:匹配路径(可包含 /) @app.route(‘/post/<int:post_id>’) def show_post(post_id): return f’Post ID: {post_id}’
- 你可以在路由中定义多个参数: @app.route(‘/book/<int:book_id>/chapter/<int:chapter_id>’) def show_chapter(book_id, chapter_id): return f’Book: {book_id}, Chapter: {chapter_id}’
- Flask 的路由不支持直接可选参数,但可以通过多个路由实现: @app.route(‘/item/’) @app.route(‘/item/<int:item_id>’) def show_item(item_id=None): if item_id: return f’Item ID: {item_id}’ else: return ‘No Item ID’
- @app.route(‘/api/users/<int:user_id>’, methods=[‘GET’, ‘PUT’, ‘DELETE’]) def user_api(user_id): if request.method == ‘GET’: # 查询用户信息 … elif request.method == ‘PUT’: # 更新用户信息 … elif request.method == ‘DELETE’: # 删除用户 …
- @app.route(‘/search’) def search(): keyword = request.args.get(‘keyword’, ”) page = request.args.get(‘page’, 1, type=int) size = request.args.get(‘size’, 10, type=int) # 返回搜索结果 …
- Flask 路由定义时已做基本类型校验(如 <int:id>),但有时需要更复杂的校验,可以在视图函数内处理: @app.route(‘/user/<username>’) def user_profile(username): if not username.isalnum(): return “用户名不合法”, 400 # 继续处理 …
- 常见做法是判断参数是否存在、类型是否正确: @app.route(‘/search’) def search(): keyword = request.args.get(‘keyword’) if not keyword: return “缺少搜索关键词”, 400 page = request.args.get(‘page’, default=1, type=int) if page < 1: return “页码必须大于0”, 400 …
- 建议结合 pydantic 或 marshmallow 进行结构化校验: from flask import request from marshmallow import Schema, fields, ValidationError class UserSchema(Schema): name = fields.Str(required=True) age = fields.Int(required=True) @app.route(‘/api/user’, methods=[‘POST’]) def create_user(): try: data = UserSchema().load(request.get_json()) except ValidationError as err: return err.messages, 400 # data 是校验后的字典 …
-
- 注册一个只响应 GET 请求的路由: from flask import Flask, request app = Flask(__name__) @app.get(‘/hello’) def hello(): name = request.args.get(‘name’, ‘World’) return f’Hello, {name}!’ 等价于: @app.route(‘/hello’, methods=[‘GET’]) def hello(): …
- 注册一个只响应 POST 请求的路由: @app.post(‘/submit’) def submit(): data = request.form.get(‘data’) return f’You submitted: {data}’ 等价于: @app.route(‘/submit’, methods=[‘POST’]) def submit(): …
- 如果你希望同一路由支持多种方法(比如 GET 和 POST),还是需要用 @app.route: @app.route(‘/login’, methods=[‘GET’, ‘POST’]) def login(): if request.method == ‘GET’: return ‘Login Page’ else: username = request.form.get(‘username’) return f’Welcome, {username}’
- @app.get('/xxx') 适合只读接口(查询、页面渲染等)。 @app.post('/xxx') 适合只写接口(表单提交、数据创建等)。 多方法共用时,仍建议用 @app.route()。
- 需要 Flask 2.0 及以上版本。 低于 2.0 的 Flask 没有 @app.get 和 @app.post,只能用 @app.route()。
- from flask import Flask, request app = Flask(__name__) @app.get(‘/api/info’) def get_info(): return {‘info’: ‘This is a GET endpoint’} @app.post(‘/api/info’) def post_info(): data = request.get_json() return {‘received’: data}
- @app.get('/path') == @app.route('/path', methods=['GET']) @app.post('/path') == @app.route('/path', methods=['POST']) 让代码更简洁、语义更明确 只在 Flask 2.0+ 可用
- 简化 REST API 的参数获取和校验: from flask import Flask from flask_restful import Resource, Api, reqparse app = Flask(__name__) api = Api(app) class Hello(Resource): def get(self): parser = reqparse.RequestParser() parser.add_argument(‘name’, type=str, required=True, help=’Name cannot be blank’) args = parser.parse_args() return {‘hello’: args[‘name’]} api.add_resource(Hello, ‘/hello’)
- 自动生成接口文档,并支持参数校验。
目录
- 1. 路径参数(Route Parameters)
- 示例
- 类型转换
- 2. 查询参数(Query Parameters)
- 示例
- 3. 表单参数(Form Parameters)
- 示例
- 4. JSON 参数
- 示例
- 5. 多参数/默认值/类型转换
- 6. 路径参数进阶
- 多个参数
- 可选参数
- 7. 查询参数进阶
- 获取所有参数
- 多值参数
- 8. 表单参数进阶
- 获取所有表单数据
- 文件上传
- 9. JSON参数进阶
- 校验 JSON 数据
- 10. 路由中的 URL 构建
- 11. 常见问题与调试技巧
- 12. 最佳实践
- 13. 典型应用场景举例
- RESTful API 路由设计
- 搜索分页接口
- 14. 参数校验与错误处理
- 路径参数校验
- 查询参数校验
- JSON 参数校验
- 15. RESTful 风格参数设计
- 16、Flask 2.0 及以上版本提供的新路由注册方式
- (1). 基本用法
- @app.get
- @app.post
- (2). 混合用法
- (3). 适用场景
- (4). 版本要求
- (5). 代码示例
- (6). 总结
- 17. 使用 Flask 扩展简化参数处理
- Flask-RESTful
- Flask-Swagger / Flask-apispec
- 18. 参数默认值与类型转换技巧
- 19. 复杂数据结构的参数处理
- 20. 参数安全与防注入
- 21. 实际项目中的参数设计建议
- 22. 常见问题答疑
路径参数指的是 URL 路径中的一部分被当作变量传递给视图函数。
from flask import Flask
app = Flask(__name__)
@app.route('/user/<username>')
def show_user_profile(username):
return f'User: {username}'
- 访问
/user/alice,返回 User: alice
<username> 是路径参数
/user/alice,返回 User: alice<username> 是路径参数
可以指定参数类型:
<int:id>:只匹配整数<float:score>:只匹配浮点数<path:subpath>:匹配路径(可包含/)
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post ID: {post_id}'
查询参数是 URL 中 ?key=value 的部分,常用于 GET 请求。
from flask import request
@app.route('/search')
def search():
keyword = request.args.get('keyword', '')
page = request.args.get('page', 1)
return f'Search: {keyword}, Page: {page}'
访问 /search?keyword=python&page=2,keyword 和 page 就能从 request.args 获取。
用于 POST 请求,通过表单提交的数据。
from flask import request
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
return f'Logging in: {username}'
用于 POST 请求,客户端以 JSON 格式发送数据。
from flask import request
@app.route('/api/data', methods=['POST'])
def api_data():
data = request.get_json()
return f'Received: {data}'
request.args.get('key', default, type=type) 可以设置默认值和类型
- 路径参数类型见前文
page = request.args.get('page', 1, type=int)
request.args.get('key', default, type=type) 可以设置默认值和类型
你可以在路由中定义多个参数:
@app.route('/book/<int:book_id>/chapter/<int:chapter_id>')
def show_chapter(book_id, chapter_id):
return f'Book: {book_id}, Chapter: {chapter_id}'
Flask 的路由不支持直接可选参数,但可以通过多个路由实现:
@app.route('/item/')
@app.route('/item/<int:item_id>')
def show_item(item_id=None):
if item_id:
return f'Item ID: {item_id}'
else:
return 'No Item ID'
request.args 是一个类似字典的对象,可以获取所有参数:
@app.route('/params')
def params():
all_params = request.args.to_dict()
return str(all_params)
如果一个参数可能有多个值,比如 ?tag=python&tag=flask:
tags = request.args.getlist('tag')
@app.route('/submit', methods=['POST'])
def submit():
form_data = request.form.to_dict()
return str(form_data)
@app.route('/upload', methods=['POST'])
def upload():
file = request.files['file']
file.save(f'./uploads/{file.filename}')
return 'File uploaded!'
可以用 Flask 的 request.get_json(force=True) 强制解析 JSON:
@app.route('/json', methods=['POST'])
def json_view():
data = request.get_json(force=True)
if not data or 'name' not in data:
return 'Missing name!', 400
return f"Hello, {data['name']}"
Flask 推荐使用 url_for 来生成 URL,避免硬编码:
from flask import url_for
@app.route('/profile/<username>')
def profile(username):
return f'Profile: {username}'
# 在其他地方
url = url_for('profile', username='alice')
- 路由冲突:多个路由路径一致时,只有第一个生效。
- 参数类型错误:比如
<int:id>,如果访问 /user/abc 会 404。
- 使用
request.args.get('key', type=int) 可以避免类型转换错误。
- 推荐使用 Flask 的调试模式:
app.run(debug=True)
<int:id>,如果访问 /user/abc 会 404。request.args.get('key', type=int) 可以避免类型转换错误。app.run(debug=True)
- 路由参数尽量加类型限制,提升安全性和可读性。
- 查询参数建议设置默认值和类型转换。
- 表单和 JSON 数据建议做数据校验。
- 使用
url_for 生成 URL,避免硬编码。
- 对外暴露的 API 建议使用 RESTful 风格。
url_for 生成 URL,避免硬编码。
@app.route('/api/users/<int:user_id>', methods=['GET', 'PUT', 'DELETE'])
def user_api(user_id):
if request.method == 'GET':
# 查询用户信息
...
elif request.method == 'PUT':
# 更新用户信息
...
elif request.method == 'DELETE':
# 删除用户
...
@app.route('/search')
def search():
keyword = request.args.get('keyword', '')
page = request.args.get('page', 1, type=int)
size = request.args.get('size', 10, type=int)
# 返回搜索结果
...
Flask 路由定义时已做基本类型校验(如 <int:id>),但有时需要更复杂的校验,可以在视图函数内处理:
@app.route('/user/<username>')
def user_profile(username):
if not username.isalnum():
return "用户名不合法", 400
# 继续处理
...
常见做法是判断参数是否存在、类型是否正确:
@app.route('/search')
def search():
keyword = request.args.get('keyword')
if not keyword:
return "缺少搜索关键词", 400
page = request.args.get('page', default=1, type=int)
if page < 1:
return "页码必须大于0", 400
...
建议结合 pydantic 或 marshmallow 进行结构化校验:
from flask import request
from marshmallow import Schema, fields, ValidationError
class UserSchema(Schema):
name = fields.Str(required=True)
age = fields.Int(required=True)
@app.route('/api/user', methods=['POST'])
def create_user():
try:
data = UserSchema().load(request.get_json())
except ValidationError as err:
return err.messages, 400
# data 是校验后的字典
...
- GET 用于查询(通过路径参数、查询参数)
- POST 用于创建(通过 JSON、表单参数)
- PUT/PATCH 用于更新(通过路径参数+JSON)
- DELETE 用于删除(通过路径参数)
示例:
@app.route('/api/items/<int:item_id>', methods=['GET', 'PUT', 'DELETE'])
def item_api(item_id):
if request.method == 'GET':
# 查询
...
elif request.method == 'PUT':
# 更新
...
elif request.method == 'DELETE':
# 删除
...
注册一个只响应 GET 请求的路由:
from flask import Flask, request
app = Flask(__name__)
@app.get('/hello')
def hello():
name = request.args.get('name', 'World')
return f'Hello, {name}!'
等价于:
@app.route('/hello', methods=['GET'])
def hello():
...
注册一个只响应 POST 请求的路由:
@app.post('/submit')
def submit():
data = request.form.get('data')
return f'You submitted: {data}'
等价于:
@app.route('/submit', methods=['POST'])
def submit():
...
如果你希望同一路由支持多种方法(比如 GET 和 POST),还是需要用 @app.route:
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return 'Login Page'
else:
username = request.form.get('username')
return f'Welcome, {username}'
@app.get('/xxx') 适合只读接口(查询、页面渲染等)。
@app.post('/xxx') 适合只写接口(表单提交、数据创建等)。
- 多方法共用时,仍建议用
@app.route()。
@app.get('/xxx') 适合只读接口(查询、页面渲染等)。@app.post('/xxx') 适合只写接口(表单提交、数据创建等)。@app.route()。
- 需要 Flask 2.0 及以上版本。
- 低于 2.0 的 Flask 没有
@app.get 和 @app.post,只能用 @app.route()。
@app.get 和 @app.post,只能用 @app.route()。
from flask import Flask, request
app = Flask(__name__)
@app.get('/api/info')
def get_info():
return {'info': 'This is a GET endpoint'}
@app.post('/api/info')
def post_info():
data = request.get_json()
return {'received': data}
@app.get('/path') == @app.route('/path', methods=['GET'])
@app.post('/path') == @app.route('/path', methods=['POST'])
- 让代码更简洁、语义更明确
- 只在 Flask 2.0+ 可用
@app.get('/path') == @app.route('/path', methods=['GET'])@app.post('/path') == @app.route('/path', methods=['POST'])
简化 REST API 的参数获取和校验:
from flask import Flask
from flask_restful import Resource, Api, reqparse
app = Flask(__name__)
api = Api(app)
class Hello(Resource):
def get(self):
parser = reqparse.RequestParser()
parser.add_argument('name', type=str, required=True, help='Name cannot be blank')
args = parser.parse_args()
return {'hello': args['name']}
api.add_resource(Hello, '/hello')
自动生成接口文档,并支持参数校验。
request.args.get('key', default=xxx, type=xxx)
request.form.get('key', default=xxx, type=xxx)
request.args.get('key', default=xxx, type=xxx)request.form.get('key', default=xxx, type=xxx)示例:
limit = request.args.get('limit', default=10, type=int)
有时候前端会以数组、字典等复杂结构传参,常见方式:
- 查询参数:
?ids=1&ids=2&ids=3,用getlist - JSON 参数:直接传递复杂结构
ids = request.args.getlist('ids')
# JSON: request.get_json()['items']
- 对路径参数、查询参数、表单参数都要做校验(长度、格式、类型、特殊字符)
- 对 SQL 查询要用 ORM 或参数化防止 SQL 注入
- 对文件上传要检查文件类型和大小
- 路由设计要简洁、语义清晰
- 参数命名统一,避免歧义
- 必填参数要明确说明,选填参数要有合理默认值
- 错误返回要有明确提示(如 400 Bad Request)
- 参数获取不到? 检查请求方法、参数名和数据格式是否一致。
- 类型转换失败? 用
type=int 等参数,或在代码里 try/except 捕获异常。
- 参数冲突? 路由和参数名要避免重名,优先使用 RESTful 风格。
type=int 等参数,或在代码里 try/except 捕获异常。到此这篇关于Python flash URL访问参数配置的文章就介绍到这了,更多相关Python flash URL访问内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- python通过curl实现访问deepseek的API
- 使用Python实现批量访问URL并解析XML响应功能
- python 实现图片上传接口开发 并生成可以访问的图片url
- python利用urllib和urllib2访问http的GET/POST详解
- python检查URL是否正常访问的小技巧
- python实现通过代理服务器访问远程url的方法