-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Description
Also raised on #26 (comment). See also #544.
Describe the bug
Write here a clear and concise description of what the bug is.
To Reproduce
Replace each part with your own scenario:
- Create a file with:
from fastapi import FastAPI
app = FastAPI()
@app.get("/app")
def read_root():
return {"Hello": "World"}
- Launch it using
uvicorn --root-path="bar" test_app:app
- Open the browser and go to
http://127.0.0.1:8000/docs
. - From the documentation, call the
GET /app
route. - The doc page calls
/app
and succeeds.
Expected behavior
The above test should fail after having called /bar/app
, since root_path
is supposed to prefix all generated URLs in case the application is served behind a reverse-proxy, among ther things. FastAPI only acknowledges openapi_prefix
for the API doc.
Environment
- OS: Windows
- FastAPI Version: 0.45.0
- Python version: 3.8.0
Additional context
A similar issue applies to sub-applications:
from fastapi import FastAPI
app = FastAPI()
@app.get("/app")
def read_main():
return {"message": "Hello World from main app"}
#subapi = FastAPI(openapi_prefix="/subapi")
subapi = FastAPI()
@subapi.get("/sub")
def read_sub(request: Request):
return {
"root_path": request.scope['root_path'],
"raw_path": request.scope['raw_path'],
"path": request.scope['path'],
"app_url_for": app.url_path_for("read_sub"),
"subapp_url_for": subapi.url_path_for("read_sub"),
}
app.mount("/subapi", subapi)
{
"root_path":"bar/subapi",
"raw_path":"/subapi/sub",
"path":"/sub",
"app_url_for":"/subapi/sub",
"subapp_url_for":"/sub"
}
(url_for
not being prefixed with root_path
is fixed upstream by Kludex/starlette#699)
Unless openapi_prefix="/subapi"
is passed when creating the subapplication, both http://127.0.0.1:8000/docs
and http://127.0.0.1:8000/subapi/docs
will point towards http://127.0.0.1:8000/openapi.json
, which goes against the point of having isolated subapplications.
openapi_prefix
should probably just be deprecated and assumed to match root_path
if absent.