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