mirror of
https://github.com/fastapi-practices/fastapi-best-architecture.git
synced 2026-09-21 13:12:24 +00:00
Fix CORS 500 status code exception (#167)
* Fix CORS 500 status code exception * update menu test sql data * update docs string * fix the exception category
This commit is contained in:
@@ -7,6 +7,7 @@ from fastapi.exceptions import RequestValidationError
|
||||
from pydantic import ValidationError
|
||||
from pydantic.errors import EnumMemberError, WrongConstantError
|
||||
from starlette.exceptions import HTTPException
|
||||
from starlette.middleware.cors import CORSMiddleware
|
||||
from starlette.responses import JSONResponse
|
||||
from uvicorn.protocols.http.h11_impl import STATUS_PHRASES
|
||||
|
||||
@@ -143,3 +144,39 @@ def register_exception(app: FastAPI):
|
||||
if settings.ENVIRONMENT == 'dev'
|
||||
else await response_base.fail(code=500, msg='Internal Server Error'),
|
||||
)
|
||||
|
||||
if settings.MIDDLEWARE_CORS:
|
||||
|
||||
@app.exception_handler(500)
|
||||
async def cors_status_code_500_exception_handler(request, exc):
|
||||
"""
|
||||
跨域 500 异常处理
|
||||
|
||||
`Related issue <https://github.com/encode/starlette/issues/1175>`_
|
||||
|
||||
:param request:
|
||||
:param exc:
|
||||
:return:
|
||||
"""
|
||||
response = JSONResponse(
|
||||
status_code=exc.code if isinstance(exc, BaseExceptionMixin) else 500,
|
||||
content={'code': exc.code, 'msg': exc.msg, 'data': exc.data}
|
||||
if isinstance(exc, BaseExceptionMixin)
|
||||
else await response_base.fail(code=500, msg=str(exc))
|
||||
if settings.ENVIRONMENT == 'dev'
|
||||
else await response_base.fail(code=500, msg='Internal Server Error'),
|
||||
background=exc.background if isinstance(exc, BaseExceptionMixin) else None,
|
||||
)
|
||||
origin = request.headers.get('origin')
|
||||
if origin:
|
||||
cors = CORSMiddleware(
|
||||
app=app, allow_origins=['*'], allow_credentials=True, allow_methods=['*'], allow_headers=['*']
|
||||
)
|
||||
response.headers.update(cors.simple_headers)
|
||||
has_cookie = 'cookie' in request.headers
|
||||
if cors.allow_all_origins and has_cookie:
|
||||
response.headers['Access-Control-Allow-Origin'] = origin
|
||||
elif not cors.allow_all_origins and cors.is_allowed_origin(origin=origin):
|
||||
response.headers['Access-Control-Allow-Origin'] = origin
|
||||
response.headers.add_vary_header('Origin')
|
||||
return response
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
from typing import Union
|
||||
|
||||
from sqlalchemy import String, ForeignKey
|
||||
from sqlalchemy.dialects.mysql import LONGTEXT, JSON
|
||||
from sqlalchemy.dialects.mysql import LONGTEXT
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
|
||||
from backend.app.models.base import Base, id_key
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
INSERT INTO fba.sys_dept (id, name, level, sort, leader, phone, email, status, del_flag, parent_id, created_time, updated_time)
|
||||
VALUES (1, 'test', 0, 0, null, null, null, 1, 0, null, '2023-06-26 17:13:45', null);
|
||||
|
||||
insert into fba.sys_menu (id, name, level, sort, icon, path, menu_type, component, perms, status, remark, parent_id, created_time, updated_time, show, cache)
|
||||
values (1, 'test', 0, 0, null, null, 0, null, null, 1, null, null, '2023-06-26 17:13:45', null, 1, 1),
|
||||
insert into fba.sys_menu (id, name, level, sort, icon, path, menu_type, component, perms, status, remark, parent_id, created_time, updated_time, 'show', cache)
|
||||
values (1, 'test', 0, 0, null, null, 0, null, null, 1, null, null, '2023-06-26 17:13:45', null, 0, 1),
|
||||
(2, 'dashboard', 0, 0, 'icon-dashboard', '/dashboard', 0, '/dashboard/workplace/index.vue', null, 1, null, null, '2023-06-30 10:10:34', null, 1, 1),
|
||||
(3, 'Workplace', 0, 0, null, '/workplace', 0, null, null, 1, null, 2, '2023-06-30 10:11:40', null, 1, 1),
|
||||
(4, 'arcoWebsite', 0, 0, 'icon-link', 'https://arco.design', 0, null, null, 1, null, null, '2023-06-30 10:13:04', null, 1, 1),
|
||||
(5, 'log', 0, 0, 'icon-bug', '/log', 0, null, null, 1, null, null, '2023-06-30 10:13:54', null, 1, 1),
|
||||
(4, 'arcoWebsite', 0, 101, 'icon-link', 'https://arco.design', 0, null, null, 1, null, null, '2023-06-30 10:13:04', null, 1, 1),
|
||||
(5, 'log', 0, 1, 'icon-bug', '/log', 0, null, null, 1, null, null, '2023-06-30 10:13:54', null, 1, 1),
|
||||
(6, 'Login', 0, 0, null, '/login', 0, '/log/login/index.vue', null, 1, null, 5, '2023-06-30 10:14:23', null, 1, 1),
|
||||
(7, 'faq', 0, 0, 'icon-question-circle', 'https://arco.design/vue/docs/pro/faq', 0, null, null, 1, null, null, '2023-06-30 10:14:56', null, 1, 1);
|
||||
(7, 'faq', 0, 102, 'icon-question-circle', 'https://arco.design/vue/docs/pro/faq', 0, null, null, 1, null, null, '2023-06-30 10:14:56', null, 1, 1);
|
||||
|
||||
INSERT INTO fba.sys_role (id, name, data_scope, status, remark, created_time, updated_time)
|
||||
VALUES (1, 'test', 2, 1, null, '2023-06-26 17:13:45', null);
|
||||
|
||||
Reference in New Issue
Block a user