Files
test/app/__pycache__/main.cpython-313.pyc
T

61 lines
7.8 KiB
Plaintext
Raw Normal View History

2026-09-21 19:03:31 +08:00
ó
jˆªjpã
ó6•SrSSKJr SSKrSSKrSSKJr SSKJr SSK J
r
J r SSK J
r
SSKJr SS KJrJr SS
KJr SS KJrJr SS KJr SS
KJr SSKJrJr SSKJ r SSK!J"r" \RF"\RHSSS9 \RJ"S5r&\"\'5RPS- r)\S7Sj5r*\
"\RV\RXS3\RZ\*SSSS9r.\.R_\S/SS/S/S9 \.Ra\ 5S8Sj5r1\.Ra\
5S9S j5r2\.Ra\5S:S!j5r3\.Ra\5S;S"j5r4\.Ra\55S<S#j5r6\.RoS$5S=S%j5r8\.Rs\5 \.RuS&S'/S(S)9S*5r;\)Ry5(a1\.R{S+\"\>"\)5S,9SS-9 \.RuS.S/S09S15r?\@S2:XaSSKArA\AR„"S3S4S5S/S69 gg)>u]应用入å�£ã€‚
�动方�:
uvicorn app.main:app --reload # 开�
python -m app.main # 等价写法(会先自动建表)
接�文档:
http://127.0.0.1:8000/docs # Swagger UI
http://127.0.0.1:8000/redoc # ReDoc
http://127.0.0.1:8000/ # �端页�
é)Ú annotationsN)Úasynccontextmanager)ÚPath)ÚFastAPIÚRequest)ÚRequestValidationError)ÚCORSMiddleware)Ú FileResponseÚ JSONResponse)Ú StaticFiles)ÚIntegrityErrorÚSQLAlchemyError)Ú
api_router)Úsettings)ÚengineÚensure_database_exists)Ú
BusinessError)ÚBasez3%(asctime)s %(levelname)-7s %(name)s %(message)sz%H:%M:%S)ÚlevelÚformatÚdatefmtÚwolinÚstaticcó# •[5 [RR[S9 [
R
S[R5 [
R
S5 S7v• [R"5 g7f)N)Úbinduæ•°æ�®åº“就绪:%su)接å�£æ–‡æ¡£ï¼šhttp://127.0.0.1:8000/docs)
rrÚmetadataÚ
create_allrÚloggerÚinforÚDB_NAMEÚdispose)Úapps Ú app\main.pyÚlifespanr$+sOé€äÔ܇M�M×Ѥ&ÐÑ)Ü
‡K�KÐ&¬×(8Ñ(8Ô9Ü
‡K�KÐ;Ô<Ü Ü
‡N‚NÕùs‚BBu
**统一�应格�**:`{code, msg, data}`,`code=0` 表示�功。
**鉴�**:除 `/auth/login` 外都需�在请求头带 `Authorization: Bearer <token>`。
**分层**:api(路由)/ service(业务)/ dao(数�访问)/ model(ORM)/ schema(校验)。z/docsz/redocz
/openapi.json)ÚtitleÚ descriptionÚversionr$Údocs_urlÚ redoc_urlÚ openapi_urlÚ*T)Ú
allow_originsÚallow_credentialsÚ
allow_methodsÚ
allow_headerscƒób# •[SURURURS.S9$7f)NéÈ©ÚcodeÚmsgÚdata©Ú status_codeÚcontent)r r3r4r5©ÚrequestÚexcs r#Úbusiness_error_handlerr<Ns(é€ä  C¸#¿(¹(È3Ï7É7Ð\_×\dÑ\dÑ1eÑ fÐfùs‚-/cƒó# •/nUR5HPnSRSURS/555nURUSURS535 MR [ SSSS RU5-S
U0S .S 9$7f)
u@把 Pydantic 的报错翻译æˆ�人è¯�,å‰�端å�¯ä»¥ç›´æŽ¥å¼¹ã€‚u → c3óF# •UHoS:wdM
[U5v• M g7f)ÚbodyN)Ústr)Ú.0Úxs r#Ú <genexpr>Ú+validation_error_handler.<locals>.<genexpr>Xsé€ÐTÒ0D¨1ÈVÉ £¤ A§ Ò0Dùs‚ !�!Úlocz: r4r1i¦uå�‚数校验未通过:uï¼›Úerrorsr2r6)rFÚjoinÚgetÚappendr )r:r;ÚproblemsÚerrorÚlocations r#Úvalidation_error_handlerrMSsŽé€ð€HØ—‘–ˆØ—<‘<ÑT°· ± ¸%ÀÔ0DÓTÓTˆØ�‰˜8˜* B u§y¡y°Ó'7Ð&8Ð9Ö:ñô ØØÐ%?À%Ç*Á*ÈXÓBVÑ%VÐaiÐksÐ`tÑuñ ðùs‚B B cƒóR# •[RSU5 [SSSSS.S9$7f)Nuæ•°æ�®åº“约æ�Ÿå†²çª�:%sr1i™u3æ•°æ�®å†²çª�(唯一键é‡�å¤�或外键ä¸�å�ˆæ³•)r2r6)rÚwarningr r9s r#Úintegrity_error_handlerrP`s7é€ä
‡N�NÐ/°Ô5Ü  C¸#ÐF{ðFJñ2Kñ LðLùs‚%'cƒóV# •[RS5 [SSSU3SS.S9$7f)Nuæ•°æ�®åº“错误r1éôuæ•°æ�®åº“æ“�作失败:r2r6)rÚ exceptionr r9s r#Úsqlalchemy_error_handlerrTfs3é€ä
×ÑÐ&Ô'Ü  C¸#ÐH`ÐadÐ`eÐFfÐptÑ1uÑ vÐvùs‚')cƒó–# •[RSURURR5 [ SSSU3SS.S9$7f)Nu未处ç�†å¼‚常:%s %sr1rRuæœ�务器内部错误:r2r6)rrSÚmethodÚurlÚpathr r9s r#Úunhandled_error_handlerrYlsEé€ä
×ÑÐ.°·±ÀÇ Á ×@PÑ@PÔQÜ  C¸#ÐH`ÐadÐ`eÐFfÐptÑ1uÑ vÐvùs‚AA Úhttpcƒó°# •[R"5nU"U5IShv•N n[R"5U-
S-SURS'U$N07f)Nièz.1fzX-Process-Time-ms)ÚtimeÚ perf_counterÚheaders)r:Ú call_nextÚstartÚresponses r#Úadd_process_timerbssTé€ä × Ò Ó €EÙ˜wÓ'×'€HÜ04×0AÒ0AÓ0CÀeÑ0KÈtÑ/SÐTWÐ.X€H×ÑÐ(Ñ)Ø €Oñ(ùs‚!A£A¤1Az /api/healthu系统u å�¥åº·æ£€æŸ¥)ÚtagsÚsummarycóº•SS[R[R[R[R
R [RS.S.$)NrÚok)r"r'ÚdatabaseÚdialectÚ auth_enabledr2)rÚAPP_NAMEÚVERSIONr rrhÚnameÚ AUTH_ENABLED©ór#ÚhealthrpsJ€ðØä×$Ñ$Ü×'Ñ'Ü ×(Ñ(Ü—~‘~×*Ñ*Ü$×1Ñ1ñ 
ñ
ð
roz/static)Ú directory)rlÚ/F)Úinclude_in_schemacó8•[[[S- 55$)Nz
index.html)r
r@Ú
STATIC_DIRrnror#Úindexrv’s€äœC¤
¨\Ñ 9Ó:Ó;Ð;roÚ__main__z app.main:appz 127.0.0.1i@)ÚhostÚportÚreload)r"r)r:rr;r)r:rr;r)r:rr;r
)r:rr;r)r:rr;Ú Exception)r:r)CÚ__doc__Ú
__future__rÚloggingr\Ú
contextlibrÚpathlibrÚfastapirrÚfastapi.exceptionsrÚfastapi.middleware.corsr Úfastapi.responsesr
r Úfastapi.staticfilesr Úsqlalchemy.excr