我正在使用 FastAPI 为资源 student
创建 2 个 GET 方法。我希望通过 2 种方式获取 student
:通过 student_id
或通过 student_name
。
问题是,我最初创建了 2 个端点,如下所示
@app.get("/student/{student_name}", response_model=schemas.Student, status_code=200)
def get_student_by_name(student_name: str, db: Session = Depends(get_db)):
db_student = crud.get_student_by_name(db, student_name)
if db_student is None:
raise HTTPException(status_code=404, detail="Student not found")
return db_student
@app.get("/student/{student_id}", response_model=schemas.Student, status_code=200)
def get_student_by_id(student_id: int, db: Session = Depends(get_db)):
db_student = crud.get_student_by_id(db, student_id)
if db_student is None:
raise HTTPException(status_code=404, detail="Student not found")
return db_student
问题是端点名称相互冲突,都是 /student
后跟一个参数,并且只有其中一个可以工作 - 在这种情况下只有 /student/{student_name}
因为它是在前面定义的。因此,我通过在端点名称中添加更多内容,想出了这个简单的解决方法:
@app.get("/student/{student_name}", response_model=schemas.Student, status_code=200)
def get_student_by_name(student_name: str, db: Session = Depends(get_db)):
db_student = crud.get_student_by_name(db, student_name)
if db_student is None:
raise HTTPException(status_code=404, detail="Student not found")
return db_student
@app.get("/student/byid/{student_id}", response_model=schemas.Student, status_code=200)
def get_student_by_id(student_id: int, db: Session = Depends(get_db)):
db_student = crud.get_student_by_id(db, student_id)
if db_student is None:
raise HTTPException(status_code=404, detail="Student not found")
return db_student
我将 /byid
添加到 get_student)by_id
方法的端点名称中。虽然两个端点现在都可以工作,但我想知道这是否被认为是一个好的做法?当需要使用单个路径参数来查询一个资源以区分端点名称时,最佳实践是什么?
最佳答案
几个小时以来一直遇到同样的问题,并且在实验时纯粹靠运气找到了完美的解决方案:
@app.get("/student/{student_name:str}", response_model=schemas.Student, status_code=200)
def get_student_by_name(student_name: str, db: Session = Depends(get_db)):
...
@app.get("/student/{student_id:int}", response_model=schemas.Student, status_code=200)
def get_student_by_id(student_id: int, db: Session = Depends(get_db)):
...
将这些“转换器”添加到您的路径中将根据指定类型将您的请求路由到正确的端点:)
我能够在 Starlette 中找到这方面的文档,我不太熟悉,但 FastAPI 是建立在它之上的。 https://www.starlette.io/routing/
关于python - 端点中的 FastAPI 冲突路径参数 - 良好实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69355510/