Python 如果路径相同,但其中一个具有查询参数,则忽略一个路径操作

Python 如果路径相同,但其中一个具有查询参数,则忽略一个路径操作,python,rest,backend,fastapi,Python,Rest,Backend,Fastapi,我希望有两个路径操作具有相同的路径@app.get(“/movies/”,…): 如您所见,第一个用于按电影标题获取电影,并具有一个查询参数(title),第二个用于获取列表。当我检查生成的文档时,read\u movie\u by\u title的文档丢失了 我试图通过删除/将按标题阅读电影的路径更改为/movies,来解决这个问题,但我根本不喜欢这个解决方案 所以问题是:有没有一种方法可以拥有两条相等的路径,但其中一条是带有查询参数的,或者我需要以不同的方式来实现这一点?有什么建议吗?您可以

我希望有两个路径操作具有相同的路径
@app.get(“/movies/”,…)

如您所见,第一个用于按电影标题获取电影,并具有一个查询参数(
title
),第二个用于获取列表。当我检查生成的文档时,
read\u movie\u by\u title
的文档丢失了

我试图通过删除
/
按标题阅读电影的路径更改为
/movies
,来解决这个问题,但我根本不喜欢这个解决方案

所以问题是:有没有一种方法可以拥有两条相等的路径,但其中一条是带有查询参数的,或者我需要以不同的方式来实现这一点?有什么建议吗?

您可以通过将端点更改为
“/movies/{title}”
来代替第一个查询参数:

@app.get(“/movies/{title}”,response\u model=schemas.Movie)
def read_movie_by_title(title:str,db:Session=Depends(get_db)):
db\u movie=crud。通过标题获取电影(db,title=title)
返回db_电影
#第二个保持不变
@app.get(“/movies/”,response\u model=List[schemas.Movie])
def read_movies(skip:int=0,limit:int=100,db:Session=dependens(get_db)):
db_movies=crud.get_movies(db,skip=skip,limit=limit)
返回db_电影

您的问题的答案(是否有一种方法可以拥有两条相等的路径,但其中一条具有查询参数)是否定的,区分路径的唯一方法是通过其方法(
GET、PUT、POST、DELETE,

然而,你确实有多种方法来达到你想要的结果

休息法 标准的
REST
方法是为基于标题的检索定义不同的路径,例如
/movies/{title}
,如的文档中的第一个示例所示

如果要实现
搜索
功能,而不是通过唯一标题直接
检索
方法,可以执行以下操作:

@app.get(“/movies”,response\u model=List[schemas.Movie])
def read_movies(标题:可选[str]=None,跳过:int=0,限制:int=100,db:Session=Depends(get_db)):
#过滤器列表
过滤器=[]
if title:#如果不是无
filters.append(models.Movie.title.ilike(f“%{title}%”)
db_movies=crud.get_movies(db,filters=filters,skip=skip,limit=limit)
返回db_电影
在crud操作中,您可以查询如下内容:

返回session.query(models.Movie).filter(*filters).all()
更简单的方法,只需一种方法即可实现所需功能
@app.get(“/movies”,response\u model=List[schemas.Movie])
def read_movies(标题:可选[str]=None,跳过:int=0,限制:int=100,db:Session=Depends(get_db)):
if title:#如果不是无
返回积垢。按标题获取电影(db,title=title)
返回crud.get_电影(db,filters=filters,skip=skip,limit=limit)
尽管后者可能会混淆API的使用者,因此
REST
方法将是最推荐的方法

@app.get("/movies/", response_model=schemas.Movie)
def read_movie_by_title(title: str, db: Session = Depends(get_db)):
    db_movie = crud.get_movie_by_title(db, title=title)
    return db_movie


@app.get("/movies/", response_model=List[schemas.Movie])
def read_movies(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
    db_movies = crud.get_movies(db, skip=skip, limit=limit)
    return db_movies