首页 > 编程问答 >在休息端点中验证查询字符串参数的默认方法是什么?

在休息端点中验证查询字符串参数的默认方法是什么?

时间:2024-07-21 05:16:28浏览次数:8  
标签:python rest flask backend

我正在使用 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

相关文章

  • Python:对很高维的矩阵进行对角化?
    目前我正在研究一个涉及对角化矩阵以获得特征值和特征向量的问题。但现在我想将问题扩展到200,000x200,000的尺寸。我查找了如何将矩阵存储在numpy中,有人建议使用PyTables。看起来很有希望。但我想知道哪里有工具可以帮助对PyTables中的矩阵存储进行对角化。......
  • 除了curses之外,是否有一个python包可以轻松控制终端的输出?
    我现在正在处理一些小项目,我对GUI的偏好是终端中漂亮的文本界面。我宁愿不强迫用户处理Windowscurses二进制文件,所以我正在寻找不同的选项。我已经发现了asciimatics,但我想考虑所有可能的选择。如果有人有任何经验或知道解决此用例的包,我将不胜感激。谢谢你说的没错......
  • 当值来自函数 python unittest 时,如何模拟全局变量
    我必须在python中模拟全局变量,但变量值来自另一个函数。当我导入文件时,这个函数正在运行,但我想要那里的模拟值。secrets.pyimporttracebackimportloggingimportboto3importosimportjsonlogger=logging.getLogger()logger.setLevel(logging.INFO)secret_......
  • 使用 python print 和 gdb 时出现 BrokenPipeError
    我正在尝试在Linux中运行应用程序并使用Python生成输入:python3-c'print(".....")'|./someapp但出现下一个错误:Exceptionignoredin:<_io.TextIOWrappername='<stdout>'mode='w'encoding='utf-8'>BrokenPipeError:......
  • python 舰队容器
    我正在尝试使用容器在flet中制作一个菜单,它应该是半透明的,但其中的项目不是。我尝试将opacity=1分配给元素,但没有成功-它们与容器一样透明感谢任何帮助我的代码:nickname=ft.TextField(label="xxx",hint_text="xxx")column=ft.Column(controls=[nickname......
  • Python应用程序跨子包共享的配置文件
    我正在构建一个应用程序来控制一些硬件。我在包中实现了不同类型的硬件:电机和测量设备。我的文件结构如下:name_of_my_app/__init__.pymain.pyconfig.iniCONFIG.pymotors/__init__.pyone_kind_of_motor.pymeasurement_devices/......
  • python中时间序列数据的梯度计算
    我正在尝试编写一个函数,它可以从最适合下面的线返回梯度dataframe在浏览了谷歌的几个资源之后,我仍然不确定这是如何完成的。我明白最佳拟合线的计算公式为:y=mx+b将因变量(y)设置为foos,将自变量(x)设置为DateTimeDatafram......
  • 调试用 C 编写的 Python 扩展
    我非常熟悉编写C代码,并且很擅长编写Python代码。我正在尝试学习如何用C编写可以从OSX10.15.7上的Python-3.9.X调用的模块。我已经得到了几个“helloworld”类型的示例,但是对于复杂的示例,我正在努力弄清楚如何调试我编写的C扩展。MWE:src/add.c//......
  • 具有块大小选项的 Python pandas read_sas 因索引不匹配而失败并出现值错误
    我有一个非常大的SAS文件,无法容纳在我的服务器内存中。我只需要转换为镶木地板格式的文件。为此,我使用pandas中chunksize方法的read_sas选项分块读取它。它主要是在工作/做它的工作。除此之外,一段时间后它会失败并出现以下错误。此特定SAS文件有794......
  • 使用 requests 包 python 时打开文件太多
    我正在使用Pythonrequests包向API发出大量请求。然而,在某些时候,我的程序由于“打开的文件太多”而崩溃。当我明确关闭我的会话时,我真的不知道这是怎么回事。我使用以下代码:importrequestsimportmultiprocessingimportnumpyasnps=requests.session()s.keep......