From 02b2b2a2bf912d10d28afe074171dd5d81c99e3a Mon Sep 17 00:00:00 2001 From: liurui Date: Sun, 2 Nov 2025 13:25:50 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E8=AF=95=E5=9C=A8=E7=BA=BF=E9=98=85?= =?UTF-8?q?=E8=AF=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/dispatch.cpython-311.pyc | Bin 16661 -> 16991 bytes .../__pycache__/settings.cpython-311.pyc | Bin 10801 -> 11273 bytes application/__pycache__/urls.cpython-311.pyc | Bin 6569 -> 6636 bytes application/settings.py | 2 +- application/urls.py | 2 +- conf/__pycache__/env.cpython-311.pyc | Bin 984 -> 1138 bytes conf/env.example.py | 4 +- conf/env.py | 4 +- .../__pycache__/serializers.cpython-311.pyc | Bin 5031 -> 5147 bytes crud_book/serializers.py | 18 +- db.sqlite3 | Bin 1441792 -> 1441792 bytes logs/error.log | 56 ++++ logs/server.log | 247 ++++++++++++++++++ test_book_api.py | 71 +++++ 14 files changed, 391 insertions(+), 13 deletions(-) create mode 100644 test_book_api.py diff --git a/application/__pycache__/dispatch.cpython-311.pyc b/application/__pycache__/dispatch.cpython-311.pyc index d5c892b06ced2752da88c617863b7b742e428358..d8efe11bb89d4620b36b4870379f606751ea15ef 100644 GIT binary patch delta 3088 zcmai0Yit}>6~1?8XLi=>$FBEbuOIRIu_QQ2>)1{mk~pqi99foB2@#YbChd_?Hg&hATI z!U$8-`iytNONm+CLX47D!u^!Eh~YCR)0pRmLdaY27M=<3I5FMl$pvMcoTsZ+y5Z$6 z<~1oR*Y7$>p1tN$Jd#;D^x5g$q%A9{Ku&OLy8Sai{7x1+P9 zojjGaj44`l2Q(U>dmsG>MqeZLhAAr|eiDg@;h29HC5*-i@a1AkTFFt+?zDSG&ADc@ zoHFCdxhcsiye3Pp>*8-T+~8tr)}2*uYd74$AH0Ppr<&D8o2az8y@lbNnpMS~Si6?f zvYKp0_Aot5u95G%ZUDr$*1%sZBP6HU!Q$S8FmG17Mp%hB=BkPV-WFnq)@R{n8*`pb z_CDN~m1aG#yL^UZ4%BZgbTHKE!AQqIp;-^Z> zrQw)Qvd&c)cQj_C4cp*e?C4V&bGpkg&+$@R1NaFq#|ibg!BUo^&hnILJKmuSQ^u^F z%9t_TQC=|ST`9#s@oRU-rAy?co9iH&kw<(K5?w% zeE_-BSEXpxax3xK@@}7O9xe1=E`Ks2`_0gYY^0WjG26)N#8P>0A_;8^OVk3n8MwLc zcJ%_`(jm%m)g#&!^YR{O@c|UQDEd(JgK+c=2fh-g=J^viwjae1h?s|e2HOK-x}v>V z`sX!`^9ku4?}jN0GaZ8i9)R-WiaIq8Bcu8ED&C;r(%HbEi+aU7!58U7H7KA!!xKeuI{%xH z?gj|&RquG}^Ef&VA{O8i*v4$)UqFGVB|82^Y&{01BU-#WD z(u6o0i01#Y<6SE5)-}NI156{nF`4rmLB%Sz;#p&Bdpx)Y7Fa%s0)6Le=x!++;Nz%; zmhyr?*Ep5jnC6D{{KhaeVCGxmaMON)D&dw(+0{R z&NF;HayVA54YajlcQY;st|syOwi;S1{?XRhB=a_mX}g}X39PrN(>w#K@8&z(lkW8^ z#9*NK>uU$Zr7I}kLR0@ zy2QfX|Ex#Gs;lK&UBzqL)>RpjBpx(J(XBL5g--$K6lM(++a3lkmrw|nR&nQZI4Z+O2Ek)T)Eul=zX~>Sao}Lai$}!hSgcO`?BMt%{FafQ z7LIRZW;VlZnKX_E$WPifFI=xo9C>ZBF3H4~C06o|na3r|7|w-|!{Fgauw;j$gB&4n z{QZ(YO&pW!QAj@kzp!&@;~@VU^eMd7AH_Eh9lx}qDYR$V-MsYJ|HEZZ(_VQoV)Me_rSkzVFdqH6tH^u@ZpL^LbZ#%ulFsr_5N~XY5(M%sykIn@yYwa olMjL?mxzBwi&FTASrdKgoBqQzV3h)%?`lotjmjS79onP(7ls*?$^ZZW delta 2881 zcma)7YiLwQ6rS0;_wFmnZj#-^T{R{##;n!EM{J^v#>8hIMl{;in6O=UuDW)!v2(B1 z$gZ18N^POEVOm;{iY-(P2`F7?h5jj0us_Wvr3~hG|bZjHNIJ zVJw3&1YcF-;{M8mlRon!%{3tnV(pMmrf z;vtMOM~d{*EbVt>9sNpHp(NwrVbe3c>+qztBtw~!Q8JEk=XodC2e18Po$1Oa>68N%FB z+c{gC66Wb93yB$+)~_SHI;+h(!HavDFQdVIQzu01EtKpftSGCU)L3!%#7y)lNtHW5 zLHwk=opS}Morn4NGHs zN;h>&J;IY|)ADRSp3sk&$$@m#Wht-gg9Upn$}N|@g;`WLFpkys^I+@dwY`Y}ruUjc zQ+tDRVF|A@9smrHdv3oP5@*%L4YvcKk9_AMm+P*y{*b;N=(`c(ukRQI-WL-SU=F>wIHn(XI%}nCV$QK4W)}j&a;Rv5np;3pw~N}Mnr?Rm97_Y zZxgK%BOs|0m%Q`mF2hro;Hl13(l9OUSUh!9H=<5nCw})XhJAitSX~DS%fvF@Ex5o{ zRHBZIKbA|}7 zk(wNLJ)n(I4{wGUZ%0^-@GQa_0LwkV!PeORLB1SiEeIO{qAva%&f7(2puSex;z{do z#-t^DB`nPhCQx}VFi+hH;*R`S;ByKlZ7b#mHxDX>~K7NaA4BYjYrL7 z%HVr&9qpK4C)z_bofs~@03n1B1Q>PBP?hUpkQ!Lem{c;5yc@L^)X-_ulT^o43a{?&#X`{8o;)^2d-zFo3RIWmp<3rSA7@aZJ^K0IwUwNYh;O-R^4 zb0+;2vC6o9fa}Jg7)vIwl;eDmCqU!f{En)1ip>wHKb7DAbRvHZ4l3Zs_k(N}Co42b z$ru#A+9LG;Xq*u{s;cs9Ya>)+@R^`uq#>9eSa`vq*)A0G>Q@J*V=MDHA>#FOUYtrG zj$KAZ({>crcmW&8F-$rum`o?l87_&jxEbeR@qK-Djcgd9gZiv>Y@f-4ydO4S&Z~># z&gsbVLm=#eGAv|=*C!DQ7~&z&EwFy=5=i0f(PXy@N!X2s9|85B^LL-ws^l7RC)O{I zB5VSPDpEmKyrmc>kE-%2%ZXjlHeZ2^u*)0^1(Ic=ysTh>*{S$`J;jfK(jV{|9AJq2 z6(GLqbIQ4WH^f-eK@Ho{RJ>L=MBmDX(`hx~oRUK4V9X!u9L!!jj~){~ei&9~SD#gi zl#M~d)ca!-Q96!R{X_D1R=q%-X_)6fXjtqJds@DZ$z+nH`h=)Gk=SuKXI9j9fS@pH z;&5w~dIA>a<=<~zL+Km&Yikxdnq`DA-Vh61wY*6qnKsOLI-&DcJV!&oq@IWtUm&X5 zsspkW&xn!eYO7aspw=n|+unvg{IKmSy5*4sz&q@gZ_GH-L@A~}mud6J*?+H}uf7G# z+eEm1z+?Z*bVVa#q=Cj(OZQ@r;nJCy?siII9&z-e zbOJ{^I9|xB5%5CU*=ZNYRk|-6@ZJ*z#%X^+hdL eDsPl`+$`_7P6GF|avHivreJA)dk3YeJo!KAV@wAC diff --git a/application/__pycache__/settings.cpython-311.pyc b/application/__pycache__/settings.cpython-311.pyc index db3785678f11e198b7fb6c2b50b1dd60afc6b883..2ff59c40cdc8edaeb35245f037e9f442b22aac9e 100644 GIT binary patch delta 1845 zcmZWoT}%{L6rR8R!(CARc3HQUDl7ksfS{rvu&@jAqp+xO1$EgoEDOsl3`s1KA@n`n6PrHQ`z)QpJ_8=f{zpPDwA_Nh(Uq-S=3SbFFD+~@KKsQO`NMlR+d;p4Tw26RzjE$G*(yU(50LdiJWx(*pn@D?D83ds zcNKvLTQCKc;9h0Xf~*fx$JdFae7$IeD!%?61=ajvlpem}9`%)xGzw;@dBwt!MsUI* zz7cAn4zdKOml-&WUxUm+qs&HVazrqp%MmyV$7DuZLl!v-O>jKSkYhM+f)nI8Zkmr? z&6(6K6HJ)KBQSiuKm)@!z)6{f)=cyX!H9ls&>o>9wA9L#TD;Jqmmmq8UHXf2VAOI*-WZ^EOmIARct$p*M68%PIS!UJ7~AdEu@AWQ=f6SA3fLO4tlAKtwY zCLcytX}oP@ePpcuhg1Kx!Zc(-ROW~uWA8zdN}$T)Hc8UFv5ND6IlUV@uDo(~_P$OLj2qb89f$WzGEK!YI~9ireC znE@t1m4CcGYZ_x|e*MR+71OQ_%h^EZrNPdQ?tmoZ{@Gm(Q$Zmd^Mqm|?+FD%le}j< z7@FnUkk{Wg;4!=F1uJ0A8nfTpG{&x-v6g zED22p1%Z!ZhTt_`ocDAKm>?!z^Xm3q%__0^x9N6C${(RSq~G%6iB3#Y&Wc@Hwr)-I z=>{LF4FfNVF;U#~(Udr#2@Nb~Hq4k9qPSHi9J35+pq6UGGAqVrgW+JD-!ccbFg$x^ zH_f?RN*B!1gX;r@#89#52+qvSHr3RG7x?*jEA}B6os7-LYibsAGCiuqzF<8~HPUx` z2k0T`@4YTsSTAzzWo)J}9}mXkqF9Sr*X#HFz|sln_cy-Z^%JhOw?A()uYbG$29wzR z$@$x(w?>!CR{Sq)RWEH-$*h#MAZby}tesJ)Jk>$j@|XN~e0O|zyFTq&o?dHsVXb{> ztxa0etW~96qm5}(fl9H4b~@z@tO$xTfb?il*UufgUdma@NjuwCh~jKRdURFSOXE4J zk+S5b?2Rc$X}Z{(F0DwFRjCHHG8c2AFjJLPsr?7k9J3=^r8Hr(=4YvtCfMw3W73!O zsU?{dzLcW^BQ;bLtU*InhxE+t4jL)Wrc!(Gu;x7}drNv>+49M?4#iok6xF3XClr@& zxqrF;X-TSZpK9XlxRoXhCM}sJSWBTX*`MrJo!VB`0>$2}vWy0B8lV=gA3XRElfZ^p zX-}ph216H}a*eHJE3Pr5Cr(`}Jr_17=Au;b$XdTrJc9Iu==%9pT`T6-kkYQ6l|{wX sqtUVM&50K0Uu#l|{YX!Sb*=m7VY`az6|NxVs#drnTse!SFUvpw7pS5rpa1{> delta 1414 zcmZWnOH3PA6rDF?<4?d%F*b%cr4l$`l92FAh{1sQnIr`B4e$~mBxf)t6sVy;n#NAM zsJcqi*&t=2T3OIYO(jxqSX5QJ>vE)SELN7f>TaZ}QoE?sJB&doeRJ9G zo)z(yRXZA9V=TM{mAD|c;368~M3X9_nZ6d)f>u>ZFy0C$zl2M;92faznzx~iU!j~U z2US9gVw}<6MA_ZA${@{d=$&#k=`4kh-&AUk>h#-I-xjVt+2zt?{ ziie1P+UWqIaytg;$X9U<*Hs&ai0L5a#t}1sVZ<;((W9yq7clmmQQo*J9?b)oIPwI@ zmzp$67u+{r3#24Wsa8y@R^Edd+7QPr+{P^C;tcb+quO~d7UGQeiGo~&yD#tUFuD#> za~!adm-sIWnci+uweWt#v4nUk!4eD!EaN^o?nA^1-odKs-~(9WQLOVpMEF&_%da8H zuVaG`VUyp$dwdx0^B6whBlOgxbbt?^Gd_lo=-a}_s>H_;;1j6fll182$6D;>L5och zJOBUAn_fM6)Okjrg-;!=jo!5IX*{5F&)@;)q_^-1zm11{mNqhn6rYa^{0`{?>0RYV z77VBH=vb@VO9&jKGQ}*C#z~h*6JW5eEKdmdl+$I53&GF6x6ewfKRb6KV^bXNzm(y! zXNuSJm_?Kw&kXDR%Db8BqZ%rKyt(|hBGMc+m{wr zu_7lo4$`U0sNpn9?K{?!YwHW~g-!X89y{~}Me}b)a8UWfyUs?lDCbt?cmD_*S3;-# zY$ZE&`jnVWSN$Ndhf28myAyc|Hriw3kuCdY_2**BlXm8cJ!yw-m&!#=aO*z7QmP9Q z>&$s$nFh@pBiRj^_|vqB=~z0J_l7f-nm0_c+h$@qrWXlTSI*s(E33}?yYkg%ay50j zRjPGSMKX4wwl4QpmHvjk%&7~8DYX@!EYbzTNG_+CF4F6j+1fz2>!403Us>~I>V-w~ zp4U7Lx%xKE*R$=~cI_coTB+MCZmMD!tIa547|Bs8rd|5m+23ma5mRsKf|d2LoNp#G ztode0cDadKbgD41cyj*97cR{|NwQaI;xBC`YL*I;yf2ywX}+i-t^I|Gk=L8q()_(7 Vdp;8>I9E}%ZPx@3p|W-M@xPNhntcEO diff --git a/application/__pycache__/urls.cpython-311.pyc b/application/__pycache__/urls.cpython-311.pyc index 9f51b14775fc166309d5ca4786d7408935dc1a74..14218f0bf1eee77a7fa6c2cc2f180ba345cc9377 100644 GIT binary patch delta 257 zcmZ2!{KlAfIWI340}xDo#g&HGptSZ$qCtzwe%Q&M9}N{cf}((^b delta 190 zcmaE3ywaF=IWI340}$j$f6Q>0$ScV>W23qpE2jlW3_0++`{E{`i*9v{6KRXIH;cS|M$0Euom2LJ#7 diff --git a/application/settings.py b/application/settings.py index 0c6bb84..a86fb7e 100644 --- a/application/settings.py +++ b/application/settings.py @@ -159,7 +159,7 @@ STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), ] -MEDIA_ROOT = "media" # 项目下的目录 +MEDIA_ROOT = os.path.join(BASE_DIR, "media") # 项目下的目录,使用绝对路径 MEDIA_URL = "/media/" # 跟STATIC_URL类似,指定用户可以通过这个url找到文件 diff --git a/application/urls.py b/application/urls.py index cae26a6..4ea7abb 100644 --- a/application/urls.py +++ b/application/urls.py @@ -121,7 +121,7 @@ urlpatterns = ( path('sse/', sse_view, name='sse'), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - + static(settings.STATIC_URL, document_root=settings.STATIC_URL) + + static(settings.STATIC_URL, document_root=settings.STATICFILES_DIRS[0] if settings.STATICFILES_DIRS else None) + [re_path(ele.get('re_path'), include(ele.get('include'))) for ele in settings.PLUGINS_URL_PATTERNS] ) diff --git a/conf/__pycache__/env.cpython-311.pyc b/conf/__pycache__/env.cpython-311.pyc index a0696ba98c752178abcbe536a44ecf08298f730d..1c7b1e5cb5791657be13b21e44264e68861722f5 100644 GIT binary patch delta 497 zcmY*VJ4*vW5Z>Lp-0j`vl9-3aSOp7>m4byJ2#OJGL=tSKIU=*hgfoUjY%ENvV4+@N zA%ayz()&A90*3nsS_STqkrHdS+z=#4 zT>`zzTzbHOQNoB|LTSo*OJZR6>WKZVO(|MGjdEZ_e;H_~fG$Xxk7oBqpPi2MunG;; zCX?qR1_mYuz(NgzsDq6hLTEr3O^BccV;F=e+7OdFaS^MT7!t8tf?*MtIdT_(L`B1~ zp;91$Q5ct)kVs;zNK-IbB#=UyCz<$r@5QYQ_0{dd(f(C8M>o7RI=?jKv%|WtS7p;J z?bZ~z<#Wf`E4jjPe7z>>hwicPwQ8XzDn~wFTg_*k_061jO;1c?M~Yl_eKYR`*&`L+ z6U%O8 zWyoRysRw}ttP>Xs*E6ItrLZhxVqjPe#1Ih0mckmvp28Nzk-{FunZgmpmBJatox&Bx zlfoUvo5B;t2bAYe5Ne#=?qb#DU87kn!+zZmih5$GT!2FatwBjckv9GY{wWhc_O2Mg4ivl{Nh_8i3J5Y znaPPInfZBo#i=DFnR)5OMa)2LlYcT+Pp)TL!RR_!gV|MA1t`P_#Kot9#0O?ZM#dWq coDE?3fI;&DDw@2T*_x4K@;~MR7A2r^0HIV)Bme*a diff --git a/conf/env.example.py b/conf/env.example.py index 2670cec..c60516f 100644 --- a/conf/env.example.py +++ b/conf/env.example.py @@ -1,6 +1,8 @@ import os +from pathlib import Path -from application.settings import BASE_DIR +# 定义BASE_DIR(避免循环导入) +BASE_DIR = Path(__file__).resolve().parent.parent # ================================================= # # *************** mysql数据库 配置 *************** # diff --git a/conf/env.py b/conf/env.py index 02e1164..57ebd2f 100644 --- a/conf/env.py +++ b/conf/env.py @@ -1,6 +1,8 @@ import os +from pathlib import Path -from application.settings import BASE_DIR +# 定义BASE_DIR(避免循环导入) +BASE_DIR = Path(__file__).resolve().parent.parent # ================================================= # # *************** mysql数据库 配置 *************** # diff --git a/crud_book/__pycache__/serializers.cpython-311.pyc b/crud_book/__pycache__/serializers.cpython-311.pyc index 5d127a3e02780e2b3cffff1819d7d086495f9d06..533ea5c286f35d7bdf749df0fce7c7e432e6fdbd 100644 GIT binary patch delta 1203 zcmZ8g&1(}u6whw5n>5=rUu{zBN7L_aiGiewEmBgoXcaAJ_0+?%Nw#g`l8v()u~KQl zgB3hEY6UL^OMCF5w1`msAKDUV87Qczcr2boC^&CoO3XlhnK$qEe(&wPH>*9bdOfQi zkK0C9;-{E>_|Eg3=Vbhv9|+4lahRGuN$f@{XY!O0iToMW@GpL^{Ufy&ZL?es0@*@0 zXKgvIVlDC5&v&{X@UuK>o#mJ8)NH&`&CfY1+!Y%2<}h;HX0d9@-kexr{U3`JK0f#3 z#iMT>W=(d#EG;!Ma{IvWG8VrCB79DrWVJqNYqkFIt*X zL|I}lA{{wt9^|1Q+ff7Ty#S3AOgjatk9_o>xTuN(!uKOMFEr0p%;UhEpfGRSciHN_ zPX_jFLS6soP|GuYC)B+i>Ry`J3dKvI_`;=KZ)o4fd4{>&@QIypd^;R}+p*re9^DEj zOX1|EFS!>yS_*b7rI)9d^{rrHvp%uw4K7$HK=sq~cepq_Dm?bXak)CjHO*4dG5l5N zYG$Wh)HNncs1+y?fHvGJ%AFEyn*jU(Edanpod9J)tcyclDY|gBBt^HRSV@Y_kKhmD zbuNJ2&Vy6s5b~g<--_J3t2o;zOF6QH;DkLmQ~+8MFFhfyHV_;EelZIbYY> zqPvX~P?$RLC#k0q27?H9Rh^Dl`8^=t+HdJQH+Kf&VOmf>z$pr{i`WZB0m1m7K>*M} zApjr|!7LVN^gr=v7FhJ&6}2*PiyD`L>wkYBh)nEAwo*X ziB;dzL1>9wUwh}QnZPCWm+8Bk($Gb?>#`cV;2|9K_et=WP>caq{Tt;AkKy)!(Zt%$ NT-C$45;$-`%D+Ci$5PPsERqC|0H zNMz+zH@F~5BrHu=#*II~1(*`aBql5*F>xVrV>BW0o;#4#-o=;m_|A9Ey=P{wXE7aK z42OdrdR_(pjK6*te&OYo$Q$qR#FE$XTe>mk_{`DUmX|V;$-l!F$S?0#@{?N_`S$+p z)yo%y$?bzfl#x~ZPQWm8nq4r9I7}m01ZV_66t;D6jM|QLOSjb>_Wcy;cL4t--PUk3xhd@1&7z$&l~qEx4Ja@I-b>~L zB_)B`1Rw(>0Dy}-09--xT^K~Df963I^{=2z6=kM}$$&V*#mN(KYrKUrv$(ac2wWzl zQ0oYIT>v%1@U_E0E(K8E9Aaq(G&K}xZTOeNSuq2)yT61 zEJTs&Upz$~MiU`MW{-K2%t!Z!;NQT#49IHqgZsF>!nG5~QoI z-Y8Z_u_Q1DWS~4KmfDmQ>q-Bi-eQ;I+-t>@<0U|&_NW$ zKpZ510p`I1SOiNT2~r>(mIs;l`wX!#T_eR3bxK9w_BiG~7fuCjr71pco;NNV`!#O6 zCk2NU+^}6i?S4YhA`!!kGTqdm*+^B|D=kkPoFUVmj^l*-*rk}d7Mb37Zjt-GNFJhs zc&a0soVg}ObySnsY%I1t&mol0#$ucKj8N|{R$Nukvgm%HBc)Ssxgs}4xsA!c*eyBK e_6g_gU%}rE_c$~Z!^d|t4JyFJ)QF>!Sn-1F+84YGz#_5KA>=Ml^y6r5wj6lo;#LPgcQ1+1Bjn++%4;A;0+!wSS~K+F!r96-zo#2|5QAm#yLULfWJVtybN0AfKP z76M}7?H+4HZY&Zp&^0nsFf_F?GPg1^)w47=H!(DsZsIR$J^kc&QL*i<{-X5@*cf@F T8F-{O3qBC!*)IJ@^eHm{Dx*Bt diff --git a/logs/error.log b/logs/error.log index d042b76..3843260 100644 --- a/logs/error.log +++ b/logs/error.log @@ -168997,3 +168997,59 @@ Traceback (most recent call last): File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost self._sock.shutdown(socket.SHUT_RDWR) ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:05:00,475][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:05:00,476][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:05:35,177][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:10:06,217][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:10:06,374][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:12:22,081][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:12:22,140][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 diff --git a/logs/server.log b/logs/server.log index 0f3e444..029d9b3 100644 --- a/logs/server.log +++ b/logs/server.log @@ -176236,3 +176236,250 @@ ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有 [2025-11-02 12:54:06,284][uvicorn.error._wait_tasks_to_complete():296] [INFO] Waiting for connections to close. (CTRL+C to force quit) [2025-11-02 12:55:55,929][uvicorn.error._wait_tasks_to_complete():303] [INFO] Waiting for background tasks to complete. (CTRL+C to force quit) [2025-11-02 12:55:55,929][uvicorn.error._wait_tasks_to_complete():303] [INFO] Waiting for background tasks to complete. (CTRL+C to force quit) +[2025-11-02 13:03:18,997][uvicorn.error._serve():92] [INFO] Finished server process [36132] +[2025-11-02 13:03:18,997][uvicorn.error._serve():92] [INFO] Finished server process [36132] +[2025-11-02 13:04:31,720][uvicorn.error._serve():82] [INFO] Started server process [32668] +[2025-11-02 13:04:31,720][uvicorn.error._serve():82] [INFO] Started server process [32668] +[2025-11-02 13:04:31,721][uvicorn.error.startup():48] [INFO] Waiting for application startup. +[2025-11-02 13:04:31,721][uvicorn.error.startup():48] [INFO] Waiting for application startup. +[2025-11-02 13:04:31,722][uvicorn.error.main():94] [INFO] ASGI 'lifespan' protocol appears unsupported. +[2025-11-02 13:04:31,722][uvicorn.error.main():94] [INFO] ASGI 'lifespan' protocol appears unsupported. +[2025-11-02 13:04:31,722][uvicorn.error.startup():62] [INFO] Application startup complete. +[2025-11-02 13:04:31,722][uvicorn.error.startup():62] [INFO] Application startup complete. +[2025-11-02 13:04:31,723][uvicorn.error._log_started_message():214] [INFO] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) +[2025-11-02 13:04:31,723][uvicorn.error._log_started_message():214] [INFO] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) +[2025-11-02 13:04:59,691][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "OPTIONS /api/system/user/user_info/ HTTP/1.1" 200 +[2025-11-02 13:04:59,691][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "OPTIONS /api/system/user/user_info/ HTTP/1.1" 200 +[2025-11-02 13:05:00,152][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /api/system/user/user_info/ HTTP/1.1" 200 +[2025-11-02 13:05:00,152][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /api/system/user/user_info/ HTTP/1.1" 200 +[2025-11-02 13:05:00,160][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "OPTIONS /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200 +[2025-11-02 13:05:00,160][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "OPTIONS /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200 +[2025-11-02 13:05:00,162][uvicorn.access.send():466] [INFO] 127.0.0.1:54909 - "OPTIONS /api/init/settings/ HTTP/1.1" 200 +[2025-11-02 13:05:00,162][uvicorn.access.send():466] [INFO] 127.0.0.1:54909 - "OPTIONS /api/init/settings/ HTTP/1.1" 200 +[2025-11-02 13:05:00,163][uvicorn.access.send():466] [INFO] 127.0.0.1:56740 - "OPTIONS /api/system/dept/all_dept/ HTTP/1.1" 200 +[2025-11-02 13:05:00,163][uvicorn.access.send():466] [INFO] 127.0.0.1:56740 - "OPTIONS /api/system/dept/all_dept/ HTTP/1.1" 200 +[2025-11-02 13:05:00,164][uvicorn.access.send():466] [INFO] 127.0.0.1:53710 - "OPTIONS /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200 +[2025-11-02 13:05:00,164][uvicorn.access.send():466] [INFO] 127.0.0.1:53710 - "OPTIONS /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200 +[2025-11-02 13:05:00,165][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "OPTIONS /api/system/menu/web_router/ HTTP/1.1" 200 +[2025-11-02 13:05:00,165][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "OPTIONS /api/system/menu/web_router/ HTTP/1.1" 200 +[2025-11-02 13:05:00,178][uvicorn.access.send():466] [INFO] 127.0.0.1:53710 - "GET /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200 +[2025-11-02 13:05:00,178][uvicorn.access.send():466] [INFO] 127.0.0.1:53710 - "GET /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200 +[2025-11-02 13:05:00,185][uvicorn.access.send():466] [INFO] 127.0.0.1:54909 - "GET /api/init/settings/ HTTP/1.1" 200 +[2025-11-02 13:05:00,185][uvicorn.access.send():466] [INFO] 127.0.0.1:54909 - "GET /api/init/settings/ HTTP/1.1" 200 +[2025-11-02 13:05:00,188][uvicorn.access.send():466] [INFO] 127.0.0.1:56740 - "GET /api/system/dept/all_dept/ HTTP/1.1" 200 +[2025-11-02 13:05:00,188][uvicorn.access.send():466] [INFO] 127.0.0.1:56740 - "GET /api/system/dept/all_dept/ HTTP/1.1" 200 +[2025-11-02 13:05:00,189][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200 +[2025-11-02 13:05:00,189][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200 +[2025-11-02 13:05:00,190][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "GET /api/system/menu/web_router/ HTTP/1.1" 200 +[2025-11-02 13:05:00,190][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "GET /api/system/menu/web_router/ HTTP/1.1" 200 +[2025-11-02 13:05:00,409][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "OPTIONS /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200 +[2025-11-02 13:05:00,409][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "OPTIONS /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200 +[2025-11-02 13:05:00,430][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200 +[2025-11-02 13:05:00,430][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200 +[2025-11-02 13:05:00,472][django.request.log_response():241] [WARNING] Not Found: /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg +[2025-11-02 13:05:00,472][django.request.log_response():241] [WARNING] Not Found: /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg +[2025-11-02 13:05:00,473][uvicorn.access.send():466] [INFO] 127.0.0.1:61711 - "GET /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg HTTP/1.1" 404 +[2025-11-02 13:05:00,473][uvicorn.access.send():466] [INFO] 127.0.0.1:61711 - "GET /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg HTTP/1.1" 404 +[2025-11-02 13:05:00,474][uvicorn.access.send():466] [INFO] 127.0.0.1:59289 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404 +[2025-11-02 13:05:00,474][uvicorn.access.send():466] [INFO] 127.0.0.1:59289 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404 +[2025-11-02 13:05:00,475][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:05:00,476][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:05:00,607][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200 +[2025-11-02 13:05:00,607][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200 +[2025-11-02 13:05:03,959][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:05:03,959][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:05:03,976][django.request.log_response():241] [WARNING] Not Found: /api/CrudBookModelViewSet/2/file/ +[2025-11-02 13:05:03,977][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404 +[2025-11-02 13:05:03,977][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404 +[2025-11-02 13:05:19,896][uvicorn.access.send():466] [INFO] 127.0.0.1:49248 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:05:19,896][uvicorn.access.send():466] [INFO] 127.0.0.1:49248 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:05:19,911][django.request.log_response():241] [WARNING] Not Found: /api/CrudBookModelViewSet/2/file/ +[2025-11-02 13:05:19,912][uvicorn.access.send():466] [INFO] 127.0.0.1:49248 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404 +[2025-11-02 13:05:19,912][uvicorn.access.send():466] [INFO] 127.0.0.1:49248 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404 +[2025-11-02 13:05:35,175][django.request.log_response():241] [WARNING] Not Found: /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg +[2025-11-02 13:05:35,175][uvicorn.access.send():466] [INFO] 127.0.0.1:49946 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404 +[2025-11-02 13:05:35,175][uvicorn.access.send():466] [INFO] 127.0.0.1:49946 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404 +[2025-11-02 13:05:35,177][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:05:42,871][uvicorn.access.send():466] [INFO] 127.0.0.1:50235 - "OPTIONS /api/CrudBookModelViewSet/2/ HTTP/1.1" 200 +[2025-11-02 13:05:42,871][uvicorn.access.send():466] [INFO] 127.0.0.1:50235 - "OPTIONS /api/CrudBookModelViewSet/2/ HTTP/1.1" 200 +[2025-11-02 13:05:42,947][uvicorn.access.send():466] [INFO] 127.0.0.1:50235 - "PUT /api/CrudBookModelViewSet/2/ HTTP/1.1" 200 +[2025-11-02 13:05:42,947][uvicorn.access.send():466] [INFO] 127.0.0.1:50235 - "PUT /api/CrudBookModelViewSet/2/ HTTP/1.1" 200 +[2025-11-02 13:06:51,564][uvicorn.access.send():466] [INFO] 127.0.0.1:55524 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:06:51,564][uvicorn.access.send():466] [INFO] 127.0.0.1:55524 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:06:51,579][django.request.log_response():241] [WARNING] Not Found: /api/CrudBookModelViewSet/2/file/ +[2025-11-02 13:06:51,580][uvicorn.access.send():466] [INFO] 127.0.0.1:55524 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404 +[2025-11-02 13:06:51,580][uvicorn.access.send():466] [INFO] 127.0.0.1:55524 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404 +[2025-11-02 13:10:05,123][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "OPTIONS /api/system/user/user_info/ HTTP/1.1" 200 +[2025-11-02 13:10:05,123][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "OPTIONS /api/system/user/user_info/ HTTP/1.1" 200 +[2025-11-02 13:10:05,133][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "GET /api/system/user/user_info/ HTTP/1.1" 200 +[2025-11-02 13:10:05,133][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "GET /api/system/user/user_info/ HTTP/1.1" 200 +[2025-11-02 13:10:05,386][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "OPTIONS /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200 +[2025-11-02 13:10:05,386][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "OPTIONS /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200 +[2025-11-02 13:10:05,393][uvicorn.access.send():466] [INFO] 127.0.0.1:50549 - "OPTIONS /api/init/settings/ HTTP/1.1" 200 +[2025-11-02 13:10:05,393][uvicorn.access.send():466] [INFO] 127.0.0.1:50549 - "OPTIONS /api/init/settings/ HTTP/1.1" 200 +[2025-11-02 13:10:05,395][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "OPTIONS /api/system/dept/all_dept/ HTTP/1.1" 200 +[2025-11-02 13:10:05,395][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "OPTIONS /api/system/dept/all_dept/ HTTP/1.1" 200 +[2025-11-02 13:10:05,398][uvicorn.access.send():466] [INFO] 127.0.0.1:63754 - "OPTIONS /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200 +[2025-11-02 13:10:05,398][uvicorn.access.send():466] [INFO] 127.0.0.1:63754 - "OPTIONS /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200 +[2025-11-02 13:10:05,401][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "OPTIONS /api/system/menu/web_router/ HTTP/1.1" 200 +[2025-11-02 13:10:05,401][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "OPTIONS /api/system/menu/web_router/ HTTP/1.1" 200 +[2025-11-02 13:10:05,404][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "GET /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200 +[2025-11-02 13:10:05,404][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "GET /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200 +[2025-11-02 13:10:05,419][uvicorn.access.send():466] [INFO] 127.0.0.1:63754 - "GET /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200 +[2025-11-02 13:10:05,419][uvicorn.access.send():466] [INFO] 127.0.0.1:63754 - "GET /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200 +[2025-11-02 13:10:05,423][uvicorn.access.send():466] [INFO] 127.0.0.1:50549 - "GET /api/init/settings/ HTTP/1.1" 200 +[2025-11-02 13:10:05,423][uvicorn.access.send():466] [INFO] 127.0.0.1:50549 - "GET /api/init/settings/ HTTP/1.1" 200 +[2025-11-02 13:10:05,425][uvicorn.access.send():466] [INFO] 127.0.0.1:55561 - "GET /api/system/dept/all_dept/ HTTP/1.1" 200 +[2025-11-02 13:10:05,425][uvicorn.access.send():466] [INFO] 127.0.0.1:55561 - "GET /api/system/dept/all_dept/ HTTP/1.1" 200 +[2025-11-02 13:10:05,427][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "GET /api/system/menu/web_router/ HTTP/1.1" 200 +[2025-11-02 13:10:05,427][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "GET /api/system/menu/web_router/ HTTP/1.1" 200 +[2025-11-02 13:10:06,072][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "OPTIONS /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200 +[2025-11-02 13:10:06,072][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "OPTIONS /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200 +[2025-11-02 13:10:06,088][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "GET /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200 +[2025-11-02 13:10:06,088][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "GET /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200 +[2025-11-02 13:10:06,214][django.request.log_response():241] [WARNING] Not Found: /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg +[2025-11-02 13:10:06,215][uvicorn.access.send():466] [INFO] 127.0.0.1:49738 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404 +[2025-11-02 13:10:06,215][uvicorn.access.send():466] [INFO] 127.0.0.1:49738 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404 +[2025-11-02 13:10:06,217][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:10:06,371][django.request.log_response():241] [WARNING] Not Found: /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg +[2025-11-02 13:10:06,371][uvicorn.access.send():466] [INFO] 127.0.0.1:55255 - "GET /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg HTTP/1.1" 404 +[2025-11-02 13:10:06,371][uvicorn.access.send():466] [INFO] 127.0.0.1:55255 - "GET /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg HTTP/1.1" 404 +[2025-11-02 13:10:06,374][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:10:06,760][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200 +[2025-11-02 13:10:06,760][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200 +[2025-11-02 13:12:20,894][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/system/user/user_info/ HTTP/1.1" 200 +[2025-11-02 13:12:20,894][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/system/user/user_info/ HTTP/1.1" 200 +[2025-11-02 13:12:20,906][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /api/system/user/user_info/ HTTP/1.1" 200 +[2025-11-02 13:12:20,906][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /api/system/user/user_info/ HTTP/1.1" 200 +[2025-11-02 13:12:21,034][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200 +[2025-11-02 13:12:21,034][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200 +[2025-11-02 13:12:21,037][uvicorn.access.send():466] [INFO] 127.0.0.1:56771 - "OPTIONS /api/init/settings/ HTTP/1.1" 200 +[2025-11-02 13:12:21,037][uvicorn.access.send():466] [INFO] 127.0.0.1:56771 - "OPTIONS /api/init/settings/ HTTP/1.1" 200 +[2025-11-02 13:12:21,040][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/system/dept/all_dept/ HTTP/1.1" 200 +[2025-11-02 13:12:21,040][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/system/dept/all_dept/ HTTP/1.1" 200 +[2025-11-02 13:12:21,044][uvicorn.access.send():466] [INFO] 127.0.0.1:56771 - "OPTIONS /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200 +[2025-11-02 13:12:21,044][uvicorn.access.send():466] [INFO] 127.0.0.1:56771 - "OPTIONS /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200 +[2025-11-02 13:12:21,048][uvicorn.access.send():466] [INFO] 127.0.0.1:53736 - "OPTIONS /api/system/menu/web_router/ HTTP/1.1" 200 +[2025-11-02 13:12:21,048][uvicorn.access.send():466] [INFO] 127.0.0.1:53736 - "OPTIONS /api/system/menu/web_router/ HTTP/1.1" 200 +[2025-11-02 13:12:21,066][uvicorn.access.send():466] [INFO] 127.0.0.1:56771 - "GET /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200 +[2025-11-02 13:12:21,066][uvicorn.access.send():466] [INFO] 127.0.0.1:56771 - "GET /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200 +[2025-11-02 13:12:21,078][uvicorn.access.send():466] [INFO] 127.0.0.1:60714 - "GET /api/init/settings/ HTTP/1.1" 200 +[2025-11-02 13:12:21,078][uvicorn.access.send():466] [INFO] 127.0.0.1:60714 - "GET /api/init/settings/ HTTP/1.1" 200 +[2025-11-02 13:12:21,081][uvicorn.access.send():466] [INFO] 127.0.0.1:62829 - "GET /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200 +[2025-11-02 13:12:21,081][uvicorn.access.send():466] [INFO] 127.0.0.1:62829 - "GET /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200 +[2025-11-02 13:12:21,084][uvicorn.access.send():466] [INFO] 127.0.0.1:53736 - "GET /api/system/menu/web_router/ HTTP/1.1" 200 +[2025-11-02 13:12:21,084][uvicorn.access.send():466] [INFO] 127.0.0.1:53736 - "GET /api/system/menu/web_router/ HTTP/1.1" 200 +[2025-11-02 13:12:21,087][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /api/system/dept/all_dept/ HTTP/1.1" 200 +[2025-11-02 13:12:21,087][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /api/system/dept/all_dept/ HTTP/1.1" 200 +[2025-11-02 13:12:21,927][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200 +[2025-11-02 13:12:21,927][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200 +[2025-11-02 13:12:21,939][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200 +[2025-11-02 13:12:21,939][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200 +[2025-11-02 13:12:22,079][django.request.log_response():241] [WARNING] Not Found: /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg +[2025-11-02 13:12:22,080][uvicorn.access.send():466] [INFO] 127.0.0.1:65263 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404 +[2025-11-02 13:12:22,080][uvicorn.access.send():466] [INFO] 127.0.0.1:65263 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404 +[2025-11-02 13:12:22,081][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:12:22,138][django.request.log_response():241] [WARNING] Not Found: /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg +[2025-11-02 13:12:22,139][uvicorn.access.send():466] [INFO] 127.0.0.1:56037 - "GET /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg HTTP/1.1" 404 +[2025-11-02 13:12:22,139][uvicorn.access.send():466] [INFO] 127.0.0.1:56037 - "GET /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg HTTP/1.1" 404 +[2025-11-02 13:12:22,140][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None) +handle: +Traceback (most recent call last): + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run + self._context.run(self._callback, *self._args) + File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost + self._sock.shutdown(socket.SHUT_RDWR) +ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 +[2025-11-02 13:12:22,521][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200 +[2025-11-02 13:12:22,521][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200 +[2025-11-02 13:13:00,550][uvicorn.access.send():466] [INFO] 127.0.0.1:49919 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:13:00,550][uvicorn.access.send():466] [INFO] 127.0.0.1:49919 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:13:00,561][django.request.log_response():241] [WARNING] Not Found: /api/CrudBookModelViewSet/2/file/ +[2025-11-02 13:13:00,562][uvicorn.access.send():466] [INFO] 127.0.0.1:49919 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404 +[2025-11-02 13:13:00,562][uvicorn.access.send():466] [INFO] 127.0.0.1:49919 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404 +[2025-11-02 13:13:34,239][django.request.log_response():241] [WARNING] Not Found: /media/files/e/8/e8cc692135fd445f18dc128c36e49bff.epub +[2025-11-02 13:13:34,240][uvicorn.access.send():466] [INFO] 127.0.0.1:64807 - "GET /media/files/e/8/e8cc692135fd445f18dc128c36e49bff.epub HTTP/1.1" 404 +[2025-11-02 13:13:34,240][uvicorn.access.send():466] [INFO] 127.0.0.1:64807 - "GET /media/files/e/8/e8cc692135fd445f18dc128c36e49bff.epub HTTP/1.1" 404 +[2025-11-02 13:14:46,913][uvicorn.access.send():466] [INFO] 127.0.0.1:58311 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:14:46,913][uvicorn.access.send():466] [INFO] 127.0.0.1:58311 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:14:46,922][django.request.log_response():241] [WARNING] Not Found: /api/CrudBookModelViewSet/2/file/ +[2025-11-02 13:14:46,923][uvicorn.access.send():466] [INFO] 127.0.0.1:58311 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404 +[2025-11-02 13:14:46,923][uvicorn.access.send():466] [INFO] 127.0.0.1:58311 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404 +[2025-11-02 13:23:40,289][uvicorn.error.shutdown():258] [INFO] Shutting down +[2025-11-02 13:23:40,289][uvicorn.error.shutdown():258] [INFO] Shutting down +[2025-11-02 13:23:40,400][uvicorn.error._wait_tasks_to_complete():296] [INFO] Waiting for connections to close. (CTRL+C to force quit) +[2025-11-02 13:23:40,400][uvicorn.error._wait_tasks_to_complete():296] [INFO] Waiting for connections to close. (CTRL+C to force quit) +[2025-11-02 13:23:41,584][uvicorn.error._serve():92] [INFO] Finished server process [32668] +[2025-11-02 13:23:41,584][uvicorn.error._serve():92] [INFO] Finished server process [32668] +[2025-11-02 13:24:00,590][uvicorn.error._serve():82] [INFO] Started server process [19728] +[2025-11-02 13:24:00,590][uvicorn.error._serve():82] [INFO] Started server process [19728] +[2025-11-02 13:24:00,590][uvicorn.error.startup():48] [INFO] Waiting for application startup. +[2025-11-02 13:24:00,590][uvicorn.error.startup():48] [INFO] Waiting for application startup. +[2025-11-02 13:24:00,591][uvicorn.error.main():94] [INFO] ASGI 'lifespan' protocol appears unsupported. +[2025-11-02 13:24:00,591][uvicorn.error.main():94] [INFO] ASGI 'lifespan' protocol appears unsupported. +[2025-11-02 13:24:00,591][uvicorn.error.startup():62] [INFO] Application startup complete. +[2025-11-02 13:24:00,591][uvicorn.error.startup():62] [INFO] Application startup complete. +[2025-11-02 13:24:00,592][uvicorn.error._log_started_message():214] [INFO] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) +[2025-11-02 13:24:00,592][uvicorn.error._log_started_message():214] [INFO] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) +[2025-11-02 13:24:01,022][uvicorn.access.send():466] [INFO] 127.0.0.1:58202 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200 +[2025-11-02 13:24:01,022][uvicorn.access.send():466] [INFO] 127.0.0.1:58202 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200 +[2025-11-02 13:24:27,464][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:24:27,464][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:24:27,495][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:24:27,495][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200 +[2025-11-02 13:24:27,508][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "GET /media/books/hamlet_NkSTa6g.epub HTTP/1.1" 200 +[2025-11-02 13:24:27,508][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "GET /media/books/hamlet_NkSTa6g.epub HTTP/1.1" 200 +[2025-11-02 13:24:27,582][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "OPTIONS /api/reading-progress/by_book/?book_id=2 HTTP/1.1" 200 +[2025-11-02 13:24:27,582][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "OPTIONS /api/reading-progress/by_book/?book_id=2 HTTP/1.1" 200 +[2025-11-02 13:24:27,600][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "GET /api/reading-progress/by_book/?book_id=2 HTTP/1.1" 200 +[2025-11-02 13:24:27,600][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "GET /api/reading-progress/by_book/?book_id=2 HTTP/1.1" 200 +[2025-11-02 13:24:30,686][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "OPTIONS /api/reading-progress/ HTTP/1.1" 200 +[2025-11-02 13:24:30,686][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "OPTIONS /api/reading-progress/ HTTP/1.1" 200 +[2025-11-02 13:24:30,803][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "POST /api/reading-progress/ HTTP/1.1" 200 +[2025-11-02 13:24:30,803][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "POST /api/reading-progress/ HTTP/1.1" 200 +[2025-11-02 13:24:39,748][uvicorn.access.send():466] [INFO] 127.0.0.1:59255 - "OPTIONS /api/reading-progress/ HTTP/1.1" 200 +[2025-11-02 13:24:39,748][uvicorn.access.send():466] [INFO] 127.0.0.1:59255 - "OPTIONS /api/reading-progress/ HTTP/1.1" 200 +[2025-11-02 13:24:39,836][uvicorn.access.send():466] [INFO] 127.0.0.1:59255 - "POST /api/reading-progress/ HTTP/1.1" 200 +[2025-11-02 13:24:39,836][uvicorn.access.send():466] [INFO] 127.0.0.1:59255 - "POST /api/reading-progress/ HTTP/1.1" 200 diff --git a/test_book_api.py b/test_book_api.py new file mode 100644 index 0000000..98e4795 --- /dev/null +++ b/test_book_api.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +测试图书文件API +""" +import os +import sys +import django + +# 添加项目根目录到Python路径 +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +# 设置Django环境变量 +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings') + +# 初始化Django +django.setup() + +from crud_book.models import CrudBookModel +from django.conf import settings + +print("=" * 60) +print("图书文件API测试") +print("=" * 60) + +# 检查配置 +print("\n1. 配置检查:") +print(f"MEDIA_ROOT: {settings.MEDIA_ROOT}") +print(f"MEDIA_URL: {settings.MEDIA_URL}") +print(f"BASE_DIR: {settings.BASE_DIR}") + +# 检查媒体目录 +print("\n2. 媒体目录检查:") +media_dir = os.path.join(settings.BASE_DIR, "media") +print(f"媒体目录: {media_dir}") +print(f"目录存在: {os.path.exists(media_dir)}") + +books_dir = os.path.join(media_dir, "books") +print(f"图书目录: {books_dir}") +print(f"目录存在: {os.path.exists(books_dir)}") + +if os.path.exists(books_dir): + files = os.listdir(books_dir) + print(f"图书文件: {files}") + +# 检查图书数据 +print("\n3. 图书数据检查:") +books = CrudBookModel.objects.all() +print(f"总图书数: {books.count()}") + +for book in books[:5]: # 只显示前5本 + print(f"\n图书 ID={book.id}:") + print(f" 书名: {book.title}") + print(f" 文件字段存在: {bool(book.file)}") + if book.file: + try: + file_path = book.file.path + print(f" 文件路径: {file_path}") + print(f" 文件存在: {os.path.exists(file_path)}") + print(f" 文件URL: {book.file.url}") + + # 构建完整URL + base_url = "http://127.0.0.1:8000" + full_url = f"{base_url}{book.file.url}" + print(f" 完整URL: {full_url}") + except Exception as e: + print(f" 错误: {e}") + +print("\n" + "=" * 60) +print("测试完成") +print("=" * 60)