【问题标题】:FastAPI Version: 0.79.1 How to Use middlerware to get requet json bodyFastAPI Version: 0.79.1 如何使用中间件获取请求json body
【发布时间】:2022-11-27 15:19:05
【问题描述】:

如果我使用 request.body() 方法,它就可以工作。但是是byte类型,我想获取json或者dict类型的数据,以便获取用户名和密码Key内容

async def set_body(request: Request):
    receive_ = await request._receive()

    async def receive() -> Message:
        return receive_

    request._receive = receive

@app.middleware("http")
async def demo(request: Request, call_next):
    await set_body(request)
    jsob_body = await request.json()
    print(jsob_body)
    response = await call_next(request)
    retu**strong text**rn response


import requests

url = "http://127.0.0.1:8000/token"

payload={'username': 'test',
'password': 'test_pw'}
files=[

]
headers = {}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

我能够得到这个但是有一个错误会破坏 POST 请求

Traceback (most recent call last):
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\uvicorn\protocols\http\httptools_impl.py", line 372, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 75, in __call__
    return await self.app(scope, receive, send)
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\fastapi\applications.py", line 269, in __call__
    await super().__call__(scope, receive, send)
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\starlette\applications.py", line 124, in __call__
    await self.middleware_stack(scope, receive, send)
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\starlette\middleware\errors.py", line 184, in __call__
    raise exc
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\starlette\middleware\errors.py", line 162, in __call__
    await self.app(scope, receive, _send)
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\starlette\middleware\base.py", line 68, in __call__
    response = await self.dispatch_func(request, call_next)
  File "D:\codes\ocr_server\.\main.py", line 43, in middle
    jsob_body = await request.json()
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\starlette\requests.py", line 242, in json
    self._json = json.loads(body)
  File "D:\devtools\anaconda3\envs\fastapi\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "D:\devtools\anaconda3\envs\fastapi\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "D:\devtools\anaconda3\envs\fastapi\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

【问题讨论】:

标签: python json fastapi


【解决方案1】:

使用json而不是data

response = requests.request("POST", url, headers=headers, json=payload, files=files)

【讨论】:

    猜你喜欢
    • 2019-11-03
    • 2023-02-10
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2019-05-15
    相关资源
    最近更新 更多