我正在使用 Python 和 Flask 设计一个 REST API。
我很好奇,如果有人输入无效的查询字符串参数,会发生什么?
GET https://www.example.com/users?page=1;count=20;dummyinvalidparameter=dummyvalue
例如,如果用户输入一个名为
dummyinvalidparameter
的查询参数怎么办?在这种情况下我的代码应该抛出
400 Bad Request
吗?
没有一种通用的默认方法来在 REST 端点验证查询字符串参数。如果收到意外或无效的查询字符串参数,Flask 本身不会引发错误。这取决于如何实现 API 端点来处理此类情况。
以下是的选择以及如何使用 Flask 处理这种情况的一些方法:
1. 显式验证并引发错误:
这是最严格的方法,如果希望的 API 仅接受明确定义的参数,则建议使用此方法。可以使用
request.args.get()
获取参数,并对其进行验证。如果发现任何无效参数,则可以引发
400 Bad Request
错误。
```python from flask import Flask, request, jsonify
app = Flask( name )
@app.route('/users') def get_users(): page = request.args.get('page', default=1, type=int) count = request.args.get('count', default=20, type=int)
# 检查是否有任何无效参数
allowed_args = ['page', 'count']
for arg in request.args:
if arg not in allowed_args:
return jsonify({'error': f"Invalid query parameter: {arg}"}), 400
# ... 你的代码逻辑 ...
```
2. 忽略未知参数:
在某些情况下,可能希望的 API 更加宽容,并忽略任何未知或未处理的查询字符串参数。这可以为的 API 提供更大的灵活性,并使其对未来的更改更具弹性。
```python from flask import Flask, request
app = Flask( name )
@app.route('/users') def get_users(): page = request.args.get('page', default=1, type=int) count = request.args.get('count', default=20, type=int)
# ... 仅使用 page 和 count 参数,忽略其他参数 ...
```
3. 使用架构验证库:
对于更复杂的验证,可以使用诸如 Marshmallow 或 Pydantic 之类的架构验证库。这些库允许定义 API 端点预期的数据结构,包括查询字符串参数。它们可以自动验证传入的请求并引发有意义的错误消息。
```python from flask import Flask, request, jsonify from marshmallow import Schema, fields, ValidationError
app = Flask( name )
class UserSchema(Schema): page = fields.Integer(missing=1) count = fields.Integer(missing=20)
@app.route('/users') def get_users(): schema = UserSchema() try: args = schema.load(request.args) except ValidationError as err: return jsonify(err.messages), 400
page = args.get('page')
count = args.get('count')
# ... 你的代码逻辑 ...
```
无论选择哪种方法,重要的是 在的 API 文档中明确记录的 API 预期的行为和任何验证规则。 这将有助于确保的 API 的用户了解其工作方式以及如何正确使用它。
标签:python,rest,flask,backend From: 78773677