1. 路径参数(route parameters)
路径参数指的是 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>是路径参数
类型转换
可以指定参数类型:
<int:id>:只匹配整数<float:score>:只匹配浮点数<path:subpath>:匹配路径(可包含/)
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'post id: {post_id}'2. 查询参数(query parameters)
查询参数是 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 获取。
3. 表单参数(form parameters)
用于 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}'4. json 参数
用于 post 请求,客户端以 json 格式发送数据。
示例
from flask import request
@app.route('/api/data', methods=['post'])
def api_data():
data = request.get_json()
return f'received: {data}'5. 多参数/默认值/类型转换
request.args.get('key', default, type=type)可以设置默认值和类型- 路径参数类型见前文
page = request.args.get('page', 1, type=int)6. 路径参数进阶
多个参数
你可以在路由中定义多个参数:
@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'7. 查询参数进阶
获取所有参数
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')
8. 表单参数进阶
获取所有表单数据
@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!'9. json参数进阶
校验 json 数据
可以用 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']}"10. 路由中的 url 构建
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')11. 常见问题与调试技巧
- 路由冲突:多个路由路径一致时,只有第一个生效。
- 参数类型错误:比如
<int:id>,如果访问/user/abc会 404。 - 使用
request.args.get('key', type=int)可以避免类型转换错误。 - 推荐使用 flask 的调试模式:
app.run(debug=true)
12. 最佳实践
- 路由参数尽量加类型限制,提升安全性和可读性。
- 查询参数建议设置默认值和类型转换。
- 表单和 json 数据建议做数据校验。
- 使用
url_for生成 url,避免硬编码。 - 对外暴露的 api 建议使用 restful 风格。
13. 典型应用场景举例
restful api 路由设计
@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)
# 返回搜索结果
...14. 参数校验与错误处理
路径参数校验
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
...json 参数校验
建议结合 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 是校验后的字典
...15. restful 风格参数设计
- 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':
# 删除
...16、flask 2.0 及以上版本提供的新路由注册方式
(1). 基本用法
@app.get
注册一个只响应 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():
...@app.post
注册一个只响应 post 请求的路由:
@app.post('/submit')
def submit():
data = request.form.get('data')
return f'you submitted: {data}'等价于:
@app.route('/submit', methods=['post'])
def submit():
...(2). 混合用法
如果你希望同一路由支持多种方法(比如 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}'(3). 适用场景
@app.get('/xxx')适合只读接口(查询、页面渲染等)。@app.post('/xxx')适合只写接口(表单提交、数据创建等)。- 多方法共用时,仍建议用
@app.route()。
(4). 版本要求
- 需要 flask 2.0 及以上版本。
- 低于 2.0 的 flask 没有
@app.get和@app.post,只能用@app.route()。
(5). 代码示例
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}(6). 总结
@app.get('/path')==@app.route('/path', methods=['get'])@app.post('/path')==@app.route('/path', methods=['post'])- 让代码更简洁、语义更明确
- 只在 flask 2.0+ 可用
17. 使用 flask 扩展简化参数处理
flask-restful
简化 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')flask-swagger / flask-apispec
自动生成接口文档,并支持参数校验。
18. 参数默认值与类型转换技巧
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) 19. 复杂数据结构的参数处理
有时候前端会以数组、字典等复杂结构传参,常见方式:
- 查询参数:
?ids=1&ids=2&ids=3,用getlist - json 参数:直接传递复杂结构
ids = request.args.getlist('ids')
# json: request.get_json()['items']20. 参数安全与防注入
- 对路径参数、查询参数、表单参数都要做校验(长度、格式、类型、特殊字符)
- 对 sql 查询要用 orm 或参数化防止 sql 注入
- 对文件上传要检查文件类型和大小
21. 实际项目中的参数设计建议
- 路由设计要简洁、语义清晰
- 参数命名统一,避免歧义
- 必填参数要明确说明,选填参数要有合理默认值
- 错误返回要有明确提示(如 400 bad request)
22. 常见问题答疑
- 参数获取不到? 检查请求方法、参数名和数据格式是否一致。
- 类型转换失败? 用
type=int等参数,或在代码里 try/except 捕获异常。 - 参数冲突? 路由和参数名要避免重名,优先使用 restful 风格。
到此这篇关于python flash url访问参数配置的文章就介绍到这了,更多相关python flash url访问内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论