python - 端点中的 FastAPI 冲突路径参数 - 良好实践?

标签 python rest backend fastapi endpoint

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

相关文章:

javascript - 操作在后端还是前端?

java - 如何在 JAX-RS 中设置响应 header ,以便用户看到 Excel 的下载弹出窗口?

c++ - C++ 中的动态 JSON 消息;

python - 如何停止htmlpy ui阻止

python - Matplotlib 以错误的顺序绘制

java - 从 URL 获取 xml

open-source - 可以插入现有站点后端的开源 CMS?

python - 为什么 pdb 为列表理解的 "if"子句中引用的变量提供 NameError?

python - 如何以高效内存的方式使用 SOAP 水?

python - Fabric - sudo -u