FastAPI 服务器 returns“422 无法处理的实体”- value_error.missing
FastAPI server returns "422 unprocessable entity" - value_error.missing
from http.client import responses
from random import randrange
from tkinter.tix import STATUS
from typing import Optional
from urllib import response
from fastapi import Body, FastAPI, Response ,status, HTTPException
from pydantic import BaseModel
app= FastAPI()
class Post(BaseModel):
title: str
content: str
Published: bool = True
rating: Optional[int] = None
my_post = [{"title": "title of post 1", "content": "content of post 1", "id": 2},{"title": "title of post 2","content":"content of post 2", "id":3}]
def find_post(id):
for p in my_post:
if p["id"] == id:
return p
def find_index_post(id):
for i,p in enumerate(my_post):
if p["id"]== id:
return i
@app.get("/posts/{id}")
def get_posts(id: int , response: Response):
post= find_post(id)
if not post :
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail= f"post with id {id} not found bludd")
# response.status_code=status.HTTP_404_NOT_FOUND
# return {"message": f" post with id : {id} not found"}
return{"here is the post": post}
@app.delete("/posts/{id}", status_code= status.HTTP_204_NO_CONTENT)
def delete_post(id: int):
index= find_index_post(id)
if index == None:
raise HTTPException(status_code= status.HTTP_404_NOT_FOUND, detail= f"post with id {id} does not exist")
my_post.pop(index)
return Response(status_code= status.HTTP_204_NO_CONTENT)
@app.put("/posts/{id}")
def update_post(id: int , post: Post):
index = find_index_post(id)
if index == None :
raise HTTPException(status_code= status.HTTP_404_NOT_FOUND, detail= f"post with id {id} does not exist")
post_dict = my_post.dict()
post_dict["id"]= id
my_post[index]= post_dict
return {"message" : "updated post"}
其他一切正常,但最后的 put/update
函数。
从字面上看,随着教程编码,并且有不停的烦人问题。
Python 控制台说: 422 Unprocessable Entity
.
邮递员说:
"detail":
"loc":
"body","msg": "field required",
"type": "value_error.missing"
422 unprocessable entity
错误会准确指出您的请求的哪一部分与预期格式不匹配。在您的情况下,它表示缺少 body
。使用 Pydantic 模型时,您实际上声明了一个 JSON
对象(或 Python 字典),因此,您的端点需要一个 request body with that object. Thus, the request you send must include a JSON
payload matching the model. Below is an example using Python requests, but you could also test that through OpenAPI at http://127.0.0.1:8000/docs.
import requests
url = 'http://127.0.0.1:8000/posts/2'
payload = {"title": "string", "content": "string", "Published": True,"rating": 0}
resp = requests.put(url, json=payload)
print(resp.json())
此外,请确保在您的端点中正确获取 Post 对象。也就是说,行 post_dict = my_post.dict()
应该替换为 post_dict = post.dict()
.
from http.client import responses
from random import randrange
from tkinter.tix import STATUS
from typing import Optional
from urllib import response
from fastapi import Body, FastAPI, Response ,status, HTTPException
from pydantic import BaseModel
app= FastAPI()
class Post(BaseModel):
title: str
content: str
Published: bool = True
rating: Optional[int] = None
my_post = [{"title": "title of post 1", "content": "content of post 1", "id": 2},{"title": "title of post 2","content":"content of post 2", "id":3}]
def find_post(id):
for p in my_post:
if p["id"] == id:
return p
def find_index_post(id):
for i,p in enumerate(my_post):
if p["id"]== id:
return i
@app.get("/posts/{id}")
def get_posts(id: int , response: Response):
post= find_post(id)
if not post :
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail= f"post with id {id} not found bludd")
# response.status_code=status.HTTP_404_NOT_FOUND
# return {"message": f" post with id : {id} not found"}
return{"here is the post": post}
@app.delete("/posts/{id}", status_code= status.HTTP_204_NO_CONTENT)
def delete_post(id: int):
index= find_index_post(id)
if index == None:
raise HTTPException(status_code= status.HTTP_404_NOT_FOUND, detail= f"post with id {id} does not exist")
my_post.pop(index)
return Response(status_code= status.HTTP_204_NO_CONTENT)
@app.put("/posts/{id}")
def update_post(id: int , post: Post):
index = find_index_post(id)
if index == None :
raise HTTPException(status_code= status.HTTP_404_NOT_FOUND, detail= f"post with id {id} does not exist")
post_dict = my_post.dict()
post_dict["id"]= id
my_post[index]= post_dict
return {"message" : "updated post"}
其他一切正常,但最后的 put/update
函数。
从字面上看,随着教程编码,并且有不停的烦人问题。
Python 控制台说: 422 Unprocessable Entity
.
邮递员说:
"detail":
"loc":
"body","msg": "field required",
"type": "value_error.missing"
422 unprocessable entity
错误会准确指出您的请求的哪一部分与预期格式不匹配。在您的情况下,它表示缺少 body
。使用 Pydantic 模型时,您实际上声明了一个 JSON
对象(或 Python 字典),因此,您的端点需要一个 request body with that object. Thus, the request you send must include a JSON
payload matching the model. Below is an example using Python requests, but you could also test that through OpenAPI at http://127.0.0.1:8000/docs.
import requests
url = 'http://127.0.0.1:8000/posts/2'
payload = {"title": "string", "content": "string", "Published": True,"rating": 0}
resp = requests.put(url, json=payload)
print(resp.json())
此外,请确保在您的端点中正确获取 Post 对象。也就是说,行 post_dict = my_post.dict()
应该替换为 post_dict = post.dict()
.