1

我正在使用添加到快速 API 的 API 路由器在快速 API 中引发自定义异常。我正在定义异常类和处理程序,并使用以下代码添加它们。它以前可以工作,现在我不太确定是什么问题。添加了中间件,所以也许这就是问题所在?

app = FastAPI()

origins = [
    "*",    # Restrict these in the future?
]

app.include_router(memblock_router.router)
app.include_router(event_router.router)

app.add_exception_handler(UnauthorizedException, unauthorized_exception_handler)
app.add_exception_handler(InvalidParameterException, invalid_parameter_exception_handler)
app.add_exception_handler(DatabaseException, database_exception_handler)
app.add_exception_handler(ElasticsearchException, elasticsearch_exception_handler)
app.add_exception_handler(ParsingException, parsing_exception_handler)
app.add_exception_handler(ForbiddenErrorMessage, forbidden_error_message_exception)
app.add_exception_handler(UnsupportedErrorMessage, unsupported_message)
app.add_exception_handler(RequestValidationError, validation_exception_handler)

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

我正在像这样定义异常和处理程序

class UnauthorizedException(Exception):
    pass

def unauthorized_exception_handler(request: Request, exc: UnauthorizedException):
    print(str(traceback.format_exc()))
    return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED,
                        content={"error": "unauthorized"},
                        headers=get_response_headers())
4

1 回答 1

2

我有同样的问题,就我而言,问题与进口有关。我有一个这样的项目结构:

.
├── Dockerfile
├── app
│   ...
│   ├── main.py
│   ├── repositories
│   │   ├── __init__.py
│   │   └── repository.py
└── requirements.txt

repository.py包含我要处理的一类错误:

# app/repositories/repository.py

class RepositoryError(Exception):
    pass

main.py我为这个错误注册了一个处理程序:

# app/main.py

...

from repositories.repository import RepositoryError


def get_application() -> FastAPI:
    application = FastAPI(title=PROJECT_NAME, debug=DEBUG, version=VERSION)

    ...

    application.add_exception_handler(RepositoryError, http500_error_handler)

    application.include_router(api_router)

    return application


app = get_application()

if __name__ == '__main__':
    uvicorn.run('app.main:app', host='127.0.0.1', port=8000, reload=True)

如您所见,我使用了相对导入repositories.repository而不是app.repositories.repository. 当我深入研究选择适当错误处理程序的代码时,我在以下位置看到了以下内容starlette/exceptions.py

调试器中的导入

在应用程序上注册的异常处理程序已绑定到repositories.repository.RepositoryError该类,但捕获的异常属于app.repositories.repository.RepositoryError该类,并且这两个类不匹配。当我将导入更改为时,app.repositories.repository.RepositoryError一切main.py正常。

于 2021-09-23T12:40:00.767 回答