From 2b5cd26248cebb5dfbf58ea747671114e3e178be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 19 May 2026 15:42:23 +0200 Subject: [PATCH 001/290] =?UTF-8?q?=F0=9F=8D=B1=20Update=20sponsors:=20Tal?= =?UTF-8?q?orData=20image=20(#15562)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/img/sponsors/talordata.png | Bin 1755 -> 14921 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/en/docs/img/sponsors/talordata.png b/docs/en/docs/img/sponsors/talordata.png index 541bfcab840c103b405548c09c0ba71b51e22047..53906ee6e8e84186b47ba52be817102a7bbdf392 100644 GIT binary patch literal 14921 zcmV-PI=01$P)UY(v>Y5;A012?Sp$@9p=Ri{RS0!5H7 ziLO=Dp;iNkRyxRSrm^H4_9)#P~$UF+oCqmxuhIAmXtvf1TF=xJ#-K@AE<(opcQm$(-zujimNhfQ&?Sqo$Qb}{J^fx z0AM@-ntIGDrE>m!=zUMGh`P}E^WhrpKrs(?45D^+^AS1}+}+NEG<@g^ng$zX?$gqy zN>v@u4Yw)p=qzg*4nR>Dz`(LDOz(=p237^$SziOY8fu|eX?ti}T$<2r1*O8EpYkSS zPaa5$580QcF(m09p5EHlKDPLwqqSZ?4HvQ(&4R~A#gjOQJyu#wl;MgwbN9iNm2|Qv zxA$#r<01Z))@a6ktY(T_eeeKuFRow?v>n-wRA5xzeT@g8PkAROX5KeK?5n^gLvdO9 zhv{F_7I?X^*h4S>+7vg1h`+#*wUy12Zb6BbtJR2Pv`Y0xzXvTkDjs_kV5*N#<|&Q26=weJ~S~E-B`O94kJ8q zk^BRbReKxjJe8MX!5_kA!)y+FK-3CaRC(oALKs4Yrriew7A)CBBFO#cssRaivn#L3 zi}^c9Xl0g&l%OwtGwKTzF6dU~ufWoRf`I%jV+g>8QI_0Lk|6=8i+##F!j{Gw*nM!n zdQV)StKL?>k120wMR{#xeL7VLq!~O)bj%u|gNmDnG!SYu)to9-KUsj%(O10>Rm0sr z`?C!!yu|Zi@o(s)ot|sejGLyM_V!8mL&v?O_U2O!iMzTY+l@WyWUsOgu&rSqG=zuZ za&fWaU=4I`UCuMkGLjJJj?lp!b)6oPyGqdwNDP5DrMSfBf!Xi`mWPrCgb-&{CcCjp z9u3uVq@@cMy6ze()xg6XC((~3Hqht?4o}#;5KB@(8WJ$Bg9Ls`idsQwackIASCud0 z3XI+tmyEi#ZtFx~7Xj0TeFf#ekhoIVCwXM$@pMQ^hL4RoJK=&ePCnoAInHN9P zZ{E8L=xzR$4%SbC)JYDp=`2XWEbBM(pYm>YdVLJ z++G$;dL3B*ZTd{Aw(powPclocC94t9oer(2_EGkEVi-!7F)zHGO?UZk^u9GL>)ej5 z_3DfSPNY88yfASr1l$J1)ea$W;x${S$*R!e36pxI3qV@#%{A{pDR+UaPOkZ2cCZ`m z=Ab91t>SOpx7u4qH3Jf7(sPh?h4$$(7SsEibzCLDrn(hS-E@#=r;GM8SBx7q%pF#$ z-AD#?Ad<78KG^KP&AXKSv&{wFm|Vk3w>E>QteIdLQySl4k74|tf!Tw!V9qboK7Vzb zvxTu{4|FNE%SdvlPty%a9(1ou#~6Y1P0^<~LS1cBT+CLDYM}^sd+6TRBx6EA4wTAB zA&cR5du?ka_NMw$0C1_JErg@_P(7XPVfbNj)kucGYaD1xpU!B+AbK5YBSm>N7e{7m zfBLcqj-5x4SX-uV$8YCF_p9a|sysGw*>ojfPPYwIvB&!_(~Z2(9)Vx|=jQwGF3{pNuXe8YFwZ#RYb zTb5n>9NZSI>9u`ca$~dw@lF5(hQ7sGMA$~@xI=fZW9t9;w zP-=Y_N3>Zk+)M_jv+Vz(R)L#^WH9ZJoIvuO3)^N4_D4>a*b_)D2qe3hEtJ(gu-BcRT+JIEo zAFysoQ8DwtMXd~GWL9Vh9cV?3IF$1Zqh!04?D=F`DosC7AFBR{vqk{oTkm&h6&KYH zrW586sHuvq(4cWBx7ABTsct|+D|MUls5EE@5?hN}Y3`|pQ&${!`$DFAHd7d8lqMfu z(DxRJomVDl+iy2RK?(+R2rbt%m5?Y6yvisFRDhLiAp@mt*5q9XNup*4Ieb(-v5gX4 zq8m_q3zfDAIsLd)Df>ki>FyP2ZAsJ2>^>0*=~D?swVg+_p2;N}A~wvNzbIZwLEa)Bb*~Tnj9%=~6o4@SXR|*h508l6s0@ z8VkxB*)ht|3su9n7j|%CsIJ}z3*K6sV!UYlzRAjD^$SRu*tlUc=TogKx3$TgNkNqy zwPxCN^J1#duc>?;CbXaqb_1{plwF8J2Mr&Ar)z~yj%>Kxpl)aM7tVCG0rZT&k04)r z?T_-;lO}&3I<#*Gx`BIP&MPp7eGo>E83E^?|7DUo1=#k5Idl2lyYIPGx)b+KT%CT} zSgst`-Eb9Lf8&*q1lM1Cvz3ST?c2k|$^QYSf46&OU4p6cL;g-2c_zPp?D1(ZYRvH# z4uX74mL$m(#BJRm$HB#Np^7LuSap}m_mk~9CAfj5Ce_g-?;lzWO}ZhLYuQvS4y)Dr zK(4+{Y5$&0eJ((}*+ou=YaN||Rcutsb8y8#wlmgR+IfUiQR^@5jeb0}1 z*#p1&E&Kci`u6P&vmT!gV$y}bkxqvW^qEgO%#wK5p-2%^^1)5tjGSqjReve%jk&F*vI;h(E-*$ zMIAdn;$b$ckMI~XFgQk6T=G4@F+_Ywd(wm{uwwa2ULV^{XE?AP-n;gOD;0x;1`6*l zn7=sB`}eduX!K3J*dn8W%8TWQj{>~EA%`b#Fh-ByzvsWTkkdFJ_d5*)c^+bp z5ccuJSj6XKrf7m^IT1BBXDlY&JOyUW{6oGi-ammEGf|K8T(vL%8?TYl3f3nq!+H0M zx$#0+!KM#L=TSCS7Bnw7?=oc^vCfOn&xPMTF^wy;;NB-1Q!`LOoQ3|U^8T$tnDHLK zf z1*fwygB)H|aO~BMJi^!v!;c&aOIE!BYqq=xm$I=yLw4(gDN5f(80{Jhea>w^^8KHn zz-K!Sf`99JWd8U5L-nw-c00VX`vcg~P-D~|(Y`O7-~AZa(^w0)t$P{7>AhcMI8I`? zD0q0=JMiAVP5k=gPD9|FF2mt{7RJxm@-`d_n~eJU1`cWt<(gM@VBP~mXH?)9o__@@ zD~G}Jb6)26#GvvSr~vp; z%BuDmcyF2XedbZoy9e+hQ!rFmR4Ak-JTtPDuFB|#BC0C3B}YWVJ|$Kmz8ALZ-fSY6%wBsjb4aQ;A^*uDf-F=aCYCD=_~3sT=#93M1S1gME$l@Y0_5VQt+mgD0OCHH5zXEFbdTkWZv|p-K$vp3Yanc ztFVi;xopLwa0r@U&4Jy#&N1!!z_ILu?b{W%fpJXX?^yQ=!HsVYTYls+gxmw80HG(C z$dXM6=X)fRs#$1C3!Y#0o#v5+?q_`g=8qXkwvd0L!l7rSmeE3MD;0#&M&7bIA0_CX z-4C0)e-l{p>j>s~1EL=^*cMUMQs+)A-+}l?0`$1^tJc8NJD0=FA3e`KX3y5`VN8cO zEFQ-~=T61tFmKOl*xgVI=XO5|I^~j1o9nA#VfA|WQ%w{q*EKc3!hP#`86GZ(@a1kt zK{502&+J?Qc;LbpyB!Hd0rjYSpNUA3s2)U^^u3c@4yl|C^Bx?PwdRy-k>c}Inv_N#~a^+qX)XYYl|f$c8#K^QsAw4=cp z#Xea6_{^u^Z7ER(PQ3QgB9pAG$v^$C4%LkZU_tddevQjI2zb=V`8__(kNv!7!#u9w zZCka0&v!c93upV{Qm(+L*gsuA7nZR0hnIDO-jQFUfI0D znan#1fyAYuK0S|OOG20A>$}W}Xot#DIdqJY`Ss;r#(y`PC->`lwDK9lcT4#@8dNAT zAHCA$DB(@E|ykzs-rkwYg=r>C8Y}$g9gE9g>%o2SuU#uyU>z;~U)}d4czgLeODmrZ0P@xb$Y1j?y?xt!GHd*J zd-#k>c+b5*VdHl@_bB)qcX8pC%V?RzZtO4r=GXYT=}e}$(NfZ4W!=|j4b;y>(R&5- z%@d*)W~Whkaj6UEtd}u9ajp6uEs(;GBGX8=ah_PbHk!V zi{RYz#*z0fykI;xAOe={-vVEFcd8W^{-N_nj=Ts?WJ-Ja%17bp9m`?*5f{QaEP18F z0p?N9T{;8asoubU_iWQ1{yg#~zRo;y(cN6JTd^?t$)hi2$*cZGd;D`6pLzR^{5<>U zw!Pr#W3I^G_ua)42h-UmMIvC8cTcJNzT;X{TU?{v%M_$<%AHp_eK*+myz79*1QTbN zffsN$Q)pB;RJ5h5-n6t0E%azl9OlLh$EtmYw#tsKG$3Q%RbRuVS`M=6oqy~Q`n>K( z!#8@4g1LJ>gy-1&w_EFWFuuoUU<3DLy9NfAbzxq2DEFRMt(pl9hazt~meoTK z{BK<<^9oD>W}S~}+Z&eEY=IxFekT7wzR_zGr;p26xTHiumR&q)L8c*x*}}KeSk(=x zD7d=t`Wlo_!%6Q0r*|2fDg}IVi3pj;@||E`tAeqgIqU8xVYy?C}T@VPqOxy)DjSGi44fsdyard*jjNtOKcSaS)ZhQWRF}* z2dAO&ZSzw;{KQfiV^9-VZZkls6h;Bp-EbwJPve|aY@b9pVf69*9@U;U335%fMYi!y zR$c__MvmBSru*|0f3L8fE%D%bEQc`K$g!$!Cp^0K9oSS~#ZUGuVq^7(oy*|2+tlph zW_BMvXP-75pKU8XWn%IkwC-pFyf_I8sSLdUgg zxZ*MQiw<0r^m5O2;D7A-@82HK{;rVZRn#uju5}Ltmftj<(6d!Y{PKUDQTE)vElda; zzoL?W#Ok9teo+ryR_up5`kp*#A{;nyfGr{Q@OgPgC_p3N5Yysrv*9zT`0p71}X46xc-g`Om9axsk`KM~l?f z*24eXb~}l!b?Xv1`|PvfZwUsn`R0>HT?(H>Xk8RNIyHe~12t2NwX4|j3GRPh&gOk$ zL;aa7>nfkTAs?#~VNogJIxems;(L!(wdla;T&mHT%+|E4s%tbnCVlgFaz-K4 zJh9!x`WsihX0gjwnpW)}3s6aLz4ns|2LQ9te*Q!j5`5u(?0J_Mdwx-2@n!zmk3Yy2 z8tct;9AOi^(>sE10HL;1Vp~*Re4P&yL#SA`BXRImKs*^l&iv~9qY=UlBo9b0S>RHT zu6Vdz(@y7MxQ->RuFcWGv%AE*x~>BS?CCg{kB+lQX+6J5mo6)|tEG+6f5P7)$N}G_ zmtMn_7vDO%o(VF3qw+=`c@;dygdg`u%TN2Kxx?w?wb#+w;ck_cL*cS3zQ*t2POF(S zpX3ULr*5DU%W(Y-S23mT$@r+@3Wtf~7yEU*q6bKK&hzR%xCR*KsS^sk}F zt5&UosrUacy!`SjOt`AFy8#RuH~_|t8w;0Rb}4-GTUYWqxC}4-@dX$rKhGrA$E&;z4UI5m z$`p8D+H_JuAji{3Yu3Q+Q|^EVANn=-(k;(d1KfMxeela){)%VgZP3)z1h2pT2E6&^ zTX5dF=fZ8b{WnYEwNAv3I44cM6@L5Mhrtg5DY>J22fb!|2VX$IcYpc(kPhwme|S_`Ped z=Pw=j0*0_H4O_Nsfm?t46L{vCXRTgQ2UO%)vuDGSrAuJO^l41!?XLvx+_ej?yY6~6 z6?hH&fwJ;y^rVXz3N&VXQ3>#!-ud$vkvIt zY4pfct|9-9TgkhyvUp|P^XikA6lY?&Y-sbq?%liLrvLapEMB}AK1qO4z`ghV44!`a z8OQ>wR=p2D_^%(refQl9ojY|h?xSaa=)s4$^7LICUe&Z2_vLpu$($`;zDmK5ihCCe;mxB~qwlw* zv#N2Pe!cY9B{+XGaUOgX=>15E2()T;`t|7j; zvgSft{Ie>kaOk;s5{oI_3v*uPo=#Wb(Yb@+%;l7r2Ye-O))Ub|?ZOk|I`bLC7R6f_ zZSgWadfvX|L3iRigxS)v5PI7Mpc;9ksh@9+5S`;ZEJr8WGU+4H<|3;8r*h7&4|;`i|T-#^KhZ(0(Nuf2Qe!`-`d=>k9e zuOBd>IsrPd&={2+!~gs5|0VqSz4wgzsH8Jz&4ycs56@?&>+0&@b>^L2fOY%y?E@V< zbQA}Cz~Di623KX1QwE0Rs8~O} zYbsku)-&9G(uB3%%^xAOmeAz+)PjKWd&6)?8<1WJ6KEXVDs%1 zXd5{`o^V-*?b~<23opJ%-WxM!4E*@kNpSe#@tIQn`t^h3jyn!cJ@pj$-uJF&ieC*a z1rI;+2w6U8@E~~L|9+|Pg=@~ZT@-m9JMMfw_toLW7yk%1Tz_5u)R8@V_Q0AoYrzJc zI(LQ%Kl&k@amMM;rcIl?;^TLmpHKJPrn7k|Caa$3N8xPBD+em~4L4rR*GnVFE(`e5 zK5pv3cWqIz%w0}y+;NZ^=CjWT7>?^pX80oh{I}v{oO&RAdbeZaOwS{@BA`NE!?lOq zIxWzT)NxIjfxqwS0$hhZ<|^}M2cYU^F~`=RLLo$1nmo{AFS0R#HOvBw@`ZP%(* zD;Rs;xzJLuWy@Alc~P-&1BnYpjT#Au4;f;VA8I@Vn>WX&5n{h>^ZvsR9|E8K?B^gW z*g`P*w@B>Rl{ZYl5a#Qv>#v1_i9`2IG!-h@la_9vU~|*cX$OvbSs>;hFv^Mdf$hWA zQeaEq3?4j$hm9^6G-wdC6x7tvbMhWNdL+K~SXNfX>rt?GZx#4J&z?P@Teq%|1$42? zqEK-#s86(l{1w$A1U1wQQc_oEk^#})XLbk*FKKAgX+VIinvnMIcDmzWwQiAlv!&J5 zgyLd)H476wN#NQMRVdhYPvNEj`wp=PFm$dvK=WT(S_(d38<#ZTFY30oVcr`HQ{c1f zEBcNxq)}n2y?VFhWi(b~*Pqo5l;1Y*o2LIR4-SgqjIJFga(sNjb~`MbtCsNqXI8nxX{`5gAYF7NAT)^`=opI>Iokgr1d}mx(AG}1LZD4kfMEh z&=tt;$&zD?EMc^`vS*yBsRUSSr=x45r>4@1=;o%C3sMh(KOAwyP|_=5GHmwj$N82- z3UJwGDqFH?DZr&6T*9K@7gO)&JI5%%IqkIRGuT|$Oy+g(-kpD18Uo9Ac6^i|3xR50 z+0ea^ditbGnPjyC7$Ku3{!8r zeG1+%lQ3QB!c_ zk(GQyO7nqRJj}F@+Z2bSGPttI%`w}ybK@Jniu!VYMPGd-*HurRLbz&DuVSY0zU~B^ zITppSu~BRr?BOy&ais*YIyRgr{FIu z{sJux7hZ4y%$V_@5z6CktEU(bxDE1z6Gp+n0R#93leuj92>GKj%Xq91X0Ow}Ug(C< zqeQ;vo{v#yPSINkY3z_vX($XapMhom8xp@wBa>Bjsh)<0j?fS%?wZHzhY7!m1F}LP zk03puKwosxMez9JPw=gXI-vJ`_Sxt7=i`P!g9gG^zWgP4^s$-7Jyg;)Yu50O51e+| zX>juAPKM@(_<4nn8sdJ^lhx19atV=s$5gp=Yr!!+{m-?;6p}VH{C?8>81fpTz%`CS3pHYIW#}$`3iT936t(q zK677vTdF5#oozTx3Ns#J#&_K&g04`<0CsGTmkamruY-#({ZClCZj*)E(D7R?2aPjR zd42LX<^(bzl4tJxaD*d-70W+_S+neCguB2MoKsLlKNz<)Zz;g-g5UYh)qJDGCkeWD z?*>z*+-BY6p9E->?!4m;IOdpR;I9edc`je^A)Ahz0OQA<%|8nlFJTHO4wYBuaADrB zQkdfUYu9e#N@)+SL%3z~&)GC1O8iw+l)=?k{yPllPmQT-zL}Kb3BAf(AS+|sUgjmx zK5`%rypN)vzRBO@`FH$FhGLbuzrH{I-ZkHaGM174@Bg{YntlFjz=#ne;NgdV3zuDX z1$_A7hu-b*g@@_WAAn<9M0x4e0-t$UG z)7`^IR5yfIQ_M2H^NAEjf(#& z!-=?FowpE%vwKMMIaU`9gZM1~Jsj36XFQy9_Q{-ob(S9FJt5XZUeC_eL#SnZy!z_G zJnoSrkAkxDGJX#gZyvjc-+1rjQ=&Jf)-hgp?AXJ{W+(f6{o=21YRKcdwVQd}BPs{y zX&^7JF+3|)tmgMdFdF6M_Vs^vW+Ak+0QXkPmRvfr(q!}DZ++{V@W{iz;pa}fHZ$Ow zYIn9)`_&6C_*g>kK?4WE(@#CgjSQZyVT%;7550T$h6~1zhdIwb+d|5VKzkedq(nQ^ z?yt+&-?n2HOq}#HCWu|w_#X{3XFt!C4*^5%U)=vNFRvVaI19gj#=W`BP3)6Y7%-p@ zv}H;%U_kG@;g~ghPDGz66kab{yo@Q#D0uGqc`#|x&-uOKl|$gcU;mydLPQ4@Z|ePz za3g@Y?znRr3&S^qzU+j`E7wDONC#o+)JM32qVd46|BgGR@%A_llaVg_aWXR)ix)42 z*|Q=ZQP~k6D(?})2XiX-PyHRoGvfFo84nxbf7x$t#VA$4>6<}l5qX)e%jQCm#7A{%>6-=S<`9AafT;|D60es>( zcRPRFS#Zk9k;l8~#>-*Koe%K)=y6AJPZD{n%6UWByq1NE(w{>{NkQe2Wv8<8aPD#O z9)1firNhO{tD&f#eb&ibdC+S@4&V0e=nt33lEQg{Xs(%G6S(_;Zklq z(BtY*A@L+a?3iw(#6oW>Nd9RkWbLO|cgZT^Y)N$rqdU8%*3`Xz+S3el>{L13imq+n zg{0Ps^Osq(3BF4(lz9xbQFL>F^IZ&OQIT(F9u^e==V)SXi^3^yWeS_ ziqaPAqX(VMLisDN`YNxpcFiWZ|NcjSo)`pt%tZU_&s@jqgD0+46cUWZ|E8Y@s{-g# z+dYpHzkNX-YX8)niFL{F``MIIcZ-cvgK`EfOA<)9zBzrqv8A(!)sJf z^qv^H3U7=_sLIMH`Guh(dT*P-1Phm99_kBvf00-8lE?#o7Bi(=m-Ci#O-w{#f(iS8 z(*ZO{NE<_D;a%|_8ia=)`aMsiVQ7tti*?bMt;o;sbpwyy_DD`wL?`Ig|MUBI=0j-T zr=UBzFrokY?_$$_h-CvIkmz#V?D0q;0;b)n$qo8*0)&vv9+YyWC`B`%XM1XG8ev+fUKY!ObidvBSpy~bw-U! z-CasV*(MVd*TMtK%3+@f=osSPwY3MJW`8Z`BLw?%LdC-Hm{LZ(S5DlE+muRlO-@Bg zRKHwVCi0b=Y)>_!zq5Y7I8vv=XeI*bEL+lI622V?iS~sZ$C6HoL+M`%eAO^}OEFgQ zFVWsL4yqs(5-kWU0R+U;aMO0x^yP_u0!gVjy?uJHKQmd9?X~4`clR|&Y;WEX?eww; zP=SlwL!TYuKreLE2*D-<{_{VzMtXB2hLGAiC)Z2HWGfF+v~F8(-_3{l48TE+{so%x zOQK0Bk?k4isZlqiN&ec^Q{0uW)mlYrr4S0Srm-bW&PGxY`@z5|N@goF;PA_U%ipmO z`6uvV(bf4)XF$}XooYO6qZwL%1r{ohqTH-S_bB#HVZLS>piGc^+|7Qg#xmW=+cE1k zLrC*v^=Xg|tJ+2{4{KFbcz ztnVj9%849>C@uwla{}3ZCl7k_fjM2E!{%h4?myf#ANI9Af7P%FaeAOVM+o#(#@{FT zP>dpG z>ZUJB0&v@T9a}nqHs^j}qIk%y&H1-q%b0rHR_~MSk?5R=j|WNu+P8{tUBuHFvNUxA z#aO7dY&+rt3m*4cz7Ob6l5SNL7!CZG$i@@^En+km{&P_~W_N8hEDXJsIw}?4g?PKr z@+&S+XGc-E##!f>JtRkmo}F9zmXkfWgzp7s}HR&x7qj8h~5e(ukst zSMcC^nLMuNZ)Ej$5!OJ8a;RrQjf0&RdQM5#rLI*Pfuo(C8xY@a*-4HmWD4|ML7|9F zS*Q>|^8DDQ3g$gMmX~K&vf#=O7Qm&J>AjHIn_WA1!lv~b`JV^{2vZ5<)-7AX#hU;; z2yY{!v60iM<+PBd*(PvciD386T{&I>w&S0GX=t?6i~;NKtEwhxsY(u`P%tO8iu-^{v|{Np zreFtQ!5eRKWx&rirWh!&$R!FsDh&cEBHqJof%y5$(&fBdt|OqKA^r;vs0iy;f5a)j z{l;7Q_mzcW$@sT3fyMGjF~eN@My01q-~BUFlsZ_MqrZo>ug$eVeE1Oxhu53eZ{U0* zRP%eaaFF$RU)4TNvzjY+VDOFC$af>F`{%b8^LqFZbfWQU;7W#yi!}D^+|BVKf2)?R z;B6Pbv4Ha^+F)J$H1M`td0p)Hc8;fxf8J+pQK_-rJ8vw=^<^K&Pd#@Z&;xeW-?<|m z(LN-~)6%z>>oKLhRjZqR^n+U}irYZ)T+41ZDAlI@rXG^S);~Sn2to_ZWE&W_e1GLC z_|&kW(7Ln~I&|m=ZA#m~pBBHv|9IM3Cb(F0{n~Y~zov!@Jt{mNGrNB6TCRkscwM@7 zVMbs%7tE?Xd!TdIu3ULune!s2g1=G7u?-$bfCm$F?a>`RT=_mP-@x!A9&C?gc>nzs ze}RsjJ3(1_Ij6bcwKo`^F8nusu>RWBYhlo*hQMA%^AKyZj45@;&YfZTdrLX5s0@e; z@gvXJH}u%3L>tzw=R7P~{4Q4z|DWhcW!i;kc7d;C(1>*N!Xm+7DLe6#M{m=-d&~f+>L^S!&7) zbuWtwyTF{8o7WN49cqB0#xQ#6Jeu#=!L>U`SIekW{f>W`!LEyTngo`guMUks1O>O2 zds=`st5-7*vV|+v;ln<~Puf6X?9sC)^y$}^E6pzU88~<#|7-Wcz*IA##y0p7P+U^X z6}P=~kUJ{g0M-`k$>D5oh8sWVjga0DMq6%&iiH9lo!u1C?9Y?~m9%%iKKvVb!}d64 z_~$|q2hzcE#EtC{gm*_=sGNv;Om?8$MgoYjf0<-3Q%CMZ4>$~%vIyqC;I+>Rpe1AaV?h>aKWw(Q*{ zT)EnDLk6&jg}8W){T_N$C9Ge)hT}%XT`>1`-nR1CPxEkj`MdA&dY!s<=3f52x8LRC zfqm%5c)<{P$CmAk)~9$|tL^6soJ=9=!=R`{xy#B zMqI)BHQU3%6^)n@1Ygh@dD0le1fjw+;>F{@r*Xt?uB6GzOCVqif#q}xevcinU7sCq(4SgkkSokU@6yIgd{B+s94d1 z73b!Rkiey_+@?GtIaFF+$~}*}7nEN}1~CHmzPm@UIfPjM6&upzXAx%Pz-21jqZp5e zT~29PQeRX_;?7Tcn^@$$c|TL&wflF49b1<}yW%zmF@M2M>#No9JFT~uF{OuC?9+H0 z8z$ZO_$rY}JD!Jy9_m<#0>$mk9{7((b16~UXF%6YZ@lDovEop!M2}a}8fqJDAo-y0 z=>6W`cn}UAWJ#=c#idZwct9c$lGiSl{D(en1E3F!t&Lw~;7$xsKq*lAC?qt*F~*ie zJF2Iyzh+g6z_To(VLpramv0YrFOwb8^||nfARya?IZi?g=6KX>BUFe{rKb_m9m+K9 zZ>)zdCFM}mp#&AUp1Wjq zCq&-~EVYw^Fp&JMdCrnK2Ld}Ah|4m)^H-en=BUT1V_ec_EUtl2(ESS z_+Py=4JR@^@$H9I)C{e-{Wt*4fZ6M**M)f+83K|QwI*dMZ1F=@KKyF=MyF{KuPVqg zV7mtHaJv+jLrKsodK;-*o3>EJ!sw>3kVoUgpb1Hek_G~=8mjFF3ol`UdK5NNCY>;a z5bHJ5j+E-TL*-kP#x+&pkpsH)Pe`X=>n~jvLLBI3rx}BgguvV7$nBEL(t+$)K>XXLqoRWu7|M!6 zV-GTlO{laD67ZRZMONbMU=Khc#hpT4H5HN8quI5)tSgP*$9P z#1I1Q$6OHmTOq#kJ^u_smZzom#y0j;p9AZiv~ojBZ)m9zTH6&$*L6DMqLXK@$5-CtD-sgW!XG0mNzst!A7RM zhn2Kty4lWb9fq{4-FdJE_B7P8u)3|G^$}`c2sI|-K`V3z7G<}RTg52@diRl@lMEq= zhjeq$>>ey?lO0_BiNV$*`?E?j2FXfHV^a-P_P-dSQVBhA>b28BIx`&8!{wsg2lhix zrnr>y@|rdUMyPLUgbj6j0N099i942*SxLH?3$#}5{i8__s1TKx4ToKc{V}HFf>w;A zfIms>)4za_O%w|;9u$4uaH>Wglyd4$db%pO$HE-Nkla_ z-oAOW^SwKF?#!7jM-YVB*rEvt0>H%J@xUiLlm-RB1b_id0Dl-v044xT0Wbkz022g& z0Zagx0${>0;7{*L~#@_U|qo+OO{a3Sgpt zz&YjzZZJ5~&O+wxM6fue{|ReCXl-l~9CUXRVADwc4x1LjBm!sj)~T1#rxx zquhD{7{CB71UM&R)@=hAz-j@9p6Rac|0cflG4+0Y4sg!ZcS*ef3}BUjYg~Ox0+xuF z_0a$ZaDQ>Y{%W*dre1%1@`xwqGeTEs4{NGCee-RRZH6g;=jxX7;{sp+7Y7{s`b}^* z?GLWCKx8T4n)L!OfSUkb5|;wId_s?o=9XGcEz_J^9~}!g_TGKdPN=1ix&RDd^?)U> za#G7QHvz6)F8~8rE#Rq18~_6tz)AtnCAbR>fq$3g&@EjPx00uCC0SsUO0~o**00S7n6aWJlz?_X#uH$^LyXOc1QveKL z00S7n04DSWfB_6(00S7n1b_hyU;@AdfB_6(00S7n00uAtU;@AdfMvojKYilKr~Xsl zvwvrwce@MfT&q2-0zN#v&VEV zXCZ^smB9kw+M}FO?Hv=Z6?n$&NPns0M6(~{UJWEi0V4pGidQK4$(GJ+}vDMVprT_mLmT-0r zcz174%{H?U0G~VeGJqR=?`{F-453QJGa0#{v;)?d<|e1T0o)jH&gO+uk$*EP0I*9+ zzz<-ffHiigoclxo1DGpt;|`Vcd{R5$oDBv}VS+gTHwK)8W$AJ@Cb9BXKrx90U?;gQ zH+DTNfSpK+UX4GP0OmRHP=I?{i3Q*e081Z?#Zt=Y;-4dHY44bg{Qy=DSn{eMv8|BJ z47%z8;0l0`1mLh6sqV2NR)6+?1K7xZV1JUHhKwMiWaP+MA1slFI(8W?fQ_ZpX?+63 zXeo7;&P><-KLfZDVCmE+bMbDWgyvQN=WgR$@<^{lR!9I3l2+DtERWT9q8dktkXBY# zUT6SU1T1}3ATPA*=GH%+mE82(p_10000 Date: Tue, 19 May 2026 13:42:52 +0000 Subject: [PATCH 002/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 45ca1240d..bd2ce703f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Docs +* đŸ± Update sponsors: TalorData image. PR [#15562](https://github.com/fastapi/fastapi/pull/15562) by [@tiangolo](https://github.com/tiangolo). * 📝 Update docs, simplify usage of admonitions, only default ones. PR [#15553](https://github.com/fastapi/fastapi/pull/15553) by [@tiangolo](https://github.com/tiangolo). * 📝 Fix image URLs in `index.md`. PR [#15534](https://github.com/fastapi/fastapi/pull/15534) by [@YuriiMotov](https://github.com/YuriiMotov). * ✏ Fix Azkaban spelling typo in `virtual-environments.md‎`. PR [#15463](https://github.com/fastapi/fastapi/pull/15463) by [@isaacbernat](https://github.com/isaacbernat). From 31ced9d49e253f1cdc78ab56a314ef1ad7d8d7ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 19 May 2026 19:40:41 +0200 Subject: [PATCH 003/290] =?UTF-8?q?=F0=9F=94=A7=20Migrate=20docs=20from=20?= =?UTF-8?q?MkDocs=20to=20Zensical=20(#15563)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build-docs.yml | 20 +- .gitignore | 1 + docs/de/docs/index.md | 5 + docs/de/mkdocs.yml | 1 - docs/en/docs/contributing.md | 6 +- docs/en/docs/external-links.md | 5 + docs/en/docs/fastapi-people.md | 10 + docs/en/docs/index.md | 5 + docs/en/mkdocs.env.yml | 5 - docs/en/mkdocs.yml | 72 +++---- docs/en/overrides/partials/copyright.html | 4 +- docs/es/docs/index.md | 5 + docs/es/mkdocs.yml | 1 - docs/fr/docs/index.md | 5 + docs/fr/mkdocs.yml | 1 - docs/ja/docs/index.md | 5 + docs/ja/mkdocs.yml | 1 - docs/ko/docs/index.md | 5 + docs/ko/mkdocs.yml | 1 - docs/pt/docs/index.md | 5 + docs/pt/mkdocs.yml | 1 - docs/ru/docs/index.md | 5 + docs/ru/mkdocs.yml | 1 - docs/tr/docs/index.md | 5 + docs/tr/mkdocs.yml | 1 - docs/uk/docs/index.md | 5 + docs/uk/mkdocs.yml | 1 - docs/zh-hant/docs/index.md | 5 + docs/zh-hant/mkdocs.yml | 1 - docs/zh/docs/index.md | 5 + docs/zh/mkdocs.yml | 1 - pyproject.toml | 8 +- scripts/docs.py | 228 ++++++++++++++++------ scripts/mkdocs_hooks.py | 182 ----------------- uv.lock | 186 +++++------------- 35 files changed, 339 insertions(+), 459 deletions(-) delete mode 100644 docs/de/mkdocs.yml delete mode 100644 docs/en/mkdocs.env.yml delete mode 100644 docs/es/mkdocs.yml delete mode 100644 docs/fr/mkdocs.yml delete mode 100644 docs/ja/mkdocs.yml delete mode 100644 docs/ko/mkdocs.yml delete mode 100644 docs/pt/mkdocs.yml delete mode 100644 docs/ru/mkdocs.yml delete mode 100644 docs/tr/mkdocs.yml delete mode 100644 docs/uk/mkdocs.yml delete mode 100644 docs/zh-hant/mkdocs.yml delete mode 100644 docs/zh/mkdocs.yml delete mode 100644 scripts/mkdocs_hooks.py diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index d8e5d9e94..f30ea3bef 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -34,14 +34,13 @@ jobs: - docs_src/** - pyproject.toml - uv.lock - - mkdocs.yml - - mkdocs.env.yml - .github/workflows/build-docs.yml - .github/workflows/deploy-docs.yml - - scripts/mkdocs_hooks.py + - scripts/docs.py langs: needs: - changes + if: ${{ needs.changes.outputs.docs == 'true' }} runs-on: ubuntu-latest outputs: langs: ${{ steps.show-langs.outputs.langs }} @@ -103,21 +102,28 @@ jobs: run: uv run ./scripts/docs.py update-languages - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 with: - key: mkdocs-cards-${{ matrix.lang }}-${{ github.ref }} - path: docs/${{ matrix.lang }}/.cache + key: zensical-${{ matrix.lang }}-${{ github.ref }} + path: site_zensical_src/${{ matrix.lang }}/.cache - name: Build Docs run: | # zizmor: ignore[template-injection] - comes from trusted source uv run ./scripts/docs.py build-lang ${{ matrix.lang }} - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: docs-site-${{ matrix.lang }} - path: ./site/** + # English owns root static assets. Translated pages reference /img, /css, + # and /js, so omit duplicated language-local copies from artifacts. + path: | + ./site/** + !./site/${{ matrix.lang }}/img/** + !./site/${{ matrix.lang }}/css/** + !./site/${{ matrix.lang }}/js/** include-hidden-files: true # https://github.com/marketplace/actions/alls-green#why docs-all-green: # This job does nothing and is only used for the branch protection if: always() needs: + - langs - build-docs runs-on: ubuntu-latest steps: @@ -125,4 +131,4 @@ jobs: uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2 with: jobs: ${{ toJSON(needs) }} - allowed-skips: build-docs + allowed-skips: langs, build-docs diff --git a/.gitignore b/.gitignore index 243cdb93a..2c0d859ad 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ __pycache__ htmlcov dist site +site_zensical_src .coverage* coverage.xml .netlify diff --git a/docs/de/docs/index.md b/docs/de/docs/index.md index c71391432..d557554a1 100644 --- a/docs/de/docs/index.md +++ b/docs/de/docs/index.md @@ -1,3 +1,8 @@ +--- +include_yaml: + sponsors: data/sponsors.yml +--- + # FastAPI { #fastapi } + +

+ FastAPI +

+

+ FastAPI à€«à€Œà„à€°à„‡à€źà€”à€°à„à€•, à€‰à€šà„à€š à€Șà„à€°à€Šà€°à„à€¶à€š, à€žà„€à€–à€šà„‡ à€źà„‡à€‚ à€†à€žà€Ÿà€š, à€•à„‹à€Ą à€Čà€żà€–à€šà„‡ à€źà„‡à€‚ à€€à„‡à€œà€Œ, à€Șà„à€°à„‹à€Ąà€•à„à€¶à€š à€•à„‡ à€Čà€żà€ à€€à„ˆà€Żà€Ÿà€° +

+

+ + à€Ÿà„‡à€žà„à€Ÿ + + + à€•à€”à€°à„‡à€œ + + + à€Șà„ˆà€•à„‡à€œ à€žà€‚à€žà„à€•à€°à€Ł + + + à€žà€źà€°à„à€„à€żà€€ Python à€žà€‚à€žà„à€•à€°à€Ł + +

+ +--- + +**à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œ**: [https://fastapi.tiangolo.com](https://fastapi.tiangolo.com/hi) + +**à€žà„à€°à„‹à€€ à€•à„‹à€Ą**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi) + +--- + +FastAPI à€à€• à€†à€§à„à€šà€żà€•, à€€à„‡à€œà€Œ (à€‰à€šà„à€š-à€Șà„à€°à€Šà€°à„à€¶à€š) à€”à„‡à€Ź à€«à€Œà„à€°à„‡à€źà€”à€°à„à€• à€čà„ˆ à€œà„‹ à€źà€Ÿà€šà€• Python type hints à€•à„‡ à€†à€§à€Ÿà€° à€Șà€° Python à€žà„‡ APIs à€Źà€šà€Ÿà€šà„‡ à€•à„‡ à€Čà€żà€ à€čà„ˆà„€ + +à€źà„à€–à„à€Ż à€”à€żà€¶à„‡à€·à€€à€Ÿà€à€: + +* **à€€à„‡à€œà€Œ**: à€Źà€čà„à€€ à€‰à€šà„à€š à€Șà„à€°à€Šà€°à„à€¶à€š, **NodeJS** à€”à€° **Go** à€•à„‡ à€žà€źà€•à€•à„à€· (Starlette à€”à€° Pydantic à€•à„€ à€Źà€Šà„Œà€Čà€€)à„€ [à€‰à€Șà€Čà€Źà„à€§ à€žà€Źà€žà„‡ à€€à„‡à€œà€Œ Python à€«à€Œà„à€°à„‡à€źà€”à€°à„à€•à„à€ž à€źà„‡à€‚ à€žà„‡ à€à€•](#performance)à„€ +* **à€•à„‹à€Ą à€Čà€żà€–à€šà„‡ à€źà„‡à€‚ à€€à„‡à€œà€Œ**: à€«à€Œà„€à€šà€°à„à€ž à€”à€żà€•à€žà€żà€€ à€•à€°à€šà„‡ à€•à„€ à€—à€€à€ż à€Čà€—à€­à€— 200% à€žà„‡ 300% à€€à€• à€Źà€ąà€Œà€Ÿà€à€à„€ * +* **à€•à€ź à€Źà€—à„à€ž**: à€źà€Ÿà€šà€”à„€à€Ż (à€Ąà„‡à€”à€Čà€Șà€°) à€€à„à€°à„à€Ÿà€żà€Żà„‹à€‚ à€źà„‡à€‚ à€Čà€—à€­à€— 40% à€•à„€ à€•à€źà„€à„€ * +* **à€žà€čà€œ**: à€Źà„‡à€čà€€à€°à„€à€š à€à€Ąà€żà€Ÿà€° à€žà€Șà„‹à€°à„à€Ÿà„€ à€čà€° à€œà€—à€č à€‘à€Ÿà„‹-à€•à€źà„à€Șà„à€Čà„€à€Ÿà„€ à€Ąà€żà€Źà€—à€żà€‚à€— à€źà„‡à€‚ à€•à€ź à€žà€źà€Żà„€ +* **à€†à€žà€Ÿà€š**: à€‡à€žà„à€€à„‡à€źà€Ÿà€Č à€”à€° à€žà„€à€–à€šà„‡ à€źà„‡à€‚ à€†à€žà€Ÿà€šà„€ à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œ à€Șà€ąà€Œà€šà„‡ à€źà„‡à€‚ à€•à€ź à€žà€źà€Żà„€ +* **à€žà€‚à€•à„à€·à€żà€Șà„à€€**: à€•à„‹à€Ą à€Ąà„à€Șà„à€Čà„€à€•à„‡à€¶à€š à€•à„‹ à€šà„à€Żà„‚à€šà€€à€ź à€•à€°à„‡à€‚à„€ à€Șà„à€°à€€à„à€Żà„‡à€• parameter declaration à€žà„‡ à€•à€ˆ à€«à€Œà„€à€šà€°à„à€žà„€ à€•à€ź à€Źà€—à„à€žà„€ +* **à€źà€œà€Źà„‚à€€**: à€Șà„à€°à„‹à€Ąà€•à„à€¶à€š-à€°à„‡à€Ąà„€ à€•à„‹à€Ą à€Șà„à€°à€Ÿà€Șà„à€€ à€•à€°à„‡à€‚à„€ à€žà„à€”à€€à€ƒ à€‡à€‚à€Ÿà€°à„ˆà€•à„à€Ÿà€żà€” à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œà„€à€•à€°à€Ł à€•à„‡ à€žà€Ÿà€„à„€ +* **à€źà€Ÿà€šà€•à„‹à€‚ à€Șà€° à€†à€§à€Ÿà€°à€żà€€**: APIs à€•à„‡ à€–à„à€Čà„‡ à€źà€Ÿà€šà€•à„‹à€‚ à€Șà€° à€†à€§à€Ÿà€°à€żà€€ (à€”à€° à€Șà„‚à€°à„à€Łà€€à€ƒ à€…à€šà„à€•à„‚à€Č): [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (à€œà€żà€žà„‡ à€Șà€čà€Čà„‡ Swagger à€•à€čà€Ÿ à€œà€Ÿà€€à€Ÿ à€„à€Ÿ) à€”à€° [JSON Schema](https://json-schema.org/)à„€ + +* à€†à€‚à€€à€°à€żà€• à€Ąà„‡à€”à€Čà€Șà€źà„‡à€‚à€Ÿ à€Ÿà„€à€ź à€Šà„à€”à€Ÿà€°à€Ÿ à€Șà„à€°à„‹à€Ąà€•à„à€¶à€š à€à€Șà„à€ž à€Źà€šà€Ÿà€€à„‡ à€žà€źà€Ż à€•à€żà€ à€—à€ à€Șà€°à„€à€•à„à€·à€Łà„‹à€‚ à€•à„‡ à€†à€§à€Ÿà€° à€Șà€° à€…à€šà„à€źà€Ÿà€šà„€ + +## à€Șà„à€°à€Ÿà€Żà„‹à€œà€• { #sponsors } + + + +### à€•à„€à€žà„à€Ÿà„‹à€š à€Șà„à€°à€Ÿà€Żà„‹à€œà€• { #keystone-sponsor } + +
+{% for sponsor in sponsors.keystone -%} +{{ sponsor.title }} +{% endfor -%} +
+ +### à€—à„‹à€Čà„à€Ą à€Șà„à€°à€Ÿà€Żà„‹à€œà€• { #gold-sponsors } + +
+{% for sponsor in sponsors.gold -%} +{{ sponsor.title }} +{% endfor -%} +
+ +### à€žà€żà€Čà„à€”à€° à€Șà„à€°à€Ÿà€Żà„‹à€œà€• { #silver-sponsors } + +
+{% for sponsor in sponsors.silver -%} +{{ sponsor.title }} +{% endfor %} +
+ + + +[à€…à€šà„à€Ż à€Șà„à€°à€Ÿà€Żà„‹à€œà€•](https://fastapi.tiangolo.com/hi/fastapi-people/#sponsors) + +## à€”à€żà€šà€Ÿà€° { #opinions } + + +
+
+ + + + +
+ +
+
"à€źà„ˆà€‚ à€‡à€š à€Šà€żà€šà„‹à€‚ FastAPI à€•à€Ÿ à€Źà€čà„à€€ à€‰à€Șà€Żà„‹à€— à€•à€° à€°à€čà€Ÿ/à€°à€čà„€ à€čà„‚à€à„€ à€”à€Ÿà€žà„à€€à€” à€źà„‡à€‚ à€źà„ˆà€‚ à€…à€Șà€šà„€ à€Ÿà„€à€ź à€•à„€ Microsoft à€źà„‡à€‚ ML à€žà„‡à€”à€Ÿà€“à€‚ à€•à„‡ à€Čà€żà€ à€‡à€žà„‡ à€‰à€Șà€Żà„‹à€— à€•à€°à€šà„‡ à€•à„€ à€Żà„‹à€œà€šà€Ÿ à€Źà€šà€Ÿ à€°à€čà€Ÿ/à€°à€čà„€ à€čà„‚à€à„€ à€‡à€šà€źà„‡à€‚ à€žà„‡ à€•à„à€› à€•à„‹ à€źà„à€–à„à€Ż Windows à€Șà„à€°à„‹à€Ąà€•à„à€Ÿ à€”à€° à€•à„à€› Office à€Șà„à€°à„‹à€Ąà€•à„à€Ÿà„à€ž à€źà„‡à€‚ à€‡à€‚à€Ÿà„€à€—à„à€°à„‡à€Ÿ à€•à€żà€Żà€Ÿ à€œà€Ÿ à€°à€čà€Ÿ à€čà„ˆà„€"
+
— à€•à€Źà„€à€° à€–à€Ÿà€š, Microsoft (à€žà€‚à€Šà€°à„à€­)
+
+ + + +
+ + +
+ +"_[...] à€źà„ˆà€‚ à€‡à€š à€Šà€żà€šà„‹à€‚ **FastAPI** à€•à€Ÿ à€Źà€čà„à€€ à€‰à€Șà€Żà„‹à€— à€•à€° à€°à€čà€Ÿ/à€°à€čà„€ à€čà„‚à€à„€ [...] à€”à€Ÿà€žà„à€€à€” à€źà„‡à€‚ à€źà„ˆà€‚ à€…à€Șà€šà„€ à€Ÿà„€à€ź à€•à„€ **Microsoft à€źà„‡à€‚ ML à€žà„‡à€”à€Ÿà€“à€‚** à€•à„‡ à€Čà€żà€ à€‡à€žà„‡ à€‰à€Șà€Żà„‹à€— à€•à€°à€šà„‡ à€•à„€ à€Żà„‹à€œà€šà€Ÿ à€Źà€šà€Ÿ à€°à€čà€Ÿ/à€°à€čà„€ à€čà„‚à€à„€ à€‡à€šà€źà„‡à€‚ à€žà„‡ à€•à„à€› à€•à„‹ à€źà„à€–à„à€Ż **Windows** à€Șà„à€°à„‹à€Ąà€•à„à€Ÿ à€”à€° à€•à„à€› **Office** à€Șà„à€°à„‹à€Ąà€•à„à€Ÿà„à€ž à€źà„‡à€‚ à€‡à€‚à€Ÿà„€à€—à„à€°à„‡à€Ÿ à€•à€żà€Żà€Ÿ à€œà€Ÿ à€°à€čà€Ÿ à€čà„ˆ._" + +
à€•à€Źà„€à€° à€–à€Ÿà€š - Microsoft (à€žà€‚à€Šà€°à„à€­)
+ +--- + +"_à€čà€źà€šà„‡ **FastAPI** à€Čà€Ÿà€‡à€Źà„à€°à„‡à€°à„€ à€…à€Șà€šà€Ÿà€ˆ à€€à€Ÿà€•à€ż à€à€• **REST** à€žà€°à„à€”à€° à€žà„à€Șà„‰à€š à€•à€żà€Żà€Ÿ à€œà€Ÿ à€žà€•à„‡ à€œà€żà€žà„‡ **à€…à€šà„à€źà€Ÿà€šà„‹à€‚** à€•à„‹ à€Șà„à€°à€Ÿà€Șà„à€€ à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€•à„à€”à„‡à€°à„€ à€•à€żà€Żà€Ÿ à€œà€Ÿ à€žà€•à„‡à„€ [Ludwig à€•à„‡ à€Čà€żà€]_" + +
à€Șà€żà€à€°à„‹ à€źà„‹à€Čà€żà€šà„‹, à€Żà€Ÿà€°à„‹à€žà„à€Čà€Ÿà€” à€Ąà„à€Ąà€żà€š, à€”à€° à€žà€Ÿà€ˆ à€žà„à€źà€‚à€€ à€źà€żà€°à„à€Żà€Ÿà€Čà€Ÿ - Uber (à€žà€‚à€Šà€°à„à€­)
+ +--- + +"_**Netflix** à€čà€źà€Ÿà€°à„‡ **à€žà€‚à€•à€Ÿ à€Șà„à€°à€Źà€‚à€§à€š** à€‘à€°à„à€•à„‡à€žà„à€Ÿà„à€°à„‡à€¶à€š à€«à€Œà„à€°à„‡à€źà€”à€°à„à€•: **Dispatch** à€•à„‡ à€“à€Șà€š-à€žà„‹à€°à„à€ž à€°à€żà€Čà„€à€œà€Œ à€•à„€ à€˜à„‹à€·à€Łà€Ÿ à€•à€°à€€à„‡ à€čà„à€ à€Șà„à€°à€žà€šà„à€š à€čà„ˆ! [**FastAPI** à€•à„‡ à€žà€Ÿà€„ à€Źà€šà€Ÿà€Żà€Ÿ à€—à€Żà€Ÿ]_" + +
à€•à„‡à€”à€żà€š à€—à„à€Čà€żà€žà€š, à€źà€Ÿà€°à„à€• à€”à€żà€Čà€Ÿà€šà„‹à€”à€Ÿ, à€«à„‰à€°à„‡à€žà„à€Ÿ à€źà„‰à€šà„à€žà„‡à€š - Netflix (à€žà€‚à€Šà€°à„à€­)
+ +--- + +"_à€Żà€Šà€ż à€•à„‹à€ˆ à€Șà„à€°à„‹à€Ąà€•à„à€¶à€š Python API à€Źà€šà€Ÿà€šà€Ÿ à€šà€Ÿà€čà€€à€Ÿ à€čà„ˆ, à€€à„‹ à€źà„ˆà€‚ **FastAPI** à€•à„€ à€…à€€à„à€Żà€§à€żà€• à€…à€šà„à€¶à€‚à€žà€Ÿ à€•à€°à„‚à€‚à€—à€Ÿ/à€•à€°à„‚à€‚à€—à„€à„€ à€Żà€č **à€žà„à€‚à€Šà€°à€€à€Ÿ à€žà„‡ à€Ąà€żà€œà€Œà€Ÿà€‡à€š** à€•à€żà€Żà€Ÿ à€—à€Żà€Ÿ à€čà„ˆ, **à€‰à€Șà€Żà„‹à€— à€źà„‡à€‚ à€žà€°à€Č** à€čà„ˆ à€”à€° **à€Źà„‡à€čà€Š à€žà„à€•à„‡à€Čà„‡à€Źà€Č** à€čà„ˆ, à€Żà€č à€čà€źà€Ÿà€°à„€ API-à€«à€Œà€°à„à€žà„à€Ÿ à€Ąà„‡à€”à€Čà€Șà€źà„‡à€‚à€Ÿ à€°à€Łà€šà„€à€€à€ż à€•à€Ÿ **à€źà„à€–à„à€Ż à€˜à€Ÿà€•** à€Źà€š à€—à€Żà€Ÿ à€čà„ˆ à€”à€° à€čà€źà€Ÿà€°à„‡ Virtual TAC Engineer à€œà„ˆà€žà„‡ à€•à€ˆ à€‘à€Ÿà„‹à€źà„‡à€¶à€šà„à€ž à€”à€° à€žà„‡à€”à€Ÿà€“à€‚ à€•à„‹ à€šà€Čà€Ÿ à€°à€čà€Ÿ à€čà„ˆ._" + +
à€Ąà„€à€Żà„‹à€š à€Șà€żà€Čà„à€žà€Źà€°à„€ - Cisco (à€žà€‚à€Šà€°à„à€­)
+ +--- + +
+ +## FastAPI à€•à„‰à€šà„à€«à€Œ { #fastapi-conf } + +[**FastAPI Conf '26**](https://fastapiconf.com) **28 à€…à€•à„à€Ÿà„‚à€Źà€°, 2026** à€•à„‹ **à€à€źà„à€žà„à€Ÿà€°à„à€Ąà€ź, à€šà„€à€Šà€°à€Čà„ˆà€‚à€Ąà„à€ž** à€źà„‡à€‚ à€čà„‹ à€°à€čà„€ à€čà„ˆà„€ à€žà€Ź à€•à„à€› FastAPI à€•à„‡ à€Źà€Ÿà€°à„‡ à€źà„‡à€‚, à€žà„€à€§à„‡ à€žà„à€°à„‹à€€ à€žà„‡à„€ đŸŽ€ + +FastAPI Conf '26 - 28 à€…à€•à„à€Ÿà„‚à€Źà€°, 2026 - à€à€źà„à€žà„à€Ÿà€°à„à€Ąà€ź, NL + +## FastAPI à€źà€żà€šà„€ à€Ąà„‰à€•à„à€Żà„‚à€źà„‡à€‚à€Ÿà„à€°à„€ { #fastapi-mini-documentary } + +à€žà€Ÿà€Č 2025 à€•à„‡ à€…à€‚à€€ à€źà„‡à€‚ à€à€• [FastAPI à€źà€żà€šà„€ à€Ąà„‰à€•à„à€Żà„‚à€źà„‡à€‚à€Ÿà„à€°à„€](https://www.youtube.com/watch?v=mpR8ngthqiE) à€°à€żà€Čà„€à€œà€Œ à€čà„à€ˆ, à€†à€Ș à€‡à€žà„‡ à€‘à€šà€Čà€Ÿà€‡à€š à€Šà„‡à€– à€žà€•à€€à„‡ à€čà„ˆà€‚: + +FastAPI à€źà€żà€šà„€ à€Ąà„‰à€•à„à€Żà„‚à€źà„‡à€‚à€Ÿà„à€°à„€ + +## **Typer**, CLIs à€•à€Ÿ FastAPI { #typer-the-fastapi-of-clis } + + + +à€Żà€Šà€ż à€†à€Ș à€”à„‡à€Ź API à€•à„‡ à€Źà€œà€Ÿà€Ż à€Ÿà€°à„à€źà€żà€šà€Č à€źà„‡à€‚ à€‰à€Șà€Żà„‹à€— à€čà„‹à€šà„‡ à€”à€Ÿà€Čà€Ÿ CLI à€à€Ș à€Źà€šà€Ÿ à€°à€čà„‡ à€čà„ˆà€‚, à€€à„‹ [**Typer**](https://typer.tiangolo.com/) à€Šà„‡à€–à„‡à€‚à„€ + +**Typer**, FastAPI à€•à€Ÿ à€›à„‹à€Ÿà€Ÿ à€­à€Ÿà€ˆ/à€Źà€čà€š à€čà„ˆà„€ à€”à€° à€‡à€žà€•à€Ÿ à€‰à€Šà„à€Šà„‡à€¶à„à€Ż **CLIs à€•à€Ÿ FastAPI** à€čà„‹à€šà€Ÿ à€čà„ˆà„€ ⌚ 🚀 + +## à€†à€”à€¶à„à€Żà€•à€€à€Ÿà€à€ { #requirements } + +FastAPI à€Šà€żà€—à„à€—à€œà„‹à€‚ à€•à„‡ à€•à€‚à€§à„‹à€‚ à€Șà€° à€–à€Ąà€Œà€Ÿ à€čà„ˆ: + +* à€”à„‡à€Ź à€čà€żà€žà„à€žà„‹à€‚ à€•à„‡ à€Čà€żà€ [Starlette](https://www.starlette.dev/)à„€ +* à€Ąà„‡à€Ÿà€Ÿ à€čà€żà€žà„à€žà„‹à€‚ à€•à„‡ à€Čà€żà€ [Pydantic](https://docs.pydantic.dev/)à„€ + +## à€žà„à€„à€Ÿà€Șà€šà€Ÿ { #installation } + +à€à€• [à€”à€°à„à€šà„à€…à€Č à€à€šà„à€”à€Ÿà€Żà€°à€šà€źà„‡à€‚à€Ÿ](https://fastapi.tiangolo.com/hi/virtual-environments/) à€Źà€šà€Ÿà€à€ à€”à€° à€žà€•à„à€°à€żà€Ż à€•à€°à„‡à€‚, à€”à€° à€«à€żà€° FastAPI à€žà„à€„à€Ÿà€Șà€żà€€ à€•à€°à„‡à€‚: + +
+ +```console +$ pip install "fastapi[standard]" + +---> 100% +``` + +
+ +**à€šà„‹à€Ÿ**: à€žà„à€šà€żà€¶à„à€šà€żà€€ à€•à€°à„‡à€‚ à€•à€ż à€†à€Ș à€žà€­à„€ à€Ÿà€°à„à€źà€żà€šà€Čà„‹à€‚ à€źà„‡à€‚ à€•à€Ÿà€ź à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ `"fastapi[standard]"` à€•à„‹ à€‰à€Šà„à€§à€°à€Ł-à€šà€żà€čà„à€šà„‹à€‚ à€źà„‡à€‚ à€°à€–à„‡à€‚à„€ + +## à€‰à€Šà€Ÿà€čà€°à€Ł { #example } + +### à€‡à€žà„‡ à€Źà€šà€Ÿà€à€ { #create-it } + +`main.py` à€«à€Œà€Ÿà€‡à€Č à€Źà€šà€Ÿà€à€ à€”à€° à€‡à€žà€źà„‡à€‚ à€Čà€żà€–à„‡à€‚: + +```Python +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: str | None = None): + return {"item_id": item_id, "q": q} +``` + +
+à€Żà€Ÿ async def à€•à€Ÿ à€‰à€Șà€Żà„‹à€— à€•à€°à„‡à€‚... + +à€Żà€Šà€ż à€†à€Șà€•à€Ÿ à€•à„‹à€Ą `async` / `await` à€•à€Ÿ à€‰à€Șà€Żà„‹à€— à€•à€°à€€à€Ÿ à€čà„ˆ, à€€à„‹ `async def` à€•à€Ÿ à€‰à€Șà€Żà„‹à€— à€•à€°à„‡à€‚: + +```Python hl_lines="7 12" +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +async def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +async def read_item(item_id: int, q: str | None = None): + return {"item_id": item_id, "q": q} +``` + +**à€šà„‹à€Ÿ**: + +à€Żà€Šà€ż à€†à€Ș à€šà€čà„€à€‚ à€œà€Ÿà€šà€€à„‡, à€€à„‹ _"à€œà€Čà„à€Šà„€ à€źà„‡à€‚?"_ à€žà„‡à€•à„à€¶à€š à€Šà„‡à€–à„‡à€‚: à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œ à€źà„‡à€‚ [`async` à€”à€° `await`](https://fastapi.tiangolo.com/hi/async/#in-a-hurry) à€•à„‡ à€Źà€Ÿà€°à„‡ à€źà„‡à€‚à„€ + +
+ +### à€‡à€žà„‡ à€šà€Čà€Ÿà€à€ { #run-it } + +à€žà€°à„à€”à€° à€•à„‹ à€‡à€ž à€•à€źà€Ÿà€‚à€Ą à€žà„‡ à€šà€Čà€Ÿà€à€: + +
+ +```console +$ fastapi dev + + ╭────────── FastAPI CLI - Development mode ───────────╼ + │ │ + │ Serving at: http://127.0.0.1:8000 │ + │ │ + │ API docs: http://127.0.0.1:8000/docs │ + │ │ + │ Running in development mode, for production use: │ + │ │ + │ fastapi run │ + │ │ + ╰─────────────────────────────────────────────────────╯ + +INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp'] +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +INFO: Started reloader process [2248755] using WatchFiles +INFO: Started server process [2248757] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +
+fastapi dev à€•à€źà€Ÿà€‚à€Ą à€•à„‡ à€Źà€Ÿà€°à„‡ à€źà„‡à€‚... + +`fastapi dev` à€•à€źà€Ÿà€‚à€Ą à€†à€Șà€•à€Ÿ `main.py` à€«à€Œà€Ÿà€‡à€Č à€žà„à€”à€€à€ƒ à€Șà€ąà€Œà€€à€Ÿ à€čà„ˆ, à€‰à€žà€źà„‡à€‚ **FastAPI** à€à€Ș à€•à€Ÿ à€Șà€€à€Ÿ à€Čà€—à€Ÿà€€à€Ÿ à€čà„ˆ, à€”à€° [Uvicorn](https://www.uvicorn.dev) à€•à€Ÿ à€‰à€Șà€Żà„‹à€— à€•à€°à€•à„‡ à€žà€°à„à€”à€° à€¶à„à€°à„‚ à€•à€°à€€à€Ÿ à€čà„ˆà„€ + +à€Ąà€żà€«à€Œà„‰à€Čà„à€Ÿ à€°à„‚à€Ș à€žà„‡, `fastapi dev` à€Čà„‹à€•à€Č à€Ąà„‡à€”à€Čà€Șà€źà„‡à€‚à€Ÿ à€•à„‡ à€Čà€żà€ auto-reload à€žà€•à„à€·à€ź à€•à€°à€•à„‡ à€¶à„à€°à„‚ à€čà„‹à€—à€Ÿà„€ + +à€†à€Ș à€‡à€žà€•à„‡ à€Źà€Ÿà€°à„‡ à€źà„‡à€‚ à€”à€° à€Șà€ąà€Œ à€žà€•à€€à„‡ à€čà„ˆà€‚: [FastAPI CLI à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œ](https://fastapi.tiangolo.com/hi/fastapi-cli/) à€źà„‡à€‚à„€ + +
+ +### à€‡à€žà„‡ à€œà€Ÿà€à€šà„‡à€‚ { #check-it } + +à€…à€Șà€šà„‡ à€Źà„à€°à€Ÿà€‰à€œà€Œà€° à€źà„‡à€‚ [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery) à€–à„‹à€Čà„‡à€‚à„€ + +à€†à€Șà€•à„‹ JSON à€Șà„à€°à€€à€żà€•à„à€°à€żà€Żà€Ÿ à€‡à€ž à€Șà„à€°à€•à€Ÿà€° à€Šà€żà€–à„‡à€—à„€: + +```JSON +{"item_id": 5, "q": "somequery"} +``` + +à€†à€Șà€šà„‡ à€Șà€čà€Čà„‡ à€čà„€ à€à€• API à€Źà€šà€Ÿ à€Čà„€ à€čà„ˆ à€œà„‹: + +* _paths_ `/` à€”à€° `/items/{item_id}` à€Șà€° HTTP à€…à€šà„à€°à„‹à€§ à€žà„à€”à„€à€•à€Ÿà€° à€•à€°à€€à„€ à€čà„ˆà„€ +* à€Šà„‹à€šà„‹à€‚ _paths_ `GET` operations à€Čà„‡à€€à„€ à€čà„ˆà€‚ (à€œà€żà€šà„à€čà„‡à€‚ HTTP _methods_ à€­à„€ à€•à€čà€Ÿ à€œà€Ÿà€€à€Ÿ à€čà„ˆ)à„€ +* _path_ `/items/{item_id}` à€źà„‡à€‚ à€à€• _path parameter_ `item_id` à€čà„ˆ à€œà„‹ `int` à€čà„‹à€šà€Ÿ à€šà€Ÿà€čà€żà€à„€ +* _path_ `/items/{item_id}` à€źà„‡à€‚ à€à€• à€”à„ˆà€•à€Čà„à€Șà€żà€• `str` _query parameter_ `q` à€čà„ˆà„€ + +### à€‡à€‚à€Ÿà€°à„ˆà€•à„à€Ÿà€żà€” API à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œ { #interactive-api-docs } + +à€…à€Ź [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) à€Șà€° à€œà€Ÿà€à€à„€ + +à€†à€Șà€•à„‹ à€žà„à€”à€šà€Ÿà€Čà€żà€€ à€‡à€‚à€Ÿà€°à„ˆà€•à„à€Ÿà€żà€” API à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œà„€à€•à€°à€Ł à€Šà€żà€–à„‡à€—à€Ÿ (à€œà„‹ [Swagger UI](https://github.com/swagger-api/swagger-ui) à€Šà„à€”à€Ÿà€°à€Ÿ à€Șà„à€°à€Šà€Ÿà€š à€•à€żà€Żà€Ÿ à€œà€Ÿà€€à€Ÿ à€čà„ˆ): + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +### à€”à„ˆà€•à€Čà„à€Șà€żà€• API à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œ { #alternative-api-docs } + +à€”à€° à€…à€Ź, [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) à€Șà€° à€œà€Ÿà€à€à„€ + +à€†à€Șà€•à„‹ à€”à„ˆà€•à€Čà„à€Șà€żà€• à€žà„à€”à€šà€Ÿà€Čà€żà€€ à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œà„€à€•à€°à€Ł à€Šà€żà€–à„‡à€—à€Ÿ (à€œà„‹ [ReDoc](https://github.com/Rebilly/ReDoc) à€Šà„à€”à€Ÿà€°à€Ÿ à€Șà„à€°à€Šà€Ÿà€š à€•à€żà€Żà€Ÿ à€œà€Ÿà€€à€Ÿ à€čà„ˆ): + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +## à€‰à€Šà€Ÿà€čà€°à€Ł à€‰à€šà„à€šà€Żà€š { #example-upgrade } + +à€…à€Ź `PUT` à€…à€šà„à€°à„‹à€§ à€žà„‡ body à€Șà„à€°à€Ÿà€Șà„à€€ à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ `main.py` à€«à€Œà€Ÿà€‡à€Č à€žà€‚à€¶à„‹à€§à€żà€€ à€•à€°à„‡à€‚à„€ + +Pydantic à€•à„€ à€Źà€Šà„Œà€Čà€€, body à€•à„‹ à€źà€Ÿà€šà€• Python à€Șà„à€°à€•à€Ÿà€°à„‹à€‚ à€žà„‡ à€˜à„‹à€·à€żà€€ à€•à€°à„‡à€‚à„€ + +```Python hl_lines="2 7-10 23-25" +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + + +class Item(BaseModel): + name: str + price: float + is_offer: bool | None = None + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: str | None = None): + return {"item_id": item_id, "q": q} + + +@app.put("/items/{item_id}") +def update_item(item_id: int, item: Item): + return {"item_name": item.name, "item_id": item_id} +``` + +`fastapi dev` à€žà€°à„à€”à€° à€žà„à€”à€€à€ƒ à€°à„€à€Čà„‹à€Ą à€čà„‹à€šà€Ÿ à€šà€Ÿà€čà€żà€à„€ + +### à€‡à€‚à€Ÿà€°à„ˆà€•à„à€Ÿà€żà€” API à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œ à€‰à€šà„à€šà€Żà€š { #interactive-api-docs-upgrade } + +à€…à€Ź [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) à€Șà€° à€œà€Ÿà€à€à„€ + +* à€‡à€‚à€Ÿà€°à„ˆà€•à„à€Ÿà€żà€” API à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œ à€žà„à€”à€€à€ƒ à€…à€Șà€Ąà„‡à€Ÿ à€čà„‹ à€œà€Ÿà€à€—à€Ÿ, à€šà€ body à€žà€čà€żà€€: + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) + +* "Try it out" à€Źà€Ÿà€š à€Șà€° à€•à„à€Čà€żà€• à€•à€°à„‡à€‚, à€Żà€č à€†à€Șà€•à„‹ parameters à€­à€°à€šà„‡ à€”à€° à€žà„€à€§à„‡ API à€•à„‡ à€žà€Ÿà€„ à€‡à€‚à€Ÿà€°à„‡à€•à„à€Ÿ à€•à€°à€šà„‡ à€•à„€ à€…à€šà„à€źà€€à€ż à€Šà„‡à€€à€Ÿ à€čà„ˆ: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) + +* à€«à€żà€° "Execute" à€Źà€Ÿà€š à€Șà€° à€•à„à€Čà€żà€• à€•à€°à„‡à€‚, à€Żà„‚à€œà€Œà€° à€‡à€‚à€Ÿà€°à€«à€Œà„‡à€ž à€†à€Șà€•à„€ API à€žà„‡ à€žà€‚à€”à€Ÿà€Š à€•à€°à„‡à€—à€Ÿ, parameters à€­à„‡à€œà„‡à€—à€Ÿ, à€Șà€°à€żà€Łà€Ÿà€ź à€Șà„à€°à€Ÿà€Șà„à€€ à€•à€°à„‡à€—à€Ÿ à€”à€° à€‰à€šà„à€čà„‡à€‚ à€žà„à€•à„à€°à„€à€š à€Șà€° à€Šà€żà€–à€Ÿà€à€—à€Ÿ: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) + +### à€”à„ˆà€•à€Čà„à€Șà€żà€• API à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œ à€‰à€šà„à€šà€Żà€š { #alternative-api-docs-upgrade } + +à€”à€° à€…à€Ź, [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) à€Șà€° à€œà€Ÿà€à€à„€ + +* à€”à„ˆà€•à€Čà„à€Șà€żà€• à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œ à€­à„€ à€šà€ query parameter à€”à€° body à€•à„‹ à€Šà€°à„à€¶à€Ÿà€à€—à€Ÿ: + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) + +### à€Șà„à€šà€°à€Ÿà€”à€Čà„‹à€•à€š { #recap } + +à€žà€‚à€•à„à€·à„‡à€Ș à€źà„‡à€‚, à€†à€Ș parameters, body, à€†à€Šà€ż à€•à„‡ à€Șà„à€°à€•à€Ÿà€° à€«à€Œà€‚à€•à„à€¶à€š parameters à€•à„‡ à€°à„‚à€Ș à€źà„‡à€‚ **à€à€• à€Źà€Ÿà€°** à€˜à„‹à€·à€żà€€ à€•à€°à€€à„‡ à€čà„ˆà€‚à„€ + +à€†à€Ș à€Żà€č à€źà€Ÿà€šà€• à€†à€§à„à€šà€żà€• Python à€Șà„à€°à€•à€Ÿà€°à„‹à€‚ à€žà„‡ à€•à€°à€€à„‡ à€čà„ˆà€‚à„€ + +à€†à€Șà€•à„‹ à€•à€żà€žà„€ à€šà€ˆ à€žà€żà€‚à€Ÿà„ˆà€•à„à€ž, à€•à€żà€žà„€ à€”à€żà€¶à„‡à€· à€Čà€Ÿà€‡à€Źà„à€°à„‡à€°à„€ à€•à„‡ methods à€Żà€Ÿ classes, à€†à€Šà€ż à€žà„€à€–à€šà„‡ à€•à„€ à€†à€”à€¶à„à€Żà€•à€€à€Ÿ à€šà€čà„€à€‚ à€čà„ˆà„€ + +à€Źà€ž à€źà€Ÿà€šà€• **Python**à„€ + +à€‰à€Šà€Ÿà€čà€°à€Ł à€•à„‡ à€Čà€żà€, à€à€• `int` à€•à„‡ à€Čà€żà€: + +```Python +item_id: int +``` + +à€Żà€Ÿ à€à€• à€…à€§à€żà€• à€œà€Ÿà€żà€Č `Item` à€źà„‰à€Ąà€Č à€•à„‡ à€Čà€żà€: + +```Python +item: Item +``` + +...à€”à€° à€•à„‡à€”à€Č à€‰à€žà„€ à€à€• à€˜à„‹à€·à€Łà€Ÿ à€•à„‡ à€žà€Ÿà€„ à€†à€Șà€•à„‹ à€źà€żà€Čà€€à€Ÿ à€čà„ˆ: + +* à€à€Ąà€żà€Ÿà€° à€žà€Șà„‹à€°à„à€Ÿ, à€œà€żà€žà€źà„‡à€‚ à€¶à€Ÿà€źà€żà€Č à€čà„ˆ: + * à€•à€źà„à€Șà„à€Čà„€à€¶à€šà„€ + * à€Șà„à€°à€•à€Ÿà€° à€œà€Ÿà€à€šà„€ +* à€Ąà„‡à€Ÿà€Ÿ à€•à€Ÿ à€”à„ˆà€§à„€à€•à€°à€Ł: + * à€œà€Ź à€Ąà„‡à€Ÿà€Ÿ à€…à€źà€Ÿà€šà„à€Ż à€čà„‹ à€€à„‹ à€žà„à€”à€€à€ƒ à€”à€° à€žà„à€Șà€·à„à€Ÿ à€€à„à€°à„à€Ÿà€żà€Żà€Ÿà€à„€ + * à€—à€čà€°à€Ÿà€ˆ à€žà„‡ nested JSON objects à€•à„‡ à€Čà€żà€ à€­à„€ à€”à„ˆà€§à„€à€•à€°à€Łà„€ +* à€‡à€šà€Șà„à€Ÿ à€Ąà„‡à€Ÿà€Ÿ à€•à€Ÿ à€°à„‚à€Șà€Ÿà€‚à€€à€°à€Ł: à€šà„‡à€Ÿà€”à€°à„à€• à€žà„‡ Python à€Ąà„‡à€Ÿà€Ÿ à€”à€° à€Șà„à€°à€•à€Ÿà€°à„‹à€‚ à€źà„‡à€‚à„€ à€‡à€šà€źà„‡à€‚ à€žà„‡ à€Șà€ąà€Œà€šà€Ÿ: + * JSONà„€ + * Path parametersà„€ + * Query parametersà„€ + * Cookiesà„€ + * Headersà„€ + * Formsà„€ + * Filesà„€ +* à€†à€‰à€Ÿà€Șà„à€Ÿ à€Ąà„‡à€Ÿà€Ÿ à€•à€Ÿ à€°à„‚à€Șà€Ÿà€‚à€€à€°à€Ł: Python à€Ąà„‡à€Ÿà€Ÿ à€”à€° à€Șà„à€°à€•à€Ÿà€°à„‹à€‚ à€žà„‡ à€šà„‡à€Ÿà€”à€°à„à€• à€Ąà„‡à€Ÿà€Ÿ (JSON à€•à„‡ à€°à„‚à€Ș à€źà„‡à€‚) à€źà„‡à€‚: + * Python à€Șà„à€°à€•à€Ÿà€°à„‹à€‚ à€•à€Ÿ à€°à„‚à€Șà€Ÿà€‚à€€à€°à€Ł (`str`, `int`, `float`, `bool`, `list`, à€†à€Šà€ż)à„€ + * `datetime` à€‘à€Źà„à€œà„‡à€•à„à€Ÿà„à€žà„€ + * `UUID` à€‘à€Źà„à€œà„‡à€•à„à€Ÿà„à€žà„€ + * à€Ąà„‡à€Ÿà€Ÿà€Źà„‡à€ž à€źà„‰à€Ąà€Čà„à€žà„€ + * ...à€”à€° à€Źà€čà„à€€ à€•à„à€›à„€ +* à€žà„à€”à€šà€Ÿà€Čà€żà€€ à€‡à€‚à€Ÿà€°à„ˆà€•à„à€Ÿà€żà€” API à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œà„€à€•à€°à€Ł, à€œà€żà€šà€źà„‡à€‚ 2 à€”à„ˆà€•à€Čà„à€Șà€żà€• à€Żà„‚à€œà€Œà€° à€‡à€‚à€Ÿà€°à€«à€Œà„‡à€ž à€¶à€Ÿà€źà€żà€Č à€čà„ˆà€‚: + * Swagger UIà„€ + * ReDocà„€ + +--- + +à€Șà€żà€›à€Čà„‡ à€•à„‹à€Ą à€‰à€Šà€Ÿà€čà€°à€Ł à€Șà€° à€Čà„Œà€Ÿà€€à„‡ à€čà„à€, **FastAPI** à€Żà€č à€•à€°à„‡à€—à€Ÿ: + +* `GET` à€”à€° `PUT` à€…à€šà„à€°à„‹à€§à„‹à€‚ à€•à„‡ à€Čà€żà€ path à€źà„‡à€‚ `item_id` à€čà„ˆ, à€Żà€č à€žà€€à„à€Żà€Ÿà€Șà€żà€€ à€•à€°à„‡à€—à€Ÿà„€ +* `GET` à€”à€° `PUT` à€…à€šà„à€°à„‹à€§à„‹à€‚ à€•à„‡ à€Čà€żà€ `item_id` à€•à€Ÿ à€Șà„à€°à€•à€Ÿà€° `int` à€čà„ˆ, à€Żà€č à€žà€€à„à€Żà€Ÿà€Șà€żà€€ à€•à€°à„‡à€—à€Ÿà„€ + * à€Żà€Šà€ż à€šà€čà„€à€‚ à€čà„ˆ, à€€à„‹ à€•à„à€Čà€Ÿà€‡à€‚à€Ÿ à€•à„‹ à€à€• à€‰à€Șà€Żà„‹à€—à„€, à€žà„à€Șà€·à„à€Ÿ à€€à„à€°à„à€Ÿà€ż à€Šà€żà€–à€Ÿà€ˆ à€Šà„‡à€—à„€à„€ +* `GET` à€…à€šà„à€°à„‹à€§à„‹à€‚ à€•à„‡ à€Čà€żà€ à€Żà€č à€œà€Ÿà€à€š à€•à€°à„‡à€—à€Ÿ à€•à€ż `q` à€šà€Ÿà€ź à€•à€Ÿ à€à€• à€”à„ˆà€•à€Čà„à€Șà€żà€• query parameter à€čà„ˆ (à€œà„ˆà€žà„‡ `http://127.0.0.1:8000/items/foo?q=somequery`)à„€ + * à€•à„à€Żà„‹à€‚à€•à€ż `q` parameter `= None` à€•à„‡ à€žà€Ÿà€„ à€˜à„‹à€·à€żà€€ à€čà„ˆ, à€Żà€č à€”à„ˆà€•à€Čà„à€Șà€żà€• à€čà„ˆà„€ + * `None` à€•à„‡ à€Źà€żà€šà€Ÿ à€Żà€č à€†à€”à€¶à„à€Żà€• à€čà„‹à€€à€Ÿ (à€œà„ˆà€žà„‡ `PUT` à€•à„‡ à€źà€Ÿà€źà€Čà„‡ à€źà„‡à€‚ body à€†à€”à€¶à„à€Żà€• à€čà„ˆ)à„€ +* `/items/{item_id}` à€Șà€° `PUT` à€…à€šà„à€°à„‹à€§à„‹à€‚ à€•à„‡ à€Čà€żà€, body à€•à„‹ JSON à€•à„‡ à€°à„‚à€Ș à€źà„‡à€‚ à€Șà€ąà€Œà„‡à€—à€Ÿ: + * à€Żà€č à€œà€Ÿà€à€šà„‡à€—à€Ÿ à€•à€ż à€à€• à€†à€”à€¶à„à€Żà€• attribute `name` à€čà„ˆ à€œà„‹ `str` à€čà„‹à€šà€Ÿ à€šà€Ÿà€čà€żà€à„€ + * à€Żà€č à€œà€Ÿà€à€šà„‡à€—à€Ÿ à€•à€ż à€à€• à€†à€”à€¶à„à€Żà€• attribute `price` à€čà„ˆ à€œà„‹ `float` à€čà„‹à€šà€Ÿ à€šà€Ÿà€čà€żà€à„€ + * à€Żà€č à€œà€Ÿà€à€šà„‡à€—à€Ÿ à€•à€ż à€à€• à€”à„ˆà€•à€Čà„à€Șà€żà€• attribute `is_offer` à€čà„ˆ, à€œà„‹ à€Żà€Šà€ż à€źà„Œà€œà„‚à€Š à€čà„ˆ à€€à„‹ `bool` à€čà„‹à€šà€Ÿ à€šà€Ÿà€čà€żà€à„€ + * à€Żà€č à€žà€Ź à€—à€čà€°à€Ÿà€ˆ à€žà„‡ nested JSON objects à€•à„‡ à€Čà€żà€ à€­à„€ à€•à€Ÿà€ź à€•à€°à„‡à€—à€Ÿà„€ +* JSON à€žà„‡ à€”à€° JSON à€źà„‡à€‚ à€žà„à€”à€€à€ƒ à€°à„‚à€Șà€Ÿà€‚à€€à€°à€Łà„€ +* à€čà€° à€šà„€à€œà€Œ à€•à„‹ OpenAPI à€•à„‡ à€žà€Ÿà€„ à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œà€żà€€ à€•à€°à„‡à€—à€Ÿ, à€œà€żà€žà„‡ à€šà€żà€źà„à€š à€Šà„à€”à€Ÿà€°à€Ÿ à€‰à€Șà€Żà„‹à€— à€•à€żà€Żà€Ÿ à€œà€Ÿ à€žà€•à€€à€Ÿ à€čà„ˆ: + * à€‡à€‚à€Ÿà€°à„ˆà€•à„à€Ÿà€żà€” à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œà„€à€•à€°à€Ł à€Șà„à€°à€Łà€Ÿà€Čà€żà€Żà€Ÿà€à„€ + * à€•à€ˆ à€­à€Ÿà€·à€Ÿà€“à€‚ à€•à„‡ à€Čà€żà€ à€žà„à€”à€šà€Ÿà€Čà€żà€€ à€•à„à€Čà€Ÿà€‡à€‚à€Ÿ à€•à„‹à€Ą à€œà€šà€°à„‡à€¶à€š à€Șà„à€°à€Łà€Ÿà€Čà€żà€Żà€Ÿà€à„€ +* à€žà„€à€§à„‡ 2 à€‡à€‚à€Ÿà€°à„ˆà€•à„à€Ÿà€żà€” à€Šà€žà„à€€à€Ÿà€”à„‡à€œà€Œà„€à€•à€°à€Ł à€”à„‡à€Ź à€‡à€‚à€Ÿà€°à€«à„‡à€žà„‡à€œà€Œ à€Șà„à€°à€Šà€Ÿà€š à€•à€°à„‡à€—à€Ÿà„€ + +--- + +à€čà€źà€šà„‡ à€•à„‡à€”à€Č à€žà€€à€č à€•à„‹ à€›à„à€† à€čà„ˆ, à€Čà„‡à€•à€żà€š à€†à€Șà€•à„‹ à€Șà€čà€Čà„‡ à€čà„€ à€žà€źà€ à€† à€—à€Żà€Ÿ à€čà„‹à€—à€Ÿ à€•à€ż à€Żà€č à€žà€Ź à€•à„ˆà€žà„‡ à€•à€Ÿà€ź à€•à€°à€€à€Ÿ à€čà„ˆà„€ + +à€‡à€ž à€Șà€‚à€•à„à€€à€ż à€•à„‹ à€Źà€Šà€Čà€•à€° à€Šà„‡à€–à„‡à€‚: + +```Python + return {"item_name": item.name, "item_id": item_id} +``` + +...à€Żà€čà€Ÿà€ à€žà„‡: + +```Python + ... "item_name": item.name ... +``` + +...à€Żà€čà€Ÿà€ à€€à€•: + +```Python + ... "item_price": item.price ... +``` + +...à€”à€° à€Šà„‡à€–à„‡à€‚ à€•à€ż à€†à€Șà€•à€Ÿ à€à€Ąà€żà€Ÿà€° attributes à€•à„‹ à€•à„ˆà€žà„‡ auto-complete à€•à€°à„‡à€—à€Ÿ à€”à€° à€‰à€šà€•à„‡ à€Șà„à€°à€•à€Ÿà€° à€œà€Ÿà€šà„‡à€—à€Ÿ: + +![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) + +à€…à€§à€żà€• à€«à€Œà„€à€šà€°à„à€ž à€žà€čà€żà€€ à€à€• à€…à€§à€żà€• à€žà€źà„à€Șà„‚à€°à„à€Ł à€‰à€Šà€Ÿà€čà€°à€Ł à€•à„‡ à€Čà€żà€, à€Ÿà„à€Żà„‚à€Ÿà„‹à€°à€żà€Żà€Č - à€Żà„‚à€œà€Œà€° à€—à€Ÿà€‡à€Ą à€Šà„‡à€–à„‡à€‚à„€ + +**à€žà„à€Șà„‰à€‡à€Čà€° à€…à€Čà€°à„à€Ÿ**: à€Ÿà„à€Żà„‚à€Ÿà„‹à€°à€żà€Żà€Č - à€Żà„‚à€œà€Œà€° à€—à€Ÿà€‡à€Ą à€źà„‡à€‚ à€¶à€Ÿà€źà€żà€Č à€čà„ˆ: + +* à€”à€żà€­à€żà€šà„à€š à€žà„à€„à€Ÿà€šà„‹à€‚ à€žà„‡ **parameters** à€•à„€ à€˜à„‹à€·à€Łà€Ÿ: **headers**, **cookies**, **form fields** à€”à€° **files**à„€ +* `maximum_length` à€Żà€Ÿ `regex` à€œà„ˆà€žà„€ **validation constraints** à€•à„ˆà€žà„‡ à€žà„‡à€Ÿ à€•à€°à„‡à€‚à„€ +* à€à€• à€Źà€čà„à€€ à€¶à€•à„à€€à€żà€¶à€Ÿà€Čà„€ à€”à€° à€‰à€Șà€Żà„‹à€— à€źà„‡à€‚ à€†à€žà€Ÿà€š **à€Ąà€żà€Șà„‡à€‚à€Ąà„‡à€‚à€žà„€ à€‡à€‚à€œà„‡à€•à„à€¶à€š** à€žà€żà€žà„à€Ÿà€źà„€ +* à€žà„à€°à€•à„à€·à€Ÿ à€”à€° à€Șà„à€°à€źà€Ÿà€Łà„€à€•à€°à€Ł, à€œà€żà€žà€źà„‡à€‚ **OAuth2** à€•à„‡ à€žà€Ÿà€„ **JWT tokens** à€”à€° **HTTP Basic** auth à€•à€Ÿ à€žà€źà€°à„à€„à€š à€¶à€Ÿà€źà€żà€Č à€čà„ˆà„€ +* **à€—à€čà€°à€Ÿà€ˆ à€žà„‡ nested JSON à€źà„‰à€Ąà€Čà„à€ž** à€˜à„‹à€·à€żà€€ à€•à€°à€šà„‡ à€•à„€ à€…à€§à€żà€• à€‰à€šà„à€šà€€ (à€Șà€° à€žà€źà€Ÿà€š à€°à„‚à€Ș à€žà„‡ à€†à€žà€Ÿà€š) à€€à€•à€šà„€à€•à„‡à€‚ (Pydantic à€•à„€ à€Źà€Šà„Œà€Čà€€)à„€ +* [Strawberry](https://strawberry.rocks) à€”à€° à€…à€šà„à€Ż à€Čà€Ÿà€‡à€Źà„à€°à„‡à€°à„€à€œà€Œ à€•à„‡ à€žà€Ÿà€„ **GraphQL** à€à€•à„€à€•à€°à€Łà„€ +* à€•à€ˆ à€…à€€à€żà€°à€żà€•à„à€€ à€«à€Œà„€à€šà€°à„à€ž (Starlette à€•à„€ à€Źà€Šà„Œà€Čà€€) à€œà„ˆà€žà„‡: + * **WebSockets** + * HTTPX à€”à€° `pytest` à€Șà€° à€†à€§à€Ÿà€°à€żà€€ à€…à€€à„à€Żà€‚à€€ à€†à€žà€Ÿà€š à€Ÿà„‡à€žà„à€Ÿà„à€ž + * **CORS** + * **Cookie Sessions** + * ...à€†à€Šà€żà„€ + +### à€…à€Șà€šà„€ à€à€Ș à€Șà€°à€żà€šà€żà€Żà„‹à€œà€żà€€ à€•à€°à„‡à€‚ (à€”à„ˆà€•à€Čà„à€Șà€żà€•) { #deploy-your-app-optional } + +à€†à€Ș à€”à„ˆà€•à€Čà„à€Șà€żà€• à€°à„‚à€Ș à€žà„‡ à€…à€Șà€šà„€ FastAPI à€à€Ș à€•à„‹ [FastAPI Cloud](https://fastapicloud.com) à€Șà€° à€à€• à€čà„€ à€•à€źà€Ÿà€‚à€Ą à€žà„‡ à€Ąà€żà€Șà„à€Čà„‰à€Ż à€•à€° à€žà€•à€€à„‡ à€čà„ˆà€‚à„€ 🚀 + +
+ +```console +$ fastapi deploy + +Deploying to FastAPI Cloud... + +✅ Deployment successful! + +🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev +``` + +
+ +CLI à€†à€Șà€•à„€ FastAPI à€à€Șà„à€Čà€żà€•à„‡à€¶à€š à€•à„‹ à€žà„à€”à€€à€ƒ à€Șà€čà€šà€Ÿà€š à€Čà„‡à€—à€Ÿ à€”à€° à€‰à€žà„‡ à€•à„à€Čà€Ÿà€‰à€Ą à€Șà€° à€Ąà€żà€Șà„à€Čà„‰à€Ż à€•à€°à„‡à€—à€Ÿà„€ à€Żà€Šà€ż à€†à€Ș logged in à€šà€čà„€à€‚ à€čà„ˆà€‚, à€€à„‹ à€Șà„à€°à€źà€Ÿà€Łà„€à€•à€°à€Ł à€Șà„à€°à€•à„à€°à€żà€Żà€Ÿ à€Șà„‚à€°à„€ à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€†à€Șà€•à€Ÿ à€Źà„à€°à€Ÿà€‰à€œà€Œà€° à€–à„à€Čà„‡à€—à€Ÿà„€ + +à€Źà€ž à€‡à€€à€šà€Ÿ à€čà„€! à€…à€Ź à€†à€Ș à€‰à€ž URL à€Șà€° à€…à€Șà€šà„€ à€à€Ș à€à€•à„à€žà„‡à€ž à€•à€° à€žà€•à€€à„‡ à€čà„ˆà€‚à„€ ✹ + +#### FastAPI Cloud à€•à„‡ à€Źà€Ÿà€°à„‡ à€źà„‡à€‚ { #about-fastapi-cloud } + +**[FastAPI Cloud](https://fastapicloud.com)** à€•à„‹ **FastAPI** à€•à„‡ à€čà„€ à€Čà„‡à€–à€• à€”à€° à€Ÿà„€à€ź à€šà„‡ à€Źà€šà€Ÿà€Żà€Ÿ à€čà„ˆà„€ + +à€Żà€č à€šà„à€Żà„‚à€šà€€à€ź à€Șà„à€°à€Żà€Ÿà€ž à€źà„‡à€‚ à€•à€żà€žà„€ API à€•à„‹ **à€Źà€šà€Ÿà€šà„‡**, **à€Ąà€żà€Șà„à€Čà„‰à€Ż** à€•à€°à€šà„‡ à€”à€° **à€à€•à„à€žà„‡à€ž** à€•à€°à€šà„‡ à€•à„€ à€Șà„à€°à€•à„à€°à€żà€Żà€Ÿ à€•à„‹ à€žà€°à€Č à€Źà€šà€Ÿà€€à€Ÿ à€čà„ˆà„€ + +à€Żà€č FastAPI à€•à„‡ à€žà€Ÿà€„ à€à€Șà„à€ž à€Źà€šà€Ÿà€šà„‡ à€•à„‡ à€‰à€žà„€ **à€Ąà„‡à€”à€Čà€Șà€° à€…à€šà„à€­à€”** à€•à„‹ à€‰à€šà„à€čà„‡à€‚ à€•à„à€Čà€Ÿà€‰à€Ą à€źà„‡à€‚ **à€Ąà€żà€Șà„à€Čà„‰à€Ż** à€•à€°à€šà„‡ à€€à€• à€Čà€Ÿà€€à€Ÿ à€čà„ˆà„€ 🎉 + +FastAPI Cloud, *FastAPI and friends* à€“à€Șà€š à€žà„‹à€°à„à€ž à€Șà„à€°à„‹à€œà„‡à€•à„à€Ÿà„à€ž à€•à„‡ à€Čà€żà€ à€źà„à€–à„à€Ż à€Șà„à€°à€Ÿà€Żà„‹à€œà€• à€”à€° à€«à€‚à€Ąà€żà€‚à€— à€Șà„à€°à€Šà€Ÿà€€à€Ÿ à€čà„ˆà„€ ✹ + +#### à€…à€šà„à€Ż à€•à„à€Čà€Ÿà€‰à€Ą à€Șà„à€°à€Šà€Ÿà€€à€Ÿà€“à€‚ à€Șà€° à€Ąà€żà€Șà„à€Čà„‰à€Ż à€•à€°à„‡à€‚ { #deploy-to-other-cloud-providers } + +FastAPI à€“à€Șà€š à€žà„‹à€°à„à€ž à€čà„ˆ à€”à€° à€źà€Ÿà€šà€•à„‹à€‚ à€Șà€° à€†à€§à€Ÿà€°à€żà€€ à€čà„ˆà„€ à€†à€Ș FastAPI à€à€Șà„à€ž à€•à„‹ à€•à€żà€žà„€ à€­à„€ à€•à„à€Čà€Ÿà€‰à€Ą à€Șà„à€°à€Šà€Ÿà€€à€Ÿ à€Șà€° à€Ąà€żà€Șà„à€Čà„‰à€Ż à€•à€° à€žà€•à€€à„‡ à€čà„ˆà€‚à„€ + +à€…à€Șà€šà„‡ à€•à„à€Čà€Ÿà€‰à€Ą à€Șà„à€°à€Šà€Ÿà€€à€Ÿ à€•à„‡ à€—à€Ÿà€‡à€Ąà„à€ž à€•à€Ÿ à€Șà€Ÿà€Čà€š à€•à€°à„‡à€‚ à€”à€° à€‰à€šà€•à„‡ à€žà€Ÿà€„ FastAPI à€à€Șà„à€ž à€Ąà€żà€Șà„à€Čà„‰à€Ż à€•à€°à„‡à€‚à„€ đŸ€“ + +## à€Șà„à€°à€Šà€°à„à€¶à€š { #performance } + +à€žà„à€”à€€à€‚à€€à„à€° TechEmpower à€Źà„‡à€‚à€šà€źà€Ÿà€°à„à€• à€Šà€żà€–à€Ÿà€€à„‡ à€čà„ˆà€‚ à€•à€ż Uvicorn à€•à„‡ à€€à€čà€€ à€šà€Čà€šà„‡ à€”à€Ÿà€Čà„‡ **FastAPI** à€à€Șà„à€Čà„€à€•à„‡à€¶à€šà„à€ž [à€‰à€Șà€Čà€Źà„à€§ à€žà€Źà€žà„‡ à€€à„‡à€œà€Œ Python à€«à€Œà„à€°à„‡à€źà€”à€°à„à€•à„à€ž à€źà„‡à€‚ à€žà„‡ à€à€•](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7) à€čà„ˆà€‚, à€•à„‡à€”à€Č Starlette à€”à€° Uvicorn (à€œà„‹ FastAPI à€Šà„à€”à€Ÿà€°à€Ÿ à€†à€‚à€€à€°à€żà€• à€°à„‚à€Ș à€žà„‡ à€‰à€Șà€Żà„‹à€— à€•à€żà€ à€œà€Ÿà€€à„‡ à€čà„ˆà€‚) à€žà„‡ à€šà„€à€šà„‡à„€ (*) + +à€‡à€žà€•à„‡ à€Źà€Ÿà€°à„‡ à€źà„‡à€‚ à€…à€§à€żà€• à€žà€źà€à€šà„‡ à€•à„‡ à€Čà€żà€, [à€Źà„‡à€‚à€šà€źà€Ÿà€°à„à€•à„à€ž](https://fastapi.tiangolo.com/hi/benchmarks/) à€žà„‡à€•à„à€¶à€š à€Šà„‡à€–à„‡à€‚à„€ + +## à€šà€żà€°à„à€­à€°à€€à€Ÿà€à€ { #dependencies } + +FastAPI, Pydantic à€”à€° Starlette à€Șà€° à€šà€żà€°à„à€­à€° à€•à€°à€€à€Ÿ à€čà„ˆà„€ + +### `standard` à€šà€żà€°à„à€­à€°à€€à€Ÿà€à€ { #standard-dependencies } + +à€œà€Ź à€†à€Ș `pip install "fastapi[standard]"` à€•à„‡ à€žà€Ÿà€„ FastAPI à€žà„à€„à€Ÿà€Șà€żà€€ à€•à€°à€€à„‡ à€čà„ˆà€‚, à€€à„‹ à€Żà€č `standard` à€žà€źà„‚à€č à€•à„€ à€”à„ˆà€•à€Čà„à€Șà€żà€• à€šà€żà€°à„à€­à€°à€€à€Ÿà€“à€‚ à€•à„‡ à€žà€Ÿà€„ à€†à€€à€Ÿ à€čà„ˆ: + +Pydantic à€Šà„à€”à€Ÿà€°à€Ÿ à€‰à€Șà€Żà„‹à€— à€•à€żà€Żà€Ÿ à€—à€Żà€Ÿ: + +* [`email-validator`](https://github.com/JoshData/python-email-validator) - à€ˆà€źà„‡à€Č à€”à„ˆà€§à„€à€•à€°à€Ł à€•à„‡ à€Čà€żà€à„€ + +Starlette à€Šà„à€”à€Ÿà€°à€Ÿ à€‰à€Șà€Żà„‹à€— à€•à€żà€Żà€Ÿ à€—à€Żà€Ÿ: + +* [`httpx`](https://www.python-httpx.org) - à€Żà€Šà€ż à€†à€Ș `TestClient` à€•à€Ÿ à€‰à€Șà€Żà„‹à€— à€•à€°à€šà€Ÿ à€šà€Ÿà€čà€€à„‡ à€čà„ˆà€‚ à€€à„‹ à€†à€”à€¶à„à€Żà€•à„€ +* [`jinja2`](https://jinja.palletsprojects.com) - à€Żà€Šà€ż à€†à€Ș à€Ąà€żà€«à€Œà„‰à€Čà„à€Ÿ à€Ÿà„‡à€źà„à€Șà€Čà„‡à€Ÿ à€•à„‰à€šà„à€«à€Œà€żà€—à€°à„‡à€¶à€š à€•à€Ÿ à€‰à€Șà€Żà„‹à€— à€•à€°à€šà€Ÿ à€šà€Ÿà€čà€€à„‡ à€čà„ˆà€‚ à€€à„‹ à€†à€”à€¶à„à€Żà€•à„€ +* [`python-multipart`](https://github.com/Kludex/python-multipart) - à€Żà€Šà€ż à€†à€Ș à€«à„‰à€°à„à€ź "à€Șà€Ÿà€°à„à€žà€żà€‚à€—" à€•à€Ÿ à€žà€źà€°à„à€„à€š à€•à€°à€šà€Ÿ à€šà€Ÿà€čà€€à„‡ à€čà„ˆà€‚, `request.form()` à€•à„‡ à€žà€Ÿà€„, à€€à„‹ à€†à€”à€¶à„à€Żà€•à„€ + +FastAPI à€Šà„à€”à€Ÿà€°à€Ÿ à€‰à€Șà€Żà„‹à€— à€•à€żà€Żà€Ÿ à€—à€Żà€Ÿ: + +* [`uvicorn`](https://www.uvicorn.dev) - à€”à€č à€žà€°à„à€”à€° à€œà„‹ à€†à€Șà€•à„€ à€à€Șà„à€Čà€żà€•à„‡à€¶à€š à€•à„‹ à€Čà„‹à€Ą à€”à€° à€žà€°à„à€” à€•à€°à€€à€Ÿ à€čà„ˆà„€ à€‡à€žà€źà„‡à€‚ `uvicorn[standard]` à€¶à€Ÿà€źà€żà€Č à€čà„ˆ, à€œà€żà€žà€źà„‡à€‚ à€‰à€šà„à€š-à€Șà„à€°à€Šà€°à„à€¶à€š à€žà€°à„à€”à€żà€‚à€— à€•à„‡ à€Čà€żà€ à€•à„à€› à€šà€żà€°à„à€­à€°à€€à€Ÿà€à€ (à€œà„ˆà€žà„‡ `uvloop`) à€¶à€Ÿà€źà€żà€Č à€čà„ˆà€‚à„€ +* `fastapi-cli[standard]` - `fastapi` à€•à€źà€Ÿà€‚à€Ą à€Șà„à€°à€Šà€Ÿà€š à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€à„€ + * à€‡à€žà€źà„‡à€‚ `fastapi-cloud-cli` à€¶à€Ÿà€źà€żà€Č à€čà„ˆ, à€œà„‹ à€†à€Șà€•à„‹ à€…à€Șà€šà„€ FastAPI à€à€Șà„à€Čà€żà€•à„‡à€¶à€š à€•à„‹ [FastAPI Cloud](https://fastapicloud.com) à€Șà€° à€Ąà€żà€Șà„à€Čà„‰à€Ż à€•à€°à€šà„‡ à€•à„€ à€…à€šà„à€źà€€à€ż à€Šà„‡à€€à€Ÿ à€čà„ˆà„€ + +### `standard` à€šà€żà€°à„à€­à€°à€€à€Ÿà€“à€‚ à€•à„‡ à€Źà€żà€šà€Ÿ { #without-standard-dependencies } + +à€Żà€Šà€ż à€†à€Ș `standard` à€”à„ˆà€•à€Čà„à€Șà€żà€• à€šà€żà€°à„à€­à€°à€€à€Ÿà€“à€‚ à€•à„‹ à€¶à€Ÿà€źà€żà€Č à€šà€čà„€à€‚ à€•à€°à€šà€Ÿ à€šà€Ÿà€čà€€à„‡, à€€à„‹ à€†à€Ș `pip install fastapi` à€•à„‡ à€žà€Ÿà€„ à€žà„à€„à€Ÿà€Șà€żà€€ à€•à€° à€žà€•à€€à„‡ à€čà„ˆà€‚, `pip install "fastapi[standard]"` à€•à„‡ à€Źà€œà€Ÿà€Żà„€ + +### `fastapi-cloud-cli` à€•à„‡ à€Źà€żà€šà€Ÿ { #without-fastapi-cloud-cli } + +à€Żà€Šà€ż à€†à€Ș standard à€šà€żà€°à„à€­à€°à€€à€Ÿà€“à€‚ à€•à„‡ à€žà€Ÿà€„ à€Čà„‡à€•à€żà€š `fastapi-cloud-cli` à€•à„‡ à€Źà€żà€šà€Ÿ FastAPI à€žà„à€„à€Ÿà€Șà€żà€€ à€•à€°à€šà€Ÿ à€šà€Ÿà€čà€€à„‡ à€čà„ˆà€‚, à€€à„‹ `pip install "fastapi[standard-no-fastapi-cloud-cli]"` à€•à„‡ à€žà€Ÿà€„ à€žà„à€„à€Ÿà€Șà€żà€€ à€•à€° à€žà€•à€€à„‡ à€čà„ˆà€‚à„€ + +### à€…à€€à€żà€°à€żà€•à„à€€ à€”à„ˆà€•à€Čà„à€Șà€żà€• à€šà€żà€°à„à€­à€°à€€à€Ÿà€à€ { #additional-optional-dependencies } + +à€•à„à€› à€…à€€à€żà€°à€żà€•à„à€€ à€šà€żà€°à„à€­à€°à€€à€Ÿà€à€ à€čà„ˆà€‚ à€œà€żà€šà„à€čà„‡à€‚ à€†à€Ș à€žà„à€„à€Ÿà€Șà€żà€€ à€•à€°à€šà€Ÿ à€šà€Ÿà€čà„‡à€‚à€—à„‡à„€ + +à€…à€€à€żà€°à€żà€•à„à€€ à€”à„ˆà€•à€Čà„à€Șà€żà€• Pydantic à€šà€żà€°à„à€­à€°à€€à€Ÿà€à€: + +* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) - à€žà„‡à€Ÿà€żà€‚à€—à„à€ž à€Șà„à€°à€Źà€‚à€§à€š à€•à„‡ à€Čà€żà€à„€ +* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) - Pydantic à€•à„‡ à€žà€Ÿà€„ à€‰à€Șà€Żà„‹à€— à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€…à€€à€żà€°à€żà€•à„à€€ à€Șà„à€°à€•à€Ÿà€°à„‹à€‚ à€čà„‡à€€à„à„€ + +à€…à€€à€żà€°à€żà€•à„à€€ à€”à„ˆà€•à€Čà„à€Șà€żà€• FastAPI à€šà€żà€°à„à€­à€°à€€à€Ÿà€à€: + +* [`orjson`](https://github.com/ijl/orjson) - à€Żà€Šà€ż à€†à€Ș `ORJSONResponse` à€‰à€Șà€Żà„‹à€— à€•à€°à€šà€Ÿ à€šà€Ÿà€čà€€à„‡ à€čà„ˆà€‚ à€€à„‹ à€†à€”à€¶à„à€Żà€•à„€ +* [`ujson`](https://github.com/esnme/ultrajson) - à€Żà€Šà€ż à€†à€Ș `UJSONResponse` à€‰à€Șà€Żà„‹à€— à€•à€°à€šà€Ÿ à€šà€Ÿà€čà€€à„‡ à€čà„ˆà€‚ à€€à„‹ à€†à€”à€¶à„à€Żà€•à„€ + +## à€Čà€Ÿà€‡à€žà„‡à€‚à€ž { #license } + +à€Żà€č à€Șà„à€°à„‹à€œà„‡à€•à„à€Ÿ MIT à€Čà€Ÿà€‡à€žà„‡à€‚à€ž à€•à„€ à€¶à€°à„à€€à„‹à€‚ à€•à„‡ à€…à€‚à€€à€°à„à€—à€€ à€Čà€Ÿà€‡à€žà„‡à€‚à€ž à€Șà„à€°à€Ÿà€Șà„à€€ à€čà„ˆà„€ diff --git a/docs/hi/docs/translation-banner.md b/docs/hi/docs/translation-banner.md new file mode 100644 index 000000000..af9fedda8 --- /dev/null +++ b/docs/hi/docs/translation-banner.md @@ -0,0 +1,11 @@ +/// details | 🌐 à€à€†à€ˆ à€”à€° à€źà€šà„à€·à„à€Żà„‹à€‚ à€Šà„à€”à€Ÿà€°à€Ÿ à€•à€żà€Żà€Ÿ à€—à€Żà€Ÿ à€…à€šà„à€”à€Ÿà€Š + +à€Żà€č à€…à€šà„à€”à€Ÿà€Š à€źà€šà„à€·à„à€Żà„‹à€‚ à€•à„‡ à€źà€Ÿà€°à„à€—à€Šà€°à„à€¶à€š à€źà„‡à€‚ à€à€†à€ˆ à€Šà„à€”à€Ÿà€°à€Ÿ à€•à€żà€Żà€Ÿ à€—à€Żà€Ÿ à€čà„ˆà„€ đŸ€ + +à€‡à€žà€źà„‡à€‚ à€źà„‚à€Č à€…à€°à„à€„ à€•à„‹ à€—à€Čà€€ à€žà€źà€à€šà„‡ à€Żà€Ÿ à€…à€Șà„à€°à€Ÿà€•à„ƒà€€à€żà€• à€Čà€—à€šà„‡ à€†à€Šà€ż à€œà„ˆà€žà„€ à€—à€Čà€€à€żà€Żà€Ÿà€ à€čà„‹ à€žà€•à€€à„€ à€čà„ˆà€‚à„€ đŸ€– + +à€†à€Ș [à€čà€źà„‡à€‚ à€à€†à€ˆ LLM à€•à„‹ à€Źà„‡à€čà€€à€° à€źà€Ÿà€°à„à€—à€Šà€°à„à€¶à€š à€•à€°à€šà„‡ à€źà„‡à€‚ à€źà€Šà€Š à€•à€°à€•à„‡](https://fastapi.tiangolo.com/hi/contributing/#translations) à€‡à€ž à€…à€šà„à€”à€Ÿà€Š à€•à„‹ à€Źà„‡à€čà€€à€° à€Źà€šà€Ÿ à€žà€•à€€à„‡ à€čà„ˆà€‚à„€ + +[à€…à€‚à€—à„à€°à„‡à€œà€Œà„€ à€žà€‚à€žà„à€•à€°à€Ł](ENGLISH_VERSION_URL) + +/// diff --git a/docs/hi/llm-prompt.md b/docs/hi/llm-prompt.md new file mode 100644 index 000000000..337ea3823 --- /dev/null +++ b/docs/hi/llm-prompt.md @@ -0,0 +1,5 @@ +### Target language + +Translate to Hindi (à€čà€żà€šà„à€Šà„€). + +Language code: hi. diff --git a/docs/hi/mkdocs.yml b/docs/hi/mkdocs.yml new file mode 100644 index 000000000..de18856f4 --- /dev/null +++ b/docs/hi/mkdocs.yml @@ -0,0 +1 @@ +INHERIT: ../en/mkdocs.yml diff --git a/pyproject.toml b/pyproject.toml index 8b633a928..1030815b1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -331,6 +331,7 @@ extend-exclude = [ "docs/uk/", "docs/zh/", "docs/zh-hant/", + "docs/hi/", "htmlcov/", "scripts/general-llm-prompt.md", "scripts/tests/test_translation_fixer/test_complex_doc/", diff --git a/scripts/docs.py b/scripts/docs.py index 5b693ba0a..8e3d5e832 100644 --- a/scripts/docs.py +++ b/scripts/docs.py @@ -31,6 +31,7 @@ SUPPORTED_LANGS = { "uk", "zh", "zh-hant", + "hi", } From 2d0047087526d2af3eca4cee77d56539c52651d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 19 Jun 2026 20:16:30 +0000 Subject: [PATCH 195/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 0e1881ae3..7c54f461f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -11,6 +11,10 @@ hide: * ✏ Fix grammar, typos, and broken links in docs. PR [#15694](https://github.com/fastapi/fastapi/pull/15694) by [@YuriiMotov](https://github.com/YuriiMotov). +### Translations + +* 🌐 Enable Hindi docs translations. PR [#15554](https://github.com/fastapi/fastapi/pull/15554) by [@YuriiMotov](https://github.com/YuriiMotov). + ### Internal * 📝 Tweak wording about deploying to FastAPI Cloud. PR [#15793](https://github.com/fastapi/fastapi/pull/15793) by [@tiangolo](https://github.com/tiangolo). From 22f99d9ad33676a60496379c749d3669f10f5410 Mon Sep 17 00:00:00 2001 From: Yurii Motov <109919500+YuriiMotov@users.noreply.github.com> Date: Sat, 20 Jun 2026 00:28:24 +0200 Subject: [PATCH 196/290] =?UTF-8?q?=F0=9F=94=A7=20Enable=20checking=20`rel?= =?UTF-8?q?ease-notes.md`=20for=20typos=20(#15796)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1030815b1..e33e46fd8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -319,7 +319,6 @@ extend-exclude = [ "docs/de/", "docs/en/data/", "docs/en/docs/img/", - "docs/en/docs/release-notes.md", "docs/es/", "docs/fr/", "docs/ja/", @@ -340,6 +339,16 @@ extend-exclude = [ "uv.lock", ] +[tool.typos.default] +extend-ignore-re = [ + # GitHub usernames in @mentions + "@[a-zA-Z0-9](?:-?[a-zA-Z0-9])*", + # Quoted typo documented in a release note + "'wll' to 'will'", + # German article title in a release note + "FastAPI Modul.", +] + [tool.typos.default.extend-identifiers] alls = "alls" From f1d750fddad90e2faad6c3cc5c85c7687b787e89 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 19 Jun 2026 22:28:49 +0000 Subject: [PATCH 197/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7c54f461f..ba7109455 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -17,6 +17,7 @@ hide: ### Internal +* 🔧 Enable checking `release-notes.md` for typos. PR [#15796](https://github.com/fastapi/fastapi/pull/15796) by [@YuriiMotov](https://github.com/YuriiMotov). * 📝 Tweak wording about deploying to FastAPI Cloud. PR [#15793](https://github.com/fastapi/fastapi/pull/15793) by [@tiangolo](https://github.com/tiangolo). * 🔹 Use `gpt-5.5` model in `translate.py`, specify `-chat` to avoid warnings. PR [#15792](https://github.com/fastapi/fastapi/pull/15792) by [@YuriiMotov](https://github.com/YuriiMotov). From 4d3dc78b262c609daf8a23baa00f31221b386d52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 20 Jun 2026 02:20:49 +0200 Subject: [PATCH 198/290] =?UTF-8?q?=E2=9C=A8=20Add=20support=20for=20`app.?= =?UTF-8?q?frontend("/",=20directory=3D"dist")`=20and=20`router.frontend("?= =?UTF-8?q?/",=20directory=3D"dist")`=20(#15800)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/reference/apirouter.md | 1 + docs/en/docs/reference/fastapi.md | 1 + docs/en/docs/tutorial/frontend.md | 131 ++++ docs/en/docs/tutorial/static-files.md | 8 + docs/en/mkdocs.yml | 1 + docs_src/frontend/__init__.py | 0 docs_src/frontend/tutorial001_py310.py | 5 + docs_src/frontend/tutorial002_py310.py | 5 + docs_src/frontend/tutorial003_py310.py | 5 + docs_src/frontend/tutorial004_py310.py | 7 + docs_src/frontend/tutorial005_py310.py | 5 + docs_src/frontend/tutorial006_py310.py | 5 + fastapi/applications.py | 76 ++- fastapi/routing.py | 546 +++++++++++++++- tests/test_frontend.py | 858 +++++++++++++++++++++++++ 15 files changed, 1649 insertions(+), 5 deletions(-) create mode 100644 docs/en/docs/tutorial/frontend.md create mode 100644 docs_src/frontend/__init__.py create mode 100644 docs_src/frontend/tutorial001_py310.py create mode 100644 docs_src/frontend/tutorial002_py310.py create mode 100644 docs_src/frontend/tutorial003_py310.py create mode 100644 docs_src/frontend/tutorial004_py310.py create mode 100644 docs_src/frontend/tutorial005_py310.py create mode 100644 docs_src/frontend/tutorial006_py310.py create mode 100644 tests/test_frontend.py diff --git a/docs/en/docs/reference/apirouter.md b/docs/en/docs/reference/apirouter.md index d77364e45..819366dfb 100644 --- a/docs/en/docs/reference/apirouter.md +++ b/docs/en/docs/reference/apirouter.md @@ -13,6 +13,7 @@ from fastapi import APIRouter members: - websocket - include_router + - frontend - get - put - post diff --git a/docs/en/docs/reference/fastapi.md b/docs/en/docs/reference/fastapi.md index d5367ff34..e8ec991e5 100644 --- a/docs/en/docs/reference/fastapi.md +++ b/docs/en/docs/reference/fastapi.md @@ -18,6 +18,7 @@ from fastapi import FastAPI - openapi - websocket - include_router + - frontend - get - put - post diff --git a/docs/en/docs/tutorial/frontend.md b/docs/en/docs/tutorial/frontend.md new file mode 100644 index 000000000..9f0bc0566 --- /dev/null +++ b/docs/en/docs/tutorial/frontend.md @@ -0,0 +1,131 @@ +# Frontend { #frontend } + +You can serve static frontend apps with `app.frontend()` (or `router.frontend()`). + +This is useful for frontend tools that generate static files, like React with Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid, and others. + +With these tools, you normally have a step that builds the frontend, with a command like: + +```bash +npm run build +``` + +That would generate a directory like `./dist/` with your frontend files. + +You can use `app.frontend()` to serve that directory following the conventions needed by these frontend frameworks. + +**FastAPI** checks *path operations* first. The frontend files are checked only if no normal route matched, so your API won't be affected. + +## Serve a Frontend { #serve-a-frontend } + +After building your frontend, for example with `npm run build`, put the generated files in a directory, for example, `dist`. + +Your project structure could look like this: + +```text +. +├── pyproject.toml +├── app +│ ├── __init__.py +│ └── main.py +└── dist + ├── index.html + └── assets + └── app.js +``` + +Then serve it with `app.frontend()`: + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +With this, a request for `/assets/app.js` can serve `dist/assets/app.js`. + +If you also have a **FastAPI** *path operation*, the *path operation* wins. + +## Client-Side Routing { #client-side-routing } + +Many frontend apps, including **single-page apps** (SPAs), use client-side routing. A path like `/dashboard/settings` might not be a real file but the framework would take care of handling it. + +So, if accessing that URL directly (instead of navigating through the app), the backend should serve the frontend app from `index.html`, so that the frontend framework can then handle the client-side routing. + +For that, use `fallback="index.html"`: + +{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} + +**FastAPI** uses this fallback only for requests that look like browser navigation. Missing files like JavaScript, CSS, and images still return `404`. + +/// tip + +By default, `fallback` has a value of `fallback="auto"`. In most cases you won't need to specify `fallback`. Read below for details. + +/// + +This is what you would want with many frontend apps that use client-side routing, for example, React with TanStack Router, Vue, Angular, SvelteKit, or Solid. + +## Custom 404 Page { #custom-404-page } + +You can also serve a static `404.html` page for missing frontend paths: + +{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *} + +That response keeps a status code of `404`. + +In this case, **FastAPI** won't serve `index.html` for missing frontend paths. It will return the `404.html` file instead. + +/// tip + +By default, `fallback` has a value of `fallback="auto"`. With this, if a `404.html` file is found, it will be used as the fallback automatically. + +So, you can normally omit the `fallback` argument. + +/// + +This is useful with frontend tools that generate static HTML files for each page, like Astro. + +## Fallback Auto { #fallback-auto } + +By default, `app.frontend()` uses `fallback="auto"`. + +If there is a `404.html` file in the frontend directory, missing frontend paths serve that file with status code `404`. + +Otherwise, if there is an `index.html` file, missing browser navigation paths serve `index.html`, which is what many frontend apps with client-side routing expect. + +So, in most cases you can use `app.frontend("/", directory="dist")` without specifying the `fallback` argument. + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +## Disable Fallback { #disable-fallback } + +If you don't want to serve a fallback file for missing frontend paths, use `fallback=None`: + +{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *} + +Then missing frontend paths return the normal `404`. + +## Check Directory { #check-directory } + +By default, `app.frontend()` checks that the directory exists when the app is created. + +This helps catch configuration errors early. For example, if the frontend build output directory is missing, **FastAPI** will raise an error on startup. + +If your frontend files are created later, for example by a separate build step after the app object is created, set `check_dir=False`: + +{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *} + +With `check_dir=False`, **FastAPI** will not check the directory when the app is created. If the configured directory is still missing when a request is handled, **FastAPI** will raise an error then. + +## Use it with `APIRouter` { #use-it-with-apirouter } + +You can also add frontend files to an `APIRouter` and include it with a prefix: + +{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *} + +In this example, frontend paths are served under `/app`. + +Any regular *path operations* in the app will still take precedence, including in other routers. + +## Static Build Output Only { #static-build-output-only } + +`app.frontend()` serves files already generated by your frontend build. + +It does not run server-side rendering. It is for frontend frameworks that generate static files, not for frameworks that need dynamic rendering on the server for each request. diff --git a/docs/en/docs/tutorial/static-files.md b/docs/en/docs/tutorial/static-files.md index 0b73a35c1..4b5057c08 100644 --- a/docs/en/docs/tutorial/static-files.md +++ b/docs/en/docs/tutorial/static-files.md @@ -2,6 +2,14 @@ You can serve static files automatically from a directory using `StaticFiles`. +/// tip + +If you need to host a frontend, use `app.frontend()` instead, read about it in [Frontend](frontend.md). + +`app.frontend()` uses `StaticFiles` underneath, with several additional advantages for frontends, like handling client-side routing. + +/// + ## Use `StaticFiles` { #use-staticfiles } * Import `StaticFiles`. diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index 2d50ce2a4..884307dcf 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -133,6 +133,7 @@ nav: - tutorial/server-sent-events.md - tutorial/background-tasks.md - tutorial/metadata.md + - tutorial/frontend.md - tutorial/static-files.md - tutorial/testing.md - tutorial/debugging.md diff --git a/docs_src/frontend/__init__.py b/docs_src/frontend/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/docs_src/frontend/tutorial001_py310.py b/docs_src/frontend/tutorial001_py310.py new file mode 100644 index 000000000..69e6f37f9 --- /dev/null +++ b/docs_src/frontend/tutorial001_py310.py @@ -0,0 +1,5 @@ +from fastapi import FastAPI + +app = FastAPI() + +app.frontend("/", directory="dist") diff --git a/docs_src/frontend/tutorial002_py310.py b/docs_src/frontend/tutorial002_py310.py new file mode 100644 index 000000000..bb5349cde --- /dev/null +++ b/docs_src/frontend/tutorial002_py310.py @@ -0,0 +1,5 @@ +from fastapi import FastAPI + +app = FastAPI() + +app.frontend("/", directory="dist", fallback="index.html") diff --git a/docs_src/frontend/tutorial003_py310.py b/docs_src/frontend/tutorial003_py310.py new file mode 100644 index 000000000..d0a526632 --- /dev/null +++ b/docs_src/frontend/tutorial003_py310.py @@ -0,0 +1,5 @@ +from fastapi import FastAPI + +app = FastAPI() + +app.frontend("/", directory="dist", fallback="404.html") diff --git a/docs_src/frontend/tutorial004_py310.py b/docs_src/frontend/tutorial004_py310.py new file mode 100644 index 000000000..647e92d10 --- /dev/null +++ b/docs_src/frontend/tutorial004_py310.py @@ -0,0 +1,7 @@ +from fastapi import APIRouter, FastAPI + +app = FastAPI() +router = APIRouter() + +router.frontend("/", directory="dist", fallback="index.html") +app.include_router(router, prefix="/app") diff --git a/docs_src/frontend/tutorial005_py310.py b/docs_src/frontend/tutorial005_py310.py new file mode 100644 index 000000000..a167824af --- /dev/null +++ b/docs_src/frontend/tutorial005_py310.py @@ -0,0 +1,5 @@ +from fastapi import FastAPI + +app = FastAPI() + +app.frontend("/", directory="dist", fallback=None) diff --git a/docs_src/frontend/tutorial006_py310.py b/docs_src/frontend/tutorial006_py310.py new file mode 100644 index 000000000..451d2416d --- /dev/null +++ b/docs_src/frontend/tutorial006_py310.py @@ -0,0 +1,5 @@ +from fastapi import FastAPI + +app = FastAPI() + +app.frontend("/", directory="dist", check_dir=False) diff --git a/fastapi/applications.py b/fastapi/applications.py index c7c551e4e..56e1a3e60 100644 --- a/fastapi/applications.py +++ b/fastapi/applications.py @@ -1,6 +1,7 @@ +import os from collections.abc import Awaitable, Callable, Coroutine, Sequence from enum import Enum -from typing import Annotated, Any, TypeVar +from typing import Annotated, Any, Literal, TypeVar from annotated_doc import Doc from fastapi import routing @@ -1218,6 +1219,79 @@ class FastAPI(Starlette): generate_unique_id_function=generate_unique_id_function, ) + def frontend( + self, + path: Annotated[ + str, + Doc( + """ + The URL path prefix where the frontend build should be served. + """ + ), + ], + *, + directory: Annotated[ + str | os.PathLike[str], + Doc( + """ + The directory containing the static frontend build output. + """ + ), + ], + fallback: Annotated[ + Literal["auto", "index.html", "404.html"] | None, + Doc( + """ + The fallback file behavior for missing frontend paths. + """ + ), + ] = "auto", + check_dir: Annotated[ + bool, + Doc( + """ + Check that the frontend directory exists when the app is created. + """ + ), + ] = True, + ) -> None: + """ + Serve a static frontend build as low-priority routes. + + Use this for frontend tools that build static files into a directory, + such as `dist`. **FastAPI** path operations are checked first, and + the frontend files are checked only if no normal route matched. + + A typical project could look like this: + + ```text + . + ├── pyproject.toml + ├── app + │ ├── __init__.py + │ └── main.py + └── dist + ├── index.html + └── assets + └── app.js + ``` + + Then in `app/main.py`: + + ```python + from fastapi import FastAPI + + app = FastAPI() + app.frontend("/", directory="dist") + ``` + """ + self.router.frontend( + path, + directory=directory, + fallback=fallback, + check_dir=check_dir, + ) + def api_route( self, path: str, diff --git a/fastapi/routing.py b/fastapi/routing.py index 4a55fda8a..bd6289b58 100644 --- a/fastapi/routing.py +++ b/fastapi/routing.py @@ -1,9 +1,12 @@ import contextlib import copy import email.message +import errno import functools import inspect import json +import os +import stat import types from collections.abc import ( AsyncIterator, @@ -28,6 +31,7 @@ from enum import Enum, IntEnum from typing import ( Annotated, Any, + Literal, Protocol, TypeVar, cast, @@ -80,22 +84,25 @@ from starlette import routing from starlette._exception_handler import wrap_app_handling_exceptions from starlette._utils import get_route_path, is_async_callable from starlette.concurrency import iterate_in_threadpool, run_in_threadpool -from starlette.datastructures import FormData, URLPath +from starlette.datastructures import URL, FormData, URLPath from starlette.exceptions import HTTPException from starlette.requests import Request from starlette.responses import ( JSONResponse, PlainTextResponse, + RedirectResponse, Response, StreamingResponse, ) from starlette.routing import ( BaseRoute, Match, + NoMatchFound, compile_path, get_name, ) from starlette.routing import Mount as Mount # noqa +from starlette.staticfiles import StaticFiles from starlette.types import AppType, ASGIApp, Lifespan, Receive, Scope, Send from starlette.websockets import WebSocket from typing_extensions import deprecated @@ -819,6 +826,7 @@ class APIWebSocketRoute(routing.WebSocketRoute): _FASTAPI_SCOPE_KEY = "fastapi" _FASTAPI_EFFECTIVE_ROUTE_CONTEXT_KEY = "effective_route_context" +_FASTAPI_FRONTEND_PATH_KEY = "frontend_path" _FASTAPI_INCLUDED_ROUTER_KEY = "included_router" _effective_route_context_var: ContextVar[Any | None] = ContextVar( "fastapi_effective_route_context", default=None @@ -826,12 +834,25 @@ _effective_route_context_var: ContextVar[Any | None] = ContextVar( _SCOPE_MISSING = object() +class _RouteWithPath(Protocol): + path: str + + def _get_fastapi_scope(scope: Scope) -> dict[str, Any]: fastapi_scope = scope.setdefault(_FASTAPI_SCOPE_KEY, {}) assert isinstance(fastapi_scope, dict) return fastapi_scope +def _update_scope(scope: Scope, child_scope: Scope) -> None: + fastapi_child_scope = child_scope.get(_FASTAPI_SCOPE_KEY) + for key, value in child_scope.items(): + if key != _FASTAPI_SCOPE_KEY: + scope[key] = value + if isinstance(fastapi_child_scope, dict): + _get_fastapi_scope(scope).update(fastapi_child_scope) + + def _get_scope_effective_route_context(scope: Scope) -> Any | None: return scope.get(_FASTAPI_SCOPE_KEY, {}).get(_FASTAPI_EFFECTIVE_ROUTE_CONTEXT_KEY) @@ -1305,9 +1326,7 @@ class _RouterIncludeContext: dependency_overrides_provider=self.dependency_overrides_provider, ) - def path_for( - self, route: APIRoute | routing.Route | routing.WebSocketRoute | routing.Mount - ) -> str: + def path_for(self, route: _RouteWithPath) -> str: return self.prefix + route.path @@ -1503,6 +1522,10 @@ class _IncludedRouter(BaseRoute): default_factory=list ) _effective_candidates_version: int | None = None + _effective_low_priority_routes: list["_EffectiveRouteContext"] = field( + default_factory=list + ) + _effective_low_priority_routes_version: int | None = None def effective_candidates(self) -> list["_EffectiveRouteContext | _IncludedRouter"]: routes_version = self.original_router._get_routes_version() @@ -1525,6 +1548,28 @@ class _IncludedRouter(BaseRoute): self._effective_candidates_version = routes_version return self._effective_candidates + def effective_low_priority_routes(self) -> list["_EffectiveRouteContext"]: + routes_version = self.original_router._get_routes_version() + if routes_version == self._effective_low_priority_routes_version: + return self._effective_low_priority_routes + self._effective_low_priority_routes = [] + for route in self.original_router._low_priority_routes: + route_context = self._build_effective_context(route) + if route_context is not None: + self._effective_low_priority_routes.append(route_context) + for route in self.original_router.routes: + if isinstance(route, _IncludedRouter): + child_context = self.include_context.combine(route.include_context) + child_branch = _IncludedRouter( + original_router=route.original_router, + include_context=child_context, + ) + self._effective_low_priority_routes.extend( + child_branch.effective_low_priority_routes() + ) + self._effective_low_priority_routes_version = routes_version + return self._effective_low_priority_routes + def _build_effective_context( self, route: BaseRoute ) -> _EffectiveRouteContext | None: @@ -1533,6 +1578,11 @@ class _IncludedRouter(BaseRoute): original_route=route, include_context=self.include_context, ) + if isinstance(route, _FrontendRouteGroup): + return _EffectiveRouteContext( + original_route=route, + starlette_route=route.with_prefix(self.include_context.prefix), + ) if isinstance(route, routing.Route): starlette_route: BaseRoute = routing.Route( self.include_context.path_for(route), @@ -1720,6 +1770,294 @@ def _iter_routes_with_context( yield route, None +def _normalize_frontend_path(path: str) -> str: + if not path: + raise AssertionError("A frontend path cannot be empty") + if not path.startswith("/"): + raise AssertionError("A frontend path must start with '/'") + if path != "/": + path = path.rstrip("/") + return path + + +def _join_frontend_paths(prefix: str, path: str) -> str: + if not prefix: + return path + if path == "/": + return prefix + return prefix + path + + +def _frontend_path_specificity(path: str) -> int: + if path == "/": + return 0 + return len(path) + + +def _get_resolved_absolute_path(path: str | os.PathLike[str]) -> str: + return os.path.realpath(os.fspath(path)) + + +class _FrontendStaticFiles(StaticFiles): + def __init__( + self, + *, + directory: str | os.PathLike[str], + fallback: Literal["auto", "index.html", "404.html"] | None, + check_dir: bool = True, + ) -> None: + self.fallback = fallback + if check_dir and not os.path.isdir(directory): + raise RuntimeError( + f"Frontend directory {directory!r} does not exist. " + f"Resolved absolute path: {_get_resolved_absolute_path(directory)!r}" + ) + super().__init__( + directory=directory, + html=True, + check_dir=check_dir, + follow_symlink=False, + ) + if check_dir and fallback in {"index.html", "404.html"}: + self._check_fallback_file(fallback) + + def _check_fallback_file(self, fallback: str) -> None: + _, stat_result = self.lookup_path(fallback) + if stat_result is None or not stat.S_ISREG(stat_result.st_mode): + raise RuntimeError( + f"Frontend fallback file '{fallback}' does not exist in " + f"directory '{self.directory}'. Resolved absolute directory: " + f"'{self._get_resolved_directory()}'" + ) + + def _get_resolved_directory(self) -> str: + assert self.directory is not None + return _get_resolved_absolute_path(self.directory) + + def get_path(self, scope: Scope) -> str: + path = _get_fastapi_scope(scope).get(_FASTAPI_FRONTEND_PATH_KEY, "") + assert isinstance(path, str) + return os.path.normpath(os.path.join(*path.split("/"))) + + async def get_response(self, path: str, scope: Scope) -> Response: + if scope["method"] not in ("GET", "HEAD"): + raise HTTPException(status_code=405) + + try: + full_path, stat_result = await run_in_threadpool(self.lookup_path, path) + except PermissionError: + raise HTTPException(status_code=401) from None + except OSError as exc: + if exc.errno == errno.ENAMETOOLONG: + raise HTTPException(status_code=404) from None + raise exc + except ValueError: + raise HTTPException(status_code=404) from None + + if stat_result and stat.S_ISREG(stat_result.st_mode): + return self.file_response(full_path, stat_result, scope) + + if stat_result and stat.S_ISDIR(stat_result.st_mode): + index_path = os.path.join(path, "index.html") + full_path, stat_result = await run_in_threadpool( + self.lookup_path, index_path + ) + if stat_result is not None and stat.S_ISREG(stat_result.st_mode): + if not scope["path"].endswith("/"): + url = URL(scope=scope) + url = url.replace(path=url.path + "/") + return RedirectResponse(url=url) + return self.file_response(full_path, stat_result, scope) + + if self.fallback == "404.html" or ( + self.fallback == "auto" and self._fallback_file_exists("404.html") + ): + return await self._fallback_response("404.html", scope, status_code=404) + + if ( + self.fallback == "index.html" + or (self.fallback == "auto" and self._fallback_file_exists("index.html")) + ) and _is_frontend_navigation_request(scope): + return await self._fallback_response("index.html", scope, status_code=200) + + raise HTTPException(status_code=404) + + def _fallback_file_exists(self, fallback: str) -> bool: + _, stat_result = self.lookup_path(fallback) + return stat_result is not None and stat.S_ISREG(stat_result.st_mode) + + async def _fallback_response( + self, fallback: str, scope: Scope, *, status_code: int + ) -> Response: + full_path, stat_result = await run_in_threadpool(self.lookup_path, fallback) + if stat_result is None or not stat.S_ISREG(stat_result.st_mode): + raise RuntimeError( + f"Frontend fallback file '{fallback}' does not exist in " + f"directory '{self.directory}'. Resolved absolute directory: " + f"'{self._get_resolved_directory()}'" + ) + return self.file_response( + full_path, stat_result, scope, status_code=status_code + ) + + +def _iter_accept_media_types(accept: str) -> Iterator[tuple[str, float]]: + for raw_value in accept.split(","): + message = email.message.Message() + message["content-type"] = raw_value.strip() + q = message.get_param("q") + quality = 1.0 + if isinstance(q, str): + try: + quality = float(q) + except ValueError: + pass + yield ( + f"{message.get_content_maintype()}/{message.get_content_subtype()}", + quality, + ) + + +def _is_frontend_navigation_request(scope: Scope) -> bool: + route_path = get_route_path(scope) + final_segment = route_path.rsplit("/", 1)[-1] + if os.path.splitext(final_segment)[1]: + return False + request = Request(scope) + wildcard_accepted = False + html_rejected = False + for media_type, quality in _iter_accept_media_types( + request.headers.get("accept", "") + ): + if media_type in {"text/html", "application/xhtml+xml"}: + if quality == 0: + html_rejected = True + else: + return True + elif media_type == "*/*" and quality != 0: + wildcard_accepted = True + return wildcard_accepted and not html_rejected + + +class _FrontendRoute(BaseRoute): + def __init__( + self, + path: str, + *, + directory: str | os.PathLike[str], + fallback: Literal["auto", "index.html", "404.html"] | None = "auto", + check_dir: bool = True, + ) -> None: + if fallback not in {"auto", "index.html", "404.html", None}: + raise AssertionError( + "fallback must be 'auto', 'index.html', '404.html', or None" + ) + self.path = _normalize_frontend_path(path) + self.methods = {"GET", "HEAD"} + self.app = _FrontendStaticFiles( + directory=directory, fallback=fallback, check_dir=check_dir + ) + + def with_path(self, path: str) -> "_FrontendRoute": + route = copy.copy(self) + route.path = _normalize_frontend_path(path) + return route + + def matches(self, scope: Scope) -> tuple[Match, Scope]: + if scope["type"] != "http": + return Match.NONE, {} + frontend_path = self._get_frontend_path(get_route_path(scope)) + if frontend_path is None: + return Match.NONE, {} + child_scope = {_FASTAPI_SCOPE_KEY: {_FASTAPI_FRONTEND_PATH_KEY: frontend_path}} + if scope["method"] not in self.methods: + return Match.PARTIAL, child_scope + return Match.FULL, child_scope + + def _get_frontend_path(self, route_path: str) -> str | None: + if self.path == "/": + return route_path.lstrip("/") + if route_path == self.path: + return "" + prefix = self.path + "/" + if route_path.startswith(prefix): + return route_path[len(prefix) :] + return None + + async def handle(self, scope: Scope, receive: Receive, send: Send) -> None: + await self.app(scope, receive, send) + + def url_path_for(self, name: str, /, **path_params: Any) -> URLPath: + raise NoMatchFound(name, path_params) + + +class _FrontendRouteGroup(BaseRoute): + def __init__(self) -> None: + self.routes: list[_FrontendRoute] = [] + + def add_frontend_route( + self, + path: str, + *, + directory: str | os.PathLike[str], + fallback: Literal["auto", "index.html", "404.html"] | None = "auto", + check_dir: bool = True, + ) -> None: + self.routes.append( + _FrontendRoute( + path, + directory=directory, + fallback=fallback, + check_dir=check_dir, + ) + ) + + def with_prefix(self, prefix: str) -> "_FrontendRouteGroup": + route_group = copy.copy(self) + route_group.routes = [ + route.with_path(_join_frontend_paths(prefix, route.path)) + for route in self.routes + ] + return route_group + + def matches(self, scope: Scope) -> tuple[Match, Scope]: + match, child_scope, _ = self._match(scope) + return match, child_scope + + def _match(self, scope: Scope) -> tuple[Match, Scope, _FrontendRoute | None]: + full: tuple[Scope, _FrontendRoute] | None = None + partial: tuple[Scope, _FrontendRoute] | None = None + for route in self.routes: + match, child_scope = route.matches(scope) + if match == Match.FULL: + if full is None or _frontend_path_specificity( + route.path + ) > _frontend_path_specificity(full[1].path): + full = (child_scope, route) + elif match == Match.PARTIAL: + if partial is None or _frontend_path_specificity( + route.path + ) > _frontend_path_specificity(partial[1].path): + partial = (child_scope, route) + if full is not None: + child_scope, route = full + return Match.FULL, child_scope, route + if partial is not None: + child_scope, route = partial + return Match.PARTIAL, child_scope, route + return Match.NONE, {}, None + + async def handle(self, scope: Scope, receive: Receive, send: Send) -> None: + match, child_scope, route = self._match(scope) + if match == Match.NONE or route is None: + raise HTTPException(status_code=404) + _update_scope(scope, child_scope) + await route.handle(scope, receive, send) + + def url_path_for(self, name: str, /, **path_params: Any) -> URLPath: + raise NoMatchFound(name, path_params) + + class APIRouter(routing.Router): """ `APIRouter` class, used to group *path operations*, for example to structure @@ -2032,6 +2370,8 @@ class APIRouter(routing.Router): self.generate_unique_id_function = generate_unique_id_function self.strict_content_type = strict_content_type self._routes_version = 0 + self._low_priority_routes: list[BaseRoute] = [] + self._frontend_routes: _FrontendRouteGroup | None = None def _mark_routes_changed(self) -> None: self._routes_version += 1 @@ -2093,6 +2433,150 @@ class APIRouter(routing.Router): super().add_websocket_route(path, endpoint, name=name) self._mark_routes_changed() + def frontend( + self, + path: Annotated[ + str, + Doc( + """ + The URL path prefix where the frontend build should be served. + """ + ), + ], + *, + directory: Annotated[ + str | os.PathLike[str], + Doc( + """ + The directory containing the static frontend build output. + """ + ), + ], + fallback: Annotated[ + Literal["auto", "index.html", "404.html"] | None, + Doc( + """ + The fallback file behavior for missing frontend paths. + """ + ), + ] = "auto", + check_dir: Annotated[ + bool, + Doc( + """ + Check that the frontend directory exists when the app is created. + """ + ), + ] = True, + ) -> None: + """ + Serve a static frontend build as low-priority routes. + + Use this for frontend tools that build static files into a directory, + such as `dist`. **FastAPI** path operations are checked first, and + the frontend files are checked only if no normal route matched. + + A typical project could look like this: + + ```text + . + ├── pyproject.toml + ├── app + │ ├── __init__.py + │ └── main.py + └── dist + ├── index.html + └── assets + └── app.js + ``` + + Then in `app/main.py`: + + ```python + from fastapi import APIRouter, FastAPI + + app = FastAPI() + router = APIRouter() + router.frontend("/", directory="dist") + app.include_router(router) + ``` + """ + normalized_path = _normalize_frontend_path(path) + if self._frontend_routes is None: + self._frontend_routes = _FrontendRouteGroup() + self._low_priority_routes.append(self._frontend_routes) + self._frontend_routes.add_frontend_route( + _join_frontend_paths(self.prefix, normalized_path), + directory=directory, + fallback=fallback, + check_dir=check_dir, + ) + self._mark_routes_changed() + + async def app(self, scope: Scope, receive: Receive, send: Send) -> None: + assert scope["type"] in ("http", "websocket", "lifespan") + + if "router" not in scope: + scope["router"] = self + + if scope["type"] == "lifespan": + await self.lifespan(scope, receive, send) + return + + partial: tuple[BaseRoute, Scope] | None = None + for route in self.routes: + match, child_scope = route.matches(scope) + if match == Match.FULL: + scope.update(child_scope) + await route.handle(scope, receive, send) + return + if match == Match.PARTIAL and partial is None: + partial = (route, child_scope) + + if partial is not None: + route, child_scope = partial + scope.update(child_scope) + await route.handle(scope, receive, send) + return + + route_path = get_route_path(scope) + if scope["type"] == "http" and self.redirect_slashes and route_path != "/": + redirect_scope = dict(scope) + if route_path.endswith("/"): + redirect_scope["path"] = redirect_scope["path"].rstrip("/") + else: + redirect_scope["path"] = redirect_scope["path"] + "/" + + for route in self.routes: + match, _ = route.matches(redirect_scope) + if match != Match.NONE: + redirect_url = URL(scope=redirect_scope) + response = RedirectResponse(url=str(redirect_url)) + await response(scope, receive, send) + return + + ( + low_priority_match, + low_priority_scope, + low_priority_route, + low_priority_context, + ) = self._match_low_priority(scope) + if low_priority_match != Match.NONE and low_priority_route is not None: + _update_scope(scope, low_priority_scope) + if low_priority_context is not None: + _get_fastapi_scope(scope)[_FASTAPI_EFFECTIVE_ROUTE_CONTEXT_KEY] = ( + low_priority_context + ) + original_route = low_priority_context.original_route + if isinstance(original_route, APIRoute): + scope["route"] = original_route + await original_route.handle(scope, receive, send) + return + await low_priority_route.handle(scope, receive, send) + return + + await self.default(scope, receive, send) + async def handle(self, scope: Scope, receive: Receive, send: Send) -> None: included_router = _get_scope_included_router(scope) if ( @@ -2113,6 +2597,60 @@ class APIRouter(routing.Router): return match, child_scope return Match.NONE, {} + def _iter_low_priority_routes( + self, + ) -> Iterator[BaseRoute | _EffectiveRouteContext]: + yield from self._low_priority_routes + for route in self.routes: + if isinstance(route, _IncludedRouter): + yield from route.effective_low_priority_routes() + + def _match_low_priority( + self, scope: Scope + ) -> tuple[Match, Scope, BaseRoute | None, _EffectiveRouteContext | None]: + full: tuple[Scope, BaseRoute, _EffectiveRouteContext | None] | None = None + partial: tuple[Scope, BaseRoute, _EffectiveRouteContext | None] | None = None + for candidate in self._iter_low_priority_routes(): + route: BaseRoute + if isinstance(candidate, _EffectiveRouteContext): + route_context: _EffectiveRouteContext | None = candidate + original_route = candidate.original_route + if isinstance(original_route, APIRoute): + fastapi_scope = _get_fastapi_scope(scope) + previous_context = fastapi_scope.get( + _FASTAPI_EFFECTIVE_ROUTE_CONTEXT_KEY, _SCOPE_MISSING + ) + fastapi_scope[_FASTAPI_EFFECTIVE_ROUTE_CONTEXT_KEY] = route_context + try: + match, child_scope = original_route.matches(scope) + finally: + _restore_fastapi_scope_key( + scope, + _FASTAPI_EFFECTIVE_ROUTE_CONTEXT_KEY, + previous_context, + ) + route = original_route + else: + match, child_scope = candidate.matches(scope) + route = candidate.starlette_route or original_route + else: + route_context = None + match, child_scope = candidate.matches(scope) + route = candidate + if match == Match.FULL: + if full is None: + full = (child_scope, route, route_context) + elif match == Match.PARTIAL: + if partial is None: + partial = (child_scope, route, route_context) + if full is not None: + child_scope, route, route_context = full + return Match.FULL, child_scope, route, route_context + if partial is not None: + child_scope, route, route_context = partial + return Match.PARTIAL, child_scope, route, route_context + return Match.NONE, {}, None, None + def route( self, path: str, diff --git a/tests/test_frontend.py b/tests/test_frontend.py new file mode 100644 index 000000000..12be8eaf2 --- /dev/null +++ b/tests/test_frontend.py @@ -0,0 +1,858 @@ +import errno +import os +import runpy +from pathlib import Path + +import anyio +import pytest +from fastapi import APIRouter, FastAPI, HTTPException, Request, WebSocket +from fastapi.testclient import TestClient +from starlette.exceptions import HTTPException as StarletteHTTPException +from starlette.responses import PlainTextResponse, Response +from starlette.routing import BaseRoute, Match, NoMatchFound, Route + + +def write_file(path: Path, content: str) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(content) + + +def test_frontend_exact_prefix_path_serves_index(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app") + app = FastAPI() + app.frontend("/app", directory=dist) + + response = TestClient(app).get("/app") + + assert response.status_code == 200 + assert response.text == "app" + + +def test_apirouter_frontend_with_router_prefix_and_frontend_subpath(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "asset.txt", "asset") + router = APIRouter(prefix="/internal") + router.frontend("/ui", directory=dist) + app = FastAPI() + app.include_router(router, prefix="/prefix") + + response = TestClient(app).get("/prefix/internal/ui/asset.txt") + + assert response.status_code == 200 + assert response.text == "asset" + + +def test_frontend_fallback_rejects_invalid_fallback(tmp_path: Path): + dist = tmp_path / "dist" + dist.mkdir() + app = FastAPI() + + with pytest.raises(AssertionError, match="fallback"): + app.frontend("/", directory=dist, fallback="invalid") # type: ignore[arg-type] # ty: ignore[invalid-argument-type] + + +def test_index_fallback_ignores_invalid_q_value(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app shell") + app = FastAPI() + app.frontend("/", directory=dist, fallback="index.html") + + response = TestClient(app).get( + "/dashboard/settings", headers={"accept": "text/html; q=wat"} + ) + + assert response.status_code == 200 + assert response.text == "app shell" + + +def test_frontend_static_files_lookup_errors(monkeypatch, tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app") + app = FastAPI() + app.frontend("/", directory=dist) + frontend_routes = app.router._frontend_routes + assert frontend_routes is not None + static_files = frontend_routes.routes[0].app + + def raise_permission_error(path: str): + raise PermissionError + + monkeypatch.setattr(static_files, "lookup_path", raise_permission_error) + response = TestClient(app).get("/asset.txt") + assert response.status_code == 401 + + def raise_value_error(path: str): + raise ValueError + + monkeypatch.setattr(static_files, "lookup_path", raise_value_error) + response = TestClient(app).get("/asset.txt") + assert response.status_code == 404 + + def raise_name_too_long(path: str): + raise OSError(errno.ENAMETOOLONG, "name too long") + + monkeypatch.setattr(static_files, "lookup_path", raise_name_too_long) + response = TestClient(app).get("/asset.txt") + assert response.status_code == 404 + + def raise_os_error(path: str): + raise OSError(5, "other") + + monkeypatch.setattr(static_files, "lookup_path", raise_os_error) + with pytest.raises(OSError): + TestClient(app).get("/asset.txt") + + +def test_frontend_route_group_helpers(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app") + app = FastAPI() + app.frontend("/", directory=dist) + route_group = app.router._frontend_routes + assert route_group is not None + + match, child_scope = route_group.matches({"type": "websocket", "path": "/"}) + assert match == Match.NONE + assert child_scope == {} + + with pytest.raises(StarletteHTTPException) as exc_info: + anyio.run( + route_group.with_prefix("/app").handle, + {"type": "http", "path": "/missing", "method": "GET"}, + None, + None, + ) + assert exc_info.value.status_code == 404 + + with pytest.raises(NoMatchFound): + route_group.url_path_for("frontend") + with pytest.raises(NoMatchFound): + route_group.routes[0].url_path_for("frontend") + + +def test_included_low_priority_routes_cache_is_reused(): + async def low_priority_endpoint(request: Request): + return PlainTextResponse("low") + + router = APIRouter() + router._low_priority_routes.append(Route("/low", low_priority_endpoint)) + router._mark_routes_changed() + app = FastAPI() + app.include_router(router, prefix="/prefix") + included_router = next( + route + for route in app.router.routes + if hasattr(route, "effective_low_priority_routes") + ) + + first = included_router.effective_low_priority_routes() # ty: ignore[call-non-callable] + second = included_router.effective_low_priority_routes() # ty: ignore[call-non-callable] + response = TestClient(app).get("/prefix/low") + + assert first is second + assert response.status_code == 200 + assert response.text == "low" + + +def test_low_priority_api_route_handles_with_context(): + app = FastAPI() + + async def endpoint(request: Request) -> Response: + return PlainTextResponse(request.scope["path_params"]["item_id"]) + + route = app.router.route_class("/low/{item_id}", endpoint=endpoint, methods=["GET"]) + app.router._low_priority_routes.append(route) + app.router._mark_routes_changed() + + response = TestClient(app).get("/low/abc") + + assert response.status_code == 200 + assert response.text == "abc" + + +def test_included_low_priority_api_route_handles_with_context(): + router = APIRouter() + + async def endpoint(request: Request) -> Response: + return PlainTextResponse(request.scope["path_params"]["item_id"]) + + route = router.route_class("/low/{item_id}", endpoint=endpoint, methods=["GET"]) + router._low_priority_routes.append(route) + router._mark_routes_changed() + app = FastAPI() + app.include_router(router, prefix="/prefix") + + response = TestClient(app).get("/prefix/low/abc") + + assert response.status_code == 200 + assert response.text == "abc" + + +def test_normal_route_partial_match_returns_before_frontend(tmp_path: Path): + class PartialRoute(BaseRoute): + def matches(self, scope): + return Match.PARTIAL, {} + + async def handle(self, scope, receive, send): + response = PlainTextResponse("partial", status_code=405) + await response(scope, receive, send) + + dist = tmp_path / "dist" + write_file(dist / "index.html", "frontend") + app = FastAPI() + app.router.routes.append(PartialRoute()) + app.frontend("/", directory=dist) + + response = TestClient(app).get("/anything") + + assert response.status_code == 405 + assert response.text == "partial" + + +def test_normal_route_partial_match_wins_before_frontend(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "api", "frontend") + app = FastAPI() + + @app.get("/api") + def read_api(): + return {"source": "api"} + + app.frontend("/", directory=dist) + + client = TestClient(app) + + response = client.get("/api") + assert response.status_code == 200 + assert response.json() == {"source": "api"} + + response = client.post("/api") + assert response.status_code == 405 + + +def test_basic_file_serving(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "assets" / "app.js", "console.log('ok')") + app = FastAPI() + app.frontend("/", directory=dist) + + response = TestClient(app).get("/assets/app.js") + + assert response.status_code == 200 + assert response.text == "console.log('ok')" + assert "etag" in response.headers + assert "last-modified" in response.headers + + +def test_existing_api_route_wins_over_frontend(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "api" / "users", "frontend") + app = FastAPI() + + @app.get("/api/users") + def read_users(): + return {"source": "api"} + + app.frontend("/", directory=dist) + + response = TestClient(app).get("/api/users") + + assert response.status_code == 200 + assert response.json() == {"source": "api"} + + +def test_api_route_404_is_not_replaced_by_frontend_fallback(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "frontend") + app = FastAPI() + + @app.get("/api/users") + def read_users(): + raise HTTPException(status_code=404, detail="api missing") + + app.frontend("/", directory=dist, fallback="index.html") + + response = TestClient(app).get("/api/users", headers={"accept": "text/html"}) + + assert response.status_code == 404 + assert response.json() == {"detail": "api missing"} + + +def test_index_fallback_for_navigation_request(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app shell") + app = FastAPI() + app.frontend("/", directory=dist, fallback="index.html") + + response = TestClient(app).get( + "/dashboard/settings", headers={"accept": "text/html"} + ) + + assert response.status_code == 200 + assert response.text == "app shell" + + +def test_index_fallback_parses_accept_parameters(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app shell") + app = FastAPI() + app.frontend("/", directory=dist, fallback="index.html") + + response = TestClient(app).get( + "/dashboard/settings", headers={"accept": "text/html; q=0.8"} + ) + + assert response.status_code == 200 + assert response.text == "app shell" + + +def test_index_fallback_ignores_q_zero_accept(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app shell") + app = FastAPI() + app.frontend("/", directory=dist, fallback="index.html") + + response = TestClient(app).get( + "/dashboard/settings", headers={"accept": "text/html; q=0.0"} + ) + + assert response.status_code == 404 + + +def test_index_fallback_respects_explicit_html_rejection_with_wildcard( + tmp_path: Path, +): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app shell") + app = FastAPI() + app.frontend("/", directory=dist, fallback="index.html") + + response = TestClient(app).get( + "/dashboard/settings", + headers={"accept": "text/html; q=0, */*; q=1"}, + ) + + assert response.status_code == 404 + + +def test_index_fallback_respects_explicit_xhtml_rejection_with_wildcard( + tmp_path: Path, +): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app shell") + app = FastAPI() + app.frontend("/", directory=dist, fallback="index.html") + + response = TestClient(app).get( + "/dashboard/settings", + headers={"accept": "application/xhtml+xml; q=0, */*; q=1"}, + ) + + assert response.status_code == 404 + + +@pytest.mark.parametrize( + ("path", "accept"), + [ + ("/assets/missing.js", "*/*"), + ("/assets/missing.css", "text/css"), + ("/assets/missing.png", "image/png"), + ("/api/missing", "application/json"), + ("/users/jane.doe", "text/html"), + ], +) +def test_index_fallback_does_not_handle_asset_like_or_non_html_requests( + tmp_path: Path, path: str, accept: str +): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app shell") + app = FastAPI() + app.frontend("/", directory=dist, fallback="index.html") + + response = TestClient(app).get(path, headers={"accept": accept}) + + assert response.status_code == 404 + assert response.text != "app shell" + + +def test_404_fallback_handles_missing_assets(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "404.html", "missing") + app = FastAPI() + app.frontend("/", directory=dist, fallback="404.html") + + response = TestClient(app).get("/assets/missing.js") + + assert response.status_code == 404 + assert response.text == "missing" + + +def test_auto_fallback_prefers_404_over_index(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app shell") + write_file(dist / "404.html", "missing") + app = FastAPI() + app.frontend("/", directory=dist) + + response = TestClient(app).get("/dashboard", headers={"accept": "text/html"}) + + assert response.status_code == 404 + assert response.text == "missing" + + +def test_auto_fallback_uses_index_when_404_is_missing(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app shell") + app = FastAPI() + app.frontend("/", directory=dist) + + response = TestClient(app).get("/dashboard", headers={"accept": "text/html"}) + + assert response.status_code == 200 + assert response.text == "app shell" + + +def test_auto_fallback_returns_normal_404_without_fallback_files(tmp_path: Path): + dist = tmp_path / "dist" + dist.mkdir() + app = FastAPI() + app.frontend("/", directory=dist) + + response = TestClient(app).get("/dashboard", headers={"accept": "text/html"}) + + assert response.status_code == 404 + assert response.json() == {"detail": "Not Found"} + + +def test_no_fallback_returns_normal_404(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app shell") + app = FastAPI() + app.frontend("/", directory=dist, fallback=None) + + response = TestClient(app).get("/dashboard", headers={"accept": "text/html"}) + + assert response.status_code == 404 + assert response.json() == {"detail": "Not Found"} + + +def test_directory_index_and_redirect(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "about" / "index.html", "about") + app = FastAPI() + app.frontend("/", directory=dist) + client = TestClient(app) + + redirect = client.get("/about", follow_redirects=False) + response = client.get("/about/") + + assert redirect.status_code == 307 + assert redirect.headers["location"] == "http://testserver/about/" + assert response.status_code == 200 + assert response.text == "about" + + +def test_path_validation_and_trailing_slash_normalization(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "asset.txt", "ok") + app = FastAPI() + + with pytest.raises(AssertionError): + app.frontend("", directory=dist) + with pytest.raises(AssertionError): + app.frontend("app", directory=dist) + + app.frontend("/app/", directory=dist) + response = TestClient(app).get("/app/asset.txt") + + assert response.status_code == 200 + assert response.text == "ok" + + +def test_frontend_path_matching_uses_segment_boundaries(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app") + app = FastAPI() + app.frontend("/app", directory=dist, fallback="index.html") + + response = TestClient(app).get("/application", headers={"accept": "text/html"}) + + assert response.status_code == 404 + + +def test_multiple_frontends_use_longest_matching_prefix(tmp_path: Path): + site = tmp_path / "site" + admin = tmp_path / "admin" + write_file(site / "index.html", "site") + write_file(admin / "index.html", "admin") + app = FastAPI() + app.frontend("/", directory=site, fallback="index.html") + app.frontend("/admin", directory=admin, fallback="index.html") + + response = TestClient(app).get("/admin/settings", headers={"accept": "text/html"}) + + assert response.status_code == 200 + assert response.text == "admin" + + +def test_apirouter_frontend_uses_include_prefix(tmp_path: Path): + dist = tmp_path / "admin" + write_file(dist / "index.html", "admin") + router = APIRouter() + router.frontend("/", directory=dist, fallback="index.html") + app = FastAPI() + app.include_router(router, prefix="/admin") + + response = TestClient(app).get("/admin/settings", headers={"accept": "text/html"}) + + assert response.status_code == 200 + assert response.text == "admin" + + +def test_global_priority_across_included_routers(tmp_path: Path): + dist = tmp_path / "site" + write_file(dist / "index.html", "site") + site_router = APIRouter() + site_router.frontend("/", directory=dist, fallback="index.html") + api_router = APIRouter() + + @api_router.get("/api/users") + def read_users(): + return {"source": "api"} + + app = FastAPI() + app.include_router(site_router) + app.include_router(api_router) + + response = TestClient(app).get("/api/users", headers={"accept": "text/html"}) + + assert response.status_code == 200 + assert response.json() == {"source": "api"} + + +def test_nested_apirouter_frontend_uses_all_include_prefixes(tmp_path: Path): + dist = tmp_path / "admin" + write_file(dist / "index.html", "admin") + child_router = APIRouter() + child_router.frontend("/", directory=dist, fallback="index.html") + parent_router = APIRouter() + parent_router.include_router(child_router, prefix="/child") + app = FastAPI() + app.include_router(parent_router, prefix="/parent") + + response = TestClient(app).get( + "/parent/child/settings", headers={"accept": "text/html"} + ) + + assert response.status_code == 200 + assert response.text == "admin" + + +def test_low_priority_cache_updates_after_route_added_to_included_router( + tmp_path: Path, +): + dist = tmp_path / "site" + write_file(dist / "index.html", "site") + router = APIRouter() + router.frontend("/", directory=dist, fallback="index.html") + app = FastAPI() + app.include_router(router, prefix="/app") + client = TestClient(app) + + frontend_response = client.get("/app/dashboard", headers={"accept": "text/html"}) + + @router.get("/dashboard") + def read_dashboard(): + return {"source": "api"} + + api_response = client.get("/app/dashboard", headers={"accept": "text/html"}) + + assert frontend_response.status_code == 200 + assert frontend_response.text == "site" + assert api_response.status_code == 200 + assert api_response.json() == {"source": "api"} + + +def test_normal_route_slash_redirect_wins_before_frontend_redirect(tmp_path: Path): + dist = tmp_path / "site" + write_file(dist / "api" / "index.html", "frontend") + app = FastAPI() + + @app.get("/api/") + def read_api(): + return {"source": "api"} + + app.frontend("/", directory=dist) + + response = TestClient(app).get("/api", follow_redirects=False) + + assert response.status_code == 307 + assert response.headers["location"] == "http://testserver/api/" + + followed = TestClient(app).get("/api/") + assert followed.status_code == 200 + assert followed.json() == {"source": "api"} + + +def test_frontend_respects_root_path(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "assets" / "app.js", "console.log('ok')") + app = FastAPI() + app.frontend("/app", directory=dist) + + response = TestClient(app, root_path="/proxy").get("/app/assets/app.js") + + assert response.status_code == 200 + assert response.text == "console.log('ok')" + + +def test_websocket_route_wins_over_frontend(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "ws", "frontend") + app = FastAPI() + + @app.websocket("/ws") + async def websocket_endpoint(websocket: WebSocket): + await websocket.accept() + await websocket.send_text("websocket") + await websocket.close() + + app.frontend("/", directory=dist) + + with TestClient(app).websocket_connect("/ws") as websocket: + data = websocket.receive_text() + + assert data == "websocket" + + +def test_head_requests_work(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "asset.txt", "ok") + app = FastAPI() + app.frontend("/", directory=dist) + + response = TestClient(app).head("/asset.txt") + + assert response.status_code == 200 + assert response.text == "" + assert response.headers["content-length"] == "2" + + +def test_unsupported_methods_return_405(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "asset.txt", "ok") + app = FastAPI() + app.frontend("/", directory=dist) + + response = TestClient(app).post("/asset.txt") + + assert response.status_code == 405 + + +@pytest.mark.parametrize( + "path", + [ + "/../secret.txt", + "/%2e%2e/secret.txt", + "/..%2fsecret.txt", + "/%5c..%5csecret.txt", + "/..%5csecret.txt", + ], +) +def test_path_traversal_cannot_escape_directory(tmp_path: Path, path: str): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app") + write_file(tmp_path / "secret.txt", "secret") + app = FastAPI() + app.frontend("/", directory=dist) + + response = TestClient(app).get(path) + + assert response.status_code == 404 + assert response.text != "secret" + + +def test_symlink_outside_directory_is_not_served(tmp_path: Path): + dist = tmp_path / "dist" + dist.mkdir() + outside = tmp_path / "secret.txt" + outside.write_text("secret") + link = dist / "secret.txt" + try: + os.symlink(outside, link) + except (OSError, NotImplementedError): # pragma: no cover + pytest.skip("symlinks are not supported") + app = FastAPI() + app.frontend("/", directory=dist) + + response = TestClient(app).get("/secret.txt") + + assert response.status_code == 404 + assert response.text != "secret" + + +def test_check_dir_true_fails_early_for_missing_directory(monkeypatch, tmp_path: Path): + app = FastAPI() + monkeypatch.chdir(tmp_path) + + with pytest.raises(RuntimeError, match="does not exist") as exc_info: + app.frontend("/", directory="missing") + + message = str(exc_info.value) + assert "'missing'" in message + assert str(tmp_path / "missing") in message + + +def test_check_dir_false_allows_missing_directory_and_fails_on_request(tmp_path: Path): + app = FastAPI() + app.frontend("/", directory=tmp_path / "missing", check_dir=False) + + with pytest.raises(RuntimeError, match="does not exist"): + TestClient(app).get("/asset.txt") + + +def test_explicit_fallback_files_fail_clearly_when_missing(monkeypatch, tmp_path: Path): + dist = tmp_path / "dist" + dist.mkdir() + monkeypatch.chdir(tmp_path) + app = FastAPI() + + with pytest.raises(RuntimeError, match="index.html") as exc_info: + app.frontend("/", directory="dist", fallback="index.html") + + message = str(exc_info.value) + assert "directory 'dist'" in message + assert str(dist) in message + + app = FastAPI() + app.frontend("/", directory="dist", fallback="404.html", check_dir=False) + + with pytest.raises(RuntimeError, match="404.html") as exc_info: + TestClient(app).get("/missing.js") + + message = str(exc_info.value) + assert "directory 'dist'" in message + assert str(dist) in message + + +def test_frontend_routes_are_not_in_openapi(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app") + app = FastAPI() + + @app.get("/api") + def read_api(): + return {"ok": True} + + app.frontend("/", directory=dist, fallback="index.html") + + schema = TestClient(app).get("/openapi.json").json() + + assert set(schema["paths"]) == {"/api"} + + response = TestClient(app).get("/api") + assert response.status_code == 200 + assert response.json() == {"ok": True} + + +@pytest.mark.parametrize( + ("example", "files", "path", "status_code", "body"), + [ + ( + "tutorial001_py310.py", + {"asset.txt": "asset"}, + "/asset.txt", + 200, + "asset", + ), + ( + "tutorial002_py310.py", + {"index.html": "index"}, + "/dashboard", + 200, + "index", + ), + ( + "tutorial003_py310.py", + {"404.html": "missing"}, + "/missing", + 404, + "missing", + ), + ( + "tutorial004_py310.py", + {"index.html": "index"}, + "/app/dashboard", + 200, + "index", + ), + ( + "tutorial005_py310.py", + {"index.html": "index"}, + "/dashboard", + 404, + '{"detail":"Not Found"}', + ), + ( + "tutorial006_py310.py", + {"asset.txt": "asset"}, + "/asset.txt", + 200, + "asset", + ), + ], +) +def test_docs_frontend_examples( + tmp_path: Path, + monkeypatch, + example: str, + files: dict[str, str], + path: str, + status_code: int, + body: str, +): + dist = tmp_path / "dist" + for file, content in files.items(): + write_file(dist / file, content) + monkeypatch.chdir(tmp_path) + + namespace = runpy.run_path( + str(Path(__file__).parents[1] / "docs_src" / "frontend" / example) + ) + + app = namespace["app"] + assert isinstance(app, FastAPI) + response = TestClient(app).get(path, headers={"accept": "text/html"}) + assert response.status_code == status_code + assert response.text == body + + +def test_low_priority_routes_can_store_non_frontend_routes(): + async def low_priority_endpoint(request): + return PlainTextResponse("low") + + app = FastAPI() + app.router._low_priority_routes.append(Route("/low", low_priority_endpoint)) + app.router._mark_routes_changed() + + response = TestClient(app).get("/low") + + assert response.status_code == 200 + assert response.text == "low" + + +def test_included_low_priority_routes_can_store_non_frontend_routes(): + async def low_priority_endpoint(request): + return PlainTextResponse("low") + + router = APIRouter() + router._low_priority_routes.append(Route("/low", low_priority_endpoint)) + router._mark_routes_changed() + app = FastAPI() + app.include_router(router, prefix="/prefix") + + response = TestClient(app).get("/prefix/low") + + assert response.status_code == 200 + assert response.text == "low" From e12833aaa2338d5ff31a71afb6b2d396ae18145f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 20 Jun 2026 00:21:10 +0000 Subject: [PATCH 199/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index ba7109455..a43af90c0 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,10 @@ hide: ## Latest Changes +### Features + +* ✹ Add support for `app.frontend("/", directory="dist")` and `router.frontend("/", directory="dist")`. PR [#15800](https://github.com/fastapi/fastapi/pull/15800) by [@tiangolo](https://github.com/tiangolo). + ### Docs * ✏ Fix grammar, typos, and broken links in docs. PR [#15694](https://github.com/fastapi/fastapi/pull/15694) by [@YuriiMotov](https://github.com/YuriiMotov). From 459a51097be8187115047149d77dab983a361fb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 20 Jun 2026 02:26:04 +0200 Subject: [PATCH 200/290] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Update=20white=20s?= =?UTF-8?q?pace=20characters=20in=20bigger=20apps=20(#15801)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/tutorial/bigger-applications.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/en/docs/tutorial/bigger-applications.md b/docs/en/docs/tutorial/bigger-applications.md index b0e1a9b73..07478b5cc 100644 --- a/docs/en/docs/tutorial/bigger-applications.md +++ b/docs/en/docs/tutorial/bigger-applications.md @@ -17,16 +17,16 @@ Let's say you have a file structure like this: ``` . ├── app -│   ├── __init__.py -│   ├── main.py -│   ├── dependencies.py -│   └── routers -│   │ ├── __init__.py -│   │ ├── items.py -│   │ └── users.py -│   └── internal -│   ├── __init__.py -│   └── admin.py +│ ├── __init__.py +│ ├── main.py +│ ├── dependencies.py +│ └── routers +│ │ ├── __init__.py +│ │ ├── items.py +│ │ └── users.py +│ └── internal +│ ├── __init__.py +│ └── admin.py ``` /// tip From 71e608e00e16c88c90bd5b6ffd04b5253a5b4133 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 20 Jun 2026 00:26:30 +0000 Subject: [PATCH 201/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a43af90c0..2f27a381d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -13,6 +13,7 @@ hide: ### Docs +* ✏ Update white space characters in bigger apps. PR [#15801](https://github.com/fastapi/fastapi/pull/15801) by [@tiangolo](https://github.com/tiangolo). * ✏ Fix grammar, typos, and broken links in docs. PR [#15694](https://github.com/fastapi/fastapi/pull/15694) by [@YuriiMotov](https://github.com/YuriiMotov). ### Translations From d176e00b9fb136ea8324c092c84528fdc3e16919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 20 Jun 2026 02:29:58 +0200 Subject: [PATCH 202/290] =?UTF-8?q?=F0=9F=93=9D=20Udpate=20release=20notes?= =?UTF-8?q?=20link=20(#15802)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 2f27a381d..537cb5fe9 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -10,6 +10,7 @@ hide: ### Features * ✹ Add support for `app.frontend("/", directory="dist")` and `router.frontend("/", directory="dist")`. PR [#15800](https://github.com/fastapi/fastapi/pull/15800) by [@tiangolo](https://github.com/tiangolo). + * Read the docs: [Frontend](https://fastapi.tiangolo.com/tutorial/frontend/). ### Docs From 9c7eceb00ff6e1d37980954418f7c9dab30a4cd5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 20 Jun 2026 00:30:21 +0000 Subject: [PATCH 203/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 537cb5fe9..4946e1cfd 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -14,6 +14,7 @@ hide: ### Docs +* 📝 Udpate release notes link. PR [#15802](https://github.com/fastapi/fastapi/pull/15802) by [@tiangolo](https://github.com/tiangolo). * ✏ Update white space characters in bigger apps. PR [#15801](https://github.com/fastapi/fastapi/pull/15801) by [@tiangolo](https://github.com/tiangolo). * ✏ Fix grammar, typos, and broken links in docs. PR [#15694](https://github.com/fastapi/fastapi/pull/15694) by [@YuriiMotov](https://github.com/YuriiMotov). From 7cb1ab6264bc03319832f553730b511192a0c0d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 20 Jun 2026 02:45:19 +0200 Subject: [PATCH 204/290] =?UTF-8?q?=F0=9F=91=B7=20Fix=20test-alls-green=20?= =?UTF-8?q?(#15803)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4bfec7501..d9c23cca0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -245,9 +245,10 @@ jobs: - run: uv run coverage report --fail-under=100 # https://github.com/marketplace/actions/alls-green#why - check: # This job does nothing and is only used for the branch protection + test-alls-green: # This job does nothing and is only used for the branch protection if: always() needs: + - test - coverage-combine - benchmark runs-on: ubuntu-latest From 0cd5001d0ef80a07e2d775c5c75522391a3e06d7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 20 Jun 2026 00:45:46 +0000 Subject: [PATCH 205/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 4946e1cfd..88c42b24d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Internal +* đŸ‘· Fix test-alls-green. PR [#15803](https://github.com/fastapi/fastapi/pull/15803) by [@tiangolo](https://github.com/tiangolo). * 🔧 Enable checking `release-notes.md` for typos. PR [#15796](https://github.com/fastapi/fastapi/pull/15796) by [@YuriiMotov](https://github.com/YuriiMotov). * 📝 Tweak wording about deploying to FastAPI Cloud. PR [#15793](https://github.com/fastapi/fastapi/pull/15793) by [@tiangolo](https://github.com/tiangolo). * 🔹 Use `gpt-5.5` model in `translate.py`, specify `-chat` to avoid warnings. PR [#15792](https://github.com/fastapi/fastapi/pull/15792) by [@YuriiMotov](https://github.com/YuriiMotov). From 2260afaf433103c8104b34d256cf0b96b058823b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 20 Jun 2026 02:51:31 +0200 Subject: [PATCH 206/290] =?UTF-8?q?=F0=9F=90=9B=20Fix=20failing=20test,=20?= =?UTF-8?q?update=20format=20for=20raised=20errors=20(#15804)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/routing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fastapi/routing.py b/fastapi/routing.py index bd6289b58..3a2d75422 100644 --- a/fastapi/routing.py +++ b/fastapi/routing.py @@ -1809,8 +1809,8 @@ class _FrontendStaticFiles(StaticFiles): self.fallback = fallback if check_dir and not os.path.isdir(directory): raise RuntimeError( - f"Frontend directory {directory!r} does not exist. " - f"Resolved absolute path: {_get_resolved_absolute_path(directory)!r}" + f"Frontend directory '{directory}' does not exist. " + f"Resolved absolute path: '{_get_resolved_absolute_path(directory)}'" ) super().__init__( directory=directory, From 17945e5ab7f25234340c152a40d232a98857e079 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 20 Jun 2026 00:51:57 +0000 Subject: [PATCH 207/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 88c42b24d..19cf3d668 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Internal +* 🐛 Fix failing test, update format for raised errors. PR [#15804](https://github.com/fastapi/fastapi/pull/15804) by [@tiangolo](https://github.com/tiangolo). * đŸ‘· Fix test-alls-green. PR [#15803](https://github.com/fastapi/fastapi/pull/15803) by [@tiangolo](https://github.com/tiangolo). * 🔧 Enable checking `release-notes.md` for typos. PR [#15796](https://github.com/fastapi/fastapi/pull/15796) by [@YuriiMotov](https://github.com/YuriiMotov). * 📝 Tweak wording about deploying to FastAPI Cloud. PR [#15793](https://github.com/fastapi/fastapi/pull/15793) by [@tiangolo](https://github.com/tiangolo). From 190f6e2033c8b886b25027be284d8c8c1893f28c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 20 Jun 2026 02:59:14 +0200 Subject: [PATCH 208/290] =?UTF-8?q?=F0=9F=93=9D=20Add=20Frontend=20instruc?= =?UTF-8?q?tions=20to=20Agent=20Library=20Skill=20(#15805)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/.agents/skills/fastapi/SKILL.md | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/fastapi/.agents/skills/fastapi/SKILL.md b/fastapi/.agents/skills/fastapi/SKILL.md index d5f32fa3c..f2ecd9eec 100644 --- a/fastapi/.agents/skills/fastapi/SKILL.md +++ b/fastapi/.agents/skills/fastapi/SKILL.md @@ -288,6 +288,32 @@ There could be exceptions, but try to follow this convention. Apply shared dependencies at the router level via `dependencies=[Depends(...)]`. +## Serve Frontend Apps + +Use `app.frontend()` to serve a built static frontend app, for example a directory generated by Vite, Astro, Angular, Svelte, Vue, or a similar tool. + +```python +from fastapi import FastAPI + +app = FastAPI() + +app.frontend("/", directory="dist") +``` + +Use `router.frontend()` when the frontend belongs to an `APIRouter`; normal router prefix behavior applies when the router is included. + +```python +from fastapi import APIRouter, FastAPI + +app = FastAPI() +router = APIRouter(prefix="/admin") + +router.frontend("/", directory="admin-dist") +app.include_router(router) +``` + +`app.frontend()` and `router.frontend()` are low-priority routes: regular API routes are matched first, then frontend files and client-side routing fallbacks. Use this for single-page apps and built frontend assets instead of mounting `StaticFiles` manually. + ## Dependency Injection See [the dependency injection reference](references/dependencies.md) for detailed patterns including `yield` with `scope`, and class dependencies. From 0303491b69ff84a4632c0314e6db4df74f2f93f9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 20 Jun 2026 00:59:37 +0000 Subject: [PATCH 209/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 19cf3d668..c026ca26f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -14,6 +14,7 @@ hide: ### Docs +* 📝 Add `app.frontend()` instructions to Agent Library Skill. PR [#15805](https://github.com/fastapi/fastapi/pull/15805) by [@tiangolo](https://github.com/tiangolo). * 📝 Udpate release notes link. PR [#15802](https://github.com/fastapi/fastapi/pull/15802) by [@tiangolo](https://github.com/tiangolo). * ✏ Update white space characters in bigger apps. PR [#15801](https://github.com/fastapi/fastapi/pull/15801) by [@tiangolo](https://github.com/tiangolo). * ✏ Fix grammar, typos, and broken links in docs. PR [#15694](https://github.com/fastapi/fastapi/pull/15694) by [@YuriiMotov](https://github.com/YuriiMotov). From 10393846ede7a2947cec594d15a43f813001cab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 20 Jun 2026 03:06:46 +0200 Subject: [PATCH 210/290] =?UTF-8?q?=F0=9F=93=9D=20Fix=20typo=20in=20releas?= =?UTF-8?q?e=20notes=20(#15807)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index c026ca26f..cd69d6c49 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,7 +15,7 @@ hide: ### Docs * 📝 Add `app.frontend()` instructions to Agent Library Skill. PR [#15805](https://github.com/fastapi/fastapi/pull/15805) by [@tiangolo](https://github.com/tiangolo). -* 📝 Udpate release notes link. PR [#15802](https://github.com/fastapi/fastapi/pull/15802) by [@tiangolo](https://github.com/tiangolo). +* 📝 Update release notes link. PR [#15802](https://github.com/fastapi/fastapi/pull/15802) by [@tiangolo](https://github.com/tiangolo). * ✏ Update white space characters in bigger apps. PR [#15801](https://github.com/fastapi/fastapi/pull/15801) by [@tiangolo](https://github.com/tiangolo). * ✏ Fix grammar, typos, and broken links in docs. PR [#15694](https://github.com/fastapi/fastapi/pull/15694) by [@YuriiMotov](https://github.com/YuriiMotov). From 041cb0cdfa2d0f705d14ed07c2c2e0f92ef5f32c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 20 Jun 2026 01:07:09 +0000 Subject: [PATCH 211/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index cd69d6c49..9470fee38 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -14,6 +14,7 @@ hide: ### Docs +* 📝 Fix typo in release notes. PR [#15807](https://github.com/fastapi/fastapi/pull/15807) by [@tiangolo](https://github.com/tiangolo). * 📝 Add `app.frontend()` instructions to Agent Library Skill. PR [#15805](https://github.com/fastapi/fastapi/pull/15805) by [@tiangolo](https://github.com/tiangolo). * 📝 Update release notes link. PR [#15802](https://github.com/fastapi/fastapi/pull/15802) by [@tiangolo](https://github.com/tiangolo). * ✏ Update white space characters in bigger apps. PR [#15801](https://github.com/fastapi/fastapi/pull/15801) by [@tiangolo](https://github.com/tiangolo). From 4b83b0d409009c8de9df4070fe163838b1a700c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 20 Jun 2026 03:14:30 +0200 Subject: [PATCH 212/290] =?UTF-8?q?=F0=9F=94=96=20Release=20version=200.13?= =?UTF-8?q?8.0=20(#15808)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/en/docs/release-notes.md | 2 ++ fastapi/__init__.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 9470fee38..2b57dfd9a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,8 @@ hide: ## Latest Changes +## 0.138.0 (2026-06-20) + ### Features * ✹ Add support for `app.frontend("/", directory="dist")` and `router.frontend("/", directory="dist")`. PR [#15800](https://github.com/fastapi/fastapi/pull/15800) by [@tiangolo](https://github.com/tiangolo). diff --git a/fastapi/__init__.py b/fastapi/__init__.py index 579fb169d..d7b99b5df 100644 --- a/fastapi/__init__.py +++ b/fastapi/__init__.py @@ -1,6 +1,6 @@ """FastAPI framework, high performance, easy to learn, fast to code, ready for production""" -__version__ = "0.137.2" +__version__ = "0.138.0" from starlette import status as status From d69774c23db11e12474d5237b832dc54fd12bffa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2026 18:31:07 +0200 Subject: [PATCH 213/290] =?UTF-8?q?=E2=AC=86=20Bump=20pydantic-settings=20?= =?UTF-8?q?from=202.14.1=20to=202.14.2=20(#15799)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Yurii Motov <109919500+YuriiMotov@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 84a513873..7d5e106ca 100644 --- a/uv.lock +++ b/uv.lock @@ -4103,16 +4103,16 @@ wheels = [ [[package]] name = "pydantic-settings" -version = "2.14.1" +version = "2.14.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/07/60/1d1e59c9c90d54591469ada7d268251f71c24bdb765f1a8a832cee8c6653/pydantic_settings-2.14.1.tar.gz", hash = "sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa", size = 235551, upload-time = "2026-05-08T13:40:06.542Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/b5/8f48e906c3e0205276e8bd8cb7512217a87b2685304d64be27cad5b3019f/pydantic_settings-2.14.2.tar.gz", hash = "sha256:c19dd64b19097f1de80184f0cc7b0272a13ae6e170cbf240a3e27e381ed14a5f", size = 237700, upload-time = "2026-06-19T13:44:56.324Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl", hash = "sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de", size = 60964, upload-time = "2026-05-08T13:40:04.958Z" }, + { url = "https://files.pythonhosted.org/packages/77/c1/6e422f34e569cf8e18df68d1939c81c099d2b61e4f7d9621c8a77560799c/pydantic_settings-2.14.2-py3-none-any.whl", hash = "sha256:a20c97b37910b6550d5ea50fbcc2d4187defe58cd57070b73863d069419c9440", size = 61715, upload-time = "2026-06-19T13:44:55.02Z" }, ] [[package]] From 0cb4a8e284b450abbccb71c543ad7757de46c0b2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 20 Jun 2026 16:31:34 +0000 Subject: [PATCH 214/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 2b57dfd9a..48b78e51d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,10 @@ hide: ## Latest Changes +### Internal + +* ⬆ Bump pydantic-settings from 2.14.1 to 2.14.2. PR [#15799](https://github.com/fastapi/fastapi/pull/15799) by [@dependabot[bot]](https://github.com/apps/dependabot). + ## 0.138.0 (2026-06-20) ### Features From 8f3db3d3e79465a97cbfd9ae47506aca67a58e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 21 Jun 2026 21:39:25 +0200 Subject: [PATCH 215/290] =?UTF-8?q?=F0=9F=94=92=EF=B8=8F=20Update=20zizmor?= =?UTF-8?q?=20workflow=20security=20checks=20(#15820)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/zizmor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml index f68ec5c4a..04c027a85 100644 --- a/.github/workflows/zizmor.yml +++ b/.github/workflows/zizmor.yml @@ -4,6 +4,7 @@ on: push: branches: - main + pull_request: workflow_dispatch: permissions: {} From a497a025e7114ca442478ed28da7e0a1cdc6177a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 21 Jun 2026 19:39:49 +0000 Subject: [PATCH 216/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 48b78e51d..948f45af9 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Internal +* đŸ”’ïž Update zizmor workflow security checks. PR [#15820](https://github.com/fastapi/fastapi/pull/15820) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump pydantic-settings from 2.14.1 to 2.14.2. PR [#15799](https://github.com/fastapi/fastapi/pull/15799) by [@dependabot[bot]](https://github.com/apps/dependabot). ## 0.138.0 (2026-06-20) From 29fc8f61660b52cb626190f865680364d0f32ff2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 23 Jun 2026 23:04:19 +0200 Subject: [PATCH 217/290] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20Add?= =?UTF-8?q?=20TestMu=20again=20(#15830)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/sponsors.yml | 3 +++ docs/en/docs/fastapi-people.md | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 66bc340a3..3d011ba12 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -53,3 +53,6 @@ bronze: # - url: https://testdriven.io/courses/tdd-fastapi/ # title: Learn to build high-quality web apps with best practices # img: /img/sponsors/testdriven.svg + - url: https://www.testmu.ai/?utm_source=fastapi&utm_medium=partner&utm_campaign=sponsor&utm_term=opensource&utm_content=webpage + title: TestMu AI. The Native AI-Agentic Cloud Platform to Supercharge Quality Engineering. + img: /img/sponsors/testmu.png diff --git a/docs/en/docs/fastapi-people.md b/docs/en/docs/fastapi-people.md index 4fc1b0b1d..e79928fb3 100644 --- a/docs/en/docs/fastapi-people.md +++ b/docs/en/docs/fastapi-people.md @@ -249,6 +249,16 @@ They are supporting my work with **FastAPI** (and others), mainly through [GitHu {% endfor %} {% endif %} + +{% if sponsors.bronze %} + +### Bronze Sponsors + +{% for sponsor in sponsors.bronze -%} + +{% endfor %} +{% endif %} + {% endif %} ### Individual Sponsors From 457f4c705c0287e49d7aa4ddec292db6185d16e3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 23 Jun 2026 21:04:44 +0000 Subject: [PATCH 218/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 948f45af9..2eed5c085 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Internal +* 🔧 Update sponsors: Add TestMu again. PR [#15830](https://github.com/fastapi/fastapi/pull/15830) by [@tiangolo](https://github.com/tiangolo). * đŸ”’ïž Update zizmor workflow security checks. PR [#15820](https://github.com/fastapi/fastapi/pull/15820) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump pydantic-settings from 2.14.1 to 2.14.2. PR [#15799](https://github.com/fastapi/fastapi/pull/15799) by [@dependabot[bot]](https://github.com/apps/dependabot). From fcc8e1f99431a0b381eaef03e07446e6975422b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 24 Jun 2026 01:15:12 +0200 Subject: [PATCH 219/290] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20issue-man?= =?UTF-8?q?ager=20to=200.7.0=20(#15831)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/issue-manager.yml | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/.github/workflows/issue-manager.yml b/.github/workflows/issue-manager.yml index fca3f1f2f..02bd18c33 100644 --- a/.github/workflows/issue-manager.yml +++ b/.github/workflows/issue-manager.yml @@ -29,29 +29,6 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: tiangolo/issue-manager@2fb3484ec9279485df8659e8ec73de262431737d # 0.6.0 + - uses: tiangolo/issue-manager@8505bda3fd28623a64d93935cbe13fa23f14fd8b # 0.7.0 with: token: ${{ secrets.GITHUB_TOKEN }} - config: > - { - "answered": { - "delay": 864000, - "message": "Assuming the original need was handled, this will be automatically closed now. But feel free to add more comments or create new issues or PRs." - }, - "waiting": { - "delay": 2628000, - "message": "As this PR has been waiting for the original user for a while but seems to be inactive, it's now going to be closed. But if there's anyone interested, feel free to create a new PR.", - "reminder": { - "before": "P3D", - "message": "Heads-up: this will be closed in 3 days unless there's new activity." - } - }, - "invalid": { - "delay": 0, - "message": "This was marked as invalid and will be closed now. If this is an error, please provide additional details." - }, - "maybe-ai": { - "delay": 0, - "message": "This was marked as potentially AI generated and will be closed now. If this is an error, please provide additional details, make sure to read the docs about contributing and AI." - } - } From 219ac634ab82b6321492ef97fb223b618ce13948 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 23 Jun 2026 23:16:31 +0000 Subject: [PATCH 220/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 2eed5c085..7e22ac560 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Internal +* âŹ†ïž Update issue-manager to 0.7.0. PR [#15831](https://github.com/fastapi/fastapi/pull/15831) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: Add TestMu again. PR [#15830](https://github.com/fastapi/fastapi/pull/15830) by [@tiangolo](https://github.com/tiangolo). * đŸ”’ïž Update zizmor workflow security checks. PR [#15820](https://github.com/fastapi/fastapi/pull/15820) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump pydantic-settings from 2.14.1 to 2.14.2. PR [#15799](https://github.com/fastapi/fastapi/pull/15799) by [@dependabot[bot]](https://github.com/apps/dependabot). From f6ea6b1f12e6d1a45c630a8fdf5d4c7c0959dad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 24 Jun 2026 14:23:58 +0200 Subject: [PATCH 221/290] =?UTF-8?q?=F0=9F=91=B7=20Update=20issue-manager?= =?UTF-8?q?=20to=200.7.1=20(#15833)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/issue-manager.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/issue-manager.yml b/.github/workflows/issue-manager.yml index 02bd18c33..bba089c6f 100644 --- a/.github/workflows/issue-manager.yml +++ b/.github/workflows/issue-manager.yml @@ -29,6 +29,6 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: tiangolo/issue-manager@8505bda3fd28623a64d93935cbe13fa23f14fd8b # 0.7.0 + - uses: tiangolo/issue-manager@75d60679db1ea348f6f6ea1d0e20de80a7c04645 # 0.7.1 with: token: ${{ secrets.GITHUB_TOKEN }} From 3f28dbe6d84cdac19bdb2b41e1664981e37359ab Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 24 Jun 2026 12:28:30 +0000 Subject: [PATCH 222/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7e22ac560..8993cf723 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Internal +* đŸ‘· Update issue-manager to 0.7.1. PR [#15833](https://github.com/fastapi/fastapi/pull/15833) by [@tiangolo](https://github.com/tiangolo). * âŹ†ïž Update issue-manager to 0.7.0. PR [#15831](https://github.com/fastapi/fastapi/pull/15831) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: Add TestMu again. PR [#15830](https://github.com/fastapi/fastapi/pull/15830) by [@tiangolo](https://github.com/tiangolo). * đŸ”’ïž Update zizmor workflow security checks. PR [#15820](https://github.com/fastapi/fastapi/pull/15820) by [@tiangolo](https://github.com/tiangolo). From 82c527e714f16bf9e07202aff0fb91cada329844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 25 Jun 2026 00:35:30 +0200 Subject: [PATCH 223/290] =?UTF-8?q?=F0=9F=91=B7=20Simplify=20pull=20reques?= =?UTF-8?q?t=20workflow=20triggers=20(#15836)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build-docs.yml | 4 ---- .github/workflows/pre-commit.yml | 4 ---- .github/workflows/test-redistribute.yml | 4 ---- .github/workflows/test.yml | 3 --- 4 files changed, 15 deletions(-) diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 20b054b80..0cf8d1262 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -4,10 +4,6 @@ on: branches: - master pull_request: - types: - - opened - - synchronize - permissions: {} jobs: diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index da966f523..915e3a883 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -2,10 +2,6 @@ name: pre-commit on: pull_request: - types: - - opened - - synchronize - permissions: {} env: diff --git a/.github/workflows/test-redistribute.yml b/.github/workflows/test-redistribute.yml index 1555a7643..47a2a8ae4 100644 --- a/.github/workflows/test-redistribute.yml +++ b/.github/workflows/test-redistribute.yml @@ -5,10 +5,6 @@ on: branches: - master pull_request: - types: - - opened - - synchronize - permissions: {} jobs: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d9c23cca0..18abb7482 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,9 +5,6 @@ on: branches: - master pull_request: - types: - - opened - - synchronize schedule: # cron every week on monday - cron: "0 0 * * 1" From d5494c1f01796350fa082cf8a82b124e95162e9d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 24 Jun 2026 22:37:31 +0000 Subject: [PATCH 224/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 8993cf723..642d103a5 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Internal +* đŸ‘· Simplify pull request workflow triggers. PR [#15836](https://github.com/fastapi/fastapi/pull/15836) by [@tiangolo](https://github.com/tiangolo). * đŸ‘· Update issue-manager to 0.7.1. PR [#15833](https://github.com/fastapi/fastapi/pull/15833) by [@tiangolo](https://github.com/tiangolo). * âŹ†ïž Update issue-manager to 0.7.0. PR [#15831](https://github.com/fastapi/fastapi/pull/15831) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: Add TestMu again. PR [#15830](https://github.com/fastapi/fastapi/pull/15830) by [@tiangolo](https://github.com/tiangolo). From 0af003a85da454dcf6b6783e0ad3f0dd687e944f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 25 Jun 2026 17:30:51 +0200 Subject: [PATCH 225/290] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor=20Library?= =?UTF-8?q?=20Skills,=20make=20info=20easier=20to=20find=20for=20agents=20?= =?UTF-8?q?(#15841)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/.agents/skills/fastapi/SKILL.md | 267 +++++------------- .../fastapi/references/path-operations.md | 93 ++++++ .../skills/fastapi/references/pydantic.md | 93 ++++++ .../skills/fastapi/references/responses.md | 79 ++++++ 4 files changed, 328 insertions(+), 204 deletions(-) create mode 100644 fastapi/.agents/skills/fastapi/references/path-operations.md create mode 100644 fastapi/.agents/skills/fastapi/references/pydantic.md create mode 100644 fastapi/.agents/skills/fastapi/references/responses.md diff --git a/fastapi/.agents/skills/fastapi/SKILL.md b/fastapi/.agents/skills/fastapi/SKILL.md index f2ecd9eec..fc35b97ed 100644 --- a/fastapi/.agents/skills/fastapi/SKILL.md +++ b/fastapi/.agents/skills/fastapi/SKILL.md @@ -1,12 +1,23 @@ --- name: fastapi -description: FastAPI best practices and conventions. Use when working with FastAPI APIs and Pydantic models for them. Keeps FastAPI code clean and up to date with the latest features and patterns, updated with new versions. Write new code or refactor and update old code. +description: FastAPI best practices and conventions. Use when working with FastAPI APIs, Pydantic models, dependencies, streaming responses including Server-Sent Events (SSE), and serving frontend apps. Keeps FastAPI code clean and up to date with the latest features and patterns. --- # FastAPI Official FastAPI skill to write code with best practices, keeping up to date with new versions and features. +## Quick Reference + +* Serve frontend apps: use `app.frontend()` or `router.frontend()` for built frontend assets; see [Serve Frontend Apps](#serve-frontend-apps). +* Server-Sent Events (SSE): use `response_class=EventSourceResponse` and `yield`; see [Streaming](#streaming-json-lines-sse-bytes) and [the streaming reference](references/streaming.md). +* JSON Lines and byte streaming: see [the streaming reference](references/streaming.md). +* Dependencies: use `Annotated[..., Depends(...)]`; see [Dependency Injection](#dependency-injection) and [the dependency injection reference](references/dependencies.md) for `yield`, scopes, and class dependencies. +* Response models: prefer return types; use `response_model` when the public response schema differs from the internal return value; see [the response reference](references/responses.md). +* Pydantic models: do not use ellipsis or `RootModel`; see [the Pydantic reference](references/pydantic.md). +* Routing: declare router-level prefix, tags, and shared dependencies on the `APIRouter`; see [the path operation reference](references/path-operations.md). +* Tooling and related libraries: use uv, Ruff, ty, Asyncer, SQLModel, and HTTPX when applicable; see [the other tools reference](references/other-tools.md). + ## Use the `fastapi` CLI Run the development server on localhost with reload: @@ -15,39 +26,28 @@ Run the development server on localhost with reload: fastapi dev ``` - Run the production server: ```bash fastapi run ``` -### Add an entrypoint in `pyproject.toml` - -FastAPI CLI will read the entrypoint in `pyproject.toml` to know where the FastAPI app is declared. +Prefer declaring the entrypoint in `pyproject.toml`: ```toml [tool.fastapi] entrypoint = "my_app.main:app" ``` -### Use `fastapi` with a path - -When adding the entrypoint to `pyproject.toml` is not possible, or the user explicitly asks not to, or it's running an independent small app, you can pass the app file path to the `fastapi` command: +When adding the entrypoint is not possible, or the user explicitly asks not to, pass the app file path: ```bash fastapi dev my_app/main.py ``` -Prefer to set the entrypoint in `pyproject.toml` when possible. - ## Use `Annotated` -Always prefer the `Annotated` style for parameter and dependency declarations. - -It keeps the function signatures working in other contexts, respects the types, allows reusability. - -### In Parameter Declarations +Always prefer the `Annotated` style for parameter and dependency declarations. It keeps function signatures working in other contexts, respects the types, and allows reusability. Use `Annotated` for parameter declarations, including `Path`, `Query`, `Header`, etc.: @@ -67,23 +67,7 @@ async def read_item( return {"message": "Hello World"} ``` -instead of: - -```python -# DO NOT DO THIS -@app.get("/items/{item_id}") -async def read_item( - item_id: int = Path(ge=1, description="The item ID"), - q: str | None = Query(default=None, max_length=50), -): - return {"message": "Hello World"} -``` - -### For Dependencies - -Use `Annotated` for dependencies with `Depends()`. - -Unless asked not to, create a new type alias for the dependency to allow re-using it. +Use `Annotated` for dependencies with `Depends()`. Unless asked not to, create a new type alias for the dependency to allow reusing it: ```python from typing import Annotated @@ -105,20 +89,9 @@ async def read_item(current_user: CurrentUserDep): return {"message": "Hello World"} ``` -instead of: - -```python -# DO NOT DO THIS -@app.get("/items/") -async def read_item(current_user: dict = Depends(get_current_user)): - return {"message": "Hello World"} -``` - ## Do not use Ellipsis for *path operations* or Pydantic models -Do not use `...` as a default value for required parameters, it's not needed and not recommended. - -Do this, without Ellipsis (`...`): +Do not use `...` as a default value for required parameters or model fields. It's not needed and not recommended. ```python from typing import Annotated @@ -126,6 +99,8 @@ from typing import Annotated from fastapi import FastAPI, Query from pydantic import BaseModel, Field +app = FastAPI() + class Item(BaseModel): name: str @@ -133,29 +108,12 @@ class Item(BaseModel): price: float = Field(gt=0) -app = FastAPI() - - @app.post("/items/") -async def create_item(item: Item, project_id: Annotated[int, Query()]): ... +async def create_item(item: Item, project_id: Annotated[int, Query()]): + return item ``` -instead of this: - -```python -# DO NOT DO THIS -class Item(BaseModel): - name: str = ... - description: str | None = None - price: float = Field(..., gt=0) - - -app = FastAPI() - - -@app.post("/items/") -async def create_item(item: Item, project_id: Annotated[int, Query(...)]): ... -``` +See [the Pydantic reference](references/pydantic.md) for more details. ## Return Type or Response Model @@ -178,62 +136,9 @@ async def get_item() -> Item: return Item(name="Plumbus", description="All-purpose home device") ``` -**Important**: Return types or response models are what filter data ensuring no sensitive information is exposed. And they are used to serialize data with Pydantic (in Rust), this is the main idea that can increase response performance. - -The return type doesn't have to be a Pydantic model, it could be a different type, like a list of integers, or a dict, etc. - -### When to use `response_model` instead - -If the return type is not the same as the type that you want to use to validate, filter, or serialize, use the `response_model` parameter on the decorator instead. - -```python -from typing import Any - -from fastapi import FastAPI -from pydantic import BaseModel - -app = FastAPI() - - -class Item(BaseModel): - name: str - description: str | None = None - - -@app.get("/items/me", response_model=Item) -async def get_item() -> Any: - return {"name": "Foo", "description": "A very nice Item"} -``` - -This can be particularly useful when filtering data to expose only the public fields and avoid exposing sensitive information. - -```python -from typing import Any - -from fastapi import FastAPI -from pydantic import BaseModel - -app = FastAPI() - - -class InternalItem(BaseModel): - name: str - description: str | None = None - secret_key: str - +Return types or response models filter data to avoid exposing sensitive information, and they let Pydantic serialize the data on the Rust side for performance. -class Item(BaseModel): - name: str - description: str | None = None - - -@app.get("/items/me", response_model=Item) -async def get_item() -> Any: - item = InternalItem( - name="Foo", description="A very nice Item", secret_key="supersecret" - ) - return item -``` +Use `response_model` when the type you return is not the same as the public schema you want to validate, filter, document, and serialize. See [the response reference](references/responses.md). ## Performance @@ -243,36 +148,23 @@ Instead, declare a return type or response model. Pydantic will handle the data ## Including Routers -When declaring routers, prefer to add router level parameters like prefix, tags, etc. to the router itself, instead of in `include_router()`. - -Do this: +When declaring routers, prefer to add router-level parameters like prefix, tags, and shared dependencies to the router itself instead of in `include_router()`. ```python -from fastapi import APIRouter, FastAPI +from fastapi import APIRouter, Depends, FastAPI app = FastAPI() -router = APIRouter(prefix="/items", tags=["items"]) - - -@router.get("/") -async def list_items(): - return [] - - -# In main.py -app.include_router(router) -``` - -instead of this: -```python -# DO NOT DO THIS -from fastapi import APIRouter, FastAPI +def get_current_user(): + return {"username": "johndoe"} -app = FastAPI() -router = APIRouter() +router = APIRouter( + prefix="/items", + tags=["items"], + dependencies=[Depends(get_current_user)], +) @router.get("/") @@ -280,13 +172,10 @@ async def list_items(): return [] -# In main.py -app.include_router(router, prefix="/items", tags=["items"]) +app.include_router(router) ``` -There could be exceptions, but try to follow this convention. - -Apply shared dependencies at the router level via `dependencies=[Depends(...)]`. +See [the path operation reference](references/path-operations.md) for more routing patterns. ## Serve Frontend Apps @@ -316,15 +205,15 @@ app.include_router(router) ## Dependency Injection -See [the dependency injection reference](references/dependencies.md) for detailed patterns including `yield` with `scope`, and class dependencies. - -Use dependencies when the logic can't be declared in Pydantic validation, depends on external resources, needs cleanup (with `yield`), or is shared across endpoints. +Use dependencies when the logic can't be declared in Pydantic validation, depends on external resources, needs cleanup with `yield`, or is shared across endpoints. Apply shared dependencies at the router level via `dependencies=[Depends(...)]`. +See [the dependency injection reference](references/dependencies.md) for detailed patterns including `yield` with `scope`, and class dependencies. + ## Async vs Sync *path operations* -Use `async` *path operations* only when fully certain that the logic called inside is compatible with async and await (it's called with `await`) or that it doesn't block. +Use `async` *path operations* only when fully certain that the logic called inside is compatible with async and await, and that it doesn't block. ```python from fastapi import FastAPI @@ -332,30 +221,44 @@ from fastapi import FastAPI app = FastAPI() -# Use async def when calling async code @app.get("/async-items/") async def read_async_items(): data = await some_async_library.fetch_items() return data -# Use plain def when calling blocking/sync code or when in doubt @app.get("/items/") def read_items(): data = some_blocking_library.fetch_items() return data ``` -In case of doubt, or by default, use regular `def` functions, those will be run in a threadpool so they don't block the event loop. +In case of doubt, or by default, use regular `def` functions. They will be run in a threadpool so they don't block the event loop. The same rules apply to dependencies. -The same rules apply to dependencies. - -Make sure blocking code is not run inside of `async` functions. The logic will work, but will damage the performance heavily. +Make sure blocking code is not run inside of `async` functions. The logic will work, but will damage performance heavily. When needing to mix blocking and async code, see Asyncer in [the other tools reference](references/other-tools.md). ## Streaming (JSON Lines, SSE, bytes) +To stream Server-Sent Events, use `response_class=EventSourceResponse` and `yield` items from the endpoint. + +```python +from collections.abc import AsyncIterable + +from fastapi import FastAPI +from fastapi.sse import EventSourceResponse, ServerSentEvent + +app = FastAPI() + + +@app.get("/events", response_class=EventSourceResponse) +async def stream_events() -> AsyncIterable[ServerSentEvent]: + yield ServerSentEvent(data={"status": "started"}, event="status", id="1") +``` + +Plain objects are automatically JSON-serialized as `data:` fields. Use `ServerSentEvent` for full control over SSE fields (`event`, `id`, `retry`, `comment`) and `raw_data` for pre-formatted strings. + See [the streaming reference](references/streaming.md) for JSON Lines, Server-Sent Events (`EventSourceResponse`, `ServerSentEvent`), and byte streaming (`StreamingResponse`) patterns. ## Tooling @@ -372,9 +275,7 @@ See [the other tools reference](references/other-tools.md) for details on other ## Do not use Pydantic RootModels -Do not use Pydantic `RootModel`, instead use regular type annotations with `Annotated` and Pydantic validation utilities. - -For example, for a list with validations you could do: +Do not use Pydantic `RootModel`; instead use regular type annotations with `Annotated` and Pydantic validation utilities. ```python from typing import Annotated @@ -390,35 +291,11 @@ async def create_items(items: Annotated[list[int], Field(min_length=1), Body()]) return items ``` -instead of: - -```python -# DO NOT DO THIS -from typing import Annotated - -from fastapi import FastAPI -from pydantic import Field, RootModel - -app = FastAPI() - - -class ItemList(RootModel[Annotated[list[int], Field(min_length=1)]]): - pass - - -@app.post("/items/") -async def create_items(items: ItemList): - return items - -``` - -FastAPI supports these type annotations and will create a Pydantic `TypeAdapter` for them, so that types can work as normally and there's no need for the custom logic and types in RootModels. +FastAPI supports these type annotations and will create a Pydantic `TypeAdapter` for them, so types work normally without custom wrapper models. See [the Pydantic reference](references/pydantic.md). ## Use one HTTP operation per function -Don't mix HTTP operations in a single function, having one function per HTTP operation helps separate concerns and organize the code. - -Do this: +Don't mix HTTP operations in a single function. Having one function per HTTP operation helps separate concerns and organize the code. ```python from fastapi import FastAPI @@ -441,22 +318,4 @@ async def create_item(item: Item): return item ``` -instead of this: - -```python -# DO NOT DO THIS -from fastapi import FastAPI, Request -from pydantic import BaseModel - -app = FastAPI() - - -class Item(BaseModel): - name: str - - -@app.api_route("/items/", methods=["GET", "POST"]) -async def handle_items(request: Request): - if request.method == "GET": - return [] -``` +See [the path operation reference](references/path-operations.md) for more examples. diff --git a/fastapi/.agents/skills/fastapi/references/path-operations.md b/fastapi/.agents/skills/fastapi/references/path-operations.md new file mode 100644 index 000000000..1292c1774 --- /dev/null +++ b/fastapi/.agents/skills/fastapi/references/path-operations.md @@ -0,0 +1,93 @@ +# Path Operations and Routing + +## Including Routers + +When declaring routers, prefer to add router-level parameters like prefix, tags, and shared dependencies to the router itself instead of in `include_router()`. + +Do this: + +```python +from fastapi import APIRouter, FastAPI + +app = FastAPI() + +router = APIRouter(prefix="/items", tags=["items"]) + + +@router.get("/") +async def list_items(): + return [] + + +app.include_router(router) +``` + +Instead of: + +```python +# DO NOT DO THIS +from fastapi import APIRouter, FastAPI + +app = FastAPI() + +router = APIRouter() + + +@router.get("/") +async def list_items(): + return [] + + +app.include_router(router, prefix="/items", tags=["items"]) +``` + +There could be exceptions, but try to follow this convention. + +Apply shared dependencies at the router level via `dependencies=[Depends(...)]`. + +## Use one HTTP operation per function + +Don't mix HTTP operations in a single function. Having one function per HTTP operation helps separate concerns and organize the code. + +Do this: + +```python +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + + +class Item(BaseModel): + name: str + + +@app.get("/items/") +async def list_items(): + return [] + + +@app.post("/items/") +async def create_item(item: Item): + return item +``` + +Instead of: + +```python +# DO NOT DO THIS +from fastapi import FastAPI, Request +from pydantic import BaseModel + +app = FastAPI() + + +class Item(BaseModel): + name: str + + +@app.api_route("/items/", methods=["GET", "POST"]) +async def handle_items(request: Request): + if request.method == "GET": + return [] +``` diff --git a/fastapi/.agents/skills/fastapi/references/pydantic.md b/fastapi/.agents/skills/fastapi/references/pydantic.md new file mode 100644 index 000000000..fadf99c1a --- /dev/null +++ b/fastapi/.agents/skills/fastapi/references/pydantic.md @@ -0,0 +1,93 @@ +# Pydantic + +## Do not use Ellipsis + +Do not use `...` as a default value for required parameters or model fields. It's not needed and not recommended. + +Do this, without Ellipsis (`...`): + +```python +from typing import Annotated + +from fastapi import FastAPI, Query +from pydantic import BaseModel, Field + +app = FastAPI() + + +class Item(BaseModel): + name: str + description: str | None = None + price: float = Field(gt=0) + + +@app.post("/items/") +async def create_item(item: Item, project_id: Annotated[int, Query()]): + return item +``` + +Instead of: + +```python +# DO NOT DO THIS +from typing import Annotated + +from fastapi import FastAPI, Query +from pydantic import BaseModel, Field + +app = FastAPI() + + +class Item(BaseModel): + name: str = ... + description: str | None = None + price: float = Field(..., gt=0) + + +@app.post("/items/") +async def create_item(item: Item, project_id: Annotated[int, Query(...)]): + return item +``` + +## Do not use Pydantic RootModels + +Do not use Pydantic `RootModel`; instead use regular type annotations with `Annotated` and Pydantic validation utilities. + +For example, for a list with validations: + +```python +from typing import Annotated + +from fastapi import Body, FastAPI +from pydantic import Field + +app = FastAPI() + + +@app.post("/items/") +async def create_items(items: Annotated[list[int], Field(min_length=1), Body()]): + return items +``` + +Instead of: + +```python +# DO NOT DO THIS +from typing import Annotated + +from fastapi import FastAPI +from pydantic import Field, RootModel + +app = FastAPI() + + +class ItemList(RootModel[Annotated[list[int], Field(min_length=1)]]): + pass + + +@app.post("/items/") +async def create_items(items: ItemList): + return items +``` + +FastAPI supports these type annotations and will create a Pydantic `TypeAdapter` for them, so types work normally without custom wrapper models. diff --git a/fastapi/.agents/skills/fastapi/references/responses.md b/fastapi/.agents/skills/fastapi/references/responses.md new file mode 100644 index 000000000..09081236a --- /dev/null +++ b/fastapi/.agents/skills/fastapi/references/responses.md @@ -0,0 +1,79 @@ +# Responses + +## Return Type or Response Model + +When possible, include a return type. It will be used to validate, filter, document, and serialize the response. + +```python +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + + +class Item(BaseModel): + name: str + description: str | None = None + + +@app.get("/items/me") +async def get_item() -> Item: + return Item(name="Plumbus", description="All-purpose home device") +``` + +Return types or response models filter data to avoid exposing sensitive information. They also let Pydantic serialize data on the Rust side for performance. + +The return type doesn't have to be a Pydantic model. It can be a different type, like a list of integers, a dict, etc. + +## When to use `response_model` + +If the return type is not the same as the type that you want to use to validate, filter, or serialize, use the `response_model` parameter on the decorator. + +```python +from typing import Any + +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + + +class Item(BaseModel): + name: str + description: str | None = None + + +@app.get("/items/me", response_model=Item) +async def get_item() -> Any: + return {"name": "Foo", "description": "A very nice Item"} +``` + +This is particularly useful when filtering data to expose only the public fields and avoid exposing sensitive information. + +```python +from typing import Any + +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + + +class InternalItem(BaseModel): + name: str + description: str | None = None + secret_key: str + + +class Item(BaseModel): + name: str + description: str | None = None + + +@app.get("/items/me", response_model=Item) +async def get_item() -> Any: + item = InternalItem( + name="Foo", description="A very nice Item", secret_key="supersecret" + ) + return item +``` From 1f2f3df4852bf7cb29be1187806d95a0fdc7ea40 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 25 Jun 2026 15:31:17 +0000 Subject: [PATCH 226/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 642d103a5..125481de7 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,10 @@ hide: ## Latest Changes +### Refactors + +* ♻ Refactor Library Skills, make info easier to find for agents. PR [#15841](https://github.com/fastapi/fastapi/pull/15841) by [@tiangolo](https://github.com/tiangolo). + ### Internal * đŸ‘· Simplify pull request workflow triggers. PR [#15836](https://github.com/fastapi/fastapi/pull/15836) by [@tiangolo](https://github.com/tiangolo). From b90c49aefad4958abdfbcacf9c2f816940a8f0e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 25 Jun 2026 17:38:29 +0200 Subject: [PATCH 227/290] =?UTF-8?q?=F0=9F=94=96=20Release=20version=200.13?= =?UTF-8?q?8.1=20(#15842)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/en/docs/release-notes.md | 2 ++ fastapi/__init__.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 125481de7..87286fe51 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,8 @@ hide: ## Latest Changes +## 0.138.1 (2026-06-25) + ### Refactors * ♻ Refactor Library Skills, make info easier to find for agents. PR [#15841](https://github.com/fastapi/fastapi/pull/15841) by [@tiangolo](https://github.com/tiangolo). diff --git a/fastapi/__init__.py b/fastapi/__init__.py index d7b99b5df..a61ac1bd7 100644 --- a/fastapi/__init__.py +++ b/fastapi/__init__.py @@ -1,6 +1,6 @@ """FastAPI framework, high performance, easy to learn, fast to code, ready for production""" -__version__ = "0.138.0" +__version__ = "0.138.1" from starlette import status as status From cba41585675ecb0e119d3ca258821659f07ec3f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 27 Jun 2026 14:47:35 +0200 Subject: [PATCH 228/290] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor=20how=20s?= =?UTF-8?q?ponsors=20data=20is=20handled=20for=20banners=20(#15852)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .pre-commit-config.yaml | 7 +++ docs/en/data/sponsors.yml | 11 ++++ docs/en/overrides/main.html | 49 +---------------- .../overrides/partials/banner-sponsors.html | 48 +++++++++++++++++ scripts/docs.py | 52 +++++++++++++++++++ 5 files changed, 119 insertions(+), 48 deletions(-) create mode 100644 docs/en/overrides/partials/banner-sponsors.html diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 22f8971e6..eb0762df5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -65,6 +65,13 @@ repos: files: ^docs/en/docs/index\.md|docs/en/data/sponsors\.yml|scripts/docs\.py$ pass_filenames: false + - id: render-banner-sponsors + language: unsupported + name: render sponsor banner partial + entry: uv run ./scripts/docs.py render-banner-sponsors + files: ^docs/en/data/sponsors\.yml|^docs/en/overrides/partials/banner-sponsors\.html|^scripts/docs\.py$ + pass_filenames: false + - id: update-languages language: unsupported name: update languages diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 3d011ba12..f9d4505f1 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -6,27 +6,38 @@ gold: - url: https://blockbee.io?ref=fastapi title: BlockBee Cryptocurrency Payment Gateway img: /img/sponsors/blockbee.png + banner_img: /img/sponsors/blockbee-banner.png - url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge title: Auth, user management and more for your B2B product img: /img/sponsors/propelauth.png + banner_url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=topbanner + banner_img: /img/sponsors/propelauth-banner.png - url: https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi title: Deploy & scale any full-stack web app on Render. Focus on building apps, not infra. img: /img/sponsors/render.svg + banner_img: /img/sponsors/render-banner.svg - url: https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi title: Cut Code Review Time & Bugs in Half with CodeRabbit img: /img/sponsors/coderabbit.png + banner_url: https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=banner&utm_campaign=fastapi + banner_img: /img/sponsors/coderabbit-banner.png - url: https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source title: The Gold Standard in Retail Account Linking img: /img/sponsors/subtotal.svg + banner_title: Making Retail Purchases Actionable for Brands and Developers + banner_img: /img/sponsors/subtotal-banner.svg - url: https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi title: Deploy enterprise applications at startup speed img: /img/sponsors/railway.png + banner_img: /img/sponsors/railway-banner.png - url: https://serpapi.com/?utm_source=fastapi_website title: "SerpApi: Web Search API" img: /img/sponsors/serpapi.png + banner_img: /img/sponsors/serpapi-banner.png - url: https://www.greptile.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=fastapi_sponsor_page title: "Greptile: The AI Code Reviewer" img: /img/sponsors/greptile.png + banner_img: /img/sponsors/greptile-banner.png silver: - url: https://databento.com/?utm_source=fastapi&utm_medium=sponsor&utm_content=display title: Pay as you go for market data diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index 4b0e81111..1905a6573 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -40,54 +40,7 @@
- - - - - - - - + {% include "partials/banner-sponsors.html" %}
{% endblock %} diff --git a/docs/en/overrides/partials/banner-sponsors.html b/docs/en/overrides/partials/banner-sponsors.html new file mode 100644 index 000000000..ae689ad89 --- /dev/null +++ b/docs/en/overrides/partials/banner-sponsors.html @@ -0,0 +1,48 @@ + + + + + + + + diff --git a/scripts/docs.py b/scripts/docs.py index 8e3d5e832..a108c8ddf 100644 --- a/scripts/docs.py +++ b/scripts/docs.py @@ -249,6 +249,7 @@ def stage_zensical_docs(lang: str) -> Path: encoding="utf-8", ) + render_banner_sponsors() shutil.copytree(en_docs_path / "data", lang_stage_path / "data") shutil.copytree(en_docs_path / "overrides", lang_stage_path / "overrides") @@ -461,6 +462,7 @@ def live() -> None: """ Serve the English docs with livereload from the source files. """ + render_banner_sponsors() subprocess.run( [ "zensical", @@ -508,6 +510,56 @@ def get_updated_config_content() -> dict[str, Any]: return config +banner_sponsors_template = """{% for sponsor in banner_sponsors -%} + +{% endfor %} +""" + + +def get_banner_sponsors(sponsors: dict[str, Any]) -> list[dict[str, str]]: + banner_sponsors: list[dict[str, str]] = [] + for sponsor in sponsors.get("gold", []): + banner_img = sponsor.get("banner_img") + if not banner_img: + continue + banner_sponsors.append( + { + "url": sponsor.get("banner_url", sponsor["url"]), + "title": sponsor.get("banner_title", sponsor["title"]), + "img": banner_img, + } + ) + return banner_sponsors + + +def render_banner_sponsors_partial() -> str: + sponsors_path = en_docs_path / "data" / "sponsors.yml" + sponsors = yaml.safe_load(sponsors_path.read_text(encoding="utf-8")) + template = Template(banner_sponsors_template) + return template.render(banner_sponsors=get_banner_sponsors(sponsors)) + + +@app.command() +def render_banner_sponsors() -> None: + """ + Render the sponsor banner partial from sponsors.yml. + """ + partial_path = en_docs_path / "overrides" / "partials" / "banner-sponsors.html" + old_content = partial_path.read_text("utf-8") if partial_path.is_file() else "" + new_content = render_banner_sponsors_partial() + if new_content != old_content: + print(f"{partial_path} outdated from the latest sponsors.yml") + print(f"Updating {partial_path}") + partial_path.write_text(new_content, encoding="utf-8") + raise typer.Exit(1) + print(f"{partial_path} is up to date ✅") + + @app.command() def ensure_non_translated() -> None: """ From 1929ac23195136e8616ed1b7c3fd84c65b26d234 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 27 Jun 2026 12:48:01 +0000 Subject: [PATCH 229/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 87286fe51..7232820f3 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,10 @@ hide: ## Latest Changes +### Internal + +* ♻ Refactor how sponsors data is handled for banners. PR [#15852](https://github.com/fastapi/fastapi/pull/15852) by [@tiangolo](https://github.com/tiangolo). + ## 0.138.1 (2026-06-25) ### Refactors From 403b1fa16f9519f4b5ab52413daae059479fae4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 29 Jun 2026 13:20:57 +0200 Subject: [PATCH 230/290] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20rem?= =?UTF-8?q?ove=20Stainless=20(#15862)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - docs/en/data/sponsors.yml | 3 --- docs/en/docs/advanced/generate-clients.md | 14 -------------- 3 files changed, 18 deletions(-) diff --git a/README.md b/README.md index fbf66a48b..03cd90e77 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,6 @@ The key features are: - diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index f9d4505f1..ae2c0f6e2 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -45,9 +45,6 @@ silver: - url: https://www.svix.com/ title: Svix - Webhooks as a service img: /img/sponsors/svix.svg - - url: https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral - title: Stainless | Generate best-in-class SDKs - img: /img/sponsors/stainless.png - url: https://www.permit.io/blog/implement-authorization-in-fastapi?utm_source=github&utm_medium=referral&utm_campaign=fastapi title: Fine-Grained Authorization for FastAPI img: /img/sponsors/permit.png diff --git a/docs/en/docs/advanced/generate-clients.md b/docs/en/docs/advanced/generate-clients.md index 7db45cc8a..67dfe736f 100644 --- a/docs/en/docs/advanced/generate-clients.md +++ b/docs/en/docs/advanced/generate-clients.md @@ -20,20 +20,6 @@ FastAPI automatically generates **OpenAPI 3.1** specifications, so any tool you /// -## SDK Generators from FastAPI Sponsors { #sdk-generators-from-fastapi-sponsors } - -This section highlights **venture-backed** and **company-supported** solutions from companies that sponsor FastAPI. These products provide **additional features** and **integrations** on top of high-quality generated SDKs. - -By ✹ [**sponsoring FastAPI**](https://github.com/sponsors/tiangolo) ✹, these companies help ensure the framework and its **ecosystem** remain healthy and **sustainable**. - -Their sponsorship also demonstrates a strong commitment to the FastAPI **community** (you), showing that they care not only about offering a **great service** but also about supporting a **robust and thriving framework**, FastAPI. 🙇 - -For example, you might want to try: - -* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) - -Some of these solutions may also be open source or offer free tiers, so you can try them without a financial commitment. Other commercial SDK generators are available and can be found online. đŸ€“ - ## Create a TypeScript SDK { #create-a-typescript-sdk } Let's start with a simple FastAPI application: From c2708d981729c96437dcc1d7cfa40cd15128bc60 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 29 Jun 2026 11:21:22 +0000 Subject: [PATCH 231/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7232820f3..73d86cfab 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Internal +* 🔧 Update sponsors: remove Stainless. PR [#15862](https://github.com/fastapi/fastapi/pull/15862) by [@tiangolo](https://github.com/tiangolo). * ♻ Refactor how sponsors data is handled for banners. PR [#15852](https://github.com/fastapi/fastapi/pull/15852) by [@tiangolo](https://github.com/tiangolo). ## 0.138.1 (2026-06-25) From b790e14cb686506df663959ac4879053cfed38db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 29 Jun 2026 13:57:59 +0200 Subject: [PATCH 232/290] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Make=20`app.fronte?= =?UTF-8?q?nd()`=20return=20404=20for=20methods=20other=20than=20`GET`=20o?= =?UTF-8?q?r=20`HEAD`=20with=20no=20static=20file=20matches=20(#15863)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/tutorial/frontend.md | 4 +- fastapi/routing.py | 62 ++++++++------ tests/test_frontend.py | 135 ++++++++++++++++++++++++++++++ 3 files changed, 175 insertions(+), 26 deletions(-) diff --git a/docs/en/docs/tutorial/frontend.md b/docs/en/docs/tutorial/frontend.md index 9f0bc0566..4cbc21fa1 100644 --- a/docs/en/docs/tutorial/frontend.md +++ b/docs/en/docs/tutorial/frontend.md @@ -52,7 +52,9 @@ For that, use `fallback="index.html"`: {* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} -**FastAPI** uses this fallback only for requests that look like browser navigation. Missing files like JavaScript, CSS, and images still return `404`. +**FastAPI** uses this fallback only for `GET` and `HEAD` requests that look like browser navigation. Missing files like JavaScript, CSS, and images still return `404`. + +Requests with other methods, like `POST` or `PUT`, to paths that only match the frontend fallback also return `404`. Regular **FastAPI** *path operations* still have higher priority than frontend routes. /// tip diff --git a/fastapi/routing.py b/fastapi/routing.py index 3a2d75422..e41ef6a59 100644 --- a/fastapi/routing.py +++ b/fastapi/routing.py @@ -1841,34 +1841,19 @@ class _FrontendStaticFiles(StaticFiles): async def get_response(self, path: str, scope: Scope) -> Response: if scope["method"] not in ("GET", "HEAD"): - raise HTTPException(status_code=405) - - try: - full_path, stat_result = await run_in_threadpool(self.lookup_path, path) - except PermissionError: - raise HTTPException(status_code=401) from None - except OSError as exc: - if exc.errno == errno.ENAMETOOLONG: - raise HTTPException(status_code=404) from None - raise exc - except ValueError: - raise HTTPException(status_code=404) from None + if await self._lookup_static_resource(path) is not None: + raise HTTPException(status_code=405) + raise HTTPException(status_code=404) - if stat_result and stat.S_ISREG(stat_result.st_mode): + static_resource = await self._lookup_static_resource(path) + if static_resource is not None: + full_path, stat_result, is_directory_index = static_resource + if is_directory_index and not scope["path"].endswith("/"): + url = URL(scope=scope) + url = url.replace(path=url.path + "/") + return RedirectResponse(url=url) return self.file_response(full_path, stat_result, scope) - if stat_result and stat.S_ISDIR(stat_result.st_mode): - index_path = os.path.join(path, "index.html") - full_path, stat_result = await run_in_threadpool( - self.lookup_path, index_path - ) - if stat_result is not None and stat.S_ISREG(stat_result.st_mode): - if not scope["path"].endswith("/"): - url = URL(scope=scope) - url = url.replace(path=url.path + "/") - return RedirectResponse(url=url) - return self.file_response(full_path, stat_result, scope) - if self.fallback == "404.html" or ( self.fallback == "auto" and self._fallback_file_exists("404.html") ): @@ -1882,6 +1867,33 @@ class _FrontendStaticFiles(StaticFiles): raise HTTPException(status_code=404) + async def _lookup_path(self, path: str) -> tuple[str, os.stat_result | None]: + try: + return await run_in_threadpool(self.lookup_path, path) + except PermissionError: + raise HTTPException(status_code=401) from None + except OSError as exc: + if exc.errno == errno.ENAMETOOLONG: + raise HTTPException(status_code=404) from None + raise exc + except ValueError: + raise HTTPException(status_code=404) from None + + async def _lookup_static_resource( + self, path: str + ) -> tuple[str, os.stat_result, bool] | None: + full_path, stat_result = await self._lookup_path(path) + if stat_result is None: + return None + if stat.S_ISREG(stat_result.st_mode): + return full_path, stat_result, False + if stat.S_ISDIR(stat_result.st_mode): + index_path = os.path.join(path, "index.html") + full_path, stat_result = await self._lookup_path(index_path) + if stat_result is not None and stat.S_ISREG(stat_result.st_mode): + return full_path, stat_result, True + return None + def _fallback_file_exists(self, fallback: str) -> bool: _, stat_result = self.lookup_path(fallback) return stat_result is not None and stat.S_ISREG(stat_result.st_mode) diff --git a/tests/test_frontend.py b/tests/test_frontend.py index 12be8eaf2..81cffc228 100644 --- a/tests/test_frontend.py +++ b/tests/test_frontend.py @@ -2,6 +2,7 @@ import errno import os import runpy from pathlib import Path +from typing import Literal import anyio import pytest @@ -639,6 +640,21 @@ def test_head_requests_work(tmp_path: Path): assert response.headers["content-length"] == "2" +def test_head_fallback_request_works(tmp_path: Path): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app shell") + app = FastAPI() + app.frontend("/", directory=dist, fallback="index.html") + + response = TestClient(app).head( + "/dashboard/settings", headers={"accept": "text/html"} + ) + + assert response.status_code == 200 + assert response.text == "" + assert response.headers["content-length"] == "9" + + def test_unsupported_methods_return_405(tmp_path: Path): dist = tmp_path / "dist" write_file(dist / "asset.txt", "ok") @@ -650,6 +666,125 @@ def test_unsupported_methods_return_405(tmp_path: Path): assert response.status_code == 405 +@pytest.mark.parametrize("method", ["POST", "PUT", "PATCH", "DELETE", "OPTIONS"]) +def test_unsupported_methods_to_fallback_only_routes_return_404( + tmp_path: Path, method: str +): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app shell") + app = FastAPI() + app.frontend("/", directory=dist, fallback="index.html") + + response = TestClient(app).request( + method, "/dashboard/settings", headers={"accept": "text/html"} + ) + + assert response.status_code == 404 + + +def test_unsupported_methods_to_frontend_root_and_directory_index_return_405( + tmp_path: Path, +): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app") + write_file(dist / "about" / "index.html", "about") + app = FastAPI() + app.frontend("/", directory=dist) + client = TestClient(app) + + root_response = client.post("/") + directory_response = client.post("/about/") + + assert root_response.status_code == 405 + assert directory_response.status_code == 405 + + +def test_unsupported_method_to_directory_without_index_returns_404(tmp_path: Path): + dist = tmp_path / "dist" + (dist / "empty").mkdir(parents=True) + write_file(dist / "index.html", "app") + app = FastAPI() + app.frontend("/", directory=dist) + + response = TestClient(app).post("/empty/") + + assert response.status_code == 404 + + +def test_unsupported_methods_to_fallback_only_routes_ignore_accept( + tmp_path: Path, +): + dist = tmp_path / "dist" + write_file(dist / "index.html", "app shell") + app = FastAPI() + app.frontend("/", directory=dist, fallback="index.html") + + response = TestClient(app).post( + "/dashboard/settings", headers={"accept": "application/json"} + ) + + assert response.status_code == 404 + + +@pytest.mark.parametrize( + ("fallback", "files"), + [ + ("404.html", {"404.html": "missing"}), + ("auto", {"index.html": "app shell"}), + (None, {"index.html": "app shell"}), + ], +) +def test_unsupported_methods_to_fallback_only_routes_return_404_for_fallback_modes( + tmp_path: Path, + fallback: Literal["auto", "index.html", "404.html"] | None, + files: dict[str, str], +): + dist = tmp_path / "dist" + for file, content in files.items(): + write_file(dist / file, content) + app = FastAPI() + app.frontend("/", directory=dist, fallback=fallback) + + response = TestClient(app).post( + "/dashboard/settings", headers={"accept": "text/html"} + ) + + assert response.status_code == 404 + + +def test_apirouter_frontend_unsupported_method_to_fallback_only_route_returns_404( + tmp_path: Path, +): + dist = tmp_path / "dist" + write_file(dist / "index.html", "admin") + router = APIRouter() + router.frontend("/", directory=dist, fallback="index.html") + app = FastAPI() + app.include_router(router, prefix="/admin") + + response = TestClient(app).post( + "/admin/client-route", headers={"accept": "text/html"} + ) + + assert response.status_code == 404 + + +def test_unsupported_method_uses_longest_matching_frontend_prefix(tmp_path: Path): + site = tmp_path / "site" + admin = tmp_path / "admin" + write_file(site / "admin" / "client-route", "site asset") + write_file(admin / "index.html", "admin") + app = FastAPI() + app.frontend("/", directory=site) + app.frontend("/admin", directory=admin, fallback="index.html") + + response = TestClient(app).post( + "/admin/client-route", headers={"accept": "text/html"} + ) + + assert response.status_code == 404 + + @pytest.mark.parametrize( "path", [ From 6466865eec63cb545869d80e2ee6fbc54c4d364e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 29 Jun 2026 11:58:23 +0000 Subject: [PATCH 233/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 73d86cfab..fb7f61bed 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,10 @@ hide: ## Latest Changes +### Refactors + +* ♻ Make `app.frontend()` return 404 for methods other than `GET` or `HEAD` with no static file matches. PR [#15863](https://github.com/fastapi/fastapi/pull/15863) by [@tiangolo](https://github.com/tiangolo). + ### Internal * 🔧 Update sponsors: remove Stainless. PR [#15862](https://github.com/fastapi/fastapi/pull/15862) by [@tiangolo](https://github.com/tiangolo). From 702fea83bb3ef0b558104835d7936af49650fb2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 29 Jun 2026 14:06:51 +0200 Subject: [PATCH 234/290] =?UTF-8?q?=F0=9F=94=96=20Release=20version=200.13?= =?UTF-8?q?8.2=20(#15864)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/en/docs/release-notes.md | 2 ++ fastapi/__init__.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index fb7f61bed..5e8528c9f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,8 @@ hide: ## Latest Changes +## 0.138.2 (2026-06-29) + ### Refactors * ♻ Make `app.frontend()` return 404 for methods other than `GET` or `HEAD` with no static file matches. PR [#15863](https://github.com/fastapi/fastapi/pull/15863) by [@tiangolo](https://github.com/tiangolo). diff --git a/fastapi/__init__.py b/fastapi/__init__.py index a61ac1bd7..af5117aec 100644 --- a/fastapi/__init__.py +++ b/fastapi/__init__.py @@ -1,6 +1,6 @@ """FastAPI framework, high performance, easy to learn, fast to code, ready for production""" -__version__ = "0.138.1" +__version__ = "0.138.2" from starlette import status as status From 4a298abff1d8c85c9d50e8f3600bb76b427b7f5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jun 2026 10:52:46 +0200 Subject: [PATCH 235/290] =?UTF-8?q?=E2=AC=86=20Bump=20CodSpeedHQ/action=20?= =?UTF-8?q?from=204.17.0=20to=204.17.5=20in=20the=20github-actions=20group?= =?UTF-8?q?=20(#15826)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 18abb7482..6870160de 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -191,7 +191,7 @@ jobs: - name: Install Dependencies run: uv sync --no-dev --group tests --extra all - name: CodSpeed benchmarks - uses: CodSpeedHQ/action@9d332c4d90b43981c3e55ae8e38e68709996240f # v4.17.0 + uses: CodSpeedHQ/action@c145068895e045cc725ee76fcd2307624b65c3af # v4.17.5 with: mode: simulation run: uv run --no-sync pytest tests/benchmarks --codspeed From a5d220ddbf49789f1d76d12e33b34b909ed4b019 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 30 Jun 2026 08:53:18 +0000 Subject: [PATCH 236/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 5e8528c9f..63477962c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,10 @@ hide: ## Latest Changes +### Internal + +* ⬆ Bump CodSpeedHQ/action from 4.17.0 to 4.17.5 in the github-actions group. PR [#15826](https://github.com/fastapi/fastapi/pull/15826) by [@dependabot[bot]](https://github.com/apps/dependabot). + ## 0.138.2 (2026-06-29) ### Refactors From 66a2ad87c17bae25e9e9cab44e285ba84b72734c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jun 2026 11:20:46 +0200 Subject: [PATCH 237/290] =?UTF-8?q?=E2=AC=86=20Bump=20the=20python-package?= =?UTF-8?q?s=20group=20across=201=20directory=20with=2010=20updates=20(#15?= =?UTF-8?q?870)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 237 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 119 insertions(+), 118 deletions(-) diff --git a/uv.lock b/uv.lock index 7d5e106ca..4fdc971ee 100644 --- a/uv.lock +++ b/uv.lock @@ -2160,15 +2160,15 @@ wheels = [ [[package]] name = "httpcore2" -version = "2.3.0" +version = "2.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "h11" }, { name = "truststore" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e6/34/18f1c596e677962f040284246f393b10a1f8ce440b3a7e69c637d0f1c7ad/httpcore2-2.3.0.tar.gz", hash = "sha256:07327e251560960eea8e969d92d4c6a325feb13cca39e25340731336c3baf924", size = 64300, upload-time = "2026-06-01T13:15:02.998Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/9b/2b1d1833a58236d1f6ee755e027a3917da0db59cc9708554cefc440ee8b6/httpcore2-2.4.0.tar.gz", hash = "sha256:3093a8ab8980d9f910b9cb4351df9186a0ad2350a6284a9107ac9a362a584422", size = 64618, upload-time = "2026-06-11T06:35:53.425Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/dd/3357218c69360d1cecc196c230c9a1d5c9afd5dba362056e23e60a5e64e5/httpcore2-2.3.0-py3-none-any.whl", hash = "sha256:477e9e334f74e5240dcac002e890580f36a57d40ff0fb14cc9655731d23b8415", size = 80024, upload-time = "2026-06-01T13:15:00.001Z" }, + { url = "https://files.pythonhosted.org/packages/7c/72/4fdf2306143a92a471fad9f3655aa542d43aa9188a7c9534e82c9aecf837/httpcore2-2.4.0-py3-none-any.whl", hash = "sha256:5218779da5d6e3c2013ac706121abfb3815d450e0613495c0de50264dce58242", size = 80151, upload-time = "2026-06-11T06:35:50.89Z" }, ] [[package]] @@ -2240,17 +2240,18 @@ wheels = [ [[package]] name = "httpx2" -version = "2.3.0" +version = "2.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "httpcore2" }, { name = "idna" }, { name = "truststore" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/9a/cca0b9145f13d8ae34b885ae28d403a1469a433abc78e0f94f4ce94e650b/httpx2-2.3.0.tar.gz", hash = "sha256:227e7c41d95a76d4077a52640564132777215fc3394e07b66a3116c33d668fa9", size = 81115, upload-time = "2026-06-01T13:15:04.324Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/60/b43ced4ccf26e95b396dbf67051d3e5042b645917d4da0469dd82a3bdd4f/httpx2-2.4.0.tar.gz", hash = "sha256:32e0734b61eb0824b3f56a9e98d6d92d381a3ef12c0045aa917ee63df6c411ef", size = 81691, upload-time = "2026-06-11T06:35:54.538Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/ce/ae2911859847f9ba1d6b23027e53481cbeb50b93234f355a968d300ca2cb/httpx2-2.3.0-py3-none-any.whl", hash = "sha256:6f393663bdf6dbe7fe90118e3eb5b2bd024a675cae0390ac08cec9198812d8b7", size = 74538, upload-time = "2026-06-01T13:15:01.566Z" }, + { url = "https://files.pythonhosted.org/packages/29/45/82bc57c3d9c3314f663b67cc057f1c017a6450685dde513f4f8db5cf431f/httpx2-2.4.0-py3-none-any.whl", hash = "sha256:425acd99297829599decf6701386dd84db3542597d36d3e2e4def930ecd57fd9", size = 74941, upload-time = "2026-06-11T06:35:52.235Z" }, ] [[package]] @@ -2276,11 +2277,11 @@ wheels = [ [[package]] name = "idna" -version = "3.15" +version = "3.18" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, ] [[package]] @@ -2306,7 +2307,7 @@ wheels = [ [[package]] name = "inline-snapshot" -version = "0.34.1" +version = "0.34.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asttokens" }, @@ -2316,9 +2317,9 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b8/2e/00c99468c7788bdb4f7d861bcfbfb091a5fe1bc475f9dd031f667c422a73/inline_snapshot-0.34.1.tar.gz", hash = "sha256:f8af37876c42069b7c0ed73f64357ace482955c3225ebcd27f243197ecfbcb65", size = 2638769, upload-time = "2026-06-05T16:58:47.921Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/c3/b5c36ab59e355b8d7c59205b8903fa74458c6938c9691f7d7730404f94c9/inline_snapshot-0.34.2.tar.gz", hash = "sha256:d160cb6059e00916c2e846abc014ead6f01fb24479f13696fb8670d7a7937f67", size = 2641142, upload-time = "2026-06-19T21:17:27.338Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/83/21747d0ee2276e973a2889e960f2ec904fbbe83fac6fecd8a57995bb81df/inline_snapshot-0.34.1-py3-none-any.whl", hash = "sha256:4c043215866dfdbe6a3ead92d9d0a9294720c7deebddc346dc781654cb19daa9", size = 90039, upload-time = "2026-06-05T16:58:46.038Z" }, + { url = "https://files.pythonhosted.org/packages/bb/2a/84fe7ef052ac666e95e7cabdf0905aa3f2c90b5a117419760b39b577602a/inline_snapshot-0.34.2-py3-none-any.whl", hash = "sha256:743a514a08ffd0d2d62878b0208d4def5041585affa7db6b89f0ca2e23552361", size = 90717, upload-time = "2026-06-19T21:17:25.629Z" }, ] [[package]] @@ -3546,26 +3547,26 @@ wheels = [ [[package]] name = "prek" -version = "0.4.4" +version = "0.4.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/13/3d71b3adbf385f7dc7fb6e16d6e25421fd8398b45d8f8410a328bf22bd3f/prek-0.4.4.tar.gz", hash = "sha256:4ec5771153d158a0e4473933b7fd9b51e1b1f57f2df50aeb7560ea6812226dc5", size = 470641, upload-time = "2026-06-04T07:26:07.199Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/65/23866f43521d31173879aa74bb3a2df50ab7f3f74cdb4eaa31b8f446c7ca/prek-0.4.5.tar.gz", hash = "sha256:2be7bcf839de19a0144ed5a5aadf73bc5899cf6823bb1c58cf1d45ae389c201a", size = 482566, upload-time = "2026-06-15T11:36:48.299Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/9f/68a577888edf7f2647a652b02899508ccd84e57ce1f79c51a44edfd308d7/prek-0.4.4-py3-none-linux_armv6l.whl", hash = "sha256:23cfd96a25de1c93e3c43c746643b80489e3b2fa49ca9c0ffd6022e51535c900", size = 5550271, upload-time = "2026-06-04T07:26:17.834Z" }, - { url = "https://files.pythonhosted.org/packages/35/b8/5427a0023116343a8d787b446536a7fddfa5db7eec7713dd05618da2bdfe/prek-0.4.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a427b792c4436f49732b1f6ebccf221fdcc6390c148474280da9c2c6eaabc9c4", size = 5910136, upload-time = "2026-06-04T07:26:20.616Z" }, - { url = "https://files.pythonhosted.org/packages/9d/4f/d751e90b7e768e472e054cd41cbe502589436ca9c1a13bfe4fa9513f9cde/prek-0.4.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b998038fc92c990e03147eb5b95b0f2c394517f8857ab911aac8e092f1b9b3ab", size = 5470124, upload-time = "2026-06-04T07:26:29.23Z" }, - { url = "https://files.pythonhosted.org/packages/c6/fe/e73241c5777b6f9b6b95132febbd27f9be9e89912e9e93c0982680593af2/prek-0.4.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:9cebca8c15da4f1d6e3a25e6ae0611425c8596e926222050f2588c390e42df8a", size = 5732725, upload-time = "2026-06-04T07:26:19.133Z" }, - { url = "https://files.pythonhosted.org/packages/ca/a3/329bd910e7e5d9d0eb5e571f3ba48023213744e78411afb81f5ef8356cab/prek-0.4.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8742ac26363e74c855df6215a709d5db183204d00ac0f1a722b13aed4da3cd0", size = 5457953, upload-time = "2026-06-04T07:26:23.41Z" }, - { url = "https://files.pythonhosted.org/packages/3d/f8/d642990513d9707398506bad45d39173d84266231f7d919899f694aefe2c/prek-0.4.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a2b7c8710546a1e894afa7ab022030cd4e21f1ee7ffb301b4360773d22f1f00f", size = 5860556, upload-time = "2026-06-04T07:26:11.692Z" }, - { url = "https://files.pythonhosted.org/packages/8d/17/a2e29cb278503a8c18612d8a62a15020648dc768e2e94bc4b4d4c9411e07/prek-0.4.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e02bd4d5e05c500e4d9f70f024e30d13aa361dc490724b7f476d2e35542c239f", size = 6652492, upload-time = "2026-06-04T07:26:09.962Z" }, - { url = "https://files.pythonhosted.org/packages/ab/10/ad3270b18135ee5d1af6f6cf4b0c8601b1cc2cb38d16e835081da820833a/prek-0.4.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f3a25041733de987a47e5a7bace47182a6f0e2ae5f960cb54c1d4630afd2591", size = 6113837, upload-time = "2026-06-04T07:26:24.873Z" }, - { url = "https://files.pythonhosted.org/packages/59/d9/e8c201b9b41c4561673cea01c630ab604df89d13e952f87dbcb807d32588/prek-0.4.4-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:0b04a0f36d07474f2a9fc5b1ba1197a1b326b2b211f39cd74cf0d4613545f7f4", size = 5729155, upload-time = "2026-06-04T07:26:26.194Z" }, - { url = "https://files.pythonhosted.org/packages/e8/cd/227b0494fcbc91e8fe15c2a4db9e6dfff95314ef38db3e40e6ea96db249d/prek-0.4.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:f032ccbe2d6edc345f81a6d772c18cc169d63c27b5a8292bfe416b352bdfee57", size = 5590775, upload-time = "2026-06-04T07:26:22.038Z" }, - { url = "https://files.pythonhosted.org/packages/cc/e0/9d750b9cf21ece884afdc15668d0f005a36588fe1b0bb5ff4a8112ab51cb/prek-0.4.4-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:bad3586fcea3e913f0edf2e8f132f97889e03976b7ee3d120fd294ad4e89a5eb", size = 5437864, upload-time = "2026-06-04T07:26:30.673Z" }, - { url = "https://files.pythonhosted.org/packages/3a/48/e2e5c0299590ad18a253c0ac09508b615baa1b382010c511186572f711d3/prek-0.4.4-py3-none-musllinux_1_1_i686.whl", hash = "sha256:4058638532c6dcbf0076d23b9264cbdd9f0f0e320762e237a6b9e4e4b854a766", size = 5718579, upload-time = "2026-06-04T07:26:27.786Z" }, - { url = "https://files.pythonhosted.org/packages/54/48/7fb3d4e7f664d1ce8ae35ec553872ffddf9fab4c5081735fdaae610b1e7c/prek-0.4.4-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:619bab14071670249777deea0cc0b29d904c4a514cf33b20e583900a544f0399", size = 6231622, upload-time = "2026-06-04T07:26:16.309Z" }, - { url = "https://files.pythonhosted.org/packages/46/c0/a4ddbf38034afe67cfa97c4bd81c86429ada098e7c323218d9f9fd061566/prek-0.4.4-py3-none-win32.whl", hash = "sha256:143154b329c05b2f9fa3230e604d02d9c4297dd43f96135a8ba166772e8ecd60", size = 5240317, upload-time = "2026-06-04T07:26:08.726Z" }, - { url = "https://files.pythonhosted.org/packages/bc/8c/fe97b5b095187bb2f93bbe406bccf108c879e5e4c83f165809b0d16ce0fb/prek-0.4.4-py3-none-win_amd64.whl", hash = "sha256:c38c5140ae2ea55ebb02e6ca590a416664ea1af287cdd21f54daeec53a81015a", size = 5626104, upload-time = "2026-06-04T07:26:14.81Z" }, - { url = "https://files.pythonhosted.org/packages/25/63/3586226d536796e65f8e725b531d6104e55caaa18659bdcb512661629586/prek-0.4.4-py3-none-win_arm64.whl", hash = "sha256:3efa28fb37b9ddbafb7759da8d497f0d36cf02a05816e15d6541f5669d5d2114", size = 5470399, upload-time = "2026-06-04T07:26:13.231Z" }, + { url = "https://files.pythonhosted.org/packages/f4/cb/a9eedf9a35ca6ec72f12af2b4392d7f757bb24863b7b7af4523f939cf3fa/prek-0.4.5-py3-none-linux_armv6l.whl", hash = "sha256:f7517774c72b001573520dc7111156779fd3e5b4452c11f09ff53c71a067e835", size = 5618105, upload-time = "2026-06-15T11:36:21.998Z" }, + { url = "https://files.pythonhosted.org/packages/30/a7/c96c06f17db7da0a57be2be4c229aa00b525bca8001c9c765663b339cbb7/prek-0.4.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aca9fa995536036a0171bcf7a4db96dc0a14f480054eda1d7d1c2e7739650993", size = 5972998, upload-time = "2026-06-15T11:36:41.12Z" }, + { url = "https://files.pythonhosted.org/packages/28/f1/721695355cdaa44be6f091e3a77fb9c72ed60289520f78b2f8c9a7197bdd/prek-0.4.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:66877ff21ae9d548f0f7e56fab8e65f1500a74a810e7749188c3f35a4a1b911b", size = 5525098, upload-time = "2026-06-15T11:36:30.127Z" }, + { url = "https://files.pythonhosted.org/packages/9b/1b/a334e1bb5361b49adf52b5ac7b6532018940f9f0f253437e8f43c3c1f7f3/prek-0.4.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:50697089a86a78d16f087c1912a2f3bc2bea82319a220fac52cc8e3ec9fc0426", size = 5793732, upload-time = "2026-06-15T11:36:35.745Z" }, + { url = "https://files.pythonhosted.org/packages/28/8c/aff94d276e91207a87cedff7cfefdd4aca20444137cca77bf53fffebe77a/prek-0.4.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:590427a42a3c1e5064487a0dc91167ae0c8a52168e77f574758ef9b138fcfd61", size = 5521719, upload-time = "2026-06-15T11:36:39.383Z" }, + { url = "https://files.pythonhosted.org/packages/4f/73/cfb0c5c909442050a8357e26233f7e511ba8e0d2f4b0bdc460065d62beb6/prek-0.4.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fd98b986767dafdb6b4305b563ee5a3a8f13bd3c78b98d708626815ea9f147f", size = 5922623, upload-time = "2026-06-15T11:36:18.063Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ad/ff9d26551ba80d190bd08c6341176a5d56d4e6de9c2ebf077793d4adbb78/prek-0.4.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fccd11613ae92619d1ecda0ab3359ceebeb38898909ec84a8d383733d12158cc", size = 6722071, upload-time = "2026-06-15T11:36:43.086Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/11d1dfd66c919953fe89ae2fdedd4f413ee923883043816d35982177bb75/prek-0.4.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14109d37b33e5529db41a3539d4f8f72d295f6eeddede3964994d898b8cec05c", size = 6176454, upload-time = "2026-06-15T11:36:33.803Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d4/9749f25c2e0ee5225f812457b888acef301e0ccce64bebcda2ac1d04abee/prek-0.4.5-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:40d262418105b2ede9836593a1927fc927cc8093c432e998640964102196996e", size = 5791133, upload-time = "2026-06-15T11:36:23.891Z" }, + { url = "https://files.pythonhosted.org/packages/c7/72/5e0344bab1eacf813a5b1b082cb4c6253930096166dad51c1cccee0a4f83/prek-0.4.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a586d14c3b852fdee1c3dcd0b9cb0915db9f9d054334b854fd9470bf68edf129", size = 5658098, upload-time = "2026-06-15T11:36:44.862Z" }, + { url = "https://files.pythonhosted.org/packages/be/a5/1f406e0362dd0f18ba09a562d50d7c04a70ac05d350b1ab6fba36ca3e9f0/prek-0.4.5-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:a8ed0d28f3e7790e4402a9324c386509066df6e67cc587f7406f9a245b97b7e8", size = 5498634, upload-time = "2026-06-15T11:36:31.828Z" }, + { url = "https://files.pythonhosted.org/packages/c7/df/b0cbf0fa527330188390b7b6c8d279cd5e509923262d0a6c5cc44bbdf103/prek-0.4.5-py3-none-musllinux_1_1_i686.whl", hash = "sha256:86f76bd3d2ecf6fd9034d75c62ff4c786eb11d0dd0a1f79bbb4343b023e12769", size = 5784840, upload-time = "2026-06-15T11:36:37.481Z" }, + { url = "https://files.pythonhosted.org/packages/9d/d7/977ee3c622c906677dd94187a00392ce2dd76035486b3a3b1b5a5267dd34/prek-0.4.5-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:e491a1a4641d91d8b03dcce5588397e76d2a5b432c9b0a6c70475972b4512ab4", size = 6300384, upload-time = "2026-06-15T11:36:27.602Z" }, + { url = "https://files.pythonhosted.org/packages/79/fa/43b1d761381dc1c7eeb8f2235c66e902970d4b2bff2dec0f02836c085769/prek-0.4.5-py3-none-win32.whl", hash = "sha256:7546989b2403c96137bd79d19ebfe21facb87266cefe819db2458c3b9b23f350", size = 5287935, upload-time = "2026-06-15T11:36:20.293Z" }, + { url = "https://files.pythonhosted.org/packages/f5/fe/59b5eb3124f5a4cc255a93857b9ab42402635b273f157e91de23bfa40e8f/prek-0.4.5-py3-none-win_amd64.whl", hash = "sha256:8b2ac9227504371d97338215b344184cb0b31ca94113515a3a90c509c6c5a707", size = 5682560, upload-time = "2026-06-15T11:36:25.865Z" }, + { url = "https://files.pythonhosted.org/packages/97/0e/589ff0eab9034909b1ec8654ee03483797305fb743b3554ce6140d82da9d/prek-0.4.5-py3-none-win_arm64.whl", hash = "sha256:646a86a1a082dbd99fed96314b1064f5644bb34c1f4037a63547a18e2160fb86", size = 5509019, upload-time = "2026-06-15T11:36:46.595Z" }, ] [[package]] @@ -3828,19 +3829,19 @@ email = [ [[package]] name = "pydantic-ai" -version = "1.106.0" +version = "1.107.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic-ai-slim", extra = ["ag-ui", "anthropic", "bedrock", "cli", "cohere", "evals", "fastmcp", "google", "groq", "huggingface", "logfire", "mcp", "mistral", "openai", "retries", "spec", "temporal", "ui", "vertexai", "xai"] }, ] -sdist = { url = "https://files.pythonhosted.org/packages/45/f1/6a0db6d336af199b436caa48d01ff63eeb6dbab14d5c50035ab5393a42f2/pydantic_ai-1.106.0.tar.gz", hash = "sha256:fb2b4bba143f924f2272926428ed173e456b00e0e5b3b125d7fd757f11b21fee", size = 18368, upload-time = "2026-06-05T01:29:06.762Z" } +sdist = { url = "https://files.pythonhosted.org/packages/17/71/7132293bc7ce791d8f3ee7f56b696b216a104bb30a08113f7b3db30a0c9a/pydantic_ai-1.107.0.tar.gz", hash = "sha256:254496d18451b2750a4dddc2591c6c42f25dd223d02ca4252812ab06e75f1044", size = 18414, upload-time = "2026-06-10T14:53:08.678Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/ca/bc39ecda2f1aa6544ec8559cfc50405462b241428ad06f77f44c776cdd39/pydantic_ai-1.106.0-py3-none-any.whl", hash = "sha256:c8c93979acab85b087dc3499e40249d5de4333f2212eb792c52a6c05c2448d69", size = 7589, upload-time = "2026-06-05T01:28:56.426Z" }, + { url = "https://files.pythonhosted.org/packages/65/38/db37ab59fced191a75babbbbe99470e512c91fe730b27d113e3280fdbe44/pydantic_ai-1.107.0-py3-none-any.whl", hash = "sha256:e031880b44ad7ce3836b2f6aa8ce2a0bd733cdb0b89a34adba647e96ddcba788", size = 7588, upload-time = "2026-06-10T14:53:00.57Z" }, ] [[package]] name = "pydantic-ai-slim" -version = "1.106.0" +version = "1.107.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, @@ -3852,9 +3853,9 @@ dependencies = [ { name = "pydantic-graph" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2b/45/2afc9100a7c370d8ac37bdfccfb54f46fc99da3bdce63f07c32c37807ebc/pydantic_ai_slim-1.106.0.tar.gz", hash = "sha256:e265598c8ee0e903ebb02d0494bb232be4cc8aa463ba1a55aa743cf34135dacf", size = 773504, upload-time = "2026-06-05T01:29:09.129Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/26/ced63dfaabbc77f3beb86d59689cdea748e7ccffb6b419dbaf4780f211e8/pydantic_ai_slim-1.107.0.tar.gz", hash = "sha256:4616f689a92fcfecfecf2a7af27aca22f139a873cf6d7a8929eaeee9c0eedbb4", size = 779902, upload-time = "2026-06-10T14:53:10.574Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/d9/a2785c576e3519a72a5bbc0e12027c542b265ef6eea1aa72b9c440ac2531/pydantic_ai_slim-1.106.0-py3-none-any.whl", hash = "sha256:0dd7a99ea3fa89b490098406c2240ba7d75c327eea094c3fd057dd7aa9f3d163", size = 957617, upload-time = "2026-06-05T01:28:59.979Z" }, + { url = "https://files.pythonhosted.org/packages/15/57/71044e17f931b08cc3930bc0fe5a1e1fd37fa474ae826be004729ef1cb4a/pydantic_ai_slim-1.107.0-py3-none-any.whl", hash = "sha256:1af49bbae06a6c598f72c54d4734ba377100cac493c9a05fa8e089bebeae0da6", size = 964046, upload-time = "2026-06-10T14:53:03.333Z" }, ] [package.optional-dependencies] @@ -4046,7 +4047,7 @@ wheels = [ [[package]] name = "pydantic-evals" -version = "1.106.0" +version = "1.107.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -4056,9 +4057,9 @@ dependencies = [ { name = "pyyaml" }, { name = "rich" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a4/d0/103e11d2c652980817ddcd874953437cf68d269e6893c9c4faa0b14f3568/pydantic_evals-1.106.0.tar.gz", hash = "sha256:ec870c2e93e2a34aea83468a7d7c21cba3e9dacf62f145eef2229d9fd71b2cac", size = 78539, upload-time = "2026-06-05T01:29:10.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/ad/f33306cf668d33cabce8af5e82b58ae367cc8422a2078c2df13327c13532/pydantic_evals-1.107.0.tar.gz", hash = "sha256:153378eda4847d48ca5e6b995e6221e5f0e4f4641771a1eed244fa2065923b27", size = 78546, upload-time = "2026-06-10T14:53:12.01Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/42/1319fdda0a120de24a544c9a76c2172005a3b53ac8e986ce149507694421/pydantic_evals-1.106.0-py3-none-any.whl", hash = "sha256:7994f8bebfac5e482fe62e5a5434b2e5f94118ca8bd766628635b84835118a78", size = 93528, upload-time = "2026-06-05T01:29:02.407Z" }, + { url = "https://files.pythonhosted.org/packages/23/ea/ecdaab037479f3b26c0efd47598f7caaad506fc53837196c1cf7e4701263/pydantic_evals-1.107.0-py3-none-any.whl", hash = "sha256:2df2f6deb82226f0404137ebecf9389c2270e08e30c066e239ae9090173826ec", size = 93586, upload-time = "2026-06-10T14:53:05.362Z" }, ] [[package]] @@ -4076,7 +4077,7 @@ wheels = [ [[package]] name = "pydantic-graph" -version = "1.106.0" +version = "1.107.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, @@ -4084,9 +4085,9 @@ dependencies = [ { name = "pydantic" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/9b/dd6826cf21eedd96a7482302be51ba6087095acbe828362135de2a505092/pydantic_graph-1.106.0.tar.gz", hash = "sha256:55afa33df4f699ed5c1185f81b6a06e2161958f1aa0c20742b2dae5745e84cce", size = 62567, upload-time = "2026-06-05T01:29:11.833Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/c3/6e8c2d13b8701041f1b3eac5deb41f25d4dbfa479a190d5c6becc23f2a49/pydantic_graph-1.107.0.tar.gz", hash = "sha256:278dd89b3e33f3a2963ac949f27a53aef705c5d883a8ce5d06d23e6e3cfbd972", size = 62564, upload-time = "2026-06-10T14:53:13.366Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/e9/0058f0b98f5992e715a0a50128f6c3cc7946cc242d471f6e850efdf03f0c/pydantic_graph-1.106.0-py3-none-any.whl", hash = "sha256:e6bb61aef0fdb49185a81142d311f94fc3315329345471d12cab85ab5845221f", size = 80099, upload-time = "2026-06-05T01:29:04.219Z" }, + { url = "https://files.pythonhosted.org/packages/fc/72/621556e3f5068400d43a0375d38e5963de30256eaa5a702aba12e82ed0ff/pydantic_graph-1.107.0-py3-none-any.whl", hash = "sha256:71add94fe7e14c703977a895117c475aae6c0b02a774a036c4d00d9a63c78b00", size = 80106, upload-time = "2026-06-10T14:53:06.543Z" }, ] [[package]] @@ -4228,7 +4229,7 @@ wheels = [ [[package]] name = "pytest" -version = "9.0.3" +version = "9.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -4239,9 +4240,9 @@ dependencies = [ { name = "pygments" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, ] [[package]] @@ -4970,27 +4971,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.16" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a6/bd/5f7ec371001337d8fa61701c186ff8b613ecac1651848c5950f4c4d5f2e9/ruff-0.15.16.tar.gz", hash = "sha256:d05e78d38c78caf020b03789e25106c93017db5a0cb6e2819885018c61343b78", size = 4714267, upload-time = "2026-06-04T16:33:09.974Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/42/53ef1c3953f157956db9bf7861e3bc50b9b887ce93300aa48cdba8336fe6/ruff-0.15.16-py3-none-linux_armv6l.whl", hash = "sha256:6ac3c0b3969cc6cf6b158c4e2f8f682acb58e7d700d8a44b65ecdc72d66ab0b2", size = 10709025, upload-time = "2026-06-04T16:32:51.935Z" }, - { url = "https://files.pythonhosted.org/packages/93/9a/a79159346f19134a956607754e57d8d128f7a4c00f4ad2f7514d224c172c/ruff-0.15.16-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:197c207ed75ffba54a0dec23db4aa939a27a3053073e085e0042433cbdc58e4a", size = 11063550, upload-time = "2026-06-04T16:32:42.24Z" }, - { url = "https://files.pythonhosted.org/packages/bc/72/3ce2ac000a5299ec238e01f51397b3b653c93b077d9b1bfe8715bb895f20/ruff-0.15.16-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3a39fec45ab316cc23e7558f23fea4a70403ddb5648ea9a4a3854a16973d0071", size = 10421345, upload-time = "2026-06-04T16:32:37.251Z" }, - { url = "https://files.pythonhosted.org/packages/b0/c2/cc7fad3ec9169373f5b6a18f1917b91080feec40c3f9658334a1d28e2f03/ruff-0.15.16-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba93191d79003116b95128c9d306e045200fdbd0bccb782b110f3cd1d4abc5cf", size = 10757217, upload-time = "2026-06-04T16:32:54.722Z" }, - { url = "https://files.pythonhosted.org/packages/69/d2/3474009eaa0a65b31fa7152a2fad5e2f050c640ceb1e6b02ee6922e94c82/ruff-0.15.16-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6ee4b90520630120ef032aa5cc10db483852dff950e78b1d717e2993a61ac8d", size = 10507035, upload-time = "2026-06-04T16:33:05.343Z" }, - { url = "https://files.pythonhosted.org/packages/ca/81/b7ae6ccbd11f0c8dc3d5d67fc4be9b57ff57ca86ba56152021378e1277f2/ruff-0.15.16-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e4215bc938bc3c8215c1472c1aa437e310fee20cd427335fec9d7e609563628", size = 11255291, upload-time = "2026-06-04T16:32:49.49Z" }, - { url = "https://files.pythonhosted.org/packages/d9/e1/46e526f1a7cc90857ce6ddf25fbb77eb6568651ac38d71b033af07076dd5/ruff-0.15.16-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c8d26be963b090f10e29abc8b3e74a2a321f6fa34e02424e30b5af89350ecbb", size = 12124922, upload-time = "2026-06-04T16:33:07.821Z" }, - { url = "https://files.pythonhosted.org/packages/1a/da/5c791b088b596b24d0deb967fa28ae02ad751a140c0b9ea81c5ab915d6c0/ruff-0.15.16-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f198cf4123602a2280ed46c307bcbafe41758d6fee5b456b6b6058ca1514b3b4", size = 11332186, upload-time = "2026-06-04T16:33:02.971Z" }, - { url = "https://files.pythonhosted.org/packages/72/11/5da87abe20047c8962361473923ebb2f62b595250126aadfad8c20649c1e/ruff-0.15.16-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb27515fa6240fb586ae82b901a59e67d24acff86f2190b433dc542fe0435aeb", size = 11373541, upload-time = "2026-06-04T16:32:47.007Z" }, - { url = "https://files.pythonhosted.org/packages/fe/2a/8554754c23a854ae3fd6b507e36ad61ddb121e298c6d5d617dec94ed0f14/ruff-0.15.16-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a267c46ba1593fc26b8eecbea050b39d40c0b6bb7781ee11c90a02cd10032951", size = 11353014, upload-time = "2026-06-04T16:32:34.795Z" }, - { url = "https://files.pythonhosted.org/packages/62/25/62ea41529ec89f742ea3fed9cb1059c72877ec7cf9b9e99ac9cf3294d1d9/ruff-0.15.16-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:528c68f39a91498a8d50e91ff5985df3d105782bab49cc378e73ac26bff083e8", size = 10737467, upload-time = "2026-06-04T16:32:26.348Z" }, - { url = "https://files.pythonhosted.org/packages/90/17/334d3ad9de4d40f9dd58fdd09e35ce64553bb501e2f19a839e2fb6be14fc/ruff-0.15.16-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7ed55c58950df60589a9a7a5d2f8fa5f54ebd287163be805adfe6ee95a9de123", size = 10521910, upload-time = "2026-06-04T16:32:32.54Z" }, - { url = "https://files.pythonhosted.org/packages/4d/bd/3ac7c6ae77a885c1004b3dda2446ea401768d24f851c14b4ad4b24f6639c/ruff-0.15.16-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d482feaf51512b50f9790ceb417a56a61dd1e9d9bf967662b9ed27c01b34f53a", size = 10979190, upload-time = "2026-06-04T16:32:57.492Z" }, - { url = "https://files.pythonhosted.org/packages/33/d7/609546e6a413c3f216fbf2a50c928f97c80939154f6a0503114094a86191/ruff-0.15.16-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1e15bc8c94513dae2a40cc9ef07c94fdd4ecc9e29dabebeebe170f952322c9e3", size = 11477014, upload-time = "2026-06-04T16:32:44.687Z" }, - { url = "https://files.pythonhosted.org/packages/74/0d/f2cd247ad32633a5c36e97141a2c21b11c6279f7957bc2ff360b1e08fddd/ruff-0.15.16-py3-none-win32.whl", hash = "sha256:580378f7bd4aa25f72e74aa54948a9622f142b1e509521dd10902e886681cc1e", size = 10735541, upload-time = "2026-06-04T16:32:30.145Z" }, - { url = "https://files.pythonhosted.org/packages/8b/9e/02e845ef151b1dee585e55c4739f8e1734ae1d9f1221dff65761c162208b/ruff-0.15.16-py3-none-win_amd64.whl", hash = "sha256:408256017284eddf98fff77b29aa4fb30f586042d535b2d9befc6512f400aaec", size = 11843403, upload-time = "2026-06-04T16:32:39.76Z" }, - { url = "https://files.pythonhosted.org/packages/15/19/016553f86f207450aebebc2b2b5088d086b901cc8186c02ac4284db3bd88/ruff-0.15.16-py3-none-win_arm64.whl", hash = "sha256:8cd61783afb39638a7133ef0d2dfb1e91277593962f81b5a8423eb0b888a6121", size = 11134555, upload-time = "2026-06-04T16:33:00.136Z" }, +version = "0.15.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/74/98/1295ad5a5aa9bc85bdcdfa5d82fe7b49c61af5657df4f227637ff9de0da6/ruff-0.15.18.tar.gz", hash = "sha256:2698a964c70e8bf402dcb99c8810472d270d141e7aa8c4e13599fd52033a2f33", size = 4761437, upload-time = "2026-06-18T18:25:39.224Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/d0/686e984941269621e2be72612d5c1e461f8f7b38415a2a7d7a81c8ae6715/ruff-0.15.18-py3-none-linux_armv6l.whl", hash = "sha256:8b6850172348c8381b8b3084c5915a4393c2373b9b54cd5b5e1ea15812bc10df", size = 10887308, upload-time = "2026-06-18T18:25:03.062Z" }, + { url = "https://files.pythonhosted.org/packages/ed/21/bc4123e3f5515ee99f8ce1eb93a14a0628fe4d1678663cd08f933ac16931/ruff-0.15.18-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3fccc153a85417dcd976883160cacce486997b0a0058dd18f54b8aaaac7d1ce2", size = 11281305, upload-time = "2026-06-18T18:25:30.026Z" }, + { url = "https://files.pythonhosted.org/packages/51/93/4769464c25cf7ab2acb3c7dda9cad3d867eb41c59565b3e2a9d17249c90c/ruff-0.15.18-py3-none-macosx_11_0_arm64.whl", hash = "sha256:08d4c86a68f2c3ec2c9d56380a71fb4a4f65373055cbb8caabd645e9102f38d4", size = 10641215, upload-time = "2026-06-18T18:25:15.802Z" }, + { url = "https://files.pythonhosted.org/packages/6c/42/56926d17120db2c208d76bf60a1a019644dd9e91dc27f0f95c9caddb1366/ruff-0.15.18-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37e5108745c2c0705da916d7d4de533ddf547051ef45f62888c31bae73f66318", size = 10957224, upload-time = "2026-06-18T18:25:36.955Z" }, + { url = "https://files.pythonhosted.org/packages/22/4f/d43fab8d8189afde803103022d000a8ef9f230616d436d52a8b2b8d63b50/ruff-0.15.18-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56949a6ce8b3abde54c0bcb22cebfe57e8771cadc84b407ae8b8eaf67ebdcd43", size = 10699024, upload-time = "2026-06-18T18:25:05.707Z" }, + { url = "https://files.pythonhosted.org/packages/63/42/1e3e4c68bd408b9768cf3e439acbe2c78245225faef253f7028a0cdb63e0/ruff-0.15.18-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01a754cd6a1b630d3f97e33eb452cf7a98040482318e870f8bc52a5a30e62657", size = 11491458, upload-time = "2026-06-18T18:25:20.275Z" }, + { url = "https://files.pythonhosted.org/packages/20/77/47a3484bea8521e14a203d98c389c5c97846675e4f02734672da4a69b52a/ruff-0.15.18-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ba7a07e03a44dbf10bb086ee06705b173625014ec99f73a7e6836a5e5590a0c", size = 12383752, upload-time = "2026-06-18T18:25:22.535Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ca/054159590787023d83b658a1a1819c4c8910114e7015069340b71c0961cb/ruff-0.15.18-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a2c40a41a4cadbcf5897b548ab29dfe248b20c540961c0247d98a3973c70403", size = 11577923, upload-time = "2026-06-18T18:25:10.702Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ff/d353d6b7bbd73cc0ec37f4463d7540e45e894338abdd9964eee0de332708/ruff-0.15.18-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f0480ce690cbb6c4db6e5d08f19fce98e10ba131a8b60c1bcdac42771e3ae2d", size = 11583925, upload-time = "2026-06-18T18:25:32.391Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4a/891f89b9c296ed3e5f3ece1a5629badc989d9a8fdaa30431aaf4774bc1c2/ruff-0.15.18-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2330215f1f393fa8733f55edce04fcf94c36a2c460fcde31f78cc84e4951e9b1", size = 11582834, upload-time = "2026-06-18T18:25:27.309Z" }, + { url = "https://files.pythonhosted.org/packages/32/a3/ed9e370154bf85de360b93c03026157f02d4943b2d01ff4945f4429f8e8a/ruff-0.15.18-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a6aa6a3d979e48ae617578183674bf264fbe7d0114a796a26bd678d67963c7ff", size = 10927328, upload-time = "2026-06-18T18:25:34.676Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d1/5cf5909329fedb5d39d555ee818ba5cf4638e1a301b89785d34f2905bfcb/ruff-0.15.18-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a81beadbbff2c9c245561ae3f77b16709d87f35eec650d0501679239d3449b22", size = 10693187, upload-time = "2026-06-18T18:25:08.245Z" }, + { url = "https://files.pythonhosted.org/packages/fd/44/ff6c635cf2c4f4e7b618b6640da057376baa36014695487d88aed4794268/ruff-0.15.18-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2186d9e940ae332ab293623a75b5f4fe49565f449954d50a72a046683aa6b809", size = 11208721, upload-time = "2026-06-18T18:25:41.327Z" }, + { url = "https://files.pythonhosted.org/packages/88/d9/5baa2a30861adfb7022cf33c1e35b2fc18085b08c16f83eff4c7b99a5f48/ruff-0.15.18-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5c2abf140438032bc77b2284a6c9944ecd8a19e5f1c7b52b1b8e4a0a80d19a7a", size = 11678599, upload-time = "2026-06-18T18:25:13.607Z" }, + { url = "https://files.pythonhosted.org/packages/c3/1a/0725a7cfdc32ff769efb96ee782bec882e16448c5d9e3be947ec4c04ce27/ruff-0.15.18-py3-none-win32.whl", hash = "sha256:02299e6e9fa5b297a3f6d5d10d7bcd655c925b028bb8b9d4588214549c6b9ec4", size = 10901903, upload-time = "2026-06-18T18:25:24.755Z" }, + { url = "https://files.pythonhosted.org/packages/f3/51/805d9f6fb7970505c3504794a5ec350f605361b807fef4dcf214ebd35e72/ruff-0.15.18-py3-none-win_amd64.whl", hash = "sha256:dac80dc8d26b2257dbefabed62f5d255c3937b4ccb122da1fc634794fa3578b3", size = 12041189, upload-time = "2026-06-18T18:25:17.915Z" }, + { url = "https://files.pythonhosted.org/packages/29/4c/67bb45e41609eb4726f1bfeb59e083cf91d14c696d4bd14c234a980be93d/ruff-0.15.18-py3-none-win_arm64.whl", hash = "sha256:b2c9257fcbd4a3e5b977a1904e6facca016bafe2edc17df24db67cfaee03b4e4", size = 11329958, upload-time = "2026-06-18T18:25:43.686Z" }, ] [[package]] @@ -5187,7 +5188,7 @@ wheels = [ [[package]] name = "strawberry-graphql" -version = "0.316.0" +version = "0.319.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cross-web" }, @@ -5196,9 +5197,9 @@ dependencies = [ { name = "python-dateutil" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/09/f189fd3c70544322eeba0398ccaa980d17857894c0a66d447aa0b5704686/strawberry_graphql-0.316.0.tar.gz", hash = "sha256:bee5ce0e20d522325bd1ed2db186c812c03c2ea7db29f997b35e7d694649820c", size = 223985, upload-time = "2026-05-19T17:06:10.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/c4/5d7cf2f2459d9a553993217212acc911bfc63f3957a45980230105e1c92e/strawberry_graphql-0.319.0.tar.gz", hash = "sha256:e9afdfe2ca745b5337d3c4909ffd612e405105af6ffc21b1766a2b9848fcfd4f", size = 227709, upload-time = "2026-06-21T14:57:38.324Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/dd/b2cf54803cbd0d37e3ce73c7274bdb144ba83743bc83351b5790eb2a5fad/strawberry_graphql-0.316.0-py3-none-any.whl", hash = "sha256:222e16fbbf953f5a1fa75f62bf9a8e95f274180f928f70bec459b566053aa2cb", size = 326530, upload-time = "2026-05-19T17:06:07.844Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b4/5005afc8369dbb3f5c03dd681ac8a13a5c0b9a8c6ae13f1c0643bb815cfa/strawberry_graphql-0.319.0-py3-none-any.whl", hash = "sha256:fcd5cbe43a5d7274d91bda2261f272f57c84d39532ff58b95fadd0749d225835", size = 330534, upload-time = "2026-06-21T14:57:36.36Z" }, ] [[package]] @@ -5446,27 +5447,27 @@ wheels = [ [[package]] name = "ty" -version = "0.0.46" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/7d/d95b5a9dea83472006be3ce5e480028c44b34138d84d0172e910f287fb69/ty-0.0.46.tar.gz", hash = "sha256:c6c2d7105b5633b49950b4c3a90d1ed2613eb9d794ad582bbbf6c4ffcb93accf", size = 5832380, upload-time = "2026-06-09T03:28:05.056Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/24/f9f7533c391610521f4164e6b8e37ef72d0c1ee8651bc0d9ce9e658b953b/ty-0.0.46-py3-none-linux_armv6l.whl", hash = "sha256:5e716337994699cbc1a1a7b7a3e6622306f2574c710330f9d9691c2c3d8391b0", size = 11756264, upload-time = "2026-06-09T03:28:20.112Z" }, - { url = "https://files.pythonhosted.org/packages/66/49/ff3d13655b9b5cc8176f4c3446bf7ec2df43c8ad9e5272d4adc5d952fa45/ty-0.0.46-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:51d618dec5403635690d0e3e298cd0ad3d84ebc6a576652939ef30ce96fce4b2", size = 11492723, upload-time = "2026-06-09T03:28:13.23Z" }, - { url = "https://files.pythonhosted.org/packages/82/4a/e7e3209e353c5835c7756339bbcdfda10852407b80fbb9ed46c17241873a/ty-0.0.46-py3-none-macosx_11_0_arm64.whl", hash = "sha256:acbafd6a2351b07a6cf4c945b0b1d47f6d2826faac2526a351dfa74d3a3cc664", size = 10892822, upload-time = "2026-06-09T03:27:51.179Z" }, - { url = "https://files.pythonhosted.org/packages/6c/20/4390c90434a9ddefcecb65e8df00e4c2700e9739dc0baf58bed36d25f713/ty-0.0.46-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de5df602ffd760612ae36602bbad69b0123ff6cffd92e62aa92b7709317d69e3", size = 11408745, upload-time = "2026-06-09T03:27:58.049Z" }, - { url = "https://files.pythonhosted.org/packages/75/0c/f13a1bf9c6798530c773667095a6cf8f73ec9721db359423e7249bff7fbc/ty-0.0.46-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7abf5a10b30d8641faad90f6a19989daec941bb90261159e05cfeb04d2012046", size = 11544432, upload-time = "2026-06-09T03:27:53.519Z" }, - { url = "https://files.pythonhosted.org/packages/56/69/eb3710c13dff846a0362df04fadd8a39b64ccc244c0d02ce5285ede8eae5/ty-0.0.46-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8770404139c6ccee2ce2fc226478cfa4100915133c876c257e52197b8b92051d", size = 12031228, upload-time = "2026-06-09T03:28:29.816Z" }, - { url = "https://files.pythonhosted.org/packages/e9/68/5f5db9c84c1d44acdc67281089b372d9d818ee68123a60c59c66187095e2/ty-0.0.46-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f960d5a6e4860076924d2b86891d9872c4a3daa4663fb416e640b22cf3dbf68e", size = 12596073, upload-time = "2026-06-09T03:28:25.204Z" }, - { url = "https://files.pythonhosted.org/packages/14/be/cfd0bb272e6a1491f6de30c60da1f39c2b3c3524ec64a5c92b71365c9185/ty-0.0.46-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d9000a4a3ed08fc37e8a2ff0b801cde06e1c2af3bc053677744bb5a1b751030", size = 12284885, upload-time = "2026-06-09T03:28:10.58Z" }, - { url = "https://files.pythonhosted.org/packages/a8/3a/2cd541f6320f5d6f70a45725c4e1016efedd5545348bb23b47ffb3e4c724/ty-0.0.46-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1160e6dc86536109ab755f7142f36f4dda5333c8330cf230d61819494d27125", size = 12079480, upload-time = "2026-06-09T03:27:55.847Z" }, - { url = "https://files.pythonhosted.org/packages/de/91/8e0075bc6568fb477e7ef4d805c67fa6902b692cb4419e0bf5ce3c04c5bc/ty-0.0.46-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:b619c0efe007731f8221fa787701bfa4402da7a83eb26c61ae25e77b6ace6384", size = 12316547, upload-time = "2026-06-09T03:28:08.28Z" }, - { url = "https://files.pythonhosted.org/packages/00/28/b96cbfeda019a4044c6a8cd06ff84d08b631d4ba7d9a1e6dc0311df3563a/ty-0.0.46-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ad98fccb6a8a94c4121b993761a0deee602f5826c4162e0a91f4f8118ddadd42", size = 11392846, upload-time = "2026-06-09T03:28:00.418Z" }, - { url = "https://files.pythonhosted.org/packages/3b/d0/4d77f699a95ac7a13b94ca1a58682667cfe974f91557d9e2a9fc0b808a7f/ty-0.0.46-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:74536b13c3cc3f5944408669c202d4c57c3d19ff154732df8e6145718aef9191", size = 11559017, upload-time = "2026-06-09T03:28:17.619Z" }, - { url = "https://files.pythonhosted.org/packages/88/62/1d6f6b51c2b132da8011c6a41ead0c1fd2a0b17ea72304bcf6ce084d581a/ty-0.0.46-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5e50b1e96ced41b609e24ed27d9e4f508584ed7f4d0bb717ca8c8d75d2fd1b7c", size = 11666509, upload-time = "2026-06-09T03:28:22.454Z" }, - { url = "https://files.pythonhosted.org/packages/fe/9a/6643894bc12cb30c281f4c8bf37f6d30c1fbd9484ef39a12b0ea6dae3c1c/ty-0.0.46-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0a7d9f58d26d938e5d2f607481b7a412d8c00d675a1ec72004fa9d6b3b9def99", size = 12180448, upload-time = "2026-06-09T03:28:32.329Z" }, - { url = "https://files.pythonhosted.org/packages/86/68/0f3b7bb03a7da676ef51b1c0af0bde1e500d69d5f0c807ed63b6f30b66dd/ty-0.0.46-py3-none-win32.whl", hash = "sha256:26db0ce89c573e60132d14e9688c9329a1633b1a8c26fe457025c7c406f7d5e6", size = 10960002, upload-time = "2026-06-09T03:28:02.832Z" }, - { url = "https://files.pythonhosted.org/packages/b1/f4/91ff618b2dee39d0633d23e1adac0174aa1de80df17e270acac534034dbc/ty-0.0.46-py3-none-win_amd64.whl", hash = "sha256:90e8e6d446b9cb7cb4bede9fca7b3c99fd1e2355605ecf431c131a51db2a5e93", size = 12097413, upload-time = "2026-06-09T03:28:27.495Z" }, - { url = "https://files.pythonhosted.org/packages/e5/2e/300174fca375a27a7c28dd80e990d857d7b3e3b25980c65063f980aa2f17/ty-0.0.46-py3-none-win_arm64.whl", hash = "sha256:ebd320d82605079b901a095dc4711037a0c488b4ace79a602fef4df0d3f4cf74", size = 11439595, upload-time = "2026-06-09T03:28:15.355Z" }, +version = "0.0.52" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/84/4417eb08328dcc547bf407d20af5e45ec8c64a85470f388fc2d590c9200a/ty-0.0.52.tar.gz", hash = "sha256:f1191175429fea917f96f79a57773eb6e57b861ee97e9ad2d77cc7538f0f284b", size = 5973710, upload-time = "2026-06-23T01:43:31.906Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/8f/ba97090625c824bdb2ddac4e22e9f3568c6e5e20e75923daa49ff5254648/ty-0.0.52-py3-none-linux_armv6l.whl", hash = "sha256:5e9403d3b5c5067cef06e29f33e842b095a71479314e38e4aa5e0afe7940e4eb", size = 11956857, upload-time = "2026-06-23T01:42:43.935Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d2/d8ed189611c658e567a2d267f088d5b1128ae6c80e4f40b29552679fd9e1/ty-0.0.52-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:397971af92f63fd1ab244ded9f07e6a13834cf2299a53db19f20ff3076ec5998", size = 11745925, upload-time = "2026-06-23T01:42:47.85Z" }, + { url = "https://files.pythonhosted.org/packages/19/19/db06dd15512bf8e589f2bd92ddfe77a656185801e800cd73f99f12d86305/ty-0.0.52-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3857ba38d5caa55be5a028c1dfda00a50fe9688a776455983f7e6f75783675e0", size = 11090262, upload-time = "2026-06-23T01:42:50.351Z" }, + { url = "https://files.pythonhosted.org/packages/c2/9a/15d3b77ad5e03b802266920bd406a321ac86be88ddbf7db058003559ccad/ty-0.0.52-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdb6b21947ab96cacf15384f245609439d117abfd67479d9dd9e193fc3c88332", size = 11634345, upload-time = "2026-06-23T01:42:53.164Z" }, + { url = "https://files.pythonhosted.org/packages/75/4e/a32b72b11f02e6aeda01ffa8459a6dfa3582cb1555212dc38485c36b44b0/ty-0.0.52-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3acdcb7be88e2248c9ac3210fd21a7bf708ccf65365712ff860d6d2a5794295", size = 11741270, upload-time = "2026-06-23T01:42:55.996Z" }, + { url = "https://files.pythonhosted.org/packages/c6/e0/c2f4de96c2cb25ee74fc41b6bfb80f64b6f90d4e77580454860ee81dde19/ty-0.0.52-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:186302513a72816f5253e32768a2c2f416fbc250079e1404ab6d758b963c402b", size = 12249540, upload-time = "2026-06-23T01:42:58.697Z" }, + { url = "https://files.pythonhosted.org/packages/c8/01/77d45372342983c98c1f3b26b4a8ea7139cb10b26820f0f6b37a298c9fa1/ty-0.0.52-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02ee1083e9fd1a8c221eaa1e7018d4bac40e7b8a9f06db724757491b2948857a", size = 12822873, upload-time = "2026-06-23T01:43:01.57Z" }, + { url = "https://files.pythonhosted.org/packages/1c/09/9bdb394da75cefd41498c86a1f357b7f319368122ac8943d457f28f02609/ty-0.0.52-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83cadaa3efdb3860d24eb45ee3103da0c9a4f7be73c089984e9df095545b9da5", size = 12441154, upload-time = "2026-06-23T01:43:04.129Z" }, + { url = "https://files.pythonhosted.org/packages/ea/07/969dce9b75fdfad9cad3aeae484761e57882b92a6e3d0fe8951b9427846b/ty-0.0.52-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:680738fdfdce72df8be1a213df9ed87add63e1e7705a7927bd360150cd4d749e", size = 12301402, upload-time = "2026-06-23T01:43:06.978Z" }, + { url = "https://files.pythonhosted.org/packages/0b/66/a6fc838efc21c5303d83fd1ccf2b8f0e551b8b3426c54513ea1b1499b1b9/ty-0.0.52-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:30bbe8390a4e58003f181d52c2b3e50facf6b83491c8638f9136a5b8a5a7d931", size = 12507384, upload-time = "2026-06-23T01:43:09.693Z" }, + { url = "https://files.pythonhosted.org/packages/c5/38/eb2c8c17ae3a022e5e1ca187afa5cc03fe0cc40d6dfb5404e6941c98f7af/ty-0.0.52-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:77c8699e796d37534243ea8ac54ac7f64690bf787e2894cb3be18c16ff6fc53c", size = 11600728, upload-time = "2026-06-23T01:43:12.236Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3a/9f25321f6a173021bc728d158cd9e30c5ee28b62f4a20421fca3ebf3f6a5/ty-0.0.52-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ef5c3f6e2cf649773382b9843227b62d689a0179ec1d0366159c349990ceaeb9", size = 11765676, upload-time = "2026-06-23T01:43:14.922Z" }, + { url = "https://files.pythonhosted.org/packages/fc/96/2790300be5bca3bedaa7eb143c26d02b9188685bbf9b9a6bae79e4566085/ty-0.0.52-py3-none-musllinux_1_2_i686.whl", hash = "sha256:dba4c4ee5e1b33c5ad6c965042101d09804b352a3b1482f3ad7b32ad78c22dd4", size = 11886884, upload-time = "2026-06-23T01:43:17.608Z" }, + { url = "https://files.pythonhosted.org/packages/74/06/c098d9422d297cccd27f6a8f5cf5e7eff857b62a89b4549bad9dd0759365/ty-0.0.52-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3e2b06401af954515403f0b2bbe382ca74f09bf2993e7b64fc3c1ad96fde7948", size = 12401990, upload-time = "2026-06-23T01:43:20.267Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c9/34b771d0581fbfd0dde89f869af597b3907c7e5c59439005f59f6671c7d5/ty-0.0.52-py3-none-win32.whl", hash = "sha256:6347248c640f0d71ba9c4fe5de941ec7e3df167008bdda5c2cf795055045f266", size = 11247464, upload-time = "2026-06-23T01:43:23.36Z" }, + { url = "https://files.pythonhosted.org/packages/33/b1/0c381ac39d85a885d4e2841173e9a88bf190b4f7cf7d15afd4a1d7e8c715/ty-0.0.52-py3-none-win_amd64.whl", hash = "sha256:57150a68abfea2ec4727647b26f136850695972a650587f44a4b98fc9d4a1096", size = 12385753, upload-time = "2026-06-23T01:43:26.479Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1f/2744053d80ca1b350817dbf41286bac9c95491cfa437c0cc923feaf3522b/ty-0.0.52-py3-none-win_arm64.whl", hash = "sha256:c669df56e41c99ea53405191da0fd65cbcb9bb7162c676ef6f45e480c6a7da6e", size = 11695815, upload-time = "2026-06-23T01:43:29.465Z" }, ] [[package]] @@ -6066,7 +6067,7 @@ wheels = [ [[package]] name = "zensical" -version = "0.0.45" +version = "0.0.46" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -6078,20 +6079,20 @@ dependencies = [ { name = "pyyaml" }, { name = "tomli" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/d1/ecb1889fd2208b2d577e6ff952d9bee201302eec7966b5b61cc64adfd8f5/zensical-0.0.45.tar.gz", hash = "sha256:315bce4ab0470338dd3588add38fb325f840856c375722e6802bd58a06446266", size = 3935947, upload-time = "2026-06-09T11:23:32.349Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/57/c7bbb71f943e1e0ba5ce460f4930ec836ead7286969e7fd742f7a6c049ab/zensical-0.0.46.tar.gz", hash = "sha256:3ec21f4fb1e78cd7c0d6b07ae336b04770e27ba020dabc457b2790e5d34f1978", size = 3973968, upload-time = "2026-06-21T18:52:40.368Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/fd/6b84115e3bbe6b76ebb1265e8ff2161c0bc88dcd6499eaf29c61a66421e9/zensical-0.0.45-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c4cb2e11132f02ae824e246e016e073458e12e9de1eaf86fd39f01890d41204c", size = 12698844, upload-time = "2026-06-09T11:22:56.537Z" }, - { url = "https://files.pythonhosted.org/packages/e2/dc/4ddf05d77c1455c32cb26da71f2a19d355927a45a3db5b26fb258a07ce8f/zensical-0.0.45-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:799a01de2102b5f731744ad31bdbc464d0c07d484e67ba148f6923679afa6ce6", size = 12571590, upload-time = "2026-06-09T11:23:00.192Z" }, - { url = "https://files.pythonhosted.org/packages/4c/53/60c6cc7b2ce8b1a83eb87bff3f7289447995552fd9a30ca76ffba22ca9d5/zensical-0.0.45-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6201e79ea8a64bd3ced3f05ef4b1529da0e675d67b1395987c0ba942e4e10dc4", size = 12939590, upload-time = "2026-06-09T11:23:02.721Z" }, - { url = "https://files.pythonhosted.org/packages/9f/1e/e9217ed75dba323a6f9a4eee28eb40416eff99932cd0ee6c394bf07b9ead/zensical-0.0.45-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:854aaf500e4a3ce64adea1faa7a1820c7cf9a4f66be1043e4e9ba727fe9cf2b5", size = 12911669, upload-time = "2026-06-09T11:23:05.407Z" }, - { url = "https://files.pythonhosted.org/packages/71/3c/6fc9fe2334bb4460a8a8d732e23a30d2ddc2ecf63c2eb3487d9e7405e70d/zensical-0.0.45-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a80c57fd50fc60415914388286ac10a7d8b6f70b8ca7235597d09fb12c3171b0", size = 13267643, upload-time = "2026-06-09T11:23:07.915Z" }, - { url = "https://files.pythonhosted.org/packages/be/f9/5696114af4ede5f1bd01e641a4ff24ee8ca49810bfaa28e5be12d930c0ef/zensical-0.0.45-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58c3510f69e08b6ed8bb9596fc9393e4687f90394aa0ef2d6118b1375ad97be5", size = 12972147, upload-time = "2026-06-09T11:23:12.069Z" }, - { url = "https://files.pythonhosted.org/packages/a3/9e/5c6acde480c43f8c993b13260925df8db31d51ab8a9977618e9efdd98d45/zensical-0.0.45-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:01c484bb2ee85e98e21e24b397ff52ffc31101f7485935eee5d3afa6cca6cc08", size = 13117360, upload-time = "2026-06-09T11:23:15.155Z" }, - { url = "https://files.pythonhosted.org/packages/3d/31/ea21f102049b35a8fe5218c5331857a15eeb60deb1bb21823a4c0701e274/zensical-0.0.45-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:3654b708830303759e866a58a60c483cd2a1c56a44acdaae5bbb341a3f40ebce", size = 13185593, upload-time = "2026-06-09T11:23:18.166Z" }, - { url = "https://files.pythonhosted.org/packages/b4/97/6ded39fe27fa8a292d17d9af713b018e4919315233b60fa4b4b0aca737a6/zensical-0.0.45-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:c4da1c37eca1474b487def0ef40d7ac2aff31a9d7a029cb7479ef7c354437361", size = 13326882, upload-time = "2026-06-09T11:23:21.027Z" }, - { url = "https://files.pythonhosted.org/packages/79/80/075975032a9e20f319c0134f8ca659d295ee4908f15ab212702a2728247f/zensical-0.0.45-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f8a1966c186feebd3b795f9d420000bfd582e16eefdd9bc7a286d878faabae52", size = 13253961, upload-time = "2026-06-09T11:23:23.99Z" }, - { url = "https://files.pythonhosted.org/packages/3f/6a/0eab0eb311af6a07cde15ca58d5d720cbfa02cd509e4c7fb5fa20cda0b46/zensical-0.0.45-cp310-abi3-win32.whl", hash = "sha256:a1dd63a5efb8d0e5f2fadf862f02771a279dc5cbe9a982700194650065758f01", size = 12257083, upload-time = "2026-06-09T11:23:26.769Z" }, - { url = "https://files.pythonhosted.org/packages/1f/cd/b117e749c60b1d1e16b8450db1355f69f38376f783b8c6c8815202988933/zensical-0.0.45-cp310-abi3-win_amd64.whl", hash = "sha256:1f2c0e69839ce4274bde34d18139d3b0d96bbf02b245ada46243590c9eedebc1", size = 12498335, upload-time = "2026-06-09T11:23:29.702Z" }, + { url = "https://files.pythonhosted.org/packages/4c/bd/bbc499ee35ac9ec5459dbfec7bb7231556689e97eaa13a5eddbe1f0443b5/zensical-0.0.46-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:d91af81ab058c8693dfd75f2f77b4c73bcba4125681d1d276f38624291820bd2", size = 12796482, upload-time = "2026-06-21T18:52:07.369Z" }, + { url = "https://files.pythonhosted.org/packages/88/1b/7acc273184d59b8e894d15ebe3cf1c5e81b3a822fde1792ea3e33be37a2e/zensical-0.0.46-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:d9221264a9a87409900a47e29985607b0c9245dacb89077e87c8e16e31edc167", size = 12660030, upload-time = "2026-06-21T18:52:10.186Z" }, + { url = "https://files.pythonhosted.org/packages/80/df/bd0a68de98a19fc6050c58be11f36d05ea72a213b6a7ff7395d33c793747/zensical-0.0.46-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec43018d5343ca2e1d71aa352eeddd560fef504effd03025840a5a783abefa4f", size = 13057130, upload-time = "2026-06-21T18:52:12.911Z" }, + { url = "https://files.pythonhosted.org/packages/f4/db/e27635f5787a42245f900e658340698a6654e165d466f9a3b640efced2cd/zensical-0.0.46-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26e98fb8ab7ab50cdd20a73e2c7d4d9aae0b46cf2d8691e6bb22f9c261b8a60a", size = 13022345, upload-time = "2026-06-21T18:52:15.84Z" }, + { url = "https://files.pythonhosted.org/packages/e7/9d/6ce2ba11c97154870b458a8dae4637ade93b7097912f0102f5ea7fe8cf5b/zensical-0.0.46-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46fe578f26963f8ee89567983e62737b6fadc9197d4742e1020b522e092d7baa", size = 13377445, upload-time = "2026-06-21T18:52:18.538Z" }, + { url = "https://files.pythonhosted.org/packages/68/06/9930d43cd9d2f899b648d63491007c1b4f9716cf118b0c98e867b933069c/zensical-0.0.46-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aef03fa186a5589148e10b62610500989c6b075a2c08e1554233adbf91b2a3dc", size = 13086749, upload-time = "2026-06-21T18:52:21.452Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ed/2342cf860fbb02314938b0d1f1b02344935801b04d185ff3151ef1812898/zensical-0.0.46-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:bc7446cdf97a8dea390f20ed2bd6b030cddc1bd36a8ce113ea3efef6fa61c573", size = 13231120, upload-time = "2026-06-21T18:52:24.171Z" }, + { url = "https://files.pythonhosted.org/packages/de/b0/d2ece02f63cd767fcf10fd7608dc8e0a995f87dc5261209b1dbc296fd57b/zensical-0.0.46-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:bbee37801f1ed500f158dc0992c569282950f780ae353c37fe6969f99983d701", size = 13295035, upload-time = "2026-06-21T18:52:26.942Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b2/cb0048a612e63e615399fc507472a557d1c5b7c2f74065c5bf11998fd597/zensical-0.0.46-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:9487c147c9cceb50c04d0ad70b024821a6eab1629dafd70ab6d1e86ec841e623", size = 13437191, upload-time = "2026-06-21T18:52:29.69Z" }, + { url = "https://files.pythonhosted.org/packages/91/16/515f81db8055b109a510063be481e60a657c4fad1a883680b2ee4aa9a424/zensical-0.0.46-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f42a4683c762f026878d19ede4bcf7bfbb84dbecb5ad923949abb77806ed88a5", size = 13369382, upload-time = "2026-06-21T18:52:32.521Z" }, + { url = "https://files.pythonhosted.org/packages/b9/5c/da54ee65b642eb7d88dd4a3db35845d0765915638e05d5d434a10b42f1c3/zensical-0.0.46-cp310-abi3-win32.whl", hash = "sha256:85f018f2a7ee76a83915c87ddb12b58cf343fd6154081d33ac95b6751b011dd7", size = 12354298, upload-time = "2026-06-21T18:52:34.976Z" }, + { url = "https://files.pythonhosted.org/packages/73/26/fc7ef081acbdada8436825221cb728ee84a81d4d78a7bb79aa58bd150d31/zensical-0.0.46-cp310-abi3-win_amd64.whl", hash = "sha256:1543a693a160de60e86ca589592401b584670e7e12c5ae30e3c2ba76786f7ec3", size = 12599687, upload-time = "2026-06-21T18:52:37.913Z" }, ] [[package]] @@ -6105,18 +6106,18 @@ wheels = [ [[package]] name = "zizmor" -version = "1.25.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/41/8987d546e3101cc76748b2f1b0ccda58e244773ef5124d39e7e749e3d6e4/zizmor-1.25.2.tar.gz", hash = "sha256:f26ffeb16659c8922c7b08203ca5a4f8bf5e1a7e8d190734961c40877cf778ea", size = 517794, upload-time = "2026-05-16T06:28:43.816Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/bd/84108a92ccbfda0d28efc11f382997c7a767b58863bf4a550634b8cf0211/zizmor-1.25.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:17cc8cfd9d472e8b11945a869c198d25cfdf4a33f36fa7a1f9674099f5fb509d", size = 9115548, upload-time = "2026-05-16T06:28:33.591Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c0/66453a2553a66286a96ca32d75e3e6bcc94ce7f907cd5f8c2c3fce55315e/zizmor-1.25.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d3e301eb4465e2da77857cf01ab4ef0184cf3818e826800b270ab01ae7338977", size = 8665071, upload-time = "2026-05-16T06:28:30.861Z" }, - { url = "https://files.pythonhosted.org/packages/52/3e/d60939d1cc4907c0d021a7c46362aab5e8045550bb09157d56c070e43568/zizmor-1.25.2-py3-none-manylinux_2_24_aarch64.whl", hash = "sha256:cf64374149b567c9373228b76c8e77a389b4071899f84b82c36ee50fab894e79", size = 8842884, upload-time = "2026-05-16T06:28:26.041Z" }, - { url = "https://files.pythonhosted.org/packages/46/82/f3e8d9b6d941194f2558591b449c106d46a16ea566b95eccff3a83bf6acc/zizmor-1.25.2-py3-none-manylinux_2_28_armv7l.whl", hash = "sha256:0beba1601be08bd00c9277e6ed4b026e125b26b379d86d6d98eb708409b3050d", size = 8449741, upload-time = "2026-05-16T06:28:45.424Z" }, - { url = "https://files.pythonhosted.org/packages/4b/13/445bc98acc2c976d6b8f8ca59b9c09f055adb5ffb3445d99af8ff7efcb4f/zizmor-1.25.2-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:c4246f1344d8dbeffc044d7bb11b131773a7db7eb57d9073c45942dfd3543a1f", size = 9285184, upload-time = "2026-05-16T06:28:39.21Z" }, - { url = "https://files.pythonhosted.org/packages/cf/78/fc7717c706bde7531b2fde12003994fbc04c47ab4f91aa6ca9b3b24b30fd/zizmor-1.25.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:dbb1b5c85b8de8eaa0227c6620f06c8e4fbd0a4da2086e218bc225c0bef0923d", size = 8886579, upload-time = "2026-05-16T06:28:51.384Z" }, - { url = "https://files.pythonhosted.org/packages/ca/bc/a46f11377cdc145c625d62d88c30fead56f9d29bc31652069a1a0eaed6c2/zizmor-1.25.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d670a1e2f00b3cd56febd145bc1a0b2c4caf1cbe5dad8128721843fa877e2d2e", size = 8413576, upload-time = "2026-05-16T06:28:36.376Z" }, - { url = "https://files.pythonhosted.org/packages/2b/3b/0fd93b77171c8f229e8e1304eecc9931bf3009f722c57967d545d9f151b6/zizmor-1.25.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b75c84d7387389f95edadbe859fb2aaf0a360c5b080932cc53e92ae1db6f09ef", size = 9378162, upload-time = "2026-05-16T06:28:41.999Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3f/dcb85fb9a0d87794847f9043f9db9bb4d274cf4b8077604bc13850c8fdb4/zizmor-1.25.2-py3-none-win32.whl", hash = "sha256:aa9f4c43b499c55339c3ef2e885133c5017cd9a18d76d9335541203cfa5ae1e7", size = 7548509, upload-time = "2026-05-16T06:28:28.828Z" }, - { url = "https://files.pythonhosted.org/packages/d2/81/1cb088098bd53f9b910098b0c19d06dc587acf328a170ef8afd1cd93b482/zizmor-1.25.2-py3-none-win_amd64.whl", hash = "sha256:af55bd9bd119ea8cbce2a7addc3922503019de32c1fe31106d70b3dc77d77908", size = 8609822, upload-time = "2026-05-16T06:28:48.078Z" }, +version = "1.26.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/a0/a29b38e24981b4bb41db4f292b2c9fb9ddf8b05d6b724abddd7bd108b621/zizmor-1.26.1.tar.gz", hash = "sha256:0c2cc575007a4db99d89d5acc6120cfa7b61504bc2394c3b50af348c73f1916e", size = 535275, upload-time = "2026-06-21T02:47:21.265Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/a9/2f47f7db8db9491025e00a7f1a0f25d32b642c0285b2fe070ac63e679b47/zizmor-1.26.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7ea21ca959c8e888de238fee81d73a1fdf89a82067eac75b8f1acdbd23e2eeaf", size = 9086061, upload-time = "2026-06-21T02:46:57.492Z" }, + { url = "https://files.pythonhosted.org/packages/58/92/cf6801f01e1d65cbda89a2e2926ea42caf1daad9ffa3f1fc88e4c68f48a9/zizmor-1.26.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:78083b495593f8b0b9dec14036a0836a5afcddda8a40738336ff4e399476b741", size = 8626865, upload-time = "2026-06-21T02:47:00.323Z" }, + { url = "https://files.pythonhosted.org/packages/b4/b1/ff38fc2921f1fb13244bb3a3642c4b45ecf3946c279942aafcb5dbf55a57/zizmor-1.26.1-py3-none-manylinux_2_24_aarch64.whl", hash = "sha256:bb7ebbe565a3742eb49a590352127ad549bb122b9b4ff9424ebab7525fa3b6b6", size = 8843965, upload-time = "2026-06-21T02:47:03.318Z" }, + { url = "https://files.pythonhosted.org/packages/3d/06/c07fd0eeef0427d93e99d552d5386526fbcd0bf05fc95cd37bdc6229fccb/zizmor-1.26.1-py3-none-manylinux_2_28_armv7l.whl", hash = "sha256:d3049010b6bd6f849413b6d20c28e0c677b90e0a5b2bc73cbee7f7bd86dc5828", size = 8386985, upload-time = "2026-06-21T02:47:05.741Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2b/61ab13d45d6ce57ef5a08bb3246981f62e30bb4938098b17bb7b88110b79/zizmor-1.26.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:6a958d8a0941d7e1d0de8436670b5cb7fc64c8028b4d16e3f519ccc77f953cef", size = 9257232, upload-time = "2026-06-21T02:47:07.941Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ad/bd74a96cb02045414ec5b573cd97ff3b82a97fd0bd6658f93c36a011c439/zizmor-1.26.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d2744cdf944436ca7a009ae8b626a017a40381ec990216abd6cf6b8beb23323a", size = 8873798, upload-time = "2026-06-21T02:47:10.472Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7e/fb3d608ee11e2f619d43ad93bab46eb7b32769fa82b1d86fd23f27c2585b/zizmor-1.26.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:44099f426af9da750ff9f548a0084e11d7d83e0158fe1a2778672398d728efdd", size = 8350857, upload-time = "2026-06-21T02:47:12.748Z" }, + { url = "https://files.pythonhosted.org/packages/27/cc/82d7a838c2d490071555c364f90eb851044b3eeefc1d68612179a2cd1ae5/zizmor-1.26.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8313cc264dec792f00a7328eb7c8e89e7d62d54f950fc897d1e6a5a6e5762203", size = 9351148, upload-time = "2026-06-21T02:47:14.777Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ee/d2a2301f30b9e1bf0d721bfd31739acd71e048757f9ba79279583eb30ac0/zizmor-1.26.1-py3-none-win32.whl", hash = "sha256:c96d7787d69fb298eae939e00dfdf7f534d7dfbd9cc17ab442c0650a56851415", size = 7531021, upload-time = "2026-06-21T02:47:17.247Z" }, + { url = "https://files.pythonhosted.org/packages/91/58/ad561f3a5057d3c0f152002e180a3a5745e72ea9d69bf66450ef9f5d3fe5/zizmor-1.26.1-py3-none-win_amd64.whl", hash = "sha256:0a05acf6068609fb6df3b137276cf18a686226a1e0e207941cb34a85929f16cf", size = 8616584, upload-time = "2026-06-21T02:47:19.094Z" }, ] From 02f80bc4d026bbbcbfcd9a79d4c674086764d9e7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 30 Jun 2026 09:21:16 +0000 Subject: [PATCH 238/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 63477962c..f6156d438 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Internal +* ⬆ Bump the python-packages group across 1 directory with 10 updates. PR [#15870](https://github.com/fastapi/fastapi/pull/15870) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump CodSpeedHQ/action from 4.17.0 to 4.17.5 in the github-actions group. PR [#15826](https://github.com/fastapi/fastapi/pull/15826) by [@dependabot[bot]](https://github.com/apps/dependabot). ## 0.138.2 (2026-06-29) From f6f3d25d1088045199209a234b8d106ac2c43163 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jun 2026 12:33:41 +0000 Subject: [PATCH 239/290] =?UTF-8?q?=E2=AC=86=20Bump=20the=20github-actions?= =?UTF-8?q?=20group=20with=205=20updates=20(#15872)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Yurii Motov --- .github/workflows/build-docs.yml | 12 ++++++------ .github/workflows/contributors.yml | 4 ++-- .github/workflows/create-draft-release.yml | 4 ++-- .github/workflows/deploy-docs.yml | 5 +++-- .github/workflows/label-approved.yml | 4 ++-- .github/workflows/latest-changes.yml | 3 ++- .github/workflows/notify-translations.yml | 5 +++-- .github/workflows/people.yml | 4 ++-- .github/workflows/pre-commit.yml | 6 +++--- .github/workflows/prepare-release.yml | 4 ++-- .github/workflows/publish.yml | 4 ++-- .github/workflows/smokeshow.yml | 5 +++-- .github/workflows/sponsors.yml | 4 ++-- .github/workflows/test-redistribute.yml | 4 ++-- .github/workflows/test.yml | 16 ++++++++-------- .github/workflows/topic-repos.yml | 4 ++-- .github/workflows/translate.yml | 8 ++++---- .github/workflows/zizmor.yml | 4 ++-- 18 files changed, 52 insertions(+), 48 deletions(-) diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 0cf8d1262..fe2a39c45 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -17,7 +17,7 @@ jobs: outputs: docs: ${{ steps.filter.outputs.docs }} steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false # For pull requests it's not necessary to checkout the code but for the main branch it is @@ -43,11 +43,11 @@ jobs: outputs: langs: ${{ steps.show-langs.outputs.langs }} steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv @@ -82,11 +82,11 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv @@ -103,7 +103,7 @@ jobs: run: uv sync --locked --no-dev --group docs - name: Update Languages run: uv run ./scripts/docs.py update-languages - - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 + - uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: key: zensical-${{ matrix.lang }}-${{ github.ref }} path: site_zensical_src/${{ matrix.lang }}/.cache diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml index bc6059218..1d869e7b8 100644 --- a/.github/workflows/contributors.yml +++ b/.github/workflows/contributors.yml @@ -23,11 +23,11 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: true # Required for `git push` in `contributors.py` - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv diff --git a/.github/workflows/create-draft-release.yml b/.github/workflows/create-draft-release.yml index 15df98ab4..e0af097e2 100644 --- a/.github/workflows/create-draft-release.yml +++ b/.github/workflows/create-draft-release.yml @@ -22,12 +22,12 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: ref: ${{ github.event.repository.default_branch }} persist-credentials: true - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Install uv diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 04f02d3e7..be377df94 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -22,11 +22,12 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false + allow-unsafe-pr-checkout: true - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv diff --git a/.github/workflows/label-approved.yml b/.github/workflows/label-approved.yml index 041bac942..6d4f2ef52 100644 --- a/.github/workflows/label-approved.yml +++ b/.github/workflows/label-approved.yml @@ -19,11 +19,11 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv diff --git a/.github/workflows/latest-changes.yml b/.github/workflows/latest-changes.yml index 9390bc538..f934823fe 100644 --- a/.github/workflows/latest-changes.yml +++ b/.github/workflows/latest-changes.yml @@ -28,11 +28,12 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: # To allow latest-changes to commit to the main branch token: ${{ secrets.FASTAPI_LATEST_CHANGES }} # zizmor: ignore[secrets-outside-env] persist-credentials: true # required by tiangolo/latest-changes + allow-unsafe-pr-checkout: true # Allow debugging with tmate - name: Setup tmate session uses: mxschmitt/action-tmate@35b54afac29c97fb54faba5b513f8fbd1882f113 # v3.24 diff --git a/.github/workflows/notify-translations.yml b/.github/workflows/notify-translations.yml index 360a4df69..d2175f30d 100644 --- a/.github/workflows/notify-translations.yml +++ b/.github/workflows/notify-translations.yml @@ -30,11 +30,12 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false + allow-unsafe-pr-checkout: true - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv diff --git a/.github/workflows/people.yml b/.github/workflows/people.yml index bc4f19727..2e48c9d70 100644 --- a/.github/workflows/people.yml +++ b/.github/workflows/people.yml @@ -23,11 +23,11 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: true # Required for `git push` in `people.py` - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 915e3a883..963fd68ab 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -17,7 +17,7 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 name: Checkout PR for own repo if: env.HAS_SECRETS == 'true' with: @@ -30,7 +30,7 @@ jobs: token: ${{ secrets.PRE_COMMIT }} # zizmor: ignore[secrets-outside-env] persist-credentials: true # Required for `git push` command # pre-commit lite ci needs the default checkout configs to work - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 name: Checkout PR for fork if: env.HAS_SECRETS == 'false' with: @@ -39,7 +39,7 @@ jobs: fetch-depth: 0 persist-credentials: false - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index 9561e9422..5b241aa4f 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -34,12 +34,12 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: token: ${{ secrets.FASTAPI_LATEST_CHANGES }} # zizmor: ignore[secrets-outside-env] persist-credentials: true - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Install uv diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 270fab4d4..447ce8c33 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -19,11 +19,11 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Install uv diff --git a/.github/workflows/smokeshow.yml b/.github/workflows/smokeshow.yml index a674f6261..5e2f2ea55 100644 --- a/.github/workflows/smokeshow.yml +++ b/.github/workflows/smokeshow.yml @@ -19,10 +19,11 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + allow-unsafe-pr-checkout: true + - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv diff --git a/.github/workflows/sponsors.yml b/.github/workflows/sponsors.yml index d3a78b5f8..a20dcaf05 100644 --- a/.github/workflows/sponsors.yml +++ b/.github/workflows/sponsors.yml @@ -24,11 +24,11 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: true # Required for `git push` in `sponsors.py` - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv diff --git a/.github/workflows/test-redistribute.yml b/.github/workflows/test-redistribute.yml index 47a2a8ae4..cffb9d8c8 100644 --- a/.github/workflows/test-redistribute.yml +++ b/.github/workflows/test-redistribute.yml @@ -16,11 +16,11 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Install build dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6870160de..e28e90e3e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,7 +26,7 @@ jobs: outputs: src: ${{ steps.filter.outputs.src }} steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false # For pull requests it's not necessary to checkout the code but for the main branch it is @@ -107,11 +107,11 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version: ${{ matrix.python-version }} - name: Setup uv @@ -171,11 +171,11 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version: "3.13" - name: Setup uv @@ -191,7 +191,7 @@ jobs: - name: Install Dependencies run: uv sync --no-dev --group tests --extra all - name: CodSpeed benchmarks - uses: CodSpeedHQ/action@c145068895e045cc725ee76fcd2307624b65c3af # v4.17.5 + uses: CodSpeedHQ/action@63f3e98b61959fe67f146a3ff022e4136fe9bb9c # v4.17.6 with: mode: simulation run: uv run --no-sync pytest tests/benchmarks --codspeed @@ -206,10 +206,10 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv diff --git a/.github/workflows/topic-repos.yml b/.github/workflows/topic-repos.yml index abe8cf14b..b0fb40398 100644 --- a/.github/workflows/topic-repos.yml +++ b/.github/workflows/topic-repos.yml @@ -19,11 +19,11 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: true # Required for `git push` in `topic_repos.py` - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv diff --git a/.github/workflows/translate.yml b/.github/workflows/translate.yml index 18df9c157..7f96798da 100644 --- a/.github/workflows/translate.yml +++ b/.github/workflows/translate.yml @@ -50,11 +50,11 @@ jobs: langs: ${{ steps.show-langs.outputs.langs }} commands: ${{ steps.show-langs.outputs.commands }} steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv @@ -92,12 +92,12 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: fetch-depth: 0 persist-credentials: true # Required for `git push` in `translate.py` - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" - name: Setup uv diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml index 04c027a85..11ecb8272 100644 --- a/.github/workflows/zizmor.yml +++ b/.github/workflows/zizmor.yml @@ -18,8 +18,8 @@ jobs: security-events: write # Required for upload-sarif (used by zizmor-action) to upload SARIF files. steps: - name: Checkout repository - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Run zizmor - uses: zizmorcore/zizmor-action@5f14fd08f7cf1cb1609c1e344975f152c7ee938d # v0.5.6 + uses: zizmorcore/zizmor-action@192e21d79ab29983730a13d1382995c2307fbcaa # v0.5.7 From fe450d9a414572cf9a7354cef77d99e8d16e7d73 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 30 Jun 2026 12:34:14 +0000 Subject: [PATCH 240/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index f6156d438..bbceb404d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Internal +* ⬆ Bump the github-actions group with 5 updates. PR [#15872](https://github.com/fastapi/fastapi/pull/15872) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump the python-packages group across 1 directory with 10 updates. PR [#15870](https://github.com/fastapi/fastapi/pull/15870) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump CodSpeedHQ/action from 4.17.0 to 4.17.5 in the github-actions group. PR [#15826](https://github.com/fastapi/fastapi/pull/15826) by [@dependabot[bot]](https://github.com/apps/dependabot). From 8da95e1842e2eaa9c12e3ee5a7e3c5522376922e Mon Sep 17 00:00:00 2001 From: Yurii Motov <109919500+YuriiMotov@users.noreply.github.com> Date: Tue, 30 Jun 2026 20:57:35 +0200 Subject: [PATCH 241/290] =?UTF-8?q?=F0=9F=91=B7=20Remove=20not=20needed=20?= =?UTF-8?q?`allow-unsafe-pr-checkout:=20true`=20(#15876)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy-docs.yml | 1 - .github/workflows/latest-changes.yml | 1 - .github/workflows/notify-translations.yml | 1 - .github/workflows/smokeshow.yml | 1 - 4 files changed, 4 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index be377df94..d8353ad55 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -25,7 +25,6 @@ jobs: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - allow-unsafe-pr-checkout: true - name: Set up Python uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: diff --git a/.github/workflows/latest-changes.yml b/.github/workflows/latest-changes.yml index f934823fe..111b47424 100644 --- a/.github/workflows/latest-changes.yml +++ b/.github/workflows/latest-changes.yml @@ -33,7 +33,6 @@ jobs: # To allow latest-changes to commit to the main branch token: ${{ secrets.FASTAPI_LATEST_CHANGES }} # zizmor: ignore[secrets-outside-env] persist-credentials: true # required by tiangolo/latest-changes - allow-unsafe-pr-checkout: true # Allow debugging with tmate - name: Setup tmate session uses: mxschmitt/action-tmate@35b54afac29c97fb54faba5b513f8fbd1882f113 # v3.24 diff --git a/.github/workflows/notify-translations.yml b/.github/workflows/notify-translations.yml index d2175f30d..aa006978c 100644 --- a/.github/workflows/notify-translations.yml +++ b/.github/workflows/notify-translations.yml @@ -33,7 +33,6 @@ jobs: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - allow-unsafe-pr-checkout: true - name: Set up Python uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: diff --git a/.github/workflows/smokeshow.yml b/.github/workflows/smokeshow.yml index 5e2f2ea55..41804cee9 100644 --- a/.github/workflows/smokeshow.yml +++ b/.github/workflows/smokeshow.yml @@ -22,7 +22,6 @@ jobs: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - allow-unsafe-pr-checkout: true - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version-file: ".python-version" From bf8283b4444acfbe6bd6ac1de923760acf5e167a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 30 Jun 2026 18:58:00 +0000 Subject: [PATCH 242/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index bbceb404d..f40434bb2 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Internal +* đŸ‘· Remove not needed `allow-unsafe-pr-checkout: true`. PR [#15876](https://github.com/fastapi/fastapi/pull/15876) by [@YuriiMotov](https://github.com/YuriiMotov). * ⬆ Bump the github-actions group with 5 updates. PR [#15872](https://github.com/fastapi/fastapi/pull/15872) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump the python-packages group across 1 directory with 10 updates. PR [#15870](https://github.com/fastapi/fastapi/pull/15870) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump CodSpeedHQ/action from 4.17.0 to 4.17.5 in the github-actions group. PR [#15826](https://github.com/fastapi/fastapi/pull/15826) by [@dependabot[bot]](https://github.com/apps/dependabot). From 3ac41743924ca9e8fb4e391fe3c7b5bbccacafc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 12:20:39 +0200 Subject: [PATCH 243/290] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20Peopl?= =?UTF-8?q?e=20-=20Contributors=20and=20Translators=20(#15878)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/en/data/contributors.yml | 8 +++--- docs/en/data/translation_reviewers.yml | 38 +++++++++++++------------- docs/en/data/translators.yml | 14 +++++----- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/docs/en/data/contributors.yml b/docs/en/data/contributors.yml index 7e1572146..b22e0975b 100644 --- a/docs/en/data/contributors.yml +++ b/docs/en/data/contributors.yml @@ -1,21 +1,21 @@ tiangolo: login: tiangolo - count: 961 + count: 1005 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo dependabot: login: dependabot - count: 201 + count: 221 avatarUrl: https://avatars.githubusercontent.com/in/29110?v=4 url: https://github.com/apps/dependabot YuriiMotov: login: YuriiMotov - count: 78 + count: 82 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4 url: https://github.com/YuriiMotov alejsdev: login: alejsdev - count: 56 + count: 57 avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=0facffe3abf87f57a1f05fa773d1119cc5c2f6a5&v=4 url: https://github.com/alejsdev pre-commit-ci: diff --git a/docs/en/data/translation_reviewers.yml b/docs/en/data/translation_reviewers.yml index 3ed7d09d9..ccc4d604f 100644 --- a/docs/en/data/translation_reviewers.yml +++ b/docs/en/data/translation_reviewers.yml @@ -28,6 +28,11 @@ hard-coders: count: 102 avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=78d12d1acdf853c817700145e73de7fd9e5d068b&v=4 url: https://github.com/hard-coders +YuriiMotov: + login: YuriiMotov + count: 95 + avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4 + url: https://github.com/YuriiMotov hasansezertasan: login: hasansezertasan count: 95 @@ -38,11 +43,6 @@ alv2017: count: 88 avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 url: https://github.com/alv2017 -YuriiMotov: - login: YuriiMotov - count: 87 - avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4 - url: https://github.com/YuriiMotov nazarepiedady: login: nazarepiedady count: 87 @@ -383,6 +383,11 @@ mastizada: count: 16 avatarUrl: https://avatars.githubusercontent.com/u/1975818?u=0751a06d7271c8bf17cb73b1b845644ab4d2c6dc&v=4 url: https://github.com/mastizada +waketzheng: + login: waketzheng + count: 16 + avatarUrl: https://avatars.githubusercontent.com/u/35413830?u=df19e4fd5bb928e7d086e053ef26a46aad23bf84&v=4 + url: https://github.com/waketzheng Joao-Pedro-P-Holanda: login: Joao-Pedro-P-Holanda count: 16 @@ -448,11 +453,6 @@ impocode: count: 13 avatarUrl: https://avatars.githubusercontent.com/u/109408819?u=9cdfc5ccb31a2094c520f41b6087012fa9048982&v=4 url: https://github.com/impocode -waketzheng: - login: waketzheng - count: 13 - avatarUrl: https://avatars.githubusercontent.com/u/35413830?u=df19e4fd5bb928e7d086e053ef26a46aad23bf84&v=4 - url: https://github.com/waketzheng wesinalves: login: wesinalves count: 13 @@ -563,6 +563,11 @@ Pyth3rEx: count: 11 avatarUrl: https://avatars.githubusercontent.com/u/26427764?u=087724f74d813c95925d51e354554bd4b6d6bb60&v=4 url: https://github.com/Pyth3rEx +ABcDexter: + login: ABcDexter + count: 11 + avatarUrl: https://avatars.githubusercontent.com/u/7236257?u=baa7e62eb4d0014b5854bfd0d5c2b20bd9617e0d&v=4 + url: https://github.com/ABcDexter mariacamilagl: login: mariacamilagl count: 10 @@ -661,7 +666,7 @@ eVery1337: aykhans: login: aykhans count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/88669260?u=798da457cc3276d3c6dd7fd628d0005ad8b298cc&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/88669260?u=2760f6f6728ed11108b56265682bcf68d46067a5&v=4 url: https://github.com/aykhans riroan: login: riroan @@ -671,7 +676,7 @@ riroan: MinLee0210: login: MinLee0210 count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=e7c4d8d7eeb7bceed1680ef0e5dafec0695f57e0&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=9fef84dd2f7497e8b43db01ba517a5b2bd66ad88&v=4 url: https://github.com/MinLee0210 yodai-yodai: login: yodai-yodai @@ -693,11 +698,6 @@ Yarous: count: 9 avatarUrl: https://avatars.githubusercontent.com/u/61277193?u=5b462347458a373b2d599c6f416d2b75eddbffad&v=4 url: https://github.com/Yarous -ABcDexter: - login: ABcDexter - count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/7236257?u=baa7e62eb4d0014b5854bfd0d5c2b20bd9617e0d&v=4 - url: https://github.com/ABcDexter dimaqq: login: dimaqq count: 8 @@ -756,7 +756,7 @@ EdmilsonRodrigues: roli2py: login: roli2py count: 8 - avatarUrl: https://avatars.githubusercontent.com/u/61126128?u=bcb7a286e435a6b9d6a84b07db1232580ee796d4&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/61126128?u=d20921080d6b9499b39ef3431e850432fe68f903&v=4 url: https://github.com/roli2py Serrones: login: Serrones @@ -1281,7 +1281,7 @@ rafsaf: frnsimoes: login: frnsimoes count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/66239468?u=be491199e4695bb0ac43d17d59cf7d41f9df629f&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/66239468?u=c86ceed4afa180477e28b9ff0019ab894a1e1eb9&v=4 url: https://github.com/frnsimoes lieryan: login: lieryan diff --git a/docs/en/data/translators.yml b/docs/en/data/translators.yml index d0ca9a1d6..ccad6767f 100644 --- a/docs/en/data/translators.yml +++ b/docs/en/data/translators.yml @@ -5,7 +5,7 @@ nilslindemann: url: https://github.com/nilslindemann tiangolo: login: tiangolo - count: 78 + count: 100 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo jaystone776: @@ -23,6 +23,11 @@ valentinDruzhinin: count: 29 avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 url: https://github.com/valentinDruzhinin +YuriiMotov: + login: YuriiMotov + count: 24 + avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4 + url: https://github.com/YuriiMotov tokusumi: login: tokusumi count: 23 @@ -33,11 +38,6 @@ SwftAlpc: count: 23 avatarUrl: https://avatars.githubusercontent.com/u/52768429?u=6a3aa15277406520ad37f6236e89466ed44bc5b8&v=4 url: https://github.com/SwftAlpc -YuriiMotov: - login: YuriiMotov - count: 23 - avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4 - url: https://github.com/YuriiMotov hasansezertasan: login: hasansezertasan count: 22 @@ -466,7 +466,7 @@ ArtemKhymenko: hasnatsajid: login: hasnatsajid count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/86589885?u=3712c0362d7a4000d76022339c545cf46aa5903f&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/86589885?u=a1f0d462a558e4fc7271bfcdc7e5e7de92b9e10b&v=4 url: https://github.com/hasnatsajid alperiox: login: alperiox From 0df0261757e65fc8a8f22e2b8dff194ea349ddeb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 10:21:05 +0000 Subject: [PATCH 244/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index f40434bb2..ede72a33f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Internal +* đŸ‘„ Update FastAPI People - Contributors and Translators. PR [#15878](https://github.com/fastapi/fastapi/pull/15878) by [@tiangolo](https://github.com/tiangolo). * đŸ‘· Remove not needed `allow-unsafe-pr-checkout: true`. PR [#15876](https://github.com/fastapi/fastapi/pull/15876) by [@YuriiMotov](https://github.com/YuriiMotov). * ⬆ Bump the github-actions group with 5 updates. PR [#15872](https://github.com/fastapi/fastapi/pull/15872) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump the python-packages group across 1 directory with 10 updates. PR [#15870](https://github.com/fastapi/fastapi/pull/15870) by [@dependabot[bot]](https://github.com/apps/dependabot). From f206f06f1a44e743720fdd5153a68af038098a5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 12:31:35 +0200 Subject: [PATCH 245/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20ru=20(add-missing)=20(#15879)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] Co-authored-by: Yurii Motov <109919500+YuriiMotov@users.noreply.github.com> --- docs/ru/docs/tutorial/frontend.md | 133 ++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/ru/docs/tutorial/frontend.md diff --git a/docs/ru/docs/tutorial/frontend.md b/docs/ru/docs/tutorial/frontend.md new file mode 100644 index 000000000..3b3e43809 --- /dev/null +++ b/docs/ru/docs/tutorial/frontend.md @@ -0,0 +1,133 @@ +# Đ€Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ { #frontend } + +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” Â«ĐŸŃ‚ĐŽĐ°ĐČĐ°Ń‚ŃŒÂ» статОчДсĐșОД Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `app.frontend()` (ОлО `router.frontend()`). + +Đ­Ń‚ĐŸ ĐżĐŸĐ»Đ”Đ·ĐœĐŸ ĐŽĐ»Ń Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ĐžĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚ĐŸĐČ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐłĐ”ĐœĐ”Ń€ĐžŃ€ŃƒŃŽŃ‚ статОчДсĐșОД фаĐčлы, таĐșох ĐșаĐș React с Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid Đž Юругох. + +ĐĄ таĐșĐžĐŒĐž ĐžĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đ°ĐŒĐž ĐŸĐ±Ń‹Ń‡ĐœĐŸ Đ”ŃŃ‚ŃŒ этап ŃĐ±ĐŸŃ€ĐșĐž Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ° с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ ĐșĐŸĐŒĐ°ĐœĐŽŃ‹ ĐČŃ€ĐŸĐŽĐ”: + +```bash +npm run build +``` + +ĐžĐœĐ° ŃĐłĐ”ĐœĐ”Ń€ĐžŃ€ŃƒĐ”Ń‚ ЎОрДĐșŃ‚ĐŸŃ€ĐžŃŽ ĐČŃ€ĐŸĐŽĐ” `./dist/` с фаĐčĐ»Đ°ĐŒĐž ĐČĐ°ŃˆĐ”ĐłĐŸ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ°. + +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать `app.frontend()`, Ń‡Ń‚ĐŸĐ±Ń‹ Â«ĐŸŃ‚ĐŽĐ°ĐČĐ°Ń‚ŃŒÂ» эту ЎОрДĐșŃ‚ĐŸŃ€ĐžŃŽ, ŃĐ»Đ”ĐŽŃƒŃ ŃĐŸĐłĐ»Đ°ŃˆĐ”ĐœĐžŃĐŒ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” Ń‚Ń€Đ”Đ±ŃƒŃŽŃ‚ŃŃ ŃŃ‚ĐžĐŒ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-фрДĐčĐŒĐČĐŸŃ€ĐșĐ°ĐŒ. + +**FastAPI** ŃĐœĐ°Ń‡Đ°Đ»Đ° ĐżŃ€ĐŸĐČĐ”Ń€ŃĐ”Ń‚ *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*. ЀаĐčлы Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ° ĐżŃ€ĐŸĐČĐ”Ń€ŃŃŽŃ‚ŃŃ Ń‚ĐŸĐ»ŃŒĐșĐŸ ДслО ĐœĐ” ŃĐŸĐČпал ĐœĐž ĐŸĐŽĐžĐœ ĐŸĐ±Ń‹Ń‡ĐœŃ‹Đč ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚, ĐżĐŸŃŃ‚ĐŸĐŒŃƒ ĐČаш API ĐœĐ” Đ±ŃƒĐŽĐ”Ń‚ Đ·Đ°Ń‚Ń€ĐŸĐœŃƒŃ‚. + +## ОтЮача Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ° { #serve-a-frontend } + +ĐŸĐŸŃĐ»Đ” ŃĐ±ĐŸŃ€ĐșĐž Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ°, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `npm run build`, ĐżĐŸĐŒĐ”ŃŃ‚ĐžŃ‚Đ” ŃĐłĐ”ĐœĐ”Ń€ĐžŃ€ĐŸĐČĐ°ĐœĐœŃ‹Đ” фаĐčлы ĐČ ĐŽĐžŃ€Đ”ĐșŃ‚ĐŸŃ€ĐžŃŽ, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ `dist`. + +СтруĐșтура ĐČĐ°ŃˆĐ”ĐłĐŸ ĐżŃ€ĐŸĐ”Đșта ĐŒĐŸĐ¶Đ”Ń‚ ĐČŃ‹ĐłĐ»ŃĐŽĐ”Ń‚ŃŒ таĐș: + +```text +. +├── pyproject.toml +├── app +│ ├── __init__.py +│ └── main.py +└── dist + ├── index.html + └── assets + └── app.js +``` + +Đ—Đ°Ń‚Đ”ĐŒ Â«ĐŸŃ‚ĐŽĐ°ĐČаĐčтД» Дё с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `app.frontend()`: + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +Про ŃŃ‚ĐŸĐŒ Đ·Đ°ĐżŃ€ĐŸŃ Đș `/assets/app.js` ĐŒĐŸĐ¶Đ”Ń‚ ĐŸŃ‚ĐŽĐ°Ń‚ŃŒ `dist/assets/app.js`. + +ЕслО у ĐČас таĐșжД Đ”ŃŃ‚ŃŒ *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃ путо* **FastAPI**, ĐżŃ€ĐžĐŸŃ€ĐžŃ‚Đ”Ń‚ Đ±ŃƒĐŽĐ”Ń‚ у *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*. + +## ĐœĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†ĐžŃ ĐœĐ° ŃŃ‚ĐŸŃ€ĐŸĐœĐ” ĐșĐ»ĐžĐ”ĐœŃ‚Đ° { #client-side-routing } + +ĐœĐœĐŸĐłĐžĐ” Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ, ĐČĐșĐ»ŃŽŃ‡Đ°Ń **single-page apps** (SPA), ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃŽŃ‚ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†ĐžŃŽ ĐœĐ° ŃŃ‚ĐŸŃ€ĐŸĐœĐ” ĐșĐ»ĐžĐ”ĐœŃ‚Đ°. Путь ĐČŃ€ĐŸĐŽĐ” `/dashboard/settings` ĐŒĐŸĐ¶Đ”Ń‚ ĐœĐ” Đ±Ń‹Ń‚ŃŒ Ń€Đ”Đ°Đ»ŃŒĐœŃ‹ĐŒ фаĐčĐ»ĐŸĐŒ, ĐœĐŸ фрДĐčĐŒĐČĐŸŃ€Đș ĐČĐŸĐ·ŃŒĐŒŃ‘Ń‚ ĐœĐ° ŃĐ”Đ±Ń Đ”ĐłĐŸ ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Đșу. + +ĐŸĐŸŃŃ‚ĐŸĐŒŃƒ, ДслО ĐŸĐ±Ń€Đ°Ń‚ĐžŃ‚ŃŒŃŃ Đș ŃŃ‚ĐŸĐŒŃƒ URL ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ (а ĐœĐ” пДрДĐčто Đș ĐœĐ”ĐŒŃƒ чДрДз ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”), backend ĐŽĐŸĐ»Đ¶Đ”Đœ ĐŸŃ‚ĐŽĐ°Ń‚ŃŒ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” Оз `index.html`, Ń‡Ń‚ĐŸĐ±Ń‹ Đ·Đ°Ń‚Đ”ĐŒ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-фрДĐčĐŒĐČĐŸŃ€Đș ĐŒĐŸĐł ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Đ°Ń‚ŃŒ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†ĐžŃŽ ĐœĐ° ŃŃ‚ĐŸŃ€ĐŸĐœĐ” ĐșĐ»ĐžĐ”ĐœŃ‚Đ°. + +Đ”Đ»Ń ŃŃ‚ĐŸĐłĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД `fallback="index.html"`: + +{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} + +**FastAPI** ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ ŃŃ‚ĐŸŃ‚ fallback Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐŽĐ»Ń Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ `GET` Đž `HEAD`, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐżĐŸŃ…ĐŸĐ¶Đž ĐœĐ° ĐœĐ°ĐČогацою ĐČ Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Đ”. ОтсутстĐČŃƒŃŽŃ‰ĐžĐ” фаĐčлы, таĐșОД ĐșаĐș JavaScript, CSS Đž ĐžĐ·ĐŸĐ±Ń€Đ°Đ¶Đ”ĐœĐžŃ, ĐżĐŸ-ĐżŃ€Đ”Đ¶ĐœĐ”ĐŒŃƒ ĐČĐŸĐ·ĐČращают `404`. + +Đ—Đ°ĐżŃ€ĐŸŃŃ‹ с ĐŽŃ€ŃƒĐłĐžĐŒĐž ĐŒĐ”Ń‚ĐŸĐŽĐ°ĐŒĐž, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ `POST` ОлО `PUT`, Đș ĐżŃƒŃ‚ŃĐŒ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ŃĐŸĐČпаЮают Ń‚ĐŸĐ»ŃŒĐșĐŸ с fallback Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ°, таĐșжД ĐČĐŸĐ·ĐČращают `404`. ĐžĐ±Ń‹Ń‡ĐœŃ‹Đ” *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* **FastAPI** ĐżĐŸ-ĐżŃ€Đ”Đ¶ĐœĐ”ĐŒŃƒ ĐžĐŒĐ”ŃŽŃ‚ Đ±ĐŸĐ»Đ”Đ” ĐČŃ‹ŃĐŸĐșĐžĐč ĐżŃ€ĐžĐŸŃ€ĐžŃ‚Đ”Ń‚, Ń‡Đ”ĐŒ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Ń‹ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ°. + +/// tip | ĐĄĐŸĐČДт + +ĐŸĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ `fallback` ĐžĐŒĐ”Đ”Ń‚ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” `fallback="auto"`. В Đ±ĐŸĐ»ŃŒŃˆĐžĐœŃŃ‚ĐČĐ” ŃĐ»ŃƒŃ‡Đ°Đ”ĐČ ĐČĐ°ĐŒ ĐœĐ” ĐœŃƒĐ¶ĐœĐŸ Đ±ŃƒĐŽĐ”Ń‚ уĐșазыĐČать `fallback`. ĐŸĐŸĐŽŃ€ĐŸĐ±ĐœĐŸŃŃ‚Đž ĐœĐžĐ¶Đ”. + +/// + +Đ˜ĐŒĐ”ĐœĐœĐŸ таĐșĐŸĐ” ĐżĐŸĐČĐ”ĐŽĐ”ĐœĐžĐ” ĐœŃƒĐ¶ĐœĐŸ ĐŽĐ»Ń ĐŒĐœĐŸĐłĐžŃ… Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃŽŃ‚ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†ĐžŃŽ ĐœĐ° ŃŃ‚ĐŸŃ€ĐŸĐœĐ” ĐșĐ»ĐžĐ”ĐœŃ‚Đ°, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ React с TanStack Router, Vue, Angular, SvelteKit ОлО Solid. + +## ĐšĐ°ŃŃ‚ĐŸĐŒĐœĐ°Ń ŃŃ‚Ń€Đ°ĐœĐžŃ†Đ° 404 { #custom-404-page } + +Вы таĐșжД ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸŃ‚ĐŽĐ°ĐČать статОчДсĐșую ŃŃ‚Ń€Đ°ĐœĐžŃ†Ńƒ `404.html` ĐŽĐ»Ń ĐŸŃ‚ŃŃƒŃ‚ŃŃ‚ĐČующох ĐżŃƒŃ‚Đ”Đč Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ°: + +{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *} + +Đ­Ń‚ĐŸŃ‚ HTTP-ĐŸŃ‚ĐČДт ŃĐŸŃ…Ń€Đ°ĐœŃĐ”Ń‚ статус-ĐșĐŸĐŽ `404`. + +В ŃŃ‚ĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” **FastAPI** ĐœĐ” Đ±ŃƒĐŽĐ”Ń‚ ĐŸŃ‚ĐŽĐ°ĐČать `index.html` ĐŽĐ»Ń ĐŸŃ‚ŃŃƒŃ‚ŃŃ‚ĐČующох ĐżŃƒŃ‚Đ”Đč Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ°. Đ’ĐŒĐ”ŃŃ‚ĐŸ ŃŃ‚ĐŸĐłĐŸ ĐŸĐœ ĐČĐ”Ń€ĐœŃ‘Ń‚ фаĐčĐ» `404.html`. + +/// tip | ĐĄĐŸĐČДт + +ĐŸĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ `fallback` ĐžĐŒĐ”Đ”Ń‚ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” `fallback="auto"`. Про ŃŃ‚ĐŸĐŒ, ДслО ĐœĐ°ĐčĐŽĐ”Đœ фаĐčĐ» `404.html`, ĐŸĐœ Đ±ŃƒĐŽĐ”Ń‚ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Đœ ĐșаĐș fallback. + +ĐŸĐŸŃŃ‚ĐŸĐŒŃƒ ĐŸĐ±Ń‹Ń‡ĐœĐŸ ĐŒĐŸĐ¶ĐœĐŸ ĐœĐ” уĐșазыĐČать Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚ `fallback`. + +/// + +Đ­Ń‚ĐŸ ĐżĐŸĐ»Đ”Đ·ĐœĐŸ с Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ĐžĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đ°ĐŒĐž, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐłĐ”ĐœĐ”Ń€ĐžŃ€ŃƒŃŽŃ‚ статОчДсĐșОД HTML-фаĐčлы ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐč ŃŃ‚Ń€Đ°ĐœĐžŃ†Ń‹, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ Astro. + +## АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐžĐč fallback { #fallback-auto } + +ĐŸĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ `app.frontend()` ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ `fallback="auto"`. + +ЕслО ĐČ ĐŽĐžŃ€Đ”ĐșŃ‚ĐŸŃ€ĐžĐž Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ° Đ”ŃŃ‚ŃŒ фаĐčĐ» `404.html`, ĐŸŃ‚ŃŃƒŃ‚ŃŃ‚ĐČŃƒŃŽŃ‰ĐžĐ” путо Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ° ĐŸŃ‚ĐŽĐ°ŃŽŃ‚ ŃŃ‚ĐŸŃ‚ фаĐčĐ» ŃĐŸ статус-ĐșĐŸĐŽĐŸĐŒ `404`. + +В ĐżŃ€ĐŸŃ‚ĐžĐČĐœĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ”, ДслО Đ”ŃŃ‚ŃŒ фаĐčĐ» `index.html`, ĐŸŃ‚ŃŃƒŃ‚ŃŃ‚ĐČŃƒŃŽŃ‰ĐžĐ” путо ĐœĐ°ĐČогацоо ĐČ Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Đ” ĐŸŃ‚ĐŽĐ°ŃŽŃ‚ `index.html`, Ń‡Ń‚ĐŸ Đž ĐŸĐ¶ĐžĐŽĐ°ŃŽŃ‚ ĐŒĐœĐŸĐłĐžĐ” Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ с ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†ĐžĐ”Đč ĐœĐ° ŃŃ‚ĐŸŃ€ĐŸĐœĐ” ĐșĐ»ĐžĐ”ĐœŃ‚Đ°. + +ĐŸĐŸŃŃ‚ĐŸĐŒŃƒ ĐČ Đ±ĐŸĐ»ŃŒŃˆĐžĐœŃŃ‚ĐČĐ” ŃĐ»ŃƒŃ‡Đ°Đ”ĐČ ĐŒĐŸĐ¶ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать `app.frontend("/", directory="dist")` бДз уĐșĐ°Đ·Đ°ĐœĐžŃ Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Đ° `fallback`. + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +## ОтĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” fallback { #disable-fallback } + +ЕслО ĐČы ĐœĐ” Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐŸŃ‚ĐŽĐ°ĐČать fallback-фаĐčĐ» ĐŽĐ»Ń ĐŸŃ‚ŃŃƒŃ‚ŃŃ‚ĐČующох ĐżŃƒŃ‚Đ”Đč Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ°, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД `fallback=None`: + +{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *} + +ĐąĐŸĐłĐŽĐ° ĐŸŃ‚ŃŃƒŃ‚ŃŃ‚ĐČŃƒŃŽŃ‰ĐžĐ” путо Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ° Đ±ŃƒĐŽŃƒŃ‚ ĐČĐŸĐ·ĐČращать ĐŸĐ±Ń‹Ń‡ĐœŃ‹Đč `404`. + +## ĐŸŃ€ĐŸĐČДрĐșа ЎОрДĐșŃ‚ĐŸŃ€ĐžĐž { #check-directory } + +ĐŸĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ `app.frontend()` ĐżŃ€ĐŸĐČĐ”Ń€ŃĐ”Ń‚, Ń‡Ń‚ĐŸ ЎОрДĐșŃ‚ĐŸŃ€ĐžŃ ŃŃƒŃ‰Đ”ŃŃ‚ĐČŃƒĐ”Ń‚, про ŃĐŸĐ·ĐŽĐ°ĐœĐžĐž ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ. + +Đ­Ń‚ĐŸ ĐżĐŸĐŒĐŸĐłĐ°Đ”Ń‚ Ń€Đ°ĐœĐŸ ĐŸĐ±ĐœĐ°Ń€ŃƒĐ¶ĐžĐČать ĐŸŃˆĐžĐ±ĐșĐž ĐșĐŸĐœŃ„ĐžĐłŃƒŃ€Đ°Ń†ĐžĐž. ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ДслО ĐŸŃ‚ŃŃƒŃ‚ŃŃ‚ĐČŃƒĐ”Ń‚ ЎОрДĐșŃ‚ĐŸŃ€ĐžŃ с Ń€Đ”Đ·ŃƒĐ»ŃŒŃ‚Đ°Ń‚ĐŸĐŒ ŃĐ±ĐŸŃ€ĐșĐž Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ°, **FastAPI** ĐČŃ‹Đ·ĐŸĐČДт ĐŸŃˆĐžĐ±Đșу про запусĐșĐ”. + +ЕслО ĐČашО Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-фаĐčлы ŃĐŸĐ·ĐŽĐ°ŃŽŃ‚ŃŃ ĐżĐŸĐ·Đ¶Đ”, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ ĐŸŃ‚ĐŽĐ”Đ»ŃŒĐœŃ‹ĐŒ ŃŃ‚Đ°ĐżĐŸĐŒ ŃĐ±ĐŸŃ€ĐșĐž ĐżĐŸŃĐ»Đ” ŃĐŸĐ·ĐŽĐ°ĐœĐžŃ ĐŸĐ±ŃŠĐ”Đșта ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ, ŃƒŃŃ‚Đ°ĐœĐŸĐČОтД `check_dir=False`: + +{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *} + +ĐĄ `check_dir=False` **FastAPI** ĐœĐ” Đ±ŃƒĐŽĐ”Ń‚ ĐżŃ€ĐŸĐČĐ”Ń€ŃŃ‚ŃŒ ЎОрДĐșŃ‚ĐŸŃ€ĐžŃŽ про ŃĐŸĐ·ĐŽĐ°ĐœĐžĐž ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ. ЕслО ĐœĐ°ŃŃ‚Ń€ĐŸĐ”ĐœĐœĐ°Ń ЎОрДĐșŃ‚ĐŸŃ€ĐžŃ ĐČсё Дщё ĐŸŃ‚ŃŃƒŃ‚ŃŃ‚ĐČŃƒĐ”Ń‚ ĐČĐŸ ĐČŃ€Đ”ĐŒŃ ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐž HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°, **FastAPI** ĐČŃ‹Đ·ĐŸĐČДт ĐŸŃˆĐžĐ±Đșу Ń‚ĐŸĐłĐŽĐ°. + +## Đ˜ŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ” с `APIRouter` { #use-it-with-apirouter } + +Вы таĐșжД ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽĐŸĐ±Đ°ĐČоть Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-фаĐčлы ĐČ `APIRouter` Đž ĐČĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ Đ”ĐłĐŸ с прДфОĐșŃĐŸĐŒ: + +{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *} + +В ŃŃ‚ĐŸĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ” путо Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ° ĐŸŃ‚ĐŽĐ°ŃŽŃ‚ŃŃ ĐżĐŸĐŽ `/app`. + +ЛюбыД ĐŸĐ±Ń‹Ń‡ĐœŃ‹Đ” *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ĐČ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐž ĐČсё раĐČĐœĐŸ Đ±ŃƒĐŽŃƒŃ‚ ĐžĐŒĐ”Ń‚ŃŒ ĐżŃ€ĐžĐŸŃ€ĐžŃ‚Đ”Ń‚, ĐČĐșĐ»ŃŽŃ‡Đ°Ń ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž ĐČ ĐŽŃ€ŃƒĐłĐžŃ… Ń€ĐŸŃƒŃ‚Đ”Ń€Đ°Ń…. + +## ĐąĐŸĐ»ŃŒĐșĐŸ статОчДсĐșĐžĐč Ń€Đ”Đ·ŃƒĐ»ŃŒŃ‚Đ°Ń‚ ŃĐ±ĐŸŃ€ĐșĐž { #static-build-output-only } + +`app.frontend()` ĐŸŃ‚ĐŽĐ°Ń‘Ń‚ фаĐčлы, ужД ŃĐłĐ”ĐœĐ”Ń€ĐžŃ€ĐŸĐČĐ°ĐœĐœŃ‹Đ” ŃĐ±ĐŸŃ€ĐșĐŸĐč ĐČĐ°ŃˆĐ”ĐłĐŸ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ°. + +ĐžĐœ ĐœĐ” запусĐșаДт server-side rendering. ĐžĐœ ĐżŃ€Đ”ĐŽĐœĐ°Đ·ĐœĐ°Ń‡Đ”Đœ ĐŽĐ»Ń Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-фрДĐčĐŒĐČĐŸŃ€ĐșĐŸĐČ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐłĐ”ĐœĐ”Ń€ĐžŃ€ŃƒŃŽŃ‚ статОчДсĐșОД фаĐčлы, а ĐœĐ” ĐŽĐ»Ń фрДĐčĐŒĐČĐŸŃ€ĐșĐŸĐČ, ĐșĐŸŃ‚ĐŸŃ€Ń‹ĐŒ Ń‚Ń€Đ”Đ±ŃƒĐ”Ń‚ŃŃ ĐŽĐžĐœĐ°ĐŒĐžŃ‡Đ”ŃĐșĐžĐč Ń€Đ”ĐœĐŽĐ”Ń€ĐžĐœĐł ĐœĐ° сДрĐČДрД ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°. From bf41b93fafb6540f254edba93a007e79d65c1947 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 10:31:59 +0000 Subject: [PATCH 246/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index ede72a33f..ff1efc73a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,10 @@ hide: ## Latest Changes +### Translations + +* 🌐 Update translations for ru (add-missing). PR [#15879](https://github.com/fastapi/fastapi/pull/15879) by [@tiangolo](https://github.com/tiangolo). + ### Internal * đŸ‘„ Update FastAPI People - Contributors and Translators. PR [#15878](https://github.com/fastapi/fastapi/pull/15878) by [@tiangolo](https://github.com/tiangolo). From 065e7deee4b944684c12a8fa4a808760ff428759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 12:32:25 +0200 Subject: [PATCH 247/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20de=20(add-missing)=20(#15884)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/de/docs/tutorial/frontend.md | 133 ++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/de/docs/tutorial/frontend.md diff --git a/docs/de/docs/tutorial/frontend.md b/docs/de/docs/tutorial/frontend.md new file mode 100644 index 000000000..9cd4644d9 --- /dev/null +++ b/docs/de/docs/tutorial/frontend.md @@ -0,0 +1,133 @@ +# Frontend { #frontend } + +Sie können statische Frontend-Apps mit `app.frontend()` (oder `router.frontend()`) bereitstellen. + +Das ist nĂŒtzlich fĂŒr Frontend-Tools, die statische Dateien generieren, wie React mit Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid und andere. + +Mit diesen Tools haben Sie normalerweise einen Schritt, der das Frontend baut, mit einem Befehl wie: + +```bash +npm run build +``` + +Das wĂŒrde ein Verzeichnis wie `./dist/` mit Ihren Frontend-Dateien generieren. + +Sie können `app.frontend()` verwenden, um dieses Verzeichnis gemĂ€ĂŸ den Konventionen bereitzustellen, die von diesen Frontend-Frameworks benötigt werden. + +**FastAPI** prĂŒft zuerst *Pfadoperationen*. Die Frontend-Dateien werden nur geprĂŒft, wenn keine normale Route gepasst hat, sodass Ihre API nicht beeintrĂ€chtigt wird. + +## Ein Frontend bereitstellen { #serve-a-frontend } + +Nachdem Sie Ihr Frontend gebaut haben, zum Beispiel mit `npm run build`, legen Sie die generierten Dateien in ein Verzeichnis, zum Beispiel `dist`. + +Ihre Projektstruktur könnte so aussehen: + +```text +. +├── pyproject.toml +├── app +│ ├── __init__.py +│ └── main.py +└── dist + ├── index.html + └── assets + └── app.js +``` + +Stellen Sie es dann mit `app.frontend()` bereit: + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +Damit kann ein Request fĂŒr `/assets/app.js` `dist/assets/app.js` ausliefern. + +Wenn Sie außerdem eine **FastAPI**-*Pfadoperation* haben, gewinnt die *Pfadoperation*. + +## Clientseitiges Routing { #client-side-routing } + +Viele Frontend-Apps, einschließlich **Single-Page-Apps** (SPAs), verwenden clientseitiges Routing. Ein Pfad wie `/dashboard/settings` ist möglicherweise keine echte Datei, aber das Framework wĂŒrde sich darum kĂŒmmern, ihn zu handhaben. + +Wenn also direkt auf diese URL zugegriffen wird (statt durch die App zu navigieren), sollte das Backend die Frontend-App von `index.html` bereitstellen, sodass das Frontend-Framework anschließend das clientseitige Routing handhaben kann. + +Verwenden Sie dafĂŒr `fallback="index.html"`: + +{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} + +**FastAPI** verwendet diesen Fallback nur fĂŒr `GET`- und `HEAD`-Requests, die wie Browser-Navigation aussehen. Fehlende Dateien wie JavaScript, CSS und Bilder geben weiterhin `404` zurĂŒck. + +Requests mit anderen Methoden, wie `POST` oder `PUT`, an Pfade, die nur zum Frontend-Fallback passen, geben ebenfalls `404` zurĂŒck. RegulĂ€re **FastAPI**-*Pfadoperationen* haben weiterhin eine höhere PrioritĂ€t als Frontend-Routen. + +/// tip | Tipp + +StandardmĂ€ĂŸig hat `fallback` einen Wert von `fallback="auto"`. In den meisten FĂ€llen mĂŒssen Sie `fallback` nicht angeben. Lesen Sie weiter unten die Details. + +/// + +Das ist das, was Sie bei vielen Frontend-Apps möchten, die clientseitiges Routing verwenden, zum Beispiel React mit TanStack Router, Vue, Angular, SvelteKit oder Solid. + +## Benutzerdefinierte 404-Seite { #custom-404-page } + +Sie können auch eine statische `404.html`-Seite fĂŒr fehlende Frontend-Pfade ausliefern: + +{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *} + +Diese Response behĂ€lt einen Statuscode von `404`. + +In diesem Fall liefert **FastAPI** fĂŒr fehlende Frontend-Pfade nicht `index.html` aus. Stattdessen wird die Datei `404.html` zurĂŒckgegeben. + +/// tip | Tipp + +StandardmĂ€ĂŸig hat `fallback` einen Wert von `fallback="auto"`. Damit wird, wenn eine `404.html`-Datei gefunden wird, diese automatisch als Fallback verwendet. + +Sie können das `fallback`-Argument also normalerweise weglassen. + +/// + +Das ist nĂŒtzlich bei Frontend-Tools, die fĂŒr jede Seite statische HTML-Dateien generieren, wie Astro. + +## Automatischer Fallback { #fallback-auto } + +StandardmĂ€ĂŸig verwendet `app.frontend()` `fallback="auto"`. + +Wenn es im Frontend-Verzeichnis eine `404.html`-Datei gibt, liefern fehlende Frontend-Pfade diese Datei mit dem Statuscode `404` aus. + +Andernfalls, wenn es eine `index.html`-Datei gibt, liefern fehlende Browser-Navigationspfade `index.html` aus, was viele Frontend-Apps mit clientseitigem Routing erwarten. + +In den meisten FĂ€llen können Sie also `app.frontend("/", directory="dist")` verwenden, ohne das `fallback`-Argument anzugeben. + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +## Fallback deaktivieren { #disable-fallback } + +Wenn Sie keine Fallback-Datei fĂŒr fehlende Frontend-Pfade ausliefern möchten, verwenden Sie `fallback=None`: + +{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *} + +Dann geben fehlende Frontend-Pfade das normale `404` zurĂŒck. + +## Verzeichnis prĂŒfen { #check-directory } + +StandardmĂ€ĂŸig prĂŒft `app.frontend()`, dass das Verzeichnis existiert, wenn die App erstellt wird. + +Das hilft, Konfigurationsfehler frĂŒh zu erkennen. Wenn zum Beispiel das Output-Verzeichnis des Frontend-Builds fehlt, löst **FastAPI** beim Startup einen Fehler aus. + +Wenn Ihre Frontend-Dateien spĂ€ter erstellt werden, zum Beispiel durch einen separaten Build-Schritt, nachdem das App-Objekt erstellt wurde, setzen Sie `check_dir=False`: + +{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *} + +Mit `check_dir=False` prĂŒft **FastAPI** das Verzeichnis nicht, wenn die App erstellt wird. Wenn das konfigurierte Verzeichnis beim Verarbeiten eines Requests immer noch fehlt, löst **FastAPI** dann einen Fehler aus. + +## Mit `APIRouter` verwenden { #use-it-with-apirouter } + +Sie können Frontend-Dateien auch zu einem `APIRouter` hinzufĂŒgen und ihn mit einem PrĂ€fix einbinden: + +{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *} + +In diesem Beispiel werden Frontend-Pfade unter `/app` bereitgestellt. + +Alle regulĂ€ren *Pfadoperationen* in der App haben weiterhin Vorrang, auch in anderen Routern. + +## Nur statischer Build-Output { #static-build-output-only } + +`app.frontend()` liefert Dateien aus, die bereits von Ihrem Frontend-Build generiert wurden. + +Es fĂŒhrt kein serverseitiges Rendering aus. Es ist fĂŒr Frontend-Frameworks gedacht, die statische Dateien generieren, nicht fĂŒr Frameworks, die dynamisches Rendering auf dem Server fĂŒr jeden Request benötigen. From a3aa0703a638886d2a72777a24804f57a54d94ac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 10:33:25 +0000 Subject: [PATCH 248/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index ff1efc73a..f7cb3bb5f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for de (add-missing). PR [#15884](https://github.com/fastapi/fastapi/pull/15884) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ru (add-missing). PR [#15879](https://github.com/fastapi/fastapi/pull/15879) by [@tiangolo](https://github.com/tiangolo). ### Internal From 241b9a70a89c390195ec1f0ba087d8418987692a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 12:34:11 +0200 Subject: [PATCH 249/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20fr=20(add-missing)=20(#15881)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/fr/docs/tutorial/frontend.md | 133 ++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/fr/docs/tutorial/frontend.md diff --git a/docs/fr/docs/tutorial/frontend.md b/docs/fr/docs/tutorial/frontend.md new file mode 100644 index 000000000..6adb8a241 --- /dev/null +++ b/docs/fr/docs/tutorial/frontend.md @@ -0,0 +1,133 @@ +# Frontend { #frontend } + +Vous pouvez servir des applications frontend statiques avec `app.frontend()` (ou `router.frontend()`). + +C'est utile pour les outils frontend qui gĂ©nĂšrent des fichiers statiques, comme React avec Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid, et d'autres. + +Avec ces outils, vous avez normalement une Ă©tape qui build le frontend, avec une commande comme : + +```bash +npm run build +``` + +Cela gĂ©nĂ©rerait un rĂ©pertoire comme `./dist/` avec vos fichiers frontend. + +Vous pouvez utiliser `app.frontend()` pour servir ce rĂ©pertoire en suivant les conventions nĂ©cessaires Ă  ces frameworks frontend. + +**FastAPI** vĂ©rifie d'abord les *chemins d'accĂšs*. Les fichiers frontend ne sont vĂ©rifiĂ©s que si aucune route normale ne correspond, donc votre API ne sera pas affectĂ©e. + +## Servir un frontend { #serve-a-frontend } + +AprĂšs avoir build votre frontend, par exemple avec `npm run build`, placez les fichiers gĂ©nĂ©rĂ©s dans un rĂ©pertoire, par exemple `dist`. + +La structure de votre projet pourrait ressembler Ă  ceci : + +```text +. +├── pyproject.toml +├── app +│ ├── __init__.py +│ └── main.py +└── dist + ├── index.html + └── assets + └── app.js +``` + +Servez-le ensuite avec `app.frontend()` : + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +Avec cela, une requĂȘte vers `/assets/app.js` peut servir `dist/assets/app.js`. + +Si vous avez Ă©galement un *chemin d'accĂšs* **FastAPI**, le *chemin d'accĂšs* est prioritaire. + +## Routage cĂŽtĂ© client { #client-side-routing } + +De nombreuses applications frontend, y compris les **applications monopages** (SPAs), utilisent le routage cĂŽtĂ© client. Un chemin comme `/dashboard/settings` peut ne pas ĂȘtre un vrai fichier, mais le framework se chargerait de le gĂ©rer. + +Ainsi, si vous accĂ©dez directement Ă  cette URL (au lieu de naviguer via l'application), le backend doit servir l'application frontend depuis `index.html`, afin que le framework frontend puisse ensuite gĂ©rer le routage cĂŽtĂ© client. + +Pour cela, utilisez `fallback="index.html"` : + +{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} + +**FastAPI** utilise ce fallback uniquement pour les requĂȘtes `GET` et `HEAD` qui ressemblent Ă  une navigation de navigateur. Les fichiers manquants comme JavaScript, CSS et les images renvoient toujours `404`. + +Les requĂȘtes avec d'autres mĂ©thodes, comme `POST` ou `PUT`, vers des chemins qui ne correspondent qu'au fallback frontend renvoient Ă©galement `404`. Les *chemins d'accĂšs* **FastAPI** rĂ©guliers ont toujours une prioritĂ© plus Ă©levĂ©e que les routes frontend. + +/// tip | Astuce + +Par dĂ©faut, `fallback` a une valeur de `fallback="auto"`. Dans la plupart des cas, vous n'avez pas besoin de spĂ©cifier `fallback`. Lisez ci-dessous pour plus de dĂ©tails. + +/// + +C'est ce que vous souhaitez avec de nombreuses applications frontend qui utilisent le routage cĂŽtĂ© client, par exemple React avec TanStack Router, Vue, Angular, SvelteKit ou Solid. + +## Page 404 personnalisĂ©e { #custom-404-page } + +Vous pouvez Ă©galement servir une page statique `404.html` pour les chemins frontend manquants : + +{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *} + +Cette rĂ©ponse conserve un code de statut `404`. + +Dans ce cas, **FastAPI** ne servira pas `index.html` pour les chemins frontend manquants. Il renverra le fichier `404.html` Ă  la place. + +/// tip | Astuce + +Par dĂ©faut, `fallback` a une valeur de `fallback="auto"`. Avec cela, si un fichier `404.html` est trouvĂ©, il sera utilisĂ© automatiquement comme fallback. + +Vous pouvez donc normalement omettre l'argument `fallback`. + +/// + +C'est utile avec les outils frontend qui gĂ©nĂšrent des fichiers HTML statiques pour chaque page, comme Astro. + +## Fallback automatique { #fallback-auto } + +Par dĂ©faut, `app.frontend()` utilise `fallback="auto"`. + +S'il y a un fichier `404.html` dans le rĂ©pertoire frontend, les chemins frontend manquants servent ce fichier avec le code de statut `404`. + +Sinon, s'il y a un fichier `index.html`, les chemins de navigation de navigateur manquants servent `index.html`, ce qui est attendu par de nombreuses applications frontend avec routage cĂŽtĂ© client. + +Ainsi, dans la plupart des cas, vous pouvez utiliser `app.frontend("/", directory="dist")` sans spĂ©cifier l'argument `fallback`. + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +## DĂ©sactiver le fallback { #disable-fallback } + +Si vous ne souhaitez pas servir de fichier fallback pour les chemins frontend manquants, utilisez `fallback=None` : + +{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *} + +Les chemins frontend manquants renvoient alors le `404` normal. + +## VĂ©rifier le rĂ©pertoire { #check-directory } + +Par dĂ©faut, `app.frontend()` vĂ©rifie que le rĂ©pertoire existe lorsque l'application est créée. + +Cela permet de dĂ©tecter tĂŽt les erreurs de configuration. Par exemple, si le rĂ©pertoire de sortie du build frontend est manquant, **FastAPI** lĂšvera une erreur au dĂ©marrage. + +Si vos fichiers frontend sont créés plus tard, par exemple par une Ă©tape de build sĂ©parĂ©e aprĂšs la crĂ©ation de l'objet app, dĂ©finissez `check_dir=False` : + +{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *} + +Avec `check_dir=False`, **FastAPI** ne vĂ©rifiera pas le rĂ©pertoire lorsque l'application est créée. Si le rĂ©pertoire configurĂ© est toujours manquant lorsqu'une requĂȘte est traitĂ©e, **FastAPI** lĂšvera alors une erreur. + +## L'utiliser avec `APIRouter` { #use-it-with-apirouter } + +Vous pouvez Ă©galement ajouter des fichiers frontend Ă  un `APIRouter` et l'inclure avec un prĂ©fixe : + +{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *} + +Dans cet exemple, les chemins frontend sont servis sous `/app`. + +Tous les *chemins d'accĂšs* rĂ©guliers dans l'application seront toujours prioritaires, y compris dans d'autres routers. + +## Sortie de build statique uniquement { #static-build-output-only } + +`app.frontend()` sert des fichiers dĂ©jĂ  gĂ©nĂ©rĂ©s par votre build frontend. + +Il n'exĂ©cute pas de rendu cĂŽtĂ© serveur. Il est destinĂ© aux frameworks frontend qui gĂ©nĂšrent des fichiers statiques, pas aux frameworks qui nĂ©cessitent un rendu dynamique sur le serveur pour chaque requĂȘte. From c9f99ef24f75e573690d49df2fac8d1b83dcf627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 12:34:51 +0200 Subject: [PATCH 250/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20uk=20(add-missing)=20(#15886)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/uk/docs/tutorial/frontend.md | 133 ++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/uk/docs/tutorial/frontend.md diff --git a/docs/uk/docs/tutorial/frontend.md b/docs/uk/docs/tutorial/frontend.md new file mode 100644 index 000000000..c85e6693e --- /dev/null +++ b/docs/uk/docs/tutorial/frontend.md @@ -0,0 +1,133 @@ +# Đ€Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ { #frontend } + +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃĐ»ŃƒĐłĐŸĐČуĐČато ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ– Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ `app.frontend()` (Đ°Đ±ĐŸ `router.frontend()`). + +ĐŠĐ” ĐșĐŸŃ€ĐžŃĐœĐŸ ĐŽĐ»Ń Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ, яĐșі ĐłĐ”ĐœĐ”Ń€ŃƒŃŽŃ‚ŃŒ ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ– фаĐčлО, яĐș-ĐŸŃ‚ React Đ· Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid та Ń–ĐœŃˆŃ–. + +З таĐșĐžĐŒĐž Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đ°ĐŒĐž зазĐČочаĐč є ĐșŃ€ĐŸĐș, яĐșĐžĐč збОрає Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ, ĐșĐŸĐŒĐ°ĐœĐŽĐŸŃŽ ĐœĐ° ĐșŃˆŃ‚Đ°Đ»Ń‚: + +```bash +npm run build +``` + +ĐŠĐ” Đ·ĐłĐ”ĐœĐ”Ń€ŃƒŃ” ЎОрДĐșŃ‚ĐŸŃ€Ń–ŃŽ ĐœĐ° ĐșŃˆŃ‚Đ°Đ»Ń‚ `./dist/` Đ· ĐČĐ°ŃˆĐžĐŒĐž Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-фаĐčĐ»Đ°ĐŒĐž. + +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž `app.frontend()`, Ń‰ĐŸĐ± ĐŸĐ±ŃĐ»ŃƒĐłĐŸĐČуĐČато цю ЎОрДĐșŃ‚ĐŸŃ€Ń–ŃŽ ĐČŃ–ĐŽĐżĐŸĐČŃ–ĐŽĐœĐŸ ĐŽĐŸ ĐșĐŸĐœĐČĐ”ĐœŃ†Ń–Đč, ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžŃ… Ń†ĐžĐŒ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-фрДĐčĐŒĐČĐŸŃ€ĐșĐ°ĐŒ. + +**FastAPI** ŃĐżĐŸŃ‡Đ°Ń‚Đșу пДрДĐČіряє *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*. Đ€Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-фаĐčлО пДрДĐČіряються лОшД Ń‚ĐŸĐŽŃ–, ĐșĐŸĐ»Đž Đ¶ĐŸĐŽĐ”Đœ Đ·ĐČочаĐčĐœĐžĐč ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ ĐœĐ” Đ·Đ±Ń–ĐłŃŃ, Ń‚ĐŸĐŒŃƒ ĐČаш API ĐœĐ” буЎД Đ·Đ°Ń‡Đ”ĐżĐ»Đ”ĐœĐŸ. + +## ĐžĐ±ŃĐ»ŃƒĐłĐŸĐČуĐČĐ°ĐœĐœŃ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽŃƒ { #serve-a-frontend } + +ĐŸŃ–ŃĐ»Ń збірĐșĐž ĐČĐ°ŃˆĐŸĐłĐŸ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽŃƒ, ĐœĐ°ĐżŃ€ĐžĐșлаЎ за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ `npm run build`, ĐżĐŸĐŒŃ–ŃŃ‚Ń–Ń‚ŃŒ Đ·ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœŃ– фаĐčлО ĐČ ĐŽĐžŃ€Đ”ĐșŃ‚ĐŸŃ€Ń–ŃŽ, ĐœĐ°ĐżŃ€ĐžĐșлаЎ `dist`. + +СтруĐșтура ĐČĐ°ŃˆĐŸĐłĐŸ ĐżŃ€ĐŸŃ”Đșту ĐŒĐŸĐ¶Đ” ĐČĐžĐłĐ»ŃĐŽĐ°Ń‚Đž таĐș: + +```text +. +├── pyproject.toml +├── app +│ ├── __init__.py +│ └── main.py +└── dist + ├── index.html + └── assets + └── app.js +``` + +ĐŸĐŸŃ‚Ń–ĐŒ ĐŸĐ±ŃĐ»ŃƒĐłĐŸĐČуĐčтД її за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ `app.frontend()`: + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +З Ń†ĐžĐŒ запОт ĐŽĐŸ `/assets/app.js` ĐŒĐŸĐ¶Đ” ĐŸĐ±ŃĐ»ŃƒĐłĐŸĐČуĐČато `dist/assets/app.js`. + +ĐŻĐșŃ‰ĐŸ у ĐČас таĐșĐŸĐ¶ є *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń ŃˆĐ»ŃŃ…Ńƒ* **FastAPI**, *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń ŃˆĐ»ŃŃ…Ńƒ* ĐŒĐ°Ń” ĐżŃ€Ń–ĐŸŃ€ĐžŃ‚Đ”Ń‚. + +## ĐœĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†Ń–Ń ĐœĐ° Đ±ĐŸŃ†Ń– ĐșĐ»Ń–Ń”ĐœŃ‚Đ° { #client-side-routing } + +Đ‘Đ°ĐłĐ°Ń‚ĐŸ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ, ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ· **ĐŸĐŽĐœĐŸŃŃ‚ĐŸŃ€Ń–ĐœĐșĐŸĐČĐžĐŒĐž Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐ°ĐŒĐž** (SPA), ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†Ń–ŃŽ ĐœĐ° Đ±ĐŸŃ†Ń– ĐșĐ»Ń–Ń”ĐœŃ‚Đ°. ĐšĐ»ŃŃ… ĐœĐ° ĐșŃˆŃ‚Đ°Đ»Ń‚ `/dashboard/settings` ĐŒĐŸĐ¶Đ” ĐœĐ” Đ±ŃƒŃ‚Đž Ń€Đ”Đ°Đ»ŃŒĐœĐžĐŒ фаĐčĐ»ĐŸĐŒ, алД фрДĐčĐŒĐČĐŸŃ€Đș ĐżĐŸĐŽĐ±Đ°Ń” ĐżŃ€ĐŸ ĐčĐŸĐłĐŸ ĐŸĐ±Ń€ĐŸĐ±Đșу. + +ĐąĐŸĐŒŃƒ, яĐșŃ‰ĐŸ Đ·ĐČĐ”Ń€Ń‚Đ°Ń‚ĐžŃŃ ĐŽĐŸ цієї URL-аЎрДсО ĐœĐ°ĐżŃ€ŃĐŒŃƒ (Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ ĐœĐ°ĐČігації чДрДз Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș), бДĐșĐ”ĐœĐŽ ĐŒĐ°Ń” ĐŸĐ±ŃĐ»ŃƒĐłĐŸĐČуĐČато Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș Đ· `index.html`, Ń‰ĐŸĐ± Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-фрДĐčĐŒĐČĐŸŃ€Đș ĐżĐŸŃ‚Ń–ĐŒ ĐŒŃ–Đł ĐŸĐ±Ń€ĐŸĐ±ĐžŃ‚Đž ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†Ń–ŃŽ ĐœĐ° Đ±ĐŸŃ†Ń– ĐșĐ»Ń–Ń”ĐœŃ‚Đ°. + +Đ”Đ»Ń Ń†ŃŒĐŸĐłĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД `fallback="index.html"`: + +{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} + +**FastAPI** ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČує цДĐč fallback лОшД ĐŽĐ»Ń запОтіĐČ `GET` і `HEAD`, яĐșі ĐČĐžĐłĐ»ŃĐŽĐ°ŃŽŃ‚ŃŒ яĐș ĐœĐ°ĐČігація Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Đ°. Đ’Ń–ĐŽŃŃƒŃ‚ĐœŃ– фаĐčлО, яĐș-ĐŸŃ‚ JavaScript, CSS і Đ·ĐŸĐ±Ń€Đ°Đ¶Đ”ĐœĐœŃ, ĐČсД щД ĐżĐŸĐČĐ”Ń€Ń‚Đ°ŃŽŃ‚ŃŒ `404`. + +Запото Đ· Ń–ĐœŃˆĐžĐŒĐž ĐŒĐ”Ń‚ĐŸĐŽĐ°ĐŒĐž, яĐș-ĐŸŃ‚ `POST` Đ°Đ±ĐŸ `PUT`, ĐŽĐŸ ŃˆĐ»ŃŃ…Ń–ĐČ, Ń‰ĐŸ Đ·Đ±Ń–ĐłĐ°ŃŽŃ‚ŃŒŃŃ лОшД Đ· frontend fallback, таĐșĐŸĐ¶ ĐżĐŸĐČĐ”Ń€Ń‚Đ°ŃŽŃ‚ŃŒ `404`. ЗĐČочаĐčĐœŃ– *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* **FastAPI** ĐČсД щД ĐŒĐ°ŃŽŃ‚ŃŒ ĐČощоĐč ĐżŃ€Ń–ĐŸŃ€ĐžŃ‚Đ”Ń‚, ĐœŃ–Đ¶ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Đž. + +/// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° + +За Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `fallback` ĐŒĐ°Ń” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ `fallback="auto"`. ĐŁ Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– ĐČОпаЎĐșіĐČ ĐČĐ°ĐŒ ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐČĐșазуĐČато `fallback`. ДДталі чотаĐčтД ĐœĐžĐ¶Ń‡Đ”. + +/// + +ĐĄĐ°ĐŒĐ” цД ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐŽĐ»Ń Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ, яĐșі ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†Ń–ŃŽ ĐœĐ° Đ±ĐŸŃ†Ń– ĐșĐ»Ń–Ń”ĐœŃ‚Đ°, ĐœĐ°ĐżŃ€ĐžĐșлаЎ React Đ· TanStack Router, Vue, Angular, SvelteKit Đ°Đ±ĐŸ Solid. + +## ĐšĐŸŃ€ĐžŃŃ‚ŃƒĐČацьĐșа ŃŃ‚ĐŸŃ€Ń–ĐœĐșа 404 { #custom-404-page } + +Во таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃĐ»ŃƒĐłĐŸĐČуĐČато ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœŃƒ ŃŃ‚ĐŸŃ€Ń–ĐœĐșу `404.html` ĐŽĐ»Ń ĐČŃ–ĐŽŃŃƒŃ‚ĐœŃ–Ń… Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ŃˆĐ»ŃŃ…Ń–ĐČ: + +{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *} + +Щя ĐČŃ–ĐŽĐżĐŸĐČіЮь збДрігає ĐșĐŸĐŽ статусу `404`. + +ĐŁ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу **FastAPI** ĐœĐ” буЎД ĐŸĐ±ŃĐ»ŃƒĐłĐŸĐČуĐČато `index.html` ĐŽĐ»Ń ĐČŃ–ĐŽŃŃƒŃ‚ĐœŃ–Ń… Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ŃˆĐ»ŃŃ…Ń–ĐČ. ĐĐ°Ń‚ĐŸĐŒŃ–ŃŃ‚ŃŒ ĐČŃ–Đœ ĐżĐŸĐČĐ”Ń€ĐœĐ” фаĐčĐ» `404.html`. + +/// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° + +За Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `fallback` ĐŒĐ°Ń” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ `fallback="auto"`. З ĐœĐžĐŒ, яĐșŃ‰ĐŸ фаĐčĐ» `404.html` Đ·ĐœĐ°ĐčĐŽĐ”ĐœĐŸ, ĐČŃ–Đœ буЎД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐžĐč яĐș fallback аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ. + +ĐąĐŸĐŒŃƒ зазĐČочаĐč ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐœĐ” ĐČĐșазуĐČато Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚ `fallback`. + +/// + +ĐŠĐ” ĐșĐŸŃ€ĐžŃĐœĐŸ Đ· Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đ°ĐŒĐž, яĐșі ĐłĐ”ĐœĐ”Ń€ŃƒŃŽŃ‚ŃŒ ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ– HTML-фаĐčлО ĐŽĐ»Ń ĐșĐŸĐ¶ĐœĐŸŃ— ŃŃ‚ĐŸŃ€Ń–ĐœĐșĐž, яĐș-ĐŸŃ‚ Astro. + +## АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐžĐč fallback { #fallback-auto } + +За Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `app.frontend()` ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČує `fallback="auto"`. + +ĐŻĐșŃ‰ĐŸ ĐČ ĐŽĐžŃ€Đ”ĐșŃ‚ĐŸŃ€Ń–Ń— Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽŃƒ є фаĐčĐ» `404.html`, ĐČŃ–ĐŽŃŃƒŃ‚ĐœŃ– Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ŃˆĐ»ŃŃ…Đž ĐŸĐ±ŃĐ»ŃƒĐłĐŸĐČують цДĐč фаĐčĐ» Đ· ĐșĐŸĐŽĐŸĐŒ статусу `404`. + +Đ†ĐœĐ°ĐșшД, яĐșŃ‰ĐŸ є фаĐčĐ» `index.html`, ĐČŃ–ĐŽŃŃƒŃ‚ĐœŃ– ŃˆĐ»ŃŃ…Đž ĐœĐ°ĐČігації Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Đ° ĐŸĐ±ŃĐ»ŃƒĐłĐŸĐČують `index.html`, Ń‰ĐŸ Đč ĐŸŃ‡Ń–Đșують Đ±Đ°ĐłĐ°Ń‚ĐŸ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ Đ· ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†Ń–Ń”ŃŽ ĐœĐ° Đ±ĐŸŃ†Ń– ĐșĐ»Ń–Ń”ĐœŃ‚Đ°. + +ОтжД, у Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– ĐČОпаЎĐșіĐČ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `app.frontend("/", directory="dist")` бДз ĐČĐșĐ°Đ·Đ°ĐœĐœŃ Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Ńƒ `fallback`. + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +## Đ’ĐžĐŒĐșĐœĐ”ĐœĐœŃ fallback { #disable-fallback } + +ĐŻĐșŃ‰ĐŸ ĐČĐž ĐœĐ” Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŸĐ±ŃĐ»ŃƒĐłĐŸĐČуĐČато fallback-фаĐčĐ» ĐŽĐ»Ń ĐČŃ–ĐŽŃŃƒŃ‚ĐœŃ–Ń… Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ŃˆĐ»ŃŃ…Ń–ĐČ, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД `fallback=None`: + +{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *} + +ĐąĐŸĐŽŃ– ĐČŃ–ĐŽŃŃƒŃ‚ĐœŃ– Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ŃˆĐ»ŃŃ…Đž ĐżĐŸĐČĐ”Ń€Ń‚Đ°ŃŽŃ‚ŃŒ Đ·ĐČочаĐčĐœĐžĐč `404`. + +## ĐŸĐ”Ń€Đ”ĐČірĐșа ЎОрДĐșŃ‚ĐŸŃ€Ń–Ń— { #check-directory } + +За Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `app.frontend()` пДрДĐČіряє, Ń‰ĐŸ ЎОрДĐșŃ‚ĐŸŃ€Ń–Ń Ń–ŃĐœŃƒŃ”, ĐșĐŸĐ»Đž Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș стĐČĐŸŃ€ŃŽŃ”Ń‚ŃŒŃŃ. + +ĐŠĐ” ĐŽĐŸĐżĐŸĐŒĐ°ĐłĐ°Ń” ĐČояĐČото ĐżĐŸĐŒĐžĐ»ĐșĐž ĐșĐŸĐœŃ„Ń–ĐłŃƒŃ€Đ°Ń†Ń–Ń— заĐČŃ‡Đ°ŃĐœĐŸ. НапроĐșлаЎ, яĐșŃ‰ĐŸ ЎОрДĐșŃ‚ĐŸŃ€Ń–Ń ĐČĐžŃ…Ń–ĐŽĐœĐžŃ… фаĐčліĐČ Đ·Đ±Ń–Ń€ĐșĐž Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽŃƒ ĐČŃ–ĐŽŃŃƒŃ‚ĐœŃ, **FastAPI** ĐČĐžĐșлОчД ĐżĐŸĐŒĐžĐ»Đșу піЮ час запусĐșу. + +ĐŻĐșŃ‰ĐŸ ĐČаші Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-фаĐčлО стĐČĐŸŃ€ŃŽŃŽŃ‚ŃŒŃŃ ĐżŃ–Đ·ĐœŃ–ŃˆĐ”, ĐœĐ°ĐżŃ€ĐžĐșлаЎ ĐŸĐșŃ€Đ”ĐŒĐžĐŒ ĐșŃ€ĐŸĐșĐŸĐŒ збірĐșĐž ĐżŃ–ŃĐ»Ń стĐČĐŸŃ€Đ”ĐœĐœŃ ĐŸĐ±'єĐșта Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу, ĐČŃŃ‚Đ°ĐœĐŸĐČіть `check_dir=False`: + +{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *} + +З `check_dir=False` **FastAPI** ĐœĐ” пДрДĐČŃ–Ń€ŃŃ‚ĐžĐŒĐ” ЎОрДĐșŃ‚ĐŸŃ€Ń–ŃŽ піЮ час стĐČĐŸŃ€Đ”ĐœĐœŃ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу. ĐŻĐșŃ‰ĐŸ ĐœĐ°Đ»Đ°ŃˆŃ‚ĐŸĐČĐ°ĐœĐ° ЎОрДĐșŃ‚ĐŸŃ€Ń–Ń ĐČсД щД ĐČŃ–ĐŽŃŃƒŃ‚ĐœŃ піЮ час ĐŸĐ±Ń€ĐŸĐ±ĐșĐž Đ·Đ°ĐżĐžŃ‚Ńƒ, **FastAPI** ĐČĐžĐșлОчД ĐżĐŸĐŒĐžĐ»Đșу Ń‚ĐŸĐŽŃ–. + +## ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Đ· `APIRouter` { #use-it-with-apirouter } + +Во таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽĐŸĐŽĐ°Ń‚Đž Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-фаĐčлО ĐŽĐŸ `APIRouter` і ĐČĐșлючОтО ĐčĐŸĐłĐŸ Đ· прДфіĐșŃĐŸĐŒ: + +{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *} + +ĐŁ Ń†ŃŒĐŸĐŒŃƒ проĐșлаЎі Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-ŃˆĐ»ŃŃ…Đž ĐŸĐ±ŃĐ»ŃƒĐłĐŸĐČуються піЮ `/app`. + +БуЮь-яĐșі Đ·ĐČочаĐčĐœŃ– *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* ĐČ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу ĐČсД щД ĐŒĐ°Ń‚ĐžĐŒŃƒŃ‚ŃŒ пДрДĐČагу, ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ· ĐŸĐżĐ”Ń€Đ°Ń†Ń–ŃĐŒĐž ĐČ Ń–ĐœŃˆĐžŃ… Ń€ĐŸŃƒŃ‚Đ”Ń€Đ°Ń…. + +## Đ›ĐžŃˆĐ” ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœĐžĐč Ń€Đ”Đ·ŃƒĐ»ŃŒŃ‚Đ°Ń‚ збірĐșĐž { #static-build-output-only } + +`app.frontend()` ĐŸĐ±ŃĐ»ŃƒĐłĐŸĐČує фаĐčлО, ĐČжД Đ·ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœŃ– ĐČĐ°ŃˆĐŸŃŽ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-збірĐșĐŸŃŽ. + +Đ’Ń–Đœ ĐœĐ” ĐČĐžĐșĐŸĐœŃƒŃ” Ń€Đ”ĐœĐŽĐ”Ń€ĐžĐœĐł ĐœĐ° Đ±ĐŸŃ†Ń– сДрĐČДра. Đ’Ń–Đœ ĐżŃ€ĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐžĐč ĐŽĐ»Ń Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ-фрДĐčĐŒĐČĐŸŃ€ĐșіĐČ, яĐșі ĐłĐ”ĐœĐ”Ń€ŃƒŃŽŃ‚ŃŒ ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ– фаĐčлО, а ĐœĐ” ĐŽĐ»Ń фрДĐčĐŒĐČĐŸŃ€ĐșіĐČ, Ń‰ĐŸ ĐżĐŸŃ‚Ń€Đ”Đ±ŃƒŃŽŃ‚ŃŒ ĐŽĐžĐœĐ°ĐŒŃ–Ń‡ĐœĐŸĐłĐŸ Ń€Đ”ĐœĐŽĐ”Ń€ĐžĐœĐłŃƒ ĐœĐ° сДрĐČДрі ĐŽĐ»Ń ĐșĐŸĐ¶ĐœĐŸĐłĐŸ Đ·Đ°ĐżĐžŃ‚Ńƒ. From f3e6899127daf4949b868bd4aa2b8d2515884b36 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 10:35:54 +0000 Subject: [PATCH 251/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index f7cb3bb5f..29f94755d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for fr (add-missing). PR [#15881](https://github.com/fastapi/fastapi/pull/15881) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for de (add-missing). PR [#15884](https://github.com/fastapi/fastapi/pull/15884) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ru (add-missing). PR [#15879](https://github.com/fastapi/fastapi/pull/15879) by [@tiangolo](https://github.com/tiangolo). From 92cf50e546b2ff92c97a0c16cf48370d7b8f23ad Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 10:36:23 +0000 Subject: [PATCH 252/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 29f94755d..ea3598e88 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for uk (add-missing). PR [#15886](https://github.com/fastapi/fastapi/pull/15886) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for fr (add-missing). PR [#15881](https://github.com/fastapi/fastapi/pull/15881) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for de (add-missing). PR [#15884](https://github.com/fastapi/fastapi/pull/15884) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ru (add-missing). PR [#15879](https://github.com/fastapi/fastapi/pull/15879) by [@tiangolo](https://github.com/tiangolo). From 75737c19da4b6b4e1e823b7a18cbbbc5d023c3c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 12:37:00 +0200 Subject: [PATCH 253/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20tr=20(add-missing)=20(#15887)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/tr/docs/tutorial/frontend.md | 133 ++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/tr/docs/tutorial/frontend.md diff --git a/docs/tr/docs/tutorial/frontend.md b/docs/tr/docs/tutorial/frontend.md new file mode 100644 index 000000000..7918ca593 --- /dev/null +++ b/docs/tr/docs/tutorial/frontend.md @@ -0,0 +1,133 @@ +# Frontend { #frontend } + +Statik frontend uygulamalarını `app.frontend()` (veya `router.frontend()`) ile sunabilirsiniz. + +Bu, Vite ile React, TanStack Router, Astro, Vue, Svelte, Angular, Solid ve benzeri statik dosyalar ĂŒreten frontend araçları için kullanıßlıdır. + +Bu araçlarda genellikle frontend'i build eden bir adım olur, örneğin ĆŸĂ¶yle bir komutla: + +```bash +npm run build +``` + +Bu komut, frontend dosyalarınızla birlikte `./dist/` gibi bir dizin olußturur. + +Bu dizini, frontend framework'lerinin ihtiyaç duyduğu kurallara uygun ßekilde sunmak için `app.frontend()` kullanabilirsiniz. + +**FastAPI** önce *path operation*'ları kontrol eder. Frontend dosyaları yalnızca hiçbir normal route eßleßmezse kontrol edilir, bu yĂŒzden API'niz bundan etkilenmez. + +## Frontend Sunma { #serve-a-frontend } + +Frontend'inizi build ettikten sonra, örneğin `npm run build` ile, olußturulan dosyaları bir dizine koyun; örneğin `dist`. + +Proje yapınız ĆŸĂ¶yle görĂŒnebilir: + +```text +. +├── pyproject.toml +├── app +│ ├── __init__.py +│ └── main.py +└── dist + ├── index.html + └── assets + └── app.js +``` + +Ardından bunu `app.frontend()` ile sunun: + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +Böylece `/assets/app.js` için gelen bir request, `dist/assets/app.js` dosyasını sunabilir. + +Aynı zamanda bir **FastAPI** *path operation*'ınız varsa, öncelik *path operation*'dadır. + +## Client-Side Routing { #client-side-routing } + +**Single-page app**'ler (SPA'ler) dahil birçok frontend uygulaması client-side routing kullanır. `/dashboard/settings` gibi bir path gerçek bir dosya olmayabilir; bunu frontend framework'ĂŒ ele alır. + +Bu yĂŒzden, o URL'ye doğrudan erißildiğinde (uygulama içinde gezinmek yerine), backend frontend uygulamasını `index.html` ĂŒzerinden sunmalıdır. Böylece frontend framework'ĂŒ client-side routing'i ißleyebilir. + +Bunun için `fallback="index.html"` kullanın: + +{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} + +**FastAPI** bu fallback'i yalnızca tarayıcı gezinmesi gibi görĂŒnen `GET` ve `HEAD` request'leri için kullanır. JavaScript, CSS ve görseller gibi eksik dosyalar yine `404` döndĂŒrĂŒr. + +`POST` veya `PUT` gibi diğer metotlarla, yalnızca frontend fallback'i ile eßleßen path'lere yapılan request'ler de `404` döndĂŒrĂŒr. Normal **FastAPI** *path operation*'ları frontend route'larından yine daha yĂŒksek önceliğe sahiptir. + +/// tip | İpucu + +Varsayılan olarak `fallback`, `fallback="auto"` değerine sahiptir. Çoğu durumda `fallback` belirtmeniz gerekmez. Detaylar için aßağıyı okuyun. + +/// + +Client-side routing kullanan birçok frontend uygulamasında istediğiniz davranıß budur; örneğin TanStack Router ile React, Vue, Angular, SvelteKit veya Solid. + +## Özel 404 Sayfası { #custom-404-page } + +Bulunamayan frontend path'leri için statik bir `404.html` sayfası da sunabilirsiniz: + +{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *} + +Bu response, `404` status code'unu korur. + +Bu durumda **FastAPI**, bulunamayan frontend path'leri için `index.html` sunmaz. Bunun yerine `404.html` dosyasını döndĂŒrĂŒr. + +/// tip | İpucu + +Varsayılan olarak `fallback`, `fallback="auto"` değerine sahiptir. Bu durumda bir `404.html` dosyası bulunursa, otomatik olarak fallback olarak kullanılır. + +Bu yĂŒzden normalde `fallback` argĂŒmanını atlayabilirsiniz. + +/// + +Bu, Astro gibi her sayfa için statik HTML dosyaları ĂŒreten frontend araçlarıyla kullanıßlıdır. + +## Otomatik Fallback { #fallback-auto } + +Varsayılan olarak `app.frontend()`, `fallback="auto"` kullanır. + +Frontend dizininde bir `404.html` dosyası varsa, bulunamayan frontend path'leri bu dosyayı `404` status code'u ile sunar. + +Aksi halde bir `index.html` dosyası varsa, bulunamayan tarayıcı gezinme path'leri `index.html` sunar. Client-side routing kullanan birçok frontend uygulamasının beklediği davranıß budur. + +Bu yĂŒzden çoğu durumda `fallback` argĂŒmanını belirtmeden `app.frontend("/", directory="dist")` kullanabilirsiniz. + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +## Fallback'i Devre Dıßı Bırakma { #disable-fallback } + +Bulunamayan frontend path'leri için fallback dosyası sunmak istemiyorsanız `fallback=None` kullanın: + +{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *} + +Bundan sonra bulunamayan frontend path'leri normal `404` döndĂŒrĂŒr. + +## Dizini Kontrol Etme { #check-directory } + +Varsayılan olarak `app.frontend()`, uygulama olußturulduğunda dizinin var olduğunu kontrol eder. + +Bu, yapılandırma hatalarını erken yakalamaya yardımcı olur. Örneğin frontend build çıktısı dizini yoksa, **FastAPI** baßlangıçta hata verir. + +Frontend dosyalarınız daha sonra olußturuluyorsa, örneğin app nesnesi olußturulduktan sonra ayrı bir build adımıyla, `check_dir=False` ayarlayın: + +{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *} + +`check_dir=False` ile **FastAPI**, app olußturulduğunda dizini kontrol etmez. Yapılandırılan dizin bir request ißlendiği sırada hĂąlĂą yoksa, **FastAPI** o zaman hata verir. + +## `APIRouter` ile Kullanma { #use-it-with-apirouter } + +Frontend dosyalarını bir `APIRouter`'a da ekleyebilir ve bunu bir prefix ile dahil edebilirsiniz: + +{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *} + +Bu örnekte frontend path'leri `/app` altında sunulur. + +Uygulamadaki herhangi bir normal *path operation*, diğer router'larda olanlar dahil, yine öncelikli olur. + +## Yalnızca Statik Build Çıktısı { #static-build-output-only } + +`app.frontend()`, frontend build'iniz tarafından önceden olußturulmuß dosyaları sunar. + +Server-side rendering çalıßtırmaz. Her request için server'da dinamik rendering gerektiren framework'ler için değil, statik dosyalar ĂŒreten frontend framework'leri içindir. From f382703ff71b1a45ecbfed754bc3eeb2e70b2902 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 10:37:33 +0000 Subject: [PATCH 254/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index ea3598e88..7654aa902 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for tr (add-missing). PR [#15887](https://github.com/fastapi/fastapi/pull/15887) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for uk (add-missing). PR [#15886](https://github.com/fastapi/fastapi/pull/15886) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for fr (add-missing). PR [#15881](https://github.com/fastapi/fastapi/pull/15881) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for de (add-missing). PR [#15884](https://github.com/fastapi/fastapi/pull/15884) by [@tiangolo](https://github.com/tiangolo). From 2b0f1561936a31291757304e52cd3ece5c90afd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 12:40:30 +0200 Subject: [PATCH 255/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20zh=20(add-missing)=20(#15885)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/zh/docs/tutorial/frontend.md | 133 ++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/zh/docs/tutorial/frontend.md diff --git a/docs/zh/docs/tutorial/frontend.md b/docs/zh/docs/tutorial/frontend.md new file mode 100644 index 000000000..8b57bbe60 --- /dev/null +++ b/docs/zh/docs/tutorial/frontend.md @@ -0,0 +1,133 @@ +# ć‰ç«Ż { #frontend } + +äœ ćŻä»„äœżç”š `app.frontend()`或 `router.frontend()`ïŒ‰æ„æäŸ›é™æ€ć‰ç«Żćș”甚。 + +èż™ćŻčäŒšç”Ÿæˆé™æ€æ–‡ä»¶çš„ć‰ç«Żć·„ć…·ćŸˆæœ‰ç”šïŒŒäŸ‹ćŠ‚äœżç”š Vite 的 React、TanStack Router、Astro、Vue、Svelte、Angular、Solid 等。 + +äœżç”šèż™äș›ć·„ć…·æ—¶ïŒŒé€šćžžäŒšæœ‰äž€äžȘ构ć»șć‰ç«Żçš„æ­„éȘ€ïŒŒć‘œä»€ç±»äŒŒïŒš + +```bash +npm run build +``` + +ćźƒäŒšç”Ÿæˆäž€äžȘ类䌌 `./dist/` çš„ç›źćœ•ïŒŒé‡ŒéąćŒ…ć«äœ çš„ć‰ç«Żæ–‡ä»¶ă€‚ + +äœ ćŻä»„äœżç”š `app.frontend()` æŒ‰ç…§èż™äș›ć‰ç«ŻæĄ†æž¶æ‰€éœ€çš„çșŠćꚿ„æäŸ›èŻ„ç›źćœ•ă€‚ + +**FastAPI** äŒšć…ˆæŁ€æŸ„*è·ŻćŸ„æ“äœœ*。ćȘæœ‰ćœšæČĄæœ‰æ™źé€šè·Żç”±ćŒčé…æ—¶ïŒŒæ‰äŒšæŁ€æŸ„ć‰ç«Żæ–‡ä»¶ïŒŒć› æ­€äœ çš„ API äžäŒšć—ćˆ°ćœ±ć“ă€‚ + +## æäŸ›ć‰ç«ŻæœćŠĄ { #serve-a-frontend } + +构ć»șć‰ç«Żäč‹ćŽïŒŒäŸ‹ćŠ‚äœżç”š `npm run build`ïŒŒć°†ç”Ÿæˆçš„æ–‡ä»¶æ”Ÿć…„äž€äžȘç›źćœ•ïŒŒäŸ‹ćŠ‚ `dist`。 + +䜠的éĄčç›źç»“æž„ćŻèƒœćŠ‚äž‹æ‰€ç€ș + +```text +. +├── pyproject.toml +├── app +│ ├── __init__.py +│ └── main.py +└── dist + ├── index.html + └── assets + └── app.js +``` + +ç„¶ćŽäœżç”š `app.frontend()` æäŸ›æœćŠĄïŒš + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +èż™æ ·ïŒŒćŻč `/assets/app.js` çš„èŻ·æ±‚ćŻä»„æäŸ› `dist/assets/app.js`。 + +ćŠ‚æžœäœ èż˜æœ‰äž€äžȘ **FastAPI** *è·ŻćŸ„æ“äœœ*ïŒŒćˆ™*è·ŻćŸ„æ“äœœ*äŒ˜ć…ˆă€‚ + +## ćźąæˆ·ç«Żè·Żç”± { #client-side-routing } + +èźžć€šć‰ç«Żćș”ç”šïŒŒćŒ…æ‹Ź**ć•éĄ”ćș”甚**SPAïŒ‰ïŒŒéƒœäŒšäœżç”šćźąæˆ·ç«Żè·Żç”±ă€‚ćƒ `/dashboard/settings` èż™æ ·çš„è·ŻćŸ„ćŻèƒœćč¶äžæ˜Żäž€äžȘçœŸćźžæ–‡ä»¶ïŒŒè€Œæ˜Żç”±æĄ†æž¶èŽŸèŽŁć€„ç†ă€‚ + +ć› æ­€ïŒŒćŠ‚æžœç›ŽæŽ„èźżé—źèŻ„ URLïŒˆè€Œäžæ˜Żé€šèż‡ćș”ç”šć†…ćŻŒèˆȘèźżé—źïŒ‰ïŒŒćŽç«Żćș”èŻ„ä»Ž `index.html` æäŸ›ć‰ç«Żćș”ç”šïŒŒèż™æ ·ć‰ç«ŻæĄ†æž¶ć°±ćŻä»„ć€„ç†ćźąæˆ·ç«Żè·Żç”±ă€‚ + +äžșæ­€ïŒŒäœżç”š `fallback="index.html"` + +{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} + +**FastAPI** ćȘ䌚ćŻčçœ‹è”·æ„ćƒæ”è§ˆć™šćŻŒèˆȘ的 `GET` 撌 `HEAD` èŻ·æ±‚äœżç”šæ­€ fallback。çŒș怱的 JavaScript、CSS ć’Œć›Ÿç‰‡ç­‰æ–‡ä»¶ä»äŒšèż”ć›ž `404`。 + +ćŻčäșŽć…¶ä»–æ–čæł•çš„èŻ·æ±‚ïŒŒäŸ‹ćŠ‚ `POST` 或 `PUT`ïŒŒćŠ‚æžœè·ŻćŸ„ćȘćŒčé…ć‰ç«Ż fallbackäčŸäŒšèż”曞 `404`ă€‚ćžžè§„ **FastAPI** *è·ŻćŸ„æ“äœœ*ä»ç„¶æŻ”ć‰ç«Żè·Żç”±ć…·æœ‰æ›Žé«˜äŒ˜ć…ˆçș§ă€‚ + +/// tip | 提ç€ș + +é»˜èź€æƒ…ć†”äž‹ïŒŒ`fallback` çš„ć€Œäžș `fallback="auto"`ă€‚ćœšć€§ć€šæ•°æƒ…ć†”äž‹ïŒŒäœ äžéœ€èŠæŒ‡ćźš `fallback`ă€‚èŻŠæƒ…è§äž‹æ–‡ă€‚ + +/// + +èż™æ­Łæ˜Żèźžć€šäœżç”šćźąæˆ·ç«Żè·Żç”±çš„ć‰ç«Żćș”ç”šæ‰€éœ€çš„èĄŒäžșïŒŒäŸ‹ćŠ‚äœżç”š TanStack Router 的 React、Vue、Angular、SvelteKit 或 Solid。 + +## è‡Ș漚äč‰ 404 éĄ”éą { #custom-404-page } + +䜠äčŸćŻä»„äžșçŒșć€±çš„ć‰ç«Żè·ŻćŸ„æäŸ›äž€äžȘ静态 `404.html` éĄ”éąïŒš + +{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *} + +èŻ„ć“ćș”äŒšäżæŒ `404` çŠ¶æ€ç ă€‚ + +ćœšèż™ç§æƒ…ć†”äž‹ïŒŒ**FastAPI** 䞍䌚äžșçŒșć€±çš„ć‰ç«Żè·ŻćŸ„æäŸ› `index.html`ïŒŒè€Œæ˜Żèż”ć›ž `404.html` æ–‡ä»¶ă€‚ + +/// tip | 提ç€ș + +é»˜èź€æƒ…ć†”äž‹ïŒŒ`fallback` çš„ć€Œäžș `fallback="auto"`ă€‚èż™æ ·ïŒŒćŠ‚æžœæ‰Ÿćˆ° `404.html` æ–‡ä»¶ïŒŒćźƒäŒšè‡ȘćŠšç”šäœœ fallback。 + +ć› æ­€ïŒŒé€šćžžäœ ćŻä»„çœç•„ `fallback` ć‚æ•°ă€‚ + +/// + +èż™ćŻč䌚äžșæŻäžȘéĄ”éąç”Ÿæˆé™æ€ HTML æ–‡ä»¶çš„ć‰ç«Żć·„ć…·ćŸˆæœ‰ç”šïŒŒäŸ‹ćŠ‚ Astro。 + +## è‡Ș抹 Fallback { #fallback-auto } + +é»˜èź€æƒ…ć†”äž‹ïŒŒ`app.frontend()` äœżç”š `fallback="auto"`。 + +ćŠ‚æžœć‰ç«Żç›źćœ•äž­ć­˜ćœš `404.html` 文件çŒșć€±çš„ć‰ç«Żè·ŻćŸ„äŒšä»„çŠ¶æ€ç  `404` æäŸ›èŻ„æ–‡ä»¶ă€‚ + +ćŠćˆ™ïŒŒćŠ‚æžœć­˜ćœš `index.html` 文件çŒșć€±çš„æ”è§ˆć™šćŻŒèˆȘè·ŻćŸ„äŒšæäŸ› `index.html`ïŒŒèż™æ­Łæ˜Żèźžć€šäœżç”šćźąæˆ·ç«Żè·Żç”±çš„ć‰ç«Żćș”ç”šæ‰€æœŸæœ›çš„èĄŒäžș。 + +ć› æ­€ïŒŒćœšć€§ć€šæ•°æƒ…ć†”äž‹ïŒŒäœ ćŻä»„äœżç”š `app.frontend("/", directory="dist")`ïŒŒè€Œæ— éœ€æŒ‡ćźš `fallback` ć‚æ•°ă€‚ + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +## 穁甹 Fallback { #disable-fallback } + +ćŠ‚æžœäœ äžæƒłäžșçŒșć€±çš„ć‰ç«Żè·ŻćŸ„æäŸ› fallback æ–‡ä»¶ïŒŒèŻ·äœżç”š `fallback=None` + +{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *} + +èż™æ ·ïŒŒçŒșć€±çš„ć‰ç«Żè·ŻćŸ„äŒšèż”ć›žæ™źé€šçš„ `404`。 + +## æŁ€æŸ„ç›źćœ• { #check-directory } + +é»˜èź€æƒ…ć†”äž‹ïŒŒ`app.frontend()` äŒšćœšćș”ç”šćˆ›ć»șæ—¶æŁ€æŸ„ç›źćœ•æ˜ŻćŠć­˜ćœšă€‚ + +èż™æœ‰ćŠ©äșŽć°œæ—©ć‘çŽ°é…çœźé”™èŻŻă€‚äŸ‹ćŠ‚ïŒŒćŠ‚æžœć‰ç«Żæž„ć»ș蟓ć‡șç›źćœ•çŒșć€±ïŒŒ**FastAPI** äŒšćœšćŻćŠšæ—¶æŠ›ć‡șé”™èŻŻă€‚ + +ćŠ‚æžœäœ çš„ć‰ç«Żæ–‡ä»¶äŒšçšćŽćˆ›ć»șïŒŒäŸ‹ćŠ‚ćœšćș”甚ćŻčè±Ąćˆ›ć»șäč‹ćŽç”±ć•ç‹Źçš„æž„ć»șæ­„éȘ€ćˆ›ć»șïŒŒèŻ·èźŸçœź `check_dir=False` + +{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *} + +äœżç”š `check_dir=False` 时**FastAPI** äžäŒšćœšćș”ç”šćˆ›ć»șæ—¶æŁ€æŸ„ç›źćœ•ă€‚ćŠ‚æžœćœšć€„ç†èŻ·æ±‚æ—¶é…çœźçš„ç›źćœ•ä»ç„¶çŒșć€±ïŒŒ**FastAPI** äŒšćœšé‚Łæ—¶æŠ›ć‡șé”™èŻŻă€‚ + +## 侎 `APIRouter` äž€è”·äœżç”š { #use-it-with-apirouter } + +䜠äčŸćŻä»„ć°†ć‰ç«Żæ–‡ä»¶æ·»ćŠ ćˆ°äž€äžȘ `APIRouter`ćč¶äœżç”šć‰çŒ€ćŒ…ć«ćźƒïŒš + +{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *} + +ćœšèż™äžȘç€șäŸ‹äž­ïŒŒć‰ç«Żè·ŻćŸ„äŒšćœš `/app` äž‹æäŸ›æœćŠĄă€‚ + +ćș”ç”šäž­çš„ä»»äœ•ćžžè§„*è·ŻćŸ„æ“äœœ*ä»äŒšäŒ˜ć…ˆïŒŒćŒ…æ‹Źć…¶ä»– router äž­çš„è·ŻćŸ„æ“äœœă€‚ + +## 仅限静态构ć»ș蟓ć‡ș { #static-build-output-only } + +`app.frontend()` æäŸ›çš„æ˜Żäœ çš„ć‰ç«Żæž„ć»șć·Čç»ç”Ÿæˆçš„æ–‡ä»¶ă€‚ + +ćźƒäžäŒšèżèĄŒæœćŠĄç«ŻæžČæŸ“ă€‚ćźƒé€‚ç”šäșŽç”Ÿæˆé™æ€æ–‡ä»¶çš„ć‰ç«ŻæĄ†æž¶ïŒŒè€Œäžé€‚ç”šäșŽéœ€èŠćœšæœćŠĄć™šäžŠäžșæŻäžȘèŻ·æ±‚èż›èĄŒćŠšæ€æžČæŸ“çš„æĄ†æž¶ă€‚ From 0982d3c2ae1059adcf64a2ec51a41e96c891bbd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 12:41:19 +0200 Subject: [PATCH 256/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20ja=20(add-missing)=20(#15882)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/ja/docs/tutorial/frontend.md | 133 ++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/ja/docs/tutorial/frontend.md diff --git a/docs/ja/docs/tutorial/frontend.md b/docs/ja/docs/tutorial/frontend.md new file mode 100644 index 000000000..facbbc1d1 --- /dev/null +++ b/docs/ja/docs/tutorial/frontend.md @@ -0,0 +1,133 @@ +# フロントスンド { #frontend } + +`app.frontend()`ïŒˆăŸăŸăŻ `router.frontend()`ïŒ‰ă§é™çš„ăȘフロントスンドケプăƒȘă‚’é…äżĄă§ăăŸă™ă€‚ + +これは、Vite ă‚’äœżăŁăŸ React、TanStack Router、Astro、Vue、Svelte、Angular、Solid ăȘă©ă€é™çš„ăƒ•ă‚Ąă‚€ăƒ«ă‚’ç”Ÿæˆă™ă‚‹ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăƒ„ăƒŒăƒ«ă§ćœčç«‹ăĄăŸă™ă€‚ + +ă“ă‚Œă‚‰ăźăƒ„ăƒŒăƒ«ă§ăŻă€é€šćžžă€æŹĄăźă‚ˆă†ăȘă‚łăƒžăƒłăƒ‰ă§ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ă‚’ăƒ“ăƒ«ăƒ‰ă™ă‚‹ă‚čăƒ†ăƒƒăƒ—ăŒă‚ă‚ŠăŸă™ă€‚ + +```bash +npm run build +``` + +ă“ă‚Œă«ă‚ˆă‚Šă€ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăƒ•ă‚Ąă‚€ăƒ«ă‚’ć«ă‚€ `./dist/` ぼようăȘディレクトăƒȘăŒç”Ÿæˆă•ă‚ŒăŸă™ă€‚ + +`app.frontend()` ă‚’äœżă†ăšă€ă“ă‚Œă‚‰ăźăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăƒ•ăƒŹăƒŒăƒ ăƒŻăƒŒă‚ŻăŒćż…èŠăšă™ă‚‹èŠçŽ„ă«ćŸ“ăŁăŠă€ăăźăƒ‡ă‚ŁăƒŹă‚ŻăƒˆăƒȘă‚’é…äżĄă§ăăŸă™ă€‚ + +**FastAPI** ăŻæœ€ćˆă« *path operations* ă‚’ăƒă‚§ăƒƒă‚Żă—ăŸă™ă€‚é€šćžžăźăƒ«ăƒŒăƒˆă«äž€è‡Žă—ăȘă‹ăŁăŸć Žćˆă«ăźăżăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăƒ•ă‚Ąă‚€ăƒ«ăŒăƒă‚§ăƒƒă‚Żă•ă‚Œă‚‹ăŸă‚ă€API ă«ăŻćœ±éŸżă—ăŸă›ă‚“ă€‚ + +## フロントスンドぼ配信 { #serve-a-frontend } + +たべえば `npm run build` ă§ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ă‚’ăƒ“ăƒ«ăƒ‰ă—ăŸćŸŒă€ç”Ÿæˆă•ă‚ŒăŸăƒ•ă‚Ąă‚€ăƒ«ă‚’ `dist` ăȘă©ăźăƒ‡ă‚ŁăƒŹă‚ŻăƒˆăƒȘă«é…çœźă—ăŸă™ă€‚ + +ăƒ—ăƒ­ă‚žă‚§ă‚Żăƒˆæ§‹æˆăŻæŹĄăźă‚ˆă†ă«ăȘă‚ŠăŸă™ă€‚ + +```text +. +├── pyproject.toml +├── app +│ ├── __init__.py +│ └── main.py +└── dist + ├── index.html + └── assets + └── app.js +``` + +そしど `app.frontend()` ă§é…äżĄă—ăŸă™ă€‚ + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +ă“ă‚Œă«ă‚ˆă‚Šă€`/assets/app.js` ぞたăƒȘクスă‚čトで `dist/assets/app.js` ă‚’é…äżĄă§ăăŸă™ă€‚ + +**FastAPI** た *path operation* もある栮搈は、*path operation* がć„Șć…ˆă•ă‚ŒăŸă™ă€‚ + +## ă‚Żăƒ©ă‚€ă‚ąăƒłăƒˆă‚”ă‚€ăƒ‰ăƒ«ăƒŒăƒ†ă‚Łăƒłă‚° { #client-side-routing } + +**single-page apps**SPAïŒ‰ă‚’ć«ă‚€ć€šăăźăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ă‚ąăƒ—ăƒȘăŻă€ă‚Żăƒ©ă‚€ă‚ąăƒłăƒˆă‚”ă‚€ăƒ‰ăƒ«ăƒŒăƒ†ă‚Łăƒłă‚°ă‚’äœżă„ăŸă™ă€‚`/dashboard/settings` ぼようăȘパă‚čăŻćźŸéš›ăźăƒ•ă‚Ąă‚€ăƒ«ă§ăŻăȘăă€ăƒ•ăƒŹăƒŒăƒ ăƒŻăƒŒă‚ŻăŒć‡Šç†ă™ă‚‹ă‚‚ăźă‹ă‚‚ă—ă‚ŒăŸă›ă‚“ă€‚ + +そぼため、そぼ URL ă«ç›ŽæŽ„ă‚ąă‚Żă‚»ă‚čă—ăŸć ŽćˆïŒˆă‚ąăƒ—ăƒȘ憅で遷移するたではăȘăïŒ‰ă€ăƒăƒƒă‚Żă‚šăƒłăƒ‰ăŻ `index.html` からフロントスンドケプăƒȘă‚’é…äżĄă—ă€ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăƒ•ăƒŹăƒŒăƒ ăƒŻăƒŒă‚ŻăŒă‚Żăƒ©ă‚€ă‚ąăƒłăƒˆă‚”ă‚€ăƒ‰ăƒ«ăƒŒăƒ†ă‚Łăƒłă‚°ă‚’ć‡Šç†ă§ăă‚‹ă‚ˆă†ă«ă™ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚ + +ăăźăŸă‚ă«ăŻă€`fallback="index.html"` ă‚’äœżă„ăŸă™ă€‚ + +{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} + +**FastAPI** ăŻă€ă“ăźăƒ•ă‚©ăƒŒăƒ«ăƒăƒƒă‚Żă‚’ăƒ–ăƒ©ă‚Šă‚¶ăźăƒŠăƒ“ă‚ČăƒŒă‚·ăƒ§ăƒłă«èŠ‹ăˆă‚‹ `GET` および `HEAD` ăƒȘクスă‚čăƒˆă«ăźăżäœżç”šă—ăŸă™ă€‚JavaScript、CSSă€ç”»ćƒăȘă©ăźć­˜ćœšă—ăȘă„ăƒ•ă‚Ąă‚€ăƒ«ăŻćŒ•ăç¶šă `404` ă‚’èż”ă—ăŸă™ă€‚ + +`POST` や `PUT` ăȘă©ă€ä»–ăźăƒĄă‚œăƒƒăƒ‰ăźăƒȘクスă‚čăƒˆăŒăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăźăƒ•ă‚©ăƒŒăƒ«ăƒăƒƒă‚Żă«ăźăżäž€è‡Žă™ă‚‹ăƒ‘ă‚čま送られた栮搈も、`404` ă‚’èż”ă—ăŸă™ă€‚é€šćžžăź **FastAPI** た *path operations* ăŻă€ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăźăƒ«ăƒŒăƒˆă‚ˆă‚Šă‚‚ćŒ•ăç¶šăé«˜ă„ć„Șć…ˆé †äœă‚’æŒăĄăŸă™ă€‚ + +/// tip | 豆矄識 + +ăƒ‡ăƒ•ă‚©ăƒ«ăƒˆă§ăŻă€`fallback` た怀は `fallback="auto"` ă§ă™ă€‚ă»ăšă‚“ă©ăźć Žćˆă€`fallback` ă‚’æŒ‡ćźšă™ă‚‹ćż…èŠăŻă‚ă‚ŠăŸă›ă‚“ă€‚è©łçŽ°ăŻä»„äž‹ă‚’ć‚ç…§ă—ăŠăă ă•ă„ă€‚ + +/// + +これは、TanStack Router ă‚’äœżăŁăŸ React、Vue、Angular、SvelteKit、Solid ăȘă©ă€ă‚Żăƒ©ă‚€ă‚ąăƒłăƒˆă‚”ă‚€ăƒ‰ăƒ«ăƒŒăƒ†ă‚Łăƒłă‚°ă‚’äœżă†ć€šăăźăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ă‚ąăƒ—ăƒȘă§æœ›ăŸă‚Œă‚‹ć‹•äœœă§ă™ă€‚ + +## ă‚«ă‚čタム 404 ăƒšăƒŒă‚ž { #custom-404-page } + +歘朹しăȘいフロントスンドパă‚čă«ćŻŸă—ăŠă€é™çš„ăȘ `404.html` ăƒšăƒŒă‚žă‚’é…äżĄă™ă‚‹ă“ăšă‚‚ă§ăăŸă™ă€‚ + +{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *} + +そぼレă‚čポンă‚čはă‚čăƒ†ăƒŒă‚żă‚čă‚łăƒŒăƒ‰ `404` ă‚’äżæŒă—ăŸă™ă€‚ + +こぼ栮搈、**FastAPI** は歘朹しăȘいフロントスンドパă‚čă«ćŻŸă—ăŠ `index.html` ă‚’é…äżĄă—ăŸă›ă‚“ă€‚ä»Łă‚ă‚Šă« `404.html` ăƒ•ă‚Ąă‚€ăƒ«ă‚’èż”ă—ăŸă™ă€‚ + +/// tip | 豆矄識 + +ăƒ‡ăƒ•ă‚©ăƒ«ăƒˆă§ăŻă€`fallback` た怀は `fallback="auto"` ă§ă™ă€‚ă“ă‚Œă«ă‚ˆă‚Šă€`404.html` ăƒ•ă‚Ąă‚€ăƒ«ăŒèŠ‹ă€ă‹ăŁăŸć Žćˆă€è‡Șć‹•çš„ă«ăƒ•ă‚©ăƒŒăƒ«ăƒăƒƒă‚Żăšă—ăŠäœżă‚ă‚ŒăŸă™ă€‚ + +そぼため、通澾は `fallback` ćŒ•æ•°ă‚’çœç•„ă§ăăŸă™ă€‚ + +/// + +これは、Astro ăźă‚ˆă†ă«ć„ăƒšăƒŒă‚žăźé™çš„ HTML ăƒ•ă‚Ąă‚€ăƒ«ă‚’ç”Ÿæˆă™ă‚‹ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăƒ„ăƒŒăƒ«ă§ćœčç«‹ăĄăŸă™ă€‚ + +## è‡Șć‹•ăƒ•ă‚©ăƒŒăƒ«ăƒăƒƒă‚Ż { #fallback-auto } + +ăƒ‡ăƒ•ă‚©ăƒ«ăƒˆă§ăŻă€`app.frontend()` は `fallback="auto"` ă‚’äœżă„ăŸă™ă€‚ + +フロントスンドディレクトăƒȘに `404.html` ăƒ•ă‚Ąă‚€ăƒ«ăŒă‚ă‚‹ć Žćˆă€ć­˜ćœšă—ăȘいフロントスンドパă‚čăŻăăźăƒ•ă‚Ąă‚€ăƒ«ă‚’ă‚čăƒ†ăƒŒă‚żă‚čă‚łăƒŒăƒ‰ `404` ă§é…äżĄă—ăŸă™ă€‚ + +そうでăȘい栮搈、`index.html` ăƒ•ă‚Ąă‚€ăƒ«ăŒă‚ă‚Œă°ă€ć­˜ćœšă—ăȘă„ăƒ–ăƒ©ă‚Šă‚¶ăƒŠăƒ“ă‚ČăƒŒă‚·ăƒ§ăƒłăźăƒ‘ă‚čは `index.html` ă‚’é…äżĄă—ăŸă™ă€‚ă“ă‚ŒăŻă€ă‚Żăƒ©ă‚€ă‚ąăƒłăƒˆă‚”ă‚€ăƒ‰ăƒ«ăƒŒăƒ†ă‚Łăƒłă‚°ă‚’äœżă†ć€šăăźăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ă‚ąăƒ—ăƒȘăŒæœŸćŸ…ă™ă‚‹ć‹•äœœă§ă™ă€‚ + +ăăźăŸă‚ă€ă»ăšă‚“ă©ăźć Žćˆă€`fallback` ćŒ•æ•°ă‚’æŒ‡ćźšă›ăšă« `app.frontend("/", directory="dist")` ă‚’äœżç”šă§ăăŸă™ă€‚ + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +## ăƒ•ă‚©ăƒŒăƒ«ăƒăƒƒă‚Żăźç„ĄćŠč挖 { #disable-fallback } + +歘朹しăȘいフロントスンドパă‚čă«ćŻŸă—ăŠăƒ•ă‚©ăƒŒăƒ«ăƒăƒƒă‚Żăƒ•ă‚Ąă‚€ăƒ«ă‚’é…äżĄă—ăŸăăȘい栮搈は、`fallback=None` ă‚’äœżă„ăŸă™ă€‚ + +{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *} + +するべ、歘朹しăȘいフロントスンドパă‚čは通澾ぼ `404` ă‚’èż”ă—ăŸă™ă€‚ + +## ディレクトăƒȘぼチェック { #check-directory } + +ăƒ‡ăƒ•ă‚©ăƒ«ăƒˆă§ăŻă€`app.frontend()` はケプăƒȘäœœæˆæ™‚ă«ăƒ‡ă‚ŁăƒŹă‚ŻăƒˆăƒȘăŒć­˜ćœšă™ă‚‹ă“ăšă‚’ăƒă‚§ăƒƒă‚Żă—ăŸă™ă€‚ + +ă“ă‚Œă«ă‚ˆă‚Šă€èš­ćźšă‚šăƒ©ăƒŒă‚’æ—©æœŸă«æ€œć‡șă§ăăŸă™ă€‚ăŸăšăˆă°ă€ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăźăƒ“ăƒ«ăƒ‰ć‡ș抛ディレクトăƒȘが歘朹しăȘい栮搈、**FastAPI** ăŻè”·ć‹•æ™‚ă«ă‚šăƒ©ăƒŒă‚’ç™șç”Ÿă•ă›ăŸă™ă€‚ + +ケプăƒȘă‚Șăƒ–ă‚žă‚§ă‚ŻăƒˆăźäœœæˆćŸŒă«ćˆ„ăźăƒ“ăƒ«ăƒ‰ă‚čテップăȘă©ă§ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăƒ•ă‚Ąă‚€ăƒ«ăŒäœœæˆă•ă‚Œă‚‹ć ŽćˆăŻă€`check_dir=False` ă‚’èš­ćźšă—ăŸă™ă€‚ + +{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *} + +`check_dir=False` ă‚’æŒ‡ćźšă™ă‚‹ăšă€**FastAPI** はケプăƒȘäœœæˆæ™‚ă«ăƒ‡ă‚ŁăƒŹă‚ŻăƒˆăƒȘă‚’ăƒă‚§ăƒƒă‚Żă—ăŸă›ă‚“ă€‚ăƒȘクスă‚čăƒˆăŒć‡Šç†ă•ă‚Œă‚‹æ™‚ç‚čă§èš­ćźšă•ă‚ŒăŸăƒ‡ă‚ŁăƒŹă‚ŻăƒˆăƒȘăŒăŸă ć­˜ćœšă—ăȘい栮搈、**FastAPI** ăŻăăźæ™‚ç‚čă§ă‚šăƒ©ăƒŒă‚’ç™șç”Ÿă•ă›ăŸă™ă€‚ + +## `APIRouter` ă§ăźäœżç”š { #use-it-with-apirouter } + +ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăƒ•ă‚Ąă‚€ăƒ«ă‚’ `APIRouter` ă«èżœćŠ ă—ă€prefix ä»˜ăă§ include ă™ă‚‹ă“ăšă‚‚ă§ăăŸă™ă€‚ + +{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *} + +ă“ăźäŸ‹ă§ăŻă€ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăźăƒ‘ă‚čは `/app` é…äž‹ă§é…äżĄă•ă‚ŒăŸă™ă€‚ + +他た router ć†…ăźă‚‚ăźă‚’ć«ă‚ă€ă‚ąăƒ—ăƒȘ憅ぼ通澾ぼ *path operations* ăŻćŒ•ăç¶šăć„Șć…ˆă•ă‚ŒăŸă™ă€‚ + +## é™çš„ăƒ“ăƒ«ăƒ‰ć‡ș抛ぼみ { #static-build-output-only } + +`app.frontend()` ăŻă€ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăźăƒ“ăƒ«ăƒ‰ă§æ—ąă«ç”Ÿæˆă•ă‚ŒăŸăƒ•ă‚Ąă‚€ăƒ«ă‚’é…äżĄă—ăŸă™ă€‚ + +server-side rendering ăŻćźŸèĄŒă—ăŸă›ă‚“ă€‚ă“ă‚ŒăŻé™çš„ăƒ•ă‚Ąă‚€ăƒ«ă‚’ç”Ÿæˆă™ă‚‹ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ăƒ•ăƒŹăƒŒăƒ ăƒŻăƒŒă‚Żć‘ă‘ă§ă‚ă‚Šă€ć„ăƒȘクスă‚čăƒˆă”ăšă«ă‚”ăƒŒăƒăƒŒäžŠă§ć‹•çš„ăƒŹăƒłăƒ€ăƒȘăƒłă‚°ă‚’ćż…èŠăšă™ă‚‹ăƒ•ăƒŹăƒŒăƒ ăƒŻăƒŒă‚Żć‘ă‘ă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ From 65fd47ffa0077da9760d4ee1d51eeceda4a6dc0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 12:42:52 +0200 Subject: [PATCH 257/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20pt=20(add-missing)=20(#15883)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/pt/docs/tutorial/frontend.md | 133 ++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/pt/docs/tutorial/frontend.md diff --git a/docs/pt/docs/tutorial/frontend.md b/docs/pt/docs/tutorial/frontend.md new file mode 100644 index 000000000..872c32e9e --- /dev/null +++ b/docs/pt/docs/tutorial/frontend.md @@ -0,0 +1,133 @@ +# Frontend { #frontend } + +VocĂȘ pode servir aplicaçÔes frontend estĂĄticas com `app.frontend()` ou `router.frontend()`. + +Isso Ă© Ăștil para ferramentas de frontend que geram arquivos estĂĄticos, como React com Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid e outras. + +Com essas ferramentas, normalmente hĂĄ uma etapa que faz o build do frontend, com um comando como: + +```bash +npm run build +``` + +Isso geraria um diretĂłrio como `./dist/` com seus arquivos de frontend. + +VocĂȘ pode usar `app.frontend()` para servir esse diretĂłrio seguindo as convençÔes necessĂĄrias por esses frameworks de frontend. + +**FastAPI** verifica as *operaçÔes de rota* primeiro. Os arquivos de frontend sĂŁo verificados somente se nenhuma rota normal corresponder, entĂŁo sua API nĂŁo serĂĄ afetada. + +## Sirva um Frontend { #serve-a-frontend } + +Depois de fazer o build do seu frontend, por exemplo com `npm run build`, coloque os arquivos gerados em um diretĂłrio, por exemplo, `dist`. + +A estrutura do seu projeto poderia ser assim: + +```text +. +├── pyproject.toml +├── app +│ ├── __init__.py +│ └── main.py +└── dist + ├── index.html + └── assets + └── app.js +``` + +EntĂŁo sirva-o com `app.frontend()`: + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +Com isso, um request para `/assets/app.js` pode servir `dist/assets/app.js`. + +Se vocĂȘ tambĂ©m tiver uma *operação de rota* do **FastAPI**, a *operação de rota* tem prioridade. + +## Roteamento no Lado do Cliente { #client-side-routing } + +Muitas aplicaçÔes frontend, incluindo **aplicaçÔes de pĂĄgina Ășnica** (SPAs), usam roteamento no lado do cliente. Um path como `/dashboard/settings` pode nĂŁo ser um arquivo real, mas o framework cuidaria de lidar com ele. + +EntĂŁo, ao acessar essa URL diretamente (em vez de navegar pela aplicação), o backend deveria servir a aplicação frontend a partir de `index.html`, para que o framework de frontend possa entĂŁo lidar com o roteamento no lado do cliente. + +Para isso, use `fallback="index.html"`: + +{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} + +**FastAPI** usa esse fallback somente para requests `GET` e `HEAD` que parecem navegação do navegador. Arquivos ausentes como JavaScript, CSS e imagens ainda retornam `404`. + +Requests com outros mĂ©todos, como `POST` ou `PUT`, para paths que correspondem apenas ao fallback do frontend tambĂ©m retornam `404`. *OperaçÔes de rota* regulares do **FastAPI** ainda tĂȘm prioridade maior que rotas de frontend. + +/// tip | Dica + +Por padrĂŁo, `fallback` tem o valor `fallback="auto"`. Na maioria dos casos, vocĂȘ nĂŁo precisarĂĄ especificar `fallback`. Leia abaixo para detalhes. + +/// + +Isso Ă© o que vocĂȘ desejaria com muitas aplicaçÔes frontend que usam roteamento no lado do cliente, por exemplo, React com TanStack Router, Vue, Angular, SvelteKit ou Solid. + +## PĂĄgina 404 Personalizada { #custom-404-page } + +VocĂȘ tambĂ©m pode servir uma pĂĄgina estĂĄtica `404.html` para paths de frontend ausentes: + +{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *} + +Essa response mantĂ©m um cĂłdigo de status `404`. + +Neste caso, **FastAPI** nĂŁo servirĂĄ `index.html` para paths de frontend ausentes. Ele retornarĂĄ o arquivo `404.html` em vez disso. + +/// tip | Dica + +Por padrĂŁo, `fallback` tem o valor `fallback="auto"`. Com isso, se um arquivo `404.html` for encontrado, ele serĂĄ usado automaticamente como fallback. + +EntĂŁo, normalmente vocĂȘ pode omitir o argumento `fallback`. + +/// + +Isso Ă© Ăștil com ferramentas de frontend que geram arquivos HTML estĂĄticos para cada pĂĄgina, como Astro. + +## Fallback AutomĂĄtico { #fallback-auto } + +Por padrĂŁo, `app.frontend()` usa `fallback="auto"`. + +Se houver um arquivo `404.html` no diretĂłrio do frontend, paths de frontend ausentes servem esse arquivo com cĂłdigo de status `404`. + +Caso contrĂĄrio, se houver um arquivo `index.html`, paths de navegação do navegador ausentes servem `index.html`, que Ă© o que muitas aplicaçÔes frontend com roteamento no lado do cliente esperam. + +EntĂŁo, na maioria dos casos, vocĂȘ pode usar `app.frontend("/", directory="dist")` sem especificar o argumento `fallback`. + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +## Desative o Fallback { #disable-fallback } + +Se vocĂȘ nĂŁo quiser servir um arquivo de fallback para paths de frontend ausentes, use `fallback=None`: + +{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *} + +EntĂŁo paths de frontend ausentes retornam o `404` normal. + +## Verifique o DiretĂłrio { #check-directory } + +Por padrĂŁo, `app.frontend()` verifica se o diretĂłrio existe quando a aplicação Ă© criada. + +Isso ajuda a identificar erros de configuração cedo. Por exemplo, se o diretĂłrio de saĂ­da do build do frontend estiver ausente, **FastAPI** gerarĂĄ um erro na inicialização. + +Se seus arquivos de frontend forem criados depois, por exemplo por uma etapa de build separada apĂłs o objeto da aplicação ser criado, defina `check_dir=False`: + +{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *} + +Com `check_dir=False`, **FastAPI** nĂŁo verificarĂĄ o diretĂłrio quando a aplicação for criada. Se o diretĂłrio configurado ainda estiver ausente quando um request for processado, **FastAPI** gerarĂĄ um erro nesse momento. + +## Use com `APIRouter` { #use-it-with-apirouter } + +VocĂȘ tambĂ©m pode adicionar arquivos de frontend a um `APIRouter` e incluĂ­-lo com um prefixo: + +{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *} + +Neste exemplo, os paths de frontend sĂŁo servidos em `/app`. + +Quaisquer *operaçÔes de rota* regulares na aplicação ainda terĂŁo precedĂȘncia, inclusive em outros routers. + +## Apenas SaĂ­da de Build EstĂĄtico { #static-build-output-only } + +`app.frontend()` serve arquivos jĂĄ gerados pelo build do seu frontend. + +Ele nĂŁo executa renderização no lado do servidor. Ele Ă© para frameworks de frontend que geram arquivos estĂĄticos, nĂŁo para frameworks que precisam de renderização dinĂąmica no servidor para cada request. From 7a79b7e9fb4afa0ee10ccf0bdc800f56adda8732 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 10:43:20 +0000 Subject: [PATCH 258/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7654aa902..a7ed8f122 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for ja (add-missing). PR [#15882](https://github.com/fastapi/fastapi/pull/15882) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for tr (add-missing). PR [#15887](https://github.com/fastapi/fastapi/pull/15887) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for uk (add-missing). PR [#15886](https://github.com/fastapi/fastapi/pull/15886) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for fr (add-missing). PR [#15881](https://github.com/fastapi/fastapi/pull/15881) by [@tiangolo](https://github.com/tiangolo). From eaace7a13e787e8fab3822165adbef36d21675dd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 10:43:23 +0000 Subject: [PATCH 259/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a7ed8f122..e69546138 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for zh (add-missing). PR [#15885](https://github.com/fastapi/fastapi/pull/15885) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ja (add-missing). PR [#15882](https://github.com/fastapi/fastapi/pull/15882) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for tr (add-missing). PR [#15887](https://github.com/fastapi/fastapi/pull/15887) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for uk (add-missing). PR [#15886](https://github.com/fastapi/fastapi/pull/15886) by [@tiangolo](https://github.com/tiangolo). From 78154e85a620556722d0b9318b61d7ba4a222c4d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 10:43:39 +0000 Subject: [PATCH 260/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index e69546138..ef2abfd68 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for pt (add-missing). PR [#15883](https://github.com/fastapi/fastapi/pull/15883) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for zh (add-missing). PR [#15885](https://github.com/fastapi/fastapi/pull/15885) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ja (add-missing). PR [#15882](https://github.com/fastapi/fastapi/pull/15882) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for tr (add-missing). PR [#15887](https://github.com/fastapi/fastapi/pull/15887) by [@tiangolo](https://github.com/tiangolo). From 4011c1231827ae472ff35545b7fe1e32be4ba570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 12:43:53 +0200 Subject: [PATCH 261/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20zh-hant=20(add-missing)=20(#15889)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/zh-hant/docs/tutorial/frontend.md | 133 +++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/zh-hant/docs/tutorial/frontend.md diff --git a/docs/zh-hant/docs/tutorial/frontend.md b/docs/zh-hant/docs/tutorial/frontend.md new file mode 100644 index 000000000..0c568b9f5 --- /dev/null +++ b/docs/zh-hant/docs/tutorial/frontend.md @@ -0,0 +1,133 @@ +# ć‰ç«Ż { #frontend } + +äœ ćŻä»„äœżç”š `app.frontend()`或 `router.frontend()`ïŒ‰äŸ†æäŸ›éœæ…‹ć‰ç«Żæ‡‰ç”šçš‹ćŒă€‚ + +é€™ć°æœƒç”ąç”Ÿéœæ…‹æȘ”æĄˆçš„ć‰ç«Żć·„ć…·ćŸˆæœ‰ç”šïŒŒäŸ‹ćŠ‚æ­é… Vite 的 React、TanStack Router、Astro、Vue、Svelte、Angular、Solid 等。 + +äœżç”šé€™äș›ć·„ć…·æ™‚ïŒŒäœ é€šćžžæœƒæœ‰äž€ć€‹ć»șçœźć‰ç«Żçš„æ­„é©ŸïŒŒäœżç”šćƒé€™æšŁçš„æŒ‡ä»€ïŒš + +```bash +npm run build +``` + +é‚Łæœƒç”ąç”Ÿćƒ `./dist/` é€™æšŁçš„ç›źéŒ„ïŒŒèŁĄéąćŒ…ć«äœ çš„ć‰ç«ŻæȘ”æĄˆă€‚ + +äœ ćŻä»„äœżç”š `app.frontend()` 䟝照這äș›ć‰ç«ŻæĄ†æž¶æ‰€éœ€çš„æ…ŁäŸ‹äŸ†æäŸ›è©Č盼錄。 + +**FastAPI** æœƒć…ˆæȘ࿟„*è·ŻćŸ‘æ“äœœ*。ćȘæœ‰ćœšæČ’æœ‰äž€èˆŹè·Żç”±çŹŠćˆæ™‚ïŒŒæ‰æœƒæȘ࿟„ć‰ç«ŻæȘ”æĄˆïŒŒć› æ­€äœ çš„ API äžæœƒć—ćˆ°ćœ±éŸżă€‚ + +## æäŸ›ć‰ç«Ż { #serve-a-frontend } + +朹ć»șçœźć‰ç«Żäč‹ćŸŒïŒŒäŸ‹ćŠ‚äœżç”š `npm run build`ïŒŒć°‡ç”ąç”Ÿçš„æȘ”æĄˆæ”ŸćœšæŸć€‹ç›źéŒ„äž­ïŒŒäŸ‹ćŠ‚ `dist`。 + +äœ çš„ć°ˆæĄˆç”æ§‹ćŻèƒœćŠ‚äž‹ïŒš + +```text +. +├── pyproject.toml +├── app +│ ├── __init__.py +│ └── main.py +└── dist + ├── index.html + └── assets + └── app.js +``` + +ç„¶ćŸŒäœżç”š `app.frontend()` äŸ†æäŸ›ćźƒïŒš + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +ćŠ‚æ­€äž€äŸ†ïŒŒć° `/assets/app.js` çš„è«‹æ±‚ć°±ćŻä»„æäŸ› `dist/assets/app.js`。 + +ćŠ‚æžœäœ ä蟿œ‰ **FastAPI** *è·ŻćŸ‘æ“äœœ*ïŒŒć‰‡*è·ŻćŸ‘æ“äœœ*會ć„Ș慈。 + +## ç”šæˆ¶ç«Żè·Żç”± { #client-side-routing } + +èš±ć€šć‰ç«Żæ‡‰ç”šçš‹ćŒïŒŒćŒ…æ‹Ź **single-page apps**SPAsïŒ‰ïŒŒéƒœæœƒäœżç”šç”šæˆ¶ç«Żè·Żç”±ă€‚ćƒ `/dashboard/settings` é€™æšŁçš„è·ŻćŸ‘ćŻèƒœäžæ˜ŻçœŸćŻŠæȘ”æĄˆïŒŒè€Œæ˜Żç”±æĄ†æž¶èČ èČŹè™•ç†ă€‚ + +ć› æ­€ïŒŒćŠ‚æžœç›ŽæŽ„ć­˜ć–è©Č URLïŒˆè€Œäžæ˜Żé€éŽæ‡‰ç”šçš‹ćŒć…§ć°ŽèŠœïŒ‰ïŒŒćŸŒç«Żæ‡‰è©ČćŸž `index.html` æäŸ›ć‰ç«Żæ‡‰ç”šçš‹ćŒïŒŒèź“ć‰ç«ŻæĄ†æž¶æŽ„è‘—è™•ç†ç”šæˆ¶ç«Żè·Żç”±ă€‚ + +ç‚șæ­€ïŒŒè«‹äœżç”š `fallback="index.html"` + +{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} + +**FastAPI** ćȘæœƒć°çœ‹è”·äŸ†ćƒç€èŠœć™šć°ŽèŠœçš„ `GET` 撌 `HEAD` è«‹æ±‚äœżç”šé€™ć€‹ fallback。éș怱的æȘ”æĄˆïŒŒäŸ‹ćŠ‚ JavaScript、CSS ć’Œćœ–ç‰‡ïŒŒä»æœƒć›žć‚ł `404`。 + +ć°æ–ŒćȘçŹŠćˆć‰ç«Ż fallback çš„è·ŻćŸ‘ïŒŒäœżç”šć…¶ä»–æ–čæł•çš„è«‹æ±‚ïŒŒäŸ‹ćŠ‚ `POST` 或 `PUT`ä蟿œƒć›žć‚ł `404`ă€‚äž€èˆŹçš„ **FastAPI** *è·ŻćŸ‘æ“äœœ*ä»ç„¶æŻ”ć‰ç«Żè·Żç”±æœ‰æ›Žé«˜ć„Ș慈順ćșă€‚ + +/// tip + +é èš­æƒ…æłäž‹ïŒŒ`fallback` çš„ć€Œæ˜Ż `fallback="auto"`ă€‚ćœšć€§ć€šæ•žæƒ…æłäž‹ïŒŒäœ äžéœ€èŠæŒ‡ćźš `fallback`ă€‚è«‹é–±èź€äž‹æ–č慧ćźč仄äș†è§Łè©łçŽ°èł‡èšŠă€‚ + +/// + +é€™æ­Łæ˜Żèš±ć€šäœżç”šç”šæˆ¶ç«Żè·Żç”±çš„ć‰ç«Żæ‡‰ç”šçš‹ćŒæ‰€éœ€èŠçš„èĄŒç‚șïŒŒäŸ‹ćŠ‚æ­é… TanStack Router 的 React、Vue、Angular、SvelteKit 或 Solid。 + +## è‡Șèš‚ 404 頁靱 { #custom-404-page } + +䜠äčŸćŻä»„ç‚șéșć€±çš„ć‰ç«Żè·ŻćŸ‘æäŸ›éœæ…‹ `404.html` é éąïŒš + +{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *} + +è©Čć›žæ‡‰æœƒäżç•™ `404` ç‹€æ…‹çąŒă€‚ + +ćœšé€™çšźæƒ…æłäž‹ïŒŒ**FastAPI** 䞍會ç‚șéșć€±çš„ć‰ç«Żè·ŻćŸ‘æäŸ› `index.html`ă€‚ćźƒæœƒæ”čç‚ș曞悳 `404.html` æȘ”æĄˆă€‚ + +/// tip + +é èš­æƒ…æłäž‹ïŒŒ`fallback` çš„ć€Œæ˜Ż `fallback="auto"`ă€‚ćŠ‚æ­€äž€äŸ†ïŒŒćŠ‚æžœæ‰Ÿćˆ° `404.html` æȘ”æĄˆïŒŒć°±æœƒè‡Șć‹•ć°‡ć…¶ç”šäœœ fallback。 + +ć› æ­€ïŒŒäœ é€šćžžćŻä»„çœç•„ `fallback` ćŒ•æ•žă€‚ + +/// + +é€™ć°æœƒç‚șæŻć€‹é éąç”ąç”Ÿéœæ…‹ HTML æȘ”æĄˆçš„ć‰ç«Żć·„ć…·ćŸˆæœ‰ç”šïŒŒäŸ‹ćŠ‚ Astro。 + +## è‡Ș拕 Fallback { #fallback-auto } + +é èš­æƒ…æłäž‹ïŒŒ`app.frontend()` æœƒäœżç”š `fallback="auto"`。 + +ćŠ‚æžœć‰ç«Żç›źéŒ„äž­æœ‰ `404.html` æȘ”æĄˆïŒŒéșć€±çš„ć‰ç«Żè·ŻćŸ‘æœƒæäŸ›è©ČæȘ”æĄˆïŒŒäžŠäœżç”šç‹€æ…‹çąŒ `404`。 + +ćŠć‰‡ïŒŒćŠ‚æžœæœ‰ `index.html` æȘ”æĄˆïŒŒéșć€±çš„ç€èŠœć™šć°ŽèŠœè·ŻćŸ‘æœƒæäŸ› `index.html`ïŒŒé€™æ­Łæ˜Żèš±ć€šäœżç”šç”šæˆ¶ç«Żè·Żç”±çš„ć‰ç«Żæ‡‰ç”šçš‹ćŒæ‰€é æœŸçš„èĄŒç‚ș。 + +ć› æ­€ïŒŒćœšć€§ć€šæ•žæƒ…æłäž‹ïŒŒäœ ćŻä»„äœżç”š `app.frontend("/", directory="dist")`ïŒŒè€Œäžéœ€èŠæŒ‡ćźš `fallback` ćŒ•æ•žă€‚ + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +## 恜甹 Fallback { #disable-fallback } + +ćŠ‚æžœäœ äžæƒłç‚șéșć€±çš„ć‰ç«Żè·ŻćŸ‘æäŸ› fallback æȘ”æĄˆïŒŒè«‹äœżç”š `fallback=None` + +{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *} + +掄著éșć€±çš„ć‰ç«Żè·ŻćŸ‘æœƒć›žć‚łäž€èˆŹçš„ `404`。 + +## æȘ࿟„盼錄 { #check-directory } + +é èš­æƒ…æłäž‹ïŒŒ`app.frontend()` æœƒćœšć»șç«‹æ‡‰ç”šçš‹ćŒæ™‚æȘ࿟„ç›źéŒ„æ˜ŻćŠć­˜ćœšă€‚ + +é€™æœ‰ćŠ©æ–ŒćŠæ—©ç™ŒçŸèš­ćźšéŒŻèȘ€ă€‚äŸ‹ćŠ‚ïŒŒćŠ‚æžœçŒșć°‘ć‰ç«Żć»șçœźèŒžć‡șç›źéŒ„ïŒŒ**FastAPI** æœƒćœšć•Ÿć‹•æ™‚ćŒ•ç™ŒéŒŻèȘ€ă€‚ + +ćŠ‚æžœäœ çš„ć‰ç«ŻæȘ”æĄˆçšćŸŒæ‰æœƒć»șç«‹ïŒŒäŸ‹ćŠ‚ćœšć»ș立 app 物件äč‹ćŸŒç”±ćŠäž€ć€‹ć»șçœźæ­„é©Ÿç”ąç”ŸïŒŒè«‹èš­ćźš `check_dir=False` + +{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *} + +äœżç”š `check_dir=False` 時**FastAPI** äžæœƒćœšć»șç«‹æ‡‰ç”šçš‹ćŒæ™‚æȘ࿟„ç›źéŒ„ă€‚ćŠ‚æžœćœšè™•ç†è«‹æ±‚æ™‚ïŒŒèš­ćźšçš„ç›źéŒ„ä»ç„¶äžć­˜ćœšïŒŒ**FastAPI** æœƒćœšé‚Łæ™‚ćŒ•ç™ŒéŒŻèȘ€ă€‚ + +## 與 `APIRouter` æ­é…äœżç”š { #use-it-with-apirouter } + +䜠äčŸćŻä»„ć°‡ć‰ç«ŻæȘ”æĄˆćŠ ć…„ `APIRouter`ïŒŒäžŠäœżç”šć‰ç¶ŽćŒ…ć«ćźƒïŒš + +{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *} + +ćœšé€™ć€‹çŻ„äŸ‹äž­ïŒŒć‰ç«Żè·ŻćŸ‘æœƒćœš `/app` ćș•äž‹æäŸ›ă€‚ + +æ‡‰ç”šçš‹ćŒäž­çš„ä»»äœ•äž€èˆŹ*è·ŻćŸ‘æ“äœœ*仍會ć„Șć…ˆïŒŒćŒ…æ‹Źć…¶ä»– router äž­çš„è·ŻćŸ‘æ“äœœă€‚ + +## ćƒ…é™éœæ…‹ć»șçœźèŒžć‡ș { #static-build-output-only } + +`app.frontend()` æœƒæäŸ›äœ çš„ć‰ç«Żć»șçœźć·Čç¶“ç”ąç”Ÿçš„æȘ”æĄˆă€‚ + +ćźƒäžæœƒćŸ·èĄŒ server-side renderingă€‚ćźƒé©ç”šæ–Œæœƒç”ąç”Ÿéœæ…‹æȘ”æĄˆçš„ć‰ç«ŻæĄ†æž¶ïŒŒäžé©ç”šæ–Œéœ€èŠćœšäŒșæœć™šäžŠç‚șæŻć€‹è«‹æ±‚é€ČèĄŒć‹•æ…‹ rendering çš„æĄ†æž¶ă€‚ From 2c4f3e3ece230410893471e66dac68b26b4c915a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 12:44:10 +0200 Subject: [PATCH 262/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20ko=20(add-missing)=20(#15888)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/ko/docs/tutorial/frontend.md | 133 ++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/ko/docs/tutorial/frontend.md diff --git a/docs/ko/docs/tutorial/frontend.md b/docs/ko/docs/tutorial/frontend.md new file mode 100644 index 000000000..50149432c --- /dev/null +++ b/docs/ko/docs/tutorial/frontend.md @@ -0,0 +1,133 @@ +# í”„ëĄ íŠžì—”ë“œ { #frontend } + +`app.frontend()`(또는 `router.frontend()`)로 정적 í”„ëĄ íŠžì—”ë“œ ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ ì œêł”í•  수 있슔니닀. + +읎는 Vite넌 ì‚Źìš©í•˜ëŠ” React, TanStack Router, Astro, Vue, Svelte, Angular, Solid ë“±êłŒ 같읎 정적 파음을 생성하는 í”„ëĄ íŠžì—”ë“œ ë„ê”Źì— 유용합니닀. + +ìŽëŸŹí•œ ë„ê”Źì—ì„œëŠ” 볎톔 ë‹€ìŒêłŒ 같은 ëȘ…ë čì–ŽëĄœ í”„ëĄ íŠžì—”ë“œë„Œ ëčŒë“œí•˜ëŠ” ë‹šêł„ê°€ 있슔니닀: + +```bash +npm run build +``` + +ê·žëŸŹë©Ž í”„ëĄ íŠžì—”ë“œ 파음읎 듀얎 있는 `./dist/` 같은 ë””ë ‰í„°ëŠŹê°€ 생성됩니닀. + +`app.frontend()`넌 ì‚Źìš©í•˜ë©Ž ìŽëŸŹí•œ í”„ëĄ íŠžì—”ë“œ í”„ë ˆìž„ì›ŒíŹì— 필요한 규ìč™ì— 따띌 핮ë‹č ë””ë ‰í„°ëŠŹë„Œ ì œêł”í•  수 있슔니닀. + +**FastAPI**는 뚌저 *êČœëĄœ ìȘ늏*넌 확읞합니닀. í”„ëĄ íŠžì—”ë“œ 파음은 음반 띌우튞와 ë§€ìč­ë˜ì§€ 않는 êČœìš°ì—ë§Œ í™•ìžë˜ëŻ€ëĄœ, API에는 영햄을 ìŁŒì§€ 않슔니닀. + +## í”„ëĄ íŠžì—”ë“œ ì œêł”í•˜êž° { #serve-a-frontend } + +예넌 듀얎 `npm run build`로 í”„ëĄ íŠžì—”ë“œë„Œ ëčŒë“œí•œ 후, 생성된 파음을 `dist` 같은 ë””ë ‰í„°ëŠŹì— ë„ŁìŠ”ë‹ˆë‹€. + +í”„ëĄœì íŠž ê”ŹìĄ°ëŠ” ë‹€ìŒêłŒ 같을 수 있슔니닀: + +```text +. +├── pyproject.toml +├── app +│ ├── __init__.py +│ └── main.py +└── dist + ├── index.html + └── assets + └── app.js +``` + +귞런 닀음 `app.frontend()`로 ì œêł”í•©ë‹ˆë‹€: + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +읎렇êȌ 하멎 `/assets/app.js`에 대한 요ìČ­ìŽ `dist/assets/app.js`넌 ì œêł”í•  수 있슔니닀. + +**FastAPI** *êČœëĄœ ìȘ늏*도 있닀멎, *êČœëĄœ ìȘ늏*가 우선합니닀. + +## 큎띌읎얞튞 ì‚ŹìŽë“œ 띌우팅 { #client-side-routing } + +**single-page apps**(SPAs)넌 포핹한 많은 í”„ëĄ íŠžì—”ë“œ ì• í”ŒëŠŹìŒ€ìŽì…˜ì€ 큎띌읎얞튞 ì‚ŹìŽë“œ 띌우팅을 ì‚Źìš©í•©ë‹ˆë‹€. `/dashboard/settings` 같은 êČœëĄœëŠ” 싀제 파음읎 아닐 수 있지만, í”„ë ˆìž„ì›ŒíŹê°€ 읎넌 ìČ˜ëŠŹí•©ë‹ˆë‹€. + +따띌서 핮ë‹č URL에 직접 접귌하는 êČœìš°(ì• í”ŒëŠŹìŒ€ìŽì…˜ 안에서 탐색하는 대신), 백엔드는 `index.html`에서 í”„ëĄ íŠžì—”ë“œ ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ ì œêł”í•Žì•Œ 합니닀. ê·žëŸŹë©Ž í”„ëĄ íŠžì—”ë“œ í”„ë ˆìž„ì›ŒíŹê°€ 큎띌읎얞튞 ì‚ŹìŽë“œ 띌우팅을 ìȘ멬할 수 있슔니닀. + +읎넌 위핎 `fallback="index.html"`을 ì‚Źìš©í•©ë‹ˆë‹€: + +{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} + +**FastAPI**는 람띌우저 탐색ìČ˜ëŸŒ ëłŽìŽëŠ” `GET` 및 `HEAD` 요ìČ­ì—ë§Œ 읎 fallback을 ì‚Źìš©í•©ë‹ˆë‹€. JavaScript, CSS, ìŽëŻžì§€ìČ˜ëŸŒ 누띜된 파음은 ì—Źì „ížˆ `404`넌 반환합니닀. + +`POST`나 `PUT` 같은 닀넞 메서드의 요ìČ­ìŽ í”„ëĄ íŠžì—”ë“œ fallback에만 ë§€ìč­ë˜ëŠ” êČœëĄœëĄœ 듀얎와도 `404`넌 반환합니닀. 음반 **FastAPI** *êČœëĄœ ìȘ늏*는 ì—Źì „ížˆ í”„ëĄ íŠžì—”ë“œ ëŒìš°íŠžëłŽë‹€ 높은 우선순위넌 가집니닀. + +/// tip | 팁 + +êž°ëłžì ìœŒëĄœ `fallback`은 `fallback="auto"` 값을 가집니닀. 대부분의 êČœìš° `fallback`을 지정할 필요가 없슔니닀. 자섞한 낎용은 아래넌 ìœì–ŽëłŽì„žìš”. + +/// + +읎는 큎띌읎얞튞 ì‚ŹìŽë“œ 띌우팅을 ì‚Źìš©í•˜ëŠ” 많은 í”„ëĄ íŠžì—”ë“œ ì• í”ŒëŠŹìŒ€ìŽì…˜ì—ì„œ 원하는 동작입니닀. 예넌 듀얎 TanStack Router넌 ì‚Źìš©í•˜ëŠ” React, Vue, Angular, SvelteKit, Solid 등읎 있슔니닀. + +## ì‚Źìš©ìž 정의 404 페읎지 { #custom-404-page } + +누띜된 í”„ëĄ íŠžì—”ë“œ êČœëĄœì— 대핮 정적 `404.html` 페읎지넌 ì œêł”í•  수도 있슔니닀: + +{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *} + +읎 응닔은 `404` 상태 윔드넌 유지합니닀. + +읎 êČœìš° **FastAPI**는 누띜된 í”„ëĄ íŠžì—”ë“œ êČœëĄœì— 대핮 `index.html`을 ì œêł”í•˜ì§€ 않슔니닀. 대신 `404.html` 파음을 반환합니닀. + +/// tip | 팁 + +êž°ëłžì ìœŒëĄœ `fallback`은 `fallback="auto"` 값을 가집니닀. 읎넌 ì‚Źìš©í•˜ë©Ž `404.html` 파음읎 발êȏ될 êČœìš° ìžë™ìœŒëĄœ fallbackìœŒëĄœ ì‚Źìš©ë©ë‹ˆë‹€. + +따띌서 ìŒë°˜ì ìœŒëĄœ `fallback` 읞자넌 생랔할 수 있슔니닀. + +/// + +읎는 AstroìČ˜ëŸŒ 각 페읎지에 대한 정적 HTML 파음을 생성하는 í”„ëĄ íŠžì—”ë“œ ë„ê”Źì— 유용합니닀. + +## Fallback 자동 섀정 { #fallback-auto } + +êž°ëłžì ìœŒëĄœ `app.frontend()`는 `fallback="auto"`넌 ì‚Źìš©í•©ë‹ˆë‹€. + +í”„ëĄ íŠžì—”ë“œ ë””ë ‰í„°ëŠŹì— `404.html` 파음읎 있윌멎, 누띜된 í”„ëĄ íŠžì—”ë“œ êČœëĄœëŠ” 상태 윔드 `404`와 핚께 핮ë‹č 파음을 ì œêł”í•©ë‹ˆë‹€. + +귞렇지 ì•Šêł  `index.html` 파음읎 있윌멎, 누띜된 람띌우저 탐색 êČœëĄœëŠ” `index.html`을 ì œêł”í•©ë‹ˆë‹€. 읎는 큎띌읎얞튞 ì‚ŹìŽë“œ 띌우팅을 ì‚Źìš©í•˜ëŠ” 많은 í”„ëĄ íŠžì—”ë“œ ì• í”ŒëŠŹìŒ€ìŽì…˜ìŽ Ʞ대하는 동작입니닀. + +따띌서 대부분의 êČœìš° `fallback` 읞자넌 지정하지 ì•Šêł  `app.frontend("/", directory="dist")`넌 ì‚Źìš©í•  수 있슔니닀. + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +## Fallback ëč„활성화 { #disable-fallback } + +누띜된 í”„ëĄ íŠžì—”ë“œ êČœëĄœì— 대핮 fallback 파음을 ì œêł”í•˜êł  싶지 않닀멎 `fallback=None`을 ì‚Źìš©í•©ë‹ˆë‹€: + +{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *} + +ê·žëŸŹë©Ž 누띜된 í”„ëĄ íŠžì—”ë“œ êČœëĄœëŠ” 음반 `404`넌 반환합니닀. + +## 디렉터멬 확읞하Ʞ { #check-directory } + +êž°ëłžì ìœŒëĄœ `app.frontend()`는 ì• í”ŒëŠŹìŒ€ìŽì…˜ìŽ 생성될 때 ë””ë ‰í„°ëŠŹê°€ ìĄŽìžŹí•˜ëŠ”ì§€ 확읞합니닀. + +읎는 섀정 였넘넌 음찍 발êȬ하는 데 도움읎 됩니닀. 예넌 듀얎 í”„ëĄ íŠžì—”ë“œ ëčŒë“œ 출렄 ë””ë ‰í„°ëŠŹê°€ 없닀멎 **FastAPI**는 시작 시 였넘넌 발생시킔니닀. + +í”„ëĄ íŠžì—”ë“œ 파음읎 나쀑에 생성된닀멎, 예넌 듀얎 ì• í”ŒëŠŹìŒ€ìŽì…˜ 객ìČŽê°€ 생성된 후 ëł„ë„ì˜ ëčŒë“œ ë‹šêł„ì—ì„œ 생성된닀멎, `check_dir=False`넌 섀정합니닀: + +{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *} + +`check_dir=False`넌 ì‚Źìš©í•˜ë©Ž **FastAPI**는 ì• í”ŒëŠŹìŒ€ìŽì…˜ìŽ 생성될 때 ë””ë ‰í„°ëŠŹë„Œ 확읞하지 않슔니닀. 요ìČ­ìŽ ìȘ늏될 때 섀정된 ë””ë ‰í„°ëŠŹê°€ ì—Źì „ížˆ 없닀멎, 귞때 **FastAPI**가 였넘넌 발생시킔니닀. + +## `APIRouter`와 핚께 ì‚Źìš©í•˜êž° { #use-it-with-apirouter } + +í”„ëĄ íŠžì—”ë“œ 파음을 `APIRouter`에 ì¶”ê°€í•˜êł  prefix와 핚께 포핹할 수도 있슔니닀: + +{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *} + +읎 예제에서는 í”„ëĄ íŠžì—”ë“œ êČœëĄœê°€ `/app` 아래에서 ì œêł”ë©ë‹ˆë‹€. + +닀넞 띌우터에 있는 êČƒì„ íŹí•ší•˜ì—Ź, ì• í”ŒëŠŹìŒ€ìŽì…˜ì˜ ëȘšë“  음반 *êČœëĄœ ìȘ늏*가 ì—Źì „ížˆ 우선합니닀. + +## 정적 ëčŒë“œ 출렄만 ì‚Źìš©í•˜êž° { #static-build-output-only } + +`app.frontend()`는 í”„ëĄ íŠžì—”ë“œ ëčŒë“œì—ì„œ ìŽëŻž 생성된 파음을 ì œêł”í•©ë‹ˆë‹€. + +서ëȄ ì‚ŹìŽë“œ 렌더링은 싀행하지 않슔니닀. 각 요ìČ­ë§ˆë‹€ 서ëČ„ì—ì„œ 동적 렌더링읎 필요한 í”„ë ˆìž„ì›ŒíŹê°€ 아니띌, 정적 파음을 생성하는 í”„ëĄ íŠžì—”ë“œ í”„ë ˆìž„ì›ŒíŹë„Œ 위한 êČƒìž…ë‹ˆë‹€. From bfb663fa848e35d09b9d7bd21e3b346f442a7b80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 12:44:40 +0200 Subject: [PATCH 263/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20es=20(add-missing)=20(#15880)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/es/docs/tutorial/frontend.md | 133 ++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/es/docs/tutorial/frontend.md diff --git a/docs/es/docs/tutorial/frontend.md b/docs/es/docs/tutorial/frontend.md new file mode 100644 index 000000000..707772467 --- /dev/null +++ b/docs/es/docs/tutorial/frontend.md @@ -0,0 +1,133 @@ +# Frontend { #frontend } + +Puedes servir apps frontend estĂĄticas con `app.frontend()` (o `router.frontend()`). + +Esto es Ăștil para herramientas de frontend que generan archivos estĂĄticos, como React con Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid y otras. + +Con estas herramientas, normalmente tienes un paso que construye el frontend, con un comando como: + +```bash +npm run build +``` + +Eso generarĂ­a un directorio como `./dist/` con tus archivos frontend. + +Puedes usar `app.frontend()` para servir ese directorio siguiendo las convenciones que necesitan estos frameworks frontend. + +**FastAPI** revisa primero las *path operations*. Los archivos frontend se revisan solo si ninguna ruta normal coincide, asĂ­ que tu API no se verĂĄ afectada. + +## Sirve un Frontend { #serve-a-frontend } + +DespuĂ©s de construir tu frontend, por ejemplo con `npm run build`, pon los archivos generados en un directorio, por ejemplo, `dist`. + +La estructura de tu proyecto podrĂ­a verse asĂ­: + +```text +. +├── pyproject.toml +├── app +│ ├── __init__.py +│ └── main.py +└── dist + ├── index.html + └── assets + └── app.js +``` + +Luego sĂ­rvelo con `app.frontend()`: + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +Con esto, un request a `/assets/app.js` puede servir `dist/assets/app.js`. + +Si tambiĂ©n tienes una *path operation* de **FastAPI**, la *path operation* gana. + +## Routing del lado del cliente { #client-side-routing } + +Muchas apps frontend, incluidas las **single-page apps** (SPAs), usan routing del lado del cliente. Un path como `/dashboard/settings` podrĂ­a no ser un archivo real, pero el framework se encargarĂ­a de manejarlo. + +Entonces, si se accede a esa URL directamente (en lugar de navegar por la app), el backend deberĂ­a servir la app frontend desde `index.html`, para que el framework frontend pueda manejar el routing del lado del cliente. + +Para eso, usa `fallback="index.html"`: + +{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *} + +**FastAPI** usa este fallback solo para requests `GET` y `HEAD` que parecen navegaciĂłn del navegador. Los archivos faltantes como JavaScript, CSS e imĂĄgenes siguen devolviendo `404`. + +Los requests con otros mĂ©todos, como `POST` o `PUT`, a paths que solo coinciden con el fallback del frontend tambiĂ©n devuelven `404`. Las *path operations* normales de **FastAPI** siguen teniendo mayor prioridad que las rutas frontend. + +/// tip | Consejo + +Por defecto, `fallback` tiene un valor de `fallback="auto"`. En la mayorĂ­a de los casos no necesitarĂĄs especificar `fallback`. Lee mĂĄs abajo para los detalles. + +/// + +Esto es lo que querrĂ­as con muchas apps frontend que usan routing del lado del cliente, por ejemplo, React con TanStack Router, Vue, Angular, SvelteKit o Solid. + +## PĂĄgina 404 personalizada { #custom-404-page } + +TambiĂ©n puedes servir una pĂĄgina estĂĄtica `404.html` para paths frontend faltantes: + +{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *} + +Esa response mantiene un cĂłdigo de estado `404`. + +En este caso, **FastAPI** no servirĂĄ `index.html` para paths frontend faltantes. En su lugar, devolverĂĄ el archivo `404.html`. + +/// tip | Consejo + +Por defecto, `fallback` tiene un valor de `fallback="auto"`. Con esto, si se encuentra un archivo `404.html`, se usarĂĄ automĂĄticamente como fallback. + +AsĂ­ que normalmente puedes omitir el argumento `fallback`. + +/// + +Esto es Ăștil con herramientas de frontend que generan archivos HTML estĂĄticos para cada pĂĄgina, como Astro. + +## Fallback automĂĄtico { #fallback-auto } + +Por defecto, `app.frontend()` usa `fallback="auto"`. + +Si hay un archivo `404.html` en el directorio frontend, los paths frontend faltantes sirven ese archivo con cĂłdigo de estado `404`. + +De lo contrario, si hay un archivo `index.html`, los paths faltantes de navegaciĂłn del navegador sirven `index.html`, que es lo que muchas apps frontend con routing del lado del cliente esperan. + +AsĂ­ que, en la mayorĂ­a de los casos, puedes usar `app.frontend("/", directory="dist")` sin especificar el argumento `fallback`. + +{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *} + +## Desactiva el fallback { #disable-fallback } + +Si no quieres servir un archivo fallback para paths frontend faltantes, usa `fallback=None`: + +{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *} + +Entonces los paths frontend faltantes devuelven el `404` normal. + +## Revisa el directorio { #check-directory } + +Por defecto, `app.frontend()` revisa que el directorio exista cuando se crea la app. + +Esto ayuda a detectar errores de configuraciĂłn temprano. Por ejemplo, si falta el directorio de salida del build del frontend, **FastAPI** lanzarĂĄ un error al iniciar. + +Si tus archivos frontend se crean mĂĄs tarde, por ejemplo mediante un paso de build separado despuĂ©s de crear el objeto app, configura `check_dir=False`: + +{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *} + +Con `check_dir=False`, **FastAPI** no revisarĂĄ el directorio cuando se cree la app. Si el directorio configurado todavĂ­a falta cuando se maneja un request, **FastAPI** lanzarĂĄ un error en ese momento. + +## Úsalo con `APIRouter` { #use-it-with-apirouter } + +TambiĂ©n puedes agregar archivos frontend a un `APIRouter` e incluirlo con un prefijo: + +{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *} + +En este ejemplo, los paths frontend se sirven bajo `/app`. + +Cualquier *path operation* regular en la app seguirĂĄ teniendo prioridad, incluso en otros routers. + +## Solo salida estĂĄtica del build { #static-build-output-only } + +`app.frontend()` sirve archivos ya generados por tu build del frontend. + +No ejecuta renderizado del lado del servidor. Es para frameworks frontend que generan archivos estĂĄticos, no para frameworks que necesitan renderizado dinĂĄmico en el servidor para cada request. From bdc2dfc9aae56e7cf61fb14f9ca037a23c74255e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 10:46:08 +0000 Subject: [PATCH 264/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index ef2abfd68..52bd92c67 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for zh-hant (add-missing). PR [#15889](https://github.com/fastapi/fastapi/pull/15889) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for pt (add-missing). PR [#15883](https://github.com/fastapi/fastapi/pull/15883) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for zh (add-missing). PR [#15885](https://github.com/fastapi/fastapi/pull/15885) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ja (add-missing). PR [#15882](https://github.com/fastapi/fastapi/pull/15882) by [@tiangolo](https://github.com/tiangolo). From 86dd7b8a23fdbcc4ceafaaa92000a1a5ce874b88 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 10:46:58 +0000 Subject: [PATCH 265/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 52bd92c67..0767f9f9c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for es (add-missing). PR [#15880](https://github.com/fastapi/fastapi/pull/15880) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for zh-hant (add-missing). PR [#15889](https://github.com/fastapi/fastapi/pull/15889) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for pt (add-missing). PR [#15883](https://github.com/fastapi/fastapi/pull/15883) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for zh (add-missing). PR [#15885](https://github.com/fastapi/fastapi/pull/15885) by [@tiangolo](https://github.com/tiangolo). From 473acc1adf0218a07510a157a6995b61f2591cb9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 10:47:05 +0000 Subject: [PATCH 266/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 0767f9f9c..edbcb6e10 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for ko (add-missing). PR [#15888](https://github.com/fastapi/fastapi/pull/15888) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for es (add-missing). PR [#15880](https://github.com/fastapi/fastapi/pull/15880) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for zh-hant (add-missing). PR [#15889](https://github.com/fastapi/fastapi/pull/15889) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for pt (add-missing). PR [#15883](https://github.com/fastapi/fastapi/pull/15883) by [@tiangolo](https://github.com/tiangolo). From c5ab51d50f576a9e53e0f887d4046033234787cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 14:51:57 +0200 Subject: [PATCH 267/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20ru=20(update-outdated)=20(#15894)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] Co-authored-by: Yurii Motov <109919500+YuriiMotov@users.noreply.github.com> Co-authored-by: Yurii Motov --- docs/ru/docs/_llm-test.md | 4 +- .../docs/advanced/additional-status-codes.md | 1 + .../ru/docs/advanced/advanced-dependencies.md | 4 +- docs/ru/docs/advanced/dataclasses.md | 6 +- docs/ru/docs/advanced/events.md | 54 +++++++-------- docs/ru/docs/advanced/generate-clients.md | 14 ---- docs/ru/docs/advanced/json-base64-bytes.md | 8 +-- docs/ru/docs/advanced/openapi-callbacks.md | 24 +++---- .../advanced/response-change-status-code.md | 4 +- docs/ru/docs/advanced/response-cookies.md | 1 + docs/ru/docs/advanced/response-headers.md | 12 ++-- .../docs/advanced/security/oauth2-scopes.md | 4 +- docs/ru/docs/advanced/settings.md | 8 +-- docs/ru/docs/advanced/stream-data.md | 4 +- docs/ru/docs/advanced/wsgi.md | 4 +- docs/ru/docs/alternatives.md | 4 +- docs/ru/docs/async.md | 10 +-- docs/ru/docs/deployment/cloud.md | 4 +- docs/ru/docs/deployment/concepts.md | 8 +-- docs/ru/docs/deployment/docker.md | 14 ++-- docs/ru/docs/deployment/https.md | 8 +-- docs/ru/docs/deployment/manually.md | 2 +- docs/ru/docs/editor-support.md | 2 +- docs/ru/docs/environment-variables.md | 16 ++--- docs/ru/docs/features.md | 22 +++--- docs/ru/docs/help-fastapi.md | 2 +- docs/ru/docs/how-to/configure-swagger-ui.md | 2 +- .../docs/how-to/custom-request-and-route.md | 12 ++-- docs/ru/docs/how-to/graphql.md | 1 + ...migrate-from-pydantic-v1-to-pydantic-v2.md | 18 +++++ .../docs/how-to/separate-openapi-schemas.md | 2 +- docs/ru/docs/index.md | 14 ++-- docs/ru/docs/project-generation.md | 4 +- docs/ru/docs/python-types.md | 30 ++++---- docs/ru/docs/tutorial/bigger-applications.md | 68 +++++++++---------- docs/ru/docs/tutorial/body-nested-models.md | 10 +-- docs/ru/docs/tutorial/body.md | 2 +- docs/ru/docs/tutorial/debugging.md | 8 +-- .../dependencies/dependencies-with-yield.md | 3 +- docs/ru/docs/tutorial/extra-data-types.md | 24 +++---- docs/ru/docs/tutorial/extra-models.md | 2 +- docs/ru/docs/tutorial/first-steps.md | 24 +++---- docs/ru/docs/tutorial/handling-errors.md | 60 ++++++++-------- docs/ru/docs/tutorial/index.md | 1 + docs/ru/docs/tutorial/metadata.md | 24 +++---- .../tutorial/path-operation-configuration.md | 14 ++-- .../tutorial/query-params-str-validations.md | 34 +++++----- docs/ru/docs/tutorial/query-params.md | 55 +++++++-------- docs/ru/docs/tutorial/request-files.md | 27 ++++---- docs/ru/docs/tutorial/request-forms.md | 1 + docs/ru/docs/tutorial/response-status-code.md | 24 +++---- docs/ru/docs/tutorial/schema-extra-example.md | 10 +-- docs/ru/docs/tutorial/security/first-steps.md | 4 +- .../tutorial/security/get-current-user.md | 4 +- docs/ru/docs/tutorial/security/oauth2-jwt.md | 24 +++---- .../docs/tutorial/security/simple-oauth2.md | 14 ++-- docs/ru/docs/tutorial/sql-databases.md | 6 +- docs/ru/docs/tutorial/static-files.md | 11 ++- docs/ru/docs/tutorial/testing.md | 12 ++-- docs/ru/docs/virtual-environments.md | 2 +- 60 files changed, 406 insertions(+), 389 deletions(-) diff --git a/docs/ru/docs/_llm-test.md b/docs/ru/docs/_llm-test.md index d33e803a0..1b2ee8f18 100644 --- a/docs/ru/docs/_llm-test.md +++ b/docs/ru/docs/_llm-test.md @@ -258,7 +258,7 @@ works(foo="bar") # Đ­Ń‚ĐŸ Ń€Đ°Đ±ĐŸŃ‚Đ°Đ”Ń‚ 🎉 * `bar` ĐșаĐș `str` * `baz` ĐșаĐș `list` -* ĐŁŃ‡Đ”Đ±ĐœĐžĐș — РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń +* ĐŁŃ‡Đ”Đ±ĐœĐžĐș - РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń * Đ Đ°ŃŃˆĐžŃ€Đ”ĐœĐœĐŸĐ” руĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń * Đ”ĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃ ĐżĐŸ SQLModel * Đ”ĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃ API @@ -461,7 +461,7 @@ works(foo="bar") # Đ­Ń‚ĐŸ Ń€Đ°Đ±ĐŸŃ‚Đ°Đ”Ń‚ 🎉 * Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșа * lifespan * Đ±Đ»ĐŸĐșĐžŃ€ĐŸĐČĐșа -* middleware (ĐŸŃ€ĐŸĐŒĐ”Đ¶ŃƒŃ‚ĐŸŃ‡ĐœŃ‹Đč ŃĐ»ĐŸĐč) +* middleware (ĐżŃ€ĐŸĐŒĐ”Đ¶ŃƒŃ‚ĐŸŃ‡ĐœŃ‹Đč ŃĐ»ĐŸĐč) * ĐŒĐŸĐ±ĐžĐ»ŃŒĐœĐŸĐ” ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” * ĐŒĐŸĐŽŃƒĐ»ŃŒ * ĐŒĐŸĐœŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐžĐ” diff --git a/docs/ru/docs/advanced/additional-status-codes.md b/docs/ru/docs/advanced/additional-status-codes.md index aec66a13f..a0d21e445 100644 --- a/docs/ru/docs/advanced/additional-status-codes.md +++ b/docs/ru/docs/advanced/additional-status-codes.md @@ -1,5 +1,6 @@ # Đ”ĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đ” статус-ĐșĐŸĐŽŃ‹ { #additional-status-codes } + ĐŸĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ **FastAPI** Đ±ŃƒĐŽĐ”Ń‚ ĐČĐŸĐ·ĐČращать ĐŸŃ‚ĐČДты, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ `JSONResponse`, ĐżĐŸĐŒĐ”Ń‰Đ°Ń ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒĐŸĐ”, ĐșĐŸŃ‚ĐŸŃ€ĐŸĐ” ĐČы ĐČĐŸĐ·ĐČращаДтД Оз ĐČашДĐč *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*, ĐČĐœŃƒŃ‚Ń€ŃŒ ŃŃ‚ĐŸĐłĐŸ `JSONResponse`. ĐžĐœ Đ±ŃƒĐŽĐ”Ń‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать статус-ĐșĐŸĐŽ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ ОлО Ń‚ĐŸŃ‚, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐČы уĐșажДтД ĐČ ĐČашДĐč *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*. diff --git a/docs/ru/docs/advanced/advanced-dependencies.md b/docs/ru/docs/advanced/advanced-dependencies.md index fb6cb7ca8..0092313b2 100644 --- a/docs/ru/docs/advanced/advanced-dependencies.md +++ b/docs/ru/docs/advanced/advanced-dependencies.md @@ -36,7 +36,7 @@ {* ../../docs_src/dependencies/tutorial011_an_py310.py hl[18] *} -йаĐș ĐŒŃ‹ Â«ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐžĐ·ŃƒĐ”ĐŒÂ» ĐœĐ°ŃˆŃƒ заĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŒ: Ń‚Đ”ĐżĐ”Ń€ŃŒ ĐČĐœŃƒŃ‚Ń€Đž ĐœĐ”Ń‘ Ń…Ń€Đ°ĐœĐžŃ‚ŃŃ "bar" ĐČ Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚Đ” `checker.fixed_content`. +йаĐș ĐŒŃ‹ Â«ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐžĐ·ŃƒĐ”ĐŒÂ» ĐœĐ°ŃˆŃƒ заĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŒ: Ń‚Đ”ĐżĐ”Ń€ŃŒ ĐČĐœŃƒŃ‚Ń€Đž ĐœĐ”Ń‘ Ń…Ń€Đ°ĐœĐžŃ‚ŃŃ `"bar"` ĐČ Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚Đ” `checker.fixed_content`. ## Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒ эĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€ ĐșаĐș заĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŒ { #use-the-instance-as-a-dependency } @@ -48,7 +48,7 @@ checker(q="somequery") ``` -
о пДрДЎаст ĐČĐŸĐ·ĐČŃ€Đ°Ń‰Ń‘ĐœĐœĐŸĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐșаĐș Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž ĐČ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `fixed_content_included` ĐœĐ°ŃˆĐ”Đč *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșу путо*: +
о пДрДЎаст ĐČĐŸĐ·ĐČŃ€Đ°Ń‰Ń‘ĐœĐœĐŸĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐșаĐș Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž ĐČ ĐœĐ°ŃˆŃƒ *Ń„ŃƒĐœĐșцою-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș путо* ĐČ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `fixed_content_included`: {* ../../docs_src/dependencies/tutorial011_an_py310.py hl[22] *} diff --git a/docs/ru/docs/advanced/dataclasses.md b/docs/ru/docs/advanced/dataclasses.md index aa927cef1..5388e9832 100644 --- a/docs/ru/docs/advanced/dataclasses.md +++ b/docs/ru/docs/advanced/dataclasses.md @@ -12,9 +12,9 @@ FastAPI ĐżĐŸŃŃ‚Ń€ĐŸĐ”Đœ ĐżĐŸĐČДрх **Pydantic**, Đž я ĐżĐŸĐșазыĐČал ĐČ Đ˜, ĐșĐŸĐœĐ”Ń‡ĐœĐŸ, ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČаются тД жД ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚Đž: -- ĐČĐ°Đ»ĐžĐŽĐ°Ń†ĐžŃ ĐŽĐ°ĐœĐœŃ‹Ń… -- ŃĐ”Ń€ĐžĐ°Đ»ĐžĐ·Đ°Ń†ĐžŃ ĐŽĐ°ĐœĐœŃ‹Ń… -- ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐžĐ” ĐŽĐ°ĐœĐœŃ‹Ń… Đž т.ĐŽ. +* ĐČĐ°Đ»ĐžĐŽĐ°Ń†ĐžŃ ĐŽĐ°ĐœĐœŃ‹Ń… +* ŃĐ”Ń€ĐžĐ°Đ»ĐžĐ·Đ°Ń†ĐžŃ ĐŽĐ°ĐœĐœŃ‹Ń… +* ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐžĐ” ĐŽĐ°ĐœĐœŃ‹Ń… Đž т.ĐŽ. Đ­Ń‚ĐŸ Ń€Đ°Đ±ĐŸŃ‚Đ°Đ”Ń‚ таĐș жД, ĐșаĐș с Pydantic-ĐŒĐŸĐŽĐ”Đ»ŃĐŒĐž. И ĐœĐ° ŃĐ°ĐŒĐŸĐŒ ЎДлД ĐżĐŸĐŽ ĐșĐ°ĐżĐŸŃ‚ĐŸĐŒ ŃŃ‚ĐŸ ĐŽĐŸŃŃ‚ĐžĐłĐ°Đ”Ń‚ŃŃ Ń‚Đ”ĐŒ жД ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ, с ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ”ĐŒ Pydantic. diff --git a/docs/ru/docs/advanced/events.md b/docs/ru/docs/advanced/events.md index 69ebe4ffc..00319575f 100644 --- a/docs/ru/docs/advanced/events.md +++ b/docs/ru/docs/advanced/events.md @@ -1,30 +1,30 @@ # ĐĄĐŸĐ±Ń‹Ń‚ĐžŃ lifespan { #lifespan-events } -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ Đ»ĐŸĐłĐžĐșу (ĐșĐŸĐŽ), ĐșĐŸŃ‚ĐŸŃ€ŃƒŃŽ ĐœŃƒĐ¶ĐœĐŸ ĐČŃ‹ĐżĐŸĐ»ĐœĐžŃ‚ŃŒ пДрДЎ Ń‚Đ”ĐŒ, ĐșаĐș ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” ĐœĐ°Ń‡ĐœĐ”Ń‚ запусĐșаться. Đ­Ń‚ĐŸ ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚, Ń‡Ń‚ĐŸ ŃŃ‚ĐŸŃ‚ ĐșĐŸĐŽ Đ±ŃƒĐŽĐ”Ń‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”Đœ ĐŸĐŽĐžĐœ раз, пДрДЎ Ń‚Đ”ĐŒ ĐșаĐș ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” ĐœĐ°Ń‡ĐœĐ”Ń‚ ĐżĐŸĐ»ŃƒŃ‡Đ°Ń‚ŃŒ HTTP-Đ·Đ°ĐżŃ€ĐŸŃŃ‹. +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ Đ»ĐŸĐłĐžĐșу (ĐșĐŸĐŽ), ĐșĐŸŃ‚ĐŸŃ€ŃƒŃŽ ĐœŃƒĐ¶ĐœĐŸ ĐČŃ‹ĐżĐŸĐ»ĐœĐžŃ‚ŃŒ пДрДЎ Ń‚Đ”ĐŒ, ĐșаĐș ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” **Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚ŃŃ**. Đ­Ń‚ĐŸ ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚, Ń‡Ń‚ĐŸ ŃŃ‚ĐŸŃ‚ ĐșĐŸĐŽ Đ±ŃƒĐŽĐ”Ń‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”Đœ **ĐŸĐŽĐžĐœ раз**, **пДрДЎ** Ń‚Đ”ĐŒ ĐșаĐș ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” **ĐœĐ°Ń‡ĐœĐ”Ń‚ ĐżĐŸĐ»ŃƒŃ‡Đ°Ń‚ŃŒ HTTP-Đ·Đ°ĐżŃ€ĐŸŃŃ‹**. -ĐĐœĐ°Đ»ĐŸĐłĐžŃ‡ĐœĐŸ, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ Đ»ĐŸĐłĐžĐșу (ĐșĐŸĐŽ), ĐșĐŸŃ‚ĐŸŃ€ŃƒŃŽ ĐœŃƒĐ¶ĐœĐŸ ĐČŃ‹ĐżĐŸĐ»ĐœĐžŃ‚ŃŒ, ĐșĐŸĐłĐŽĐ° ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” заĐČĐ”Ń€ŃˆĐ°Đ”Ń‚ Ń€Đ°Đ±ĐŸŃ‚Ńƒ. В ŃŃ‚ĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” ĐșĐŸĐŽ Đ±ŃƒĐŽĐ”Ń‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”Đœ ĐŸĐŽĐžĐœ раз, ĐżĐŸŃĐ»Đ” ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐž, ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸ, ĐŒĐœĐŸĐłĐžŃ… Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ. +ĐĐœĐ°Đ»ĐŸĐłĐžŃ‡ĐœĐŸ, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ Đ»ĐŸĐłĐžĐșу (ĐșĐŸĐŽ), ĐșĐŸŃ‚ĐŸŃ€ŃƒŃŽ ĐœŃƒĐ¶ĐœĐŸ ĐČŃ‹ĐżĐŸĐ»ĐœĐžŃ‚ŃŒ, ĐșĐŸĐłĐŽĐ° ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” **заĐČĐ”Ń€ŃˆĐ°Đ”Ń‚ Ń€Đ°Đ±ĐŸŃ‚Ńƒ**. В ŃŃ‚ĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” ĐșĐŸĐŽ Đ±ŃƒĐŽĐ”Ń‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”Đœ **ĐŸĐŽĐžĐœ раз**, **ĐżĐŸŃĐ»Đ” ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐž**, ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸ, **ĐŒĐœĐŸĐłĐžŃ… HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ**. -ĐŸĐŸŃĐșĐŸĐ»ŃŒĐșу ŃŃ‚ĐŸŃ‚ ĐșĐŸĐŽ ĐČŃ‹ĐżĐŸĐ»ĐœŃĐ”Ń‚ŃŃ ĐŽĐŸ Ń‚ĐŸĐłĐŸ, ĐșаĐș ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” ĐœĐ°Ń‡ĐžĐœĐ°Đ”Ń‚ ĐżŃ€ĐžĐœĐžĐŒĐ°Ń‚ŃŒ Đ·Đ°ĐżŃ€ĐŸŃŃ‹, Đž ŃŃ€Đ°Đ·Ńƒ ĐżĐŸŃĐ»Đ” Ń‚ĐŸĐłĐŸ, ĐșаĐș ĐŸĐœĐŸ заĐșĐ°ĐœŃ‡ĐžĐČаДт ох ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČать, ĐŸĐœ ĐŸŃ…ĐČатыĐČаДт ĐČĐ”ŃŃŒ lifespan (Đ¶ĐžĐ·ĐœĐ”ĐœĐœŃ‹Đč цоĐșĐ») ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ (ŃĐ»ĐŸĐČĐŸ «lifespan» ŃŃ‚Đ°ĐœĐ”Ń‚ ĐČĐ°Đ¶ĐœŃ‹ĐŒ чДрДз сДĐșŃƒĐœĐŽŃƒ 😉). +ĐŸĐŸŃĐșĐŸĐ»ŃŒĐșу ŃŃ‚ĐŸŃ‚ ĐșĐŸĐŽ ĐČŃ‹ĐżĐŸĐ»ĐœŃĐ”Ń‚ŃŃ ĐŽĐŸ Ń‚ĐŸĐłĐŸ, ĐșаĐș ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” **ĐœĐ°Ń‡ĐžĐœĐ°Đ”Ń‚** ĐżŃ€ĐžĐœĐžĐŒĐ°Ń‚ŃŒ HTTP-Đ·Đ°ĐżŃ€ĐŸŃŃ‹, Đž ŃŃ€Đ°Đ·Ńƒ ĐżĐŸŃĐ»Đ” Ń‚ĐŸĐłĐŸ, ĐșаĐș ĐŸĐœĐŸ **заĐșĐ°ĐœŃ‡ĐžĐČаДт** ох ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČать, ĐŸĐœ ĐŸŃ…ĐČатыĐČаДт ĐČĐ”ŃŃŒ **lifespan** (Đ¶ĐžĐ·ĐœĐ”ĐœĐœŃ‹Đč цоĐșĐ») ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ (ŃĐ»ĐŸĐČĐŸ «lifespan» ŃŃ‚Đ°ĐœĐ”Ń‚ ĐČĐ°Đ¶ĐœŃ‹ĐŒ чДрДз сДĐșŃƒĐœĐŽŃƒ 😉). -Đ­Ń‚ĐŸ ĐŒĐŸĐ¶Đ”Ń‚ Đ±Ń‹Ń‚ŃŒ ĐŸŃ‡Đ”ĐœŃŒ ĐżĐŸĐ»Đ”Đ·ĐœĐŸ ĐŽĐ»Ń ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐž Ń€Đ”ŃŃƒŃ€ŃĐŸĐČ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐœŃƒĐ¶ĐœŃ‹ ĐŽĐ»Ń ĐČŃĐ”ĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” Ń€Đ°Đ·ĐŽĐ”Đ»ŃŃŽŃ‚ŃŃ ĐŒĐ”Đ¶ĐŽŃƒ Đ·Đ°ĐżŃ€ĐŸŃĐ°ĐŒĐž Đž/ОлО ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐœŃƒĐ¶ĐœĐŸ Đ·Đ°Ń‚Đ”ĐŒ ĐŸŃ‡ĐžŃŃ‚ĐžŃ‚ŃŒ. ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, пул ĐżĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč Đș базД ĐŽĐ°ĐœĐœŃ‹Ń… ОлО Đ·Đ°ĐłŃ€ŃƒĐ·Đșа ĐŸĐ±Ń‰Đ”Đč ĐŒĐŸĐŽĐ”Đ»Đž ĐœĐ°ŃˆĐžĐœĐœĐŸĐłĐŸ ĐŸĐ±ŃƒŃ‡Đ”ĐœĐžŃ. +Đ­Ń‚ĐŸ ĐŒĐŸĐ¶Đ”Ń‚ Đ±Ń‹Ń‚ŃŒ ĐŸŃ‡Đ”ĐœŃŒ ĐżĐŸĐ»Đ”Đ·ĐœĐŸ ĐŽĐ»Ń ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐž **Ń€Đ”ŃŃƒŃ€ŃĐŸĐČ**, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐœŃƒĐ¶ĐœŃ‹ ĐŽĐ»Ń ĐČŃĐ”ĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” **Ń€Đ°Đ·ĐŽĐ”Đ»ŃŃŽŃ‚ŃŃ** ĐŒĐ”Đ¶ĐŽŃƒ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°ĐŒĐž Đž/ОлО ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐœŃƒĐ¶ĐœĐŸ Đ·Đ°Ń‚Đ”ĐŒ **ĐŸŃ‡ĐžŃŃ‚ĐžŃ‚ŃŒ**. ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, пул ĐżĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč Đș базД ĐŽĐ°ĐœĐœŃ‹Ń… ОлО Đ·Đ°ĐłŃ€ŃƒĐ·Đșа ĐŸĐ±Ń‰Đ”Đč ĐŒĐŸĐŽĐ”Đ»Đž ĐœĐ°ŃˆĐžĐœĐœĐŸĐłĐŸ ĐŸĐ±ŃƒŃ‡Đ”ĐœĐžŃ. ## Đ’Đ°Ń€ĐžĐ°ĐœŃ‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžŃ { #use-case } -ĐĐ°Ń‡ĐœĐ”ĐŒ с ĐżŃ€ĐžĐŒĐ”Ń€Đ° ĐČĐ°Ń€ĐžĐ°ĐœŃ‚Đ° ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžŃ, а Đ·Đ°Ń‚Đ”ĐŒ ĐżĐŸŃĐŒĐŸŃ‚Ń€ĐžĐŒ, ĐșаĐș ŃŃ‚ĐŸ Ń€Đ”ŃˆĐžŃ‚ŃŒ. +ĐĐ°Ń‡ĐœĐ”ĐŒ с ĐżŃ€ĐžĐŒĐ”Ń€Đ° **ĐČĐ°Ń€ĐžĐ°ĐœŃ‚Đ° ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžŃ**, а Đ·Đ°Ń‚Đ”ĐŒ ĐżĐŸŃĐŒĐŸŃ‚Ń€ĐžĐŒ, ĐșаĐș ŃŃ‚ĐŸ Ń€Đ”ŃˆĐžŃ‚ŃŒ. -ĐŸŃ€Đ”ĐŽŃŃ‚Đ°ĐČĐžĐŒ, Ń‡Ń‚ĐŸ у ĐČас Đ”ŃŃ‚ŃŒ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ ĐŒĐŸĐŽĐ”Đ»Đ”Đč ĐœĐ°ŃˆĐžĐœĐœĐŸĐłĐŸ ĐŸĐ±ŃƒŃ‡Đ”ĐœĐžŃ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐŽĐ»Ń ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐž Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ. đŸ€– +ĐŸŃ€Đ”ĐŽŃŃ‚Đ°ĐČĐžĐŒ, Ń‡Ń‚ĐŸ у ĐČас Đ”ŃŃ‚ŃŒ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ **ĐŒĐŸĐŽĐ”Đ»Đ”Đč ĐœĐ°ŃˆĐžĐœĐœĐŸĐłĐŸ ĐŸĐ±ŃƒŃ‡Đ”ĐœĐžŃ**, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐŽĐ»Ń ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐž HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ. đŸ€– -Это жД ĐŒĐŸĐŽĐ”Đ»Đž Ń€Đ°Đ·ĐŽĐ”Đ»ŃŃŽŃ‚ŃŃ ĐŒĐ”Đ¶ĐŽŃƒ Đ·Đ°ĐżŃ€ĐŸŃĐ°ĐŒĐž, Ń‚ĐŸ Đ”ŃŃ‚ŃŒ ŃŃ‚ĐŸ ĐœĐ” ĐŸĐŽĐœĐ° ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐœĐ° Đ·Đ°ĐżŃ€ĐŸŃ, ĐœĐ” ĐŸĐŽĐœĐ° ĐœĐ° ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń Đž т.Đż. +Это жД ĐŒĐŸĐŽĐ”Đ»Đž Ń€Đ°Đ·ĐŽĐ”Đ»ŃŃŽŃ‚ŃŃ ĐŒĐ”Đ¶ĐŽŃƒ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°ĐŒĐž, Ń‚ĐŸ Đ”ŃŃ‚ŃŒ ŃŃ‚ĐŸ ĐœĐ” ĐŸĐŽĐœĐ° ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐœĐ° HTTP-Đ·Đ°ĐżŃ€ĐŸŃ, ĐœĐ” ĐŸĐŽĐœĐ° ĐœĐ° ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń Đž т.Đż. -ĐŸŃ€Đ”ĐŽŃŃ‚Đ°ĐČĐžĐŒ, Ń‡Ń‚ĐŸ Đ·Đ°ĐłŃ€ŃƒĐ·Đșа ĐŒĐŸĐŽĐ”Đ»Đž ĐŒĐŸĐ¶Đ”Ń‚ Đ·Đ°ĐœĐžĐŒĐ°Ń‚ŃŒ ĐŽĐŸĐČĐŸĐ»ŃŒĐœĐŸ ĐŒĐœĐŸĐłĐŸ ĐČŃ€Đ”ĐŒĐ”ĐœĐž, ĐżĐŸŃ‚ĐŸĐŒŃƒ Ń‡Ń‚ĐŸ Đ”Đč ĐœŃƒĐ¶ĐœĐŸ ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Ń‚ŃŒ ĐŒĐœĐŸĐłĐŸ ĐŽĐ°ĐœĐœŃ‹Ń… с ЎОсĐșа. ĐŸĐŸŃŃ‚ĐŸĐŒŃƒ ĐČы ĐœĐ” Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐŽĐ”Đ»Đ°Ń‚ŃŒ ŃŃ‚ĐŸ ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ Đ·Đ°ĐżŃ€ĐŸŃĐ°. +ĐŸŃ€Đ”ĐŽŃŃ‚Đ°ĐČĐžĐŒ, Ń‡Ń‚ĐŸ Đ·Đ°ĐłŃ€ŃƒĐ·Đșа ĐŒĐŸĐŽĐ”Đ»Đž ĐŒĐŸĐ¶Đ”Ń‚ **Đ·Đ°ĐœĐžĐŒĐ°Ń‚ŃŒ ĐŽĐŸĐČĐŸĐ»ŃŒĐœĐŸ ĐŒĐœĐŸĐłĐŸ ĐČŃ€Đ”ĐŒĐ”ĐœĐž**, ĐżĐŸŃ‚ĐŸĐŒŃƒ Ń‡Ń‚ĐŸ Đ”Đč ĐœŃƒĐ¶ĐœĐŸ ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Ń‚ŃŒ ĐŒĐœĐŸĐłĐŸ **ĐŽĐ°ĐœĐœŃ‹Ń… с ЎОсĐșа**. ĐŸĐŸŃŃ‚ĐŸĐŒŃƒ ĐČы ĐœĐ” Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐŽĐ”Đ»Đ°Ń‚ŃŒ ŃŃ‚ĐŸ ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°. -Вы ĐŒĐŸĐłĐ»Đž бы Đ·Đ°ĐłŃ€ŃƒĐ·ĐžŃ‚ŃŒ Дё ĐœĐ° ĐČĐ”Ń€Ń…ĐœĐ”ĐŒ ŃƒŃ€ĐŸĐČĐœĐ” ĐŒĐŸĐŽŃƒĐ»Ń/фаĐčла, ĐœĐŸ ŃŃ‚ĐŸ ĐŸĐ·ĐœĐ°Ń‡Đ°Đ»ĐŸ бы, Ń‡Ń‚ĐŸ ĐŒĐŸĐŽĐ”Đ»ŃŒ Đ·Đ°ĐłŃ€ŃƒĐ¶Đ°Đ”Ń‚ŃŃ ЎажД ДслО ĐČы ĐżŃ€ĐŸŃŃ‚ĐŸ запусĐșаДтД ĐżŃ€ĐŸŃŃ‚ĐŸĐč аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐžĐč тДст; Ń‚ĐŸĐłĐŽĐ° ŃŃ‚ĐŸŃ‚ тДст Đ±ŃƒĐŽĐ”Ń‚ ĐŒĐ”ĐŽĐ»Đ”ĐœĐœŃ‹ĐŒ, таĐș ĐșаĐș Đ”ĐŒŃƒ ĐżŃ€ĐžĐŽĐ”Ń‚ŃŃ Đ¶ĐŽĐ°Ń‚ŃŒ Đ·Đ°ĐłŃ€ŃƒĐ·ĐșĐž ĐŒĐŸĐŽĐ”Đ»Đž пДрДЎ запусĐșĐŸĐŒ ĐœĐ”Đ·Đ°ĐČĐžŃĐžĐŒĐŸĐč часто ĐșĐŸĐŽĐ°. +Вы ĐŒĐŸĐłĐ»Đž бы Đ·Đ°ĐłŃ€ŃƒĐ·ĐžŃ‚ŃŒ Дё ĐœĐ° ĐČĐ”Ń€Ń…ĐœĐ”ĐŒ ŃƒŃ€ĐŸĐČĐœĐ” ĐŒĐŸĐŽŃƒĐ»Ń/фаĐčла, ĐœĐŸ ŃŃ‚ĐŸ ĐŸĐ·ĐœĐ°Ń‡Đ°Đ»ĐŸ бы, Ń‡Ń‚ĐŸ ĐŒĐŸĐŽĐ”Đ»ŃŒ Đ±ŃƒĐŽĐ”Ń‚ **Đ·Đ°ĐłŃ€ŃƒĐ¶Đ°Ń‚ŃŒŃŃ** ЎажД ДслО ĐČы ĐżŃ€ĐŸŃŃ‚ĐŸ запусĐșаДтД ĐżŃ€ĐŸŃŃ‚ĐŸĐč аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐžĐč тДст; Ń‚ĐŸĐłĐŽĐ° ŃŃ‚ĐŸŃ‚ тДст Đ±ŃƒĐŽĐ”Ń‚ **ĐŒĐ”ĐŽĐ»Đ”ĐœĐœŃ‹ĐŒ**, таĐș ĐșаĐș Đ”ĐŒŃƒ ĐżŃ€ĐžĐŽĐ”Ń‚ŃŃ Đ¶ĐŽĐ°Ń‚ŃŒ Đ·Đ°ĐłŃ€ŃƒĐ·ĐșĐž ĐŒĐŸĐŽĐ”Đ»Đž пДрДЎ запусĐșĐŸĐŒ ĐœĐ”Đ·Đ°ĐČĐžŃĐžĐŒĐŸĐč часто ĐșĐŸĐŽĐ°. -Đ˜ĐŒĐ”ĐœĐœĐŸ ŃŃ‚ĐŸ ĐŒŃ‹ Đž Ń€Đ”ŃˆĐžĐŒ: ЎаĐČаĐčтД Đ·Đ°ĐłŃ€ŃƒĐ¶Đ°Ń‚ŃŒ ĐŒĐŸĐŽĐ”Đ»ŃŒ пДрДЎ Ń‚Đ”ĐŒ, ĐșаĐș ĐœĐ°Ń‡ĐœŃ‘Ń‚ŃŃ ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Đșа Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ, ĐœĐŸ Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ пДрДЎ Ń‚Đ”ĐŒ, ĐșаĐș ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” ĐœĐ°Ń‡ĐœĐ”Ń‚ ĐżŃ€ĐžĐœĐžĐŒĐ°Ń‚ŃŒ Đ·Đ°ĐżŃ€ĐŸŃŃ‹, а ĐœĐ” ĐČĐŸ ĐČŃ€Đ”ĐŒŃ Đ·Đ°ĐłŃ€ŃƒĐ·ĐșĐž ĐșĐŸĐŽĐ°. +Đ˜ĐŒĐ”ĐœĐœĐŸ ŃŃ‚ĐŸ ĐŒŃ‹ Đž Ń€Đ”ŃˆĐžĐŒ: ЎаĐČаĐčтД Đ·Đ°ĐłŃ€ŃƒĐ¶Đ°Ń‚ŃŒ ĐŒĐŸĐŽĐ”Đ»ŃŒ пДрДЎ Ń‚Đ”ĐŒ, ĐșаĐș ĐœĐ°Ń‡ĐœŃ‘Ń‚ŃŃ ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Đșа HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ, ĐœĐŸ Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ пДрДЎ Ń‚Đ”ĐŒ, ĐșаĐș ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” ĐœĐ°Ń‡ĐœĐ”Ń‚ ĐżŃ€ĐžĐœĐžĐŒĐ°Ń‚ŃŒ HTTP-Đ·Đ°ĐżŃ€ĐŸŃŃ‹, а ĐœĐ” ĐČĐŸ ĐČŃ€Đ”ĐŒŃ Đ·Đ°ĐłŃ€ŃƒĐ·ĐșĐž ĐșĐŸĐŽĐ°. ## Lifespan { #lifespan } -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ Đ»ĐŸĐłĐžĐșу ĐŽĐ»Ń startup Đž shutdown, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `lifespan` ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ `FastAPI` Đž Â«ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста» (чДрДз сДĐșŃƒĐœĐŽŃƒ ĐżĐŸĐșажу Ń‡Ń‚ĐŸ ŃŃ‚ĐŸ). +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ Đ»ĐŸĐłĐžĐșу ĐŽĐ»Ń *startup* Đž *shutdown*, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `lifespan` ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ `FastAPI` Đž Â«ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста» (чДрДз сДĐșŃƒĐœĐŽŃƒ ĐżĐŸĐșажу Ń‡Ń‚ĐŸ ŃŃ‚ĐŸ). ĐĐ°Ń‡ĐœĐ”ĐŒ с ĐżŃ€ĐžĐŒĐ”Ń€Đ°, а Đ·Đ°Ń‚Đ”ĐŒ Ń€Đ°Đ·Đ±Đ”Ń€Ń‘ĐŒ Đ”ĐłĐŸ ĐżĐŸĐŽŃ€ĐŸĐ±ĐœĐ”Đ”. @@ -32,13 +32,13 @@ {* ../../docs_src/events/tutorial003_py310.py hl[16,19] *} -Đ—ĐŽĐ”ŃŃŒ ĐŒŃ‹ ŃĐžĐŒŃƒĐ»ĐžŃ€ŃƒĐ”ĐŒ ĐŽĐŸŃ€ĐŸĐłŃƒŃŽ ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃŽ startup ĐżĐŸ Đ·Đ°ĐłŃ€ŃƒĐ·ĐșĐ” ĐŒĐŸĐŽĐ”Đ»Đž, ĐżĐŸĐŒĐ”Ń‰Đ°Ń (фоĐșтоĐČĐœŃƒŃŽ) Ń„ŃƒĐœĐșцою ĐŒĐŸĐŽĐ”Đ»Đž ĐČ ŃĐ»ĐŸĐČарь с ĐŒĐŸĐŽĐ”Đ»ŃĐŒĐž ĐœĐ°ŃˆĐžĐœĐœĐŸĐłĐŸ ĐŸĐ±ŃƒŃ‡Đ”ĐœĐžŃ ĐŽĐŸ `yield`. Đ­Ń‚ĐŸŃ‚ ĐșĐŸĐŽ Đ±ŃƒĐŽĐ”Ń‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”Đœ ĐŽĐŸ Ń‚ĐŸĐłĐŸ, ĐșаĐș ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” ĐœĐ°Ń‡ĐœĐ”Ń‚ ĐżŃ€ĐžĐœĐžĐŒĐ°Ń‚ŃŒ Đ·Đ°ĐżŃ€ĐŸŃŃ‹, ĐČĐŸ ĐČŃ€Đ”ĐŒŃ startup. +Đ—ĐŽĐ”ŃŃŒ ĐŒŃ‹ ŃĐžĐŒŃƒĐ»ĐžŃ€ŃƒĐ”ĐŒ ĐŽĐŸŃ€ĐŸĐłŃƒŃŽ ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃŽ *startup* ĐżĐŸ Đ·Đ°ĐłŃ€ŃƒĐ·ĐșĐ” ĐŒĐŸĐŽĐ”Đ»Đž, ĐżĐŸĐŒĐ”Ń‰Đ°Ń (фоĐșтоĐČĐœŃƒŃŽ) Ń„ŃƒĐœĐșцою ĐŒĐŸĐŽĐ”Đ»Đž ĐČ ŃĐ»ĐŸĐČарь с ĐŒĐŸĐŽĐ”Đ»ŃĐŒĐž ĐœĐ°ŃˆĐžĐœĐœĐŸĐłĐŸ ĐŸĐ±ŃƒŃ‡Đ”ĐœĐžŃ ĐŽĐŸ `yield`. Đ­Ń‚ĐŸŃ‚ ĐșĐŸĐŽ Đ±ŃƒĐŽĐ”Ń‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”Đœ **ĐŽĐŸ** Ń‚ĐŸĐłĐŸ, ĐșаĐș ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” **ĐœĐ°Ń‡ĐœĐ”Ń‚ ĐżŃ€ĐžĐœĐžĐŒĐ°Ń‚ŃŒ HTTP-Đ·Đ°ĐżŃ€ĐŸŃŃ‹**, ĐČĐŸ ĐČŃ€Đ”ĐŒŃ *startup*. -А Đ·Đ°Ń‚Đ”ĐŒ ŃŃ€Đ°Đ·Ńƒ ĐżĐŸŃĐ»Đ” `yield` ĐŒŃ‹ ĐČŃ‹ĐłŃ€ŃƒĐ¶Đ°Đ”ĐŒ ĐŒĐŸĐŽĐ”Đ»ŃŒ. Đ­Ń‚ĐŸŃ‚ ĐșĐŸĐŽ Đ±ŃƒĐŽĐ”Ń‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”Đœ ĐżĐŸŃĐ»Đ” Ń‚ĐŸĐłĐŸ, ĐșаĐș ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” заĐșĐŸĐœŃ‡ĐžŃ‚ ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČать Đ·Đ°ĐżŃ€ĐŸŃŃ‹, ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ пДрДЎ shutdown. Đ­Ń‚ĐŸ ĐŒĐŸĐ¶Đ”Ń‚, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐŸŃĐČĐŸĐ±ĐŸĐŽĐžŃ‚ŃŒ Ń€Đ”ŃŃƒŃ€ŃŃ‹, таĐșОД ĐșаĐș ĐżĐ°ĐŒŃŃ‚ŃŒ ОлО GPU. +А Đ·Đ°Ń‚Đ”ĐŒ ŃŃ€Đ°Đ·Ńƒ ĐżĐŸŃĐ»Đ” `yield` ĐŒŃ‹ ĐČŃ‹ĐłŃ€ŃƒĐ¶Đ°Đ”ĐŒ ĐŒĐŸĐŽĐ”Đ»ŃŒ. Đ­Ń‚ĐŸŃ‚ ĐșĐŸĐŽ Đ±ŃƒĐŽĐ”Ń‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”Đœ **ĐżĐŸŃĐ»Đ”** Ń‚ĐŸĐłĐŸ, ĐșаĐș ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” **заĐșĐŸĐœŃ‡ĐžŃ‚ ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČать HTTP-Đ·Đ°ĐżŃ€ĐŸŃŃ‹**, ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ пДрДЎ *shutdown*. Đ­Ń‚ĐŸ ĐŒĐŸĐ¶Đ”Ń‚, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐŸŃĐČĐŸĐ±ĐŸĐŽĐžŃ‚ŃŒ Ń€Đ”ŃŃƒŃ€ŃŃ‹, таĐșОД ĐșаĐș ĐżĐ°ĐŒŃŃ‚ŃŒ ОлО GPU. /// tip | ĐĄĐŸĐČДт -`shutdown` ĐżŃ€ĐŸĐžĐ·ĐŸĐčЮёт, ĐșĐŸĐłĐŽĐ° ĐČы ĐŸŃŃ‚Đ°ĐœĐ°ĐČлОĐČаДтД ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”. +`shutdown` ĐżŃ€ĐŸĐžĐ·ĐŸĐčЮёт, ĐșĐŸĐłĐŽĐ° ĐČы **ĐŸŃŃ‚Đ°ĐœĐ°ĐČлОĐČаДтД** ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”. Đ’ĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸ, ĐČĐ°ĐŒ ĐœŃƒĐ¶ĐœĐŸ Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚ŃŒ ĐœĐŸĐČую ĐČДрсОю, ОлО ĐČы ĐżŃ€ĐŸŃŃ‚ĐŸ ŃƒŃŃ‚Đ°Đ»Đž ĐŸŃ‚ ĐœĐ”ĐłĐŸ. đŸ€· @@ -50,26 +50,26 @@ {* ../../docs_src/events/tutorial003_py310.py hl[14:19] *} -ĐŸĐ”Ń€ĐČая часть Ń„ŃƒĐœĐșцоо, ĐŽĐŸ `yield`, Đ±ŃƒĐŽĐ”Ń‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœĐ° ĐŽĐŸ запусĐșа ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ. +ĐŸĐ”Ń€ĐČая часть Ń„ŃƒĐœĐșцоо, ĐŽĐŸ `yield`, Đ±ŃƒĐŽĐ”Ń‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœĐ° **ĐŽĐŸ** запусĐșа ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ. -А часть ĐżĐŸŃĐ»Đ” `yield` Đ±ŃƒĐŽĐ”Ń‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœĐ° ĐżĐŸŃĐ»Đ” заĐČĐ”Ń€ŃˆĐ”ĐœĐžŃ Ń€Đ°Đ±ĐŸŃ‚Ń‹ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ. +А часть ĐżĐŸŃĐ»Đ” `yield` Đ±ŃƒĐŽĐ”Ń‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœĐ° **ĐżĐŸŃĐ»Đ”** заĐČĐ”Ń€ŃˆĐ”ĐœĐžŃ Ń€Đ°Đ±ĐŸŃ‚Ń‹ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ. ### ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœŃ‹Đč ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста { #async-context-manager } ЕслО ĐżŃ€ĐžŃĐŒĐŸŃ‚Ń€Đ”Ń‚ŃŒŃŃ, Ń„ŃƒĐœĐșцоя ĐŽĐ”ĐșĐŸŃ€ĐžŃ€ĐŸĐČĐ°ĐœĐ° `@asynccontextmanager`. -Đ­Ń‚ĐŸ прДĐČращаДт Ń„ŃƒĐœĐșцою ĐČ Â«Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœŃ‹Đč ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста». +Đ­Ń‚ĐŸ прДĐČращаДт Ń„ŃƒĐœĐșцою ĐČ Â«**Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœŃ‹Đč ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста**». {* ../../docs_src/events/tutorial003_py310.py hl[1,13] *} -ĐœĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста ĐČ Python — ŃŃ‚ĐŸ Ń‚ĐŸ, Ń‡Ń‚ĐŸ ĐŒĐŸĐ¶ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐČ ĐŸĐżĐ”Ń€Đ°Ń‚ĐŸŃ€Đ” `with`. ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, `open()` ĐŒĐŸĐ¶ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐșаĐș ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста: +**ĐœĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста** ĐČ Python — ŃŃ‚ĐŸ Ń‚ĐŸ, Ń‡Ń‚ĐŸ ĐŒĐŸĐ¶ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐČ ĐŸĐżĐ”Ń€Đ°Ń‚ĐŸŃ€Đ” `with`. ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, `open()` ĐŒĐŸĐ¶ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐșаĐș ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста: ```Python with open("file.txt") as file: file.read() ``` -В ĐżĐŸŃĐ»Đ”ĐŽĐœĐžŃ… ĐČĐ”Ń€ŃĐžŃŃ… Python Đ”ŃŃ‚ŃŒ таĐșжД Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœŃ‹Đč ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста. Đ•ĐłĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃŽŃ‚ с `async with`: +В ĐżĐŸŃĐ»Đ”ĐŽĐœĐžŃ… ĐČĐ”Ń€ŃĐžŃŃ… Python Đ”ŃŃ‚ŃŒ таĐșжД **Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœŃ‹Đč ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста**. Đ•ĐłĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃŽŃ‚ с `async with`: ```Python async with lifespan(app): @@ -80,7 +80,7 @@ async with lifespan(app): В ĐœĐ°ŃˆĐ”ĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ” ĐČŃ‹ŃˆĐ” ĐŒŃ‹ ĐœĐ” ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒ Đ”ĐłĐŸ ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ, а ĐżĐ”Ń€Đ”ĐŽĐ°Ń‘ĐŒ Đ”ĐłĐŸ ĐČ FastAPI, Ń‡Ń‚ĐŸĐ±Ń‹ ĐŸĐœ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČал Đ”ĐłĐŸ ŃĐ°ĐŒ. -ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `lifespan` ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ `FastAPI` ĐżŃ€ĐžĐœĐžĐŒĐ°Đ”Ń‚ Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœŃ‹Đč ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста, ĐżĐŸŃŃ‚ĐŸĐŒŃƒ ĐŒŃ‹ ĐŒĐŸĐ¶Đ”ĐŒ ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ Đ”ĐŒŃƒ ĐœĐ°Ńˆ ĐœĐŸĐČыĐč Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœŃ‹Đč ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста `lifespan`. +ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `lifespan` ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ `FastAPI` ĐżŃ€ĐžĐœĐžĐŒĐ°Đ”Ń‚ **Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœŃ‹Đč ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста**, ĐżĐŸŃŃ‚ĐŸĐŒŃƒ ĐŒŃ‹ ĐŒĐŸĐ¶Đ”ĐŒ ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ Đ”ĐŒŃƒ ĐœĐ°Ńˆ ĐœĐŸĐČыĐč Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœŃ‹Đč ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐșĐŸĐœŃ‚Đ”Đșста `lifespan`. {* ../../docs_src/events/tutorial003_py310.py hl[22] *} @@ -88,13 +88,13 @@ async with lifespan(app): /// warning | ĐŸŃ€Đ”ĐŽŃƒĐżŃ€Đ”Đ¶ĐŽĐ”ĐœĐžĐ” -Đ Đ”ĐșĐŸĐŒĐ”ĐœĐŽŃƒĐ”ĐŒŃ‹Đč ŃĐżĐŸŃĐŸĐ± ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČать startup Đž shutdown — ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `lifespan` ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ `FastAPI`, ĐșаĐș ĐŸĐżĐžŃĐ°ĐœĐŸ ĐČŃ‹ŃˆĐ”. ЕслО ĐČы уĐșажДтД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `lifespan`, ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž ŃĐŸĐ±Ń‹Ń‚ĐžĐč `startup` Đž `shutdown` Đ±ĐŸĐ»ŃŒŃˆĐ” ĐČызыĐČаться ĐœĐ” Đ±ŃƒĐŽŃƒŃ‚. Đ›ĐžĐ±ĐŸ ĐČсё чДрДз `lifespan`, Đ»ĐžĐ±ĐŸ ĐČсё чДрДз ŃĐŸĐ±Ń‹Ń‚ĐžŃ — ĐœĐ” ĐŸĐŽĐœĐŸĐČŃ€Đ”ĐŒĐ”ĐœĐœĐŸ. +Đ Đ”ĐșĐŸĐŒĐ”ĐœĐŽŃƒĐ”ĐŒŃ‹Đč ŃĐżĐŸŃĐŸĐ± ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČать *startup* Đž *shutdown* — ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `lifespan` ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ `FastAPI`, ĐșаĐș ĐŸĐżĐžŃĐ°ĐœĐŸ ĐČŃ‹ŃˆĐ”. ЕслО ĐČы уĐșажДтД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `lifespan`, ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž ŃĐŸĐ±Ń‹Ń‚ĐžĐč `startup` Đž `shutdown` Đ±ĐŸĐ»ŃŒŃˆĐ” ĐČызыĐČаться ĐœĐ” Đ±ŃƒĐŽŃƒŃ‚. Đ›ĐžĐ±ĐŸ ĐČсё чДрДз `lifespan`, Đ»ĐžĐ±ĐŸ ĐČсё чДрДз ŃĐŸĐ±Ń‹Ń‚ĐžŃ — ĐœĐ” ĐŸĐŽĐœĐŸĐČŃ€Đ”ĐŒĐ”ĐœĐœĐŸ. Эту часть, сĐșĐŸŃ€Đ”Đ” ĐČŃĐ”ĐłĐŸ, ĐŒĐŸĐ¶ĐœĐŸ ĐżŃ€ĐŸĐżŃƒŃŃ‚ĐžŃ‚ŃŒ. /// -Есть Đ°Đ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČĐœŃ‹Đč ŃĐżĐŸŃĐŸĐ± ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ Đ»ĐŸĐłĐžĐșу, ĐșĐŸŃ‚ĐŸŃ€ŃƒŃŽ ĐœŃƒĐ¶ĐœĐŸ ĐČŃ‹ĐżĐŸĐ»ĐœĐžŃ‚ŃŒ ĐČĐŸ ĐČŃ€Đ”ĐŒŃ startup Đž ĐČĐŸ ĐČŃ€Đ”ĐŒŃ shutdown. +Есть Đ°Đ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČĐœŃ‹Đč ŃĐżĐŸŃĐŸĐ± ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ Đ»ĐŸĐłĐžĐșу, ĐșĐŸŃ‚ĐŸŃ€ŃƒŃŽ ĐœŃƒĐ¶ĐœĐŸ ĐČŃ‹ĐżĐŸĐ»ĐœĐžŃ‚ŃŒ ĐČĐŸ ĐČŃ€Đ”ĐŒŃ *startup* Đž ĐČĐŸ ĐČŃ€Đ”ĐŒŃ *shutdown*. Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž ŃĐŸĐ±Ń‹Ń‚ĐžĐč (Ń„ŃƒĐœĐșцоо), ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐœŃƒĐ¶ĐœĐŸ ĐČŃ‹ĐżĐŸĐ»ĐœĐžŃ‚ŃŒ ĐŽĐŸ старта ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ ОлО про Đ”ĐłĐŸ заĐČĐ”Ń€ŃˆĐ”ĐœĐžĐž. @@ -110,7 +110,7 @@ async with lifespan(app): Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽĐŸĐ±Đ°ĐČоть Đ±ĐŸĐ»Đ”Đ” ĐŸĐŽĐœĐŸĐłĐŸ ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа ŃĐŸĐ±Ń‹Ń‚ĐžŃ. -И ĐČашД ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” ĐœĐ” ĐœĐ°Ń‡ĐœĐ”Ń‚ ĐżŃ€ĐžĐœĐžĐŒĐ°Ń‚ŃŒ Đ·Đ°ĐżŃ€ĐŸŃŃ‹, ĐżĐŸĐșа ĐČсД ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž ŃĐŸĐ±Ń‹Ń‚ĐžŃ `startup` ĐœĐ” заĐČĐ”Ń€ŃˆĐ°Ń‚ŃŃ. +И ĐČашД ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” ĐœĐ” ĐœĐ°Ń‡ĐœĐ”Ń‚ ĐżŃ€ĐžĐœĐžĐŒĐ°Ń‚ŃŒ HTTP-Đ·Đ°ĐżŃ€ĐŸŃŃ‹, ĐżĐŸĐșа ĐČсД ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž ŃĐŸĐ±Ń‹Ń‚ĐžŃ `startup` ĐœĐ” заĐČĐ”Ń€ŃˆĐ°Ń‚ŃŃ. ### ĐĄĐŸĐ±Ń‹Ń‚ĐžĐ” `shutdown` { #shutdown-event } @@ -140,7 +140,7 @@ async with lifespan(app): ### `startup` Đž `shutdown` ĐČĐŒĐ”ŃŃ‚Đ” { #startup-and-shutdown-together } -ĐĄ ĐČŃ‹ŃĐŸĐșĐŸĐč ĐČĐ”Ń€ĐŸŃŃ‚ĐœĐŸŃŃ‚ŃŒŃŽ Đ»ĐŸĐłĐžĐșа ĐŽĐ»Ń ĐČĐ°ŃˆĐ”ĐłĐŸ startup Đž shutdown сĐČŃĐ·Đ°ĐœĐ°: ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń…ĐŸŃ‚Đ”Ń‚ŃŒ Ń‡Ń‚ĐŸ-Ń‚ĐŸ Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚ŃŒ, а Đ·Đ°Ń‚Đ”ĐŒ заĐČĐ”Ń€ŃˆĐžŃ‚ŃŒ, ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ Ń€Đ”ŃŃƒŃ€Ń, а Đ·Đ°Ń‚Đ”ĐŒ ĐŸŃĐČĐŸĐ±ĐŸĐŽĐžŃ‚ŃŒ Đ”ĐłĐŸ Đž т.ĐŽ. +ĐĄ ĐČŃ‹ŃĐŸĐșĐŸĐč ĐČĐ”Ń€ĐŸŃŃ‚ĐœĐŸŃŃ‚ŃŒŃŽ Đ»ĐŸĐłĐžĐșа ĐŽĐ»Ń ĐČĐ°ŃˆĐ”ĐłĐŸ *startup* Đž *shutdown* сĐČŃĐ·Đ°ĐœĐ°: ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń…ĐŸŃ‚Đ”Ń‚ŃŒ Ń‡Ń‚ĐŸ-Ń‚ĐŸ Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚ŃŒ, а Đ·Đ°Ń‚Đ”ĐŒ заĐČĐ”Ń€ŃˆĐžŃ‚ŃŒ, ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ Ń€Đ”ŃŃƒŃ€Ń, а Đ·Đ°Ń‚Đ”ĐŒ ĐŸŃĐČĐŸĐ±ĐŸĐŽĐžŃ‚ŃŒ Đ”ĐłĐŸ Đž т.ĐŽ. Đ”Đ”Đ»Đ°Ń‚ŃŒ ŃŃ‚ĐŸ ĐČ ĐŸŃ‚ĐŽĐ”Đ»ŃŒĐœŃ‹Ń… Ń„ŃƒĐœĐșцоях, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐœĐ” Ń€Đ°Đ·ĐŽĐ”Đ»ŃŃŽŃ‚ ĐŸĐ±Ń‰ŃƒŃŽ Đ»ĐŸĐłĐžĐșу ОлО ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Đ”, ŃĐ»ĐŸĐ¶ĐœĐ”Đ”, таĐș ĐșаĐș проЮётся Ń…Ń€Đ°ĐœĐžŃ‚ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ ĐČ ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœŃ‹Ń… ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Ń… ОлО ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐżĐŸŃ…ĐŸĐ¶ĐžĐ” ĐżŃ€ĐžŃ‘ĐŒŃ‹. @@ -148,9 +148,9 @@ async with lifespan(app): ## ĐąĐ”Ń…ĐœĐžŃ‡Đ”ŃĐșОД ЎДталО { #technical-details } -ĐĐ”ĐŒĐœĐŸĐłĐŸ Ń‚Đ”Ń…ĐœĐžŃ‡Đ”ŃĐșох ĐżĐŸĐŽŃ€ĐŸĐ±ĐœĐŸŃŃ‚Đ”Đč ĐŽĐ»Ń Đ»ŃŽĐ±ĐŸĐżŃ‹Ń‚ĐœŃ‹Ń… ŃƒĐŒĐœĐžĐșĐŸĐČ. đŸ€“ +ĐŸŃ€ĐŸŃŃ‚ĐŸ Ń‚Đ”Ń…ĐœĐžŃ‡Đ”ŃĐșая ĐżĐŸĐŽŃ€ĐŸĐ±ĐœĐŸŃŃ‚ŃŒ ĐŽĐ»Ń Đ»ŃŽĐ±ĐŸĐżŃ‹Ń‚ĐœŃ‹Ń… ŃƒĐŒĐœĐžĐșĐŸĐČ. đŸ€“ -ĐŸĐŸĐŽ ĐșĐ°ĐżĐŸŃ‚ĐŸĐŒ, ĐČ ASGI-Ń‚Đ”Ń…ĐœĐžŃ‡Đ”ŃĐșĐŸĐč спДцОфОĐșацоо, ŃŃ‚ĐŸ часть [ĐŸŃ€ĐŸŃ‚ĐŸĐșĐŸĐ»Đ° Lifespan](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), Đž ĐŸĐœ ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ŃĐ”Ń‚ ŃĐŸĐ±Ń‹Ń‚ĐžŃ `startup` Đž `shutdown`. +ĐŸĐŸĐŽ ĐșĐ°ĐżĐŸŃ‚ĐŸĐŒ, ĐČ Ń‚Đ”Ń…ĐœĐžŃ‡Đ”ŃĐșĐŸĐč спДцОфОĐșацоо ASGI, ŃŃ‚ĐŸ часть [ĐŸŃ€ĐŸŃ‚ĐŸĐșĐŸĐ»Đ° Lifespan](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), Đž ĐŸĐœ ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ŃĐ”Ń‚ ŃĐŸĐ±Ń‹Ń‚ĐžŃ `startup` Đž `shutdown`. /// note | ĐŸŃ€ĐžĐŒĐ”Ń‡Đ°ĐœĐžĐ” @@ -162,4 +162,4 @@ async with lifespan(app): ## ĐŸĐŸĐŽĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ { #sub-applications } -🚹 Đ˜ĐŒĐ”ĐčтД ĐČ ĐČОЎу, Ń‡Ń‚ĐŸ это ŃĐŸĐ±Ń‹Ń‚ĐžŃ lifespan (startup Đž shutdown) Đ±ŃƒĐŽŃƒŃ‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœŃ‹ Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐŽĐ»Ń ĐŸŃĐœĐŸĐČĐœĐŸĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ, а ĐœĐ” ĐŽĐ»Ń [ĐŸĐŸĐŽĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ — Mounts](sub-applications.md). +🚹 Đ˜ĐŒĐ”ĐčтД ĐČ ĐČОЎу, Ń‡Ń‚ĐŸ это ŃĐŸĐ±Ń‹Ń‚ĐžŃ lifespan (startup Đž shutdown) Đ±ŃƒĐŽŃƒŃ‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœŃ‹ Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐŽĐ»Ń ĐŸŃĐœĐŸĐČĐœĐŸĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ, а ĐœĐ” ĐŽĐ»Ń [ĐŸĐŸĐŽĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč - Mounts](sub-applications.md). diff --git a/docs/ru/docs/advanced/generate-clients.md b/docs/ru/docs/advanced/generate-clients.md index f05454d9c..04e8e88bc 100644 --- a/docs/ru/docs/advanced/generate-clients.md +++ b/docs/ru/docs/advanced/generate-clients.md @@ -20,20 +20,6 @@ FastAPI аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž ĐłĐ”ĐœĐ”Ń€ĐžŃ€ŃƒĐ”Ń‚ спДцОфОĐșацоо /// -## Đ“Đ”ĐœĐ”Ń€Đ°Ń‚ĐŸŃ€Ń‹ SDK ĐŸŃ‚ ŃĐżĐŸĐœŃĐŸŃ€ĐŸĐČ FastAPI { #sdk-generators-from-fastapi-sponsors } - -В ŃŃ‚ĐŸĐŒ разЎДлД прДЎстаĐČĐ»Đ”ĐœŃ‹ Ń€Đ”ŃˆĐ”ĐœĐžŃ с **ĐČĐ”ĐœŃ‡ŃƒŃ€ĐœĐŸĐč ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐșĐŸĐč** Đž **ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐșĐŸĐč ĐșĐŸĐŒĐżĐ°ĐœĐžĐč** ĐŸŃ‚ ĐșĐŸĐŒĐżĐ°ĐœĐžĐč, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ŃĐżĐŸĐœŃĐžŃ€ŃƒŃŽŃ‚ FastAPI. Это ĐżŃ€ĐŸĐŽŃƒĐșты ĐżŃ€Đ”ĐŽĐŸŃŃ‚Đ°ĐČĐ»ŃŃŽŃ‚ **ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đ” ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚Đž** Đž **ĐžĐœŃ‚Đ”ĐłŃ€Đ°Ń†ĐžĐž** сĐČДрх ĐČŃ‹ŃĐŸĐșĐŸĐșачДстĐČĐ”ĐœĐœĐŸ ĐłĐ”ĐœĐ”Ń€ĐžŃ€ŃƒĐ”ĐŒŃ‹Ń… SDK. - -Đ‘Đ»Đ°ĐłĐŸĐŽĐ°Ń€Ń ✹ [**ŃĐżĐŸĐœŃĐŸŃ€ŃŃ‚ĐČу FastAPI**](../help-fastapi.md#sponsor-the-author) ✹ это ĐșĐŸĐŒĐżĐ°ĐœĐžĐž ĐżĐŸĐŒĐŸĐłĐ°ŃŽŃ‚ ĐŸĐ±Đ”ŃĐżĐ”Ń‡ĐžĐČать, Ń‡Ń‚ĐŸĐ±Ń‹ фрДĐčĐŒĐČĐŸŃ€Đș Đž Đ”ĐłĐŸ **эĐșĐŸŃĐžŃŃ‚Đ”ĐŒĐ°** ĐŸŃŃ‚Đ°ĐČĐ°Đ»ĐžŃŃŒ Đ·ĐŽĐŸŃ€ĐŸĐČŃ‹ĐŒĐž Đž **ŃƒŃŃ‚ĐŸĐčчоĐČŃ‹ĐŒĐž**. - -Их ŃĐżĐŸĐœŃĐŸŃ€ŃŃ‚ĐČĐŸ таĐșжД ĐŽĐ”ĐŒĐŸĐœŃŃ‚Ń€ĐžŃ€ŃƒĐ”Ń‚ ŃĐ”Ń€ŃŒŃ‘Đ·ĐœŃƒŃŽ проĐČĐ”Ń€Đ¶Đ”ĐœĐœĐŸŃŃ‚ŃŒ **ŃĐŸĐŸĐ±Ń‰Đ”ŃŃ‚ĐČу** FastAPI (ĐČĐ°ĐŒ), ĐżĐŸĐșазыĐČая, Ń‡Ń‚ĐŸ ĐžĐŒ ĐČĐ°Đ¶ĐœĐŸ ĐœĐ” Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐżŃ€Đ”ĐŽĐŸŃŃ‚Đ°ĐČĐ»ŃŃ‚ŃŒ **ĐŸŃ‚Đ»ĐžŃ‡ĐœŃ‹Đč сДрĐČОс**, ĐœĐŸ Đž ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČать **ĐœĐ°ĐŽŃ‘Đ¶ĐœŃ‹Đč Đž ĐżŃ€ĐŸŃ†ĐČДтающОĐč фрДĐčĐŒĐČĐŸŃ€Đș** FastAPI. 🙇 - -ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸĐżŃ€ĐŸĐ±ĐŸĐČать: - -* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) - -ĐĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” Оз этох Ń€Đ”ŃˆĐ”ĐœĐžĐč таĐșжД ĐŒĐŸĐłŃƒŃ‚ Đ±Ń‹Ń‚ŃŒ open source ОлО ĐžĐŒĐ”Ń‚ŃŒ Đ±Đ”ŃĐżĐ»Đ°Ń‚ĐœŃ‹Đ” тарофы, таĐș Ń‡Ń‚ĐŸ ĐČы ŃĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸĐżŃ€ĐŸĐ±ĐŸĐČать ох бДз Ń„ĐžĐœĐ°ĐœŃĐŸĐČых затрат. Đ”Ń€ŃƒĐłĐžĐ” ĐșĐŸĐŒĐŒĐ”Ń€Ń‡Đ”ŃĐșОД ĐłĐ”ĐœĐ”Ń€Đ°Ń‚ĐŸŃ€Ń‹ SDK ĐŽĐŸŃŃ‚ŃƒĐżĐœŃ‹ Đž ох ĐŒĐŸĐ¶ĐœĐŸ ĐœĐ°Đčто ĐŸĐœĐ»Đ°ĐčĐœ. đŸ€“ - ## ĐĄĐŸĐ·ĐŽĐ°Ń‚ŃŒ TypeScript SDK { #create-a-typescript-sdk } ĐĐ°Ń‡ĐœŃ‘ĐŒ с ĐżŃ€ĐŸŃŃ‚ĐŸĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ FastAPI: diff --git a/docs/ru/docs/advanced/json-base64-bytes.md b/docs/ru/docs/advanced/json-base64-bytes.md index 390dd17fa..262766889 100644 --- a/docs/ru/docs/advanced/json-base64-bytes.md +++ b/docs/ru/docs/advanced/json-base64-bytes.md @@ -4,7 +4,7 @@ ## Base64 Đž фаĐčлы { #base64-vs-files } -ĐĄĐœĐ°Ń‡Đ°Đ»Đ° Ń€Đ°ŃŃĐŒĐŸŃ‚Ń€ĐžŃ‚Đ” ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать [ЀаĐčлы ĐČ Đ·Đ°ĐżŃ€ĐŸŃĐ”](../tutorial/request-files.md) ĐŽĐ»Ń Đ·Đ°ĐłŃ€ŃƒĐ·ĐșĐž Đ±ĐžĐœĐ°Ń€ĐœŃ‹Ń… ĐŽĐ°ĐœĐœŃ‹Ń… Đž [ĐŸĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșĐžĐč HTTP-ĐŸŃ‚ĐČДт — FileResponse](./custom-response.md#fileresponse--fileresponse-) ĐŽĐ»Ń ĐŸŃ‚ĐżŃ€Đ°ĐČĐșĐž Đ±ĐžĐœĐ°Ń€ĐœŃ‹Ń… ĐŽĐ°ĐœĐœŃ‹Ń… ĐČĐŒĐ”ŃŃ‚ĐŸ ĐșĐŸĐŽĐžŃ€ĐŸĐČĐ°ĐœĐžŃ ох ĐČ JSON. +ĐĄĐœĐ°Ń‡Đ°Đ»Đ° Ń€Đ°ŃŃĐŒĐŸŃ‚Ń€ĐžŃ‚Đ” ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать [ЀаĐčлы ĐČ Đ·Đ°ĐżŃ€ĐŸŃĐ”](../tutorial/request-files.md) ĐŽĐ»Ń Đ·Đ°ĐłŃ€ŃƒĐ·ĐșĐž Đ±ĐžĐœĐ°Ń€ĐœŃ‹Ń… ĐŽĐ°ĐœĐœŃ‹Ń… Đž [ĐŸĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșĐžĐč HTTP-ĐŸŃ‚ĐČДт — FileResponse](./custom-response.md#fileresponse) ĐŽĐ»Ń ĐŸŃ‚ĐżŃ€Đ°ĐČĐșĐž Đ±ĐžĐœĐ°Ń€ĐœŃ‹Ń… ĐŽĐ°ĐœĐœŃ‹Ń… ĐČĐŒĐ”ŃŃ‚ĐŸ ĐșĐŸĐŽĐžŃ€ĐŸĐČĐ°ĐœĐžŃ ох ĐČ JSON. JSON ĐŒĐŸĐ¶Đ”Ń‚ ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ŃŒ Ń‚ĐŸĐ»ŃŒĐșĐŸ ŃŃ‚Ń€ĐŸĐșĐž ĐČ ĐșĐŸĐŽĐžŃ€ĐŸĐČĐșĐ” UTF-8, ĐżĐŸŃŃ‚ĐŸĐŒŃƒ ĐŸĐœ ĐœĐ” ĐŒĐŸĐ¶Đ”Ń‚ ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ŃŒ «сырыД» баĐčты. @@ -14,7 +14,7 @@ Base64 ĐŒĐŸĐ¶Đ”Ń‚ ĐșĐŸĐŽĐžŃ€ĐŸĐČать Đ±ĐžĐœĐ°Ń€ĐœŃ‹Đ” ĐŽĐ°ĐœĐœŃ‹Đ” ĐČ ŃŃ‚Ń€ĐŸ ## Pydantic `bytes` { #pydantic-bytes } -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть Pydantic-ĐŒĐŸĐŽĐ”Đ»ŃŒ с ĐżĐŸĐ»ŃĐŒĐž `bytes`, а Đ·Đ°Ń‚Đ”ĐŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать `val_json_bytes` ĐČ ĐșĐŸĐœŃ„ĐžĐłĐ” ĐŒĐŸĐŽĐ”Đ»Đž, Ń‡Ń‚ĐŸĐ±Ń‹ уĐșĐ°Đ·Đ°Ń‚ŃŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать base64 ĐŽĐ»Ń ĐČалОЎацОО ĐČŃ…ĐŸĐŽŃŃ‰ĐžŃ… JSON-ĐŽĐ°ĐœĐœŃ‹Ń…; ĐșаĐș часть ŃŃ‚ĐŸĐč ĐČалОЎацОО ŃŃ‚Ń€ĐŸĐșа base64 Đ±ŃƒĐŽĐ”Ń‚ ĐŽĐ”ĐșĐŸĐŽĐžŃ€ĐŸĐČĐ°ĐœĐ° ĐČ Đ±Đ°Đčты. +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть Pydantic-ĐŒĐŸĐŽĐ”Đ»ŃŒ с ĐżĐŸĐ»ŃĐŒĐž `bytes`, а Đ·Đ°Ń‚Đ”ĐŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать `val_json_bytes` ĐČ ĐșĐŸĐœŃ„ĐžĐłĐ” ĐŒĐŸĐŽĐ”Đ»Đž, Ń‡Ń‚ĐŸĐ±Ń‹ уĐșĐ°Đ·Đ°Ń‚ŃŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать base64 ĐŽĐ»Ń *ĐČалОЎацОО* ĐČŃ…ĐŸĐŽŃŃ‰ĐžŃ… JSON-ĐŽĐ°ĐœĐœŃ‹Ń…; ĐșаĐș часть ŃŃ‚ĐŸĐč ĐČалОЎацОО ŃŃ‚Ń€ĐŸĐșа base64 Đ±ŃƒĐŽĐ”Ń‚ ĐŽĐ”ĐșĐŸĐŽĐžŃ€ĐŸĐČĐ°ĐœĐ° ĐČ Đ±Đ°Đčты. {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} @@ -52,12 +52,12 @@ Base64 ĐŒĐŸĐ¶Đ”Ń‚ ĐșĐŸĐŽĐžŃ€ĐŸĐČать Đ±ĐžĐœĐ°Ń€ĐœŃ‹Đ” ĐŽĐ°ĐœĐœŃ‹Đ” ĐČ ŃŃ‚Ń€ĐŸ ## Pydantic `bytes` ĐŽĐ»Ń ĐČŃ‹Ń…ĐŸĐŽĐœŃ‹Ń… ĐŽĐ°ĐœĐœŃ‹Ń… { #pydantic-bytes-for-output-data } -Вы таĐșжД ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐżĐŸĐ»Ń `bytes` с `ser_json_bytes` ĐČ ĐșĐŸĐœŃ„ĐžĐłĐ” ĐŒĐŸĐŽĐ”Đ»Đž ĐŽĐ»Ń ĐČŃ‹Ń…ĐŸĐŽĐœŃ‹Ń… ĐŽĐ°ĐœĐœŃ‹Ń…, Đž Pydantic Đ±ŃƒĐŽĐ”Ń‚ ŃĐ”Ń€ĐžĐ°Đ»ĐžĐ·ĐŸĐČать баĐčты ĐČ base64 про Ń„ĐŸŃ€ĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžĐž JSON-ĐŸŃ‚ĐČДта. +Вы таĐșжД ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐżĐŸĐ»Ń `bytes` с `ser_json_bytes` ĐČ ĐșĐŸĐœŃ„ĐžĐłĐ” ĐŒĐŸĐŽĐ”Đ»Đž ĐŽĐ»Ń ĐČŃ‹Ń…ĐŸĐŽĐœŃ‹Ń… ĐŽĐ°ĐœĐœŃ‹Ń…, Đž Pydantic Đ±ŃƒĐŽĐ”Ń‚ *ŃĐ”Ń€ĐžĐ°Đ»ĐžĐ·ĐŸĐČать* баĐčты ĐČ base64 про Ń„ĐŸŃ€ĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžĐž JSON-ĐŸŃ‚ĐČДта. {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *} ## Pydantic `bytes` ĐŽĐ»Ń ĐČŃ…ĐŸĐŽĐœŃ‹Ń… Đž ĐČŃ‹Ń…ĐŸĐŽĐœŃ‹Ń… ĐŽĐ°ĐœĐœŃ‹Ń… { #pydantic-bytes-for-input-and-output-data } -И, ĐșĐŸĐœĐ”Ń‡ĐœĐŸ, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐŸĐŽĐœŃƒ Đž ту жД ĐŒĐŸĐŽĐ”Đ»ŃŒ, ĐœĐ°ŃŃ‚Ń€ĐŸĐ”ĐœĐœŃƒŃŽ ĐœĐ° ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ” base64, Ń‡Ń‚ĐŸĐ±Ń‹ ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČать Đž ĐČŃ…ĐŸĐŽŃŃ‰ĐžĐ” ĐŽĐ°ĐœĐœŃ‹Đ” (ĐČĐ°Đ»ĐžĐŽĐ°Ń†ĐžŃ) с `val_json_bytes`, Đž ĐžŃŃ…ĐŸĐŽŃŃ‰ĐžĐ” ĐŽĐ°ĐœĐœŃ‹Đ” (ŃĐ”Ń€ĐžĐ°Đ»ĐžĐ·Đ°Ń†ĐžŃ) с `ser_json_bytes` про ĐżŃ€ĐžĐ”ĐŒĐ” Đž ĐŸŃ‚ĐżŃ€Đ°ĐČĐșĐ” JSON-ĐŽĐ°ĐœĐœŃ‹Ń…. +И, ĐșĐŸĐœĐ”Ń‡ĐœĐŸ, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐŸĐŽĐœŃƒ Đž ту жД ĐŒĐŸĐŽĐ”Đ»ŃŒ, ĐœĐ°ŃŃ‚Ń€ĐŸĐ”ĐœĐœŃƒŃŽ ĐœĐ° ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ” base64, Ń‡Ń‚ĐŸĐ±Ń‹ ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČать Đž ĐČŃ…ĐŸĐŽŃŃ‰ĐžĐ” ĐŽĐ°ĐœĐœŃ‹Đ” (*ĐČĐ°Đ»ĐžĐŽĐžŃ€ĐŸĐČать*) с `val_json_bytes`, Đž ĐžŃŃ…ĐŸĐŽŃŃ‰ĐžĐ” ĐŽĐ°ĐœĐœŃ‹Đ” (*ŃĐ”Ń€ĐžĐ°Đ»ĐžĐ·ĐŸĐČать*) с `ser_json_bytes` про ĐżŃ€ĐžĐ”ĐŒĐ” Đž ĐŸŃ‚ĐżŃ€Đ°ĐČĐșĐ” JSON-ĐŽĐ°ĐœĐœŃ‹Ń…. {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/ru/docs/advanced/openapi-callbacks.md b/docs/ru/docs/advanced/openapi-callbacks.md index c9cb73d18..002b69c7c 100644 --- a/docs/ru/docs/advanced/openapi-callbacks.md +++ b/docs/ru/docs/advanced/openapi-callbacks.md @@ -1,10 +1,10 @@ # ĐžĐ±Ń€Đ°Ń‚ĐœŃ‹Đ” ĐČŃ‹Đ·ĐŸĐČы ĐČ OpenAPI { #openapi-callbacks } -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃĐŸĐ·ĐŽĐ°Ń‚ŃŒ API с *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐ”Đč путо* (ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐŒ путо), ĐșĐŸŃ‚ĐŸŃ€Đ°Ń Đ±ŃƒĐŽĐ”Ń‚ ĐžĐœĐžŃ†ĐžĐžŃ€ĐŸĐČать HTTP-Đ·Đ°ĐżŃ€ĐŸŃ Đș *ĐČĐœĐ”ŃˆĐœĐ”ĐŒŃƒ API*, ŃĐŸĐ·ĐŽĐ°ĐœĐœĐŸĐŒŃƒ ĐșĐ”ĐŒ-Ń‚ĐŸ ĐŽŃ€ŃƒĐłĐžĐŒ (сĐșĐŸŃ€Đ”Đ” ĐČŃĐ”ĐłĐŸ Ń‚Đ”ĐŒ жД Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐŒ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč Đ±ŃƒĐŽĐ”Ń‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐČаш API). +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃĐŸĐ·ĐŽĐ°Ń‚ŃŒ API с *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐ”Đč путо* (ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐŒ путо), ĐșĐŸŃ‚ĐŸŃ€Đ°Ń Đ±ŃƒĐŽĐ”Ń‚ ĐžĐœĐžŃ†ĐžĐžŃ€ĐŸĐČать HTTP-Đ·Đ°ĐżŃ€ĐŸŃ Đș *ĐČĐœĐ”ŃˆĐœĐ”ĐŒŃƒ API*, ŃĐŸĐ·ĐŽĐ°ĐœĐœĐŸĐŒŃƒ ĐșĐ”ĐŒ-Ń‚ĐŸ ĐŽŃ€ŃƒĐłĐžĐŒ (сĐșĐŸŃ€Đ”Đ” ĐČŃĐ”ĐłĐŸ Ń‚Đ”ĐŒ жД Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐŒ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč Đ±ŃƒĐŽĐ”Ń‚ *ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать* ĐČаш API). -ĐŸŃ€ĐŸŃ†Đ”ŃŃ, ĐżŃ€ĐŸĐžŃŃ…ĐŸĐŽŃŃ‰ĐžĐč, ĐșĐŸĐłĐŽĐ° ĐČашД ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” API ĐŸĐ±Ń€Đ°Ń‰Đ°Đ”Ń‚ŃŃ Đș *ĐČĐœĐ”ŃˆĐœĐ”ĐŒŃƒ API*, ĐœĐ°Đ·Ń‹ĐČĐ°Đ”Ń‚ŃŃ «callback» (ĐŸĐ±Ń€Đ°Ń‚ĐœŃ‹Đč ĐČŃ‹Đ·ĐŸĐČ). ĐŸŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐœĐŸĐ” ĐŸĐ±Đ”ŃĐżĐ”Ń‡Đ”ĐœĐžĐ”, ĐœĐ°ĐżĐžŃĐ°ĐœĐœĐŸĐ” ĐČĐœĐ”ŃˆĐœĐžĐŒ Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐŒ, ĐŸŃ‚ĐżŃ€Đ°ĐČĐ»ŃĐ”Ń‚ HTTP-Đ·Đ°ĐżŃ€ĐŸŃ ĐČĐ°ŃˆĐ”ĐŒŃƒ API, а Đ·Đ°Ń‚Đ”ĐŒ ĐČаш API ĐČŃ‹ĐżĐŸĐ»ĐœŃĐ”Ń‚ ĐŸĐ±Ń€Đ°Ń‚ĐœŃ‹Đč ĐČŃ‹Đ·ĐŸĐČ, ĐŸŃ‚ĐżŃ€Đ°ĐČĐ»ŃŃ HTTP-Đ·Đ°ĐżŃ€ĐŸŃ ĐČĐŸ *ĐČĐœĐ”ŃˆĐœĐžĐč API* (ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč, ĐČĐ”Ń€ĐŸŃŃ‚ĐœĐŸ, Ń‚ĐŸĐ¶Đ” ŃĐŸĐ·ĐŽĐ°Đ» Ń‚ĐŸŃ‚ жД Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș). +ĐŸŃ€ĐŸŃ†Đ”ŃŃ, ĐżŃ€ĐŸĐžŃŃ…ĐŸĐŽŃŃ‰ĐžĐč, ĐșĐŸĐłĐŽĐ° ĐČашД ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” API ĐŸĐ±Ń€Đ°Ń‰Đ°Đ”Ń‚ŃŃ Đș *ĐČĐœĐ”ŃˆĐœĐ”ĐŒŃƒ API*, ĐœĐ°Đ·Ń‹ĐČĐ°Đ”Ń‚ŃŃ «callback» (ĐŸĐ±Ń€Đ°Ń‚ĐœŃ‹Đč ĐČŃ‹Đ·ĐŸĐČ). ĐŸĐŸŃ‚ĐŸĐŒŃƒ Ń‡Ń‚ĐŸ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐœĐŸĐ” ĐŸĐ±Đ”ŃĐżĐ”Ń‡Đ”ĐœĐžĐ”, ĐœĐ°ĐżĐžŃĐ°ĐœĐœĐŸĐ” ĐČĐœĐ”ŃˆĐœĐžĐŒ Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐŒ, ĐŸŃ‚ĐżŃ€Đ°ĐČĐ»ŃĐ”Ń‚ HTTP-Đ·Đ°ĐżŃ€ĐŸŃ ĐČĐ°ŃˆĐ”ĐŒŃƒ API, а Đ·Đ°Ń‚Đ”ĐŒ ĐČаш API ĐČŃ‹ĐżĐŸĐ»ĐœŃĐ”Ń‚ ĐŸĐ±Ń€Đ°Ń‚ĐœŃ‹Đč ĐČŃ‹Đ·ĐŸĐČ, ĐŸŃ‚ĐżŃ€Đ°ĐČĐ»ŃŃ HTTP-Đ·Đ°ĐżŃ€ĐŸŃ ĐČĐŸ *ĐČĐœĐ”ŃˆĐœĐžĐč API* (ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč, ĐČĐ”Ń€ĐŸŃŃ‚ĐœĐŸ, Ń‚ĐŸĐ¶Đ” ŃĐŸĐ·ĐŽĐ°Đ» Ń‚ĐŸŃ‚ жД Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș). -В ŃŃ‚ĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” ĐČĐ°ĐŒ ĐŒĐŸĐ¶Đ”Ń‚ ĐżĐŸĐœĐ°ĐŽĐŸĐ±ĐžŃ‚ŃŒŃŃ Đ·Đ°ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ĐŸĐČать, ĐșаĐș ĐŽĐŸĐ»Đ¶ĐœĐŸ ĐČŃ‹ĐłĐ»ŃĐŽĐ”Ń‚ŃŒ ŃŃ‚ĐŸ ĐČĐœĐ”ŃˆĐœĐ”Đ” API: ĐșаĐșую *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃŽ путо* ĐŸĐœĐŸ ĐŽĐŸĐ»Đ¶ĐœĐŸ ĐžĐŒĐ”Ń‚ŃŒ, ĐșаĐșĐŸĐ” Ń‚Đ”Đ»ĐŸ Đ·Đ°ĐżŃ€ĐŸŃĐ° ĐŸĐ¶ĐžĐŽĐ°Ń‚ŃŒ, ĐșаĐșĐŸĐč ĐŸŃ‚ĐČДт ĐČĐŸĐ·ĐČращать Đž т.ĐŽ. +В ŃŃ‚ĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” ĐČĐ°ĐŒ ĐŒĐŸĐ¶Đ”Ń‚ ĐżĐŸĐœĐ°ĐŽĐŸĐ±ĐžŃ‚ŃŒŃŃ Đ·Đ°ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ĐŸĐČать, ĐșаĐș ŃŃ‚ĐŸ ĐČĐœĐ”ŃˆĐœĐ”Đ” API *ĐŽĐŸĐ»Đ¶ĐœĐŸ* ĐČŃ‹ĐłĐ»ŃĐŽĐ”Ń‚ŃŒ: ĐșаĐșую *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃŽ путо* ĐŸĐœĐŸ ĐŽĐŸĐ»Đ¶ĐœĐŸ ĐžĐŒĐ”Ń‚ŃŒ, ĐșаĐșĐŸĐ” Ń‚Đ”Đ»ĐŸ Đ·Đ°ĐżŃ€ĐŸŃĐ° ĐŸĐ¶ĐžĐŽĐ°Ń‚ŃŒ, ĐșаĐșĐŸĐč HTTP-ĐŸŃ‚ĐČДт ĐČĐŸĐ·ĐČращать Đž т.ĐŽ. ## ĐŸŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” с ĐŸĐ±Ń€Đ°Ń‚ĐœŃ‹ĐŒĐž ĐČŃ‹Đ·ĐŸĐČĐ°ĐŒĐž { #an-app-with-callbacks } @@ -82,7 +82,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) ĐšĐŸĐłĐŽĐ° ĐČы ĐżĐžŃˆĐ”Ń‚Đ” ĐșĐŸĐŽ ĐŽĐ»Ń ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐžŃ ĐŸĐ±Ń€Đ°Ń‚ĐœĐŸĐłĐŸ ĐČŃ‹Đ·ĐŸĐČа, ĐżĐŸĐ»Đ”Đ·ĐœĐŸ прДЎстаĐČоть, Ń‡Ń‚ĐŸ ĐČы — Ń‚ĐŸŃ‚ ŃĐ°ĐŒŃ‹Đč *ĐČĐœĐ”ŃˆĐœĐžĐč Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș*. И Ń‡Ń‚ĐŸ ĐČы сДĐčчас Ń€Đ”Đ°Đ»ĐžĐ·ŃƒĐ”Ń‚Đ” *ĐČĐœĐ”ŃˆĐœĐžĐč API*, а ĐœĐ” *сĐČĐŸĐč API*. -Đ’Ń€Đ”ĐŒĐ”ĐœĐœĐŸĐ” ĐżŃ€ĐžĐœŃŃ‚ĐžĐ” ŃŃ‚ĐŸĐč Ń‚ĐŸŃ‡ĐșĐž Đ·Ń€Đ”ĐœĐžŃ (ĐČĐœĐ”ŃˆĐœĐ”ĐłĐŸ Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа) ĐżĐŸĐŒĐŸĐ¶Đ”Ń‚ ĐžĐœŃ‚ŃƒĐžŃ‚ĐžĐČĐœĐŸ ĐżĐŸĐœŃŃ‚ŃŒ, ĐșуЎа ĐżĐŸĐŒĐ”ŃŃ‚ĐžŃ‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹, ĐșаĐșую Pydantic-ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐŽĐ»Ń тДла Đ·Đ°ĐżŃ€ĐŸŃĐ°, ĐŽĐ»Ń ĐŸŃ‚ĐČДта Đž т.ĐŽ. ĐČĐŸ *ĐČĐœĐ”ŃˆĐœĐ”ĐŒ API*. +Đ’Ń€Đ”ĐŒĐ”ĐœĐœĐŸĐ” ĐżŃ€ĐžĐœŃŃ‚ĐžĐ” ŃŃ‚ĐŸĐč Ń‚ĐŸŃ‡ĐșĐž Đ·Ń€Đ”ĐœĐžŃ (ĐČĐœĐ”ŃˆĐœĐ”ĐłĐŸ Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа) ĐżĐŸĐŒĐŸĐ¶Đ”Ń‚ ĐžĐœŃ‚ŃƒĐžŃ‚ĐžĐČĐœĐŸ ĐżĐŸĐœŃŃ‚ŃŒ, ĐșуЎа ĐżĐŸĐŒĐ”ŃŃ‚ĐžŃ‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹, ĐșаĐșую Pydantic-ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐŽĐ»Ń тДла Đ·Đ°ĐżŃ€ĐŸŃĐ°, ĐŽĐ»Ń HTTP-ĐŸŃ‚ĐČДта Đž т.ĐŽ. ĐČĐŸ *ĐČĐœĐ”ŃˆĐœĐ”ĐŒ API*. /// @@ -99,7 +99,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) ĐžĐœĐ° ĐŽĐŸĐ»Đ¶ĐœĐ° ĐČŃ‹ĐłĐ»ŃĐŽĐ”Ń‚ŃŒ ĐșаĐș ĐŸĐ±Ń‹Ń‡ĐœĐ°Ń *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃ путо* FastAPI: * Đ’Đ”Ń€ĐŸŃŃ‚ĐœĐŸ, ĐČ ĐœĐ”Đč ĐŽĐŸĐ»Đ¶ĐœĐŸ Đ±Ń‹Ń‚ŃŒ ĐŸĐ±ŃŠŃĐČĐ»Đ”ĐœĐžĐ” тДла Đ·Đ°ĐżŃ€ĐŸŃĐ°, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ `body: InvoiceEvent`. -* А таĐșжД ĐŒĐŸĐ¶Đ”Ń‚ Đ±Ń‹Ń‚ŃŒ ĐŸĐ±ŃŠŃĐČĐ»Đ”ĐœĐžĐ” ĐŒĐŸĐŽĐ”Đ»Đž ĐŸŃ‚ĐČДта, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ `response_model=InvoiceEventReceived`. +* А таĐșжД ĐŒĐŸĐ¶Đ”Ń‚ Đ±Ń‹Ń‚ŃŒ ĐŸĐ±ŃŠŃĐČĐ»Đ”ĐœĐžĐ” HTTP-ĐŸŃ‚ĐČДта, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐŸĐœĐ° ĐŽĐŸĐ»Đ¶ĐœĐ° ĐČĐŸĐ·ĐČращать, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ `response_model=InvoiceEventReceived`. {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *} @@ -124,7 +124,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) https://yourapi.com/invoices/?callback_url=https://www.external.org/events ``` -с Ń‚Đ”Đ»ĐŸĐŒ JSON: +с Ń‚Đ”Đ»ĐŸĐŒ Đ·Đ°ĐżŃ€ĐŸŃĐ° JSON: ```JSON { @@ -140,7 +140,7 @@ https://yourapi.com/invoices/?callback_url=https://www.external.org/events https://www.external.org/events/invoices/2expen51ve ``` -с Ń‚Đ”Đ»ĐŸĐŒ JSON ĐżŃ€ĐžĐŒĐ”Ń€ĐœĐŸ таĐșĐŸĐłĐŸ ĐČОЎа: +с Ń‚Đ”Đ»ĐŸĐŒ Đ·Đ°ĐżŃ€ĐŸŃĐ° JSON ĐżŃ€ĐžĐŒĐ”Ń€ĐœĐŸ таĐșĐŸĐłĐŸ ĐČОЎа: ```JSON { @@ -149,7 +149,7 @@ https://www.external.org/events/invoices/2expen51ve } ``` -Đž Đ±ŃƒĐŽĐ”Ń‚ ĐŸĐ¶ĐžĐŽĐ°Ń‚ŃŒ ĐŸŃ‚ *ĐČĐœĐ”ŃˆĐœĐ”ĐłĐŸ API* ĐŸŃ‚ĐČДт с Ń‚Đ”Đ»ĐŸĐŒ JSON ĐČОЎа: +Đž Đ±ŃƒĐŽĐ”Ń‚ ĐŸĐ¶ĐžĐŽĐ°Ń‚ŃŒ ĐŸŃ‚ *ĐČĐœĐ”ŃˆĐœĐ”ĐłĐŸ API* HTTP-ĐŸŃ‚ĐČДт с JSON ĐČ Ń‚Đ”Đ»Đ” ĐŸŃ‚ĐČДта: ```JSON { @@ -163,17 +163,17 @@ https://www.external.org/events/invoices/2expen51ve /// -### ĐŸĐŸĐŽĐșлючОтД ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€ ĐŸĐ±Ń€Đ°Ń‚ĐœĐŸĐłĐŸ ĐČŃ‹Đ·ĐŸĐČа { #add-the-callback-router } +### Đ”ĐŸĐ±Đ°ĐČŃŒŃ‚Đ” Ń€ĐŸŃƒŃ‚Đ”Ń€ ĐŸĐ±Ń€Đ°Ń‚ĐœĐŸĐłĐŸ ĐČŃ‹Đ·ĐŸĐČа { #add-the-callback-router } -К ŃŃ‚ĐŸĐŒŃƒ ĐŒĐŸĐŒĐ”ĐœŃ‚Ńƒ у ĐČас Đ”ŃŃ‚ŃŒ ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒŃ‹Đ” *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ĐŸĐ±Ń€Đ°Ń‚ĐœĐŸĐłĐŸ ĐČŃ‹Đ·ĐŸĐČа (тД, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” *ĐČĐœĐ”ŃˆĐœĐžĐč Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș* ĐŽĐŸĐ»Đ¶Đ”Đœ Ń€Đ”Đ°Đ»ĐžĐ·ĐŸĐČать ĐČĐŸ *ĐČĐœĐ”ŃˆĐœĐ”ĐŒ API*) ĐČ ŃĐŸĐ·ĐŽĐ°ĐœĐœĐŸĐŒ ĐČŃ‹ŃˆĐ” ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€Đ” ĐŸĐ±Ń€Đ°Ń‚ĐœŃ‹Ń… ĐČŃ‹Đ·ĐŸĐČĐŸĐČ. +К ŃŃ‚ĐŸĐŒŃƒ ĐŒĐŸĐŒĐ”ĐœŃ‚Ńƒ у ĐČас Đ”ŃŃ‚ŃŒ ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒŃ‹Đ” *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ĐŸĐ±Ń€Đ°Ń‚ĐœĐŸĐłĐŸ ĐČŃ‹Đ·ĐŸĐČа (тД, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” *ĐČĐœĐ”ŃˆĐœĐžĐč Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș* ĐŽĐŸĐ»Đ¶Đ”Đœ Ń€Đ”Đ°Đ»ĐžĐ·ĐŸĐČать ĐČĐŸ *ĐČĐœĐ”ŃˆĐœĐ”ĐŒ API*) ĐČ ŃĐŸĐ·ĐŽĐ°ĐœĐœĐŸĐŒ ĐČŃ‹ŃˆĐ” Ń€ĐŸŃƒŃ‚Đ”Ń€Đ” ĐŸĐ±Ń€Đ°Ń‚ĐœŃ‹Ń… ĐČŃ‹Đ·ĐŸĐČĐŸĐČ. -ĐąĐ”ĐżĐ”Ń€ŃŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `callbacks` ĐČ *ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€Đ” ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо ĐČĐ°ŃˆĐ”ĐłĐŸ API*, Ń‡Ń‚ĐŸĐ±Ń‹ ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚ `.routes` Оз ŃŃ‚ĐŸĐłĐŸ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€Đ° ĐŸĐ±Ń€Đ°Ń‚ĐœŃ‹Ń… ĐČŃ‹Đ·ĐŸĐČĐŸĐČ: +ĐąĐ”ĐżĐ”Ń€ŃŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `callbacks` ĐČ *ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€Đ” ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо ĐČĐ°ŃˆĐ”ĐłĐŸ API*, Ń‡Ń‚ĐŸĐ±Ń‹ ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚ `.routes` Оз ŃŃ‚ĐŸĐłĐŸ Ń€ĐŸŃƒŃ‚Đ”Ń€Đ° ĐŸĐ±Ń€Đ°Ń‚ĐœŃ‹Ń… ĐČŃ‹Đ·ĐŸĐČĐŸĐČ: {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *} /// tip | ĐĄĐŸĐČДт -ОбратОтД ĐČĐœĐžĐŒĐ°ĐœĐžĐ”, Ń‡Ń‚ĐŸ ĐČы пДрДЎаётД ĐœĐ” ŃĐ°ĐŒ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€ (`invoices_callback_router`) ĐČ `callback=`, а Đ”ĐłĐŸ Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚ `.routes`, Ń‚ĐŸ Đ”ŃŃ‚ŃŒ `invoices_callback_router.routes`. FastAPI Đ±ŃƒĐŽĐ”Ń‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать это ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Ń‹ ĐŽĐ»Ń ĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžĐž ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž OpenAPI ĐŽĐ»Ń ĐŸĐ±Ń€Đ°Ń‚ĐœŃ‹Ń… ĐČŃ‹Đ·ĐŸĐČĐŸĐČ. +ОбратОтД ĐČĐœĐžĐŒĐ°ĐœĐžĐ”, Ń‡Ń‚ĐŸ ĐČы пДрДЎаётД ĐœĐ” ŃĐ°ĐŒ Ń€ĐŸŃƒŃ‚Đ”Ń€ (`invoices_callback_router`) ĐČ `callbacks=`, а Đ”ĐłĐŸ Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚ `.routes`, Ń‚ĐŸ Đ”ŃŃ‚ŃŒ `invoices_callback_router.routes`. FastAPI Đ±ŃƒĐŽĐ”Ń‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать это ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Ń‹ ĐŽĐ»Ń ĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžĐž ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž OpenAPI ĐŽĐ»Ń ĐŸĐ±Ń€Đ°Ń‚ĐœŃ‹Ń… ĐČŃ‹Đ·ĐŸĐČĐŸĐČ. /// diff --git a/docs/ru/docs/advanced/response-change-status-code.md b/docs/ru/docs/advanced/response-change-status-code.md index 3dd0c9446..a4ebd4fbc 100644 --- a/docs/ru/docs/advanced/response-change-status-code.md +++ b/docs/ru/docs/advanced/response-change-status-code.md @@ -1,6 +1,6 @@ # Response - Đ˜Đ·ĐŒĐ”ĐœĐ”ĐœĐžĐ” статус-ĐșĐŸĐŽĐ° { #response-change-status-code } -Вы, ĐČĐ”Ń€ĐŸŃŃ‚ĐœĐŸ, ужД чОталО ĐŸ Ń‚ĐŸĐŒ, Ń‡Ń‚ĐŸ ĐŒĐŸĐ¶ĐœĐŸ ŃƒŃŃ‚Đ°ĐœĐŸĐČоть [статус-ĐșĐŸĐŽ ĐŸŃ‚ĐČДта ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ](../tutorial/response-status-code.md). +Вы, ĐČĐ”Ń€ĐŸŃŃ‚ĐœĐŸ, ужД чОталО ĐŸ Ń‚ĐŸĐŒ, Ń‡Ń‚ĐŸ ĐŒĐŸĐ¶ĐœĐŸ ŃƒŃŃ‚Đ°ĐœĐŸĐČоть [статус-ĐșĐŸĐŽ ĐŸŃ‚ĐČДта](../tutorial/response-status-code.md) ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ. ĐĐŸ ĐČ ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Ń… ŃĐ»ŃƒŃ‡Đ°ŃŃ… ĐœŃƒĐ¶ĐœĐŸ ĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ ĐŽŃ€ŃƒĐłĐŸĐč статус-ĐșĐŸĐŽ, ĐŸŃ‚Đ»ĐžŃ‡ĐœŃ‹Đč ĐŸŃ‚ Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ. @@ -16,7 +16,7 @@ ## Đ˜ŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° `Response` { #use-a-response-parameter } -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ топа `Response` ĐČ ĐČашДĐč *Ń„ŃƒĐœĐșцоо ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐž путо* (ĐșаĐș Đž ĐŽĐ»Ń cookies Đž HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐŸĐČ). +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ топа `Response` ĐČ ĐČашДĐč *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐ” путо* (ĐșаĐș Đž ĐŽĐ»Ń cookies Đž HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐŸĐČ). И Đ·Đ°Ń‚Đ”ĐŒ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃƒŃŃ‚Đ°ĐœĐŸĐČоть `status_code` ĐČ ŃŃ‚ĐŸĐŒ *ĐČŃ€Đ”ĐŒĐ”ĐœĐœĐŸĐŒ* ĐŸĐ±ŃŠĐ”ĐșтД ĐŸŃ‚ĐČДта. diff --git a/docs/ru/docs/advanced/response-cookies.md b/docs/ru/docs/advanced/response-cookies.md index 2adc1af85..3e16fe892 100644 --- a/docs/ru/docs/advanced/response-cookies.md +++ b/docs/ru/docs/advanced/response-cookies.md @@ -1,5 +1,6 @@ # Cookies ĐČ ĐŸŃ‚ĐČДтД { #response-cookies } + ## Đ˜ŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° `Response` { #use-a-response-parameter } Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ топа `Response` ĐČ ĐČашДĐč Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐ” путо. diff --git a/docs/ru/docs/advanced/response-headers.md b/docs/ru/docs/advanced/response-headers.md index 806b89e1f..e0cfa66ed 100644 --- a/docs/ru/docs/advanced/response-headers.md +++ b/docs/ru/docs/advanced/response-headers.md @@ -2,7 +2,7 @@ ## Đ˜ŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `Response` { #use-a-response-parameter } -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ топа `Response` ĐČ ĐČашДĐč Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐ” путо (ĐșаĐș ĐŒĐŸĐ¶ĐœĐŸ ŃĐŽĐ”Đ»Đ°Ń‚ŃŒ Đž ĐŽĐ»Ń cookie). +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ топа `Response` ĐČ ĐČашДĐč *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐ” путо* (ĐșаĐș ĐŒĐŸĐ¶ĐœĐŸ ŃĐŽĐ”Đ»Đ°Ń‚ŃŒ Đž ĐŽĐ»Ń cookie). А Đ·Đ°Ń‚Đ”ĐŒ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃƒŃŃ‚Đ°ĐœĐ°ĐČлОĐČать HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž ĐČ ŃŃ‚ĐŸĐŒ *ĐČŃ€Đ”ĐŒĐ”ĐœĐœĐŸĐŒ* ĐŸĐ±ŃŠĐ”ĐșтД ĐŸŃ‚ĐČДта. @@ -14,13 +14,13 @@ **FastAPI** ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ ŃŃ‚ĐŸŃ‚ *ĐČŃ€Đ”ĐŒĐ”ĐœĐœŃ‹Đč* ĐŸŃ‚ĐČДт, Ń‡Ń‚ĐŸĐ±Ń‹ ОзĐČĐ»Đ”Ń‡ŃŒ HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž (а таĐșжД cookie Đž статус-ĐșĐŸĐŽ) Đž ĐżĐŸĐŒĐ”ŃŃ‚ĐžŃ‚ ох ĐČ Ń„ĐžĐœĐ°Đ»ŃŒĐœŃ‹Đč HTTP-ĐŸŃ‚ĐČДт, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ŃĐŸĐŽĐ”Ń€Đ¶ĐžŃ‚ ĐČĐŸĐ·ĐČŃ€Đ°Ń‰Ń‘ĐœĐœĐŸĐ” ĐČĐ°ĐŒĐž Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”, ĐŸŃ‚Ń„ĐžĐ»ŃŒŃ‚Ń€ĐŸĐČĐ°ĐœĐœĐŸĐ” ŃĐŸĐłĐ»Đ°ŃĐœĐŸ `response_model`. -Вы таĐșжД ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `Response` ĐČ Đ·Đ°ĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŃ… Đž ŃƒŃŃ‚Đ°ĐœĐ°ĐČлОĐČать ĐČ ĐœĐžŃ… Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž (Đž cookie). +Вы таĐșжД ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `Response` ĐČ Đ·Đ°ĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŃ… Đž ŃƒŃŃ‚Đ°ĐœĐ°ĐČлОĐČать ĐČ ĐœĐžŃ… HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž (Đž cookie). ## Đ’Đ”Ń€ĐœŃƒŃ‚ŃŒ `Response` ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ { #return-a-response-directly } Вы таĐșжД ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽĐŸĐ±Đ°ĐČоть HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž, ĐșĐŸĐłĐŽĐ° ĐČĐŸĐ·ĐČращаДтД `Response` ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ. -ĐĄĐŸĐ·ĐŽĐ°ĐčтД ĐŸŃ‚ĐČДт, ĐșаĐș ĐŸĐżĐžŃĐ°ĐœĐŸ ĐČ [Đ’Đ”Ń€ĐœŃƒŃ‚ŃŒ Response ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ](response-directly.md), Đž пДрДЎаĐčтД Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž ĐșаĐș ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đč ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€: +ĐĄĐŸĐ·ĐŽĐ°ĐčтД ĐŸŃ‚ĐČДт, ĐșаĐș ĐŸĐżĐžŃĐ°ĐœĐŸ ĐČ [Đ’Đ”Ń€ĐœŃƒŃ‚ŃŒ Response ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ](response-directly.md), Đž пДрДЎаĐčтД HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž ĐșаĐș ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đč ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€: {* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *} @@ -30,12 +30,12 @@ **FastAPI** ĐżŃ€Đ”ĐŽĐŸŃŃ‚Đ°ĐČĐ»ŃĐ”Ń‚ тД жД ŃĐ°ĐŒŃ‹Đ” `starlette.responses` ĐșаĐș `fastapi.responses` — ĐŽĐ»Ń ĐČĐ°ŃˆĐ”ĐłĐŸ ŃƒĐŽĐŸĐ±ŃŃ‚ĐČа ĐșаĐș Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа. ĐĐŸ Đ±ĐŸĐ»ŃŒŃˆĐžĐœŃŃ‚ĐČĐŸ ĐŽĐŸŃŃ‚ŃƒĐżĐœŃ‹Ń… ĐșĐ»Đ°ŃŃĐŸĐČ ĐŸŃ‚ĐČĐ”Ń‚ĐŸĐČ ĐżĐŸŃŃ‚ŃƒĐżĐ°ŃŽŃ‚ ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ Оз Starlette. -И ĐżĐŸŃĐșĐŸĐ»ŃŒĐșу `Response` Ń‡Đ°ŃŃ‚ĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ŃŃ ĐŽĐ»Ń ŃƒŃŃ‚Đ°ĐœĐŸĐČĐșĐž Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐŸĐČ Đž cookie, **FastAPI** таĐșжД ĐżŃ€Đ”ĐŽĐŸŃŃ‚Đ°ĐČĐ»ŃĐ”Ń‚ Đ”ĐłĐŸ ĐșаĐș `fastapi.Response`. +И ĐżĐŸŃĐșĐŸĐ»ŃŒĐșу `Response` Ń‡Đ°ŃŃ‚ĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ŃŃ ĐŽĐ»Ń ŃƒŃŃ‚Đ°ĐœĐŸĐČĐșĐž HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐŸĐČ Đž cookie, **FastAPI** таĐșжД ĐżŃ€Đ”ĐŽĐŸŃŃ‚Đ°ĐČĐ»ŃĐ”Ń‚ Đ”ĐłĐŸ ĐșаĐș `fastapi.Response`. /// ## ĐŸĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșОД HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž { #custom-headers } -ĐŸĐŸĐŒĐœĐžŃ‚Đ”, Ń‡Ń‚ĐŸ ŃĐŸĐ±ŃŃ‚ĐČĐ”ĐœĐœŃ‹Đ” ĐżŃ€ĐŸĐżŃ€ĐžĐ”Ń‚Đ°Ń€ĐœŃ‹Đ” Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž ĐŒĐŸĐ¶ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČĐ»ŃŃ‚ŃŒ, [ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ прДфОĐșс `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). +ĐŸĐŸĐŒĐœĐžŃ‚Đ”, Ń‡Ń‚ĐŸ ŃĐŸĐ±ŃŃ‚ĐČĐ”ĐœĐœŃ‹Đ” ĐżŃ€ĐŸĐżŃ€ĐžĐ”Ń‚Đ°Ń€ĐœŃ‹Đ” HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž ĐŒĐŸĐ¶ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČĐ»ŃŃ‚ŃŒ, [ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ прДфОĐșс `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -ĐĐŸ ДслО у ĐČас Đ”ŃŃ‚ŃŒ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșОД Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐżĐŸĐșазыĐČать ĐșĐ»ĐžĐ”ĐœŃ‚Ńƒ ĐČ Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Đ”, ĐČĐ°ĐŒ ĐœŃƒĐ¶ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČоть ох ĐČ ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐž CORS (ĐżĐŸĐŽŃ€ĐŸĐ±ĐœĐ”Đ” ŃĐŒ. ĐČ [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `expose_headers`, ĐŸĐżĐžŃĐ°ĐœĐœŃ‹Đč ĐČ [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž Starlette ĐżĐŸ CORS](https://www.starlette.dev/middleware/#corsmiddleware). +ĐĐŸ ДслО у ĐČас Đ”ŃŃ‚ŃŒ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșОД HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐżĐŸĐșазыĐČать ĐșĐ»ĐžĐ”ĐœŃ‚Ńƒ ĐČ Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Đ”, ĐČĐ°ĐŒ ĐœŃƒĐ¶ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČоть ох ĐČ ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐž CORS (ĐżĐŸĐŽŃ€ĐŸĐ±ĐœĐ”Đ” ŃĐŒ. ĐČ [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `expose_headers`, ĐŸĐżĐžŃĐ°ĐœĐœŃ‹Đč ĐČ [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž Starlette ĐżĐŸ CORS](https://www.starlette.dev/middleware/#corsmiddleware). diff --git a/docs/ru/docs/advanced/security/oauth2-scopes.md b/docs/ru/docs/advanced/security/oauth2-scopes.md index a0b7a185c..7b1731c5d 100644 --- a/docs/ru/docs/advanced/security/oauth2-scopes.md +++ b/docs/ru/docs/advanced/security/oauth2-scopes.md @@ -76,7 +76,7 @@ OAuth2 ŃĐŸ scopes — ŃŃ‚ĐŸ ĐŒĐ”Ń…Đ°ĐœĐžĐ·ĐŒ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐžŃĐżĐŸĐ»ŃŒĐ·Ńƒ йаĐș ĐșаĐș Ń‚Đ”ĐżĐ”Ń€ŃŒ ĐŒŃ‹ ĐŸĐ±ŃŠŃĐČĐ»ŃĐ”ĐŒ это scopes, ĐŸĐœĐž ĐżĐŸŃĐČятся ĐČ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž API про ĐČŃ…ĐŸĐŽĐ”/аĐČŃ‚ĐŸŃ€ĐžĐ·Đ°Ń†ĐžĐž. -И ĐČы ŃĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČŃ‹Đ±Ń€Đ°Ń‚ŃŒ, ĐșаĐșОД scopes ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐČыЮать ĐŽĐŸŃŃ‚ŃƒĐż: `me` Đž `items`. +И ĐČы ŃĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČŃ‹Đ±Ń€Đ°Ń‚ŃŒ, ĐŽĐ»Ń ĐșаĐșох scopes Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐżŃ€Đ”ĐŽĐŸŃŃ‚Đ°ĐČоть ĐŽĐŸŃŃ‚ŃƒĐż: `me` Đž `items`. Đ­Ń‚ĐŸ Ń‚ĐŸŃ‚ жД ĐŒĐ”Ń…Đ°ĐœĐžĐ·ĐŒ, ĐșĐŸĐłĐŽĐ° ĐČы ЎаётД Ń€Đ°Đ·Ń€Đ”ŃˆĐ”ĐœĐžŃ про ĐČŃ…ĐŸĐŽĐ” чДрДз Facebook, Google, GitHub Đž т.ĐŽ.: @@ -100,7 +100,7 @@ OAuth2 ŃĐŸ scopes — ŃŃ‚ĐŸ ĐŒĐ”Ń…Đ°ĐœĐžĐ·ĐŒ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐžŃĐżĐŸĐ»ŃŒĐ·Ńƒ {* ../../docs_src/security/tutorial005_an_py310.py hl[157] *} -## ĐžĐ±ŃŠŃĐČĐ»Đ”ĐœĐžĐ” scopes ĐČ *ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșах ĐżŃƒŃ‚Đ”Đč* Đž заĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŃ… { #declare-scopes-in-path-operations-and-dependencies } +## ĐžĐ±ŃŠŃĐČĐ»Đ”ĐœĐžĐ” scopes ĐČ *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃŃ… путо* Đž заĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŃ… { #declare-scopes-in-path-operations-and-dependencies } ĐąĐ”ĐżĐ”Ń€ŃŒ ĐŸĐ±ŃŠŃĐČĐžĐŒ, Ń‡Ń‚ĐŸ ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃ путо ĐŽĐ»Ń `/users/me/items/` Ń‚Ń€Đ”Đ±ŃƒĐ”Ń‚ scope `items`. diff --git a/docs/ru/docs/advanced/settings.md b/docs/ru/docs/advanced/settings.md index 3ae063340..b85aa3959 100644 --- a/docs/ru/docs/advanced/settings.md +++ b/docs/ru/docs/advanced/settings.md @@ -205,7 +205,7 @@ APP_NAME="ChimichangApp" ### ĐĄĐŸĐ·ĐŽĐ°ĐœĐžĐ” `Settings` Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐŸĐŽĐžĐœ раз с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `lru_cache` { #creating-the-settings-only-once-with-lru-cache } -Đ§Ń‚Đ”ĐœĐžĐ” фаĐčла с ЎОсĐșа ĐŸĐ±Ń‹Ń‡ĐœĐŸ Đ·Đ°Ń‚Ń€Đ°Ń‚ĐœĐ°Ń (ĐŒĐ”ĐŽĐ»Đ”ĐœĐœĐ°Ń) ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃ, ĐżĐŸŃŃ‚ĐŸĐŒŃƒ, ĐČĐ”Ń€ĐŸŃŃ‚ĐœĐŸ, ĐČы Đ·Đ°Ń…ĐŸŃ‚ĐžŃ‚Đ” ŃĐŽĐ”Đ»Đ°Ń‚ŃŒ ŃŃ‚ĐŸ ĐŸĐŽĐžĐœ раз Đž Đ·Đ°Ń‚Đ”ĐŒ ĐżĐ”Ń€Đ”ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐŸĐŽĐžĐœ Đž Ń‚ĐŸŃ‚ жД ĐŸĐ±ŃŠĐ”Đșт ĐœĐ°ŃŃ‚Ń€ĐŸĐ”Đș, а ĐœĐ” чотать фаĐčĐ» про ĐșĐ°Đ¶ĐŽĐŸĐŒ Đ·Đ°ĐżŃ€ĐŸŃĐ”. +Đ§Ń‚Đ”ĐœĐžĐ” фаĐčла с ЎОсĐșа ĐŸĐ±Ń‹Ń‡ĐœĐŸ Đ·Đ°Ń‚Ń€Đ°Ń‚ĐœĐ°Ń (ĐŒĐ”ĐŽĐ»Đ”ĐœĐœĐ°Ń) ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃ, ĐżĐŸŃŃ‚ĐŸĐŒŃƒ, ĐČĐ”Ń€ĐŸŃŃ‚ĐœĐŸ, ĐČы Đ·Đ°Ń…ĐŸŃ‚ĐžŃ‚Đ” ŃĐŽĐ”Đ»Đ°Ń‚ŃŒ ŃŃ‚ĐŸ ĐŸĐŽĐžĐœ раз Đž Đ·Đ°Ń‚Đ”ĐŒ ĐżĐ”Ń€Đ”ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐŸĐŽĐžĐœ Đž Ń‚ĐŸŃ‚ жД ĐŸĐ±ŃŠĐ”Đșт ĐœĐ°ŃŃ‚Ń€ĐŸĐ”Đș, а ĐœĐ” чотать фаĐčĐ» про ĐșĐ°Đ¶ĐŽĐŸĐŒ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ”. ĐĐŸ ĐșажЎыĐč раз, ĐșĐŸĐłĐŽĐ° ĐŒŃ‹ ĐŽĐ”Đ»Đ°Đ”ĐŒ: @@ -222,13 +222,13 @@ def get_settings(): return Settings() ``` -ĐŒŃ‹ бы ŃĐŸĐ·ĐŽĐ°ĐČалО ŃŃ‚ĐŸŃ‚ ĐŸĐ±ŃŠĐ”Đșт ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ Đ·Đ°ĐżŃ€ĐŸŃĐ° Đž чОталО фаĐčĐ» `.env` ĐœĐ° ĐșажЎыĐč Đ·Đ°ĐżŃ€ĐŸŃ. ⚠ +ĐŒŃ‹ бы ŃĐŸĐ·ĐŽĐ°ĐČалО ŃŃ‚ĐŸŃ‚ ĐŸĐ±ŃŠĐ”Đșт ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ° Đž чОталО фаĐčĐ» `.env` ĐœĐ° ĐșажЎыĐč HTTP-Đ·Đ°ĐżŃ€ĐŸŃ. ⚠ ĐĐŸ таĐș ĐșаĐș ĐŒŃ‹ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒ ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€ `@lru_cache` сĐČĐ”Ń€Ń…Ńƒ, ĐŸĐ±ŃŠĐ”Đșт `Settings` Đ±ŃƒĐŽĐ”Ń‚ ŃĐŸĐ·ĐŽĐ°Đœ Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐŸĐŽĐžĐœ раз — про пДрĐČĐŸĐŒ ĐČŃ‹Đ·ĐŸĐČĐ”. ✔ {* ../../docs_src/settings/app03_an_py310/main.py hl[1,11] *} -Đ—Đ°Ń‚Đ”ĐŒ про любых ĐżĐŸŃĐ»Đ”ĐŽŃƒŃŽŃ‰ĐžŃ… ĐČŃ‹Đ·ĐŸĐČах `get_settings()` ĐČ Đ·Đ°ĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŃ… ĐŽĐ»Ń ŃĐ»Đ”ĐŽŃƒŃŽŃ‰ĐžŃ… Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ, ĐČĐŒĐ”ŃŃ‚ĐŸ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœĐžŃ ĐČĐœŃƒŃ‚Ń€Đ”ĐœĐœĐ”ĐłĐŸ ĐșĐŸĐŽĐ° `get_settings()` Đž ŃĐŸĐ·ĐŽĐ°ĐœĐžŃ ĐœĐŸĐČĐŸĐłĐŸ ĐŸĐ±ŃŠĐ”Đșта `Settings`, Đ±ŃƒĐŽĐ”Ń‚ ĐČĐŸĐ·ĐČращаться Ń‚ĐŸŃ‚ жД ĐŸĐ±ŃŠĐ”Đșт, Ń‡Ń‚ĐŸ был ĐČĐŸĐ·ĐČŃ€Đ°Ń‰Đ”Đœ про пДрĐČĐŸĐŒ ĐČŃ‹Đ·ĐŸĐČĐ”, ŃĐœĐŸĐČа Đž ŃĐœĐŸĐČа. +Đ—Đ°Ń‚Đ”ĐŒ про любых ĐżĐŸŃĐ»Đ”ĐŽŃƒŃŽŃ‰ĐžŃ… ĐČŃ‹Đ·ĐŸĐČах `get_settings()` ĐČ Đ·Đ°ĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŃ… ĐŽĐ»Ń ŃĐ»Đ”ĐŽŃƒŃŽŃ‰ĐžŃ… HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ, ĐČĐŒĐ”ŃŃ‚ĐŸ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœĐžŃ ĐČĐœŃƒŃ‚Ń€Đ”ĐœĐœĐ”ĐłĐŸ ĐșĐŸĐŽĐ° `get_settings()` Đž ŃĐŸĐ·ĐŽĐ°ĐœĐžŃ ĐœĐŸĐČĐŸĐłĐŸ ĐŸĐ±ŃŠĐ”Đșта `Settings`, Đ±ŃƒĐŽĐ”Ń‚ ĐČĐŸĐ·ĐČращаться Ń‚ĐŸŃ‚ жД ĐŸĐ±ŃŠĐ”Đșт, Ń‡Ń‚ĐŸ был ĐČĐŸĐ·ĐČŃ€Đ°Ń‰Đ”Đœ про пДрĐČĐŸĐŒ ĐČŃ‹Đ·ĐŸĐČĐ”, ŃĐœĐŸĐČа Đž ŃĐœĐŸĐČа. #### ĐąĐ”Ń…ĐœĐžŃ‡Đ”ŃĐșОД ЎДталО `lru_cache` { #lru-cache-technical-details } @@ -299,4 +299,4 @@ participant execute as Execute function * Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ заĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŒ, ĐČы ŃƒĐżŃ€ĐŸŃ‰Đ°Đ”Ń‚Đ” Ń‚Đ”ŃŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐžĐ”. * ĐœĐŸĐ¶ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать фаĐčлы `.env`. -* `@lru_cache` ĐżĐŸĐ·ĐČĐŸĐ»ŃĐ”Ń‚ ĐœĐ” чотать фаĐčĐ» dotenv ŃĐœĐŸĐČа Đž ŃĐœĐŸĐČа ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ Đ·Đ°ĐżŃ€ĐŸŃĐ°, про ŃŃ‚ĐŸĐŒ ЎаĐČая ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ ĐżĐ”Ń€Đ”ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ŃŃ‚ŃŒ Đ”ĐłĐŸ ĐČĐŸ ĐČŃ€Đ”ĐŒŃ Ń‚Đ”ŃŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐžŃ. +* `@lru_cache` ĐżĐŸĐ·ĐČĐŸĐ»ŃĐ”Ń‚ ĐœĐ” чотать фаĐčĐ» dotenv ŃĐœĐŸĐČа Đž ŃĐœĐŸĐČа ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°, про ŃŃ‚ĐŸĐŒ ЎаĐČая ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ ĐżĐ”Ń€Đ”ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ŃŃ‚ŃŒ Đ”ĐłĐŸ ĐČĐŸ ĐČŃ€Đ”ĐŒŃ Ń‚Đ”ŃŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐžŃ. diff --git a/docs/ru/docs/advanced/stream-data.md b/docs/ru/docs/advanced/stream-data.md index 9ae6890a5..d6957a6cf 100644 --- a/docs/ru/docs/advanced/stream-data.md +++ b/docs/ru/docs/advanced/stream-data.md @@ -2,7 +2,7 @@ ЕслО ĐČĐ°ĐŒ ĐœŃƒĐ¶ĐœĐŸ пДрДЎаĐČать ĐżĐŸŃ‚ĐŸĐșĐŸĐČыД ĐŽĐ°ĐœĐœŃ‹Đ”, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐŒĐŸĐ¶ĐœĐŸ прДЎстаĐČоть ĐșаĐș JSON, ĐČĐŸŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčŃ‚Đ”ŃŃŒ [ŃŃ‚Ń€ĐžĐŒĐžĐœĐłĐŸĐŒ JSON Lines](../tutorial/stream-json-lines.md). -ĐĐŸ ДслО ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” пДрДЎаĐČать ĐČ ĐżĐŸŃ‚ĐŸĐșĐ” чОстыД Đ±ĐžĐœĐ°Ń€ĐœŃ‹Đ” ĐŽĐ°ĐœĐœŃ‹Đ” ОлО ŃŃ‚Ń€ĐŸĐșĐž, ĐœĐžĐ¶Đ” ĐżĐŸĐșĐ°Đ·Đ°ĐœĐŸ, ĐșаĐș ŃŃ‚ĐŸ ŃĐŽĐ”Đ»Đ°Ń‚ŃŒ. +ĐĐŸ ДслО ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” пДрДЎаĐČать ĐČ ĐżĐŸŃ‚ĐŸĐșĐ” **чОстыД Đ±ĐžĐœĐ°Ń€ĐœŃ‹Đ” ĐŽĐ°ĐœĐœŃ‹Đ”** ОлО ŃŃ‚Ń€ĐŸĐșĐž, ĐœĐžĐ¶Đ” ĐżĐŸĐșĐ°Đ·Đ°ĐœĐŸ, ĐșаĐș ŃŃ‚ĐŸ ŃĐŽĐ”Đ»Đ°Ń‚ŃŒ. /// note | ĐŸŃ€ĐžĐŒĐ”Ń‡Đ°ĐœĐžĐ” @@ -40,7 +40,7 @@ FastAPI Đ±ŃƒĐŽĐ”Ń‚ пДрДЎаĐČать ĐșажЎыĐč Ń‡Đ°ĐœĐș ĐŽĐ°ĐœĐœŃ‹Ń… ĐČ `S {* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} -Đ­Ń‚ĐŸ таĐșжД ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚, Ń‡Ń‚ĐŸ с `StreamingResponse` у ĐČас Đ”ŃŃ‚ŃŒ Đž сĐČĐŸĐ±ĐŸĐŽĐ°, Đž ĐŸŃ‚ĐČДтстĐČĐ”ĐœĐœĐŸŃŃ‚ŃŒ — ĐżŃ€ĐŸĐžĐ·ĐČĐŸĐŽĐžŃ‚ŃŒ Đž ĐșĐŸĐŽĐžŃ€ĐŸĐČать баĐčты ĐŽĐ°ĐœĐœŃ‹Ń… Ń€ĐŸĐČĐœĐŸ ĐČ Ń‚ĐŸĐŒ ĐČОЎД, ĐČ ĐșĐŸŃ‚ĐŸŃ€ĐŸĐŒ ĐŸĐœĐž ĐŽĐŸĐ»Đ¶ĐœŃ‹ Đ±Ń‹Ń‚ŃŒ ĐŸŃ‚ĐżŃ€Đ°ĐČĐ»Đ”ĐœŃ‹, ĐœĐ”Đ·Đ°ĐČĐžŃĐžĐŒĐŸ ĐŸŃ‚ Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžĐč Ń‚ĐžĐżĐŸĐČ. đŸ€“ +Đ­Ń‚ĐŸ таĐșжД ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚, Ń‡Ń‚ĐŸ с `StreamingResponse` у ĐČас Đ”ŃŃ‚ŃŒ Đž **сĐČĐŸĐ±ĐŸĐŽĐ°**, Đž **ĐŸŃ‚ĐČДтстĐČĐ”ĐœĐœĐŸŃŃ‚ŃŒ** — ĐżŃ€ĐŸĐžĐ·ĐČĐŸĐŽĐžŃ‚ŃŒ Đž ĐșĐŸĐŽĐžŃ€ĐŸĐČать баĐčты ĐŽĐ°ĐœĐœŃ‹Ń… Ń€ĐŸĐČĐœĐŸ ĐČ Ń‚ĐŸĐŒ ĐČОЎД, ĐČ ĐșĐŸŃ‚ĐŸŃ€ĐŸĐŒ ĐŸĐœĐž ĐŽĐŸĐ»Đ¶ĐœŃ‹ Đ±Ń‹Ń‚ŃŒ ĐŸŃ‚ĐżŃ€Đ°ĐČĐ»Đ”ĐœŃ‹, ĐœĐ”Đ·Đ°ĐČĐžŃĐžĐŒĐŸ ĐŸŃ‚ Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžĐč Ń‚ĐžĐżĐŸĐČ. đŸ€“ ### ĐŸĐŸŃ‚ĐŸĐșĐŸĐČая пДрДЎача баĐčŃ‚ĐŸĐČ { #stream-bytes } diff --git a/docs/ru/docs/advanced/wsgi.md b/docs/ru/docs/advanced/wsgi.md index d62133c73..99ba50938 100644 --- a/docs/ru/docs/advanced/wsgi.md +++ b/docs/ru/docs/advanced/wsgi.md @@ -14,7 +14,7 @@ ĐŃƒĐ¶ĐœĐŸ ĐžĐŒĐżĐŸŃ€Ń‚ĐžŃ€ĐŸĐČать `WSGIMiddleware` Оз `a2wsgi`. -Đ—Đ°Ń‚Đ”ĐŒ ĐŸĐ±Đ”Ń€ĐœĐžŃ‚Đ” WSGIâ€‘ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, Flask) ĐČ middleware (ĐŸŃ€ĐŸĐŒĐ”Đ¶ŃƒŃ‚ĐŸŃ‡ĐœŃ‹Đč ŃĐ»ĐŸĐč). +Đ—Đ°Ń‚Đ”ĐŒ ĐŸĐ±Đ”Ń€ĐœĐžŃ‚Đ” WSGIâ€‘ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, Flask) ĐČ middleware (ĐżŃ€ĐŸĐŒĐ”Đ¶ŃƒŃ‚ĐŸŃ‡ĐœŃ‹Đč ŃĐ»ĐŸĐč). ĐŸĐŸŃĐ»Đ” ŃŃ‚ĐŸĐłĐŸ ŃĐŒĐŸĐœŃ‚ĐžŃ€ŃƒĐčтД Đ”ĐłĐŸ ĐœĐ° путь. @@ -26,7 +26,7 @@ Đ’ĐŒĐ”ŃŃ‚ĐŸ ĐœĐ”ĐłĐŸ рДĐșĐŸĐŒĐ”ĐœĐŽŃƒĐ”Ń‚ŃŃ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать паĐșДт `a2wsgi`. Đ˜ŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ” ĐŸŃŃ‚Đ°Ń‘Ń‚ŃŃ таĐșĐžĐŒ жД. -ĐŸŃ€ĐŸŃŃ‚ĐŸ ŃƒĐ±Đ”ĐŽĐžŃ‚Đ”ŃŃŒ, Ń‡Ń‚ĐŸ паĐșДт `a2wsgi` ŃƒŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”Đœ, Đž ĐžĐŒĐżĐŸŃ€Ń‚ĐžŃ€ŃƒĐčтД `WSGIMiddleware` Оз `a2wsgi`. +ĐŸŃ€ĐŸŃŃ‚ĐŸ ŃƒĐ±Đ”ĐŽĐžŃ‚Đ”ŃŃŒ, Ń‡Ń‚ĐŸ паĐșДт `a2wsgi` ŃƒŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”Đœ, Đž праĐČĐžĐ»ŃŒĐœĐŸ ĐžĐŒĐżĐŸŃ€Ń‚ĐžŃ€ŃƒĐčтД `WSGIMiddleware` Оз `a2wsgi`. /// diff --git a/docs/ru/docs/alternatives.md b/docs/ru/docs/alternatives.md index 13f099da8..e1b8e277d 100644 --- a/docs/ru/docs/alternatives.md +++ b/docs/ru/docs/alternatives.md @@ -20,7 +20,7 @@ ĐžĐœ ĐŸŃ‚ĐœĐŸŃĐžŃ‚Đ”Đ»ŃŒĐœĐŸ Ń‚Đ”ŃĐœĐŸ сĐČŃĐ·Đ°Đœ с Ń€Đ”Đ»ŃŃ†ĐžĐŸĐœĐœŃ‹ĐŒĐž Đ±Đ°Đ·Đ°ĐŒĐž ĐŽĐ°ĐœĐœŃ‹Ń… (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, MySQL ОлО PostgreSQL), ĐżĐŸŃŃ‚ĐŸĐŒŃƒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать NoSQL-базу ĐŽĐ°ĐœĐœŃ‹Ń… (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, Couchbase, MongoDB, Cassandra Đž т. Đż.) ĐČ ĐșачДстĐČĐ” ĐŸŃĐœĐŸĐČĐœĐŸĐłĐŸ Ń…Ń€Đ°ĐœĐžĐ»ĐžŃ‰Đ° ĐœĐ” ĐŸŃ‡Đ”ĐœŃŒ ĐżŃ€ĐŸŃŃ‚ĐŸ. -ĐžĐœ был ŃĐŸĐ·ĐŽĐ°Đœ ĐŽĐ»Ń ĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžĐž HTML ĐœĐ° Đ±ŃĐșĐ”ĐœĐŽĐ”, а ĐœĐ” ĐŽĐ»Ń ŃĐŸĐ·ĐŽĐ°ĐœĐžŃ API, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒŃ‹Ń… ŃĐŸĐČŃ€Đ”ĐŒĐ”ĐœĐœŃ‹ĐŒ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐŸĐŒ (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, React, Vue.js Đž Angular) ОлО ĐŽŃ€ŃƒĐłĐžĐŒĐž ŃĐžŃŃ‚Đ”ĐŒĐ°ĐŒĐž (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ŃƒŃŃ‚Ń€ĐŸĐčстĐČĐ°ĐŒĐž IoT), ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” с ĐœĐžĐŒ ĐŸĐ±Ń‰Đ°ŃŽŃ‚ŃŃ. +ĐžĐœ был ŃĐŸĐ·ĐŽĐ°Đœ ĐŽĐ»Ń ĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžĐž HTML ĐœĐ° Đ±ŃĐșĐ”ĐœĐŽĐ”, а ĐœĐ” ĐŽĐ»Ń ŃĐŸĐ·ĐŽĐ°ĐœĐžŃ API, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒŃ‹Ń… ŃĐŸĐČŃ€Đ”ĐŒĐ”ĐœĐœŃ‹ĐŒ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐŸĐŒ (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, React, Vue.js Đž Angular) ОлО ĐŽŃ€ŃƒĐłĐžĐŒĐž ŃĐžŃŃ‚Đ”ĐŒĐ°ĐŒĐž (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ŃƒŃŃ‚Ń€ĐŸĐčстĐČĐ°ĐŒĐž IoT), ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” с ĐœĐžĐŒ ĐŸĐ±Ń‰Đ°ŃŽŃ‚ŃŃ. ### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework } @@ -88,7 +88,7 @@ Requests ĐžĐŒĐ”Đ”Ń‚ ĐŸŃ‡Đ”ĐœŃŒ ĐżŃ€ĐŸŃŃ‚ĐŸĐč Đž ĐżĐŸĐœŃŃ‚ĐœŃ‹Đč ЎОзаĐčĐœ, response = requests.get("http://example.com/some/url") ``` -ĐĄĐŸĐŸŃ‚ĐČДтстĐČующая ĐČ FastAPI API-ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃ путо ĐŒĐŸĐłĐ»Đ° бы ĐČŃ‹ĐłĐ»ŃĐŽĐ”Ń‚ŃŒ таĐș: +ĐĄĐŸĐŸŃ‚ĐČДтстĐČующая ĐČ FastAPI API-*ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃ путо* ĐŒĐŸĐłĐ»Đ° бы ĐČŃ‹ĐłĐ»ŃĐŽĐ”Ń‚ŃŒ таĐș: ```Python hl_lines="1" @app.get("/some/url") diff --git a/docs/ru/docs/async.md b/docs/ru/docs/async.md index e2b98bd61..aba77a96b 100644 --- a/docs/ru/docs/async.md +++ b/docs/ru/docs/async.md @@ -12,7 +12,7 @@ results = await some_library() ``` -ĐąĐŸĐłĐŽĐ° ĐŸĐ±ŃŠŃĐČĐ»ŃĐčтД *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐČ ĐżŃƒŃ‚Đž* с `async def`, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: +ĐąĐŸĐłĐŽĐ° ĐŸĐ±ŃŠŃĐČĐ»ŃĐčтД *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž путо* с `async def`, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: ```Python hl_lines="2" @app.get('/') @@ -29,7 +29,7 @@ async def read_results(): --- -ЕслО ĐČы ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚Đ” ŃŃ‚ĐŸŃ€ĐŸĐœĐœŃŽŃŽ Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșу, ĐșĐŸŃ‚ĐŸŃ€Đ°Ń ĐČĐ·Đ°ĐžĐŒĐŸĐŽĐ”ĐčстĐČŃƒĐ”Ń‚ с Ń‡Đ”ĐŒ-Ń‚ĐŸ (база ĐŽĐ°ĐœĐœŃ‹Ń…, API, фаĐčĐ»ĐŸĐČая ŃĐžŃŃ‚Đ”ĐŒĐ° Đž т.ĐŽ.) Đž ĐœĐ” ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČаДт ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ” `await` (сДĐčчас ŃŃ‚ĐŸ ĐŸŃ‚ĐœĐŸŃĐžŃ‚ŃŃ Đș Đ±ĐŸĐ»ŃŒŃˆĐžĐœŃŃ‚ĐČу Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đș ĐŽĐ»Ń БД), Ń‚ĐŸĐłĐŽĐ° ĐŸĐ±ŃŠŃĐČĐ»ŃĐčтД *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐČ ĐżŃƒŃ‚Đž* ĐșаĐș ĐŸĐ±Ń‹Ń‡ĐœĐŸ, ĐżŃ€ĐŸŃŃ‚ĐŸ с `def`, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: +ЕслО ĐČы ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚Đ” ŃŃ‚ĐŸŃ€ĐŸĐœĐœŃŽŃŽ Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșу, ĐșĐŸŃ‚ĐŸŃ€Đ°Ń ĐČĐ·Đ°ĐžĐŒĐŸĐŽĐ”ĐčстĐČŃƒĐ”Ń‚ с Ń‡Đ”ĐŒ-Ń‚ĐŸ (база ĐŽĐ°ĐœĐœŃ‹Ń…, API, фаĐčĐ»ĐŸĐČая ŃĐžŃŃ‚Đ”ĐŒĐ° Đž т.ĐŽ.) Đž ĐœĐ” ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČаДт ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ” `await` (сДĐčчас ŃŃ‚ĐŸ ĐŸŃ‚ĐœĐŸŃĐžŃ‚ŃŃ Đș Đ±ĐŸĐ»ŃŒŃˆĐžĐœŃŃ‚ĐČу Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đș ĐŽĐ»Ń БД), Ń‚ĐŸĐłĐŽĐ° ĐŸĐ±ŃŠŃĐČĐ»ŃĐčтД *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž путо* ĐșаĐș ĐŸĐ±Ń‹Ń‡ĐœĐŸ, ĐżŃ€ĐŸŃŃ‚ĐŸ с `def`, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: ```Python hl_lines="2" @app.get('/') @@ -48,7 +48,7 @@ def results(): --- -**ĐŸŃ€ĐžĐŒĐ”Ń‡Đ°ĐœĐžĐ”**: ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃĐŒĐ”ŃˆĐžĐČать `def` Đž `async def` ĐČ *Ń„ŃƒĐœĐșцоях-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐČ ĐżŃƒŃ‚Đž* ŃŃ‚ĐŸĐ»ŃŒĐșĐŸ, сĐșĐŸĐ»ŃŒĐșĐŸ ĐœŃƒĐ¶ĐœĐŸ, Đž ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ ĐșĐ°Đ¶ĐŽŃƒŃŽ таĐș, ĐșаĐș Đ»ŃƒŃ‡ŃˆĐ” ĐŽĐ»Ń ĐČĐ°ŃˆĐ”ĐłĐŸ ŃĐ»ŃƒŃ‡Đ°Ń. FastAPI сЎДлаДт с ĐœĐžĐŒĐž ĐČсё ĐșаĐș ĐœĐ°ĐŽĐŸ. +**ĐŸŃ€ĐžĐŒĐ”Ń‡Đ°ĐœĐžĐ”**: ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃĐŒĐ”ŃˆĐžĐČать `def` Đž `async def` ĐČ *Ń„ŃƒĐœĐșцоях-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșах путо* ŃŃ‚ĐŸĐ»ŃŒĐșĐŸ, сĐșĐŸĐ»ŃŒĐșĐŸ ĐœŃƒĐ¶ĐœĐŸ, Đž ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ ĐșĐ°Đ¶ĐŽŃƒŃŽ таĐș, ĐșаĐș Đ»ŃƒŃ‡ŃˆĐ” ĐŽĐ»Ń ĐČĐ°ŃˆĐ”ĐłĐŸ ŃĐ»ŃƒŃ‡Đ°Ń. FastAPI сЎДлаДт с ĐœĐžĐŒĐž ĐČсё ĐșаĐș ĐœĐ°ĐŽĐŸ. В Đ»ŃŽĐ±ĐŸĐŒ Оз ŃĐ»ŃƒŃ‡Đ°Đ”ĐČ ĐČŃ‹ŃˆĐ” FastAPI ĐČсё раĐČĐœĐŸ Ń€Đ°Đ±ĐŸŃ‚Đ°Đ”Ń‚ Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸ Đž ĐŸŃ‡Đ”ĐœŃŒ Đ±Ń‹ŃŃ‚Ń€ĐŸ. @@ -249,7 +249,7 @@ def results(): Đ˜ĐŒĐ”ĐœĐœĐŸ таĐșая Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸŃŃ‚ŃŒ сЎДлала NodeJS ĐżĐŸĐżŃƒĐ»ŃŃ€ĐœŃ‹ĐŒ (Ń…ĐŸŃ‚Ń NodeJS — ĐœĐ” ĐżĐ°Ń€Đ°Đ»Đ»Đ”Đ»ŃŒĐœŃ‹Đč), Đž ŃŃ‚ĐŸ ŃĐžĐ»ŃŒĐœĐ°Ń ŃŃ‚ĐŸŃ€ĐŸĐœĐ° Go ĐșаĐș ŃĐ·Ń‹Đșа ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžŃ. -ĐąĐŸĐłĐŸ жД ŃƒŃ€ĐŸĐČĐœŃ ĐżŃ€ĐŸĐžĐ·ĐČĐŸĐŽĐžŃ‚Đ”Đ»ŃŒĐœĐŸŃŃ‚Đž ĐČы ĐżĐŸĐ»ŃƒŃ‡Đ°Đ”Ń‚Đ” с **FastAPI**. +ĐąĐŸŃ‚ жД ŃƒŃ€ĐŸĐČĐ”ĐœŃŒ ĐżŃ€ĐŸĐžĐ·ĐČĐŸĐŽĐžŃ‚Đ”Đ»ŃŒĐœĐŸŃŃ‚Đž ĐČы ĐżĐŸĐ»ŃƒŃ‡Đ°Đ”Ń‚Đ” с **FastAPI**. А таĐș ĐșаĐș ĐŒĐŸĐ¶ĐœĐŸ ĐŸĐŽĐœĐŸĐČŃ€Đ”ĐŒĐ”ĐœĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐżĐ°Ń€Đ°Đ»Đ»Đ”Đ»ĐžĐ·ĐŒ Đž Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸŃŃ‚ŃŒ, ĐČы ĐżĐŸĐ»ŃƒŃ‡Đ°Đ”Ń‚Đ” ĐżŃ€ĐŸĐžĐ·ĐČĐŸĐŽĐžŃ‚Đ”Đ»ŃŒĐœĐŸŃŃ‚ŃŒ ĐČŃ‹ŃˆĐ”, Ń‡Đ”ĐŒ у Đ±ĐŸĐ»ŃŒŃˆĐžĐœŃŃ‚ĐČа ĐżŃ€ĐŸŃ‚Đ”ŃŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐœŃ‹Ń… фрДĐčĐŒĐČĐŸŃ€ĐșĐŸĐČ ĐœĐ° NodeJS Đž ĐœĐ° ŃƒŃ€ĐŸĐČĐœĐ” Go, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč — ĐșĐŸĐŒĐżĐžĐ»ĐžŃ€ŃƒĐ”ĐŒŃ‹Đč ŃĐ·Ń‹Đș, блОжД Đș C [(ĐČсё Đ±Đ»Đ°ĐłĐŸĐŽĐ°Ń€Ń Starlette)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1). @@ -340,7 +340,7 @@ burgers = get_burgers(2) --- -ИтаĐș, ДслО ĐČы ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚Đ” Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșу, ĐșĐŸŃ‚ĐŸŃ€ŃƒŃŽ ĐŒĐŸĐ¶ĐœĐŸ ĐČызыĐČать с `await`, ĐČĐ°ĐŒ ĐœŃƒĐ¶ĐœĐŸ ŃĐŸĐ·ĐŽĐ°Ń‚ŃŒ *Ń„ŃƒĐœĐșцою-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș путо*, ĐșĐŸŃ‚ĐŸŃ€Đ°Ń Дё ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚, с `async def`, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: +ИтаĐș, ДслО ĐČы ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚Đ” Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșу, ĐșĐŸŃ‚ĐŸŃ€ŃƒŃŽ ĐŒĐŸĐ¶ĐœĐŸ ĐČызыĐČать с `await`, ĐČĐ°ĐŒ ĐœŃƒĐ¶ĐœĐŸ ŃĐŸĐ·ĐŽĐ°Ń‚ŃŒ *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž путо*, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” Дё ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃŽŃ‚, с `async def`, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: ```Python hl_lines="2-3" @app.get('/burgers') diff --git a/docs/ru/docs/deployment/cloud.md b/docs/ru/docs/deployment/cloud.md index cbd517e36..eb1b49aa5 100644 --- a/docs/ru/docs/deployment/cloud.md +++ b/docs/ru/docs/deployment/cloud.md @@ -1,6 +1,6 @@ # РазĐČДртыĐČĐ°ĐœĐžĐ” FastAPI у ĐŸĐ±Đ»Đ°Ń‡ĐœŃ‹Ń… ĐżŃ€ĐŸĐČаĐčĐŽĐ”Ń€ĐŸĐČ { #deploy-fastapi-on-cloud-providers } -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать праĐșтОчДсĐșĐž Đ»ŃŽĐ±ĐŸĐłĐŸ ĐŸĐ±Đ»Đ°Ń‡ĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐČаĐčЎДра, Ń‡Ń‚ĐŸĐ±Ń‹ разĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ сĐČĐŸĐ” ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” ĐœĐ° FastAPI. +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать праĐșтОчДсĐșĐž **Đ»ŃŽĐ±ĐŸĐłĐŸ ĐŸĐ±Đ»Đ°Ń‡ĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐČаĐčЎДра**, Ń‡Ń‚ĐŸĐ±Ń‹ разĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ сĐČĐŸĐ” ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” ĐœĐ° FastAPI. В Đ±ĐŸĐ»ŃŒŃˆĐžĐœŃŃ‚ĐČĐ” ŃĐ»ŃƒŃ‡Đ°Đ”ĐČ Ńƒ ĐŸŃĐœĐŸĐČĐœŃ‹Ń… ĐŸĐ±Đ»Đ°Ń‡ĐœŃ‹Ń… ĐżŃ€ĐŸĐČаĐčĐŽĐ”Ń€ĐŸĐČ Đ”ŃŃ‚ŃŒ руĐșĐŸĐČĐŸĐŽŃŃ‚ĐČа ĐżĐŸ разĐČДртыĐČĐ°ĐœĐžŃŽ FastAPI ĐœĐ° ох ĐżĐ»Đ°Ń‚Ń„ĐŸŃ€ĐŒĐ”. @@ -16,7 +16,7 @@ FastAPI Cloud — ĐŸŃĐœĐŸĐČĐœĐŸĐč ŃĐżĐŸĐœŃĐŸŃ€ Đž ĐžŃŃ‚ĐŸŃ‡ĐœĐžĐș Ń„ĐžĐœĐ°Đœ ## ĐžĐ±Đ»Đ°Ń‡ĐœŃ‹Đ” ĐżŃ€ĐŸĐČаĐčЎДры — ŃĐżĐŸĐœŃĐŸŃ€Ń‹ { #cloud-providers-sponsors } -ĐĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐŽŃ€ŃƒĐłĐžĐ” ĐŸĐ±Đ»Đ°Ń‡ĐœŃ‹Đ” ĐżŃ€ĐŸĐČаĐčЎДры ✹ [**ŃĐżĐŸĐœŃĐžŃ€ŃƒŃŽŃ‚ FastAPI**](../help-fastapi.md#sponsor-the-author) ✹ Ń‚ĐŸĐ¶Đ”. 🙇 +ĐĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐŽŃ€ŃƒĐłĐžĐ” ĐŸĐ±Đ»Đ°Ń‡ĐœŃ‹Đ” ĐżŃ€ĐŸĐČаĐčЎДры ✹ [**ŃĐżĐŸĐœŃĐžŃ€ŃƒŃŽŃ‚ FastAPI**](https://github.com/sponsors/tiangolo) ✹ Ń‚ĐŸĐ¶Đ”. 🙇 Đ’ĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸ, ĐČы Đ·Đ°Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐżĐŸĐżŃ€ĐŸĐ±ĐŸĐČать ох сДрĐČосы Đž ĐČĐŸŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČаться ох руĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐ°ĐŒĐž: diff --git a/docs/ru/docs/deployment/concepts.md b/docs/ru/docs/deployment/concepts.md index 900b842f9..23c62b8d3 100644 --- a/docs/ru/docs/deployment/concepts.md +++ b/docs/ru/docs/deployment/concepts.md @@ -243,7 +243,7 @@ ĐĐ” Đ±Đ”ŃĐżĐŸĐșĐŸĐčŃ‚Đ”ŃŃŒ, ДслО ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐżŃƒĐœĐșты ĐżŃ€ĐŸ **ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń‹**, Docker ОлО Kubernetes ĐżĐŸĐșа ĐșĐ°Đ¶ŃƒŃ‚ŃŃ ĐœĐ”ĐŸŃ‡Đ”ĐČĐžĐŽĐœŃ‹ĐŒĐž. -ĐŻ рассĐșажу Đ±ĐŸĐ»ŃŒŃˆĐ” ĐżŃ€ĐŸ ĐŸĐ±Ń€Đ°Đ·Ń‹ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ĐŸĐČ, Docker, Kubernetes Đž т.Đż. ĐČ ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”Đč глаĐČĐ”: [FastAPI ĐČĐœŃƒŃ‚Ń€Đž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ĐŸĐČ â€” Docker](docker.md). +ĐŻ рассĐșажу Đ±ĐŸĐ»ŃŒŃˆĐ” ĐżŃ€ĐŸ ĐŸĐ±Ń€Đ°Đ·Ń‹ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ĐŸĐČ, Docker, Kubernetes Đž т.Đż. ĐČ ĐŸĐŽĐœĐŸĐč Оз Đ±ŃƒĐŽŃƒŃ‰ĐžŃ… глаĐČ: [FastAPI ĐČĐœŃƒŃ‚Ń€Đž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ĐŸĐČ â€” Docker](docker.md). /// @@ -281,7 +281,7 @@ /// tip | ĐĄĐŸĐČДт -ĐŻ проĐČДЎу Đ±ĐŸĐ»Đ”Đ” ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœŃ‹Đ” ĐżŃ€ĐžĐŒĐ”Ń€Ń‹ с ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž ĐČ ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”Đč глаĐČĐ”: [FastAPI ĐČĐœŃƒŃ‚Ń€Đž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ĐŸĐČ â€” Docker](docker.md). +ĐŻ проĐČДЎу Đ±ĐŸĐ»Đ”Đ” ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœŃ‹Đ” ĐżŃ€ĐžĐŒĐ”Ń€Ń‹ с ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž ĐČ ĐŸĐŽĐœĐŸĐč Оз Đ±ŃƒĐŽŃƒŃ‰ĐžŃ… глаĐČ: [FastAPI ĐČĐœŃƒŃ‚Ń€Đž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ĐŸĐČ â€” Docker](docker.md). /// @@ -301,9 +301,9 @@ йаĐșжД ĐČĐŸĐ·ĐŒĐŸĐ¶Đ”Đœ **ĐČсплДсĐș** ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžŃ ĐČĐ°ŃˆĐ”ĐłĐŸ API: ĐŸĐœ ĐŒĐŸĐł «ĐČĐ·ĐŸŃ€ĐČĐ°Ń‚ŃŒŃŃÂ» ĐżĐŸ ĐżĐŸĐżŃƒĐ»ŃŃ€ĐœĐŸŃŃ‚Đž, ОлО ĐșаĐșĐžĐ”â€‘Ń‚ĐŸ сДрĐČосы/Đ±ĐŸŃ‚Ń‹ ĐœĐ°Ń‡Đ°Đ»Đž Đ”ĐłĐŸ аĐșтоĐČĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать. На таĐșОД ŃĐ»ŃƒŃ‡Đ°Đž ŃŃ‚ĐŸĐžŃ‚ ĐžĐŒĐ”Ń‚ŃŒ запас Ń€Đ”ŃŃƒŃ€ŃĐŸĐČ. -ĐœĐŸĐ¶ĐœĐŸ Đ·Đ°ĐŽĐ°Ń‚ŃŒ **цДлДĐČĐŸĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”**, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ **ĐŒĐ”Đ¶ĐŽŃƒ 50% Đž 90%** ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžŃ Ń€Đ”ŃŃƒŃ€ŃĐŸĐČ. ĐĄĐșĐŸŃ€Đ”Đ” ĐČŃĐ”ĐłĐŸ, ĐžĐŒĐ”ĐœĐœĐŸ это ĐČДщО ĐČы Đ±ŃƒĐŽĐ”Ń‚Đ” ĐžĐ·ĐŒĐ”Ń€ŃŃ‚ŃŒ Đž ĐœĐ° ох ĐŸŃĐœĐŸĐČĐ” ĐœĐ°ŃŃ‚Ń€Đ°ĐžĐČать разĐČёртыĐČĐ°ĐœĐžĐ”. +ĐœĐŸĐ¶ĐœĐŸ Đ·Đ°ĐŽĐ°Ń‚ŃŒ **ĐżŃ€ĐŸĐžĐ·ĐČĐŸĐ»ŃŒĐœĐŸĐ” Ń‡ĐžŃĐ»ĐŸ** ĐČ ĐșачДстĐČĐ” цДлО, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ **ĐŒĐ”Đ¶ĐŽŃƒ 50% Đž 90%** ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžŃ Ń€Đ”ŃŃƒŃ€ŃĐŸĐČ. ĐĄĐșĐŸŃ€Đ”Đ” ĐČŃĐ”ĐłĐŸ, ĐžĐŒĐ”ĐœĐœĐŸ это ĐČДщО ĐČы Đ±ŃƒĐŽĐ”Ń‚Đ” ĐžĐ·ĐŒĐ”Ń€ŃŃ‚ŃŒ Đž ĐœĐ° ох ĐŸŃĐœĐŸĐČĐ” ĐœĐ°ŃŃ‚Ń€Đ°ĐžĐČать разĐČёртыĐČĐ°ĐœĐžĐ”. -ĐœĐŸĐ¶ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐżŃ€ĐŸŃŃ‚Ń‹Đ” ĐžĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń‹ ĐČŃ€ĐŸĐŽĐ” `htop`, Ń‡Ń‚ĐŸĐ±Ń‹ ŃĐŒĐŸŃ‚Ń€Đ”Ń‚ŃŒ Đ·Đ°ĐłŃ€ŃƒĐ·Đșу CPU Đž RAM ĐœĐ° сДрĐČДрД ОлО ĐżĐŸ ĐżŃ€ĐŸŃ†Đ”ŃŃĐ°ĐŒ. ИлО Đ±ĐŸĐ»Đ”Đ” ŃĐ»ĐŸĐ¶ĐœŃ‹Đ” Ń€Đ°ŃĐżŃ€Đ”ĐŽĐ”Đ»Ń‘ĐœĐœŃ‹Đ” ŃĐžŃŃ‚Đ”ĐŒŃ‹ ĐŒĐŸĐœĐžŃ‚ĐŸŃ€ĐžĐœĐłĐ°. +ĐœĐŸĐ¶ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐżŃ€ĐŸŃŃ‚Ń‹Đ” ĐžĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń‹ ĐČŃ€ĐŸĐŽĐ” `htop`, Ń‡Ń‚ĐŸĐ±Ń‹ ŃĐŒĐŸŃ‚Ń€Đ”Ń‚ŃŒ Đ·Đ°ĐłŃ€ŃƒĐ·Đșу CPU Đž RAM ĐœĐ° сДрĐČДрД ОлО ĐżĐŸ ĐżŃ€ĐŸŃ†Đ”ŃŃĐ°ĐŒ. ИлО Đ±ĐŸĐ»Đ”Đ” ŃĐ»ĐŸĐ¶ĐœŃ‹Đ” ĐžĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń‹ ĐŒĐŸĐœĐžŃ‚ĐŸŃ€ĐžĐœĐłĐ°, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐŒĐŸĐłŃƒŃ‚ Đ±Ń‹Ń‚ŃŒ Ń€Đ°ŃĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœŃ‹ ĐżĐŸ сДрĐČĐ”Ń€Đ°ĐŒ Đž т.Đż. ## Đ Đ”Đ·ŃŽĐŒĐ” { #recap } diff --git a/docs/ru/docs/deployment/docker.md b/docs/ru/docs/deployment/docker.md index 50147750e..c3cf9a328 100644 --- a/docs/ru/docs/deployment/docker.md +++ b/docs/ru/docs/deployment/docker.md @@ -275,7 +275,7 @@ CMD fastapi run app/main.py --port 80 #### За ĐżŃ€ĐŸĐșсО-сДрĐČĐ”Ń€ĐŸĐŒ TSL-Ń‚Đ”Ń€ĐŒĐžĐœĐ°Ń†ĐžĐž { #behind-a-tls-termination-proxy } -ЕслО ĐČы запусĐșаДтД ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ за ĐżŃ€ĐŸĐșсО-сДрĐČĐ”Ń€ĐŸĐŒ TSL-Ń‚Đ”Ń€ĐŒĐžĐœĐ°Ń†ĐžĐž (Đ±Đ°Đ»Đ°ĐœŃĐžŃ€ĐŸĐČщоĐșĐŸĐŒ ĐœĐ°ĐłŃ€ŃƒĐ·ĐșĐž), таĐșĐžĐŒ ĐșаĐș Nginx ОлО Traefik, ĐŽĐŸĐ±Đ°ĐČŃŒŃ‚Đ” ĐŸĐżŃ†ĐžŃŽ `--proxy-headers`. Đ­Ń‚ĐŸ ŃĐŸĐŸĐ±Ń‰ĐžŃ‚ Uvicorn (чДрДз FastAPI CLI), Ń‡Ń‚ĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” Ń€Đ°Đ±ĐŸŃ‚Đ°Đ”Ń‚ за HTTPS Đž ĐŒĐŸĐ¶ĐœĐŸ ĐŽĐŸĐČĐ”Ń€ŃŃ‚ŃŒ ŃĐŸĐŸŃ‚ĐČДтстĐČŃƒŃŽŃ‰ĐžĐŒ Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐ°ĐŒ. +ЕслО ĐČы запусĐșаДтД ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ за ĐżŃ€ĐŸĐșсО-сДрĐČĐ”Ń€ĐŸĐŒ TSL-Ń‚Đ”Ń€ĐŒĐžĐœĐ°Ń†ĐžĐž (Đ±Đ°Đ»Đ°ĐœŃĐžŃ€ĐŸĐČщоĐșĐŸĐŒ ĐœĐ°ĐłŃ€ŃƒĐ·ĐșĐž), таĐșĐžĐŒ ĐșаĐș Nginx ОлО Traefik, ĐŽĐŸĐ±Đ°ĐČŃŒŃ‚Đ” ĐŸĐżŃ†ĐžŃŽ `--proxy-headers`. Đ­Ń‚ĐŸ ŃĐŸĐŸĐ±Ń‰ĐžŃ‚ Uvicorn (чДрДз FastAPI CLI), Ń‡Ń‚ĐŸ ĐŒĐŸĐ¶ĐœĐŸ ĐŽĐŸĐČĐ”Ń€ŃŃ‚ŃŒ Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐ°ĐŒ, ĐŸŃ‚ĐżŃ€Đ°ĐČĐ»Đ”ĐœĐœŃ‹ĐŒ ŃŃ‚ĐžĐŒ ĐżŃ€ĐŸĐșсО Đž ŃĐŸĐŸĐ±Ń‰Đ°ŃŽŃ‰ĐžĐŒ, Ń‡Ń‚ĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” Ń€Đ°Đ±ĐŸŃ‚Đ°Đ”Ń‚ за HTTPS, Đž т.ĐŽ. ```Dockerfile CMD ["fastapi", "run", "app/main.py", "--proxy-headers", "--port", "80"] @@ -407,9 +407,9 @@ CMD ["fastapi", "run", "main.py", "--port", "80"] 1. ĐšĐŸĐżĐžŃ€ŃƒĐ”ĐŒ фаĐčĐ» `main.py` ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ ĐČ `/code` (бДз ЎОрДĐșŃ‚ĐŸŃ€ĐžĐž `./app`). -2. Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒ `fastapi run` ĐŽĐ»Ń запусĐșа ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ Оз ĐŸĐŽĐœĐŸĐłĐŸ фаĐčла `main.py`. +2. Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒ `fastapi run`, Ń‡Ń‚ĐŸĐ±Ń‹ Â«ĐŸŃ‚ĐŽĐ°ĐČĐ°Ń‚ŃŒÂ» ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” Оз ĐŸĐŽĐœĐŸĐłĐŸ фаĐčла `main.py`. -ĐšĐŸĐłĐŽĐ° ĐČы пДрДЎаётД фаĐčĐ» ĐČ `fastapi run`, ĐŸĐœ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚, Ń‡Ń‚ĐŸ ŃŃ‚ĐŸ ĐŸĐŽĐžĐœĐŸŃ‡ĐœŃ‹Đč фаĐčĐ», а ĐœĐ” часть паĐșДта, Đž ĐżĐŸĐčĐŒŃ‘Ń‚, ĐșаĐș Đ”ĐłĐŸ ĐžĐŒĐżĐŸŃ€Ń‚ĐžŃ€ĐŸĐČать Đž Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚ŃŒ ĐČашД FastAPI-ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”. 😎 +ĐšĐŸĐłĐŽĐ° ĐČы пДрДЎаётД фаĐčĐ» ĐČ `fastapi run`, ĐŸĐœ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚, Ń‡Ń‚ĐŸ ŃŃ‚ĐŸ ĐŸĐŽĐžĐœĐŸŃ‡ĐœŃ‹Đč фаĐčĐ», а ĐœĐ” часть паĐșДта, Đž ĐżĐŸĐčĐŒŃ‘Ń‚, ĐșаĐș ĐžĐŒĐżĐŸŃ€Ń‚ĐžŃ€ĐŸĐČать Đž Â«ĐŸŃ‚ĐŽĐ°ĐČĐ°Ń‚ŃŒÂ» ĐČашД FastAPI-ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”. 😎 ## ĐšĐŸĐœŃ†Đ”ĐżŃ†ĐžĐž разĐČДртыĐČĐ°ĐœĐžŃ { #deployment-concepts } @@ -525,7 +525,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” разĐČёртыĐČать ĐœĐ° **ĐŸĐŽĐœĐŸĐŒ сДрĐČДрД** (ĐœĐ” ĐșластДрД) с **Docker Compose**, Đž у ĐČас ĐœĐ” Đ±ŃƒĐŽĐ”Ń‚ ĐżŃ€ĐŸŃŃ‚ĐŸĐłĐŸ ŃĐżĐŸŃĐŸĐ±Đ° упраĐČĐ»ŃŃ‚ŃŒ рДплОĐșацОДĐč ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ĐŸĐČ (ĐČ Docker Compose), ŃĐŸŃ…Ń€Đ°ĐœŃŃ ĐŸĐ±Ń‰ŃƒŃŽ ŃĐ”Ń‚ŃŒ Đž **Đ±Đ°Đ»Đ°ĐœŃĐžŃ€ĐŸĐČĐșу ĐœĐ°ĐłŃ€ŃƒĐ·ĐșĐž**. -ĐąĐŸĐłĐŽĐ° ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°Ń…ĐŸŃ‚Đ”Ń‚ŃŒ **ĐŸĐŽĐžĐœ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€** с **ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ĐŸĐŒ ĐżŃ€ĐŸŃ†Đ”ŃŃĐŸĐČ**, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč запусĐșаДт **ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ ĐČĐŸŃ€ĐșĐ”Ń€ĐŸĐČ** ĐČĐœŃƒŃ‚Ń€Đž. +ĐąĐŸĐłĐŽĐ° ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°Ń…ĐŸŃ‚Đ”Ń‚ŃŒ **ĐŸĐŽĐžĐœ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€** с **ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ĐŸĐŒ ĐżŃ€ĐŸŃ†Đ”ŃŃĐŸĐČ**, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč запусĐșаДт **ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ ĐČĐŸŃ€ĐșДр-ĐżŃ€ĐŸŃ†Đ”ŃŃĐŸĐČ** ĐČĐœŃƒŃ‚Ń€Đž. --- @@ -566,7 +566,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] ### ĐžĐŽĐžĐœ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ { #single-container } -ЕслО у ĐČас ĐżŃ€ĐŸŃŃ‚Đ°Ń ŃŃ…Đ”ĐŒĐ° с **ĐŸĐŽĐœĐžĐŒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ĐŸĐŒ**, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč Đ·Đ°Ń‚Đ”ĐŒ запусĐșаДт ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ **ĐČĐŸŃ€ĐșĐ”Ń€ĐŸĐČ** (ОлО ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”ŃŃ), ĐŒĐŸĐ¶ĐœĐŸ ĐČŃ‹ĐżĐŸĐ»ĐœĐžŃ‚ŃŒ ĐżĐŸĐŽĐłĐŸŃ‚ĐŸĐČĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đ” шагО ĐČ ŃŃ‚ĐŸĐŒ жД ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ” ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ пДрДЎ запусĐșĐŸĐŒ ĐżŃ€ĐŸŃ†Đ”ŃŃĐ° с ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”ĐŒ. +ЕслО у ĐČас ĐżŃ€ĐŸŃŃ‚Đ°Ń ŃŃ…Đ”ĐŒĐ° с **ĐŸĐŽĐœĐžĐŒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ĐŸĐŒ**, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč Đ·Đ°Ń‚Đ”ĐŒ запусĐșаДт ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ **ĐČĐŸŃ€ĐșДр-ĐżŃ€ĐŸŃ†Đ”ŃŃĐŸĐČ** (ОлО ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”ŃŃ), ĐŒĐŸĐ¶ĐœĐŸ ĐČŃ‹ĐżĐŸĐ»ĐœĐžŃ‚ŃŒ ĐżĐŸĐŽĐłĐŸŃ‚ĐŸĐČĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đ” шагО ĐČ ŃŃ‚ĐŸĐŒ жД ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ” ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ пДрДЎ запусĐșĐŸĐŒ ĐżŃ€ĐŸŃ†Đ”ŃŃĐ° с ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”ĐŒ. ### Đ‘Đ°Đ·ĐŸĐČыĐč Docker-ĐŸĐ±Ń€Đ°Đ· { #base-docker-image } @@ -580,7 +580,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] /// note | ĐąĐ”Ń…ĐœĐžŃ‡Đ”ŃĐșОД ĐżĐŸĐŽŃ€ĐŸĐ±ĐœĐŸŃŃ‚Đž -Đ­Ń‚ĐŸŃ‚ Docker-ĐŸĐ±Ń€Đ°Đ· был ŃĐŸĐ·ĐŽĐ°Đœ ĐČ Ń‚ĐŸ ĐČŃ€Đ”ĐŒŃ, ĐșĐŸĐłĐŽĐ° Uvicorn ĐœĐ” ŃƒĐŒĐ”Đ» упраĐČĐ»ŃŃ‚ŃŒ Đž ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșать «упаĐČŃˆĐžŃ…Â» ĐČĐŸŃ€ĐșĐ”Ń€ĐŸĐČ, Đž ĐżŃ€ĐžŃ…ĐŸĐŽĐžĐ»ĐŸŃŃŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Gunicorn ĐČĐŒĐ”ŃŃ‚Đ” с Uvicorn, Ń‡Ń‚ĐŸ ĐŽĐŸĐ±Đ°ĐČĐ»ŃĐ»ĐŸ Đ·Đ°ĐŒĐ”Ń‚ĐœŃƒŃŽ ŃĐ»ĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ, Đ»ĐžŃˆŃŒ бы Gunicorn упраĐČĐ»ŃĐ» Đž ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșал ĐČĐŸŃ€ĐșĐ”Ń€ĐŸĐČ Uvicorn. +Đ­Ń‚ĐŸŃ‚ Docker-ĐŸĐ±Ń€Đ°Đ· был ŃĐŸĐ·ĐŽĐ°Đœ ĐČ Ń‚ĐŸ ĐČŃ€Đ”ĐŒŃ, ĐșĐŸĐłĐŽĐ° Uvicorn ĐœĐ” ŃƒĐŒĐ”Đ» упраĐČĐ»ŃŃ‚ŃŒ Đž ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșать «упаĐČŃˆĐžŃ…Â» ĐČĐŸŃ€ĐșĐ”Ń€ĐŸĐČ, Đž ĐżŃ€ĐžŃ…ĐŸĐŽĐžĐ»ĐŸŃŃŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Gunicorn ĐČĐŒĐ”ŃŃ‚Đ” с Uvicorn, Ń‡Ń‚ĐŸ ĐŽĐŸĐ±Đ°ĐČĐ»ŃĐ»ĐŸ Đ·Đ°ĐŒĐ”Ń‚ĐœŃƒŃŽ ŃĐ»ĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ, Đ»ĐžŃˆŃŒ бы Gunicorn упраĐČĐ»ŃĐ» Đž ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșал ĐČĐŸŃ€ĐșДр-ĐżŃ€ĐŸŃ†Đ”ŃŃŃ‹ Uvicorn. ĐĐŸ Ń‚Đ”ĐżĐ”Ń€ŃŒ, ĐșĐŸĐłĐŽĐ° Uvicorn (Đž ĐșĐŸĐŒĐ°ĐœĐŽĐ° `fastapi`) ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČают `--workers`, ĐœĐ”Ń‚ ĐżŃ€ĐžŃ‡ĐžĐœ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ±Đ°Đ·ĐŸĐČыĐč Docker-ĐŸĐ±Ń€Đ°Đ· ĐČĐŒĐ”ŃŃ‚ĐŸ ŃĐ±ĐŸŃ€ĐșĐž сĐČĐŸĐ”ĐłĐŸ (ĐșĐŸĐŽĐ° ĐżĐŸĐ»ŃƒŃ‡Đ°Đ”Ń‚ŃŃ ĐżŃ€ĐžĐŒĐ”Ń€ĐœĐŸ ŃŃ‚ĐŸĐ»ŃŒĐșĐŸ жД 😅). @@ -615,4 +615,4 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] В Đ±ĐŸĐ»ŃŒŃˆĐžĐœŃŃ‚ĐČĐ” ŃĐ»ŃƒŃ‡Đ°Đ”ĐČ ĐČы, ĐČĐ”Ń€ĐŸŃŃ‚ĐœĐŸ, ĐœĐ” Đ·Đ°Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐșаĐșĐŸĐč-Đ»ĐžĐ±ĐŸ Đ±Đ°Đ·ĐŸĐČыĐč ĐŸĐ±Ń€Đ°Đ·, а ĐČĐŒĐ”ŃŃ‚ĐŸ ŃŃ‚ĐŸĐłĐŸ **ŃĐŸĐ±Đ”Ń€Ń‘Ń‚Đ” ĐŸĐ±Ń€Đ°Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° с ĐœŃƒĐ»Ń** ĐœĐ° ĐŸŃĐœĐŸĐČĐ” ĐŸŃ„ĐžŃ†ĐžĐ°Đ»ŃŒĐœĐŸĐłĐŸ Docker-ĐŸĐ±Ń€Đ°Đ·Đ° Python. -Đ—Đ°Đ±ĐŸŃ‚ŃŃŃŒ ĐŸ **ĐżĐŸŃ€ŃĐŽĐșĐ”** ĐžĐœŃŃ‚Ń€ŃƒĐșцоĐč ĐČ `Dockerfile` Đž ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ **Đșэш Docker**, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” **ĐŒĐžĐœĐžĐŒĐžĐ·ĐžŃ€ĐŸĐČать ĐČŃ€Đ”ĐŒŃ ŃĐ±ĐŸŃ€ĐșĐž**, Ń‡Ń‚ĐŸĐ±Ń‹ ĐżĐŸĐČысоть ĐżŃ€ĐŸĐŽŃƒĐșтоĐČĐœĐŸŃŃ‚ŃŒ (Đž ĐœĐ” сĐșучать). 😎 +Đ—Đ°Đ±ĐŸŃ‚ŃŃŃŒ ĐŸ **ĐżĐŸŃ€ŃĐŽĐșĐ”** ĐžĐœŃŃ‚Ń€ŃƒĐșцоĐč ĐČ `Dockerfile` Đž ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ **Đșэш Docker**, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” **ĐŒĐžĐœĐžĐŒĐžĐ·ĐžŃ€ĐŸĐČать ĐČŃ€Đ”ĐŒŃ ŃĐ±ĐŸŃ€ĐșĐž**, Ń‡Ń‚ĐŸĐ±Ń‹ ĐżĐŸĐČысоть ĐżŃ€ĐŸĐŽŃƒĐșтоĐČĐœĐŸŃŃ‚ŃŒ (Đž ĐœĐ” сĐșучать). 😎 diff --git a/docs/ru/docs/deployment/https.md b/docs/ru/docs/deployment/https.md index 181cac0d8..8c1b153f0 100644 --- a/docs/ru/docs/deployment/https.md +++ b/docs/ru/docs/deployment/https.md @@ -6,7 +6,7 @@ /// tip | ĐĄĐŸĐČДт -ЕслО ĐČы Ń‚ĐŸŃ€ĐŸĐżĐžŃ‚Đ”ŃŃŒ ОлО ĐČĐ°ĐŒ ŃŃ‚ĐŸ ĐœĐ” ĐČĐ°Đ¶ĐœĐŸ, ĐżĐ”Ń€Đ”Ń…ĐŸĐŽĐžŃ‚Đ” Đș ŃĐ»Đ”ĐŽŃƒŃŽŃ‰ĐžĐŒ Ń€Đ°Đ·ĐŽĐ”Đ»Đ°ĐŒ с ĐżĐŸŃˆĐ°ĐłĐŸĐČŃ‹ĐŒĐž ĐžĐœŃŃ‚Ń€ŃƒĐșŃ†ĐžŃĐŒĐž ĐżĐŸ ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐ” ĐČŃĐ”ĐłĐŸ Ń€Đ°Đ·ĐœŃ‹ĐŒĐž ŃĐżĐŸŃĐŸĐ±Đ°ĐŒĐž. +ЕслО ĐČы Ń‚ĐŸŃ€ĐŸĐżĐžŃ‚Đ”ŃŃŒ ОлО ĐČĐ°ĐŒ ŃŃ‚ĐŸ ĐœĐ” ĐČĐ°Đ¶ĐœĐŸ, ĐżŃ€ĐŸĐŽĐŸĐ»Đ¶Đ°ĐčтД ŃĐŸ ŃĐ»Đ”ĐŽŃƒŃŽŃ‰ĐžŃ… Ń€Đ°Đ·ĐŽĐ”Đ»ĐŸĐČ Ń ĐżĐŸŃˆĐ°ĐłĐŸĐČŃ‹ĐŒĐž ĐžĐœŃŃ‚Ń€ŃƒĐșŃ†ĐžŃĐŒĐž ĐżĐŸ ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐ” ĐČŃĐ”ĐłĐŸ Ń€Đ°Đ·ĐœŃ‹ĐŒĐž ŃĐżĐŸŃĐŸĐ±Đ°ĐŒĐž. /// @@ -65,7 +65,7 @@ ЧащД ĐČŃĐ”ĐłĐŸ ĐČсё ĐœĐ°Ń‡ĐžĐœĐ°Đ”Ń‚ŃŃ с **ĐżŃ€ĐžĐŸĐ±Ń€Đ”Ń‚Đ”ĐœĐžŃ** **ĐžĐŒĐ”ĐœĐž ĐŽĐŸĐŒĐ”ĐœĐ°**. Đ—Đ°Ń‚Đ”ĐŒ ĐČы ĐœĐ°ŃŃ‚Ń€Đ°ĐžĐČаДтД Đ”ĐłĐŸ ĐœĐ° DNS‑сДрĐČДрД (ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸ, у Ń‚ĐŸĐłĐŸ жД ĐŸĐ±Đ»Đ°Ń‡ĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐČаĐčЎДра). -ĐĄĐșĐŸŃ€Đ”Đ” ĐČŃĐ”ĐłĐŸ, ĐČы ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚Đ” ĐŸĐ±Đ»Đ°Ń‡ĐœŃ‹Đč сДрĐČДр (ĐČĐžŃ€Ń‚ŃƒĐ°Đ»ŃŒĐœŃƒŃŽ ĐŒĐ°ŃˆĐžĐœŃƒ) ОлО Ń‡Ń‚ĐŸ-Ń‚ĐŸ ĐżĐŸĐŽĐŸĐ±ĐœĐŸĐ”, Đž у ĐœĐ”ĐłĐŸ Đ±ŃƒĐŽĐ”Ń‚ ĐżĐŸŃŃ‚ĐŸŃĐœĐœŃ‹Đč **ĐżŃƒĐ±Đ»ĐžŃ‡ĐœŃ‹Đč IP-аЎрДс**. +ĐĄĐșĐŸŃ€Đ”Đ” ĐČŃĐ”ĐłĐŸ, ĐČы ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚Đ” ĐŸĐ±Đ»Đ°Ń‡ĐœŃ‹Đč сДрĐČДр (ĐČĐžŃ€Ń‚ŃƒĐ°Đ»ŃŒĐœŃƒŃŽ ĐŒĐ°ŃˆĐžĐœŃƒ) ОлО Ń‡Ń‚ĐŸ-Ń‚ĐŸ ĐżĐŸĐŽĐŸĐ±ĐœĐŸĐ”, Đž у ĐœĐ”ĐłĐŸ Đ±ŃƒĐŽĐ”Ń‚ ĐżĐŸŃŃ‚ĐŸŃĐœĐœŃ‹Đč **ĐżŃƒĐ±Đ»ĐžŃ‡ĐœŃ‹Đč IP-аЎрДс**. На DNS‑сДрĐČДрД(ах) ĐČы ĐœĐ°ŃŃ‚Ń€ĐŸĐžŃ‚Đ” Đ·Đ°ĐżĐžŃŃŒ («`A record`» - Đ·Đ°ĐżĐžŃŃŒ топа A), уĐșазыĐČающую, Ń‡Ń‚ĐŸ **ĐČаш ĐŽĐŸĐŒĐ”Đœ** ĐŽĐŸĐ»Đ¶Đ”Đœ уĐșазыĐČать ĐœĐ° ĐżŃƒĐ±Đ»ĐžŃ‡ĐœŃ‹Đč **IP‑аЎрДс ĐČĐ°ŃˆĐ”ĐłĐŸ сДрĐČДра**. @@ -194,7 +194,7 @@ DNS‑сДрĐČДры ĐŸŃ‚ĐČĐ”Ń‚ŃŃ‚ Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Ńƒ, ĐșаĐșĐŸĐč **ĐșĐŸĐœĐșрД ĐšĐŸĐłĐŽĐ° ĐČы ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚Đ” ĐżŃ€ĐŸĐșсО ĐŽĐ»Ń ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐž HTTPS, ĐČаш **сДрĐČДр ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ** (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, Uvicorn чДрДз FastAPI CLI) ĐœĐžŃ‡Đ”ĐłĐŸ ĐœĐ” Đ·ĐœĐ°Đ”Ń‚ ĐŸ ĐżŃ€ĐŸŃ†Đ”ŃŃĐ” HTTPS, ĐŸĐœ ĐŸĐ±Ń‰Đ°Đ”Ń‚ŃŃ ĐŸĐ±Ń‹Ń‡ĐœŃ‹ĐŒ HTTP с **ĐżŃ€ĐŸĐșсО‑сДрĐČĐ”Ń€ĐŸĐŒ TLS-Ń‚Đ”Ń€ĐŒĐžĐœĐ°Ń†ĐžĐž**. -ĐžĐ±Ń‹Ń‡ĐœĐŸ ŃŃ‚ĐŸŃ‚ **ĐżŃ€ĐŸĐșсО** ĐœĐ° Đ»Đ”Ń‚Ńƒ ĐŽĐŸĐ±Đ°ĐČĐ»ŃĐ”Ń‚ ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” HTTPâ€‘Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž пДрДЎ Ń‚Đ”ĐŒ, ĐșаĐș ĐżĐ”Ń€Đ”ŃĐ»Đ°Ń‚ŃŒ Đ·Đ°ĐżŃ€ĐŸŃ ĐœĐ° **сДрĐČДр ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ**, Ń‡Ń‚ĐŸĐ±Ń‹ Ń‚ĐŸŃ‚ Đ·ĐœĐ°Đ», Ń‡Ń‚ĐŸ Đ·Đ°ĐżŃ€ĐŸŃ был **ĐżŃ€ĐŸĐșŃĐžŃ€ĐŸĐČĐ°Đœ**. +ĐžĐ±Ń‹Ń‡ĐœĐŸ ŃŃ‚ĐŸŃ‚ **ĐżŃ€ĐŸĐșсО** ĐœĐ° Đ»Đ”Ń‚Ńƒ ĐŽĐŸĐ±Đ°ĐČĐ»ŃĐ”Ń‚ ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” HTTPâ€‘Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž пДрДЎ Ń‚Đ”ĐŒ, ĐșаĐș ĐżĐ”Ń€Đ”ŃĐ»Đ°Ń‚ŃŒ Đ·Đ°ĐżŃ€ĐŸŃ ĐœĐ° **сДрĐČДр ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ**, Ń‡Ń‚ĐŸĐ±Ń‹ Ń‚ĐŸŃ‚ Đ·ĐœĐ°Đ», Ń‡Ń‚ĐŸ Đ·Đ°ĐżŃ€ĐŸŃ был **ĐżĐ”Ń€Đ”ŃĐ»Đ°Đœ** ĐżŃ€ĐŸĐșсО. /// note | ĐąĐ”Ń…ĐœĐžŃ‡Đ”ŃĐșОД ЎДталО @@ -218,7 +218,7 @@ DNS‑сДрĐČДры ĐŸŃ‚ĐČĐ”Ń‚ŃŃ‚ Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Ńƒ, ĐșаĐșĐŸĐč **ĐșĐŸĐœĐșрД /// tip | ĐĄĐŸĐČДт -ĐŸĐŸĐŽŃ€ĐŸĐ±ĐœĐ”Đ” ĐŸĐ± ŃŃ‚ĐŸĐŒ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃƒĐ·ĐœĐ°Ń‚ŃŒ ĐČ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž: [За ĐżŃ€ĐŸĐșсО — ВĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ ĐżĐ”Ń€Đ”ŃŃ‹Đ»Đ°Đ”ĐŒŃ‹Đ” Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž ĐżŃ€ĐŸĐșсО](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) +ĐŸĐŸĐŽŃ€ĐŸĐ±ĐœĐ”Đ” ĐŸĐ± ŃŃ‚ĐŸĐŒ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃƒĐ·ĐœĐ°Ń‚ŃŒ ĐČ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž: [За ĐżŃ€ĐŸĐșсО — ĐČĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ ĐżĐ”Ń€Đ”ŃŃ‹Đ»Đ°Đ”ĐŒŃ‹Đ” Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž ĐżŃ€ĐŸĐșсО](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) /// diff --git a/docs/ru/docs/deployment/manually.md b/docs/ru/docs/deployment/manually.md index db5581ae5..e6408c944 100644 --- a/docs/ru/docs/deployment/manually.md +++ b/docs/ru/docs/deployment/manually.md @@ -2,7 +2,7 @@ ## Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД ĐșĐŸĐŒĐ°ĐœĐŽŃƒ `fastapi run` { #use-the-fastapi-run-command } -ĐšĐŸŃ€ĐŸŃ‚ĐșĐŸ: ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД `fastapi run`, Ń‡Ń‚ĐŸĐ±Ń‹ Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚ŃŒ ĐČашД ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” FastAPI: +ĐšĐŸŃ€ĐŸŃ‚ĐșĐŸ: ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД `fastapi run`, Ń‡Ń‚ĐŸĐ±Ń‹ ĐżŃ€Đ”ĐŽĐŸŃŃ‚Đ°ĐČĐ»ŃŃ‚ŃŒ ĐŽĐŸŃŃ‚ŃƒĐż Đș ĐČĐ°ŃˆĐ”ĐŒŃƒ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃŽ FastAPI:
diff --git a/docs/ru/docs/editor-support.md b/docs/ru/docs/editor-support.md index 0543e7162..cd02c0f40 100644 --- a/docs/ru/docs/editor-support.md +++ b/docs/ru/docs/editor-support.md @@ -20,4 +20,4 @@ - **РазĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ ĐČ FastAPI Cloud** — разĐČДртыĐČĐ°ĐœĐžĐ” ĐČĐ°ŃˆĐ”ĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ ĐČ ĐŸĐŽĐžĐœ ĐșлОĐș ĐČ [FastAPI Cloud](https://fastapicloud.com/). - **ĐŸĐŸŃ‚ĐŸĐș Đ»ĐŸĐłĐŸĐČ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ** — ĐżĐŸŃ‚ĐŸĐșĐŸĐČая пДрДЎача Đ»ĐŸĐłĐŸĐČ ĐČ Ń€Đ”Đ°Đ»ŃŒĐœĐŸĐŒ ĐČŃ€Đ”ĐŒĐ”ĐœĐž Оз ĐČĐ°ŃˆĐ”ĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ, разĐČĐ”Ń€ĐœŃƒŃ‚ĐŸĐłĐŸ ĐČ FastAPI Cloud, с Ń„ĐžĐ»ŃŒŃ‚Ń€Đ°Ń†ĐžĐ”Đč ĐżĐŸ ŃƒŃ€ĐŸĐČĐœŃŽ Đž тДĐșŃŃ‚ĐŸĐČŃ‹ĐŒ ĐżĐŸĐžŃĐșĐŸĐŒ. -ЕслО ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐżĐŸĐČĐ”Ń€Ń…ĐœĐŸŃŃ‚ĐœĐŸ ĐŸĐ·ĐœĐ°ĐșĐŸĐŒĐžŃ‚ŃŒŃŃ с ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃĐŒĐž Ń€Đ°ŃŃˆĐžŃ€Đ”ĐœĐžŃ, ĐŸŃ‚ĐșŃ€ĐŸĐčтД ĐżĐ°Đ»ĐžŃ‚Ń€Ńƒ ĐșĐŸĐŒĐ°ĐœĐŽ (Ctrl + Shift + P ОлО ĐœĐ° macOS: Cmd + Shift + P), ĐČыбДрОтД «Welcome: Open walkthrough...», а Đ·Đ°Ń‚Đ”ĐŒ «Get started with FastAPI». +ЕслО ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐŸĐ·ĐœĐ°ĐșĐŸĐŒĐžŃ‚ŃŒŃŃ с ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃĐŒĐž Ń€Đ°ŃŃˆĐžŃ€Đ”ĐœĐžŃ, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸŃĐŒĐŸŃ‚Ń€Đ”Ń‚ŃŒ walkthrough Ń€Đ°ŃŃˆĐžŃ€Đ”ĐœĐžŃ, ĐŸŃ‚ĐșрыĐČ ĐżĐ°Đ»ĐžŃ‚Ń€Ńƒ ĐșĐŸĐŒĐ°ĐœĐŽ (Ctrl + Shift + P ОлО ĐœĐ° macOS: Cmd + Shift + P) Đž ĐČыбраĐČ Â«Welcome: Open walkthrough...», а Đ·Đ°Ń‚Đ”ĐŒ walkthrough «Get started with FastAPI». diff --git a/docs/ru/docs/environment-variables.md b/docs/ru/docs/environment-variables.md index 8db16d16c..3cd0bc78b 100644 --- a/docs/ru/docs/environment-variables.md +++ b/docs/ru/docs/environment-variables.md @@ -50,9 +50,9 @@ Hello Wade Wilson //// -## Đ§Ń‚Đ”ĐœĐžĐ” ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Ń… ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ ĐČ python { #read-env-vars-in-python } +## Đ§Ń‚Đ”ĐœĐžĐ” ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Ń… ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ ĐČ Python { #read-env-vars-in-python } -йаĐș жД ŃŃƒŃ‰Đ”ŃŃ‚ĐČŃƒĐ”Ń‚ ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ ŃĐŸĐ·ĐŽĐ°ĐœĐžŃ ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Ń… ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ **ĐČĐœĐ”** Python, ĐČ Ń‚Đ”Ń€ĐŒĐžĐœĐ°Đ»Đ” (ОлО Đ»ŃŽĐ±Ń‹ĐŒ ĐŽŃ€ŃƒĐłĐžĐŒ ŃĐżĐŸŃĐŸĐ±ĐŸĐŒ), а Đ·Đ°Ń‚Đ”ĐŒ **Ń‡Ń‚Đ”ĐœĐžŃ ох ĐČ Python**. +йаĐșжД ŃŃƒŃ‰Đ”ŃŃ‚ĐČŃƒĐ”Ń‚ ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ ŃĐŸĐ·ĐŽĐ°ĐœĐžŃ ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Ń… ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ **ĐČĐœĐ”** Python, ĐČ Ń‚Đ”Ń€ĐŒĐžĐœĐ°Đ»Đ” (ОлО Đ»ŃŽĐ±Ń‹ĐŒ ĐŽŃ€ŃƒĐłĐžĐŒ ŃĐżĐŸŃĐŸĐ±ĐŸĐŒ), а Đ·Đ°Ń‚Đ”ĐŒ **Ń‡Ń‚Đ”ĐœĐžŃ ох ĐČ Python**. ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, у ĐČас Đ”ŃŃ‚ŃŒ фаĐčĐ» `main.py`: @@ -67,7 +67,7 @@ print(f"Hello {name} from Python") Đ’Ń‚ĐŸŃ€ĐŸĐč Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚ [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) - ŃŃ‚ĐŸ ĐČĐŸĐ·ĐČŃ€Đ°Ń‰Đ°Đ”ĐŒĐŸĐ” ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”. -ЕслО Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐœĐ” уĐșĐ°Đ·Đ°ĐœĐŸ, Ń‚ĐŸ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ ĐŸĐœĐŸ раĐČĐœĐŸ `None`. В ĐŽĐ°ĐœĐœĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” ĐŒŃ‹ уĐșазыĐČĐ°Đ”ĐŒ `«World»` ĐČ ĐșачДстĐČĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ. +ЕслО Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐœĐ” уĐșĐ°Đ·Đ°ĐœĐŸ, Ń‚ĐŸ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ ĐŸĐœĐŸ раĐČĐœĐŸ `None`. В ĐŽĐ°ĐœĐœĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” ĐŒŃ‹ уĐșазыĐČĐ°Đ”ĐŒ `"World"` ĐČ ĐșачДстĐČĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ. /// @@ -157,13 +157,13 @@ Hello World from Python /// -## ĐąĐžĐżĐžĐ·Đ°Ń†ĐžŃ Đž Đ’Đ°Đ»ĐžĐŽĐ°Ń†ĐžŃ { #types-and-validation } +## бопы Đž ĐČĐ°Đ»ĐžĐŽĐ°Ń†ĐžŃ { #types-and-validation } Это ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Đ” ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ ĐŒĐŸĐłŃƒŃ‚ Ń€Đ°Đ±ĐŸŃ‚Đ°Ń‚ŃŒ Ń‚ĐŸĐ»ŃŒĐșĐŸ с **тДĐșŃŃ‚ĐŸĐČŃ‹ĐŒĐž ŃŃ‚Ń€ĐŸĐșĐ°ĐŒĐž**, ĐżĐŸŃĐșĐŸĐ»ŃŒĐșу ĐŸĐœĐž яĐČĐ»ŃŃŽŃ‚ŃŃ ĐČĐœĐ”ŃˆĐœĐžĐŒĐž ĐżĐŸ ĐŸŃ‚ĐœĐŸŃˆĐ”ĐœĐžŃŽ Đș Python Đž ĐŽĐŸĐ»Đ¶ĐœŃ‹ Đ±Ń‹Ń‚ŃŒ ŃĐŸĐČĐŒĐ”ŃŃ‚ĐžĐŒŃ‹ с ĐŽŃ€ŃƒĐłĐžĐŒĐž ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐ°ĐŒĐž Đž ĐŸŃŃ‚Đ°Đ»ŃŒĐœĐŸĐč ŃĐžŃŃ‚Đ”ĐŒĐŸĐč (Đž ЎажД с Ń€Đ°Đ·Đ»ĐžŃ‡ĐœŃ‹ĐŒĐž ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐŸĐœĐœŃ‹ĐŒĐž ŃĐžŃŃ‚Đ”ĐŒĐ°ĐŒĐž, таĐșĐžĐŒĐž ĐșаĐș Linux, Windows, macOS). Đ­Ń‚ĐŸ ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚, Ń‡Ń‚ĐŸ **Đ»ŃŽĐ±ĐŸĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”**, ŃŃ‡ĐžŃ‚Đ°ĐœĐœĐŸĐ” ĐČ Python Оз ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœĐŸĐč ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ, **Đ±ŃƒĐŽĐ”Ń‚ `str`**, Đž Đ»ŃŽĐ±ĐŸĐ” ĐżŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°ĐœĐžĐ” Đș ĐŽŃ€ŃƒĐłĐŸĐŒŃƒ топу ОлО Đ»ŃŽĐ±Đ°Ń ĐČĐ°Đ»ĐžĐŽĐ°Ń†ĐžŃ ĐŽĐŸĐ»Đ¶ĐœŃ‹ Đ±Ń‹Ń‚ŃŒ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœŃ‹ ĐČ ĐșĐŸĐŽĐ”. -ĐŸĐŸĐŽŃ€ĐŸĐ±ĐœĐ”Đ” ĐŸĐ± ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐž ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Ń… ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ ĐŽĐ»Ń Ń€Đ°Đ±ĐŸŃ‚Ń‹ с **ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐ°ĐŒĐž ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ** ĐČы ŃƒĐ·ĐœĐ°Đ”Ń‚Đ” ĐČ [Đ Đ°ŃŃˆĐžŃ€Đ”ĐœĐœĐŸĐ” руĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń - ĐĐ°ŃŃ‚Ń€ĐŸĐčĐșĐž Đž ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Đ” срДЎы](./advanced/settings.md). +ĐŸĐŸĐŽŃ€ĐŸĐ±ĐœĐ”Đ” ĐŸĐ± ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐž ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Ń… ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ ĐŽĐ»Ń Ń€Đ°Đ±ĐŸŃ‚Ń‹ с **ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐ°ĐŒĐž ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ** ĐČы ŃƒĐ·ĐœĐ°Đ”Ń‚Đ” ĐČ [Đ Đ°ŃŃˆĐžŃ€Đ”ĐœĐœĐŸĐŒ руĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐ” ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń - ĐĐ°ŃŃ‚Ń€ĐŸĐčĐșĐž Đž ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Đ” ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ](./advanced/settings.md). ## ĐŸĐ”Ń€Đ”ĐŒĐ”ĐœĐœĐ°Ń ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ `PATH` { #path-environment-variable } @@ -285,14 +285,14 @@ $ C:\opt\custompython\bin\python //// -Эта ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ Đ±ŃƒĐŽĐ”Ń‚ ĐżĐŸĐ»Đ”Đ·ĐœĐ° про ĐžĐ·ŃƒŃ‡Đ”ĐœĐžĐž [Đ’ĐžŃ€Ń‚ŃƒĐ°Đ»ŃŒĐœŃ‹Ń… ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžĐč](virtual-environments.md). +Эта ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ Đ±ŃƒĐŽĐ”Ń‚ ĐżĐŸĐ»Đ”Đ·ĐœĐ° про ĐžĐ·ŃƒŃ‡Đ”ĐœĐžĐž [ĐČĐžŃ€Ń‚ŃƒĐ°Đ»ŃŒĐœŃ‹Ń… ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžĐč](virtual-environments.md). ## ВыĐČĐŸĐŽ { #conclusion } Đ‘Đ»Đ°ĐłĐŸĐŽĐ°Ń€Ń ŃŃ‚ĐŸĐŒŃƒ ĐČы ĐŽĐŸĐ»Đ¶ĐœŃ‹ ĐžĐŒĐ”Ń‚ŃŒ Đ±Đ°Đ·ĐŸĐČĐŸĐ” прДЎстаĐČĐ»Đ”ĐœĐžĐ” ĐŸ Ń‚ĐŸĐŒ, Ń‡Ń‚ĐŸ таĐșĐŸĐ” **ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Đ” ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ** Đž ĐșаĐș ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ох ĐČ Python. -ĐŸĐŸĐŽŃ€ĐŸĐ±ĐœĐ”Đ” ĐŸ ĐœĐžŃ… ĐČы таĐșжД ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Ń‚ŃŒ ĐČ [ŃŃ‚Đ°Ń‚ŃŒĐ” ĐŸ ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Ń… ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ ĐœĐ° ĐČĐžĐșОпДЎОО](https://en.wikipedia.org/wiki/Environment_variable). +ĐŸĐŸĐŽŃ€ĐŸĐ±ĐœĐ”Đ” ĐŸ ĐœĐžŃ… ĐČы таĐșжД ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Ń‚ŃŒ ĐČ [ŃŃ‚Đ°Ń‚ŃŒĐ” ĐŸ ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Ń… ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ ĐœĐ° ВоĐșОпДЎОО](https://en.wikipedia.org/wiki/Environment_variable). Đ’ĐŸ ĐŒĐœĐŸĐłĐžŃ… ŃĐ»ŃƒŃ‡Đ°ŃŃ… ĐœĐ” ĐČсДгЎа ĐŸŃ‡Đ”ĐČĐžĐŽĐœĐŸ, ĐșаĐș ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Đ” ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃ ĐŒĐŸĐłŃƒŃ‚ Đ±Ń‹Ń‚ŃŒ ĐżĐŸĐ»Đ”Đ·ĐœŃ‹ Đž ĐżŃ€ĐžĐŒĐ”ĐœĐžĐŒŃ‹. ĐĐŸ ĐŸĐœĐž ĐżĐŸŃŃ‚ĐŸŃĐœĐœĐŸ ĐżĐŸŃĐČĐ»ŃŃŽŃ‚ŃŃ ĐČ Ń€Đ°Đ·Đ»ĐžŃ‡ĐœŃ‹Ń… ŃŃ†Đ”ĐœĐ°Ń€ĐžŃŃ… Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐž, ĐżĐŸŃŃ‚ĐŸĐŒŃƒ Đ·ĐœĐ°Ń‚ŃŒ ĐŸ ĐœĐžŃ… ĐżĐŸĐ»Đ”Đ·ĐœĐŸ. -ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, эта ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ ĐżĐŸĐœĐ°ĐŽĐŸĐ±ĐžŃ‚ŃŃ ĐČĐ°ĐŒ ĐČ ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”ĐŒ разЎДлД, ĐżĐŸŃĐČŃŃ‰Đ”ĐœĐœĐŸĐŒ [Đ’ĐžŃ€Ń‚ŃƒĐ°Đ»ŃŒĐœŃ‹ĐŒ ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃĐŒ](virtual-environments.md). +ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, эта ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ ĐżĐŸĐœĐ°ĐŽĐŸĐ±ĐžŃ‚ŃŃ ĐČĐ°ĐŒ ĐČ ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”ĐŒ разЎДлД, ĐżĐŸŃĐČŃŃ‰Đ”ĐœĐœĐŸĐŒ [ĐČĐžŃ€Ń‚ŃƒĐ°Đ»ŃŒĐœŃ‹ĐŒ ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžŃĐŒ](virtual-environments.md). diff --git a/docs/ru/docs/features.md b/docs/ru/docs/features.md index 9755c3fe5..25bbe850c 100644 --- a/docs/ru/docs/features.md +++ b/docs/ru/docs/features.md @@ -17,7 +17,7 @@ * [**Swagger UI**](https://github.com/swagger-api/swagger-ui), с ĐžĐœŃ‚Đ”Ń€Đ°ĐșтоĐČĐœŃ‹ĐŒ ĐžŃŃĐ»Đ”ĐŽĐŸĐČĐ°ĐœĐžĐ”ĐŒ, ĐČŃ‹Đ·ĐŸĐČĐŸĐŒ Đž Ń‚Đ”ŃŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐžĐ”ĐŒ ĐČĐ°ŃˆĐ”ĐłĐŸ API ĐżŃ€ŃĐŒĐŸ Оз Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Đ°. -![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) +![Đ’Đ·Đ°ĐžĐŒĐŸĐŽĐ”ĐčстĐČОД ŃĐŸ Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * ĐĐ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČĐœĐ°Ń ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃ API ĐČ [**ReDoc**](https://github.com/Rebilly/ReDoc). @@ -36,7 +36,7 @@ from datetime import date from pydantic import BaseModel -# ĐžĐ±ŃŠŃĐČĐ»ŃĐ”ĐŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐșаĐș `str` +# ĐžĐ±ŃŠŃĐČĐ»ŃĐ”ĐŒ ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃƒŃŽ ĐșаĐș `str` # Đž ĐżĐŸĐ»ŃƒŃ‡Đ°Đ”ĐŒ ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșу рДЎаĐșŃ‚ĐŸŃ€Đ° ĐșĐŸĐŽĐ° ĐČĐœŃƒŃ‚Ń€Đž Ń„ŃƒĐœĐșцоо def main(user_id: str): return user_id @@ -71,9 +71,9 @@ my_second_user: User = User(**second_user_data) /// -### ĐŸĐŸĐŽĐŽĐ”Ń€Đ¶Đșа рДЎаĐșŃ‚ĐŸŃ€ĐŸĐČ { #editor-support } +### ĐŸĐŸĐŽĐŽĐ”Ń€Đ¶Đșа рДЎаĐșŃ‚ĐŸŃ€ĐŸĐČ ĐșĐŸĐŽĐ° { #editor-support } -Đ’Đ”ŃŃŒ фрДĐčĐŒĐČĐŸŃ€Đș был ĐżŃ€ĐŸĐŽŃƒĐŒĐ°Đœ таĐș, Ń‡Ń‚ĐŸĐ±Ń‹ Đ±Ń‹Ń‚ŃŒ ĐżŃ€ĐŸŃŃ‚Ń‹ĐŒ Đž ĐžĐœŃ‚ŃƒĐžŃ‚ĐžĐČĐœĐŸ ĐżĐŸĐœŃŃ‚ĐœŃ‹ĐŒ ĐČ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐž, ĐČсД Ń€Đ”ŃˆĐ”ĐœĐžŃ былО ĐżŃ€ĐŸĐČĐ”Ń€Đ”ĐœŃ‹ ĐœĐ° ĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐ” рДЎаĐșŃ‚ĐŸŃ€ĐŸĐČ Đ”Ń‰Đ” ĐŽĐŸ ĐœĐ°Ń‡Đ°Đ»Đ° Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐž, Ń‡Ń‚ĐŸĐ±Ń‹ ĐŸĐ±Đ”ŃĐżĐ”Ń‡ĐžŃ‚ŃŒ ĐœĐ°ĐžĐ»ŃƒŃ‡ŃˆĐžĐ” ŃƒŃĐ»ĐŸĐČоя про ĐœĐ°ĐżĐžŃĐ°ĐœĐžĐž ĐșĐŸĐŽĐ°. +Đ’Đ”ŃŃŒ фрДĐčĐŒĐČĐŸŃ€Đș был ĐżŃ€ĐŸĐŽŃƒĐŒĐ°Đœ таĐș, Ń‡Ń‚ĐŸĐ±Ń‹ Đ±Ń‹Ń‚ŃŒ ĐżŃ€ĐŸŃŃ‚Ń‹ĐŒ Đž ĐžĐœŃ‚ŃƒĐžŃ‚ĐžĐČĐœĐŸ ĐżĐŸĐœŃŃ‚ĐœŃ‹ĐŒ ĐČ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐž, ĐČсД Ń€Đ”ŃˆĐ”ĐœĐžŃ былО ĐżŃ€ĐŸĐČĐ”Ń€Đ”ĐœŃ‹ ĐœĐ° ĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐ” рДЎаĐșŃ‚ĐŸŃ€ĐŸĐČ ĐșĐŸĐŽĐ° ДщД ĐŽĐŸ ĐœĐ°Ń‡Đ°Đ»Đ° Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐž, Ń‡Ń‚ĐŸĐ±Ń‹ ĐŸĐ±Đ”ŃĐżĐ”Ń‡ĐžŃ‚ŃŒ ĐœĐ°ĐžĐ»ŃƒŃ‡ŃˆĐžĐ” ŃƒŃĐ»ĐŸĐČоя про ĐœĐ°ĐżĐžŃĐ°ĐœĐžĐž ĐșĐŸĐŽĐ°. В ĐŸĐżŃ€ĐŸŃĐ°Ń… Pythonâ€‘Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐŸĐČ ĐČĐžĐŽĐœĐŸ, [Ń‡Ń‚ĐŸ ĐŸĐŽĐœĐŸĐč Оз ŃĐ°ĐŒŃ‹Ń… Ń‡Đ°ŃŃ‚ĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒŃ‹Ń… Ń„ŃƒĐœĐșцоĐč яĐČĐ»ŃĐ”Ń‚ŃŃ «аĐČŃ‚ĐŸĐ·Đ°ĐČĐ”Ń€ŃˆĐ”ĐœĐžĐ”Â»](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features). @@ -81,15 +81,15 @@ my_second_user: User = User(**second_user_data) Đ’Đ°ĐŒ рДЎĐșĐŸ ĐœŃƒĐ¶ĐœĐŸ Đ±ŃƒĐŽĐ”Ń‚ ĐČĐŸĐ·ĐČращаться Đș ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž. -Đ’ĐŸŃ‚ ĐșаĐș ĐČаш рДЎаĐșŃ‚ĐŸŃ€ ĐŒĐŸĐ¶Đ”Ń‚ ĐČĐ°ĐŒ ĐżĐŸĐŒĐŸŃ‡ŃŒ: +Đ’ĐŸŃ‚ ĐșаĐș ĐČаш рДЎаĐșŃ‚ĐŸŃ€ ĐșĐŸĐŽĐ° ĐŒĐŸĐ¶Đ”Ń‚ ĐČĐ°ĐŒ ĐżĐŸĐŒĐŸŃ‡ŃŒ: * ĐČ [Visual Studio Code](https://code.visualstudio.com/): -![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) +![ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșа рДЎаĐșŃ‚ĐŸŃ€Đ° ĐșĐŸĐŽĐ°](https://fastapi.tiangolo.com/img/vscode-completion.png) * ĐČ [PyCharm](https://www.jetbrains.com/pycharm/): -![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) +![ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșа рДЎаĐșŃ‚ĐŸŃ€Đ° ĐșĐŸĐŽĐ°](https://fastapi.tiangolo.com/img/pycharm-completion.png) Вы Đ±ŃƒĐŽĐ”Ń‚Đ” ĐżĐŸĐ»ŃƒŃ‡Đ°Ń‚ŃŒ аĐČŃ‚ĐŸĐ·Đ°ĐČĐ”Ń€ŃˆĐ”ĐœĐžĐ” ĐșĐŸĐŽĐ° ЎажД Ń‚Đ°ĐŒ, гЎД ĐČы счОталО ŃŃ‚ĐŸ ĐœĐ”ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœŃ‹ĐŒ Ń€Đ°ĐœŃŒŃˆĐ”. КаĐș ĐżŃ€ĐžĐŒĐ”Ń€, Đșлюч `price` ĐČĐœŃƒŃ‚Ń€Đž тДла JSON (ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐŒĐŸĐ¶Đ”Ń‚ Đ±Ń‹Ń‚ŃŒ ĐČĐ»ĐŸĐ¶Đ”ĐœĐœŃ‹ĐŒ), ĐżŃ€ĐžŃ…ĐŸĐŽŃŃ‰Đ”ĐłĐŸ ĐČ Đ·Đ°ĐżŃ€ĐŸŃĐ”. @@ -151,11 +151,11 @@ FastAPI ĐČĐșлючаДт ĐČ ŃĐ”Đ±Ń чрДзĐČычаĐčĐœĐŸ ĐżŃ€ĐŸŃŃ‚ŃƒŃŽ ĐČ Đž Đ›ŃŽĐ±Đ°Ń ĐžĐœŃ‚Đ”ĐłŃ€Đ°Ń†ĐžŃ Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Đ°ĐœĐ° ĐœĐ°ŃŃ‚ĐŸĐ»ŃŒĐșĐŸ ĐżŃ€ĐŸŃŃ‚ĐŸĐč ĐČ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐž (с заĐČĐžŃĐžĐŒĐŸŃŃ‚ŃĐŒĐž), Ń‡Ń‚ĐŸ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃĐŸĐ·ĐŽĐ°Ń‚ŃŒ Â«ĐżĐ»Đ°ĐłĐžĐœÂ» ĐŽĐ»Ń сĐČĐŸĐ”ĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ ĐČ ĐżĐ°Ń€Ńƒ ŃŃ‚Ń€ĐŸĐș ĐșĐŸĐŽĐ°, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ ту жД струĐșтуру Đž ŃĐžĐœŃ‚Đ°ĐșсОс, Ń‡Ń‚ĐŸ Đž ĐŽĐ»Ń ĐČашох *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐč путо*. -### ĐŸŃ€ĐŸĐČĐ”Ń€Đ”Đœ { #tested } +### ĐŸŃ€ĐŸŃ‚Đ”ŃŃ‚ĐžŃ€ĐŸĐČĐ°Đœ { #tested } -* 100% ĐżĐŸĐșрытОД Ń‚Đ”ŃŃ‚Đ°ĐŒĐž. +* 100% ĐżĐŸĐșрытОД Ń‚Đ”ŃŃ‚Đ°ĐŒĐž. * 100% Đ°ĐœĐœĐŸŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐžĐ” Ń‚ĐžĐżĐŸĐČ ĐČ ĐșĐŸĐŽĐŸĐČĐŸĐč базД. -* Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ŃŃ ĐČ ĐżŃ€ĐŸĐŽĐ°ĐșŃˆĐœâ€‘ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃŃ…. +* Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ŃŃ ĐČ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃŃ… ĐČ ĐżŃ€ĐŸĐŽĐ°ĐșŃˆĐœ. ## Đ’ĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚Đž Starlette { #starlette-features } @@ -190,7 +190,7 @@ FastAPI ĐČĐșлючаДт ĐČ ŃĐ”Đ±Ń чрДзĐČычаĐčĐœĐŸ ĐżŃ€ĐŸŃŃ‚ŃƒŃŽ ĐČ Đž * **НоĐșаĐșĐŸĐč ĐœĐ”Ń€ĐČĐŸŃ‚Ń€Ń‘ĐżĐșĐž**: * ĐĐ” ĐœŃƒĐ¶ĐœĐŸ ĐžĐ·ŃƒŃ‡Đ°Ń‚ŃŒ ĐœĐŸĐČыД ŃŃ…Đ”ĐŒŃ‹ ĐČ ĐŒĐžĐșŃ€ĐŸŃĐ·Ń‹Đșах. * ЕслО ĐČы Đ·ĐœĐ°Đ”Ń‚Đ” топы ĐČ Python, ĐČы Đ·ĐœĐ°Đ”Ń‚Đ”, ĐșаĐș ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Pydantic. -* ĐŸŃ€Đ”ĐșŃ€Đ°ŃĐœĐŸ ŃĐŸŃ‡Đ”Ń‚Đ°Đ”Ń‚ŃŃ с ĐČĐ°ŃˆĐžĐŒ **IDE/Đ»ĐžĐœŃ‚Đ”Ń€/ĐŒĐŸĐ·ĐłĐŸĐŒ**: +* ĐŸŃ€Đ”ĐșŃ€Đ°ŃĐœĐŸ ŃĐŸŃ‡Đ”Ń‚Đ°Đ”Ń‚ŃŃ с ĐČĐ°ŃˆĐžĐŒ **IDE/Đ»ĐžĐœŃ‚Đ”Ń€/ĐŒĐŸĐ·ĐłĐŸĐŒ**: * ĐŸĐŸŃ‚ĐŸĐŒŃƒ Ń‡Ń‚ĐŸ струĐșтуры ĐŽĐ°ĐœĐœŃ‹Ń… pydantic — ŃŃ‚ĐŸ ĐČŃĐ”ĐłĐŸ Đ»ĐžŃˆŃŒ эĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€Ń‹ ĐșĐ»Đ°ŃŃĐŸĐČ, ĐŸĐżŃ€Đ”ĐŽĐ”Đ»Ń‘ĐœĐœŃ‹Ń… ĐČĐ°ĐŒĐž; аĐČŃ‚ĐŸĐ·Đ°ĐČĐ”Ń€ŃˆĐ”ĐœĐžĐ”, ĐżŃ€ĐŸĐČДрĐșа ĐșĐŸĐŽĐ°, mypy Đž ĐČаша ĐžĐœŃ‚ŃƒĐžŃ†ĐžŃ — ĐČсё Đ±ŃƒĐŽĐ”Ń‚ Ń€Đ°Đ±ĐŸŃ‚Đ°Ń‚ŃŒ с ĐČĐ°ŃˆĐžĐŒĐž ĐČĐ°Đ»ĐžĐŽĐžŃ€ĐŸĐČĐ°ĐœĐœŃ‹ĐŒĐž ĐŽĐ°ĐœĐœŃ‹ĐŒĐž. * Đ’Đ°Đ»ĐžĐŽĐ°Ń†ĐžŃ **ŃĐ»ĐŸĐ¶ĐœŃ‹Ń… струĐșтур**: * Đ˜ŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ” ОДрархОчДсĐșох ĐŒĐŸĐŽĐ”Đ»Đ”Đč Pydantic; `List`, `Dict` Đž т.Đż. Оз ĐŒĐŸĐŽŃƒĐ»Ń `typing`. diff --git a/docs/ru/docs/help-fastapi.md b/docs/ru/docs/help-fastapi.md index f9b9ebea3..ff47b93e8 100644 --- a/docs/ru/docs/help-fastapi.md +++ b/docs/ru/docs/help-fastapi.md @@ -38,7 +38,7 @@ ## ĐŸĐŸĐŽĐżĐžŃĐ°Ń‚ŃŒŃŃ ĐœĐ° аĐČŃ‚ĐŸŃ€Đ° { #follow-the-author } -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸĐŽĐżĐžŃĐ°Ń‚ŃŒŃŃ ĐœĐ° [ĐŒĐ”ĐœŃ (SebastiĂĄn RamĂ­rez / `tiangolo`)](https://tiangolo.com) ĐČ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșох ĐŒĐ”ŃŃ‚Đ°Ń…, Ń‡Ń‚ĐŸĐ±Ń‹ ŃƒĐ·ĐœĐ°ĐČать ĐœĐŸĐČĐŸŃŃ‚Đž ĐŸ FastAPI Đž ĐŽŃ€ŃƒĐ·ŃŒŃŃ…: +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸĐŽĐżĐžŃĐ°Ń‚ŃŒŃŃ ĐœĐ° [ĐŒĐ”ĐœŃ (SebastiĂĄn RamĂ­rez / `tiangolo`)](https://tiangolo.com), аĐČŃ‚ĐŸŃ€Đ°, ĐČ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșох ĐŒĐ”ŃŃ‚Đ°Ń…, Ń‡Ń‚ĐŸĐ±Ń‹ ŃƒĐ·ĐœĐ°ĐČать ĐœĐŸĐČĐŸŃŃ‚Đž ĐŸ FastAPI Đž ĐŽŃ€ŃƒĐ·ŃŒŃŃ…: * [@tiangolo ĐČ **GitHub**](https://github.com/tiangolo). * [@tiangolo ĐČ **X (Twitter)**](https://x.com/tiangolo) diff --git a/docs/ru/docs/how-to/configure-swagger-ui.md b/docs/ru/docs/how-to/configure-swagger-ui.md index b57a086b6..0dd60b423 100644 --- a/docs/ru/docs/how-to/configure-swagger-ui.md +++ b/docs/ru/docs/how-to/configure-swagger-ui.md @@ -26,7 +26,7 @@ FastAPI ĐżŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ŃƒĐ”Ń‚ это ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐž ĐČ **JSON**, Ń‡Ń‚ĐŸĐ±Ń‹ ## Đ˜Đ·ĐŒĐ”ĐœĐžŃ‚ŃŒ Ń‚Đ”ĐŒŃƒ { #change-the-theme } -ĐĐœĐ°Đ»ĐŸĐłĐžŃ‡ĐœĐŸ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°ĐŽĐ°Ń‚ŃŒ Ń‚Đ”ĐŒŃƒ ĐżĐŸĐŽŃĐČДтĐșĐž ŃĐžĐœŃ‚Đ°ĐșсОса с ĐșĐ»ŃŽŃ‡ĐŸĐŒ "syntaxHighlight.theme" (ĐŸĐ±Ń€Đ°Ń‚ĐžŃ‚Đ” ĐČĐœĐžĐŒĐ°ĐœĐžĐ”, Ń‡Ń‚ĐŸ ĐżĐŸŃĐ”Ń€Đ”ĐŽĐžĐœĐ” ŃŃ‚ĐŸĐžŃ‚ Ń‚ĐŸŃ‡Đșа): +ĐĐœĐ°Đ»ĐŸĐłĐžŃ‡ĐœĐŸ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°ĐŽĐ°Ń‚ŃŒ Ń‚Đ”ĐŒŃƒ ĐżĐŸĐŽŃĐČДтĐșĐž ŃĐžĐœŃ‚Đ°ĐșсОса с ĐșĐ»ŃŽŃ‡ĐŸĐŒ `"syntaxHighlight.theme"` (ĐŸĐ±Ń€Đ°Ń‚ĐžŃ‚Đ” ĐČĐœĐžĐŒĐ°ĐœĐžĐ”, Ń‡Ń‚ĐŸ ĐżĐŸŃĐ”Ń€Đ”ĐŽĐžĐœĐ” ŃŃ‚ĐŸĐžŃ‚ Ń‚ĐŸŃ‡Đșа): {* ../../docs_src/configure_swagger_ui/tutorial002_py310.py hl[3] *} diff --git a/docs/ru/docs/how-to/custom-request-and-route.md b/docs/ru/docs/how-to/custom-request-and-route.md index 1e3a60856..6a7ecbca9 100644 --- a/docs/ru/docs/how-to/custom-request-and-route.md +++ b/docs/ru/docs/how-to/custom-request-and-route.md @@ -18,13 +18,13 @@ ĐĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ŃŃ†Đ”ĐœĐ°Ń€ĐžĐž: -* ĐŸŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°ĐœĐžĐ” тДл Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ, ĐœĐ” ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” JSON, ĐČ JSON (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, [`msgpack`](https://msgpack.org/index.html)). +* ĐŸŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°ĐœĐžĐ” тДл Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ ĐœĐ” ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” JSON ĐČ JSON (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, [`msgpack`](https://msgpack.org/index.html)). * РаспаĐșĐŸĐČĐșа тДл Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ, сжатых с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ gzip. * АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐŸĐ” Đ»ĐŸĐłĐžŃ€ĐŸĐČĐ°ĐœĐžĐ” ĐČсДх тДл Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ. ## ĐžĐ±Ń€Đ°Đ±ĐŸŃ‚Đșа ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșĐŸĐłĐŸ ĐșĐŸĐŽĐžŃ€ĐŸĐČĐ°ĐœĐžŃ тДла Đ·Đ°ĐżŃ€ĐŸŃĐ° { #handling-custom-request-body-encodings } -ĐŸĐŸŃĐŒĐŸŃ‚Ń€ĐžĐŒ ĐșаĐș ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșĐžĐč ĐżĐŸĐŽĐșласс `Request` ĐŽĐ»Ń распаĐșĐŸĐČĐșĐž gzip-Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ. +ĐŸĐŸŃĐŒĐŸŃ‚Ń€ĐžĐŒ, ĐșаĐș ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșĐžĐč ĐżĐŸĐŽĐșласс `Request` ĐŽĐ»Ń распаĐșĐŸĐČĐșĐž gzip-Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ. И ĐżĐŸĐŽĐșласс `APIRoute`, Ń‡Ń‚ĐŸĐ±Ń‹ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ŃŃ‚ĐŸŃ‚ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșĐžĐč Đșласс Đ·Đ°ĐżŃ€ĐŸŃĐ°. @@ -38,9 +38,9 @@ ĐĄĐœĐ°Ń‡Đ°Đ»Đ° ŃĐŸĐ·ĐŽĐ°ĐŽĐžĐŒ Đșласс `GzipRequest`, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐżĐ”Ń€Đ”ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ ĐŒĐ”Ń‚ĐŸĐŽ `Request.body()` Đž распаĐșŃƒĐ”Ń‚ Ń‚Đ”Đ»ĐŸ Đ·Đ°ĐżŃ€ĐŸŃĐ° про ĐœĐ°Đ»ĐžŃ‡ĐžĐž ŃĐŸĐŸŃ‚ĐČДтстĐČŃƒŃŽŃ‰Đ”ĐłĐŸ HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșа. -ЕслО ĐČ Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐ” ĐœĐ”Ń‚ `gzip`, ĐŸĐœ ĐœĐ” Đ±ŃƒĐŽĐ”Ń‚ пытаться распаĐșĐŸĐČыĐČать Ń‚Đ”Đ»ĐŸ. +ЕслО ĐČ HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐ” ĐœĐ”Ń‚ `gzip`, ĐŸĐœ ĐœĐ” Đ±ŃƒĐŽĐ”Ń‚ пытаться распаĐșĐŸĐČыĐČать Ń‚Đ”Đ»ĐŸ. -йаĐșĐžĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ, ĐŸĐŽĐžĐœ Đž Ń‚ĐŸŃ‚ жД Đșласс ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Đ° ŃĐŒĐŸĐ¶Đ”Ń‚ ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČать ĐșаĐș gzip-сжатыД, таĐș Đž ĐœĐ”ŃĐ¶Đ°Ń‚Ń‹Đ” Đ·Đ°ĐżŃ€ĐŸŃŃ‹. +йаĐșĐžĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ, ĐŸĐŽĐžĐœ Đž Ń‚ĐŸŃ‚ жД Đșласс ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Đ° ŃĐŒĐŸĐ¶Đ”Ń‚ ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČать ĐșаĐș gzip-сжатыД, таĐș Đž ĐœĐ”ŃĐ¶Đ°Ń‚Ń‹Đ” HTTP-Đ·Đ°ĐżŃ€ĐŸŃŃ‹. {* ../../docs_src/custom_request_and_route/tutorial001_an_py310.py hl[9:16] *} @@ -90,7 +90,7 @@ ĐąĐ”ĐŒ жД ĐżĐŸĐŽŃ…ĐŸĐŽĐŸĐŒ ĐŒĐŸĐ¶ĐœĐŸ ĐČĐŸŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČаться, Ń‡Ń‚ĐŸĐ±Ń‹ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ ĐŽĐŸŃŃ‚ŃƒĐż Đș Ń‚Đ”Đ»Ńƒ Đ·Đ°ĐżŃ€ĐŸŃĐ° ĐČ ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐ” ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč. -ĐŃƒĐ¶ĐœĐŸ Đ»ĐžŃˆŃŒ ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Đ°Ń‚ŃŒ Đ·Đ°ĐżŃ€ĐŸŃ ĐČĐœŃƒŃ‚Ń€Đž Đ±Đ»ĐŸĐșа `try`/`except`: +ĐŃƒĐ¶ĐœĐŸ Đ»ĐžŃˆŃŒ ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Đ°Ń‚ŃŒ HTTP-Đ·Đ°ĐżŃ€ĐŸŃ ĐČĐœŃƒŃ‚Ń€Đž Đ±Đ»ĐŸĐșа `try`/`except`: {* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[14,16] *} @@ -104,6 +104,6 @@ {* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[26] *} -В ŃŃ‚ĐŸĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ” *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*, ĐŸĐ±ŃŠŃĐČĐ»Đ”ĐœĐœŃ‹Đ” ĐČ `router`, Đ±ŃƒĐŽŃƒŃ‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșĐžĐč Đșласс `TimedRoute` Đž ĐżĐŸĐ»ŃƒŃ‡Đ°Ń‚ ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đč HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐŸĐș `X-Response-Time` ĐČ ĐŸŃ‚ĐČДтД с ĐČŃ€Đ”ĐŒĐ”ĐœĐ”ĐŒ, Đ·Đ°Ń‚Ń€Đ°Ń‡Đ”ĐœĐœŃ‹ĐŒ ĐœĐ° Ń„ĐŸŃ€ĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžĐ” ĐŸŃ‚ĐČДта: +В ŃŃ‚ĐŸĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ” *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*, ĐŸĐ±ŃŠŃĐČĐ»Đ”ĐœĐœŃ‹Đ” ĐČ `router`, Đ±ŃƒĐŽŃƒŃ‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșĐžĐč Đșласс `TimedRoute` Đž ĐżĐŸĐ»ŃƒŃ‡Đ°Ń‚ ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đč HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐŸĐș `X-Response-Time` ĐČ HTTP-ĐŸŃ‚ĐČДтД с ĐČŃ€Đ”ĐŒĐ”ĐœĐ”ĐŒ, Đ·Đ°Ń‚Ń€Đ°Ń‡Đ”ĐœĐœŃ‹ĐŒ ĐœĐ° Ń„ĐŸŃ€ĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžĐ” HTTP-ĐŸŃ‚ĐČДта: {* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[13:20] *} diff --git a/docs/ru/docs/how-to/graphql.md b/docs/ru/docs/how-to/graphql.md index 1829a211c..880fca2a2 100644 --- a/docs/ru/docs/how-to/graphql.md +++ b/docs/ru/docs/how-to/graphql.md @@ -1,5 +1,6 @@ # GraphQL { #graphql } + йаĐș ĐșаĐș **FastAPI** ĐŸŃĐœĐŸĐČĐ°Đœ ĐœĐ° ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ” **ASGI**, ĐŸŃ‡Đ”ĐœŃŒ лДгĐșĐŸ ĐžĐœŃ‚Đ”ĐłŃ€ĐžŃ€ĐŸĐČать Đ»ŃŽĐ±ŃƒŃŽ Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșу **GraphQL**, таĐșжД ŃĐŸĐČĐŒĐ”ŃŃ‚ĐžĐŒŃƒŃŽ с ASGI. Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐșĐŸĐŒĐ±ĐžĐœĐžŃ€ĐŸĐČать ĐŸĐ±Ń‹Ń‡ĐœŃ‹Đ” *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* FastAPI с GraphQL ĐČ ĐŸĐŽĐœĐŸĐŒ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐž. diff --git a/docs/ru/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/ru/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md index 46b4071da..e32192656 100644 --- a/docs/ru/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md +++ b/docs/ru/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -8,6 +8,8 @@ FastAPI ĐČДрсОО 0.119.0 ĐŽĐŸĐ±Đ°ĐČОл Ń‡Đ°ŃŃ‚ĐžŃ‡ĐœŃƒŃŽ ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đș FastAPI 0.126.0 ŃƒĐ±Ń€Đ°Đ» ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșу Pydantic v1, про ŃŃ‚ĐŸĐŒ Дщё ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€ĐŸĐ” ĐČŃ€Đ”ĐŒŃ ĐżŃ€ĐŸĐŽĐŸĐ»Đ¶Đ°Đ» ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČать `pydantic.v1`. +FastAPI 0.128.0 таĐșжД ŃƒĐ±Ń€Đ°Đ» ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșу `pydantic.v1`, таĐș Ń‡Ń‚ĐŸ ĐżĐŸŃĐ»Đ”ĐŽĐœĐžĐ” ĐČДрсОО FastAPI Ń‚Ń€Đ”Đ±ŃƒŃŽŃ‚ Pydantic v2. + /// warning | ĐŸŃ€Đ”ĐŽŃƒĐżŃ€Đ”Đ¶ĐŽĐ”ĐœĐžĐ” ĐšĐŸĐŒĐ°ĐœĐŽĐ° Pydantic прДĐșратОла ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșу Pydantic v1 ĐŽĐ»Ń ĐżĐŸŃĐ»Đ”ĐŽĐœĐžŃ… ĐČДрсОĐč Python, ĐœĐ°Ń‡ĐžĐœĐ°Ń с **Python 3.14**. @@ -54,6 +56,16 @@ Pydantic v2 ĐČĐșлючаДт ĐČсё Оз Pydantic v1 ĐșаĐș ĐżĐŸĐŽĐŒĐŸĐŽŃƒĐ»ŃŒ ` ### ĐŸĐŸĐŽĐŽĐ”Ń€Đ¶Đșа FastAPI ĐŽĐ»Ń Pydantic v1 ĐČĐœŃƒŃ‚Ń€Đž v2 { #fastapi-support-for-pydantic-v1-in-v2 } +/// warning | ĐŸŃ€Đ”ĐŽŃƒĐżŃ€Đ”Đ¶ĐŽĐ”ĐœĐžĐ” + +Эта ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșа FastAPI ĐŽĐ»Ń ĐŒĐŸĐŽĐ”Đ»Đ”Đč `pydantic.v1` была ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœĐ° ĐČ **FastAPI 0.119.0** Đž ŃƒĐŽĐ°Đ»Đ”ĐœĐ° ĐČ **FastAPI 0.128.0**. ĐžĐœĐ° Đ·Đ°ĐŽŃƒĐŒŃ‹ĐČĐ°Đ»Đ°ŃŃŒ ĐșаĐș ĐČŃ€Đ”ĐŒĐ”ĐœĐœĐ°Ń ĐżĐŸĐŒĐŸŃ‰ŃŒ про ĐŒĐžĐłŃ€Đ°Ń†ĐžĐž ĐœĐ° Pydantic v2. + +В тДĐșущох ĐČĐ”Ń€ŃĐžŃŃ… FastAPI ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ” ĐŒĐŸĐŽĐ”Đ»Đž `pydantic.v1` ĐČ ĐČĐ°ŃˆĐ”ĐŒ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐž ĐČŃ‹Đ·ĐŸĐČДт ĐŸŃˆĐžĐ±Đșу. + +ĐžŃŃ‚Đ°Đ»ŃŒĐœĐ°Ń часть ŃŃ‚ĐŸĐłĐŸ разЎДла ĐŸĐżĐžŃŃ‹ĐČаДт ĐČŃ€Đ”ĐŒĐ”ĐœĐœŃƒŃŽ ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșу, ĐŽĐŸŃŃ‚ŃƒĐżĐœŃƒŃŽ Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐČ ŃŃ‚ĐžŃ… старых ĐČĐ”Ń€ŃĐžŃŃ…. + +/// + ĐĐ°Ń‡ĐžĐœĐ°Ń с FastAPI 0.119.0, Đ”ŃŃ‚ŃŒ таĐșжД Ń‡Đ°ŃŃ‚ĐžŃ‡ĐœĐ°Ń ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșа Pydantic v1 ĐžĐ·ĐœŃƒŃ‚Ń€Đž Pydantic v2, Ń‡Ń‚ĐŸĐ±Ń‹ ŃƒĐżŃ€ĐŸŃŃ‚ĐžŃ‚ŃŒ ĐŒĐžĐłŃ€Đ°Ń†ĐžŃŽ ĐœĐ° v2. йаĐșĐžĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ĐœĐŸĐČоть Pydantic ĐŽĐŸ ĐżĐŸŃĐ»Đ”ĐŽĐœĐ”Đč ĐČДрсОО 2 Đž ŃĐŒĐ”ĐœĐžŃ‚ŃŒ ĐžĐŒĐżĐŸŃ€Ń‚Ń‹ ĐœĐ° ĐżĐŸĐŽĐŒĐŸĐŽŃƒĐ»ŃŒ `pydantic.v1` — ĐČĐŸ ĐŒĐœĐŸĐłĐžŃ… ŃĐ»ŃƒŃ‡Đ°ŃŃ… ĐČсё ĐżŃ€ĐŸŃŃ‚ĐŸ Đ·Đ°Ń€Đ°Đ±ĐŸŃ‚Đ°Đ”Ń‚. @@ -122,6 +134,12 @@ graph TB ### МогроруĐčтД ĐżĐŸ ŃˆĐ°ĐłĐ°ĐŒ { #migrate-in-steps } +/// warning | ĐŸŃ€Đ”ĐŽŃƒĐżŃ€Đ”Đ¶ĐŽĐ”ĐœĐžĐ” + +ĐŸĐŸŃŃ‚Đ”ĐżĐ”ĐœĐœĐ°Ń ĐŒĐžĐłŃ€Đ°Ń†ĐžŃ с ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ”ĐŒ ĐŒĐŸĐŽĐ”Đ»Đ”Đč Pydantic v1 Đž v2 ĐČ ĐŸĐŽĐœĐŸĐŒ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐž, ĐŸĐżĐžŃĐ°ĐœĐœĐ°Ń ĐœĐžĐ¶Đ”, Ń€Đ°Đ±ĐŸŃ‚Đ°Đ”Ń‚ Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐČ **FastAPI 0.119.0 ĐŽĐŸ 0.127.x**. ĐžĐœĐ° была ŃƒĐŽĐ°Đ»Đ”ĐœĐ° ĐČ **FastAPI 0.128.0**, ĐżĐŸŃĐ»Đ”ĐŽĐœĐžĐ” ĐČДрсОО Ń‚Ń€Đ”Đ±ŃƒŃŽŃ‚ ĐŒĐŸĐŽĐ”Đ»Đž **Pydantic v2**. + +/// + /// tip | ĐĄĐŸĐČДт ĐĄĐœĐ°Ń‡Đ°Đ»Đ° ĐżĐŸĐżŃ€ĐŸĐ±ŃƒĐčтД `bump-pydantic`: ДслО тДсты ĐżŃ€ĐŸŃ…ĐŸĐŽŃŃ‚ Đž ĐČсё Ń€Đ°Đ±ĐŸŃ‚Đ°Đ”Ń‚, ĐČы спраĐČĐžĐ»ĐžŃŃŒ ĐŸĐŽĐœĐŸĐč ĐșĐŸĐŒĐ°ĐœĐŽĐŸĐč. ✹ diff --git a/docs/ru/docs/how-to/separate-openapi-schemas.md b/docs/ru/docs/how-to/separate-openapi-schemas.md index 3e0830891..32a056fd2 100644 --- a/docs/ru/docs/how-to/separate-openapi-schemas.md +++ b/docs/ru/docs/how-to/separate-openapi-schemas.md @@ -1,6 +1,6 @@ # Đ Đ°Đ·ĐŽĐ”Đ»ŃŃ‚ŃŒ ŃŃ…Đ”ĐŒŃ‹ OpenAPI ĐŽĐ»Ń ĐČŃ…ĐŸĐŽĐ° Đž ĐČŃ‹Ń…ĐŸĐŽĐ° ОлО ĐœĐ”Ń‚ { #separate-openapi-schemas-for-input-and-output-or-not } -Про ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐž **Pydantic v2** ŃĐłĐ”ĐœĐ”Ń€ĐžŃ€ĐŸĐČĐ°ĐœĐœŃ‹Đč OpenAPI ŃŃ‚Đ°ĐœĐŸĐČотся чуть Đ±ĐŸĐ»Đ”Đ” Ń‚ĐŸŃ‡ĐœŃ‹ĐŒ Đž **ĐșĐŸŃ€Ń€Đ”ĐșŃ‚ĐœŃ‹ĐŒ**, Ń‡Đ”ĐŒ Ń€Đ°ĐœŃŒŃˆĐ”. 😎 +ĐĄ ĐŒĐŸĐŒĐ”ĐœŃ‚Đ° ĐČŃ‹Ń…ĐŸĐŽĐ° **Pydantic v2** ŃĐłĐ”ĐœĐ”Ń€ĐžŃ€ĐŸĐČĐ°ĐœĐœŃ‹Đč OpenAPI ŃŃ‚Đ°ĐœĐŸĐČотся чуть Đ±ĐŸĐ»Đ”Đ” Ń‚ĐŸŃ‡ĐœŃ‹ĐŒ Đž **ĐșĐŸŃ€Ń€Đ”ĐșŃ‚ĐœŃ‹ĐŒ**, Ń‡Đ”ĐŒ Ń€Đ°ĐœŃŒŃˆĐ”. 😎 На ŃĐ°ĐŒĐŸĐŒ ЎДлД, ĐČ ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Ń… ŃĐ»ŃƒŃ‡Đ°ŃŃ… ĐČ OpenAPI Đ±ŃƒĐŽĐ”Ń‚ ЎажД **ĐŽĐČĐ” JSON-ŃŃ…Đ”ĐŒŃ‹** ĐŽĐ»Ń ĐŸĐŽĐœĐŸĐč Đž Ń‚ĐŸĐč жД Pydanticâ€‘ĐŒĐŸĐŽĐ”Đ»Đž: ĐŽĐ»Ń ĐČŃ…ĐŸĐŽĐ° Đž ĐŽĐ»Ń ĐČŃ‹Ń…ĐŸĐŽĐ° — ĐČ Đ·Đ°ĐČĐžŃĐžĐŒĐŸŃŃ‚Đž ĐŸŃ‚ ĐœĐ°Đ»ĐžŃ‡ĐžŃ **Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐč ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ**. diff --git a/docs/ru/docs/index.md b/docs/ru/docs/index.md index 1b6f3d40a..717d5d783 100644 --- a/docs/ru/docs/index.md +++ b/docs/ru/docs/index.md @@ -57,7 +57,7 @@ FastAPI — ŃŃ‚ĐŸ ŃĐŸĐČŃ€Đ”ĐŒĐ”ĐœĐœŃ‹Đč, быстрыĐč (ĐČŃ‹ŃĐŸĐșĐŸĐżŃ€ĐŸĐž -### КлючДĐČĐŸĐč-ŃĐżĐŸĐœŃĐŸŃ€ { #keystone-sponsor } +### КлючДĐČĐŸĐč ŃĐżĐŸĐœŃĐŸŃ€ { #keystone-sponsor }
{% for sponsor in sponsors.keystone -%} @@ -161,7 +161,7 @@ FastAPI — ŃŃ‚ĐŸ ŃĐŸĐČŃ€Đ”ĐŒĐ”ĐœĐœŃ‹Đč, быстрыĐč (ĐČŃ‹ŃĐŸĐșĐŸĐżŃ€ĐŸĐž В ĐșĐŸĐœŃ†Đ” 2025 ĐłĐŸĐŽĐ° ĐČŃ‹ŃˆĐ”Đ» [ĐŒĐžĐœĐž-ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Đ»ŃŒĐœŃ‹Đč Ń„ĐžĐ»ŃŒĐŒ ĐŸ FastAPI](https://www.youtube.com/watch?v=mpR8ngthqiE), ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸŃĐŒĐŸŃ‚Ń€Đ”Ń‚ŃŒ Đ”ĐłĐŸ ĐŸĐœĐ»Đ°ĐčĐœ: -FastAPI Mini Documentary +ĐœĐžĐœĐž-ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Đ»ŃŒĐœŃ‹Đč Ń„ĐžĐ»ŃŒĐŒ ĐŸ FastAPI ## **Typer**, FastAPI ĐŽĐ»Ń CLI { #typer-the-fastapi-of-clis } @@ -364,11 +364,11 @@ def update_item(item_id: int, item: Item): * ĐĐ°Đ¶ĐŒĐžŃ‚Đ” ĐșĐœĐŸĐżĐșу «Try it out», ŃŃ‚ĐŸ ĐżĐŸĐ·ĐČĐŸĐ»ĐžŃ‚ ĐČĐ°ĐŒ Đ·Đ°ĐżĐŸĐ»ĐœĐžŃ‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ Đž ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ ĐČĐ·Đ°ĐžĐŒĐŸĐŽĐ”ĐčстĐČĐŸĐČать с API: -![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) +![Đ’Đ·Đ°ĐžĐŒĐŸĐŽĐ”ĐčстĐČОД ŃĐŸ Swagger UI](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) * Đ—Đ°Ń‚Đ”ĐŒ ĐœĐ°Đ¶ĐŒĐžŃ‚Đ” ĐșĐœĐŸĐżĐșу «Execute», ĐžĐœŃ‚Đ”Ń€Ń„Đ”Đčс сĐČŃĐ¶Đ”Ń‚ŃŃ с ĐČĐ°ŃˆĐžĐŒ API, ĐŸŃ‚ĐżŃ€Đ°ĐČот ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹, ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ Ń€Đ”Đ·ŃƒĐ»ŃŒŃ‚Đ°Ń‚Ń‹ Đž ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ·ĐžŃ‚ ох ĐœĐ° эĐșŃ€Đ°ĐœĐ”: -![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) +![Đ’Đ·Đ°ĐžĐŒĐŸĐŽĐ”ĐčстĐČОД ŃĐŸ Swagger UI](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) ### ĐžĐ±ĐœĐŸĐČĐ»Đ”ĐœĐžĐ” Đ°Đ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČĐœĐŸĐč ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž API { #alternative-api-docs-upgrade } @@ -471,7 +471,7 @@ item: Item ...Đž ĐżĐŸŃĐŒĐŸŃ‚Ń€ĐžŃ‚Đ”, ĐșаĐș ĐČаш рДЎаĐșŃ‚ĐŸŃ€ ĐșĐŸĐŽĐ° Đ±ŃƒĐŽĐ”Ń‚ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž ĐŽĐŸĐżĐŸĐ»ĐœŃŃ‚ŃŒ Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚Ń‹ Đž Đ·ĐœĐ°Ń‚ŃŒ ох топы: -![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) +![ĐŸĐŸĐŽĐŽĐ”Ń€Đ¶Đșа рДЎаĐșŃ‚ĐŸŃ€Đ° ĐșĐŸĐŽĐ°](https://fastapi.tiangolo.com/img/vscode-completion.png) Đ‘ĐŸĐ»Đ”Đ” ĐżĐŸĐ»ĐœŃ‹Đč ĐżŃ€ĐžĐŒĐ”Ń€ с ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹ĐŒĐž ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃĐŒĐž ŃĐŒ. ĐČ ĐŁŃ‡Đ”Đ±ĐœĐžĐș - РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń. @@ -524,7 +524,7 @@ FastAPI Cloud — ĐŸŃĐœĐŸĐČĐœĐŸĐč ŃĐżĐŸĐœŃĐŸŃ€ Đž ĐžŃŃ‚ĐŸŃ‡ĐœĐžĐș Ń„ĐžĐœĐ°Đœ #### РазĐČДртыĐČĐ°ĐœĐžĐ” у Юругох ĐŸĐ±Đ»Đ°Ń‡ĐœŃ‹Ń… ĐżŃ€ĐŸĐČаĐčĐŽĐ”Ń€ĐŸĐČ { #deploy-to-other-cloud-providers } -FastAPI — ŃŃ‚ĐŸ open source Đž ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐžĐ·ĐžŃ€ĐŸĐČĐ°ĐœĐœŃ‹Đč фрДĐčĐŒĐČĐŸŃ€Đș. Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” разĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ FastAPI у Đ»ŃŽĐ±ĐŸĐłĐŸ ĐŸĐ±Đ»Đ°Ń‡ĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐČаĐčЎДра ĐœĐ° ĐČаш ĐČŃ‹Đ±ĐŸŃ€. +FastAPI — ŃŃ‚ĐŸ ĐżŃ€ĐŸĐ”Đșт с ĐŸŃ‚ĐșŃ€Ń‹Ń‚Ń‹ĐŒ ĐžŃŃ…ĐŸĐŽĐœŃ‹ĐŒ ĐșĐŸĐŽĐŸĐŒ, ĐŸŃĐœĐŸĐČĐ°ĐœĐœŃ‹Đč ĐœĐ° ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ°Ń…. Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” разĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ FastAPI у Đ»ŃŽĐ±ĐŸĐłĐŸ ĐŸĐ±Đ»Đ°Ń‡ĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐČаĐčЎДра ĐœĐ° ĐČаш ĐČŃ‹Đ±ĐŸŃ€. ХлДЎуĐčтД руĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐ°ĐŒ ĐČĐ°ŃˆĐ”ĐłĐŸ ĐŸĐ±Đ»Đ°Ń‡ĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐČаĐčЎДра ĐżĐŸ разĐČДртыĐČĐ°ĐœĐžŃŽ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč FastAPI. đŸ€“ @@ -544,7 +544,7 @@ FastAPI заĐČосот ĐŸŃ‚ Pydantic Đž Starlette. Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ŃŃ Pydantic: -* [`email-validator`](https://github.com/JoshData/python-email-validator) — ĐŽĐ»Ń ĐżŃ€ĐŸĐČДрĐșĐž Đ°ĐŽŃ€Đ”ŃĐŸĐČ ŃĐ»Đ”ĐșŃ‚Ń€ĐŸĐœĐœĐŸĐč ĐżĐŸŃ‡Ń‚Ń‹. +* [`email-validator`](https://github.com/JoshData/python-email-validator) — ĐŽĐ»Ń ĐČалОЎацОО Đ°ĐŽŃ€Đ”ŃĐŸĐČ ŃĐ»Đ”ĐșŃ‚Ń€ĐŸĐœĐœĐŸĐč ĐżĐŸŃ‡Ń‚Ń‹. Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ŃŃ Starlette: diff --git a/docs/ru/docs/project-generation.md b/docs/ru/docs/project-generation.md index 7a46b210d..abcc78edb 100644 --- a/docs/ru/docs/project-generation.md +++ b/docs/ru/docs/project-generation.md @@ -20,9 +20,9 @@ - 🩇 ĐŸĐŸĐŽĐŽĐ”Ń€Đ¶Đșа Ń‚Ń‘ĐŒĐœĐŸĐč Ń‚Đ”ĐŒŃ‹. - 🐋 [Docker Compose](https://www.docker.com) ĐŽĐ»Ń Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐž Đž ĐżŃ€ĐŸĐŽĐ°ĐșŃˆĐœ. - 🔒 Đ‘Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸĐ” Ń…ŃŃˆĐžŃ€ĐŸĐČĐ°ĐœĐžĐ” ĐżĐ°Ń€ĐŸĐ»Đ”Đč ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ. -- 🔑 ĐŃƒŃ‚Đ”ĐœŃ‚ĐžŃ„ĐžĐșацоя ĐżĐŸ JWTâ€‘Ń‚ĐŸĐșĐ”ĐœĐ°ĐŒ. +- 🔑 ĐŃƒŃ‚Đ”ĐœŃ‚ĐžŃ„ĐžĐșацоя JWT (JSON Web Token). - đŸ“« Đ’ĐŸŃŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐžĐ” ĐżĐ°Ń€ĐŸĐ»Ń ĐżĐŸ ŃĐ»Đ”ĐșŃ‚Ń€ĐŸĐœĐœĐŸĐč ĐżĐŸŃ‡Ń‚Đ”. - ✅ йДсты с [Pytest](https://pytest.org). - 📞 [Traefik](https://traefik.io) ĐČ Ń€ĐŸĐ»Đž ĐŸĐ±Ń€Đ°Ń‚ĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐșсО / Đ±Đ°Đ»Đ°ĐœŃĐžŃ€ĐŸĐČщоĐșа ĐœĐ°ĐłŃ€ŃƒĐ·ĐșĐž. - 🚱 Đ˜ĐœŃŃ‚Ń€ŃƒĐșцоо ĐżĐŸ разĐČёртыĐČĐ°ĐœĐžŃŽ с ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ”ĐŒ Docker Compose, ĐČĐșĐ»ŃŽŃ‡Đ°Ń ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșу Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽâ€‘ĐżŃ€ĐŸĐșсО Traefik ĐŽĐ»Ń аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐŸĐłĐŸ ĐżĐŸĐ»ŃƒŃ‡Đ”ĐœĐžŃ сДртОфОĐșĐ°Ń‚ĐŸĐČ HTTPS. -- 🏭 CI (continuous integration) Đž CD (continuous deployment) ĐœĐ° ĐŸŃĐœĐŸĐČĐ” GitHub Actions. +- 🏭 CI (ĐœĐ”ĐżŃ€Đ”Ń€Ń‹ĐČĐœĐ°Ń ĐžĐœŃ‚Đ”ĐłŃ€Đ°Ń†ĐžŃ) Đž CD (ĐœĐ”ĐżŃ€Đ”Ń€Ń‹ĐČĐœĐŸĐ” разĐČДртыĐČĐ°ĐœĐžĐ”) ĐœĐ° ĐŸŃĐœĐŸĐČĐ” GitHub Actions. diff --git a/docs/ru/docs/python-types.md b/docs/ru/docs/python-types.md index 4afdad935..4791899b1 100644 --- a/docs/ru/docs/python-types.md +++ b/docs/ru/docs/python-types.md @@ -1,20 +1,20 @@ # ВĐČĐ”ĐŽĐ”ĐœĐžĐ” ĐČ Ń‚ĐžĐżŃ‹ Python { #python-types-intro } -Python ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČаДт ĐœĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đ” Â«ĐżĐŸĐŽŃĐșазĐșĐž Ń‚ĐžĐżĐŸĐČ» (ох таĐșжД ĐœĐ°Đ·Ń‹ĐČают Â«Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžŃĐŒĐž Ń‚ĐžĐżĐŸĐČ»). +Python ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČаДт ĐœĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đ” Â«Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžĐž Ń‚ĐžĐżĐŸĐČ» (таĐșжД ĐœĐ°Đ·Ń‹ĐČĐ°Đ”ĐŒŃ‹Đ” Â«ĐżĐŸĐŽŃĐșазĐșĐ°ĐŒĐž Ń‚ĐžĐżĐŸĐČ»). -Это **Â«ĐżĐŸĐŽŃĐșазĐșĐž Ń‚ĐžĐżĐŸĐČ»** ОлО Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžĐž — ŃŃ‚ĐŸ ŃĐżĐ”Ń†ĐžĐ°Đ»ŃŒĐœŃ‹Đč ŃĐžĐœŃ‚Đ°ĐșсОс, ĐżĐŸĐ·ĐČĐŸĐ»ŃŃŽŃ‰ĐžĐč ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ топ ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœĐŸĐč. +Это **Â«Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžĐž Ń‚ĐžĐżĐŸĐČ»**, ОлО ĐżŃ€ĐŸŃŃ‚ĐŸ Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžĐž, — ŃŃ‚ĐŸ ŃĐżĐ”Ń†ĐžĐ°Đ»ŃŒĐœŃ‹Đč ŃĐžĐœŃ‚Đ°ĐșсОс, ĐżĐŸĐ·ĐČĐŸĐ»ŃŃŽŃ‰ĐžĐč ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ топ ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœĐŸĐč. ĐžĐ±ŃŠŃĐČĐ»ŃŃ топы ĐŽĐ»Ń ĐČашох ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœŃ‹Ń…, рДЎаĐșŃ‚ĐŸŃ€Ń‹ ĐșĐŸĐŽĐ° Đž ĐžĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń‹ ŃĐŒĐŸĐłŃƒŃ‚ Đ»ŃƒŃ‡ŃˆĐ” ĐČас ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČать. -Đ­Ń‚ĐŸ ĐČŃĐ”ĐłĐŸ Đ»ĐžŃˆŃŒ **ĐșратĐșĐŸĐ” руĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ / ĐœĐ°ĐżĐŸĐŒĐžĐœĐ°ĐœĐžĐ”** ĐŸ ĐżĐŸĐŽŃĐșазĐșах Ń‚ĐžĐżĐŸĐČ ĐČ Python. ĐžĐœĐŸ ĐŸŃ…ĐČатыĐČаДт Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐŒĐžĐœĐžĐŒŃƒĐŒ, ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒŃ‹Đč ĐŽĐ»Ń ох ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžŃ с **FastAPI**... Ń‡Ń‚ĐŸ ĐœĐ° ŃĐ°ĐŒĐŸĐŒ ЎДлД ĐŸŃ‡Đ”ĐœŃŒ ĐŒĐ°Đ»ĐŸ. +Đ­Ń‚ĐŸ ĐČŃĐ”ĐłĐŸ Đ»ĐžŃˆŃŒ **ĐșратĐșĐŸĐ” руĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ / ĐœĐ°ĐżĐŸĐŒĐžĐœĐ°ĐœĐžĐ”** ĐŸĐ± Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžŃŃ… Ń‚ĐžĐżĐŸĐČ ĐČ Python. ĐžĐœĐŸ ĐŸŃ…ĐČатыĐČаДт Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐŒĐžĐœĐžĐŒŃƒĐŒ, ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒŃ‹Đč ĐŽĐ»Ń ох ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžŃ с **FastAPI**... Ń‡Ń‚ĐŸ ĐœĐ° ŃĐ°ĐŒĐŸĐŒ ЎДлД ĐŸŃ‡Đ”ĐœŃŒ ĐŒĐ°Đ»ĐŸ. -**FastAPI** цДлОĐșĐŸĐŒ ĐŸŃĐœĐŸĐČĐ°Đœ ĐœĐ° этох ĐżĐŸĐŽŃĐșазĐșах Ń‚ĐžĐżĐŸĐČ â€” ĐŸĐœĐž Юают Đ”ĐŒŃƒ ĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ ĐżŃ€Đ”ĐžĐŒŃƒŃ‰Đ”ŃŃ‚ĐČ Đž ĐČŃ‹ĐłĐŸĐŽ. +**FastAPI** цДлОĐșĐŸĐŒ ĐŸŃĐœĐŸĐČĐ°Đœ ĐœĐ° этох Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžŃŃ… Ń‚ĐžĐżĐŸĐČ â€” ĐŸĐœĐž Юают Đ”ĐŒŃƒ ĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐŸ ĐżŃ€Đ”ĐžĐŒŃƒŃ‰Đ”ŃŃ‚ĐČ Đž ĐČŃ‹ĐłĐŸĐŽ. ĐĐŸ ЎажД ДслО ĐČы ĐœĐžĐșĐŸĐłĐŽĐ° ĐœĐ” ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚Đ” **FastAPI**, ĐČĐ°ĐŒ Đ±ŃƒĐŽĐ”Ń‚ ĐżĐŸĐ»Đ”Đ·ĐœĐŸ ĐœĐ”ĐŒĐœĐŸĐłĐŸ ŃƒĐ·ĐœĐ°Ń‚ŃŒ ĐŸ ĐœĐžŃ…. /// note | ĐŸŃ€ĐžĐŒĐ”Ń‡Đ°ĐœĐžĐ” -ЕслО ĐČы яĐČĐ»ŃĐ”Ń‚Đ”ŃŃŒ эĐșŃĐżĐ”Ń€Ń‚ĐŸĐŒ ĐČ Python Đž ужД Đ·ĐœĐ°Đ”Ń‚Đ” ĐČсё ĐŸ ĐżĐŸĐŽŃĐșазĐșах Ń‚ĐžĐżĐŸĐČ, ĐżĐ”Ń€Đ”Ń…ĐŸĐŽĐžŃ‚Đ” Đș ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”Đč глаĐČĐ”. +ЕслО ĐČы яĐČĐ»ŃĐ”Ń‚Đ”ŃŃŒ эĐșŃĐżĐ”Ń€Ń‚ĐŸĐŒ ĐČ Python Đž ужД Đ·ĐœĐ°Đ”Ń‚Đ” ĐČсё ĐŸĐ± Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžŃŃ… Ń‚ĐžĐżĐŸĐČ, ĐżĐ”Ń€Đ”Ń…ĐŸĐŽĐžŃ‚Đ” Đș ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”Đč глаĐČĐ”. /// @@ -76,7 +76,7 @@ John Doe Đ’ĐŸŃ‚ Đž ĐČсё. -Đ­Ń‚ĐŸ Đž Đ”ŃŃ‚ŃŒ Â«ĐżĐŸĐŽŃĐșазĐșĐž Ń‚ĐžĐżĐŸĐČ»: +Đ­Ń‚ĐŸ Đž Đ”ŃŃ‚ŃŒ Â«Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžĐž Ń‚ĐžĐżĐŸĐČ»: {* ../../docs_src/python_types/tutorial002_py310.py hl[1] *} @@ -90,9 +90,9 @@ John Doe Đ—ĐŽĐ”ŃŃŒ ĐŒŃ‹ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒ ĐŽĐČĐŸĐ”Ń‚ĐŸŃ‡ĐžŃ (`:`), а ĐœĐ” Đ·ĐœĐ°Đș раĐČĐ”ĐœŃŃ‚ĐČа (`=`). -И ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœĐžĐ” ĐżĐŸĐŽŃĐșĐ°Đ·ĐŸĐș Ń‚ĐžĐżĐŸĐČ ĐŸĐ±Ń‹Ń‡ĐœĐŸ ĐœĐ” ĐŒĐ”ĐœŃĐ”Ń‚ ĐżĐŸĐČĐ”ĐŽĐ”ĐœĐžĐ” ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒŃ‹ ĐżĐŸ сраĐČĐœĐ”ĐœĐžŃŽ с ĐČĐ°Ń€ĐžĐ°ĐœŃ‚ĐŸĐŒ бДз ĐœĐžŃ…. +И ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœĐžĐ” Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžĐč Ń‚ĐžĐżĐŸĐČ ĐŸĐ±Ń‹Ń‡ĐœĐŸ ĐœĐ” ĐŒĐ”ĐœŃĐ”Ń‚ ĐżĐŸĐČĐ”ĐŽĐ”ĐœĐžĐ” ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒŃ‹ ĐżĐŸ сраĐČĐœĐ”ĐœĐžŃŽ с ĐČĐ°Ń€ĐžĐ°ĐœŃ‚ĐŸĐŒ бДз ĐœĐžŃ…. -ĐĐŸ Ń‚Đ”ĐżĐ”Ń€ŃŒ прДЎстаĐČŃŒŃ‚Đ”, Ń‡Ń‚ĐŸ ĐČы ŃĐœĐŸĐČа ĐżĐŸŃĐ”Ń€Đ”ĐŽĐžĐœĐ” ĐœĐ°ĐżĐžŃĐ°ĐœĐžŃ ŃŃ‚ĐŸĐč Ń„ŃƒĐœĐșцоо, Ń‚ĐŸĐ»ŃŒĐșĐŸ ужД с ĐżĐŸĐŽŃĐșазĐșĐ°ĐŒĐž Ń‚ĐžĐżĐŸĐČ. +ĐĐŸ Ń‚Đ”ĐżĐ”Ń€ŃŒ прДЎстаĐČŃŒŃ‚Đ”, Ń‡Ń‚ĐŸ ĐČы ŃĐœĐŸĐČа ĐżĐŸŃĐ”Ń€Đ”ĐŽĐžĐœĐ” ĐœĐ°ĐżĐžŃĐ°ĐœĐžŃ ŃŃ‚ĐŸĐč Ń„ŃƒĐœĐșцоо, Ń‚ĐŸĐ»ŃŒĐșĐŸ ужД с Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžŃĐŒĐž Ń‚ĐžĐżĐŸĐČ. В Ń‚ĐŸŃ‚ жД ĐŒĐŸĐŒĐ”ĐœŃ‚ ĐČы ĐżŃ€ĐŸĐ±ŃƒĐ”Ń‚Đ” ĐČызĐČать аĐČŃ‚ĐŸĐ·Đ°ĐČĐ”Ń€ŃˆĐ”ĐœĐžĐ” с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `Ctrl+Space` — Đž ĐČОЎОтД: @@ -104,7 +104,7 @@ John Doe ## Đ‘ĐŸĐ»ŃŒŃˆĐ” ĐŒĐŸŃ‚ĐžĐČацоо { #more-motivation } -ĐŸĐŸŃĐŒĐŸŃ‚Ń€ĐžŃ‚Đ” ĐœĐ° эту Ń„ŃƒĐœĐșцою — у ĐœĐ”Ń‘ ужД Đ”ŃŃ‚ŃŒ ĐżĐŸĐŽŃĐșазĐșĐž Ń‚ĐžĐżĐŸĐČ: +ĐŸĐŸŃĐŒĐŸŃ‚Ń€ĐžŃ‚Đ” ĐœĐ° эту Ń„ŃƒĐœĐșцою — у ĐœĐ”Ń‘ ужД Đ”ŃŃ‚ŃŒ Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžĐž Ń‚ĐžĐżĐŸĐČ: {* ../../docs_src/python_types/tutorial003_py310.py hl[1] *} @@ -118,7 +118,7 @@ John Doe ## ĐžĐ±ŃŠŃĐČĐ»Đ”ĐœĐžĐ” Ń‚ĐžĐżĐŸĐČ { #declaring-types } -Вы Ń‚ĐŸĐ»ŃŒĐșĐŸ Ń‡Ń‚ĐŸ уĐČОЎДлО ĐŸŃĐœĐŸĐČĐœĐŸĐ” ĐŒĐ”ŃŃ‚ĐŸ, гЎД ĐŸĐ±ŃŠŃĐČĐ»ŃŃŽŃ‚ ĐżĐŸĐŽŃĐșазĐșĐž Ń‚ĐžĐżĐŸĐČ â€” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ Ń„ŃƒĐœĐșцоо. +Вы Ń‚ĐŸĐ»ŃŒĐșĐŸ Ń‡Ń‚ĐŸ уĐČОЎДлО ĐŸŃĐœĐŸĐČĐœĐŸĐ” ĐŒĐ”ŃŃ‚ĐŸ, гЎД ĐŸĐ±ŃŠŃĐČĐ»ŃŃŽŃ‚ Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžĐž Ń‚ĐžĐżĐŸĐČ â€” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ Ń„ŃƒĐœĐșцоо. Đ­Ń‚ĐŸ таĐșжД ĐŸŃĐœĐŸĐČĐœĐŸĐ” ĐŒĐ”ŃŃ‚ĐŸ, гЎД ĐČы Đ±ŃƒĐŽĐ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ох с **FastAPI**. @@ -293,9 +293,9 @@ def some_function(data: Any): Вы уĐČОЎОтД ĐœĐ°ĐŒĐœĐŸĐłĐŸ Đ±ĐŸĐ»ŃŒŃˆĐ” ĐČŃĐ”ĐłĐŸ ŃŃ‚ĐŸĐłĐŸ ĐœĐ° праĐșтоĐșĐ” ĐČ [ĐŁŃ‡Đ”Đ±ĐœĐžĐș - РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń](tutorial/index.md). -## ĐŸĐŸĐŽŃĐșазĐșĐž Ń‚ĐžĐżĐŸĐČ Ń Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžŃĐŒĐž ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Ń… { #type-hints-with-metadata-annotations } +## ĐĐœĐœĐŸŃ‚Đ°Ń†ĐžĐž Ń‚ĐžĐżĐŸĐČ Ń Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžŃĐŒĐž ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Ń… { #type-hints-with-metadata-annotations } -В Python таĐșжД Đ”ŃŃ‚ŃŒ ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ ĐŽĐŸĐ±Đ°ĐČĐ»ŃŃ‚ŃŒ **ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đ” ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Đ”** Đș ĐżĐŸĐŽŃĐșазĐșĐ°ĐŒ Ń‚ĐžĐżĐŸĐČ Ń ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `Annotated`. +В Python таĐșжД Đ”ŃŃ‚ŃŒ ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ ĐŽĐŸĐ±Đ°ĐČĐ»ŃŃ‚ŃŒ **ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đ” ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Đ”** Đș Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžŃĐŒ Ń‚ĐžĐżĐŸĐČ Ń ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `Annotated`. Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžĐŒĐżĐŸŃ€Ń‚ĐžŃ€ĐŸĐČать `Annotated` Оз `typing`. @@ -321,16 +321,16 @@ def some_function(data: Any): ## ĐĐœĐœĐŸŃ‚Đ°Ń†ĐžĐž Ń‚ĐžĐżĐŸĐČ ĐČ **FastAPI** { #type-hints-in-fastapi } -**FastAPI** ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ это ĐżĐŸĐŽŃĐșазĐșĐž Ń‚ĐžĐżĐŸĐČ ĐŽĐ»Ń ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœĐžŃ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșох заЎач. +**FastAPI** ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ это Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžĐž Ń‚ĐžĐżĐŸĐČ ĐŽĐ»Ń ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœĐžŃ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșох заЎач. -ĐĄ **FastAPI** ĐČы ĐŸĐ±ŃŠŃĐČĐ»ŃĐ”Ń‚Đ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ с ĐżĐŸĐŽŃĐșазĐșĐ°ĐŒĐž Ń‚ĐžĐżĐŸĐČ Đž ĐżĐŸĐ»ŃƒŃ‡Đ°Đ”Ń‚Đ”: +ĐĄ **FastAPI** ĐČы ĐŸĐ±ŃŠŃĐČĐ»ŃĐ”Ń‚Đ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ с Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžŃĐŒĐž Ń‚ĐžĐżĐŸĐČ Đž ĐżĐŸĐ»ŃƒŃ‡Đ°Đ”Ń‚Đ”: * **ĐŸĐŸĐŽĐŽĐ”Ń€Đ¶Đșу рДЎаĐșŃ‚ĐŸŃ€Đ° ĐșĐŸĐŽĐ°**. * **ĐŸŃ€ĐŸĐČДрĐșĐž Ń‚ĐžĐżĐŸĐČ**. ...Đž **FastAPI** ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ это жД ĐŸĐ±ŃŠŃĐČĐ»Đ”ĐœĐžŃ ĐŽĐ»Ń: -* **ĐžĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐžŃ Ń‚Ń€Đ”Đ±ĐŸĐČĐ°ĐœĐžĐč**: Оз path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ ĐżŃƒŃ‚Đž Đ·Đ°ĐżŃ€ĐŸŃĐ°, query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ, HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐŸĐČ, тДл Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ, заĐČĐžŃĐžĐŒĐŸŃŃ‚Đ”Đč Đž т.ĐŽ. +* **ĐžĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐžŃ Ń‚Ń€Đ”Đ±ĐŸĐČĐ°ĐœĐžĐč**: Оз path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°, query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ, HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐŸĐČ, тДл Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ, заĐČĐžŃĐžĐŒĐŸŃŃ‚Đ”Đč Đž т.ĐŽ. * **ĐŸŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°ĐœĐžŃ ĐŽĐ°ĐœĐœŃ‹Ń…**: Оз HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ° Đș Ń‚Ń€Đ”Đ±ŃƒĐ”ĐŒĐŸĐŒŃƒ топу. * **ВалОЎацОО ĐŽĐ°ĐœĐœŃ‹Ń…**: ĐżŃ€ĐžŃ…ĐŸĐŽŃŃ‰ĐžŃ… с ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°: * Đ“Đ”ĐœĐ”Ń€Đ°Ń†ĐžĐž **аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșох ĐŸŃˆĐžĐ±ĐŸĐș**, ĐČĐŸĐ·ĐČŃ€Đ°Ń‰Đ°Đ”ĐŒŃ‹Ń… ĐșĐ»ĐžĐ”ĐœŃ‚Ńƒ, ĐșĐŸĐłĐŽĐ° ĐŽĐ°ĐœĐœŃ‹Đ” ĐœĐ”ĐșĐŸŃ€Ń€Đ”ĐșŃ‚ĐœŃ‹. diff --git a/docs/ru/docs/tutorial/bigger-applications.md b/docs/ru/docs/tutorial/bigger-applications.md index 2c7784f22..038777b0c 100644 --- a/docs/ru/docs/tutorial/bigger-applications.md +++ b/docs/ru/docs/tutorial/bigger-applications.md @@ -17,16 +17,16 @@ ``` . ├── app -│   ├── __init__.py -│   ├── main.py -│   ├── dependencies.py -│   └── routers -│   │ ├── __init__.py -│   │ ├── items.py -│   │ └── users.py -│   └── internal -│   ├── __init__.py -│   └── admin.py +│ ├── __init__.py +│ ├── main.py +│ ├── dependencies.py +│ └── routers +│ │ ├── __init__.py +│ │ ├── items.py +│ │ └── users.py +│ └── internal +│ ├── __init__.py +│ └── admin.py ``` /// tip | ĐŸĐŸĐŽŃĐșазĐșа @@ -58,16 +58,16 @@ from app.routers import items ```bash . -├── app # "app" паĐșДт +├── app # "app" — Python-паĐșДт │   ├── __init__.py # ŃŃ‚ĐŸŃ‚ фаĐčĐ» прДĐČращаДт "app" ĐČ "Python-паĐșДт" │   ├── main.py # ĐŒĐŸĐŽŃƒĐ»ŃŒ "main", ĐœĐ°ĐżŃ€.: import app.main │   ├── dependencies.py # ĐŒĐŸĐŽŃƒĐ»ŃŒ "dependencies", ĐœĐ°ĐżŃ€.: import app.dependencies -│   └── routers # ĐżĐŸĐŽĐżĐ°ĐșДт "routers" -│   │ ├── __init__.py # прДĐČращаДт "routers" ĐČ ĐżĐŸĐŽĐżĐ°ĐșДт +│   └── routers # "routers" — "Python-ĐżĐŸĐŽĐżĐ°ĐșДт" +│   │ ├── __init__.py # прДĐČращаДт "routers" ĐČ "Python-ĐżĐŸĐŽĐżĐ°ĐșДт" │   │ ├── items.py # ĐżĐŸĐŽĐŒĐŸĐŽŃƒĐ»ŃŒ "items", ĐœĐ°ĐżŃ€.: import app.routers.items │   │ └── users.py # ĐżĐŸĐŽĐŒĐŸĐŽŃƒĐ»ŃŒ "users", ĐœĐ°ĐżŃ€.: import app.routers.users -│   └── internal # ĐżĐŸĐŽĐżĐ°ĐșДт "internal" -│   ├── __init__.py # прДĐČращаДт "internal" ĐČ ĐżĐŸĐŽĐżĐ°ĐșДт +│   └── internal # "internal" — "Python-ĐżĐŸĐŽĐżĐ°ĐșДт" +│   ├── __init__.py # прДĐČращаДт "internal" ĐČ "Python-ĐżĐŸĐŽĐżĐ°ĐșДт" │   └── admin.py # ĐżĐŸĐŽĐŒĐŸĐŽŃƒĐ»ŃŒ "admin", ĐœĐ°ĐżŃ€.: import app.internal.admin ``` @@ -121,7 +121,7 @@ from app.routers import items /// tip | ĐŸĐŸĐŽŃĐșазĐșа -Đ”Đ»Ń ĐżŃ€ĐŸŃŃ‚ĐŸŃ‚Ń‹ ĐŒŃ‹ ĐČĐŸŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Đ»ĐžŃŃŒ ĐČŃ‹ĐŽŃƒĐŒĐ°ĐœĐœŃ‹ĐŒ Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐŸĐŒ. +Đ”Đ»Ń ĐżŃ€ĐŸŃŃ‚ĐŸŃ‚Ń‹ ĐŒŃ‹ ĐČĐŸŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Đ»ĐžŃŃŒ ĐČŃ‹ĐŽŃƒĐŒĐ°ĐœĐœŃ‹ĐŒ HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐŸĐŒ. В Ń€Đ”Đ°Đ»ŃŒĐœŃ‹Ń… ŃĐ»ŃƒŃ‡Đ°ŃŃ… ĐŽĐ»Ń ĐżĐŸĐ»ŃƒŃ‡Đ”ĐœĐžŃ ĐœĐ°ĐžĐ»ŃƒŃ‡ŃˆĐžŃ… Ń€Đ”Đ·ŃƒĐ»ŃŒŃ‚Đ°Ń‚ĐŸĐČ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД ĐžĐœŃ‚Đ”ĐłŃ€ĐžŃ€ĐŸĐČĐ°ĐœĐœŃ‹Đ” [ŃƒŃ‚ĐžĐ»ĐžŃ‚Ń‹ Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž](security/index.md). @@ -163,9 +163,9 @@ async def read_item(item_id: str): В ĐœĐ°ŃˆĐ”ĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” прДфОĐșŃĐŸĐŒ яĐČĐ»ŃĐ”Ń‚ŃŃ `/items`. -Мы таĐșжД ĐŒĐŸĐ¶Đ”ĐŒ ĐŽĐŸĐ±Đ°ĐČоть ŃĐżĐžŃĐŸĐș `tags` Đž ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đ” `responses`, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” Đ±ŃƒĐŽŃƒŃ‚ ĐżŃ€ĐžĐŒĐ”ĐœŃŃ‚ŃŒŃŃ ĐșĐŸ ĐČŃĐ”ĐŒ *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃĐŒ путо*, ĐČĐșĐ»ŃŽŃ‡Ń‘ĐœĐœŃ‹ĐŒ ĐČ ŃŃ‚ĐŸŃ‚ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€. +Мы таĐșжД ĐŒĐŸĐ¶Đ”ĐŒ ĐŽĐŸĐ±Đ°ĐČоть ŃĐżĐžŃĐŸĐș `tags` Đž ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đ” `responses`, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” Đ±ŃƒĐŽŃƒŃ‚ ĐżŃ€ĐžĐŒĐ”ĐœŃŃ‚ŃŒŃŃ ĐșĐŸ ĐČŃĐ”ĐŒ *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃĐŒ путо*, ĐČĐșĐ»ŃŽŃ‡Ń‘ĐœĐœŃ‹ĐŒ ĐČ ŃŃ‚ĐŸŃ‚ Ń€ĐŸŃƒŃ‚Đ”Ń€. -И Дщё ĐŒŃ‹ ĐŒĐŸĐ¶Đ”ĐŒ ĐŽĐŸĐ±Đ°ĐČоть ŃĐżĐžŃĐŸĐș `dependencies`, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” Đ±ŃƒĐŽŃƒŃ‚ ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœŃ‹ ĐșĐŸ ĐČŃĐ”ĐŒ *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃĐŒ путо* ĐČ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€Đ” Đž Đ±ŃƒĐŽŃƒŃ‚ ĐČŃ‹ĐżĐŸĐ»ĐœŃŃ‚ŃŒŃŃ/Ń€Đ°Đ·Ń€Đ”ŃˆĐ°Ń‚ŃŒŃŃ ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ° Đș ĐœĐžĐŒ. +И Дщё ĐŒŃ‹ ĐŒĐŸĐ¶Đ”ĐŒ ĐŽĐŸĐ±Đ°ĐČоть ŃĐżĐžŃĐŸĐș `dependencies`, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” Đ±ŃƒĐŽŃƒŃ‚ ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœŃ‹ ĐșĐŸ ĐČŃĐ”ĐŒ *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃĐŒ путо* ĐČ Ń€ĐŸŃƒŃ‚Đ”Ń€Đ” Đž Đ±ŃƒĐŽŃƒŃ‚ ĐČŃ‹ĐżĐŸĐ»ĐœŃŃ‚ŃŒŃŃ/Ń€Đ°Đ·Ń€Đ”ŃˆĐ°Ń‚ŃŒŃŃ ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ° Đș ĐœĐžĐŒ. /// tip | ĐŸĐŸĐŽŃĐșазĐșа @@ -185,7 +185,7 @@ async def read_item(item_id: str): * ВсД ĐŸĐœĐž Đ±ŃƒĐŽŃƒŃ‚ ĐČĐșĐ»ŃŽŃ‡Đ°Ń‚ŃŒ ĐżŃ€Đ”ĐŽĐŸĐżŃ€Đ”ĐŽĐ”Đ»Ń‘ĐœĐœŃ‹Đ” `responses`. * ВсД это *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* Đ±ŃƒĐŽŃƒŃ‚ ĐžĐŒĐ”Ń‚ŃŒ ŃĐżĐžŃĐŸĐș `dependencies`, ĐČŃ‹Ń‡ĐžŃĐ»ŃĐ”ĐŒŃ‹Ń…/ĐČŃ‹ĐżĐŸĐ»ĐœŃĐ”ĐŒŃ‹Ń… пДрДЎ ĐœĐžĐŒĐž. * ЕслО ĐČы таĐșжД ĐŸĐ±ŃŠŃĐČОтД заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž ĐČ ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐŸĐč *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*, **ĐŸĐœĐž Ń‚ĐŸĐ¶Đ” Đ±ŃƒĐŽŃƒŃ‚ ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœŃ‹**. - * ĐĄĐœĐ°Ń‡Đ°Đ»Đ° ĐČŃ‹ĐżĐŸĐ»ĐœŃŃŽŃ‚ŃŃ заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€Đ°, Đ·Đ°Ń‚Đ”ĐŒ [`dependencies` ĐČ ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€Đ”](dependencies/dependencies-in-path-operation-decorators.md), Đž Đ·Đ°Ń‚Đ”ĐŒ ĐŸĐ±Ń‹Ń‡ĐœŃ‹Đ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐžŃ‡Đ”ŃĐșОД заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž. + * ĐĄĐœĐ°Ń‡Đ°Đ»Đ° ĐČŃ‹ĐżĐŸĐ»ĐœŃŃŽŃ‚ŃŃ заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž Ń€ĐŸŃƒŃ‚Đ”Ń€Đ°, Đ·Đ°Ń‚Đ”ĐŒ [`dependencies` ĐČ ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€Đ”](dependencies/dependencies-in-path-operation-decorators.md), Đž Đ·Đ°Ń‚Đ”ĐŒ ĐŸĐ±Ń‹Ń‡ĐœŃ‹Đ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐžŃ‡Đ”ŃĐșОД заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž. * Вы таĐșжД ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽĐŸĐ±Đ°ĐČоть [`Security`-заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž с `scopes`](../advanced/security/oauth2-scopes.md). /// tip | ĐŸĐŸĐŽŃĐșазĐșа @@ -263,7 +263,7 @@ from ...dependencies import get_token_header Ń‚ĐŸ ŃŃ‚ĐŸ бы ĐŸĐ·ĐœĐ°Ń‡Đ°Đ»ĐŸ: -* Начать ĐČ Ń‚ĐŸĐŒ жД паĐșДтД, ĐČ ĐșĐŸŃ‚ĐŸŃ€ĐŸĐŒ ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŃ ŃŃ‚ĐŸŃ‚ ĐŒĐŸĐŽŃƒĐ»ŃŒ (фаĐčĐ» `app/routers/items.py`) Ń€Đ°ŃĐżĐŸĐ»ĐŸĐ¶Đ”Đœ ĐČ (ĐșĐ°Ń‚Đ°Đ»ĐŸĐłĐ” `app/routers/`)... +* Начать ĐČ Ń‚ĐŸĐŒ жД паĐșДтД, ĐČ ĐșĐŸŃ‚ĐŸŃ€ĐŸĐŒ ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŃ ŃŃ‚ĐŸŃ‚ ĐŒĐŸĐŽŃƒĐ»ŃŒ (фаĐčĐ» `app/routers/items.py`) (ĐșĐ°Ń‚Đ°Đ»ĐŸĐł `app/routers/`)... * пДрДĐčто ĐČ Ń€ĐŸĐŽĐžŃ‚Đ”Đ»ŃŒŃĐșĐžĐč паĐșДт (ĐșĐ°Ń‚Đ°Đ»ĐŸĐł `app/`)... * Đ·Đ°Ń‚Đ”ĐŒ пДрДĐčто ĐČ Ń€ĐŸĐŽĐžŃ‚Đ”Đ»ŃŒŃĐșĐžĐč паĐșДт ŃŃ‚ĐŸĐłĐŸ паĐșДта (Ń€ĐŸĐŽĐžŃ‚Đ”Đ»ŃŒŃĐșĐŸĐłĐŸ паĐșДта ĐœĐ”Ń‚, `app` — ĐČĐ”Ń€Ń…ĐœĐžĐč ŃƒŃ€ĐŸĐČĐ”ĐœŃŒ đŸ˜±)... * Đž Ń‚Đ°ĐŒ ĐœĐ°Đčто ĐŒĐŸĐŽŃƒĐ»ŃŒ `dependencies` (фаĐčĐ» `app/dependencies.py`)... @@ -285,7 +285,7 @@ from ...dependencies import get_token_header Эта ĐżĐŸŃĐ»Đ”ĐŽĐœŃŃ ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃ путо Đ±ŃƒĐŽĐ”Ń‚ ĐžĐŒĐ”Ń‚ŃŒ ĐșĐŸĐŒĐ±ĐžĐœĐ°Ń†ĐžŃŽ Ń‚Đ”ĐłĐŸĐČ: `["items", "custom"]`. -И ĐČ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž у ĐœĐ”Ń‘ Đ±ŃƒĐŽŃƒŃ‚ ĐŸĐ±Đ° ĐŸŃ‚ĐČДта: ĐŸĐŽĐžĐœ ĐŽĐ»Ń `404` Đž ĐŸĐŽĐžĐœ ĐŽĐ»Ń `403`. +И ĐČ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž у ĐœĐ”Ń‘ Đ±ŃƒĐŽŃƒŃ‚ ĐŸĐ±Đ° HTTP-ĐŸŃ‚ĐČДта: ĐŸĐŽĐžĐœ ĐŽĐ»Ń `404` Đž ĐŸĐŽĐžĐœ ĐŽĐ»Ń `403`. /// @@ -325,7 +325,7 @@ from .routers import items, users ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚: -* Начать ĐČ Ń‚ĐŸĐŒ жД паĐșДтД, ĐČ ĐșĐŸŃ‚ĐŸŃ€ĐŸĐŒ ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŃ ŃŃ‚ĐŸŃ‚ ĐŒĐŸĐŽŃƒĐ»ŃŒ (фаĐčĐ» `app/main.py`) Ń€Đ°ŃĐżĐŸĐ»ĐŸĐ¶Đ”Đœ ĐČ (ĐșĐ°Ń‚Đ°Đ»ĐŸĐłĐ” `app/`)... +* Начать ĐČ Ń‚ĐŸĐŒ жД паĐșДтД, ĐČ ĐșĐŸŃ‚ĐŸŃ€ĐŸĐŒ ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŃ ŃŃ‚ĐŸŃ‚ ĐŒĐŸĐŽŃƒĐ»ŃŒ (фаĐčĐ» `app/main.py`) (ĐșĐ°Ń‚Đ°Đ»ĐŸĐł `app/`)... * ĐœĐ°Đčто ĐżĐŸĐŽĐżĐ°ĐșДт `routers` (ĐșĐ°Ń‚Đ°Đ»ĐŸĐł `app/routers/`)... * Đž ĐžĐŒĐżĐŸŃ€Ń‚ĐžŃ€ĐŸĐČать Оз ĐœĐ”ĐłĐŸ ĐżĐŸĐŽĐŒĐŸĐŽŃƒĐ»Đž `items` (фаĐčĐ» `app/routers/items.py`) Đž `users` (фаĐčĐ» `app/routers/users.py`)... @@ -392,19 +392,19 @@ from .routers.users import router ĐĄ ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `app.include_router()` ĐŒŃ‹ ĐŒĐŸĐ¶Đ”ĐŒ ĐŽĐŸĐ±Đ°ĐČоть ĐșажЎыĐč `APIRouter` ĐČ ĐŸŃĐœĐŸĐČĐœĐŸĐ” ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” `FastAPI`. -ĐžĐœ ĐČĐșлючОт ĐČсД ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Ń‹ ŃŃ‚ĐŸĐłĐŸ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€Đ° ĐșаĐș часть ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ. +ĐžĐœ ĐČĐșлючОт ĐČсД ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Ń‹ ŃŃ‚ĐŸĐłĐŸ Ń€ĐŸŃƒŃ‚Đ”Ń€Đ° ĐșаĐș часть ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ. /// note | ĐąĐ”Ń…ĐœĐžŃ‡Đ”ŃĐșОД ЎДталО -FastAPI ŃĐŸŃ…Ń€Đ°ĐœŃĐ”Ń‚ ĐžŃŃ…ĐŸĐŽĐœŃ‹Đč `APIRouter` Đž Đ”ĐłĐŸ `APIRoute` аĐșтоĐČĐœŃ‹ĐŒĐž, ĐșĐŸĐłĐŽĐ° ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€ ĐČĐșĐ»ŃŽŃ‡Đ°Đ”Ń‚ŃŃ ĐČ ĐŸŃĐœĐŸĐČĐœĐŸĐ” ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”. +FastAPI ŃĐŸŃ…Ń€Đ°ĐœŃĐ”Ń‚ ĐžŃŃ…ĐŸĐŽĐœŃ‹Đč `APIRouter` Đž Đ”ĐłĐŸ `APIRoute` аĐșтоĐČĐœŃ‹ĐŒĐž, ĐșĐŸĐłĐŽĐ° Ń€ĐŸŃƒŃ‚Đ”Ń€ ĐČĐșĐ»ŃŽŃ‡Đ°Đ”Ń‚ŃŃ ĐČ ĐŸŃĐœĐŸĐČĐœĐŸĐ” ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”. -Đ­Ń‚ĐŸ ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚, Ń‡Ń‚ĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșОД ĐżĐŸĐŽĐșлассы `APIRouter` Đž `APIRoute` ĐżĐŸ-ĐżŃ€Đ”Đ¶ĐœĐ”ĐŒŃƒ участĐČуют ĐżĐŸŃĐ»Đ” ĐżĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐžŃ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€Đ°. +Đ­Ń‚ĐŸ ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚, Ń‡Ń‚ĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșОД ĐżĐŸĐŽĐșлассы `APIRouter` Đž `APIRoute` ĐżĐŸ-ĐżŃ€Đ”Đ¶ĐœĐ”ĐŒŃƒ участĐČуют ĐżĐŸŃĐ»Đ” ĐżĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐžŃ Ń€ĐŸŃƒŃ‚Đ”Ń€Đ°. /// /// tip | ĐŸĐŸĐŽŃĐșазĐșа -Про ĐżĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐž ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€ĐŸĐČ ĐœĐ” ĐœŃƒĐ¶ĐœĐŸ Đ±Đ”ŃĐżĐŸĐșĐŸĐžŃ‚ŃŒŃŃ ĐŸ ĐżŃ€ĐŸĐžĐ·ĐČĐŸĐŽĐžŃ‚Đ”Đ»ŃŒĐœĐŸŃŃ‚Đž. +Про ĐżĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐž Ń€ĐŸŃƒŃ‚Đ”Ń€ĐŸĐČ ĐœĐ” ĐœŃƒĐ¶ĐœĐŸ Đ±Đ”ŃĐżĐŸĐșĐŸĐžŃ‚ŃŒŃŃ ĐŸ ĐżŃ€ĐŸĐžĐ·ĐČĐŸĐŽĐžŃ‚Đ”Đ»ŃŒĐœĐŸŃŃ‚Đž. Đ­Ń‚ĐŸ ŃĐŽĐ”Đ»Đ°ĐœĐŸ ĐŒĐ°ĐșŃĐžĐŒĐ°Đ»ŃŒĐœĐŸ лёгĐșĐžĐŒ Đž ĐœĐ” ĐŽĐŸĐ±Đ°ĐČĐ»ŃĐ”Ń‚ ĐœĐ°ĐșĐ»Đ°ĐŽĐœŃ‹Ń… Ń€Đ°ŃŃ…ĐŸĐŽĐŸĐČ ĐœĐ° ĐșажЎыĐč Đ·Đ°ĐżŃ€ĐŸŃ. @@ -435,7 +435,7 @@ FastAPI ŃĐŸŃ…Ń€Đ°ĐœŃĐ”Ń‚ ĐžŃŃ…ĐŸĐŽĐœŃ‹Đč `APIRouter` Đž Đ”ĐłĐŸ `APIRoute` а * ĐŸŃ€Đ”Ń„ĐžĐșс `/admin`. * йДг `admin`. * ЗаĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŒ `get_token_header`. -* ОтĐČДт `418`. đŸ” +* HTTP-ĐŸŃ‚ĐČДт `418`. đŸ” ĐĐŸ ŃŃ‚ĐŸ ĐżĐŸĐČĐ»ĐžŃĐ”Ń‚ Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐœĐ° ŃŃ‚ĐŸŃ‚ `APIRouter` ĐČ ĐœĐ°ŃˆĐ”ĐŒ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐž, а ĐœĐ” ĐœĐ° Đ»ŃŽĐ±ĐŸĐč ĐŽŃ€ŃƒĐłĐŸĐč ĐșĐŸĐŽ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč Đ”ĐłĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚. @@ -461,7 +461,7 @@ FastAPI ŃĐŸŃ…Ń€Đ°ĐœŃĐ”Ń‚ ĐžŃŃ…ĐŸĐŽĐœŃ‹Đč `APIRouter` Đž Đ”ĐłĐŸ `APIRoute` а Đ­Ń‚ĐŸ ĐżĐŸŃ‚ĐŸĐŒŃƒ, Ń‡Ń‚ĐŸ ĐŒŃ‹ Ń…ĐŸŃ‚ĐžĐŒ ĐČĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ ох *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ĐČ ŃŃ…Đ”ĐŒŃƒ OpenAPI Đž ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșОД ĐžĐœŃ‚Đ”Ń€Ń„Đ”Đčсы. -FastAPI ŃĐŸŃ…Ń€Đ°ĐœŃĐ”Ń‚ ĐžŃŃ…ĐŸĐŽĐœŃ‹Đ” ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€Ń‹ Đž ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо аĐșтоĐČĐœŃ‹ĐŒĐž Đž ĐșĐŸĐŒĐ±ĐžĐœĐžŃ€ŃƒĐ”Ń‚ прДфОĐșсы ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€ĐŸĐČ, заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž, тДгО, ĐŸŃ‚ĐČДты Đž ĐŽŃ€ŃƒĐłĐžĐ” ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Đ” про ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐ” Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ Đž ĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžĐž OpenAPI. +FastAPI ŃĐŸŃ…Ń€Đ°ĐœŃĐ”Ń‚ ĐžŃŃ…ĐŸĐŽĐœŃ‹Đ” Ń€ĐŸŃƒŃ‚Đ”Ń€Ń‹ Đž ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо аĐșтоĐČĐœŃ‹ĐŒĐž Đž ĐșĐŸĐŒĐ±ĐžĐœĐžŃ€ŃƒĐ”Ń‚ прДфОĐșсы Ń€ĐŸŃƒŃ‚Đ”Ń€ĐŸĐČ, заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž, тДгО, HTTP-ĐŸŃ‚ĐČДты Đž ĐŽŃ€ŃƒĐłĐžĐ” ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Đ” про ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐ” HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ Đž ĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžĐž OpenAPI. /// @@ -516,9 +516,9 @@ $ fastapi dev -## ĐŸĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” ĐŸĐŽĐœĐŸĐłĐŸ Đž Ń‚ĐŸĐłĐŸ жД ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€Đ° ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ раз с Ń€Đ°Đ·ĐœŃ‹ĐŒĐž `prefix` { #include-the-same-router-multiple-times-with-different-prefix } +## ĐŸĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” ĐŸĐŽĐœĐŸĐłĐŸ Đž Ń‚ĐŸĐłĐŸ жД Ń€ĐŸŃƒŃ‚Đ”Ń€Đ° ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ раз с Ń€Đ°Đ·ĐœŃ‹ĐŒĐž `prefix` { #include-the-same-router-multiple-times-with-different-prefix } -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать `.include_router()` ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ раз с *ĐŸĐŽĐœĐžĐŒ Đž Ń‚Đ”ĐŒ жД* ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€ĐŸĐŒ, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ Ń€Đ°Đ·ĐœŃ‹Đ” прДфОĐșсы. +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать `.include_router()` ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ раз с *ĐŸĐŽĐœĐžĐŒ Đž Ń‚Đ”ĐŒ жД* Ń€ĐŸŃƒŃ‚Đ”Ń€ĐŸĐŒ, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ Ń€Đ°Đ·ĐœŃ‹Đ” прДфОĐșсы. Đ­Ń‚ĐŸ ĐŒĐŸĐ¶Đ”Ń‚ Đ±Ń‹Ń‚ŃŒ ĐżĐŸĐ»Đ”Đ·ĐœĐŸ, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, Ń‡Ń‚ĐŸĐ±Ń‹ ĐżŃ€Đ”ĐŽĐŸŃŃ‚Đ°ĐČоть ĐŽĐŸŃŃ‚ŃƒĐż Đș ĐŸĐŽĐœĐŸĐŒŃƒ Đž Ń‚ĐŸĐŒŃƒ жД API с Ń€Đ°Đ·ĐœŃ‹ĐŒĐž прДфОĐșŃĐ°ĐŒĐž, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ `/api/v1` Đž `/api/latest`. @@ -534,14 +534,14 @@ router.include_router(other_router) Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃĐŽĐ”Đ»Đ°Ń‚ŃŒ ŃŃ‚ĐŸ ĐŽĐŸ ОлО ĐżĐŸŃĐ»Đ” ĐżĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐžŃ `router` Đș ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃŽ `FastAPI`. FastAPI ĐČсё раĐČĐœĐŸ ĐČĐșлючОт *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* Оз `other_router` ĐČ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†ĐžŃŽ Đž OpenAPI. -ĐąĐŸ жД ĐŸŃ‚ĐœĐŸŃĐžŃ‚ŃŃ Đș *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃĐŒ путо*, ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœĐœŃ‹ĐŒ ĐżĐŸĐ·Đ¶Đ” ĐČ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€Ń‹. ĐžĐœĐž таĐșжД Đ±ŃƒĐŽŃƒŃ‚ ĐČĐžĐŽĐœŃ‹ чДрДз Đ±ĐŸĐ»Đ”Đ” Ń€Đ°ĐœĐœĐ”Đ” ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ”. +ĐąĐŸ жД ĐŸŃ‚ĐœĐŸŃĐžŃ‚ŃŃ Đș *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃĐŒ путо*, ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœĐœŃ‹ĐŒ ĐżĐŸĐ·Đ¶Đ” ĐČ Ń€ĐŸŃƒŃ‚Đ”Ń€Ń‹. ĐžĐœĐž таĐșжД Đ±ŃƒĐŽŃƒŃ‚ ĐČĐžĐŽĐœŃ‹ чДрДз Đ±ĐŸĐ»Đ”Đ” Ń€Đ°ĐœĐœĐ”Đ” ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ”. /// warning | ĐąĐ”Ń…ĐœĐžŃ‡Đ”ŃĐșОД ЎДталО -ИзбДгаĐčтД ĐżŃ€ŃĐŒĐŸĐč ĐŒŃƒŃ‚Đ°Ń†ĐžĐž `router.routes` ĐżĐŸŃĐ»Đ” ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐžŃ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€Đ°. FastAPI Ń€Đ°ŃŃĐŒĐ°Ń‚Ń€ĐžĐČаДт ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€Đ° ĐșаĐș «жОĐČĐŸĐ”Â», ĐżĐŸŃŃ‚ĐŸĐŒŃƒ ĐžŃŃ…ĐŸĐŽĐœŃ‹Đč ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€ Đž Đ”ĐłĐŸ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Ń‹ ĐŸŃŃ‚Đ°ŃŽŃ‚ŃŃ частью ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†ĐžĐž Đž ĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžĐž OpenAPI. +ИзбДгаĐčтД ĐżŃ€ŃĐŒĐŸĐč ĐŒŃƒŃ‚Đ°Ń†ĐžĐž `router.routes` ĐżĐŸŃĐ»Đ” ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐžŃ Ń€ĐŸŃƒŃ‚Đ”Ń€Đ°. FastAPI Ń€Đ°ŃŃĐŒĐ°Ń‚Ń€ĐžĐČаДт ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” Ń€ĐŸŃƒŃ‚Đ”Ń€Đ° ĐșаĐș «жОĐČĐŸĐ”Â», ĐżĐŸŃŃ‚ĐŸĐŒŃƒ ĐžŃŃ…ĐŸĐŽĐœŃ‹Đč Ń€ĐŸŃƒŃ‚Đ”Ń€ Đž Đ”ĐłĐŸ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Ń‹ ĐŸŃŃ‚Đ°ŃŽŃ‚ŃŃ частью ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†ĐžĐž Đž ĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžĐž OpenAPI. -Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐœŃ‹Đ” API, таĐșОД ĐșаĐș ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€Ń‹ ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐč путо Đž `.include_router()`, Ń‡Ń‚ĐŸĐ±Ń‹ ĐŽĐŸĐ±Đ°ĐČĐ»ŃŃ‚ŃŒ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Ń‹ Đž ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€Ń‹. +Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐœŃ‹Đ” API, таĐșОД ĐșаĐș ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€Ń‹ ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐč путо Đž `.include_router()`, Ń‡Ń‚ĐŸĐ±Ń‹ ĐŽĐŸĐ±Đ°ĐČĐ»ŃŃ‚ŃŒ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Ń‹ Đž Ń€ĐŸŃƒŃ‚Đ”Ń€Ń‹. -СчотаĐčтД `router.routes` ĐœĐžĐ·ĐșĐŸŃƒŃ€ĐŸĐČĐœĐ”ĐČŃ‹ĐŒ ЎДрДĐČĐŸĐŒ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐŸĐČ, ĐșĐŸŃ‚ĐŸŃ€ĐŸĐ” ĐŒĐŸĐ¶Đ”Ń‚ ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ŃŒ ĐŸĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐžŃ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐŸĐČ Đž ĐČĐșĐ»ŃŽŃ‡Ń‘ĐœĐœŃ‹Đ” ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń‚ĐŸŃ€Ń‹, Đž ОзбДгаĐčтД ĐČĐŸŃĐżŃ€ĐžĐœĐžĐŒĐ°Ń‚ŃŒ Đ”ĐłĐŸ ĐșаĐș ĐżĐ»ĐŸŃĐșĐžĐč ŃĐżĐžŃĐŸĐș ĐžŃ‚ĐŸĐłĐŸĐČых ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐč путо. +СчотаĐčтД `router.routes` ĐœĐžĐ·ĐșĐŸŃƒŃ€ĐŸĐČĐœĐ”ĐČŃ‹ĐŒ ЎДрДĐČĐŸĐŒ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐŸĐČ, ĐșĐŸŃ‚ĐŸŃ€ĐŸĐ” ĐŒĐŸĐ¶Đ”Ń‚ ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ŃŒ ĐŸĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐžŃ ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐŸĐČ Đž ĐČĐșĐ»ŃŽŃ‡Ń‘ĐœĐœŃ‹Đ” Ń€ĐŸŃƒŃ‚Đ”Ń€Ń‹, Đž ОзбДгаĐčтД ĐČĐŸŃĐżŃ€ĐžĐœĐžĐŒĐ°Ń‚ŃŒ Đ”ĐłĐŸ ĐșаĐș ĐżĐ»ĐŸŃĐșĐžĐč ŃĐżĐžŃĐŸĐș ĐžŃ‚ĐŸĐłĐŸĐČых ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐč путо. /// diff --git a/docs/ru/docs/tutorial/body-nested-models.md b/docs/ru/docs/tutorial/body-nested-models.md index d4baf8230..5dc06d28a 100644 --- a/docs/ru/docs/tutorial/body-nested-models.md +++ b/docs/ru/docs/tutorial/body-nested-models.md @@ -12,7 +12,7 @@ ## ĐŸĐŸĐ»Ń-спОсĐșĐž с ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐŒ топа { #list-fields-with-type-parameter } -В Python Đ”ŃŃ‚ŃŒ ŃĐżĐ”Ń†ĐžĐ°Đ»ŃŒĐœŃ‹Đč ŃĐżĐŸŃĐŸĐ± ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ спОсĐșĐž с ĐČĐœŃƒŃ‚Ń€Đ”ĐœĐœĐžĐŒĐž Ń‚ĐžĐżĐ°ĐŒĐž, ОлО Â«ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒĐž тОпа»: +ĐĐŸ ĐČ Python Đ”ŃŃ‚ŃŒ ŃĐżĐ”Ń†ĐžĐ°Đ»ŃŒĐœŃ‹Đč ŃĐżĐŸŃĐŸĐ± ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ спОсĐșĐž с ĐČĐœŃƒŃ‚Ń€Đ”ĐœĐœĐžĐŒĐž Ń‚ĐžĐżĐ°ĐŒĐž, ОлО Â«ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒĐž тОпа»: ### ĐžĐ±ŃŠŃĐČОтД `list` с ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐŒ топа { #declare-a-list-with-a-type-parameter } @@ -110,7 +110,7 @@ my_list: list[str] {* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *} -йаĐșая Ń€Đ”Đ°Đ»ĐžĐ·Đ°Ń†ĐžŃ Đ±ŃƒĐŽĐ”Ń‚ ĐŸĐ¶ĐžĐŽĐ°Ń‚ŃŒ (ĐșĐŸĐœĐČĐ”Ń€Ń‚ĐžŃ€ĐŸĐČать, ĐČĐ°Đ»ĐžĐŽĐžŃ€ĐŸĐČать, ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ĐŸĐČать Đž т.ĐŽ.) JSON-ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒĐŸĐ” ĐČ ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”ĐŒ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ”: +йаĐșая Ń€Đ”Đ°Đ»ĐžĐ·Đ°Ń†ĐžŃ Đ±ŃƒĐŽĐ”Ń‚ ĐŸĐ¶ĐžĐŽĐ°Ń‚ŃŒ (ĐșĐŸĐœĐČĐ”Ń€Ń‚ĐžŃ€ĐŸĐČать, ĐČĐ°Đ»ĐžĐŽĐžŃ€ĐŸĐČать, ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ĐŸĐČать Đž т.ĐŽ.) JSON-Ń‚Đ”Đ»ĐŸ Đ·Đ°ĐżŃ€ĐŸŃĐ° ĐČ ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”ĐŒ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ”: ```JSON hl_lines="11" { @@ -154,9 +154,9 @@ my_list: list[str] /// -## йДла с Ń‡ĐžŃŃ‚Ń‹ĐŒĐž спОсĐșĐ°ĐŒĐž ŃĐ»Đ”ĐŒĐ”ĐœŃ‚ĐŸĐČ { #bodies-of-pure-lists } +## йДла Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ Ń Ń‡ĐžŃŃ‚Ń‹ĐŒĐž спОсĐșĐ°ĐŒĐž ŃĐ»Đ”ĐŒĐ”ĐœŃ‚ĐŸĐČ { #bodies-of-pure-lists } -ЕслО ĐČĐ”Ń€Ń…ĐœĐžĐč ŃƒŃ€ĐŸĐČĐ”ĐœŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ тДла JSON-ĐŸĐ±ŃŠĐ”Đșта прДЎстаĐČĐ»ŃĐ”Ń‚ ŃĐŸĐ±ĐŸĐč JSON `array` (ĐČ Python — `list`), ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть топ ĐČ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ” Ń„ŃƒĐœĐșцоо, таĐș жД ĐșаĐș ĐČ ĐŒĐŸĐŽĐ”Đ»ŃŃ… Pydantic: +ЕслО ĐČĐ”Ń€Ń…ĐœĐžĐč ŃƒŃ€ĐŸĐČĐ”ĐœŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ JSON-тДла Đ·Đ°ĐżŃ€ĐŸŃĐ° прДЎстаĐČĐ»ŃĐ”Ń‚ ŃĐŸĐ±ĐŸĐč JSON `array` (ĐČ Python — `list`), ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть топ ĐČ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ” Ń„ŃƒĐœĐșцоо, таĐș жД ĐșаĐș ĐČ ĐŒĐŸĐŽĐ”Đ»ŃŃ… Pydantic: ```Python images: list[Image] @@ -212,7 +212,7 @@ images: list[Image] ĐĄ ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ **FastAPI** ĐČы ĐżĐŸĐ»ŃƒŃ‡Đ°Đ”Ń‚Đ” ĐŒĐ°ĐșŃĐžĐŒĐ°Đ»ŃŒĐœŃƒŃŽ гОбĐșĐŸŃŃ‚ŃŒ, ĐżŃ€Đ”ĐŽĐŸŃŃ‚Đ°ĐČĐ»ŃĐ”ĐŒŃƒŃŽ ĐŒĐŸĐŽĐ”Đ»ŃĐŒĐž Pydantic, ŃĐŸŃ…Ń€Đ°ĐœŃŃ про ŃŃ‚ĐŸĐŒ ĐżŃ€ĐŸŃŃ‚ĐŸŃ‚Ńƒ, ĐșратĐșĐŸŃŃ‚ŃŒ Đž ŃĐ»Đ”ĐłĐ°ĐœŃ‚ĐœĐŸŃŃ‚ŃŒ ĐČĐ°ŃˆĐ”ĐłĐŸ ĐșĐŸĐŽĐ°. -И ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœĐŸ ĐČы ĐżĐŸĐ»ŃƒŃ‡Đ°Đ”Ń‚Đ”: +ĐĐŸ ŃĐŸ ĐČŃĐ”ĐŒĐž ĐżŃ€Đ”ĐžĐŒŃƒŃ‰Đ”ŃŃ‚ĐČĐ°ĐŒĐž: * ĐŸĐŸĐŽĐŽĐ”Ń€Đ¶Đșу рДЎаĐșŃ‚ĐŸŃ€Đ° ĐșĐŸĐŽĐ° (аĐČŃ‚ĐŸĐ·Đ°ĐČĐ”Ń€ŃˆĐ”ĐœĐžĐ” ĐŽĐŸŃŃ‚ŃƒĐżĐœĐŸ ĐČДзЎД!) * ĐŸŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°ĐœĐžĐ” ĐŽĐ°ĐœĐœŃ‹Ń… (таĐșжД ОзĐČĐ”ŃŃ‚ĐœĐŸ ĐșаĐș ĐżĐ°Ń€ŃĐžĐœĐł / ŃĐ”Ń€ĐžĐ°Đ»ĐžĐ·Đ°Ń†ĐžŃ) diff --git a/docs/ru/docs/tutorial/body.md b/docs/ru/docs/tutorial/body.md index 7b3ab22d3..f1b76cba3 100644 --- a/docs/ru/docs/tutorial/body.md +++ b/docs/ru/docs/tutorial/body.md @@ -70,7 +70,7 @@ * ХчОтаДт Ń‚Đ”Đ»ĐŸ Đ·Đ°ĐżŃ€ĐŸŃĐ° ĐșаĐș JSON. * ПроĐČДЎёт ĐŽĐ°ĐœĐœŃ‹Đ” Đș ŃĐŸĐŸŃ‚ĐČДтстĐČŃƒŃŽŃ‰ĐžĐŒ Ń‚ĐžĐżĐ°ĐŒ (ДслО ĐżĐŸŃ‚Ń€Đ”Đ±ŃƒĐ”Ń‚ŃŃ). * ĐŸŃ€ĐŸĐČДЎёт ĐČалОЎацОю ĐŽĐ°ĐœĐœŃ‹Ń…. - * ЕслО ĐŽĐ°ĐœĐœŃ‹Đ” ĐœĐ”ĐșĐŸŃ€Ń€Đ”ĐșŃ‚ĐœŃ‹, ĐČĐ”Ń€ĐœŃ‘Ń‚ ĐżĐŸĐœŃŃ‚ĐœŃƒŃŽ Đž ĐœĐ°ĐłĐ»ŃĐŽĐœŃƒŃŽ ĐŸŃˆĐžĐ±Đșу, уĐșазыĐČающую, гЎД ĐžĐŒĐ”ĐœĐœĐŸ Đž Ń‡Ń‚ĐŸ Đ±Ń‹Đ»ĐŸ ĐœĐ”ĐșĐŸŃ€Ń€Đ”ĐșŃ‚ĐœĐŸ. + * ЕслО ĐŽĐ°ĐœĐœŃ‹Đ” ĐœĐ”ĐșĐŸŃ€Ń€Đ”ĐșŃ‚ĐœŃ‹, ĐČĐ”Ń€ĐœŃ‘Ń‚ ĐżĐŸĐœŃŃ‚ĐœŃƒŃŽ Đž ĐœĐ°ĐłĐ»ŃĐŽĐœŃƒŃŽ ĐŸŃˆĐžĐ±Đșу, уĐșазыĐČающую, гЎД ĐžĐŒĐ”ĐœĐœĐŸ and Ń‡Ń‚ĐŸ Đ±Ń‹Đ»ĐŸ ĐœĐ”ĐșĐŸŃ€Ń€Đ”ĐșŃ‚ĐœĐŸ. * ĐŸĐ”Ń€Đ”ĐŽĐ°ŃŃ‚ ĐżĐŸĐ»ŃƒŃ‡Đ”ĐœĐœŃ‹Đ” ĐŽĐ°ĐœĐœŃ‹Đ” ĐČ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `item`. * ĐŸĐŸŃĐșĐŸĐ»ŃŒĐșу ĐČĐœŃƒŃ‚Ń€Đž Ń„ŃƒĐœĐșцоо ĐČы ĐŸĐ±ŃŠŃĐČОлО Đ”ĐłĐŸ с Ń‚ĐžĐżĐŸĐŒ `Item`, у ĐČас Đ±ŃƒĐŽĐ”Ń‚ ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșа ŃĐŸ ŃŃ‚ĐŸŃ€ĐŸĐœŃ‹ рДЎаĐșŃ‚ĐŸŃ€Đ° ĐșĐŸĐŽĐ° (аĐČŃ‚ĐŸĐ·Đ°ĐČĐ”Ń€ŃˆĐ”ĐœĐžĐ” Đž т.Đż.) ĐŽĐ»Ń ĐČсДх Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚ĐŸĐČ Đž ох Ń‚ĐžĐżĐŸĐČ. * ĐĄĐłĐ”ĐœĐ”Ń€ĐžŃ€ŃƒĐ”Ń‚ ĐŸĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐžŃ [JSON Schema](https://json-schema.org) ĐŽĐ»Ń ĐČашДĐč ĐŒĐŸĐŽĐ”Đ»Đž; ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ох Đž ĐČ ĐŽŃ€ŃƒĐłĐžŃ… ĐŒĐ”ŃŃ‚Đ°Ń…, ДслО ŃŃ‚ĐŸ ĐžĐŒĐ”Đ”Ń‚ ŃĐŒŃ‹ŃĐ» ĐŽĐ»Ń ĐČĐ°ŃˆĐ”ĐłĐŸ ĐżŃ€ĐŸĐ”Đșта. diff --git a/docs/ru/docs/tutorial/debugging.md b/docs/ru/docs/tutorial/debugging.md index deb92f1b9..5a5808579 100644 --- a/docs/ru/docs/tutorial/debugging.md +++ b/docs/ru/docs/tutorial/debugging.md @@ -1,10 +1,10 @@ # ОтлаЎĐșа { #debugging } -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸĐŽĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ ĐŸŃ‚Đ»Đ°ĐŽŃ‡ĐžĐș ĐČ ŃĐČĐŸĐ”ĐŒ рДЎаĐșŃ‚ĐŸŃ€Đ”, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐČ Visual Studio Code ОлО PyCharm. +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸĐŽĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ ĐŸŃ‚Đ»Đ°ĐŽŃ‡ĐžĐș ĐČ ŃĐČĐŸĐ”ĐŒ рДЎаĐșŃ‚ĐŸŃ€Đ” ĐșĐŸĐŽĐ°, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐČ Visual Studio Code ОлО PyCharm. ## Đ’Ń‹Đ·ĐŸĐČ `uvicorn` { #call-uvicorn } -В ĐČĐ°ŃˆĐ”ĐŒ FastAPI ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐž, ĐžĐŒĐżĐŸŃ€Ń‚ĐžŃ€ŃƒĐčтД Đž ĐČŃ‹Đ·ĐŸĐČОтД `uvicorn` ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ: +В ĐČĐ°ŃˆĐ”ĐŒ FastAPI ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐž, ĐžĐŒĐżĐŸŃ€Ń‚ĐžŃ€ŃƒĐčтД Đž Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đ” `uvicorn` ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ: {* ../../docs_src/debugging/tutorial001_py310.py hl[1,15] *} @@ -62,7 +62,7 @@ from myapp import app # ЕщД ĐœĐ”ĐŒĐœĐŸĐłĐŸ ĐșĐŸĐŽĐ° ``` -Ń‚ĐŸ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșая ŃĐŸĐ·ĐŽĐ°ĐČĐ°Đ”ĐŒĐ°Ń ĐČĐœŃƒŃ‚Ń€Đž фаĐčла `myapp.py` ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœĐ°Ń `__name__` Đ±ŃƒĐŽĐ”Ń‚ ĐžĐŒĐ”Ń‚ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐŸŃ‚Đ»ĐžŃ‡Đ°ŃŽŃ‰Đ”Đ”ŃŃ ĐŸŃ‚ `"__main__"`. +Ń‚ĐŸ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž ŃĐŸĐ·ĐŽĐ°ĐČĐ°Đ”ĐŒĐ°Ń ĐČĐœŃƒŃ‚Ń€Đž фаĐčла `myapp.py` ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœĐ°Ń `__name__` Đ±ŃƒĐŽĐ”Ń‚ ĐžĐŒĐ”Ń‚ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”, ĐŸŃ‚Đ»ĐžŃ‡Đ°ŃŽŃ‰Đ”Đ”ŃŃ ĐŸŃ‚ `"__main__"`. ĐĄĐ»Đ”ĐŽĐŸĐČĐ°Ń‚Đ”Đ»ŃŒĐœĐŸ, ŃŃ‚Ń€ĐŸĐșа: @@ -80,7 +80,7 @@ from myapp import app ## ЗапусĐș ĐČĐ°ŃˆĐ”ĐłĐŸ ĐșĐŸĐŽĐ° с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ ĐŸŃ‚Đ»Đ°ĐŽŃ‡ĐžĐșа { #run-your-code-with-your-debugger } -йаĐș ĐșаĐș ĐČы запусĐșаДтД сДрĐČДр Uvicorn ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ Оз ĐČĐ°ŃˆĐ”ĐłĐŸ ĐșĐŸĐŽĐ°, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČызĐČать Python ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒŃƒ (ĐČашД FastAPI ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”) ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ Оз ĐŸŃ‚Đ»Đ°ĐŽŃ‡ĐžĐșа. +йаĐș ĐșаĐș ĐČы запусĐșаДтД сДрĐČДр Uvicorn ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ Оз ĐČĐ°ŃˆĐ”ĐłĐŸ ĐșĐŸĐŽĐ°, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚ŃŒ Python ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒŃƒ (ĐČашД FastAPI ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”) ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ Оз ĐŸŃ‚Đ»Đ°ĐŽŃ‡ĐžĐșа. --- diff --git a/docs/ru/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/ru/docs/tutorial/dependencies/dependencies-with-yield.md index 61ab8f44d..71e782c0b 100644 --- a/docs/ru/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/ru/docs/tutorial/dependencies/dependencies-with-yield.md @@ -123,7 +123,7 @@ FastAPI ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČаДт заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐČŃ‹ĐżĐŸ ### ВсДгЎа ЎДлаĐčтД `raise` ĐČ Đ·Đ°ĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŃ… с `yield` Đž `except` { #always-raise-in-dependencies-with-yield-and-except } -ЕслО ĐČы Đ»ĐŸĐČОтД ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” ĐČ Đ·Đ°ĐČĐžŃĐžĐŒĐŸŃŃ‚Đž с `yield`, Ń‚ĐŸ, ДслО ĐČы ĐœĐ” ĐČызыĐČаДтД ĐŽŃ€ŃƒĐłĐŸĐč `HTTPException` ОлО Ń‡Ń‚ĐŸ-Ń‚ĐŸ ĐżĐŸĐŽĐŸĐ±ĐœĐŸĐ”, ĐČĐ°ĐŒ ŃĐ»Đ”ĐŽŃƒĐ”Ń‚ ĐżĐŸĐČŃ‚ĐŸŃ€ĐœĐŸ ĐČызĐČать ĐžŃŃ…ĐŸĐŽĐœĐŸĐ” ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ”. +ЕслО ĐČы Đ»ĐŸĐČОтД ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” ĐČ Đ·Đ°ĐČĐžŃĐžĐŒĐŸŃŃ‚Đž с `yield`, Ń‚ĐŸ, ДслО ĐČы ĐœĐ” ĐČызыĐČаДтД ĐŽŃ€ŃƒĐłĐŸĐč `HTTPException` ОлО Ń‡Ń‚ĐŸ-Ń‚ĐŸ ĐżĐŸĐŽĐŸĐ±ĐœĐŸĐ”, **ĐČĐ°ĐŒ ŃĐ»Đ”ĐŽŃƒĐ”Ń‚ ĐżĐŸĐČŃ‚ĐŸŃ€ĐœĐŸ ĐČызĐČать ĐžŃŃ…ĐŸĐŽĐœĐŸĐ” ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ”**. Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸĐČŃ‚ĐŸŃ€ĐœĐŸ ĐČызĐČать Ń‚ĐŸ жД ŃĐ°ĐŒĐŸĐ” ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `raise`: @@ -234,6 +234,7 @@ participant operation as Đ€ŃƒĐœĐșцоя-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș путо ЗаĐČĐžŃĐžĐŒĐŸŃŃ‚Đž с `yield` ŃĐŸ ĐČŃ€Đ”ĐŒĐ”ĐœĐ”ĐŒ эĐČĐŸĐ»ŃŽŃ†ĐžĐŸĐœĐžŃ€ĐŸĐČалО, Ń‡Ń‚ĐŸĐ±Ń‹ ĐżĐŸĐșрыть Ń€Đ°Đ·ĐœŃ‹Đ” ŃŃ†Đ”ĐœĐ°Ń€ĐžĐž Đž оспраĐČоть ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒŃ‹. ЕслО ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐżĐŸŃĐŒĐŸŃ‚Ń€Đ”Ń‚ŃŒ, Ń‡Ń‚ĐŸ ĐŒĐ”ĐœŃĐ»ĐŸŃŃŒ ĐČ Ń€Đ°Đ·ĐœŃ‹Ń… ĐČĐ”Ń€ŃĐžŃŃ… FastAPI, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Ń‚ŃŒ ĐŸĐ± ŃŃ‚ĐŸĐŒ ĐżĐŸĐŽŃ€ĐŸĐ±ĐœĐ”Đ” ĐČ ĐżŃ€ĐŸĐŽĐČĐžĐœŃƒŃ‚ĐŸĐŒ руĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐ”: [ĐŸŃ€ĐŸĐŽĐČĐžĐœŃƒŃ‚Ń‹Đ” заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž — заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž с `yield`, `HTTPException`, `except` Đž Ń„ĐŸĐœĐŸĐČŃ‹ĐŒĐž Đ·Đ°ĐŽĐ°Ń‡Đ°ĐŒĐž](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks). + ## ĐšĐŸĐœŃ‚Đ”ĐșŃŃ‚ĐœŃ‹Đ” ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€Ń‹ { #context-managers } ### Đ§Ń‚ĐŸ таĐșĐŸĐ” «ĐșĐŸĐœŃ‚Đ”ĐșŃŃ‚ĐœŃ‹Đ” ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€Ń‹Â» { #what-are-context-managers } diff --git a/docs/ru/docs/tutorial/extra-data-types.md b/docs/ru/docs/tutorial/extra-data-types.md index 062c19574..d05a00eca 100644 --- a/docs/ru/docs/tutorial/extra-data-types.md +++ b/docs/ru/docs/tutorial/extra-data-types.md @@ -12,7 +12,7 @@ Про ŃŃ‚ĐŸĐŒ у ĐČас ĐŸŃŃ‚Đ°ĐœŃƒŃ‚ŃŃ тД жД ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚Đž, Ń‡Ń‚ĐŸ Đž ĐŽĐŸ сох ĐżĐŸŃ€: * ĐžŃ‚Đ»ĐžŃ‡ĐœĐ°Ń ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșа рДЎаĐșŃ‚ĐŸŃ€Đ° ĐșĐŸĐŽĐ°. -* ĐŸŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°ĐœĐžĐ” ĐŽĐ°ĐœĐœŃ‹Ń… Оз ĐČŃ…ĐŸĐŽŃŃ‰ĐžŃ… Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ. +* ĐŸŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°ĐœĐžĐ” ĐŽĐ°ĐœĐœŃ‹Ń… Оз ĐČŃ…ĐŸĐŽŃŃ‰ĐžŃ… HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ. * ĐŸŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°ĐœĐžĐ” ĐŽĐ°ĐœĐœŃ‹Ń… ĐŽĐ»Ń ĐŸŃ‚ĐČДта. * Đ’Đ°Đ»ĐžĐŽĐ°Ń†ĐžŃ ĐŽĐ°ĐœĐœŃ‹Ń…. * АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșая Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžŃ Đž ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃ. @@ -23,32 +23,32 @@ * `UUID`: * ĐĄŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœŃ‹Đč "ĐŁĐœĐžĐČĐ”Ń€ŃĐ°Đ»ŃŒĐœŃ‹Đč ŃƒĐœĐžĐșĐ°Đ»ŃŒĐœŃ‹Đč ĐžĐŽĐ”ĐœŃ‚ĐžŃ„ĐžĐșĐ°Ń‚ĐŸŃ€", ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒŃ‹Đč ĐČ ĐșачДстĐČĐ” ĐžĐŽĐ”ĐœŃ‚ĐžŃ„ĐžĐșĐ°Ń‚ĐŸŃ€Đ° ĐČĐŸ ĐŒĐœĐŸĐłĐžŃ… базах ĐŽĐ°ĐœĐœŃ‹Ń… Đž ŃĐžŃŃ‚Đ”ĐŒĐ°Ń…. - * В Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž ĐŸŃ‚ĐČДтах Đ±ŃƒĐŽĐ”Ń‚ прДЎстаĐČĐ»Đ”Đœ ĐșаĐș `str`. + * В HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž HTTP-ĐŸŃ‚ĐČДтах Đ±ŃƒĐŽĐ”Ń‚ прДЎстаĐČĐ»Đ”Đœ ĐșаĐș `str`. * `datetime.datetime`: * Đ’ŃŃ‚Ń€ĐŸĐ”ĐœĐœŃ‹Đč ĐČ Python `datetime.datetime`. - * В Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž ĐŸŃ‚ĐČДтах Đ±ŃƒĐŽĐ”Ń‚ прДЎстаĐČĐ»Đ”Đœ ĐșаĐș `str` ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” ISO 8601, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: `2008-09-15T15:53:00+05:00`. + * В HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž HTTP-ĐŸŃ‚ĐČДтах Đ±ŃƒĐŽĐ”Ń‚ прДЎстаĐČĐ»Đ”Đœ ĐșаĐș `str` ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” ISO 8601, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: `2008-09-15T15:53:00+05:00`. * `datetime.date`: * Đ’ŃŃ‚Ń€ĐŸĐ”ĐœĐœŃ‹Đč ĐČ Python `datetime.date`. - * В Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž ĐŸŃ‚ĐČДтах Đ±ŃƒĐŽĐ”Ń‚ прДЎстаĐČĐ»Đ”Đœ ĐșаĐș `str` ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” ISO 8601, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: `2008-09-15`. + * В HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž HTTP-ĐŸŃ‚ĐČДтах Đ±ŃƒĐŽĐ”Ń‚ прДЎстаĐČĐ»Đ”Đœ ĐșаĐș `str` ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” ISO 8601, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: `2008-09-15`. * `datetime.time`: * Đ’ŃŃ‚Ń€ĐŸĐ”ĐœĐœŃ‹Đč ĐČ Python `datetime.time`. - * В Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž ĐŸŃ‚ĐČДтах Đ±ŃƒĐŽĐ”Ń‚ прДЎстаĐČĐ»Đ”Đœ ĐșаĐș `str` ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” ISO 8601, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: `14:23:55.003`. + * В HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž HTTP-ĐŸŃ‚ĐČДтах Đ±ŃƒĐŽĐ”Ń‚ прДЎстаĐČĐ»Đ”Đœ ĐșаĐș `str` ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” ISO 8601, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: `14:23:55.003`. * `datetime.timedelta`: * Đ’ŃŃ‚Ń€ĐŸĐ”ĐœĐœŃ‹Đč ĐČ Python `datetime.timedelta`. - * В Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž ĐŸŃ‚ĐČДтах Đ±ŃƒĐŽĐ”Ń‚ прДЎстаĐČĐ»Đ”Đœ ĐČ ĐČОЎД ĐŸĐ±Ń‰Đ”ĐłĐŸ ĐșĐŸĐ»ĐžŃ‡Đ”ŃŃ‚ĐČа сДĐșŃƒĐœĐŽ топа `float`. + * В HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž HTTP-ĐŸŃ‚ĐČДтах Đ±ŃƒĐŽĐ”Ń‚ прДЎстаĐČĐ»Đ”Đœ ĐČ ĐČОЎД ĐŸĐ±Ń‰Đ”ĐłĐŸ ĐșĐŸĐ»ĐžŃ‡Đ”ŃŃ‚ĐČа сДĐșŃƒĐœĐŽ топа `float`. * Pydantic таĐșжД ĐżĐŸĐ·ĐČĐŸĐ»ŃĐ”Ń‚ прДЎстаĐČоть Đ”ĐłĐŸ ĐșаĐș "ĐšĐŸĐŽĐžŃ€ĐŸĐČĐșу Ń€Đ°Đ·ĐœĐžŃ†Ń‹ ĐČĐŸ ĐČŃ€Đ”ĐŒĐ”ĐœĐž ISO 8601", [ŃĐŒ. ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃŽ ĐŽĐ»Ń ĐżĐŸĐ»ŃƒŃ‡Đ”ĐœĐžŃ ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœĐŸĐč ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐž](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). * `frozenset`: - * В Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž ĐŸŃ‚ĐČДтах ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČĐ°Đ”Ń‚ŃŃ таĐș жД, ĐșаĐș Đž `set`: - * В Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đ±ŃƒĐŽĐ”Ń‚ ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Đœ ŃĐżĐžŃĐŸĐș, ОсĐșĐ»ŃŽŃ‡Đ”ĐœŃ‹ ЎублОĐșаты Đž ĐżŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°Đœ ĐČ `set`. - * В ĐŸŃ‚ĐČДтах `set` Đ±ŃƒĐŽĐ”Ń‚ ĐżŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°Đœ ĐČ `list`. + * В HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž HTTP-ĐŸŃ‚ĐČДтах ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČĐ°Đ”Ń‚ŃŃ таĐș жД, ĐșаĐș Đž `set`: + * В HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đ±ŃƒĐŽĐ”Ń‚ ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Đœ ŃĐżĐžŃĐŸĐș, ОсĐșĐ»ŃŽŃ‡Đ”ĐœŃ‹ ЎублОĐșаты Đž ĐżŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°Đœ ĐČ `set`. + * В HTTP-ĐŸŃ‚ĐČДтах `set` Đ±ŃƒĐŽĐ”Ń‚ ĐżŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°Đœ ĐČ `list`. * В ŃĐłĐ”ĐœĐ”Ń€ĐžŃ€ĐŸĐČĐ°ĐœĐœĐŸĐč ŃŃ…Đ”ĐŒĐ” Đ±ŃƒĐŽĐ”Ń‚ уĐșĐ°Đ·Đ°ĐœĐŸ, Ń‡Ń‚ĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ `set` ŃƒĐœĐžĐșĐ°Đ»ŃŒĐœŃ‹ (с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ JSON-ŃŃ…Đ”ĐŒŃ‹ `uniqueItems`). * `bytes`: * Đ’ŃŃ‚Ń€ĐŸĐ”ĐœĐœŃ‹Đč ĐČ Python `bytes`. - * В Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž ĐŸŃ‚ĐČДтах Đ±ŃƒĐŽĐ”Ń‚ Ń€Đ°ŃŃĐŒĐ°Ń‚Ń€ĐžĐČаться ĐșаĐș `str`. - * В ŃĐłĐ”ĐœĐ”Ń€ĐžŃ€ĐŸĐČĐ°ĐœĐœĐŸĐč ŃŃ…Đ”ĐŒĐ” Đ±ŃƒĐŽĐ”Ń‚ уĐșĐ°Đ·Đ°ĐœĐŸ, Ń‡Ń‚ĐŸ ŃŃ‚ĐŸ `str` ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” `binary`. + * В HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž HTTP-ĐŸŃ‚ĐČДтах Đ±ŃƒĐŽĐ”Ń‚ Ń€Đ°ŃŃĐŒĐ°Ń‚Ń€ĐžĐČаться ĐșаĐș `str`. + * В ŃĐłĐ”ĐœĐ”Ń€ĐžŃ€ĐŸĐČĐ°ĐœĐœĐŸĐč ŃŃ…Đ”ĐŒĐ” Đ±ŃƒĐŽĐ”Ń‚ уĐșĐ°Đ·Đ°ĐœĐŸ, Ń‡Ń‚ĐŸ ŃŃ‚ĐŸ `str` ĐČ "Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ”" `binary`. * `Decimal`: * Đ’ŃŃ‚Ń€ĐŸĐ”ĐœĐœŃ‹Đč ĐČ Python `Decimal`. - * В Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž ĐŸŃ‚ĐČДтах ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČĐ°Đ”Ń‚ŃŃ таĐș жД, ĐșаĐș Đž `float`. + * В HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ°Ń… Đž HTTP-ĐŸŃ‚ĐČДтах ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČĐ°Đ”Ń‚ŃŃ таĐș жД, ĐșаĐș Đž `float`. * Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸĐČĐ”Ń€ĐžŃ‚ŃŒ ĐČсД ĐŽĐŸĐżŃƒŃŃ‚ĐžĐŒŃ‹Đ” топы ĐŽĐ°ĐœĐœŃ‹Ń… Pydantic Đ·ĐŽĐ”ŃŃŒ: [бопы ĐŽĐ°ĐœĐœŃ‹Ń… Pydantic](https://docs.pydantic.dev/latest/usage/types/types/). ## ĐŸŃ€ĐžĐŒĐ”Ń€ { #example } diff --git a/docs/ru/docs/tutorial/extra-models.md b/docs/ru/docs/tutorial/extra-models.md index becb76bc3..cec61ed5d 100644 --- a/docs/ru/docs/tutorial/extra-models.md +++ b/docs/ru/docs/tutorial/extra-models.md @@ -208,4 +208,4 @@ some_variable: PlaneItem | CarItem Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ Pydantic-ĐŒĐŸĐŽĐ”Đ»Đ”Đč Đž сĐČĐŸĐ±ĐŸĐŽĐœĐŸ ĐżŃ€ĐžĐŒĐ”ĐœŃĐčтД ĐœĐ°ŃĐ»Đ”ĐŽĐŸĐČĐ°ĐœĐžĐ” ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ ŃĐ»ŃƒŃ‡Đ°Ń. -Đ’Đ°ĐŒ ĐœĐ” ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœĐŸ ĐžĐŒĐ”Ń‚ŃŒ Đ”ĐŽĐžĐœŃŃ‚ĐČĐ”ĐœĐœŃƒŃŽ ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐŽĐ°ĐœĐœŃ‹Ń… ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐč ŃŃƒŃ‰ĐœĐŸŃŃ‚Đž, ДслО эта ŃŃƒŃ‰ĐœĐŸŃŃ‚ŃŒ ĐŽĐŸĐ»Đ¶ĐœĐ° ĐžĐŒĐ”Ń‚ŃŒ ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ Đ±Ń‹Ń‚ŃŒ ĐČ Ń€Đ°Đ·ĐœŃ‹Ń… "ŃĐŸŃŃ‚ĐŸŃĐœĐžŃŃ…". КаĐș ĐČ ŃĐ»ŃƒŃ‡Đ°Đ” с "ŃŃƒŃ‰ĐœĐŸŃŃ‚ŃŒŃŽ" ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń, у ĐșĐŸŃ‚ĐŸŃ€ĐŸĐłĐŸ Đ”ŃŃ‚ŃŒ ŃĐŸŃŃ‚ĐŸŃĐœĐžĐ”, ĐČĐșлючающДД `password`, `password_hash` Đž ĐŸŃ‚ŃŃƒŃ‚ŃŃ‚ĐČОД ĐżĐ°Ń€ĐŸĐ»Ń. +Đ’Đ°ĐŒ ĐœĐ” ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœĐŸ ĐžĐŒĐ”Ń‚ŃŒ Đ”ĐŽĐžĐœŃŃ‚ĐČĐ”ĐœĐœŃƒŃŽ ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐŽĐ°ĐœĐœŃ‹Ń… ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐč ŃŃƒŃ‰ĐœĐŸŃŃ‚Đž, ДслО эта ŃŃƒŃ‰ĐœĐŸŃŃ‚ŃŒ ĐŽĐŸĐ»Đ¶ĐœĐ° ĐžĐŒĐ”Ń‚ŃŒ ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ Đ±Ń‹Ń‚ŃŒ ĐČ Ń€Đ°Đ·ĐœŃ‹Ń… "ŃĐŸŃŃ‚ĐŸŃĐœĐžŃŃ…". **ĐŸĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒ** — ĐżŃ€ĐžĐŒĐ”Ń€ таĐșĐŸĐč "ŃŃƒŃ‰ĐœĐŸŃŃ‚Đž", с ŃĐŸŃŃ‚ĐŸŃĐœĐžŃĐŒĐž, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐČĐșлючают `password`, `password_hash` ОлО ĐŸŃ‚ŃŃƒŃ‚ŃŃ‚ĐČОД ĐżĐ°Ń€ĐŸĐ»Ń. diff --git a/docs/ru/docs/tutorial/first-steps.md b/docs/ru/docs/tutorial/first-steps.md index ce743b369..8841a9004 100644 --- a/docs/ru/docs/tutorial/first-steps.md +++ b/docs/ru/docs/tutorial/first-steps.md @@ -244,9 +244,9 @@ CLI аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ ĐČашД ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” Đ­Ń‚ĐŸ Đ±ŃƒĐŽĐ”Ń‚ ĐŸŃĐœĐŸĐČĐœĐ°Ń Ń‚ĐŸŃ‡Đșа ĐČĐ·Đ°ĐžĐŒĐŸĐŽĐ”ĐčстĐČоя ĐŽĐ»Ń ŃĐŸĐ·ĐŽĐ°ĐœĐžŃ ĐČŃĐ”ĐłĐŸ ĐČĐ°ŃˆĐ”ĐłĐŸ API. -### Каг 3: ŃĐŸĐ·ĐŽĐ°ĐčтД *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃŽ путо (path operation)* { #step-3-create-a-path-operation } +### Каг 3: ŃĐŸĐ·ĐŽĐ°ĐčтД *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃŽ путо* { #step-3-create-a-path-operation } -#### Путь (path) { #path } +#### Путь { #path } Đ—ĐŽĐ”ŃŃŒ Â«ĐżŃƒŃ‚ŃŒÂ» — ŃŃ‚ĐŸ ĐżĐŸŃĐ»Đ”ĐŽĐœŃŃ часть URL, ĐœĐ°Ń‡ĐžĐœĐ°Ń с пДрĐČĐŸĐłĐŸ ŃĐžĐŒĐČĐŸĐ»Đ° `/`. @@ -270,7 +270,7 @@ https://example.com/items/foo Про ŃĐŸĐ·ĐŽĐ°ĐœĐžĐž API Â«ĐżŃƒŃ‚ŃŒÂ» — ŃŃ‚ĐŸ ĐŸŃĐœĐŸĐČĐœĐŸĐč ŃĐżĐŸŃĐŸĐ± Ń€Đ°Đ·ĐŽĐ”Đ»Đ”ĐœĐžŃ «заЎач» Đž Â«Ń€Đ”ŃŃƒŃ€ŃĐŸĐČ». -#### ĐžĐżĐ”Ń€Đ°Ń†ĐžŃ (operation) { #operation } +#### ĐžĐżĐ”Ń€Đ°Ń†ĐžŃ { #operation } Â«ĐžĐżĐ”Ń€Đ°Ń†ĐžŃÂ» Đ·ĐŽĐ”ŃŃŒ — ŃŃ‚ĐŸ ĐŸĐŽĐžĐœ Оз HTTP-Â«ĐŒĐ”Ń‚ĐŸĐŽĐŸĐČ». @@ -303,16 +303,16 @@ https://example.com/items/foo йаĐșĐžĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ, ĐČ OpenAPI ĐșажЎыĐč HTTP-ĐŒĐ”Ń‚ĐŸĐŽ ĐœĐ°Đ·Ń‹ĐČĐ°Đ”Ń‚ŃŃ Â«ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐ”Đč». -Мы Ń‚ĐŸĐ¶Đ” Đ±ŃƒĐŽĐ”ĐŒ ĐœĐ°Đ·Ń‹ĐČать ох Â«ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃĐŒĐžÂ». +Мы Ń‚ĐŸĐ¶Đ” Đ±ŃƒĐŽĐ”ĐŒ ĐœĐ°Đ·Ń‹ĐČать ох «**ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃĐŒĐž**». -#### ОпрДЎДлОтД *ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€ ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо (path operation decorator)* { #define-a-path-operation-decorator } +#### ОпрДЎДлОтД *ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€ ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* { #define-a-path-operation-decorator } {* ../../docs_src/first_steps/tutorial001_py310.py hl[6] *} -`@app.get("/")` ŃĐŸĐŸĐ±Ń‰Đ°Đ”Ń‚ **FastAPI**, Ń‡Ń‚ĐŸ Ń„ŃƒĐœĐșцоя ĐżŃ€ŃĐŒĐŸ ĐżĐŸĐŽ ĐœĐžĐŒ ĐŸŃ‚ĐČДчаДт за ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Đșу Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ, ĐżĐŸŃŃ‚ŃƒĐżĐ°ŃŽŃ‰ĐžŃ…: +`@app.get("/")` ŃĐŸĐŸĐ±Ń‰Đ°Đ”Ń‚ **FastAPI**, Ń‡Ń‚ĐŸ Ń„ŃƒĐœĐșцоя ĐżŃ€ŃĐŒĐŸ ĐżĐŸĐŽ ĐœĐžĐŒ ĐŸŃ‚ĐČДчаДт за ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Đșу HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ, ĐżĐŸŃŃ‚ŃƒĐżĐ°ŃŽŃ‰ĐžŃ…: * ĐżĐŸ путо `/` -* с ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ”ĐŒ get ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž +* с ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ”ĐŒ ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž get /// note | Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ ĐŸ `@decorator` @@ -353,9 +353,9 @@ https://example.com/items/foo /// -### Каг 4: ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚Đ” **Ń„ŃƒĐœĐșцою ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо** { #step-4-define-the-path-operation-function } +### Каг 4: ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚Đ” **Ń„ŃƒĐœĐșцою-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș путо** { #step-4-define-the-path-operation-function } -Đ’ĐŸŃ‚ ĐœĐ°ŃˆĐ° Â«Ń„ŃƒĐœĐșцоя ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž ĐżŃƒŃ‚ĐžÂ»: +Đ’ĐŸŃ‚ ĐœĐ°ŃˆĐ° «**Ń„ŃƒĐœĐșцоя-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș путо**»: * **путь**: `/`. * **ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃ**: `get`. @@ -365,7 +365,7 @@ https://example.com/items/foo Đ­Ń‚ĐŸ Ń„ŃƒĐœĐșцоя ĐœĐ° Python. -**FastAPI** Đ±ŃƒĐŽĐ”Ń‚ ĐČызыĐČать Дё ĐșажЎыĐč раз, ĐșĐŸĐłĐŽĐ° ĐżĐŸĐ»ŃƒŃ‡Đ°Đ”Ń‚ Đ·Đ°ĐżŃ€ĐŸŃ Đș URL «`/`» с ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐ”Đč `GET`. +**FastAPI** Đ±ŃƒĐŽĐ”Ń‚ ĐČызыĐČать Дё ĐșажЎыĐč раз, ĐșĐŸĐłĐŽĐ° ĐżĐŸĐ»ŃƒŃ‡Đ°Đ”Ń‚ HTTP-Đ·Đ°ĐżŃ€ĐŸŃ Đș URL «`/`» с ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐ”Đč `GET`. В ĐŽĐ°ĐœĐœĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” ŃŃ‚ĐŸ Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœĐ°Ń (`async`) Ń„ŃƒĐœĐșцоя. @@ -403,7 +403,7 @@ https://example.com/items/foo ĐžĐœ ĐżĐ”Ń€Đ”ĐœĐŸŃĐžŃ‚ Ń‚ĐŸŃ‚ жД **ĐŸĐżŃ‹Ń‚ Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа** про ŃĐŸĐ·ĐŽĐ°ĐœĐžĐž ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč с FastAPI ĐœĐ° ох **разĐČДртыĐČĐ°ĐœĐžĐ”** ĐČ ĐŸĐ±Đ»Đ°ĐșĐ”. 🎉 -FastAPI Cloud — ĐŸŃĐœĐŸĐČĐœĐŸĐč ŃĐżĐŸĐœŃĐŸŃ€ Đž ĐžŃŃ‚ĐŸŃ‡ĐœĐžĐș Ń„ĐžĐœĐ°ĐœŃĐžŃ€ĐŸĐČĐ°ĐœĐžŃ ĐŽĐ»Ń open-source ĐżŃ€ĐŸĐ”ĐșŃ‚ĐŸĐČ Â«FastAPI Đž ĐŽŃ€ŃƒĐ·ŃŒŃÂ». ✹ +FastAPI Cloud — ĐŸŃĐœĐŸĐČĐœĐŸĐč ŃĐżĐŸĐœŃĐŸŃ€ Đž ĐžŃŃ‚ĐŸŃ‡ĐœĐžĐș Ń„ĐžĐœĐ°ĐœŃĐžŃ€ĐŸĐČĐ°ĐœĐžŃ ĐŽĐ»Ń open-source ĐżŃ€ĐŸĐ”ĐșŃ‚ĐŸĐČ *FastAPI Đž ĐŽŃ€ŃƒĐ·ŃŒŃ*. ✹ #### РазĐČДртыĐČĐ°ĐœĐžĐ” у Юругох ĐŸĐ±Đ»Đ°Ń‡ĐœŃ‹Ń… ĐżŃ€ĐŸĐČаĐčĐŽĐ”Ń€ĐŸĐČ { #deploy-to-other-cloud-providers } @@ -416,6 +416,6 @@ FastAPI — open-source Đž ĐŸŃĐœĐŸĐČĐ°Đœ ĐœĐ° ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ°Ń…. Вы ĐŒĐŸĐ¶ * Đ˜ĐŒĐżĐŸŃ€Ń‚ĐžŃ€ŃƒĐčтД `FastAPI`. * ĐĄĐŸĐ·ĐŽĐ°ĐčтД эĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€ `app`. * ĐĐ°ĐżĐžŃˆĐžŃ‚Đ” **ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€ ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо**, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ `@app.get("/")`. -* ОпрДЎДлОтД **Ń„ŃƒĐœĐșцою ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо**; ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, `def root(): ...`. +* ОпрДЎДлОтД **Ń„ŃƒĐœĐșцою-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș путо**; ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, `def root(): ...`. * Đ—Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đ” сДрĐČДр Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐž ĐșĐŸĐŒĐ°ĐœĐŽĐŸĐč `fastapi dev`. * Про Đ¶Đ”Đ»Đ°ĐœĐžĐž разĐČĐ”Ń€ĐœĐžŃ‚Đ” ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” ĐșĐŸĐŒĐ°ĐœĐŽĐŸĐč `fastapi deploy`. diff --git a/docs/ru/docs/tutorial/handling-errors.md b/docs/ru/docs/tutorial/handling-errors.md index fde188f09..9676ac78b 100644 --- a/docs/ru/docs/tutorial/handling-errors.md +++ b/docs/ru/docs/tutorial/handling-errors.md @@ -13,11 +13,11 @@ В таĐșох ŃĐ»ŃƒŃ‡Đ°ŃŃ… ĐŸĐ±Ń‹Ń‡ĐœĐŸ ĐČĐŸĐ·ĐČращают **HTTP статус-ĐșĐŸĐŽ** ĐČ ĐŽĐžĐ°ĐżĐ°Đ·ĐŸĐœĐ” **400** (ĐŸŃ‚ 400 ĐŽĐŸ 499). -ĐžĐœĐž ĐżĐŸŃ…ĐŸĐ¶Đž ĐœĐ° ĐŽĐČŃƒŃ…ŃĐŸŃ‚Ń‹Đ” HTTP статус-ĐșĐŸĐŽŃ‹ (ĐŸŃ‚ 200 ĐŽĐŸ 299), ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐŸĐ·ĐœĐ°Ń‡Đ°ŃŽŃ‚, Ń‡Ń‚ĐŸ Đ·Đ°ĐżŃ€ĐŸŃ ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Đ°Đœ ŃƒŃĐżĐ”ŃˆĐœĐŸ. +ĐžĐœĐž ĐżĐŸŃ…ĐŸĐ¶Đž ĐœĐ° ĐŽĐČŃƒŃ…ŃĐŸŃ‚Ń‹Đ” HTTP статус-ĐșĐŸĐŽŃ‹ (ĐŸŃ‚ 200 ĐŽĐŸ 299). Это статус-ĐșĐŸĐŽŃ‹ "200" ĐŸĐ·ĐœĐ°Ń‡Đ°ŃŽŃ‚, Ń‡Ń‚ĐŸ ĐČ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ” ĐČ ĐșаĐșĐŸĐŒ-Ń‚ĐŸ ŃĐŒŃ‹ŃĐ»Đ” был "ŃƒŃĐżĐ”Ń…". -Đ§Đ”Ń‚Ń‹Ń€Ń‘Ń…ŃĐŸŃ‚Ń‹Đ” статус-ĐșĐŸĐŽŃ‹ ĐŸĐ·ĐœĐ°Ń‡Đ°ŃŽŃ‚, Ń‡Ń‚ĐŸ ĐŸŃˆĐžĐ±Đșа ĐżŃ€ĐŸĐžĐ·ĐŸŃˆĐ»Đ° ĐżĐŸ ĐČĐžĐœĐ” ĐșĐ»ĐžĐ”ĐœŃ‚Đ°. +HTTP статус-ĐșĐŸĐŽŃ‹ ĐČ ĐŽĐžĐ°ĐżĐ°Đ·ĐŸĐœĐ” 400 ĐŸĐ·ĐœĐ°Ń‡Đ°ŃŽŃ‚, Ń‡Ń‚ĐŸ ĐżŃ€ĐŸĐžĐ·ĐŸŃˆĐ»Đ° ĐŸŃˆĐžĐ±Đșа ŃĐŸ ŃŃ‚ĐŸŃ€ĐŸĐœŃ‹ ĐșĐ»ĐžĐ”ĐœŃ‚Đ°. -ĐŸĐŸĐŒĐœĐžŃ‚Đ” лО ĐŸŃˆĐžĐ±ĐșĐž **"404 Not Found "** (Đž шутĐșĐž) ? +ĐŸĐŸĐŒĐœĐžŃ‚Đ” ĐČсД это ĐŸŃˆĐžĐ±ĐșĐž **"404 Not Found"** (Đž шутĐșĐž)? ## Đ˜ŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ” `HTTPException` { #use-httpexception } @@ -31,19 +31,19 @@ `HTTPException` - ŃŃ‚ĐŸ ĐŸĐ±Ń‹Ń‡ĐœĐŸĐ” ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” Python с ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹ĐŒĐž ĐŽĐ°ĐœĐœŃ‹ĐŒĐž, аĐșŃ‚ŃƒĐ°Đ»ŃŒĐœŃ‹ĐŒĐž ĐŽĐ»Ń API. -ĐŸĐŸŃĐșĐŸĐ»ŃŒĐșу ŃŃ‚ĐŸ ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” Python, Ń‚ĐŸ Đ”ĐłĐŸ ĐœĐ” `ĐČĐŸĐ·ĐČращают`, а `ĐČызыĐČают`. +ĐŸĐŸŃĐșĐŸĐ»ŃŒĐșу ŃŃ‚ĐŸ ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” Python, Ń‚ĐŸ Đ”ĐłĐŸ ĐœĐ” `return`, а `raise`. -Đ­Ń‚ĐŸ таĐșжД ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚, Ń‡Ń‚ĐŸ ДслО ĐČы ĐœĐ°Ń…ĐŸĐŽĐžŃ‚Đ”ŃŃŒ ĐČĐœŃƒŃ‚Ń€Đž Ń„ŃƒĐœĐșцоо, ĐșĐŸŃ‚ĐŸŃ€Đ°Ń ĐČызыĐČĐ°Đ”Ń‚ŃŃ ĐČĐœŃƒŃ‚Ń€Đž ĐČашДĐč *Ń„ŃƒĐœĐșцоо ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*, Đž ĐČы ĐżĐŸĐŽĐœĐžĐŒĐ°Đ”Ń‚Đ” `HTTPException` ĐČĐœŃƒŃ‚Ń€Đž ŃŃ‚ĐŸĐč Ń„ŃƒĐœĐșцоо, Ń‚ĐŸ ĐŸĐœĐ° ĐœĐ” Đ±ŃƒĐŽĐ”Ń‚ ĐČŃ‹ĐżĐŸĐ»ĐœŃŃ‚ŃŒ ĐŸŃŃ‚Đ°Đ»ŃŒĐœĐŸĐč ĐșĐŸĐŽ ĐČ *Ń„ŃƒĐœĐșцоо ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*, а ŃŃ€Đ°Đ·Ńƒ заĐČĐ”Ń€ŃˆĐžŃ‚ Đ·Đ°ĐżŃ€ĐŸŃ Đž ĐŸŃ‚ĐżŃ€Đ°ĐČот HTTP-ĐŸŃˆĐžĐ±Đșу Оз `HTTPException` ĐșĐ»ĐžĐ”ĐœŃ‚Ńƒ. +Đ­Ń‚ĐŸ таĐșжД ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚, Ń‡Ń‚ĐŸ ДслО ĐČы ĐœĐ°Ń…ĐŸĐŽĐžŃ‚Đ”ŃŃŒ ĐČĐœŃƒŃ‚Ń€Đž ĐČŃĐżĐŸĐŒĐŸĐłĐ°Ń‚Đ”Đ»ŃŒĐœĐŸĐč Ń„ŃƒĐœĐșцоо, ĐșĐŸŃ‚ĐŸŃ€Đ°Ń ĐČызыĐČĐ°Đ”Ń‚ŃŃ ĐČĐœŃƒŃ‚Ń€Đž ĐČашДĐč *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа путо*, Đž ĐČы ĐČызыĐČаДтД `HTTPException` ĐžĐ·ĐœŃƒŃ‚Ń€Đž ŃŃ‚ĐŸĐč ĐČŃĐżĐŸĐŒĐŸĐłĐ°Ń‚Đ”Đ»ŃŒĐœĐŸĐč Ń„ŃƒĐœĐșцоо, Ń‚ĐŸ ĐŸŃŃ‚Đ°Đ»ŃŒĐœĐŸĐč ĐșĐŸĐŽ ĐČ *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐ” путо* ĐČŃ‹ĐżĐŸĐ»ĐœŃŃ‚ŃŒŃŃ ĐœĐ” Đ±ŃƒĐŽĐ”Ń‚, Đ·Đ°ĐżŃ€ĐŸŃ ŃŃ€Đ°Đ·Ńƒ заĐČĐ”Ń€ŃˆĐžŃ‚ŃŃ, а HTTP-ĐŸŃˆĐžĐ±Đșа Оз `HTTPException` Đ±ŃƒĐŽĐ”Ń‚ ĐŸŃ‚ĐżŃ€Đ°ĐČĐ»Đ”ĐœĐ° ĐșĐ»ĐžĐ”ĐœŃ‚Ńƒ. -О Ń‚ĐŸĐŒ, ĐœĐ°ŃĐșĐŸĐ»ŃŒĐșĐŸ ĐČŃ‹ĐłĐŸĐŽĐœĐ”Đ” `ĐČызыĐČать` ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ”, Ń‡Đ”ĐŒ `ĐČĐŸĐ·ĐČращать` Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”, Đ±ŃƒĐŽĐ”Ń‚ рассĐșĐ°Đ·Đ°ĐœĐŸ ĐČ Ń€Đ°Đ·ĐŽĐ”Đ»Đ”, ĐżĐŸŃĐČŃŃ‰Đ”ĐœĐœĐŸĐŒ заĐČĐžŃĐžĐŒĐŸŃŃ‚ŃĐŒ Đž Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž. +ĐŸŃ€Đ”ĐžĐŒŃƒŃ‰Đ”ŃŃ‚ĐČĐŸ ĐČŃ‹Đ·ĐŸĐČа ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžŃ пДрДЎ ĐČĐŸĐ·ĐČŃ€Đ°Ń‚ĐŸĐŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ ŃŃ‚Đ°ĐœĐ”Ń‚ Đ±ĐŸĐ»Đ”Đ” ĐŸŃ‡Đ”ĐČĐžĐŽĐœŃ‹ĐŒ ĐČ Ń€Đ°Đ·ĐŽĐ”Đ»Đ” ĐŸ заĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŃ… Đž Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž. -В ĐŽĐ°ĐœĐœĐŸĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ”, ĐșĐŸĐłĐŽĐ° ĐșĐ»ĐžĐ”ĐœŃ‚ Đ·Đ°ĐżŃ€Đ°ŃˆĐžĐČаДт ŃĐ»Đ”ĐŒĐ”ĐœŃ‚ ĐżĐŸ ĐœĐ”ŃŃƒŃ‰Đ”ŃŃ‚ĐČŃƒŃŽŃ‰Đ”ĐŒŃƒ ID, ĐČĐŸĐ·ĐœĐžĐșаДт ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” ŃĐŸ статус-ĐșĐŸĐŽĐŸĐŒ `404`: +В ĐŽĐ°ĐœĐœĐŸĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ”, ĐșĐŸĐłĐŽĐ° ĐșĐ»ĐžĐ”ĐœŃ‚ Đ·Đ°ĐżŃ€Đ°ŃˆĐžĐČаДт ŃĐ»Đ”ĐŒĐ”ĐœŃ‚ ĐżĐŸ ĐœĐ”ŃŃƒŃ‰Đ”ŃŃ‚ĐČŃƒŃŽŃ‰Đ”ĐŒŃƒ ID, ĐČŃ‹Đ·ĐŸĐČОтД ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” ŃĐŸ статус-ĐșĐŸĐŽĐŸĐŒ `404`: {* ../../docs_src/handling_errors/tutorial001_py310.py hl[11] *} ### Đ’ĐŸĐ·ĐČŃ€Đ°Ń‰Đ°Đ”ĐŒŃ‹Đč ĐŸŃ‚ĐČДт { #the-resulting-response } -ЕслО ĐșĐ»ĐžĐ”ĐœŃ‚ Đ·Đ°ĐżŃ€ĐŸŃĐžŃ‚ `http://example.com/items/foo` (`item_id` `"foo"`), Ń‚ĐŸ ĐŸĐœ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ статус-ĐșĐŸĐŽ 200 Đž ĐŸŃ‚ĐČДт ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” JSON: +ЕслО ĐșĐ»ĐžĐ”ĐœŃ‚ Đ·Đ°ĐżŃ€ĐŸŃĐžŃ‚ `http://example.com/items/foo` (`item_id` `"foo"`), Ń‚ĐŸ ĐŸĐœ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ HTTP статус-ĐșĐŸĐŽ 200 Đž ĐŸŃ‚ĐČДт ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” JSON: ```JSON { @@ -51,7 +51,7 @@ } ``` -ĐĐŸ ДслО ĐșĐ»ĐžĐ”ĐœŃ‚ Đ·Đ°ĐżŃ€ĐŸŃĐžŃ‚ `http://example.com/items/bar` (ĐœĐ”ŃŃƒŃ‰Đ”ŃŃ‚ĐČующоĐč `item_id` `"bar"`), Ń‚ĐŸ ĐŸĐœ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ статус-ĐșĐŸĐŽ 404 (ĐŸŃˆĐžĐ±Đșа "ĐœĐ” ĐœĐ°ĐčĐŽĐ”ĐœĐŸ") Đž JSON-ĐŸŃ‚ĐČДт ĐČ ĐČОЎД: +ĐĐŸ ДслО ĐșĐ»ĐžĐ”ĐœŃ‚ Đ·Đ°ĐżŃ€ĐŸŃĐžŃ‚ `http://example.com/items/bar` (ĐœĐ”ŃŃƒŃ‰Đ”ŃŃ‚ĐČующоĐč `item_id` `"bar"`), Ń‚ĐŸ ĐŸĐœ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ HTTP статус-ĐșĐŸĐŽ 404 (ĐŸŃˆĐžĐ±Đșа "ĐœĐ” ĐœĐ°ĐčĐŽĐ”ĐœĐŸ") Đž JSON-ĐŸŃ‚ĐČДт ĐČ ĐČОЎД: ```JSON { @@ -69,13 +69,13 @@ /// -## Đ”ĐŸĐ±Đ°ĐČĐ»Đ”ĐœĐžĐ” ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșох Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐŸĐČ { #add-custom-headers } +## Đ”ĐŸĐ±Đ°ĐČĐ»Đ”ĐœĐžĐ” ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșох HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐŸĐČ { #add-custom-headers } -В ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Ń… сотуацоях ĐżĐŸĐ»Đ”Đ·ĐœĐŸ ĐžĐŒĐ”Ń‚ŃŒ ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ ĐŽĐŸĐ±Đ°ĐČĐ»ŃŃ‚ŃŒ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșОД HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž Đș ĐŸŃˆĐžĐ±ĐșĐ” HTTP. ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐŽĐ»Ń ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Ń… Ń‚ĐžĐżĐŸĐČ Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž. +В ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Ń… сотуацоях ĐżĐŸĐ»Đ”Đ·ĐœĐŸ ĐžĐŒĐ”Ń‚ŃŒ ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ ĐŽĐŸĐ±Đ°ĐČĐ»ŃŃ‚ŃŒ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșОД HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž Đș HTTP-ĐŸŃˆĐžĐ±ĐșĐ”. ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐŽĐ»Ń ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Ń… Ń‚ĐžĐżĐŸĐČ Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž. -ĐĄĐșĐŸŃ€Đ”Đ” ĐČŃĐ”ĐłĐŸ, ĐČĐ°ĐŒ ĐœĐ” ĐżĐŸŃ‚Ń€Đ”Đ±ŃƒĐ”Ń‚ŃŃ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ”ĐłĐŸ ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ ĐČ ĐșĐŸĐŽĐ”. +ĐĄĐșĐŸŃ€Đ”Đ” ĐČŃĐ”ĐłĐŸ, ĐČĐ°ĐŒ ĐœĐ” ĐżĐŸŃ‚Ń€Đ”Đ±ŃƒĐ”Ń‚ŃŃ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ŃŃ‚ĐŸ ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ ĐČ ĐșĐŸĐŽĐ”. -ĐĐŸ ĐČ ŃĐ»ŃƒŃ‡Đ°Đ”, ДслО ŃŃ‚ĐŸ ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒĐŸ ĐŽĐ»Ń ĐżŃ€ĐŸĐŽĐČĐžĐœŃƒŃ‚ĐŸĐłĐŸ ŃŃ†Đ”ĐœĐ°Ń€ĐžŃ, ĐŒĐŸĐ¶ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČоть ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșОД Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž: +ĐĐŸ ĐČ ŃĐ»ŃƒŃ‡Đ°Đ”, ДслО ŃŃ‚ĐŸ ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒĐŸ ĐŽĐ»Ń ĐżŃ€ĐŸĐŽĐČĐžĐœŃƒŃ‚ĐŸĐłĐŸ ŃŃ†Đ”ĐœĐ°Ń€ĐžŃ, ĐŒĐŸĐ¶ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČоть ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșОД HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž: {* ../../docs_src/handling_errors/tutorial002_py310.py hl[14] *} @@ -83,7 +83,7 @@ Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽĐŸĐ±Đ°ĐČоть ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșОД ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ [тДх жД ŃƒŃ‚ĐžĐ»ĐžŃ‚ ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐž ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč Оз Starlette](https://www.starlette.dev/exceptions/). -Đ”ĐŸĐżŃƒŃŃ‚ĐžĐŒ, у ĐČас Đ”ŃŃ‚ŃŒ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșĐŸĐ” ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” `UnicornException`, ĐșĐŸŃ‚ĐŸŃ€ĐŸĐ” ĐČы (ОлО ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒĐ°Ń ĐČĐ°ĐŒĐž Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșа) ĐŒĐŸĐ¶Đ”Ń‚Đ” `ĐČызĐČать`. +Đ”ĐŸĐżŃƒŃŃ‚ĐžĐŒ, у ĐČас Đ”ŃŃ‚ŃŒ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșĐŸĐ” ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” `UnicornException`, ĐșĐŸŃ‚ĐŸŃ€ĐŸĐ” ĐČы (ОлО ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒĐ°Ń ĐČĐ°ĐŒĐž Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșа) ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČызĐČать с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `raise`. И ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČать ŃŃ‚ĐŸ ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐŸ с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ FastAPI. @@ -95,7 +95,7 @@ ĐĐŸ ĐŸĐœĐŸ Đ±ŃƒĐŽĐ”Ń‚ ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Đ°ĐœĐŸ `unicorn_exception_handler`. -йаĐșĐžĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ, ĐČы ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚Đ” чостую ĐŸŃˆĐžĐ±Đșу с ĐșĐŸĐŽĐŸĐŒ ŃĐŸŃŃ‚ĐŸŃĐœĐžŃ HTTP `418` Đž ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒŃ‹ĐŒ JSON: +йаĐșĐžĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ, ĐČы ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚Đ” чостую ĐŸŃˆĐžĐ±Đșу с HTTP статус-ĐșĐŸĐŽĐŸĐŒ `418` Đž ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒŃ‹ĐŒ JSON: ```JSON {"message": "Oops! yolo did something. There goes a rainbow..."} @@ -113,17 +113,17 @@ **FastAPI** ĐžĐŒĐ”Đ”Ń‚ ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ. -Это ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž ĐŸŃ‚ĐČДчают за ĐČĐŸĐ·ĐČрат ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœŃ‹Ń… JSON-ĐŸŃ‚ĐČĐ”Ń‚ĐŸĐČ ĐżŃ€Đž `ĐČŃ‹Đ·ĐŸĐČĐ”` `HTTPException` Đž про ĐœĐ°Đ»ĐžŃ‡ĐžĐž ĐČ Đ·Đ°ĐżŃ€ĐŸŃĐ” ĐœĐ”ĐŽĐŸĐżŃƒŃŃ‚ĐžĐŒŃ‹Ń… ĐŽĐ°ĐœĐœŃ‹Ń…. +Это ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž ĐŸŃ‚ĐČДчают за ĐČĐŸĐ·ĐČрат ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœŃ‹Ń… JSON-ĐŸŃ‚ĐČĐ”Ń‚ĐŸĐČ ĐżŃ€Đž ĐČŃ‹Đ·ĐŸĐČĐ” `HTTPException` с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `raise` Đž про ĐœĐ°Đ»ĐžŃ‡ĐžĐž ĐČ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ” ĐœĐ”ĐŽĐŸĐżŃƒŃŃ‚ĐžĐŒŃ‹Ń… ĐŽĐ°ĐœĐœŃ‹Ń…. Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐ”Ń€Đ”ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ это ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč ĐœĐ° сĐČĐŸĐž ŃĐŸĐ±ŃŃ‚ĐČĐ”ĐœĐœŃ‹Đ”. -### ĐŸĐ”Ń€Đ”ĐŸĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐžĐ” ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč ĐżŃ€ĐŸĐČДрĐșĐž Đ·Đ°ĐżŃ€ĐŸŃĐ° { #override-request-validation-exceptions } +### ĐŸĐ”Ń€Đ”ĐŸĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐžĐ” ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč ĐČалОЎацОО Đ·Đ°ĐżŃ€ĐŸŃĐ° { #override-request-validation-exceptions } -ĐšĐŸĐłĐŽĐ° Đ·Đ°ĐżŃ€ĐŸŃ ŃĐŸĐŽĐ”Ń€Đ¶ĐžŃ‚ ĐœĐ”ĐŽĐŸĐżŃƒŃŃ‚ĐžĐŒŃ‹Đ” ĐŽĐ°ĐœĐœŃ‹Đ”, **FastAPI** ĐČĐœŃƒŃ‚Ń€Đ”ĐœĐœĐ” ĐČызыĐČаДт ĐŸŃˆĐžĐ±Đșу `RequestValidationError`. +ĐšĐŸĐłĐŽĐ° HTTP-Đ·Đ°ĐżŃ€ĐŸŃ ŃĐŸĐŽĐ”Ń€Đ¶ĐžŃ‚ ĐœĐ”ĐŽĐŸĐżŃƒŃŃ‚ĐžĐŒŃ‹Đ” ĐŽĐ°ĐœĐœŃ‹Đ”, **FastAPI** ĐČĐœŃƒŃ‚Ń€Đ”ĐœĐœĐ” ĐČызыĐČаДт `RequestValidationError`. -А таĐșжД ĐČĐșлючаДт ĐČ ŃĐ”Đ±Ń ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ. +А таĐșжД ĐČĐșлючаДт ĐČ ŃĐ”Đ±Ń ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ ĐŽĐ»Ń ĐœĐ”ĐłĐŸ. -Đ§Ń‚ĐŸĐ±Ń‹ ĐżĐ”Ń€Đ”ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ Đ”ĐłĐŸ, ĐžĐŒĐżĐŸŃ€Ń‚ĐžŃ€ŃƒĐčтД `RequestValidationError` Đž ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД Đ”ĐłĐŸ с `@app.exception_handler(RequestValidationError)` ĐŽĐ»Ń ŃĐŸĐ·ĐŽĐ°ĐœĐžŃ ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč. +Đ§Ń‚ĐŸĐ±Ń‹ ĐżĐ”Ń€Đ”ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ Đ”ĐłĐŸ, ĐžĐŒĐżĐŸŃ€Ń‚ĐžŃ€ŃƒĐčтД `RequestValidationError` Đž ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД Đ”ĐłĐŸ с `@app.exception_handler(RequestValidationError)`, Ń‡Ń‚ĐŸĐ±Ń‹ ĐŽĐ”ĐșĐŸŃ€ĐžŃ€ĐŸĐČать ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč. ĐžĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžŃ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ ĐŸĐ±ŃŠĐ”Đșт `Request` Đž ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ”. @@ -146,7 +146,7 @@ } ``` -ĐČы ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚Đ” тДĐșŃŃ‚ĐŸĐČую ĐČДрсОю: +ĐČы ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚Đ” тДĐșŃŃ‚ĐŸĐČую ĐČДрсОю с: ``` Validation errors: @@ -171,7 +171,7 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa /// warning | Đ’ĐœĐžĐŒĐ°ĐœĐžĐ” -Đ˜ĐŒĐ”ĐčтД ĐČ ĐČОЎу, Ń‡Ń‚ĐŸ `RequestValidationError` ŃĐŸĐŽĐ”Ń€Đ¶ĐžŃ‚ ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃŽ ĐŸĐ± ĐžĐŒĐ”ĐœĐž фаĐčла Đž ŃŃ‚Ń€ĐŸĐșĐ”, гЎД ĐżŃ€ĐŸĐžĐ·ĐŸŃˆĐ»Đ° ĐŸŃˆĐžĐ±Đșа ĐČалОЎацОО, Ń‡Ń‚ĐŸĐ±Ń‹ ĐČы ĐŒĐŸĐłĐ»Đž про Đ¶Đ”Đ»Đ°ĐœĐžĐž ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ·ĐžŃ‚ŃŒ Дё ĐČ Đ»ĐŸĐłĐ°Ń… с рДлДĐČĐ°ĐœŃ‚ĐœŃ‹ĐŒĐž ĐŽĐ°ĐœĐœŃ‹ĐŒĐž. +Đ˜ĐŒĐ”ĐčтД ĐČ ĐČОЎу, Ń‡Ń‚ĐŸ `RequestValidationError` ŃĐŸĐŽĐ”Ń€Đ¶ĐžŃ‚ ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃŽ ĐŸĐ± ĐžĐŒĐ”ĐœĐž фаĐčла Đž ŃŃ‚Ń€ĐŸĐșĐ”, гЎД ĐżŃ€ĐŸĐžŃŃ…ĐŸĐŽĐžŃ‚ ĐŸŃˆĐžĐ±Đșа ĐČалОЎацОО, Ń‡Ń‚ĐŸĐ±Ń‹ ĐČы ĐŒĐŸĐłĐ»Đž про Đ¶Đ”Đ»Đ°ĐœĐžĐž ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ·ĐžŃ‚ŃŒ Дё ĐČ Đ»ĐŸĐłĐ°Ń… ĐČĐŒĐ”ŃŃ‚Đ” с рДлДĐČĐ°ĐœŃ‚ĐœĐŸĐč ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐ”Đč. ĐĐŸ ŃŃ‚ĐŸ ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚, Ń‡Ń‚ĐŸ ДслО ĐČы ĐżŃ€ĐŸŃŃ‚ĐŸ ĐżŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ŃƒĐ”Ń‚Đ” Дё ĐČ ŃŃ‚Ń€ĐŸĐșу Đž ĐČĐ”Ń€ĐœŃ‘Ń‚Đ” эту ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃŽ ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽĐŸĐżŃƒŃŃ‚ĐžŃ‚ŃŒ ĐœĐ”Đ±ĐŸĐ»ŃŒŃˆŃƒŃŽ ŃƒŃ‚Đ”Ń‡Đșу ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐž ĐŸ сĐČĐŸĐ”Đč ŃĐžŃŃ‚Đ”ĐŒĐ”, ĐżĐŸŃŃ‚ĐŸĐŒŃƒ Đ·ĐŽĐ”ŃŃŒ ĐșĐŸĐŽ ОзĐČлДĐșаДт Đž ĐżĐŸĐșазыĐČаДт ĐșĐ°Đ¶ĐŽŃƒŃŽ ĐŸŃˆĐžĐ±Đșу ĐŸŃ‚ĐŽĐ”Đ»ŃŒĐœĐŸ. @@ -179,13 +179,13 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa ### Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД Ń‚Đ”Đ»ĐŸ `RequestValidationError` { #use-the-requestvalidationerror-body } -ĐžŃˆĐžĐ±Đșа `RequestValidationError` ŃĐŸĐŽĐ”Ń€Đ¶ĐžŃ‚ ĐżĐŸĐ»ŃƒŃ‡Đ”ĐœĐœĐŸĐ” `Ń‚Đ”Đ»ĐŸ` с ĐœĐ”ĐŽĐŸĐżŃƒŃŃ‚ĐžĐŒŃ‹ĐŒĐž ĐŽĐ°ĐœĐœŃ‹ĐŒĐž. +ĐžŃˆĐžĐ±Đșа `RequestValidationError` ŃĐŸĐŽĐ”Ń€Đ¶ĐžŃ‚ `body` (Ń‚Đ”Đ»ĐŸ Đ·Đ°ĐżŃ€ĐŸŃĐ°), ĐșĐŸŃ‚ĐŸŃ€ĐŸĐ” ĐŸĐœĐ° ĐżĐŸĐ»ŃƒŃ‡ĐžĐ»Đ° с ĐœĐ”ĐŽĐŸĐżŃƒŃŃ‚ĐžĐŒŃ‹ĐŒĐž ĐŽĐ°ĐœĐœŃ‹ĐŒĐž. -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ”ĐłĐŸ про Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐ” ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ ĐŽĐ»Ń рДгОстрацОО тДла Đž Đ”ĐłĐŸ ĐŸŃ‚Đ»Đ°ĐŽĐșĐž, ĐČĐŸĐ·ĐČрата ĐżĐŸĐ»ŃŒĐ·ĐŸĐČатДлю Đž т.ĐŽ. +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ”ĐłĐŸ про Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐ” ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ ĐŽĐ»Ń Đ»ĐŸĐłĐžŃ€ĐŸĐČĐ°ĐœĐžŃ тДла Đ·Đ°ĐżŃ€ĐŸŃĐ° Đž Đ”ĐłĐŸ ĐŸŃ‚Đ»Đ°ĐŽĐșĐž, ĐČĐŸĐ·ĐČрата ĐżĐŸĐ»ŃŒĐ·ĐŸĐČатДлю Đž т.ĐŽ. {* ../../docs_src/handling_errors/tutorial005_py310.py hl[14] *} -ĐąĐ”ĐżĐ”Ń€ŃŒ ĐżĐŸĐżŃ€ĐŸĐ±ŃƒĐčтД ĐŸŃ‚ĐżŃ€Đ°ĐČоть ĐœĐ”ĐŽĐ”ĐčстĐČĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đč ŃĐ»Đ”ĐŒĐ”ĐœŃ‚, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: +ĐąĐ”ĐżĐ”Ń€ŃŒ ĐżĐŸĐżŃ€ĐŸĐ±ŃƒĐčтД ĐŸŃ‚ĐżŃ€Đ°ĐČоть ĐœĐ”ĐŽĐŸĐżŃƒŃŃ‚ĐžĐŒŃ‹Đč ŃĐ»Đ”ĐŒĐ”ĐœŃ‚, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: ```JSON { @@ -194,7 +194,7 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa } ``` -Вы ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚Đ” ĐŸŃ‚ĐČДт ĐŸ Ń‚ĐŸĐŒ, Ń‡Ń‚ĐŸ ĐŽĐ°ĐœĐœŃ‹Đ” ĐœĐ”ĐŽĐ”ĐčстĐČĐžŃ‚Đ”Đ»ŃŒĐœŃ‹, ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‰ĐžĐč ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”Đ” Ń‚Đ”Đ»ĐŸ: +Вы ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚Đ” ĐŸŃ‚ĐČДт ĐŸ Ń‚ĐŸĐŒ, Ń‡Ń‚ĐŸ ĐŽĐ°ĐœĐœŃ‹Đ” ĐœĐ”ĐŽĐŸĐżŃƒŃŃ‚ĐžĐŒŃ‹, ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‰ĐžĐč ĐżĐŸĐ»ŃƒŃ‡Đ”ĐœĐœĐŸĐ” Ń‚Đ”Đ»ĐŸ Đ·Đ°ĐżŃ€ĐŸŃĐ°: ```JSON hl_lines="12-15" { @@ -215,7 +215,7 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa } ``` -#### `HTTPException` ĐČ FastAPI ОлО ĐČ Starlette { #fastapis-httpexception-vs-starlettes-httpexception } +#### `HTTPException` ĐČ FastAPI Đž `HTTPException` ĐČ Starlette { #fastapis-httpexception-vs-starlettes-httpexception } **FastAPI** ĐžĐŒĐ”Đ”Ń‚ ŃĐŸĐ±ŃŃ‚ĐČĐ”ĐœĐœŃ‹Đč `HTTPException`. @@ -227,9 +227,9 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa ĐĐŸ ĐșĐŸĐłĐŽĐ° ĐČы Ń€Đ”ĐłĐžŃŃ‚Ń€ĐžŃ€ŃƒĐ”Ń‚Đ” ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč, ĐČы ĐŽĐŸĐ»Đ¶ĐœŃ‹ Đ·Đ°Ń€Đ”ĐłĐžŃŃ‚Ń€ĐžŃ€ĐŸĐČать Đ”ĐłĐŸ ĐŽĐ»Ń `HTTPException` ĐŸŃ‚ Starlette. -йаĐșĐžĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ, ДслО ĐșаĐșая-Đ»ĐžĐ±ĐŸ часть ĐČĐœŃƒŃ‚Ń€Đ”ĐœĐœĐ”ĐłĐŸ ĐșĐŸĐŽa Starlette, Ń€Đ°ŃŃˆĐžŃ€Đ”ĐœĐžĐ” ОлО ĐżĐ»Đ°ĐłĐžĐœ Starlette ĐČŃ‹Đ·ĐŸĐČДт ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” Starlette `HTTPException`, ĐČаш ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș ŃĐŒĐŸĐ¶Đ”Ń‚ пДрДхĐČатоть Đž ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Đ°Ń‚ŃŒ Đ”ĐłĐŸ. +йаĐșĐžĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ, ДслО ĐșаĐșая-Đ»ĐžĐ±ĐŸ часть ĐČĐœŃƒŃ‚Ń€Đ”ĐœĐœĐ”ĐłĐŸ ĐșĐŸĐŽĐ° Starlette, Ń€Đ°ŃŃˆĐžŃ€Đ”ĐœĐžĐ” ОлО ĐżĐ»Đ°ĐłĐžĐœ Starlette ĐČŃ‹Đ·ĐŸĐČДт ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” Starlette `HTTPException`, ĐČаш ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐș ŃĐŒĐŸĐ¶Đ”Ń‚ пДрДхĐČатоть Đž ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Đ°Ń‚ŃŒ Đ”ĐłĐŸ. -В ĐŽĐ°ĐœĐœĐŸĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ”, Ń‡Ń‚ĐŸĐ±Ń‹ ĐžĐŒĐ”Ń‚ŃŒ ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐŸĐ±Đ° `HTTPException` ĐČ ĐŸĐŽĐœĐŸĐŒ ĐșĐŸĐŽĐ”, ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžŃ Starlette ĐżĐ”Ń€Đ”ĐžĐŒĐ”ĐœĐŸĐČĐ°ĐœŃ‹ ĐČ `StarletteHTTPException`: +В ĐŽĐ°ĐœĐœĐŸĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ”, Ń‡Ń‚ĐŸĐ±Ń‹ ĐžĐŒĐ”Ń‚ŃŒ ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐŸĐ±Đ° `HTTPException` ĐČ ĐŸĐŽĐœĐŸĐŒ ĐșĐŸĐŽĐ”, ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” Starlette ĐżĐ”Ń€Đ”ĐžĐŒĐ”ĐœĐŸĐČĐ°ĐœĐŸ ĐČ `StarletteHTTPException`: ```Python from starlette.exceptions import HTTPException as StarletteHTTPException @@ -241,4 +241,4 @@ from starlette.exceptions import HTTPException as StarletteHTTPException {* ../../docs_src/handling_errors/tutorial006_py310.py hl[2:5,15,21] *} -В ŃŃ‚ĐŸĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ” ĐČы ĐżŃ€ĐŸŃŃ‚ĐŸ `ĐČыĐČĐŸĐŽĐžŃ‚Đ” ĐČ Ń‚Đ”Ń€ĐŒĐžĐœĐ°Đ»` ĐŸŃˆĐžĐ±Đșу с ĐŸŃ‡Đ”ĐœŃŒ ĐČŃ‹Ń€Đ°Đ·ĐžŃ‚Đ”Đ»ŃŒĐœŃ‹ĐŒ ŃĐŸĐŸĐ±Ń‰Đ”ĐœĐžĐ”ĐŒ, ĐœĐŸ ĐžĐŽĐ”Ń ĐČĐ°ĐŒ ĐżĐŸĐœŃŃ‚ĐœĐ°. Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ”, а Đ·Đ°Ń‚Đ”ĐŒ ĐżŃ€ĐŸŃŃ‚ĐŸ ĐżĐŸĐČŃ‚ĐŸŃ€ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœŃ‹Đ” ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč. +В ŃŃ‚ĐŸĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ” ĐČы ĐżŃ€ĐŸŃŃ‚ĐŸ ĐČыĐČĐŸĐŽĐžŃ‚Đ” ĐŸŃˆĐžĐ±Đșу с ĐŸŃ‡Đ”ĐœŃŒ ĐČŃ‹Ń€Đ°Đ·ĐžŃ‚Đ”Đ»ŃŒĐœŃ‹ĐŒ ŃĐŸĐŸĐ±Ń‰Đ”ĐœĐžĐ”ĐŒ, ĐœĐŸ ĐžĐŽĐ”Ń ĐČĐ°ĐŒ ĐżĐŸĐœŃŃ‚ĐœĐ°. Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ”, а Đ·Đ°Ń‚Đ”ĐŒ ĐżŃ€ĐŸŃŃ‚ĐŸ ĐżĐŸĐČŃ‚ĐŸŃ€ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœŃ‹Đ” ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐž ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč. diff --git a/docs/ru/docs/tutorial/index.md b/docs/ru/docs/tutorial/index.md index eec217b75..b843515f8 100644 --- a/docs/ru/docs/tutorial/index.md +++ b/docs/ru/docs/tutorial/index.md @@ -1,5 +1,6 @@ # ĐŁŃ‡Đ”Đ±ĐœĐžĐș - РуĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń { #tutorial-user-guide } + В ŃŃ‚ĐŸĐŒ руĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐ” шаг за ŃˆĐ°ĐłĐŸĐŒ ĐżĐŸĐșĐ°Đ·Đ°ĐœĐŸ, ĐșаĐș ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать **FastAPI** с Đ±ĐŸĐ»ŃŒŃˆĐžĐœŃŃ‚ĐČĐŸĐŒ Đ”ĐłĐŸ Ń„ŃƒĐœĐșцоĐč. КажЎыĐč разЎДл ĐżĐŸŃŃ‚Đ”ĐżĐ”ĐœĐœĐŸ ĐŸŃĐœĐŸĐČыĐČĐ°Đ”Ń‚ŃŃ ĐœĐ° ĐżŃ€Đ”ĐŽŃ‹ĐŽŃƒŃ‰ĐžŃ…, ĐœĐŸ струĐșтура Ń€Đ°Đ·ĐŽĐ”Đ»ŃĐ”Ń‚ Ń‚Đ”ĐŒŃ‹, таĐș Ń‡Ń‚ĐŸ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃŃ€Đ°Đ·Ńƒ пДрДĐčто Đș ĐœŃƒĐ¶ĐœĐŸĐč Ń‚Đ”ĐŒĐ” ĐŽĐ»Ń Ń€Đ”ŃˆĐ”ĐœĐžŃ ĐČашох ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœŃ‹Ń… заЎач ĐżĐŸ API. diff --git a/docs/ru/docs/tutorial/metadata.md b/docs/ru/docs/tutorial/metadata.md index b1335f668..958c9cbbb 100644 --- a/docs/ru/docs/tutorial/metadata.md +++ b/docs/ru/docs/tutorial/metadata.md @@ -11,10 +11,10 @@ | `title` | `str` | Đ—Đ°ĐłĐŸĐ»ĐŸĐČĐŸĐș API. | | `summary` | `str` | КратĐșĐŸĐ” Ń€Đ”Đ·ŃŽĐŒĐ” API. Đ”ĐŸŃŃ‚ŃƒĐżĐœĐŸ ĐœĐ°Ń‡ĐžĐœĐ°Ń с OpenAPI 3.1.0, FastAPI 0.99.0. | | `description` | `str` | КратĐșĐŸĐ” ĐŸĐżĐžŃĐ°ĐœĐžĐ” API. ĐœĐŸĐ¶Đ”Ń‚ Đ±Ń‹Ń‚ŃŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Đœ Markdown. | -| `version` | `string` | Đ’Đ”Ń€ŃĐžŃ API. Đ’Đ”Ń€ŃĐžŃ ĐČĐ°ŃˆĐ”ĐłĐŸ ŃĐŸĐ±ŃŃ‚ĐČĐ”ĐœĐœĐŸĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ, а ĐœĐ” OpenAPI. К ĐżŃ€ĐžĐŒĐ”Ń€Ńƒ `2.5.0`. | -| `terms_of_service` | `str` | ХсылĐșа Đș ŃƒŃĐ»ĐŸĐČĐžŃĐŒ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžŃ API. ЕслО уĐșĐ°Đ·Đ°ĐœĐŸ, Ń‚ĐŸ ŃŃ‚ĐŸ ĐŽĐŸĐ»Đ¶Đ”Đœ Đ±Ń‹Ń‚ŃŒ URL-аЎрДс. | -| `contact` | `dict` | ĐšĐŸĐœŃ‚Đ°ĐșŃ‚ĐœĐ°Ń ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ ĐŽĐ»Ń ĐŸŃ‚ĐșŃ€Ń‹Ń‚ĐŸĐłĐŸ API. ĐœĐŸĐ¶Đ”Ń‚ ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ŃŒ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ ĐżĐŸĐ»Đ”Đč.
ĐżĐŸĐ»Ń contact
ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐąĐžĐżĐžĐżĐžŃĐ°ĐœĐžĐ”
namestrĐ˜ĐŽĐ”ĐœŃ‚ĐžŃ„ĐžĐșĐ°Ń†ĐžĐŸĐœĐœĐŸĐ” ĐžĐŒŃ ĐșĐŸĐœŃ‚Đ°ĐșŃ‚ĐœĐŸĐłĐŸ лОца/ĐŸŃ€ĐłĐ°ĐœĐžĐ·Đ°Ń†ĐžĐž.
urlstrURL уĐșазыĐČающоĐč ĐœĐ° ĐșĐŸĐœŃ‚Đ°ĐșŃ‚ĐœŃƒŃŽ ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃŽ. ДОЛЖЕН Đ±Ń‹Ń‚ŃŒ ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” URL.
emailstrEmail аЎрДс ĐșĐŸĐœŃ‚Đ°ĐșŃ‚ĐœĐŸĐłĐŸ лОца/ĐŸŃ€ĐłĐ°ĐœĐžĐ·Đ°Ń†ĐžĐž. ДОЛЖЕН Đ±Ń‹Ń‚ŃŒ ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” email аЎрДса.
| -| `license_info` | `dict` | Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ ĐŸ Đ»ĐžŃ†Đ”ĐœĐ·ĐžĐž ĐŸŃ‚ĐșŃ€Ń‹Ń‚ĐŸĐłĐŸ API. ĐœĐŸĐ¶Đ”Ń‚ ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ŃŒ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ ĐżĐŸĐ»Đ”Đč.
ĐżĐŸĐ»Ń license_info
ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐąĐžĐżĐžĐżĐžŃĐ°ĐœĐžĐ”
namestrОБЯЗАбЕЛЬНО (ДслО ŃƒŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”Đœ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ license_info). ĐĐ°Đ·ĐČĐ°ĐœĐžĐ” Đ»ĐžŃ†Đ”ĐœĐ·ĐžĐž, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒĐŸĐč ĐŽĐ»Ń API.
identifierstrĐ’Ń‹Ń€Đ°Đ¶Đ”ĐœĐžĐ” Đ»ĐžŃ†Đ”ĐœĐ·ĐžĐž [SPDX](https://spdx.org/licenses/) ĐŽĐ»Ń API. ĐŸĐŸĐ»Đ” identifier ĐČĐ·Đ°ĐžĐŒĐŸĐžŃĐșлючающДД с ĐżĐŸĐ»Đ”ĐŒ url. Đ”ĐŸŃŃ‚ŃƒĐżĐœĐŸ ĐœĐ°Ń‡ĐžĐœĐ°Ń с OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrURL, уĐșазыĐČающоĐč ĐœĐ° Đ»ĐžŃ†Đ”ĐœĐ·ĐžŃŽ, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒŃƒŃŽ ĐŽĐ»Ń API. ДОЛЖЕН Đ±Ń‹Ń‚ŃŒ ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” URL.
| +| `version` | `str` | Đ’Đ”Ń€ŃĐžŃ API. Đ’Đ”Ń€ŃĐžŃ ĐČĐ°ŃˆĐ”ĐłĐŸ ŃĐŸĐ±ŃŃ‚ĐČĐ”ĐœĐœĐŸĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ, а ĐœĐ” OpenAPI. К ĐżŃ€ĐžĐŒĐ”Ń€Ńƒ `2.5.0`. | +| `terms_of_service` | `str` | ХсылĐșа ĐœĐ° ŃƒŃĐ»ĐŸĐČоя ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžŃ API. ЕслО уĐșĐ°Đ·Đ°ĐœĐŸ, Ń‚ĐŸ ŃŃ‚ĐŸ ĐŽĐŸĐ»Đ¶Đ”Đœ Đ±Ń‹Ń‚ŃŒ URL-аЎрДс. | +| `contact` | `dict` | ĐšĐŸĐœŃ‚Đ°ĐșŃ‚ĐœĐ°Ń ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ ĐŽĐ»Ń ĐŸŃ‚ĐșŃ€Ń‹Ń‚ĐŸĐłĐŸ API. ĐœĐŸĐ¶Đ”Ń‚ ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ŃŒ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ ĐżĐŸĐ»Đ”Đč.
ĐżĐŸĐ»Ń contact
ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐąĐžĐżĐžĐżĐžŃĐ°ĐœĐžĐ”
namestrĐ˜ĐŽĐ”ĐœŃ‚ĐžŃ„ĐžĐșĐ°Ń†ĐžĐŸĐœĐœĐŸĐ” ĐžĐŒŃ ĐșĐŸĐœŃ‚Đ°ĐșŃ‚ĐœĐŸĐłĐŸ лОца/ĐŸŃ€ĐłĐ°ĐœĐžĐ·Đ°Ń†ĐžĐž.
urlstrURL, уĐșазыĐČающоĐč ĐœĐ° ĐșĐŸĐœŃ‚Đ°ĐșŃ‚ĐœŃƒŃŽ ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃŽ. ДОЛЖЕН Đ±Ń‹Ń‚ŃŒ ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” URL.
emailstrEmail-аЎрДс ĐșĐŸĐœŃ‚Đ°ĐșŃ‚ĐœĐŸĐłĐŸ лОца/ĐŸŃ€ĐłĐ°ĐœĐžĐ·Đ°Ń†ĐžĐž. ДОЛЖЕН Đ±Ń‹Ń‚ŃŒ ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” email-аЎрДса.
| +| `license_info` | `dict` | Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ ĐŸ Đ»ĐžŃ†Đ”ĐœĐ·ĐžĐž ĐŸŃ‚ĐșŃ€Ń‹Ń‚ĐŸĐłĐŸ API. ĐœĐŸĐ¶Đ”Ń‚ ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ŃŒ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ ĐżĐŸĐ»Đ”Đč.
ĐżĐŸĐ»Ń license_info
ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐąĐžĐżĐžĐżĐžŃĐ°ĐœĐžĐ”
namestrОБЯЗАбЕЛЬНО (ДслО ŃƒŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”Đœ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ license_info). ĐĐ°Đ·ĐČĐ°ĐœĐžĐ” Đ»ĐžŃ†Đ”ĐœĐ·ĐžĐž, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒĐŸĐč ĐŽĐ»Ń API.
identifierstrĐ’Ń‹Ń€Đ°Đ¶Đ”ĐœĐžĐ” Đ»ĐžŃ†Đ”ĐœĐ·ĐžĐž [SPDX](https://spdx.org/licenses/) ĐŽĐ»Ń API. ĐŸĐŸĐ»Đ” identifier яĐČĐ»ŃĐ”Ń‚ŃŃ ĐČĐ·Đ°ĐžĐŒĐŸĐžŃĐșĐ»ŃŽŃ‡Đ°ŃŽŃ‰ĐžĐŒ с ĐżĐŸĐ»Đ”ĐŒ url. Đ”ĐŸŃŃ‚ŃƒĐżĐœĐŸ ĐœĐ°Ń‡ĐžĐœĐ°Ń с OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrURL, уĐșазыĐČающоĐč ĐœĐ° Đ»ĐžŃ†Đ”ĐœĐ·ĐžŃŽ, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒŃƒŃŽ ĐŽĐ»Ń API. ДОЛЖЕН Đ±Ń‹Ń‚ŃŒ ĐČ Ń„ĐŸŃ€ĐŒĐ°Ń‚Đ” URL.
| Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°ĐŽĐ°Ń‚ŃŒ ох ŃĐ»Đ”ĐŽŃƒŃŽŃ‰ĐžĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ: @@ -48,7 +48,7 @@ * `name` (**ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœĐŸ**): `str`-Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” с Ń‚Đ”ĐŒ жД ĐžĐŒĐ”ĐœĐ”ĐŒ тДга, ĐșĐŸŃ‚ĐŸŃ€ĐŸĐ” ĐČы ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚Đ” ĐČ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ” `tags` ĐČ ĐČашох *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃŃ… путо* Đž `APIRouter`ах. * `description`: `str`-Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” с ĐșратĐșĐžĐŒ ĐŸĐżĐžŃĐ°ĐœĐžĐ”ĐŒ ĐŽĐ»Ń тДга. ĐœĐŸĐ¶Đ”Ń‚ ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ŃŒ Markdown Đž Đ±ŃƒĐŽĐ”Ń‚ ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ¶Đ°Ń‚ŃŒŃŃ ĐČ UI ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž. -* `externalDocs`: `dict`-Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐŸĐżĐžŃŃ‹ĐČающДД ĐČĐœĐ”ŃˆĐœŃŽŃŽ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃŽ. ВĐșлючаДт ĐČ ŃĐ”Đ±Ń: +* `externalDocs`: `dict`-Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”, ĐŸĐżĐžŃŃ‹ĐČающДД ĐČĐœĐ”ŃˆĐœŃŽŃŽ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃŽ. ВĐșлючаДт ĐČ ŃĐ”Đ±Ń: * `description`: `str`-Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” с ĐșратĐșĐžĐŒ ĐŸĐżĐžŃĐ°ĐœĐžĐ”ĐŒ ĐŽĐ»Ń ĐČĐœĐ”ŃˆĐœĐ”Đč ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž. * `url` (**ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœĐŸ**): `str`-Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” с URL-Đ°ĐŽŃ€Đ”ŃĐŸĐŒ ĐŽĐ»Ń ĐČĐœĐ”ŃˆĐœĐ”Đč ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž. @@ -64,7 +64,7 @@ /// tip | ĐŸĐŸĐŽŃĐșазĐșа -Đ’Đ°ĐŒ ĐœĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœĐŸ ĐŽĐŸĐ±Đ°ĐČĐ»ŃŃ‚ŃŒ ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Đ” ĐŽĐ»Ń ĐČсДх ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒŃ‹Ń… Ń‚Đ”ĐłĐŸĐČ +Đ’Đ°ĐŒ ĐœĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœĐŸ ĐŽĐŸĐ±Đ°ĐČĐ»ŃŃ‚ŃŒ ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Đ” ĐŽĐ»Ń ĐČсДх ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒŃ‹Ń… Ń‚Đ”ĐłĐŸĐČ. /// @@ -94,11 +94,11 @@ ## URL-аЎрДс OpenAPI { #openapi-url } -ĐŸĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ ŃŃ…Đ”ĐŒĐ° OpenAPI ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ¶Đ”ĐœĐ° ĐżĐŸ Đ°ĐŽŃ€Đ”ŃŃƒ `/openapi.json`. +ĐŸĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ ŃŃ…Đ”ĐŒĐ° OpenAPI ĐŸŃ‚ĐŽĐ°Ń‘Ń‚ŃŃ ĐżĐŸ Đ°ĐŽŃ€Đ”ŃŃƒ `/openapi.json`. ĐĐŸ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžĐ·ĐŒĐ”ĐœĐžŃ‚ŃŒ ŃŃ‚ĐŸ с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° `openapi_url`. -К ĐżŃ€ĐžĐŒĐ”Ń€Ńƒ, Ń‡Ń‚ĐŸĐ±Ń‹ Đ·Đ°ĐŽĐ°Ń‚ŃŒ Дё ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ¶Đ”ĐœĐžĐ” ĐżĐŸ Đ°ĐŽŃ€Đ”ŃŃƒ `/api/v1/openapi.json`: +К ĐżŃ€ĐžĐŒĐ”Ń€Ńƒ, Ń‡Ń‚ĐŸĐ±Ń‹ Đ·Đ°ĐŽĐ°Ń‚ŃŒ Дё ĐŸŃ‚ĐŽĐ°Ń‡Ńƒ ĐżĐŸ Đ°ĐŽŃ€Đ”ŃŃƒ `/api/v1/openapi.json`: {* ../../docs_src/metadata/tutorial002_py310.py hl[3] *} @@ -106,15 +106,15 @@ ## URL-аЎрДса ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž { #docs-urls } -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžĐ·ĐŒĐ”ĐœĐžŃ‚ŃŒ ĐșĐŸĐœŃ„ĐžĐłŃƒŃ€Đ°Ń†ĐžŃŽ ĐŽĐČух ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșох ĐžĐœŃ‚Đ”Ń€Ń„Đ”ĐčŃĐŸĐČ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐČĐșĐ»ŃŽŃ‡Đ”ĐœŃ‹: +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžĐ·ĐŒĐ”ĐœĐžŃ‚ŃŒ ĐșĐŸĐœŃ„ĐžĐłŃƒŃ€Đ°Ń†ĐžŃŽ ĐŽĐČух ĐČĐșĐ»ŃŽŃ‡Ń‘ĐœĐœŃ‹Ń… ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșох ĐžĐœŃ‚Đ”Ń€Ń„Đ”ĐčŃĐŸĐČ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž: -* **Swagger UI**: ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ¶Đ°Đ”ĐŒŃ‹Đč ĐżĐŸ Đ°ĐŽŃ€Đ”ŃŃƒ `/docs`. +* **Swagger UI**: ĐŸŃ‚ĐŽĐ°Ń‘Ń‚ŃŃ ĐżĐŸ Đ°ĐŽŃ€Đ”ŃŃƒ `/docs`. * Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°ĐŽĐ°Ń‚ŃŒ Đ”ĐłĐŸ URL с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° `docs_url`. * Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸŃ‚ĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ ŃŃ‚ĐŸ с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐž `docs_url=None`. -* **ReDoc**: ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ¶Đ°Đ”ĐŒŃ‹Đč ĐżĐŸ Đ°ĐŽŃ€Đ”ŃŃƒ `/redoc`. +* **ReDoc**: ĐŸŃ‚ĐŽĐ°Ń‘Ń‚ŃŃ ĐżĐŸ Đ°ĐŽŃ€Đ”ŃŃƒ `/redoc`. * Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°ĐŽĐ°Ń‚ŃŒ Đ”ĐłĐŸ URL с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° `redoc_url`. * Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸŃ‚ĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ ŃŃ‚ĐŸ с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐž `redoc_url=None`. -К ĐżŃ€ĐžĐŒĐ”Ń€Ńƒ, Ń‡Ń‚ĐŸĐ±Ń‹ Đ·Đ°ĐŽĐ°Ń‚ŃŒ ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ¶Đ”ĐœĐžĐ” Swagger UI ĐżĐŸ Đ°ĐŽŃ€Đ”ŃŃƒ `/documentation` Đž ĐŸŃ‚ĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ ReDoc: +К ĐżŃ€ĐžĐŒĐ”Ń€Ńƒ, Ń‡Ń‚ĐŸĐ±Ń‹ ĐœĐ°ŃŃ‚Ń€ĐŸĐžŃ‚ŃŒ ĐŸŃ‚ĐŽĐ°Ń‡Ńƒ Swagger UI ĐżĐŸ Đ°ĐŽŃ€Đ”ŃŃƒ `/documentation` Đž ĐŸŃ‚ĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ ReDoc: {* ../../docs_src/metadata/tutorial003_py310.py hl[3] *} diff --git a/docs/ru/docs/tutorial/path-operation-configuration.md b/docs/ru/docs/tutorial/path-operation-configuration.md index c1264d9dd..c5099c3e0 100644 --- a/docs/ru/docs/tutorial/path-operation-configuration.md +++ b/docs/ru/docs/tutorial/path-operation-configuration.md @@ -1,10 +1,10 @@ -# ĐšĐŸĐœŃ„ĐžĐłŃƒŃ€Đ°Ń†ĐžŃ ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐč путо { #path-operation-configuration } +# ĐšĐŸĐœŃ„ĐžĐłŃƒŃ€Đ°Ń†ĐžŃ ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо { #path-operation-configuration } -ĐĄŃƒŃ‰Đ”ŃŃ‚ĐČŃƒĐ”Ń‚ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ ĐČĐ°ŃˆĐ”ĐŒŃƒ *ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€Ńƒ ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐč путо* ĐŽĐ»Ń Đ”ĐłĐŸ ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐž. +ĐĄŃƒŃ‰Đ”ŃŃ‚ĐČŃƒĐ”Ń‚ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ ĐČĐ°ŃˆĐ”ĐŒŃƒ *ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€Ńƒ ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ĐŽĐ»Ń Đ”ĐłĐŸ ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐž. /// warning | Đ’ĐœĐžĐŒĐ°ĐœĐžĐ” -ĐŸĐŸĐŒĐœĐžŃ‚Đ”, Ń‡Ń‚ĐŸ это ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ ĐżĐ”Ń€Đ”ĐŽĐ°ŃŽŃ‚ŃŃ ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ *ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€Ńƒ ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐč путо*, а ĐœĐ” ĐČашДĐč *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșу путо*. +ĐŸĐŸĐŒĐœĐžŃ‚Đ”, Ń‡Ń‚ĐŸ это ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ ĐżĐ”Ń€Đ”ĐŽĐ°ŃŽŃ‚ŃŃ ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ *ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€Ńƒ ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*, а ĐœĐ” ĐČашДĐč *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșу путо*. /// @@ -30,11 +30,11 @@ ## йДгО { #tags } -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽĐŸĐ±Đ°ĐČĐ»ŃŃ‚ŃŒ тДгО Đș ĐČĐ°ŃˆĐžĐŒ *ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃĐŒ путо*, ĐŽĐŸĐ±Đ°ĐČĐžĐČ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `tags` с `list` Đ·Đ°ĐżĐŸĐ»ĐœĐ”ĐœĐœŃ‹ĐŒ `str`-Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃĐŒĐž (ĐŸĐ±Ń‹Ń‡ĐœĐŸ ĐČ ĐœŃ‘ĐŒ Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐŸĐŽĐœĐ° ŃŃ‚Ń€ĐŸĐșа): +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽĐŸĐ±Đ°ĐČĐ»ŃŃ‚ŃŒ тДгО Đș ĐČашДĐč *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*, пДрДЎаĐČ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `tags` с `list` Оз `str` (ĐŸĐ±Ń‹Ń‡ĐœĐŸ ĐČ ĐœŃ‘ĐŒ Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐŸĐŽĐœĐ° ŃŃ‚Ń€ĐŸĐșа): {* ../../docs_src/path_operation_configuration/tutorial002_py310.py hl[15,20,25] *} -ĐžĐœĐž Đ±ŃƒĐŽŃƒŃ‚ ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœŃ‹ ĐČ ŃŃ…Đ”ĐŒŃƒ OpenAPI Đž Đ±ŃƒĐŽŃƒŃ‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœŃ‹ ĐČ Đ°ĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐŸĐč ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž ĐžĐœŃ‚Đ”Ń€Ń„Đ”Đčса: +ĐžĐœĐž Đ±ŃƒĐŽŃƒŃ‚ ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœŃ‹ ĐČ ŃŃ…Đ”ĐŒŃƒ OpenAPI Đž Đ±ŃƒĐŽŃƒŃ‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœŃ‹ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐžĐŒĐž ĐžĐœŃ‚Đ”Ń€Ń„Đ”ĐčŃĐ°ĐŒĐž ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž: @@ -56,7 +56,7 @@ ## ĐžĐżĐžŃĐ°ĐœĐžĐ” Оз ŃŃ‚Ń€ĐŸĐș ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž { #description-from-docstring } -йаĐș ĐșаĐș ĐŸĐżĐžŃĐ°ĐœĐžŃ ĐŸĐ±Ń‹Ń‡ĐœĐŸ ĐŽĐ»ĐžĐœĐœŃ‹Đ” Đž ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ ĐŒĐœĐŸĐłĐŸ ŃŃ‚Ń€ĐŸĐș, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть ĐŸĐżĐžŃĐ°ĐœĐžĐ” *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ĐČ ŃŃ‚Ń€ĐŸĐșĐ” ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž Ń„ŃƒĐœĐșцоо, Đž **FastAPI** ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Đ”Ń‚ Дё ĐŸŃ‚Ń‚ŃƒĐŽĐ°. +йаĐș ĐșаĐș ĐŸĐżĐžŃĐ°ĐœĐžŃ ĐŸĐ±Ń‹Ń‡ĐœĐŸ ĐŽĐ»ĐžĐœĐœŃ‹Đ” Đž ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ ĐŒĐœĐŸĐłĐŸ ŃŃ‚Ń€ĐŸĐș, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть ĐŸĐżĐžŃĐ°ĐœĐžĐ” *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ĐČ ŃŃ‚Ń€ĐŸĐșĐ” ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž Ń„ŃƒĐœĐșцоо, Đž **FastAPI** ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Đ”Ń‚ Дё ĐŸŃ‚Ń‚ŃƒĐŽĐ°. Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать [Markdown](https://en.wikipedia.org/wiki/Markdown) ĐČ ŃŃ‚Ń€ĐŸĐșĐ” ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž, Đž ĐŸĐœ Đ±ŃƒĐŽĐ”Ń‚ ĐžĐœŃ‚Đ”Ń€ĐżŃ€Đ”Ń‚ĐžŃ€ĐŸĐČĐ°Đœ Đž ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ¶Ń‘Đœ ĐșĐŸŃ€Ń€Đ”ĐșŃ‚ĐœĐŸ (с ŃƒŃ‡Đ”Ń‚ĐŸĐŒ ĐŸŃ‚ŃŃ‚ŃƒĐżĐ° ĐČ ŃŃ‚Ń€ĐŸĐșĐ” ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž). @@ -94,7 +94,7 @@ OpenAPI уĐșазыĐČаДт, Ń‡Ń‚ĐŸ ĐșĐ°Đ¶ĐŽĐŸĐč *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ĐœĐ” {* ../../docs_src/path_operation_configuration/tutorial006_py310.py hl[16] *} -ĐžĐœ Đ±ŃƒĐŽĐ”Ń‚ чДтĐșĐŸ ĐżĐŸĐŒĐ”Ń‡Đ”Đœ ĐșаĐș ŃƒŃŃ‚Đ°Ń€Đ”ĐČшОĐč ĐČ ĐžĐœŃ‚Đ”Ń€Đ°ĐșтоĐČĐœĐŸĐč ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž: +ĐžĐœĐ° Đ±ŃƒĐŽĐ”Ń‚ чДтĐșĐŸ ĐżĐŸĐŒĐ”Ń‡Đ”ĐœĐ° ĐșаĐș ŃƒŃŃ‚Đ°Ń€Đ”ĐČшая ĐČ ĐžĐœŃ‚Đ”Ń€Đ°ĐșтоĐČĐœĐŸĐč ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž: diff --git a/docs/ru/docs/tutorial/query-params-str-validations.md b/docs/ru/docs/tutorial/query-params-str-validations.md index 7af7ccfa0..5783b0cdf 100644 --- a/docs/ru/docs/tutorial/query-params-str-validations.md +++ b/docs/ru/docs/tutorial/query-params-str-validations.md @@ -80,8 +80,8 @@ q: Annotated[str | None] = None ĐąĐ”ĐżĐ”Ń€ŃŒ FastAPI Đ±ŃƒĐŽĐ”Ń‚: * **ĐČĐ°Đ»ĐžĐŽĐžŃ€ĐŸĐČать** ĐŽĐ°ĐœĐœŃ‹Đ”, ŃƒĐŽĐŸŃŃ‚ĐŸĐČĐ”Ń€ŃŃŃŃŒ, Ń‡Ń‚ĐŸ ĐŒĐ°ĐșŃĐžĐŒĐ°Đ»ŃŒĐœĐ°Ń ĐŽĐ»ĐžĐœĐ° — 50 ŃĐžĐŒĐČĐŸĐ»ĐŸĐČ; -* ĐżĐŸĐșазыĐČать **ĐżĐŸĐœŃŃ‚ĐœŃƒŃŽ ĐŸŃˆĐžĐ±Đșу** ĐșĐ»ĐžĐ”ĐœŃ‚Ńƒ, ДслО ĐŽĐ°ĐœĐœŃ‹Đ” ĐœĐ”ĐČĐ°Đ»ĐžĐŽĐœŃ‹; -* **ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ĐŸĐČать** ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐČ *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ŃŃ…Đ”ĐŒŃ‹ OpenAPI (ĐŸĐœ Đ±ŃƒĐŽĐ”Ń‚ ĐżĐŸĐșĐ°Đ·Đ°Đœ ĐČ **UI аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐŸĐč ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž**). +* ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ¶Đ°Ń‚ŃŒ **ĐżĐŸĐœŃŃ‚ĐœŃƒŃŽ ĐŸŃˆĐžĐ±Đșу** ĐșĐ»ĐžĐ”ĐœŃ‚Ńƒ, ДслО ĐŽĐ°ĐœĐœŃ‹Đ” ĐœĐ”ĐČĐ°Đ»ĐžĐŽĐœŃ‹; +* **ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ĐŸĐČать** ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐČ *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ŃŃ…Đ”ĐŒŃ‹ OpenAPI (ĐŸĐœ Đ±ŃƒĐŽĐ”Ń‚ ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ¶Đ°Ń‚ŃŒŃŃ ĐČ **UI аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐŸĐč ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž**). ## ĐĐ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČа (ŃƒŃŃ‚Đ°Ń€Đ”ĐČшДД): `Query` ĐșаĐș Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ { #alternative-old-query-as-the-default-value } @@ -119,7 +119,7 @@ q: str | None = None q: str | None = Query(default=None, max_length=50) ``` -Đ­Ń‚ĐŸ ĐżŃ€ĐŸĐČĐ°Đ»ĐžĐŽĐžŃ€ŃƒĐ”Ń‚ ĐŽĐ°ĐœĐœŃ‹Đ”, ĐżĐŸĐșажДт ĐżĐŸĐœŃŃ‚ĐœŃƒŃŽ ĐŸŃˆĐžĐ±Đșу, ДслО ĐŽĐ°ĐœĐœŃ‹Đ” ĐœĐ”ĐČĐ°Đ»ĐžĐŽĐœŃ‹, Đž Đ·Đ°ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ŃƒĐ”Ń‚ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐČ *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ŃŃ…Đ”ĐŒŃ‹ OpenAPI. +Đ­Ń‚ĐŸ ĐżŃ€ĐŸĐČĐ°Đ»ĐžĐŽĐžŃ€ŃƒĐ”Ń‚ ĐŽĐ°ĐœĐœŃ‹Đ”, ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ·ĐžŃ‚ ĐżĐŸĐœŃŃ‚ĐœŃƒŃŽ ĐŸŃˆĐžĐ±Đșу, ДслО ĐŽĐ°ĐœĐœŃ‹Đ” ĐœĐ”ĐČĐ°Đ»ĐžĐŽĐœŃ‹, Đž Đ·Đ°ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ŃƒĐ”Ń‚ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐČ *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ŃŃ…Đ”ĐŒŃ‹ OpenAPI. ### `Query` ĐșаĐș Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ ОлО ĐČĐœŃƒŃ‚Ń€Đž `Annotated` { #query-as-the-default-value-or-in-annotated } @@ -141,7 +141,7 @@ q: Annotated[str, Query(default="rick")] = "morty" q: Annotated[str, Query()] = "rick" ``` -...ОлО ĐČ ŃŃ‚Đ°Ń€ĐŸĐč ĐșĐŸĐŽĐŸĐČĐŸĐč базД ĐČы уĐČОЎОтД: +...ОлО ĐČ ŃŃ‚Đ°Ń€Ń‹Ń… ĐșĐŸĐŽĐŸĐČых базах ĐČы уĐČОЎОтД: ```Python q: str = Query(default="rick") @@ -153,19 +153,19 @@ q: str = Query(default="rick") **Đ—ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ** у **ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° Ń„ŃƒĐœĐșцоо** — ŃŃ‚ĐŸ **ĐœĐ°ŃŃ‚ĐŸŃŃ‰Đ”Đ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ**, Ń‡Ń‚ĐŸ Đ±ĐŸĐ»Đ”Đ” ĐžĐœŃ‚ŃƒĐžŃ‚ĐžĐČĐœĐŸ ĐŽĐ»Ń Python. 😌 -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” **ĐČызĐČать** эту жД Ń„ŃƒĐœĐșцою ĐČ **Юругох ĐŒĐ”ŃŃ‚Đ°Ń…** бДз FastAPI, Đž ĐŸĐœĐ° Đ±ŃƒĐŽĐ”Ń‚ **Ń€Đ°Đ±ĐŸŃ‚Đ°Ń‚ŃŒ ĐșаĐș ĐŸĐ¶ĐžĐŽĐ°Đ”Ń‚ŃŃ**. ЕслО Đ”ŃŃ‚ŃŒ **ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đč** ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ (бДз Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ), ĐČаш **рДЎаĐșŃ‚ĐŸŃ€** ŃĐŸĐŸĐ±Ń‰ĐžŃ‚ ĐŸĐ± ĐŸŃˆĐžĐ±ĐșĐ”, **Python** Ń‚ĐŸĐ¶Đ” ĐżĐŸĐ¶Đ°Đ»ŃƒĐ”Ń‚ŃŃ, ДслО ĐČы Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đ” Дё бДз пДрДЎачО ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœĐŸĐłĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°. +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” **ĐČызĐČать** эту жД Ń„ŃƒĐœĐșцою ĐČ **Юругох ĐŒĐ”ŃŃ‚Đ°Ń…** бДз FastAPI, Đž ĐŸĐœĐ° Đ±ŃƒĐŽĐ”Ń‚ **Ń€Đ°Đ±ĐŸŃ‚Đ°Ń‚ŃŒ ĐșаĐș ĐŸĐ¶ĐžĐŽĐ°Đ”Ń‚ŃŃ**. ЕслО Đ”ŃŃ‚ŃŒ **ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đč** ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ (бДз Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ), ĐČаш **рДЎаĐșŃ‚ĐŸŃ€ ĐșĐŸĐŽĐ°** ŃĐŸĐŸĐ±Ń‰ĐžŃ‚ ĐŸĐ± ĐŸŃˆĐžĐ±ĐșĐ”, **Python** Ń‚ĐŸĐ¶Đ” ĐżĐŸĐ¶Đ°Đ»ŃƒĐ”Ń‚ŃŃ, ДслО ĐČы Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đ” Дё бДз пДрДЎачО ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœĐŸĐłĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°. -ЕслО ĐČы ĐœĐ” ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚Đ” `Annotated`, а ĐżŃ€ĐžĐŒĐ”ĐœŃĐ”Ń‚Đ” **(ŃƒŃŃ‚Đ°Ń€Đ”ĐČшОĐč) ŃŃ‚ĐžĐ»ŃŒ ŃĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”ĐŒ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ**, Ń‚ĐŸ про ĐČŃ‹Đ·ĐŸĐČĐ” ŃŃ‚ĐŸĐč Ń„ŃƒĐœĐșцоо бДз FastAPI ĐČ **Юругох ĐŒĐ”ŃŃ‚Đ°Ń…** ĐČĐ°ĐŒ ĐœŃƒĐ¶ĐœĐŸ **ĐżĐŸĐŒĐœĐžŃ‚ŃŒ** ĐŸ Ń‚ĐŸĐŒ, Ń‡Ń‚ĐŸ ĐœĐ°ĐŽĐŸ ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Ń‹, Ń‡Ń‚ĐŸĐ±Ń‹ ĐČсё Ń€Đ°Đ±ĐŸŃ‚Đ°Đ»ĐŸ ĐșĐŸŃ€Ń€Đ”ĐșŃ‚ĐœĐŸ, ĐžĐœĐ°Ń‡Đ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ Đ±ŃƒĐŽŃƒŃ‚ ĐœĐ” таĐșĐžĐŒĐž, ĐșаĐș ĐČы ĐŸĐ¶ĐžĐŽĐ°Đ”Ń‚Đ” (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐČĐŒĐ”ŃŃ‚ĐŸ `str` Đ±ŃƒĐŽĐ”Ń‚ `QueryInfo` ОлО Ń‡Ń‚ĐŸ-Ń‚ĐŸ ĐżĐŸĐŽĐŸĐ±ĐœĐŸĐ”). И ĐœĐž рДЎаĐșŃ‚ĐŸŃ€, ĐœĐž Python ĐœĐ” Đ±ŃƒĐŽŃƒŃ‚ ругаться про ŃĐ°ĐŒĐŸĐŒ ĐČŃ‹Đ·ĐŸĐČĐ” Ń„ŃƒĐœĐșцоо — ĐŸŃˆĐžĐ±Đșа ĐżŃ€ĐŸŃĐČотся Đ»ĐžŃˆŃŒ про ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃŃ… ĐČĐœŃƒŃ‚Ń€Đž. +ЕслО ĐČы ĐœĐ” ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚Đ” `Annotated`, а ĐżŃ€ĐžĐŒĐ”ĐœŃĐ”Ń‚Đ” **(ŃƒŃŃ‚Đ°Ń€Đ”ĐČшОĐč) ŃŃ‚ĐžĐ»ŃŒ ŃĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”ĐŒ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ**, Ń‚ĐŸ про ĐČŃ‹Đ·ĐŸĐČĐ” ŃŃ‚ĐŸĐč Ń„ŃƒĐœĐșцоо бДз FastAPI ĐČ **Юругох ĐŒĐ”ŃŃ‚Đ°Ń…** ĐČĐ°ĐŒ ĐœŃƒĐ¶ĐœĐŸ **ĐżĐŸĐŒĐœĐžŃ‚ŃŒ** ĐŸ Ń‚ĐŸĐŒ, Ń‡Ń‚ĐŸ ĐœĐ°ĐŽĐŸ ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Ń‹, Ń‡Ń‚ĐŸĐ±Ń‹ ĐČсё Ń€Đ°Đ±ĐŸŃ‚Đ°Đ»ĐŸ ĐșĐŸŃ€Ń€Đ”ĐșŃ‚ĐœĐŸ, ĐžĐœĐ°Ń‡Đ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ Đ±ŃƒĐŽŃƒŃ‚ ĐœĐ” таĐșĐžĐŒĐž, ĐșаĐș ĐČы ĐŸĐ¶ĐžĐŽĐ°Đ”Ń‚Đ” (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐČĐŒĐ”ŃŃ‚ĐŸ `str` Đ±ŃƒĐŽĐ”Ń‚ `QueryInfo` ОлО Ń‡Ń‚ĐŸ-Ń‚ĐŸ ĐżĐŸĐŽĐŸĐ±ĐœĐŸĐ”). И ĐœĐž рДЎаĐșŃ‚ĐŸŃ€ ĐșĐŸĐŽĐ°, ĐœĐž Python ĐœĐ” Đ±ŃƒĐŽŃƒŃ‚ ругаться про ŃĐ°ĐŒĐŸĐŒ ĐČŃ‹Đ·ĐŸĐČĐ” Ń„ŃƒĐœĐșцоо — ĐŸŃˆĐžĐ±Đșа ĐżŃ€ĐŸŃĐČотся Đ»ĐžŃˆŃŒ про ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃŃ… ĐČĐœŃƒŃ‚Ń€Đž. йаĐș ĐșаĐș `Annotated` ĐŒĐŸĐ¶Đ”Ń‚ ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ŃŒ Đ±ĐŸĐ»ŃŒŃˆĐ” ĐŸĐŽĐœĐŸĐč Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžĐž ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Ń…, Ń‚Đ”ĐżĐ”Ń€ŃŒ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ту жД Ń„ŃƒĐœĐșцою Đž с ĐŽŃ€ŃƒĐłĐžĐŒĐž ĐžĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đ°ĐŒĐž, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ с [Typer](https://typer.tiangolo.com/). 🚀 -## Đ‘ĐŸĐ»ŃŒŃˆĐ” ĐČалОЎацОĐč { #add-more-validations } +## Đ”ĐŸĐ±Đ°ĐČĐžĐŒ Đ±ĐŸĐ»ŃŒŃˆĐ” ĐČалОЎацОĐč { #add-more-validations } ĐœĐŸĐ¶ĐœĐŸ таĐșжД ĐŽĐŸĐ±Đ°ĐČоть ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `min_length`: {* ../../docs_src/query_params_str_validations/tutorial003_an_py310.py hl[10] *} -## Đ Đ”ĐłŃƒĐ»ŃŃ€ĐœŃ‹Đ” ĐČŃ‹Ń€Đ°Đ¶Đ”ĐœĐžŃ { #add-regular-expressions } +## Đ”ĐŸĐ±Đ°ĐČĐžĐŒ Ń€Đ”ĐłŃƒĐ»ŃŃ€ĐœŃ‹Đ” ĐČŃ‹Ń€Đ°Đ¶Đ”ĐœĐžŃ { #add-regular-expressions } Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ Ń€Đ”ĐłŃƒĐ»ŃŃ€ĐœĐŸĐ” ĐČŃ‹Ń€Đ°Đ¶Đ”ĐœĐžĐ” `pattern`, ĐșĐŸŃ‚ĐŸŃ€ĐŸĐŒŃƒ ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŸŃ‚ĐČДтстĐČĐŸĐČать ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€: @@ -173,7 +173,7 @@ q: str = Query(default="rick") Đ”Đ°ĐœĐœŃ‹Đč ŃˆĐ°Đ±Đ»ĐŸĐœ Ń€Đ”ĐłŃƒĐ»ŃŃ€ĐœĐŸĐłĐŸ ĐČŃ‹Ń€Đ°Đ¶Đ”ĐœĐžŃ ĐżŃ€ĐŸĐČĐ”Ń€ŃĐ”Ń‚, Ń‡Ń‚ĐŸ ĐżĐŸĐ»ŃƒŃ‡Đ”ĐœĐœĐŸĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°: -* `^`: ĐœĐ°Ń‡ĐžĐœĐ°Đ”Ń‚ŃŃ с ŃĐ»Đ”ĐŽŃƒŃŽŃ‰ĐžŃ… ŃĐžĐŒĐČĐŸĐ»ĐŸĐČ, ĐŽĐŸ ĐœĐžŃ… ĐœĐ”Ń‚ ŃĐžĐŒĐČĐŸĐ»ĐŸĐČ. +* `^`: ĐœĐ°Ń‡ĐžĐœĐ°Đ”Ń‚ŃŃ ŃĐŸ ŃĐ»Đ”ĐŽŃƒŃŽŃ‰ĐžŃ… ŃĐžĐŒĐČĐŸĐ»ĐŸĐČ, ĐŽĐŸ ĐœĐžŃ… ĐœĐ”Ń‚ ŃĐžĐŒĐČĐŸĐ»ĐŸĐČ. * `fixedquery`: ĐžĐŒĐ”Đ”Ń‚ Ń‚ĐŸŃ‡ĐœĐŸĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” `fixedquery`. * `$`: заĐșĐ°ĐœŃ‡ĐžĐČĐ°Đ”Ń‚ŃŃ Đ·ĐŽĐ”ŃŃŒ, ĐżĐŸŃĐ»Đ” `fixedquery` ĐœĐ”Ń‚ ĐœĐžĐșаĐșох ŃĐžĐŒĐČĐŸĐ»ĐŸĐČ. @@ -191,7 +191,7 @@ q: str = Query(default="rick") /// note | ĐŸŃ€ĐžĐŒĐ”Ń‡Đ°ĐœĐžĐ” -ĐĐ°Đ»ĐžŃ‡ĐžĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ Đ»ŃŽĐ±ĐŸĐłĐŸ топа, ĐČĐșĐ»ŃŽŃ‡Đ°Ń `None`, ЎДлаДт ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐœĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹ĐŒ. +ĐĐ°Đ»ĐžŃ‡ĐžĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ Đ»ŃŽĐ±ĐŸĐłĐŸ топа, ĐČĐșĐ»ŃŽŃ‡Đ°Ń `None`, ЎДлаДт ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐœĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹ĐŒ (ĐœĐ” ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹ĐŒ). /// @@ -243,7 +243,7 @@ http://localhost:8000/items/?q=foo&q=bar ĐČы ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚Đ” ĐŒĐœĐŸĐ¶Đ”ŃŃ‚ĐČĐ”ĐœĐœŃ‹Đ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ *query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ* `q` (`foo` Đž `bar`) ĐČ ĐČОЎД Python-`list` ĐČĐœŃƒŃ‚Ń€Đž ĐČашДĐč *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа путо*, ĐČ *ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ” Ń„ŃƒĐœĐșцоо* `q`. -йаĐșĐžĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ, ĐŸŃ‚ĐČДт ĐœĐ° ŃŃ‚ĐŸŃ‚ URL Đ±ŃƒĐŽĐ”Ń‚: +йаĐșĐžĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ, HTTP-ĐŸŃ‚ĐČĐ”Ń‚ĐŸĐŒ ĐœĐ° ŃŃ‚ĐŸŃ‚ URL Đ±ŃƒĐŽĐ”Ń‚: ```JSON { @@ -276,7 +276,7 @@ http://localhost:8000/items/?q=foo&q=bar http://localhost:8000/items/ ``` -Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ ĐŽĐ»Ń `q` Đ±ŃƒĐŽĐ”Ń‚: `["foo", "bar"]`, Đž ĐŸŃ‚ĐČĐ”Ń‚ĐŸĐŒ Đ±ŃƒĐŽĐ”Ń‚: +Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ ĐŽĐ»Ń `q` Đ±ŃƒĐŽĐ”Ń‚: `["foo", "bar"]`, Đž ĐČĐ°ŃˆĐžĐŒ HTTP-ĐŸŃ‚ĐČĐ”Ń‚ĐŸĐŒ Đ±ŃƒĐŽĐ”Ń‚: ```JSON { @@ -301,7 +301,7 @@ http://localhost:8000/items/ /// -## Đ‘ĐŸĐ»ŃŒŃˆĐ” ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Ń… { #declare-more-metadata } +## ĐžĐ±ŃŠŃĐČĐ»Đ”ĐœĐžĐ” ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Ń… ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Ń… { #declare-more-metadata } ĐœĐŸĐ¶ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČоть Đ±ĐŸĐ»ŃŒŃˆĐ” ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐž ĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ”. @@ -369,7 +369,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems В таĐșох ŃĐ»ŃƒŃ‡Đ°ŃŃ… ĐŒĐŸĐ¶ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать **ĐșĐ°ŃŃ‚ĐŸĐŒĐœŃƒŃŽ Ń„ŃƒĐœĐșцою-ĐČĐ°Đ»ĐžĐŽĐ°Ń‚ĐŸŃ€**, ĐșĐŸŃ‚ĐŸŃ€Đ°Ń ĐżŃ€ĐžĐŒĐ”ĐœŃĐ”Ń‚ŃŃ ĐżĐŸŃĐ»Đ” ĐŸĐ±Ń‹Ń‡ĐœĐŸĐč ĐČалОЎацОО (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐżĐŸŃĐ»Đ” ĐżŃ€ĐŸĐČДрĐșĐž, Ń‡Ń‚ĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” — ŃŃ‚ĐŸ `str`). -Đ­Ń‚ĐŸĐłĐŸ ĐŒĐŸĐ¶ĐœĐŸ ĐŽĐŸĐ±ĐžŃ‚ŃŒŃŃ, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ [`AfterValidator` Pydantic](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) ĐČĐœŃƒŃ‚Ń€Đž `Annotated`. +Đ­Ń‚ĐŸĐłĐŸ ĐŒĐŸĐ¶ĐœĐŸ ĐŽĐŸĐ±ĐžŃ‚ŃŒŃŃ, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ [Pydantic `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) ĐČĐœŃƒŃ‚Ń€Đž `Annotated`. /// tip | ĐĄĐŸĐČДт @@ -377,7 +377,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems /// -ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, эта ĐșĐ°ŃŃ‚ĐŸĐŒĐœĐ°Ń ĐżŃ€ĐŸĐČДрĐșа ŃƒĐ±Đ”Đ¶ĐŽĐ°Đ”Ń‚ŃŃ, Ń‡Ń‚ĐŸ ID ŃĐ»Đ”ĐŒĐ”ĐœŃ‚Đ° ĐœĐ°Ń‡ĐžĐœĐ°Đ”Ń‚ŃŃ с `isbn-` ĐŽĐ»Ń ĐœĐŸĐŒĐ”Ń€Đ° ĐșĐœĐžĐłĐž ISBN ОлО с `imdb-` ĐŽĐ»Ń ID URL Ń„ĐžĐ»ŃŒĐŒĐ° ĐœĐ° IMDB: +ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, эта ĐșĐ°ŃŃ‚ĐŸĐŒĐœĐ°Ń ĐżŃ€ĐŸĐČДрĐșа ŃƒĐ±Đ”Đ¶ĐŽĐ°Đ”Ń‚ŃŃ, Ń‡Ń‚ĐŸ ID ŃĐ»Đ”ĐŒĐ”ĐœŃ‚Đ° ĐœĐ°Ń‡ĐžĐœĐ°Đ”Ń‚ŃŃ с `isbn-` ĐŽĐ»Ń ĐœĐŸĐŒĐ”Ń€Đ° ĐșĐœĐžĐłĐž ISBN ОлО с `imdb-` ĐŽĐ»Ń ID URL Ń„ĐžĐ»ŃŒĐŒĐ° ĐČ IMDB: {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *} @@ -391,7 +391,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems ЕслО ĐČĐ°ĐŒ ĐœŃƒĐ¶ĐœĐ° ĐČĐ°Đ»ĐžĐŽĐ°Ń†ĐžŃ, Ń‚Ń€Đ”Đ±ŃƒŃŽŃ‰Đ°Ń ĐŸĐ±Ń‰Đ”ĐœĐžŃ с ĐșаĐșĐžĐŒâ€‘Đ»ĐžĐ±ĐŸ **ĐČĐœĐ”ŃˆĐœĐžĐŒ ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚ĐŸĐŒ** — Đ±Đ°Đ·ĐŸĐč ĐŽĐ°ĐœĐœŃ‹Ń… ОлО ĐŽŃ€ŃƒĐłĐžĐŒ API — ĐČĐŒĐ”ŃŃ‚ĐŸ ŃŃ‚ĐŸĐłĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД **ЗаĐČĐžŃĐžĐŒĐŸŃŃ‚Đž FastAPI**, ĐČы ĐżĐŸĐ·ĐœĐ°ĐșĐŸĐŒĐžŃ‚Đ”ŃŃŒ с ĐœĐžĐŒĐž ĐżĐŸĐ·Đ¶Đ”. -Это ĐșĐ°ŃŃ‚ĐŸĐŒĐœŃ‹Đ” ĐČĐ°Đ»ĐžĐŽĐ°Ń‚ĐŸŃ€Ń‹ ĐżŃ€Đ”ĐŽĐœĐ°Đ·ĐœĐ°Ń‡Đ”ĐœŃ‹ ĐŽĐ»Ń ĐżŃ€ĐŸĐČĐ”Ń€ĐŸĐș, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐŒĐŸĐ¶ĐœĐŸ ĐČŃ‹ĐżĐŸĐ»ĐœĐžŃ‚ŃŒ, ĐžĐŒĐ”Ń **Ń‚ĐŸĐ»ŃŒĐșĐŸ** тД жД **ĐŽĐ°ĐœĐœŃ‹Đ”**, Ń‡Ń‚ĐŸ ĐżŃ€ĐžŃˆĐ»Đž ĐČ Đ·Đ°ĐżŃ€ĐŸŃĐ”. +Это ĐșĐ°ŃŃ‚ĐŸĐŒĐœŃ‹Đ” ĐČĐ°Đ»ĐžĐŽĐ°Ń‚ĐŸŃ€Ń‹ ĐżŃ€Đ”ĐŽĐœĐ°Đ·ĐœĐ°Ń‡Đ”ĐœŃ‹ ĐŽĐ»Ń ĐżŃ€ĐŸĐČĐ”Ń€ĐŸĐș, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐŒĐŸĐ¶ĐœĐŸ ĐČŃ‹ĐżĐŸĐ»ĐœĐžŃ‚ŃŒ, ĐžĐŒĐ”Ń **Ń‚ĐŸĐ»ŃŒĐșĐŸ** тД жД **ĐŽĐ°ĐœĐœŃ‹Đ”**, Ń‡Ń‚ĐŸ ĐżŃ€ĐžŃˆĐ»Đž ĐČ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ”. /// @@ -429,7 +429,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đ” ĐżŃ€ĐŸĐČДрĐșĐž Đž ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Đ” ĐŽĐ»Ń ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ. -ОбщОД ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Đ” Đž ĐœĐ°ŃŃ‚Ń€ĐŸĐčĐșĐž: +ОбщОД ĐżŃ€ĐŸĐČДрĐșĐž Đž ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Đ”: * `alias` * `title` diff --git a/docs/ru/docs/tutorial/query-params.md b/docs/ru/docs/tutorial/query-params.md index 524b53945..65c0c2d9a 100644 --- a/docs/ru/docs/tutorial/query-params.md +++ b/docs/ru/docs/tutorial/query-params.md @@ -1,10 +1,10 @@ # Query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ { #query-parameters } -ĐšĐŸĐłĐŽĐ° ĐČы ĐŸĐ±ŃŠŃĐČĐ»ŃĐ”Ń‚Đ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ Ń„ŃƒĐœĐșцоо, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐœĐ” яĐČĐ»ŃŃŽŃ‚ŃŃ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒĐž путо, ĐŸĐœĐž аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž ĐžĐœŃ‚Đ”Ń€ĐżŃ€Đ”Ń‚ĐžŃ€ŃƒŃŽŃ‚ŃŃ ĐșаĐș "query"-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹. +ĐšĐŸĐłĐŽĐ° ĐČы ĐŸĐ±ŃŠŃĐČĐ»ŃĐ”Ń‚Đ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ Ń„ŃƒĐœĐșцоо, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐœĐ” яĐČĐ»ŃŃŽŃ‚ŃŃ частью path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ, ĐŸĐœĐž аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž ĐžĐœŃ‚Đ”Ń€ĐżŃ€Đ”Ń‚ĐžŃ€ŃƒŃŽŃ‚ŃŃ ĐșаĐș "query"-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹. {* ../../docs_src/query_params/tutorial001_py310.py hl[9] *} -Query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ прДЎстаĐČĐ»ŃŃŽŃ‚ Оз ŃĐ”Đ±Ń ĐœĐ°Đ±ĐŸŃ€ пар Đșлюч-Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” оЮут ĐżĐŸŃĐ»Đ” Đ·ĐœĐ°Đșа `?` ĐČ URL-аЎрДсД, Ń€Đ°Đ·ĐŽĐ”Đ»Đ”ĐœĐœŃ‹Đ” ŃĐžĐŒĐČĐŸĐ»Đ°ĐŒĐž `&`. +Query — ŃŃ‚ĐŸ ĐœĐ°Đ±ĐŸŃ€ пар Đșлюч-Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” оЮут ĐżĐŸŃĐ»Đ” Đ·ĐœĐ°Đșа `?` ĐČ URL-аЎрДсД, Ń€Đ°Đ·ĐŽĐ”Đ»Đ”ĐœĐœŃ‹Đ” ŃĐžĐŒĐČĐŸĐ»Đ°ĐŒĐž `&`. ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐČ ŃŃ‚ĐŸĐŒ URL-аЎрДсД: @@ -12,25 +12,25 @@ Query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ прДЎстаĐČĐ»ŃŃŽŃ‚ Оз ŃĐ”Đ±Ń ĐœĐ°Đ±ĐŸŃ€ па http://127.0.0.1:8000/items/?skip=0&limit=10 ``` -...ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ Đ·Đ°ĐżŃ€ĐŸŃĐ° таĐșОД: +...query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ таĐșОД: * `skip`: ŃĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”ĐŒ `0` * `limit`: ŃĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”ĐŒ `10` -БуЮучо частью URL-аЎрДса, ĐŸĐœĐž "ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ" яĐČĐ»ŃŃŽŃ‚ŃŃ ŃŃ‚Ń€ĐŸĐșĐ°ĐŒĐž. +БуЮучо частью URL-аЎрДса, ĐŸĐœĐž "ДстДстĐČĐ”ĐœĐœŃ‹ĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ" яĐČĐ»ŃŃŽŃ‚ŃŃ ŃŃ‚Ń€ĐŸĐșĐ°ĐŒĐž. ĐĐŸ ĐșĐŸĐłĐŽĐ° ĐČы ĐŸĐ±ŃŠŃĐČĐ»ŃĐ”Ń‚Đ” ох с ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ”ĐŒ Ń‚ĐžĐżĐŸĐČ Python (ĐČ ĐżŃ€ĐžĐŒĐ”Ń€Đ” ĐČŃ‹ŃˆĐ”, ĐșаĐș `int`), ĐŸĐœĐž ĐșĐŸĐœĐČĐ”Ń€Ń‚ĐžŃ€ŃƒŃŽŃ‚ŃŃ ĐČ ŃƒĐșĐ°Đ·Đ°ĐœĐœŃ‹Đč топ ĐŽĐ°ĐœĐœŃ‹Ń… Đž ĐżŃ€ĐŸŃ…ĐŸĐŽŃŃ‚ ĐżŃ€ĐŸĐČДрĐșу ĐœĐ° ŃĐŸĐŸŃ‚ĐČДтстĐČОД Đ”ĐŒŃƒ. -ВсД тД жД праĐČОла, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐżŃ€ĐžĐŒĐ”ĐœŃŃŽŃ‚ŃŃ Đș path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒ, таĐșжД ĐżŃ€ĐžĐŒĐ”ĐœŃŃŽŃ‚ŃŃ Đž query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒ: +ВсД тД жД ĐżŃ€ĐŸŃ†Đ”ŃŃŃ‹, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐżŃ€ĐžĐŒĐ”ĐœŃŃŽŃ‚ŃŃ Đș path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒ, таĐșжД ĐżŃ€ĐžĐŒĐ”ĐœŃŃŽŃ‚ŃŃ Đž Đș query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒ: * ĐŸĐŸĐŽĐŽĐ”Ń€Đ¶Đșа ĐŸŃ‚ рДЎаĐșŃ‚ĐŸŃ€Đ° ĐșĐŸĐŽĐ° (ĐŸŃ‡Đ”ĐČĐžĐŽĐœĐŸ) -* "ĐŸĐ°Ń€ŃĐžĐœĐł" ĐŽĐ°ĐœĐœŃ‹Ń… -* ĐŸŃ€ĐŸĐČДрĐșа ĐœĐ° ŃĐŸĐŸŃ‚ĐČДтстĐČОД ĐŽĐ°ĐœĐœŃ‹Ń… (Đ’Đ°Đ»ĐžĐŽĐ°Ń†ĐžŃ) +* "ĐŸĐ°Ń€ŃĐžĐœĐł" ĐŽĐ°ĐœĐœŃ‹Ń… +* Đ’Đ°Đ»ĐžĐŽĐ°Ń†ĐžŃ ĐŽĐ°ĐœĐœŃ‹Ń… * АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșая ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃ ## Đ—ĐœĐ°Ń‡Đ”ĐœĐžŃ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ { #defaults } -ĐŸĐŸŃĐșĐŸĐ»ŃŒĐșу query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ ĐœĐ” яĐČĐ»ŃŃŽŃ‚ŃŃ фоĐșŃĐžŃ€ĐŸĐČĐ°ĐœĐœĐŸĐč частью путо, ĐŸĐœĐž ĐŒĐŸĐłŃƒŃ‚ Đ±Ń‹Ń‚ŃŒ ĐœĐ” ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹ĐŒĐž Đž ĐžĐŒĐ”Ń‚ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ. +ĐŸĐŸŃĐșĐŸĐ»ŃŒĐșу query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ ĐœĐ” яĐČĐ»ŃŃŽŃ‚ŃŃ фоĐșŃĐžŃ€ĐŸĐČĐ°ĐœĐœĐŸĐč частью путо, ĐŸĐœĐž ĐŒĐŸĐłŃƒŃ‚ Đ±Ń‹Ń‚ŃŒ ĐœĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹ĐŒĐž Đž ĐžĐŒĐ”Ń‚ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ. В ĐżŃ€ĐžĐŒĐ”Ń€Đ” ĐČŃ‹ŃˆĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ раĐČĐœŃ‹ `skip=0` Đž `limit=10`. @@ -40,13 +40,13 @@ http://127.0.0.1:8000/items/?skip=0&limit=10 http://127.0.0.1:8000/items/ ``` -Đ±ŃƒĐŽĐ”Ń‚ таĐșĐžĐŒ жД, ĐșаĐș ДслО пДрДĐčто ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ: +Đ±ŃƒĐŽĐ”Ń‚ таĐșĐžĐŒ жД, ĐșаĐș ДслО пДрДĐčто ĐżĐŸ: ``` http://127.0.0.1:8000/items/?skip=0&limit=10 ``` -ĐĐŸ ДслО ĐČы ĐČĐČДЎётД, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: +ĐĐŸ ДслО ĐČы пДрДĐčЎётД, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐżĐŸ: ``` http://127.0.0.1:8000/items/?skip=20 @@ -55,7 +55,7 @@ http://127.0.0.1:8000/items/?skip=20 Đ—ĐœĐ°Ń‡Đ”ĐœĐžŃ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ ĐČ ĐČашДĐč Ń„ŃƒĐœĐșцоо Đ±ŃƒĐŽŃƒŃ‚: * `skip=20`: ĐżĐŸŃ‚ĐŸĐŒŃƒ Ń‡Ń‚ĐŸ ĐČы ŃƒŃŃ‚Đ°ĐœĐŸĐČОлО ŃŃ‚ĐŸ ĐČ URL-аЎрДсД -* `limit=10`: т.Đș ŃŃ‚ĐŸ Đ±Ń‹Đ»ĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ +* `limit=10`: ĐżĐŸŃ‚ĐŸĐŒŃƒ Ń‡Ń‚ĐŸ ŃŃ‚ĐŸ Đ±Ń‹Đ»ĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ ## ĐĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ { #optional-parameters } @@ -63,21 +63,21 @@ http://127.0.0.1:8000/items/?skip=20 {* ../../docs_src/query_params/tutorial002_py310.py hl[7] *} -В ŃŃ‚ĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ”, ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `q` Đ±ŃƒĐŽĐ”Ń‚ ĐœĐ” ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹ĐŒ Đž Đ±ŃƒĐŽĐ”Ń‚ ĐžĐŒĐ”Ń‚ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” `None` ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ. +В ŃŃ‚ĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Ń„ŃƒĐœĐșцоо `q` Đ±ŃƒĐŽĐ”Ń‚ ĐœĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹ĐŒ Đž Đ±ŃƒĐŽĐ”Ń‚ ĐžĐŒĐ”Ń‚ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” `None` ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ. /// tip | ĐŸĐŸĐŽŃĐșазĐșа -йаĐșжД ĐŸĐ±Ń€Đ°Ń‚ĐžŃ‚Đ” ĐČĐœĐžĐŒĐ°ĐœĐžĐ”, Ń‡Ń‚ĐŸ **FastAPI** ĐŽĐŸŃŃ‚Đ°Ń‚ĐŸŃ‡ĐœĐŸ ŃƒĐŒŃ‘Đœ Ń‡Ń‚ĐŸĐ±Ń‹ Đ·Đ°ĐŒĐ”Ń‚ĐžŃ‚ŃŒ, Ń‡Ń‚ĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `item_id` яĐČĐ»ŃĐ”Ń‚ŃŃ path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐŒ, а `q` ĐœĐ”Ń‚, ĐżĐŸŃŃ‚ĐŸĐŒŃƒ, ŃŃ‚ĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżŃ€ĐŸŃĐ°. +йаĐșжД ĐŸĐ±Ń€Đ°Ń‚ĐžŃ‚Đ” ĐČĐœĐžĐŒĐ°ĐœĐžĐ”, Ń‡Ń‚ĐŸ **FastAPI** ĐŽĐŸŃŃ‚Đ°Ń‚ĐŸŃ‡ĐœĐŸ ŃƒĐŒŃ‘Đœ, Ń‡Ń‚ĐŸĐ±Ń‹ Đ·Đ°ĐŒĐ”Ń‚ĐžŃ‚ŃŒ, Ń‡Ń‚ĐŸ path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `item_id` яĐČĐ»ŃĐ”Ń‚ŃŃ path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐŒ, а `q` — ĐœĐ”Ń‚, ĐżĐŸŃŃ‚ĐŸĐŒŃƒ ŃŃ‚ĐŸ query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€. /// -## ĐŸŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°ĐœĐžĐ” топа ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° Đ·Đ°ĐżŃ€ĐŸŃĐ° { #query-parameter-type-conversion } +## ĐŸŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°ĐœĐžĐ” топа query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° { #query-parameter-type-conversion } -Вы таĐșжД ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ с Ń‚ĐžĐżĐŸĐŒ `bool`, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” Đ±ŃƒĐŽŃƒŃ‚ ĐżŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°ĐœŃ‹ ŃĐŸĐŸŃ‚ĐČДтстĐČĐ”ĐœĐœĐŸ: +Вы таĐșжД ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ топы `bool`, Đž ĐŸĐœĐž Đ±ŃƒĐŽŃƒŃ‚ ĐżŃ€Đ”ĐŸĐ±Ń€Đ°Đ·ĐŸĐČĐ°ĐœŃ‹: {* ../../docs_src/query_params/tutorial003_py310.py hl[7] *} -В ŃŃ‚ĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ”, ДслО ĐČы сЎДлаДтД Đ·Đ°ĐżŃ€ĐŸŃ: +В ŃŃ‚ĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ”, ДслО ĐČы пДрДĐčЎётД ĐżĐŸ: ``` http://127.0.0.1:8000/items/foo?short=1 @@ -107,11 +107,12 @@ http://127.0.0.1:8000/items/foo?short=on http://127.0.0.1:8000/items/foo?short=yes ``` -ОлО ĐČ Đ»ŃŽĐ±ĐŸĐŒ ĐŽŃ€ŃƒĐłĐŸĐŒ ĐČĐ°Ń€ĐžĐ°ĐœŃ‚Đ” ĐœĐ°ĐżĐžŃĐ°ĐœĐžŃ (ĐČ ĐČĐ”Ń€Ń…ĐœĐ”ĐŒ рДгОстрД, с заглаĐČĐœĐŸĐč буĐșĐČĐŸĐč, Đž т.Đż), ĐČĐœŃƒŃ‚Ń€Đž ĐČашДĐč Ń„ŃƒĐœĐșцоо ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `short` Đ±ŃƒĐŽĐ”Ń‚ ĐžĐŒĐ”Ń‚ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” `True` топа ĐŽĐ°ĐœĐœŃ‹Ń… `bool` . В ĐżŃ€ĐŸŃ‚ĐžĐČĐœĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” - `False`. +ОлО ĐČ Đ»ŃŽĐ±ĐŸĐŒ ĐŽŃ€ŃƒĐłĐŸĐŒ ĐČĐ°Ń€ĐžĐ°ĐœŃ‚Đ” ĐœĐ°ĐżĐžŃĐ°ĐœĐžŃ (ĐČ ĐČĐ”Ń€Ń…ĐœĐ”ĐŒ рДгОстрД, с заглаĐČĐœĐŸĐč буĐșĐČĐŸĐč Đž т.Đż.), ĐČĐœŃƒŃ‚Ń€Đž ĐČашДĐč Ń„ŃƒĐœĐșцоо ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `short` Đ±ŃƒĐŽĐ”Ń‚ ĐžĐŒĐ”Ń‚ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” `True` топа ĐŽĐ°ĐœĐœŃ‹Ń… `bool`. В ĐżŃ€ĐŸŃ‚ĐžĐČĐœĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” — `False`. -## ĐĄĐŒĐ”ŃˆĐžĐČĐ°ĐœĐžĐ” query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ Đž path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ { #multiple-path-and-query-parameters } -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ Đž path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ ĐŸĐŽĐœĐŸĐČŃ€Đ”ĐŒĐ”ĐœĐœĐŸ, **FastAPI** ŃĐ°ĐŒ Ń€Đ°Đ·Đ±Đ”Ń€Ń‘Ń‚ŃŃ, Ń‡Ń‚ĐŸ Ń‡Đ”ĐŒ яĐČĐ»ŃĐ”Ń‚ŃŃ. +## ĐĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ Đž query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ { #multiple-path-and-query-parameters } + +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ Đž query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ ĐŸĐŽĐœĐŸĐČŃ€Đ”ĐŒĐ”ĐœĐœĐŸ, **FastAPI** Đ·ĐœĐ°Đ”Ń‚, Ń‡Ń‚ĐŸ Ń‡Đ”ĐŒ яĐČĐ»ŃĐ”Ń‚ŃŃ. И ĐČы ĐœĐ” ĐŸĐ±ŃĐ·Đ°ĐœŃ‹ ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ ох ĐČ ĐșаĐșĐŸĐŒ-Đ»ĐžĐ±ĐŸ ĐŸĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐœĐŸĐŒ ĐżĐŸŃ€ŃĐŽĐșĐ”. @@ -123,21 +124,21 @@ http://127.0.0.1:8000/items/foo?short=yes ĐšĐŸĐłĐŽĐ° ĐČы ĐŸĐ±ŃŠŃĐČĐ»ŃĐ”Ń‚Đ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ ĐŽĐ»Ń ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐœĐ” яĐČĐ»ŃĐ”Ń‚ŃŃ path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐŒ (ĐČ ŃŃ‚ĐŸĐŒ разЎДлД ĐŒŃ‹ ĐżĐŸĐșа Ń‡Ń‚ĐŸ Ń€Đ°ŃŃĐŒĐŸŃ‚Ń€Đ”Đ»Đž Ń‚ĐŸĐ»ŃŒĐșĐŸ query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹), Ń‚ĐŸ ĐŸĐœ ĐœĐ” яĐČĐ»ŃĐ”Ń‚ŃŃ ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹ĐŒ. -ЕслО ĐČы ĐœĐ” Ń…ĐŸŃ‚ĐžŃ‚Đ” заЎаĐČать ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐŸĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”, ĐœĐŸ Ń…ĐŸŃ‚ĐžŃ‚Đ” ŃĐŽĐ”Đ»Đ°Ń‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐœĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹ĐŒ, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃƒŃŃ‚Đ°ĐœĐŸĐČоть Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ раĐČĐœŃ‹ĐŒ `None`. +ЕслО ĐČы ĐœĐ” Ń…ĐŸŃ‚ĐžŃ‚Đ” заЎаĐČать ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐŸĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”, ĐœĐŸ Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐżŃ€ĐŸŃŃ‚ĐŸ ŃĐŽĐ”Đ»Đ°Ń‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐœĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹ĐŒ, ŃƒŃŃ‚Đ°ĐœĐŸĐČОтД Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ раĐČĐœŃ‹ĐŒ `None`. ĐĐŸ ДслО ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” ŃĐŽĐ”Đ»Đ°Ń‚ŃŒ query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹ĐŒ, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸŃŃ‚ĐŸ ĐœĐ” уĐșазыĐČать Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ: {* ../../docs_src/query_params/tutorial005_py310.py hl[6:7] *} -Đ—ĐŽĐ”ŃŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżŃ€ĐŸŃĐ° `needy` яĐČĐ»ŃĐ”Ń‚ŃŃ ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹ĐŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐŒ с Ń‚ĐžĐżĐŸĐŒ ĐŽĐ°ĐœĐœŃ‹Ń… `str`. +Đ—ĐŽĐ”ŃŃŒ query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `needy` яĐČĐ»ŃĐ”Ń‚ŃŃ ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹ĐŒ query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐŒ с Ń‚ĐžĐżĐŸĐŒ ĐŽĐ°ĐœĐœŃ‹Ń… `str`. -ЕслО ĐČы ĐŸŃ‚ĐșŃ€ĐŸĐ”Ń‚Đ” ĐČ Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Đ” URL-аЎрДс, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: +ЕслО ĐČы ĐŸŃ‚ĐșŃ€ĐŸĐ”Ń‚Đ” ĐČ Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Đ” URL-аЎрДс ĐČŃ€ĐŸĐŽĐ”: ``` http://127.0.0.1:8000/items/foo-item ``` -...бДз ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœĐžŃ ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœĐŸĐłĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° `needy`, ĐČы уĐČОЎОтД ĐżĐŸĐŽĐŸĐ±ĐœĐŸĐłĐŸ Ń€ĐŸĐŽĐ° ĐŸŃˆĐžĐ±Đșу: +...бДз ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœĐžŃ ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœĐŸĐłĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° `needy`, ĐČы уĐČОЎОтД ĐŸŃˆĐžĐ±Đșу ĐČŃ€ĐŸĐŽĐ”: ```JSON { @@ -170,18 +171,18 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy } ``` -ĐšĐŸĐœĐ”Ń‡ĐœĐŸ, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ ĐșаĐș ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đ”, ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” — ŃĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”ĐŒ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ, а ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” — ĐżĐŸĐ»ĐœĐŸŃŃ‚ŃŒŃŽ ĐœĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đ”: +И, ĐșĐŸĐœĐ”Ń‡ĐœĐŸ, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ĐžŃ‚ŃŒ ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ ĐșаĐș ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đ”, ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” — ŃĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”ĐŒ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ, а ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” — ĐżĐŸĐ»ĐœĐŸŃŃ‚ŃŒŃŽ ĐœĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đ”: {* ../../docs_src/query_params/tutorial006_py310.py hl[8] *} -В ŃŃ‚ĐŸĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ”, у ĐœĐ°Ń Đ”ŃŃ‚ŃŒ 3 ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° Đ·Đ°ĐżŃ€ĐŸŃĐ°: +В ŃŃ‚ĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” Đ”ŃŃ‚ŃŒ 3 query-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°: * `needy`, ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đč `str`. -* `skip`, топа `int` Đž ŃĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”ĐŒ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ `0`. +* `skip`, `int` ŃĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ”ĐŒ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ `0`. * `limit`, ĐœĐ”ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœŃ‹Đč `int`. /// tip | ĐŸĐŸĐŽŃĐșазĐșа -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đșласс `Enum` таĐșжД, ĐșаĐș Ń€Đ°ĐœĐ”Đ” ĐżŃ€ĐžĐŒĐ”ĐœŃĐ»Đž Đ”ĐłĐŸ с [Path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒĐž](path-params.md#predefined-values). +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать `Enum` таĐș жД, ĐșаĐș Ń€Đ°ĐœĐ”Đ” ĐżŃ€ĐžĐŒĐ”ĐœŃĐ»Đž Đ”ĐłĐŸ с [Path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒĐž](path-params.md#predefined-values). /// diff --git a/docs/ru/docs/tutorial/request-files.md b/docs/ru/docs/tutorial/request-files.md index 29a7f5ec1..6d40aaac6 100644 --- a/docs/ru/docs/tutorial/request-files.md +++ b/docs/ru/docs/tutorial/request-files.md @@ -38,13 +38,13 @@ $ pip install python-multipart /// tip | ĐŸĐŸĐŽŃĐșазĐșа -Đ”Đ»Ń ĐŸĐ±ŃŠŃĐČĐ»Đ”ĐœĐžŃ тДла фаĐčла ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать `File`, ĐżĐŸŃĐșĐŸĐ»ŃŒĐșу ĐČ ĐżŃ€ĐŸŃ‚ĐžĐČĐœĐŸĐŒ ŃĐ»ŃƒŃ‡Đ°Đ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ Đ±ŃƒĐŽŃƒŃ‚ ĐžĐœŃ‚Đ”Ń€ĐżŃ€Đ”Ń‚ĐžŃ€ĐŸĐČаться ĐșаĐș ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ Đ·Đ°ĐżŃ€ĐŸŃĐ° ОлО ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ тДла (JSON). +Đ§Ń‚ĐŸĐ±Ń‹ ĐŸĐ±ŃŠŃĐČоть фаĐčлы ĐČ Ń‚Đ”Đ»Đ” Đ·Đ°ĐżŃ€ĐŸŃĐ°, ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать `File`, ĐżĐŸŃĐșĐŸĐ»ŃŒĐșу ĐžĐœĐ°Ń‡Đ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ Đ±ŃƒĐŽŃƒŃ‚ ĐžĐœŃ‚Đ”Ń€ĐżŃ€Đ”Ń‚ĐžŃ€ĐŸĐČаться ĐșаĐș ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ Đ·Đ°ĐżŃ€ĐŸŃĐ° ОлО body-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ (JSON). /// ЀаĐčлы Đ±ŃƒĐŽŃƒŃ‚ Đ·Đ°ĐłŃ€ŃƒĐ¶Đ”ĐœŃ‹ ĐșаĐș ĐŽĐ°ĐœĐœŃ‹Đ” Ń„ĐŸŃ€ĐŒŃ‹. -ЕслО ĐČы ĐŸĐ±ŃŠŃĐČОтД топ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° у *Ń„ŃƒĐœĐșцоо ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ĐșаĐș `bytes`, Ń‚ĐŸ **FastAPI** ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Đ”Ń‚ фаĐčĐ» за ĐČас, Đž ĐČы ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚Đ” Đ”ĐłĐŸ ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒĐŸĐ” ĐČ ĐČОЎД `bytes`. +ЕслО ĐČы ĐŸĐ±ŃŠŃĐČОтД топ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° у *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа путо* ĐșаĐș `bytes`, Ń‚ĐŸ **FastAPI** ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Đ”Ń‚ фаĐčĐ» за ĐČас, Đž ĐČы ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚Đ” Đ”ĐłĐŸ ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒĐŸĐ” ĐČ ĐČОЎД `bytes`. ĐĄĐ»Đ”ĐŽŃƒĐ”Ń‚ ĐžĐŒĐ”Ń‚ŃŒ ĐČ ĐČОЎу, Ń‡Ń‚ĐŸ ĐČсД ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒĐŸĐ” Đ±ŃƒĐŽĐ”Ń‚ Ń…Ń€Đ°ĐœĐžŃ‚ŃŒŃŃ ĐČ ĐżĐ°ĐŒŃŃ‚Đž. Đ­Ń‚ĐŸ Ń…ĐŸŃ€ĐŸŃˆĐŸ ĐżĐŸĐŽŃ…ĐŸĐŽĐžŃ‚ ĐŽĐ»Ń ĐœĐ”Đ±ĐŸĐ»ŃŒŃˆĐžŃ… фаĐčĐ»ĐŸĐČ. @@ -64,15 +64,15 @@ $ pip install python-multipart * Đ­Ń‚ĐŸ ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚, Ń‡Ń‚ĐŸ ĐŸĐœ Đ±ŃƒĐŽĐ”Ń‚ Ń…ĐŸŃ€ĐŸŃˆĐŸ Ń€Đ°Đ±ĐŸŃ‚Đ°Ń‚ŃŒ с Đ±ĐŸĐ»ŃŒŃˆĐžĐŒĐž фаĐčĐ»Đ°ĐŒĐž, таĐșĐžĐŒĐž ĐșаĐș ĐžĐ·ĐŸĐ±Ń€Đ°Đ¶Đ”ĐœĐžŃ, ĐČĐžĐŽĐ”ĐŸ, Đ±ĐŸĐ»ŃŒŃˆĐžĐ” Đ±ĐžĐœĐ°Ń€ĐœŃ‹Đ” фаĐčлы Đž т.ĐŽ., ĐœĐ” ĐżĐŸŃ‚Ń€Đ”Đ±Đ»ŃŃ про ŃŃ‚ĐŸĐŒ ĐČсю ĐżĐ°ĐŒŃŃ‚ŃŒ. * Из Đ·Đ°ĐłŃ€ŃƒĐ¶Đ”ĐœĐœĐŸĐłĐŸ фаĐčла ĐŒĐŸĐ¶ĐœĐŸ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐœŃ‹Đ”. * ĐžĐœ Ń€Đ”Đ°Đ»ĐžĐ·ŃƒĐ”Ń‚ [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) `async` ĐžĐœŃ‚Đ”Ń€Ń„Đ”Đčс. -* ĐžĐœ ĐżŃ€Đ”ĐŽĐŸŃŃ‚Đ°ĐČĐ»ŃĐ”Ń‚ Ń€Đ”Đ°Đ»ŃŒĐœŃ‹Đč ĐŸĐ±ŃŠĐ”Đșт Python [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile), ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ ĐŽŃ€ŃƒĐłĐžĐŒ Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”ĐșĐ°ĐŒ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐŸĐ¶ĐžĐŽĐ°ŃŽŃ‚ фаĐčĐ» ĐČ ĐșачДстĐČĐ” ĐŸĐ±ŃŠĐ”Đșта. +* ĐžĐœ ĐżŃ€Đ”ĐŽĐŸŃŃ‚Đ°ĐČĐ»ŃĐ”Ń‚ Ń€Đ”Đ°Đ»ŃŒĐœŃ‹Đč ĐŸĐ±ŃŠĐ”Đșт Python [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile), ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ ĐŽŃ€ŃƒĐłĐžĐŒ Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”ĐșĐ°ĐŒ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐŸĐ¶ĐžĐŽĐ°ŃŽŃ‚ file-like ĐŸĐ±ŃŠĐ”Đșт. ### `UploadFile` { #uploadfile } `UploadFile` ĐžĐŒĐ”Đ”Ń‚ ŃĐ»Đ”ĐŽŃƒŃŽŃ‰ĐžĐ” Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚Ń‹: * `filename`: ĐĄŃ‚Ń€ĐŸĐșа `str` с ĐžŃŃ…ĐŸĐŽĐœŃ‹ĐŒ ĐžĐŒĐ”ĐœĐ”ĐŒ фаĐčла, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč был Đ·Đ°ĐłŃ€ŃƒĐ¶Đ”Đœ (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, `myimage.jpg`). -* `content_type`: ĐĄŃ‚Ń€ĐŸĐșа `str` с Ń‚ĐžĐżĐŸĐŒ ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒĐŸĐłĐŸ (MIME type / media type) (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, `image/jpeg`). -* `file`: [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (a [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) ĐŸĐ±ŃŠĐ”Đșт). Đ­Ń‚ĐŸ фаĐșтОчДсĐșĐžĐč фаĐčĐ» Python, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐŒĐŸĐ¶ĐœĐŸ пДрДЎаĐČать ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ ĐŽŃ€ŃƒĐłĐžĐŒ Ń„ŃƒĐœĐșŃ†ĐžŃĐŒ ОлО Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”ĐșĐ°ĐŒ, ĐŸĐ¶ĐžĐŽĐ°ŃŽŃ‰ĐžĐŒ фаĐčĐ» ĐČ ĐșачДстĐČĐ” ĐŸĐ±ŃŠĐ”Đșта. +* `content_type`: ĐĄŃ‚Ń€ĐŸĐșа `str` с Ń‚ĐžĐżĐŸĐŒ ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒĐŸĐłĐŸ (MIME-топ / топ ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒĐŸĐłĐŸ) (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, `image/jpeg`). +* `file`: [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) ([file-like](https://docs.python.org/3/glossary.html#term-file-like-object) ĐŸĐ±ŃŠĐ”Đșт). Đ­Ń‚ĐŸ фаĐșтОчДсĐșĐžĐč фаĐčĐ» Python, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐŒĐŸĐ¶ĐœĐŸ пДрДЎаĐČать ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ ĐŽŃ€ŃƒĐłĐžĐŒ Ń„ŃƒĐœĐșŃ†ĐžŃĐŒ ОлО Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”ĐșĐ°ĐŒ, ĐŸĐ¶ĐžĐŽĐ°ŃŽŃ‰ĐžĐŒ file-like ĐŸĐ±ŃŠĐ”Đșт. `UploadFile` ĐžĐŒĐ”Đ”Ń‚ ŃĐ»Đ”ĐŽŃƒŃŽŃ‰ĐžĐ” ĐŒĐ”Ń‚ĐŸĐŽŃ‹ `async`. ВсД ĐŸĐœĐž ĐČызыĐČают ŃĐŸĐŸŃ‚ĐČДтстĐČŃƒŃŽŃ‰ĐžĐ” фаĐčĐ»ĐŸĐČыД ĐŒĐ”Ń‚ĐŸĐŽŃ‹ (ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ ĐČĐœŃƒŃ‚Ń€Đ”ĐœĐœĐžĐč `SpooledTemporaryFile`). @@ -85,19 +85,18 @@ $ pip install python-multipart ĐŸĐŸŃĐșĐŸĐ»ŃŒĐșу ĐČсД это ĐŒĐ”Ń‚ĐŸĐŽŃ‹ яĐČĐ»ŃŃŽŃ‚ŃŃ `async` ĐŒĐ”Ń‚ĐŸĐŽĐ°ĐŒĐž, ĐČĐ°ĐŒ ŃĐ»Đ”ĐŽŃƒĐ”Ń‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать "await" ĐČĐŒĐ”ŃŃ‚Đ” с ĐœĐžĐŒĐž. -ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐČĐœŃƒŃ‚Ń€Đž `async` *Ń„ŃƒĐœĐșцоо ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ĐŒĐŸĐ¶ĐœĐŸ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒĐŸĐ” с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ: +ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐČĐœŃƒŃ‚Ń€Đž `async` *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа путо* ĐŒĐŸĐ¶ĐœĐŸ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒĐŸĐ” с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ: ```Python contents = await myfile.read() ``` -ЕслО ĐČы ĐœĐ°Ń…ĐŸĐŽĐžŃ‚Đ”ŃŃŒ ĐČĐœŃƒŃ‚Ń€Đž ĐŸĐ±Ń‹Ń‡ĐœĐŸĐč `def` *Ń„ŃƒĐœĐșцоо ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*, ĐŒĐŸĐ¶ĐœĐŸ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ ĐżŃ€ŃĐŒĐŸĐč ĐŽĐŸŃŃ‚ŃƒĐż Đș фаĐčлу `UploadFile.file`, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: +ЕслО ĐČы ĐœĐ°Ń…ĐŸĐŽĐžŃ‚Đ”ŃŃŒ ĐČĐœŃƒŃ‚Ń€Đž ĐŸĐ±Ń‹Ń‡ĐœĐŸĐč `def` *Ń„ŃƒĐœĐșцоо-ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа путо*, ĐŒĐŸĐ¶ĐœĐŸ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ ĐżŃ€ŃĐŒĐŸĐč ĐŽĐŸŃŃ‚ŃƒĐż Đș фаĐčлу `UploadFile.file`, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: ```Python contents = myfile.file.read() ``` - /// note | ĐąĐ”Ń…ĐœĐžŃ‡Đ”ŃĐșОД ЎДталО `async` Про ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐž ĐŒĐ”Ń‚ĐŸĐŽĐŸĐČ `async` **FastAPI** запусĐșаДт фаĐčĐ»ĐŸĐČыД ĐŒĐ”Ń‚ĐŸĐŽŃ‹ ĐČ ĐżŃƒĐ»Đ” ĐżĐŸŃ‚ĐŸĐșĐŸĐČ Đž ĐŸĐ¶ĐžĐŽĐ°Đ”Ń‚ ох. @@ -106,7 +105,7 @@ contents = myfile.file.read() /// note | ĐąĐ”Ń…ĐœĐžŃ‡Đ”ŃĐșОД ЎДталО Starlette -**FastAPI** ĐœĐ°ŃĐ»Đ”ĐŽŃƒĐ”Ń‚ `UploadFile` ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ Оз **Starlette**, ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČĐ»ŃĐ”Ń‚ ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ЎДталО ĐŽĐ»Ń ŃĐŸĐČĐŒĐ”ŃŃ‚ĐžĐŒĐŸŃŃ‚Đž с **Pydantic** Đž ĐŽŃ€ŃƒĐłĐžĐŒĐž Ń‡Đ°ŃŃ‚ŃĐŒĐž FastAPI. +`UploadFile` Оз **FastAPI** ĐœĐ°ŃĐ»Đ”ĐŽŃƒĐ”Ń‚ŃŃ ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ ĐŸŃ‚ `UploadFile` Оз **Starlette**, ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČĐ»ŃĐ”Ń‚ ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒŃ‹Đ” часто ĐŽĐ»Ń ŃĐŸĐČĐŒĐ”ŃŃ‚ĐžĐŒĐŸŃŃ‚Đž с **Pydantic** Đž ĐŽŃ€ŃƒĐłĐžĐŒĐž Ń‡Đ°ŃŃ‚ŃĐŒĐž FastAPI. /// @@ -118,17 +117,17 @@ contents = myfile.file.read() /// note | ĐąĐ”Ń…ĐœĐžŃ‡Đ”ŃĐșОД ЎДталО -Đ”Đ°ĐœĐœŃ‹Đ” Оз Ń„ĐŸŃ€ĐŒ ĐŸĐ±Ń‹Ń‡ĐœĐŸ ĐșĐŸĐŽĐžŃ€ŃƒŃŽŃ‚ŃŃ с ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ”ĐŒ "media type" `application/x-www-form-urlencoded` ĐșĐŸĐłĐŽĐ° ĐŸĐœ ĐœĐ” ĐČĐșлючаДт фаĐčлы. +Đ”Đ°ĐœĐœŃ‹Đ” Оз Ń„ĐŸŃ€ĐŒ ĐŸĐ±Ń‹Ń‡ĐœĐŸ ĐșĐŸĐŽĐžŃ€ŃƒŃŽŃ‚ŃŃ с ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ”ĐŒ топа ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒĐŸĐłĐŸ `application/x-www-form-urlencoded`, ĐșĐŸĐłĐŽĐ° ĐŸĐœĐž ĐœĐ” ĐČĐșлючают фаĐčлы. -ĐĐŸ ĐșĐŸĐłĐŽĐ° Ń„ĐŸŃ€ĐŒĐ° ĐČĐșлючаДт фаĐčлы, ĐŸĐœĐ° ĐșĐŸĐŽĐžŃ€ŃƒĐ”Ń‚ŃŃ ĐșаĐș `multipart/form-data`. ЕслО ĐČы ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚Đ” `File`, **FastAPI** Đ±ŃƒĐŽĐ”Ń‚ Đ·ĐœĐ°Ń‚ŃŒ, Ń‡Ń‚ĐŸ Đ”ĐŒŃƒ ĐœŃƒĐ¶ĐœĐŸ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ фаĐčлы Оз ĐœŃƒĐ¶ĐœĐŸĐč часто тДла. +ĐĐŸ ĐșĐŸĐłĐŽĐ° Ń„ĐŸŃ€ĐŒĐ° ĐČĐșлючаДт фаĐčлы, ĐŸĐœĐ° ĐșĐŸĐŽĐžŃ€ŃƒĐ”Ń‚ŃŃ ĐșаĐș `multipart/form-data`. ЕслО ĐČы ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚Đ” `File`, **FastAPI** Đ±ŃƒĐŽĐ”Ń‚ Đ·ĐœĐ°Ń‚ŃŒ, Ń‡Ń‚ĐŸ Đ”ĐŒŃƒ ĐœŃƒĐ¶ĐœĐŸ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ фаĐčлы Оз ĐœŃƒĐ¶ĐœĐŸĐč часто тДла Đ·Đ°ĐżŃ€ĐŸŃĐ°. -ЕслО ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” ŃƒĐ·ĐœĐ°Ń‚ŃŒ Đ±ĐŸĐ»ŃŒŃˆĐ” ĐŸĐ± этох ĐșĐŸĐŽĐžŃ€ĐŸĐČĐșах Đž ĐżĐŸĐ»ŃŃ… Ń„ĐŸŃ€ĐŒ, пДрДĐčЎОтД ĐżĐŸ ссылĐșĐ” [MDN web docs for `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). +ЕслО ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” ŃƒĐ·ĐœĐ°Ń‚ŃŒ Đ±ĐŸĐ»ŃŒŃˆĐ” ĐŸĐ± этох ĐșĐŸĐŽĐžŃ€ĐŸĐČĐșах Đž ĐżĐŸĐ»ŃŃ… Ń„ĐŸŃ€ĐŒ, пДрДĐčЎОтД Đș [ĐČДб-ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž MDN ĐżĐŸ `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// /// warning | Đ’ĐœĐžĐŒĐ°ĐœĐžĐ” -В ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž *Ń„ŃƒĐœĐșцоо ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ĐŒĐŸĐ¶ĐœĐŸ ĐŸĐ±ŃŠŃĐČоть ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ `File` Đž `Form`, ĐœĐŸ ĐœĐ”Đ»ŃŒĐ·Ń таĐșжД ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ ĐżĐŸĐ»Ń `Body`, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐżŃ€Đ”ĐŽĐżĐŸĐ»Đ°ĐłĐ°Đ”Ń‚ŃŃ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ ĐČ ĐČОЎД JSON, ĐżĐŸŃĐșĐŸĐ»ŃŒĐșу Ń‚Đ”Đ»ĐŸ Đ·Đ°ĐżŃ€ĐŸŃĐ° Đ±ŃƒĐŽĐ”Ń‚ заĐșĐŸĐŽĐžŃ€ĐŸĐČĐ°ĐœĐŸ с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `multipart/form-data`, а ĐœĐ” `application/json`. +В *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ĐŒĐŸĐ¶ĐœĐŸ ĐŸĐ±ŃŠŃĐČоть ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐČ `File` Đž `Form`, ĐœĐŸ ĐœĐ”Đ»ŃŒĐ·Ń таĐșжД ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ ĐżĐŸĐ»Ń `Body`, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐżŃ€Đ”ĐŽĐżĐŸĐ»Đ°ĐłĐ°Đ”Ń‚ŃŃ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ ĐČ ĐČОЎД JSON, ĐżĐŸŃĐșĐŸĐ»ŃŒĐșу HTTP-Đ·Đ°ĐżŃ€ĐŸŃ Đ±ŃƒĐŽĐ”Ń‚ ĐžĐŒĐ”Ń‚ŃŒ Ń‚Đ”Đ»ĐŸ, заĐșĐŸĐŽĐžŃ€ĐŸĐČĐ°ĐœĐœĐŸĐ” с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `multipart/form-data`, а ĐœĐ” `application/json`. Đ­Ń‚ĐŸ ĐœĐ” яĐČĐ»ŃĐ”Ń‚ŃŃ ĐŸĐłŃ€Đ°ĐœĐžŃ‡Đ”ĐœĐžĐ”ĐŒ **FastAPI**, ŃŃ‚ĐŸ часть ĐżŃ€ĐŸŃ‚ĐŸĐșĐŸĐ»Đ° HTTP. @@ -174,4 +173,4 @@ contents = myfile.file.read() ## Đ Đ”Đ·ŃŽĐŒĐ” { #recap } -Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД `File`, `bytes` Đž `UploadFile` ĐŽĐ»Ń Ń€Đ°Đ±ĐŸŃ‚Ń‹ с фаĐčĐ»Đ°ĐŒĐž, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” Đ±ŃƒĐŽŃƒŃ‚ Đ·Đ°ĐłŃ€ŃƒĐ¶Đ°Ń‚ŃŒŃŃ Đž пДрДЎаĐČаться ĐČ ĐČОЎД ĐŽĐ°ĐœĐœŃ‹Ń… Ń„ĐŸŃ€ĐŒŃ‹. +Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД `File`, `bytes` Đž `UploadFile`, Ń‡Ń‚ĐŸĐ±Ń‹ ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ фаĐčлы ĐŽĐ»Ń Đ·Đ°ĐłŃ€ŃƒĐ·ĐșĐž ĐČ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ”, пДрДЎаĐČĐ°Đ”ĐŒŃ‹Đ” ĐșаĐș ĐŽĐ°ĐœĐœŃ‹Đ” Ń„ĐŸŃ€ĐŒŃ‹. diff --git a/docs/ru/docs/tutorial/request-forms.md b/docs/ru/docs/tutorial/request-forms.md index 3108c933e..2067195dd 100644 --- a/docs/ru/docs/tutorial/request-forms.md +++ b/docs/ru/docs/tutorial/request-forms.md @@ -1,5 +1,6 @@ # Đ”Đ°ĐœĐœŃ‹Đ” Ń„ĐŸŃ€ĐŒŃ‹ { #form-data } + ĐšĐŸĐłĐŽĐ° ĐČĐ°ĐŒ ĐœŃƒĐ¶ĐœĐŸ ĐżĐŸĐ»ŃƒŃ‡ĐžŃ‚ŃŒ ĐżĐŸĐ»Ń Ń„ĐŸŃ€ĐŒŃ‹ ĐČĐŒĐ”ŃŃ‚ĐŸ JSON, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать `Form`. /// note | ĐŸŃ€ĐžĐŒĐ”Ń‡Đ°ĐœĐžĐ” diff --git a/docs/ru/docs/tutorial/response-status-code.md b/docs/ru/docs/tutorial/response-status-code.md index ef190a341..16f83cd61 100644 --- a/docs/ru/docs/tutorial/response-status-code.md +++ b/docs/ru/docs/tutorial/response-status-code.md @@ -1,6 +1,6 @@ # Статус-ĐșĐŸĐŽ ĐŸŃ‚ĐČДта { #response-status-code } -ĐŸĐŸĐŽĐŸĐ±ĐœĐŸ Ń‚ĐŸĐŒŃƒ, ĐșаĐș ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°ĐŽĐ°Ń‚ŃŒ ĐŒĐŸĐŽĐ”Đ»ŃŒ/ŃŃ…Đ”ĐŒŃƒ ĐŸŃ‚ĐČДта, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть HTTP статус-ĐșĐŸĐŽ, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒŃ‹Đč ĐŽĐ»Ń ĐŸŃ‚ĐČДта, с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° `status_code` ĐČ Đ»ŃŽĐ±ĐŸĐč Оз *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐč путо*: +ĐŸĐŸĐŽĐŸĐ±ĐœĐŸ Ń‚ĐŸĐŒŃƒ, ĐșаĐș ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°ĐŽĐ°Ń‚ŃŒ ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐŸŃ‚ĐČДта, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть HTTP статус-ĐșĐŸĐŽ, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒŃ‹Đč ĐŽĐ»Ń ĐŸŃ‚ĐČДта, с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° `status_code` ĐČ Đ»ŃŽĐ±ĐŸĐč Оз *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐč путо*: * `@app.get()` * `@app.post()` @@ -26,8 +26,8 @@ Đ­Ń‚ĐŸ ĐżĐŸĐ·ĐČĐŸĐ»ĐžŃ‚: -* Đ’ĐŸĐ·ĐČращать уĐșĐ°Đ·Đ°ĐœĐœŃ‹Đč ĐșĐŸĐŽ статуса ĐČ ĐŸŃ‚ĐČДтД. -* Đ”ĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ĐŸĐČать Đ”ĐłĐŸ ĐșаĐș ĐșĐŸĐŽ статуса ĐŸŃ‚ĐČДта ĐČ OpenAPI ŃŃ…Đ”ĐŒĐ” (а Đ·ĐœĐ°Ń‡ĐžŃ‚, Đž ĐČ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșох ĐžĐœŃ‚Đ”Ń€Ń„Đ”Đčсах): +* Đ’ĐŸĐ·ĐČращать уĐșĐ°Đ·Đ°ĐœĐœŃ‹Đč статус-ĐșĐŸĐŽ ĐČ ĐŸŃ‚ĐČДтД. +* Đ”ĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐžŃ€ĐŸĐČать Đ”ĐłĐŸ ĐșаĐș статус-ĐșĐŸĐŽ ĐŸŃ‚ĐČДта ĐČ OpenAPI ŃŃ…Đ”ĐŒĐ” (а Đ·ĐœĐ°Ń‡ĐžŃ‚, Đž ĐČ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșох ĐžĐœŃ‚Đ”Ń€Ń„Đ”Đčсах): @@ -47,26 +47,26 @@ FastAPI Đ·ĐœĐ°Đ”Ń‚ ĐŸĐ± ŃŃ‚ĐŸĐŒ Đž ŃĐŸĐ·ĐŽĐ°ŃŃ‚ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃŽ Open /// -В ĐżŃ€ĐŸŃ‚ĐŸĐșĐŸĐ»Đ” HTTP Ń‡ĐžŃĐ»ĐŸĐČĐŸĐč ĐșĐŸĐŽ ŃĐŸŃŃ‚ĐŸŃĐœĐžŃ Оз 3 цофр ĐŸŃ‚ĐżŃ€Đ°ĐČĐ»ŃĐ”Ń‚ŃŃ ĐșаĐș часть ĐŸŃ‚ĐČДта. +В ĐżŃ€ĐŸŃ‚ĐŸĐșĐŸĐ»Đ” HTTP Ń‡ĐžŃĐ»ĐŸĐČĐŸĐč статус-ĐșĐŸĐŽ Оз 3 цофр ĐŸŃ‚ĐżŃ€Đ°ĐČĐ»ŃĐ”Ń‚ŃŃ ĐșаĐș часть ĐŸŃ‚ĐČДта. -ĐŁ ĐșĐŸĐŽĐŸĐČ ŃŃ‚Đ°Ń‚ŃƒŃĐ° Đ”ŃŃ‚ŃŒ ĐœĐ°Đ·ĐČĐ°ĐœĐžŃ, Ń‡Ń‚ĐŸĐ±Ń‹ ŃƒĐżŃ€ĐŸŃŃ‚ĐžŃ‚ŃŒ ох Ń€Đ°ŃĐżĐŸĐ·ĐœĐ°ĐČĐ°ĐœĐžĐ”, ĐœĐŸ ĐČĐ°Đ¶ĐœŃ‹ ĐžĐŒĐ”ĐœĐœĐŸ Ń‡ĐžŃĐ»ĐŸĐČыД Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ. +ĐŁ статус-ĐșĐŸĐŽĐŸĐČ Đ”ŃŃ‚ŃŒ ĐœĐ°Đ·ĐČĐ°ĐœĐžŃ, Ń‡Ń‚ĐŸĐ±Ń‹ ŃƒĐżŃ€ĐŸŃŃ‚ĐžŃ‚ŃŒ ох Ń€Đ°ŃĐżĐŸĐ·ĐœĐ°ĐČĐ°ĐœĐžĐ”, ĐœĐŸ ĐČĐ°Đ¶ĐœŃ‹ ĐžĐŒĐ”ĐœĐœĐŸ Ń‡ĐžŃĐ»ĐŸĐČыД Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ. КратĐșĐŸ: -* `100 - 199` – статус-ĐșĐŸĐŽŃ‹ ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐŸĐœĐœĐŸĐłĐŸ топа. ĐžĐœĐž рДЎĐșĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃŽŃ‚ŃŃ Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐ°ĐŒĐž ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ. ОтĐČДты с ŃŃ‚ĐžĐŒĐž ĐșĐŸĐŽĐ°ĐŒĐž ĐœĐ” ĐŒĐŸĐłŃƒŃ‚ ĐžĐŒĐ”Ń‚ŃŒ тДла. +* `100 - 199` – статус-ĐșĐŸĐŽŃ‹ ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐŸĐœĐœĐŸĐłĐŸ топа. ĐžĐœĐž рДЎĐșĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃŽŃ‚ŃŃ Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐ°ĐŒĐž ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ. ОтĐČДты с ŃŃ‚ĐžĐŒĐž статус-ĐșĐŸĐŽĐ°ĐŒĐž ĐœĐ” ĐŒĐŸĐłŃƒŃ‚ ĐžĐŒĐ”Ń‚ŃŒ тДла. * **`200 - 299`** – статус-ĐșĐŸĐŽŃ‹, ŃĐŸĐŸĐ±Ń‰Đ°ŃŽŃ‰ĐžĐ” ĐŸĐ± ŃƒŃĐżĐ”ŃˆĐœĐŸĐč ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐ” Đ·Đ°ĐżŃ€ĐŸŃĐ°. ĐžĐœĐž ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃŽŃ‚ŃŃ чащД ĐČŃĐ”ĐłĐŸ. - * `200` – ŃŃ‚ĐŸ ĐșĐŸĐŽ статуса ĐŸŃ‚ĐČДта ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚, Ń‡Ń‚ĐŸ ĐČсД ĐżŃ€ĐŸŃˆĐ»ĐŸ "OK". + * `200` – ŃŃ‚ĐŸ статус-ĐșĐŸĐŽ ĐżĐŸ ŃƒĐŒĐŸĐ»Ń‡Đ°ĐœĐžŃŽ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚, Ń‡Ń‚ĐŸ ĐČсД ĐżŃ€ĐŸŃˆĐ»ĐŸ "OK". * Đ”Ń€ŃƒĐłĐžĐŒ ĐżŃ€ĐžĐŒĐ”Ń€ĐŸĐŒ ĐŒĐŸĐ¶Đ”Ń‚ Đ±Ń‹Ń‚ŃŒ статус `201`, "Created". ĐžĐœ ĐŸĐ±Ń‹Ń‡ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ŃŃ ĐżĐŸŃĐ»Đ” ŃĐŸĐ·ĐŽĐ°ĐœĐžŃ ĐœĐŸĐČĐŸĐč запОсО ĐČ Đ±Đ°Đ·Đ” ĐŽĐ°ĐœĐœŃ‹Ń…. * ĐžŃĐŸĐ±Ń‹Đč ŃĐ»ŃƒŃ‡Đ°Đč – `204`, "No Content". Đ­Ń‚ĐŸŃ‚ статус ĐŸŃ‚ĐČДта ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ŃŃ, ĐșĐŸĐłĐŽĐ° ĐœĐ”Ń‚ ŃĐŸĐŽĐ”Ń€Đ¶ĐžĐŒĐŸĐłĐŸ ĐŽĐ»Ń ĐČĐŸĐ·ĐČрата ĐșĐ»ĐžĐ”ĐœŃ‚Ńƒ, Đž ĐżĐŸŃŃ‚ĐŸĐŒŃƒ ĐŸŃ‚ĐČДт ĐœĐ” ĐŽĐŸĐ»Đ¶Đ”Đœ ĐžĐŒĐ”Ń‚ŃŒ тДла. -* **`300 - 399`** – статус-ĐșĐŸĐŽŃ‹, ŃĐŸĐŸĐ±Ń‰Đ°ŃŽŃ‰ĐžĐ” ĐŸ ĐżĐ”Ń€Đ”ĐœĐ°ĐżŃ€Đ°ĐČĐ»Đ”ĐœĐžŃŃ…. ОтĐČДты с ŃŃ‚ĐžĐŒĐž ĐșĐŸĐŽĐ°ĐŒĐž статуса ĐŒĐŸĐłŃƒŃ‚ ĐžĐŒĐ”Ń‚ŃŒ ОлО ĐœĐ” ĐžĐŒĐ”Ń‚ŃŒ Ń‚Đ”Đ»ĐŸ, за ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ”ĐŒ ĐŸŃ‚ĐČĐ”Ń‚ĐŸĐČ ŃĐŸ ŃŃ‚Đ°Ń‚ŃƒŃĐŸĐŒ `304`, "Not Modified", у ĐșĐŸŃ‚ĐŸŃ€Ń‹Ń… ĐœĐ” ĐŽĐŸĐ»Đ¶ĐœĐŸ Đ±Ń‹Ń‚ŃŒ тДла. +* **`300 - 399`** – статус-ĐșĐŸĐŽŃ‹, ŃĐŸĐŸĐ±Ń‰Đ°ŃŽŃ‰ĐžĐ” ĐŸ ĐżĐ”Ń€Đ”ĐœĐ°ĐżŃ€Đ°ĐČĐ»Đ”ĐœĐžŃŃ…. ОтĐČДты с ŃŃ‚ĐžĐŒĐž статус-ĐșĐŸĐŽĐ°ĐŒĐž ĐŒĐŸĐłŃƒŃ‚ ĐžĐŒĐ”Ń‚ŃŒ ОлО ĐœĐ” ĐžĐŒĐ”Ń‚ŃŒ Ń‚Đ”Đ»ĐŸ, за ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ”ĐŒ ĐŸŃ‚ĐČĐ”Ń‚ĐŸĐČ ŃĐŸ ŃŃ‚Đ°Ń‚ŃƒŃĐŸĐŒ `304`, "Not Modified", у ĐșĐŸŃ‚ĐŸŃ€Ń‹Ń… ĐœĐ” ĐŽĐŸĐ»Đ¶ĐœĐŸ Đ±Ń‹Ń‚ŃŒ тДла. * **`400 - 499`** – статус-ĐșĐŸĐŽŃ‹, ŃĐŸĐŸĐ±Ń‰Đ°ŃŽŃ‰ĐžĐ” ĐŸ ĐșĐ»ĐžĐ”ĐœŃ‚ŃĐșĐŸĐč ĐŸŃˆĐžĐ±ĐșĐ”. Đ­Ń‚ĐŸ Дщё ĐŸĐŽĐœĐ° ĐœĐ°ĐžĐ±ĐŸĐ»Đ”Đ” Ń‡Đ°ŃŃ‚ĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒĐ°Ń ĐșĐ°Ń‚Đ”ĐłĐŸŃ€ĐžŃ. * ĐŸŃ€ĐžĐŒĐ”Ń€ – ĐșĐŸĐŽ `404` ĐŽĐ»Ń статуса "Not Found". * Đ”Đ»Ń ĐŸĐ±Ń‰ĐžŃ… ĐŸŃˆĐžĐ±ĐŸĐș ŃĐŸ ŃŃ‚ĐŸŃ€ĐŸĐœŃ‹ ĐșĐ»ĐžĐ”ĐœŃ‚Đ° ĐŒĐŸĐ¶ĐœĐŸ ĐżŃ€ĐŸŃŃ‚ĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐșĐŸĐŽ `400`. -* `500 - 599` – статус-ĐșĐŸĐŽŃ‹, ŃĐŸĐŸĐ±Ń‰Đ°ŃŽŃ‰ĐžĐ” ĐŸ сДрĐČĐ”Ń€ĐœĐŸĐč ĐŸŃˆĐžĐ±ĐșĐ”. ĐžĐœĐž ĐżĐŸŃ‡Ń‚Đž ĐœĐžĐșĐŸĐłĐŽĐ° ĐœĐ” ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃŽŃ‚ŃŃ Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐ°ĐŒĐž ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ. ĐšĐŸĐłĐŽĐ° Ń‡Ń‚ĐŸ-Ń‚ĐŸ ОЎДт ĐœĐ” таĐș ĐČ ĐșаĐșĐŸĐč-Ń‚ĐŸ часто ĐșĐŸĐŽĐ° ĐČĐ°ŃˆĐ”ĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ ОлО ĐœĐ° сДрĐČДрД, ĐŸĐœ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž ĐČĐ”Ń€ĐœŃ‘Ń‚ ĐŸĐŽĐžĐœ Оз этох ĐșĐŸĐŽĐŸĐČ ŃŃ‚Đ°Ń‚ŃƒŃĐ°. +* `500 - 599` – статус-ĐșĐŸĐŽŃ‹, ŃĐŸĐŸĐ±Ń‰Đ°ŃŽŃ‰ĐžĐ” ĐŸ сДрĐČĐ”Ń€ĐœĐŸĐč ĐŸŃˆĐžĐ±ĐșĐ”. ĐžĐœĐž ĐżĐŸŃ‡Ń‚Đž ĐœĐžĐșĐŸĐłĐŽĐ° ĐœĐ” ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃŽŃ‚ŃŃ Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșĐ°ĐŒĐž ĐœĐ°ĐżŃ€ŃĐŒŃƒŃŽ. ĐšĐŸĐłĐŽĐ° Ń‡Ń‚ĐŸ-Ń‚ĐŸ ОЎДт ĐœĐ” таĐș ĐČ ĐșаĐșĐŸĐč-Ń‚ĐŸ часто ĐșĐŸĐŽĐ° ĐČĐ°ŃˆĐ”ĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ ОлО ĐœĐ° сДрĐČДрД, ĐŸĐœ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž ĐČĐ”Ń€ĐœŃ‘Ń‚ ĐŸĐŽĐžĐœ Оз этох статус-ĐșĐŸĐŽĐŸĐČ. /// tip | ĐŸĐŸĐŽŃĐșазĐșа -Đ§Ń‚ĐŸĐ±Ń‹ ŃƒĐ·ĐœĐ°Ń‚ŃŒ Đ±ĐŸĐ»ŃŒŃˆĐ” ĐŸ HTTP ĐșĐŸĐŽĐ°Ń… статуса Đž ĐŸ Ń‚ĐŸĐŒ, ĐŽĐ»Ń Ń‡Đ”ĐłĐŸ ĐșажЎыĐč Оз ĐœĐžŃ… ĐżŃ€Đ”ĐŽĐœĐ°Đ·ĐœĐ°Ń‡Đ”Đœ, ĐŸĐ·ĐœĐ°ĐșĐŸĐŒŃŒŃ‚Đ”ŃŃŒ с [MDN ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐ”Đč ĐŸĐ± HTTP статус-ĐșĐŸĐŽĐ°Ń…](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status). +Đ§Ń‚ĐŸĐ±Ń‹ ŃƒĐ·ĐœĐ°Ń‚ŃŒ Đ±ĐŸĐ»ŃŒŃˆĐ” ĐŸ HTTP статус-ĐșĐŸĐŽĐ°Ń… Đž ĐŸ Ń‚ĐŸĐŒ, ĐŽĐ»Ń Ń‡Đ”ĐłĐŸ ĐșажЎыĐč Оз ĐœĐžŃ… ĐżŃ€Đ”ĐŽĐœĐ°Đ·ĐœĐ°Ń‡Đ”Đœ, ĐŸĐ·ĐœĐ°ĐșĐŸĐŒŃŒŃ‚Đ”ŃŃŒ с [MDN ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐ”Đč ĐŸĐ± HTTP статус-ĐșĐŸĐŽĐ°Ń…](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status). /// @@ -76,7 +76,7 @@ FastAPI Đ·ĐœĐ°Đ”Ń‚ ĐŸĐ± ŃŃ‚ĐŸĐŒ Đž ŃĐŸĐ·ĐŽĐ°ŃŃ‚ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃŽ Open {* ../../docs_src/response_status_code/tutorial001_py310.py hl[6] *} -`201` – ŃŃ‚ĐŸ ĐșĐŸĐŽ статуса "ĐĄĐŸĐ·ĐŽĐ°ĐœĐŸ". +`201` – ŃŃ‚ĐŸ статус-ĐșĐŸĐŽ ĐŽĐ»Ń "Created". ĐĐŸ ĐČĐ°ĐŒ ĐœĐ” ĐŸĐ±ŃĐ·Đ°Ń‚Đ”Đ»ŃŒĐœĐŸ Đ·Đ°ĐżĐŸĐŒĐžĐœĐ°Ń‚ŃŒ, Ń‡Ń‚ĐŸ ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚ ĐșажЎыĐč Оз этох ĐșĐŸĐŽĐŸĐČ. @@ -84,7 +84,7 @@ FastAPI Đ·ĐœĐ°Đ”Ń‚ ĐŸĐ± ŃŃ‚ĐŸĐŒ Đž ŃĐŸĐ·ĐŽĐ°ŃŃ‚ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃŽ Open {* ../../docs_src/response_status_code/tutorial002_py310.py hl[1,6] *} -ĐžĐœĐž ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ тД жД Ń‡ĐžŃĐ»ĐŸĐČыД Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ, ĐœĐŸ ĐżĐŸĐ·ĐČĐŸĐ»ŃŃŽŃ‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать аĐČŃ‚ĐŸĐ·Đ°ĐČĐ”Ń€ŃˆĐ”ĐœĐžĐ” рДЎаĐșŃ‚ĐŸŃ€Đ° ĐșĐŸĐŽĐ° ĐŽĐ»Ń ĐČŃ‹Đ±ĐŸŃ€Đ° ĐșĐŸĐŽĐ° статуса: +ĐžĐœĐž ŃŃƒŃ‰Đ”ŃŃ‚ĐČуют Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐŽĐ»Ń ŃƒĐŽĐŸĐ±ŃŃ‚ĐČа, ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ тД жД Ń‡ĐžŃĐ»ĐŸĐČыД Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ, ĐœĐŸ ĐżĐŸĐ·ĐČĐŸĐ»ŃŃŽŃ‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать аĐČŃ‚ĐŸĐ·Đ°ĐČĐ”Ń€ŃˆĐ”ĐœĐžĐ” рДЎаĐșŃ‚ĐŸŃ€Đ° ĐșĐŸĐŽĐ° ĐŽĐ»Ń ĐČŃ‹Đ±ĐŸŃ€Đ° статус-ĐșĐŸĐŽĐ°: diff --git a/docs/ru/docs/tutorial/schema-extra-example.md b/docs/ru/docs/tutorial/schema-extra-example.md index 435b34460..917e80838 100644 --- a/docs/ru/docs/tutorial/schema-extra-example.md +++ b/docs/ru/docs/tutorial/schema-extra-example.md @@ -1,4 +1,4 @@ -# ĐžĐ±ŃŠŃĐČĐ»Đ”ĐœĐžĐ” ĐżŃ€ĐžĐŒĐ”Ń€ĐŸĐČ ĐŽĐ°ĐœĐœŃ‹Ń… Đ·Đ°ĐżŃ€ĐŸŃĐ° { #declare-request-example-data } +# ĐžĐ±ŃŠŃĐČĐ»Đ”ĐœĐžĐ” ĐżŃ€ĐžĐŒĐ”Ń€ĐŸĐČ ĐŽĐ°ĐœĐœŃ‹Ń… HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ° { #declare-request-example-data } Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČĐ»ŃŃ‚ŃŒ ĐżŃ€ĐžĐŒĐ”Ń€Ń‹ ĐŽĐ°ĐœĐœŃ‹Ń…, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐČашД ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” ĐŒĐŸĐ¶Đ”Ń‚ ĐżĐŸĐ»ŃƒŃ‡Đ°Ń‚ŃŒ. @@ -12,7 +12,7 @@ Эта ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœĐ°Ń ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ Đ±ŃƒĐŽĐ”Ń‚ ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœĐ° ĐșаĐș Đ”ŃŃ‚ŃŒ ĐČ ĐČŃ‹Ń…ĐŸĐŽĐœŃƒŃŽ **JSON Schema** ŃŃ‚ĐŸĐč ĐŒĐŸĐŽĐ”Đ»Đž Đž Đ±ŃƒĐŽĐ”Ń‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČаться ĐČ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž API. -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚ `model_config`, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐżŃ€ĐžĐœĐžĐŒĐ°Đ”Ń‚ `dict`, ĐșаĐș ĐŸĐżĐžŃĐ°ĐœĐŸ ĐČ [Đ”ĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃ Pydantic: ĐšĐŸĐœŃ„ĐžĐłŃƒŃ€Đ°Ń†ĐžŃ](https://docs.pydantic.dev/latest/api/config/). +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚ `model_config`, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ĐżŃ€ĐžĐœĐžĐŒĐ°Đ”Ń‚ `dict`, ĐșаĐș ĐŸĐżĐžŃĐ°ĐœĐŸ ĐČ [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž Pydantic: ĐšĐŸĐœŃ„ĐžĐłŃƒŃ€Đ°Ń†ĐžŃ](https://docs.pydantic.dev/latest/api/config/). Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°ĐŽĐ°Ń‚ŃŒ `"json_schema_extra"` с `dict`, ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‰ĐžĐŒ любыД ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đ” ĐŽĐ°ĐœĐœŃ‹Đ”, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐČы Ń…ĐŸŃ‚ĐžŃ‚Đ” ĐČĐžĐŽĐ”Ń‚ŃŒ ĐČ ŃĐłĐ”ĐœĐ”Ń€ĐžŃ€ĐŸĐČĐ°ĐœĐœĐŸĐč JSON Schema, ĐČĐșĐ»ŃŽŃ‡Đ°Ń `examples`. @@ -26,7 +26,7 @@ /// note | ĐŸŃ€ĐžĐŒĐ”Ń‡Đ°ĐœĐžĐ” -OpenAPI 3.1.0 (ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ŃŃ ĐœĐ°Ń‡ĐžĐœĐ°Ń с FastAPI 0.99.0) ĐŽĐŸĐ±Đ°ĐČОл ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșу `examples`, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč яĐČĐ»ŃĐ”Ń‚ŃŃ частью ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ° **JSON Schema**. +OpenAPI 3.1.0 (ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ŃŃ ĐœĐ°Ń‡ĐžĐœĐ°Ń с FastAPI 0.99.0) ĐŽĐŸĐ±Đ°ĐČОл ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșу `examples`, ĐșĐŸŃ‚ĐŸŃ€ĐŸĐ” яĐČĐ»ŃĐ”Ń‚ŃŃ частью ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ° **JSON Schema**. Đ”ĐŸ ŃŃ‚ĐŸĐłĐŸ ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČĐ°Đ»ĐŸŃŃŒ Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐșлючДĐČĐŸĐ” ŃĐ»ĐŸĐČĐŸ `example` с ĐŸĐŽĐœĐžĐŒ ĐżŃ€ĐžĐŒĐ”Ń€ĐŸĐŒ. ĐžĐœĐŸ ĐČсё Дщё ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČĐ°Đ”Ń‚ŃŃ ĐČ OpenAPI 3.1.0, ĐœĐŸ ĐżĐŸĐŒĐ”Ń‡Đ”ĐœĐŸ ĐșаĐș ŃƒŃŃ‚Đ°Ń€Đ”ĐČшДД Đž ĐœĐ” яĐČĐ»ŃĐ”Ń‚ŃŃ частью ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ° JSON Schema. ĐŸĐŸŃŃ‚ĐŸĐŒŃƒ рДĐșĐŸĐŒĐ”ĐœĐŽŃƒĐ”Ń‚ŃŃ ĐŒĐžĐłŃ€ĐžŃ€ĐŸĐČать `example` ĐœĐ° `examples`. đŸ€“ @@ -80,13 +80,13 @@ OpenAPI 3.1.0 (ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ŃŃ ĐœĐ°Ń‡ĐžĐœĐ°Ń с FastAPI 0.99.0) ĐŽĐŸĐ± Ещё ĐŽĐŸ Ń‚ĐŸĐłĐŸ ĐșаĐș **JSON Schema** ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đ°Đ»Đ° `examples`, ĐČ OpenAPI была ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșа ĐŽŃ€ŃƒĐłĐŸĐłĐŸ ĐżĐŸĐ»Ń, таĐșжД ĐœĐ°Đ·Ń‹ĐČĐ°Đ”ĐŒĐŸĐłĐŸ `examples`. -Это **спДцОфОчДсĐșОД ĐŽĐ»Ń OpenAPI** `examples` ĐœĐ°Ń…ĐŸĐŽŃŃ‚ŃŃ ĐČ ĐŽŃ€ŃƒĐłĐŸĐč сДĐșцоо спДцОфОĐșацоо OpenAPI. ĐžĐœĐž ĐœĐ°Ń…ĐŸĐŽŃŃ‚ŃŃ ĐČ **ĐżĐŸĐŽŃ€ĐŸĐ±ĐœĐŸŃŃ‚ŃŃ… ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐč ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо (ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Ń‡ĐžĐșа путо)**, а ĐœĐ” ĐČĐœŃƒŃ‚Ń€Đž ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ ĐŸĐ±ŃŠĐ”Đșта Schema. +Это **спДцОфОчДсĐșОД ĐŽĐ»Ń OpenAPI** `examples` ĐœĐ°Ń…ĐŸĐŽŃŃ‚ŃŃ ĐČ ĐŽŃ€ŃƒĐłĐŸĐč сДĐșцоо спДцОфОĐșацоо OpenAPI. ĐžĐœĐž ĐœĐ°Ń…ĐŸĐŽŃŃ‚ŃŃ ĐČ **ĐżĐŸĐŽŃ€ĐŸĐ±ĐœĐŸŃŃ‚ŃŃ… ĐșĐ°Đ¶ĐŽĐŸĐč *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо***, а ĐœĐ” ĐČĐœŃƒŃ‚Ń€Đž ĐșĐ°Đ¶ĐŽĐŸĐč JSON Schema. И Swagger UI ужД ĐșаĐșĐŸĐ”â€‘Ń‚ĐŸ ĐČŃ€Đ”ĐŒŃ ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČаДт ĐžĐŒĐ”ĐœĐœĐŸ ŃŃ‚ĐŸ ĐżĐŸĐ»Đ” `examples`. ĐŸĐŸŃŃ‚ĐŸĐŒŃƒ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ”ĐłĐŸ, Ń‡Ń‚ĐŸĐ±Ń‹ **ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ·ĐžŃ‚ŃŒ** Ń€Đ°Đ·ĐœŃ‹Đ” **ĐżŃ€ĐžĐŒĐ”Ń€Ń‹ ĐČ UI ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž**. СтруĐșтура ŃŃ‚ĐŸĐłĐŸ ŃĐżĐ”Ń†ĐžŃ„ĐžŃ‡ĐœĐŸĐłĐŸ ĐŽĐ»Ń OpenAPI ĐżĐŸĐ»Ń `examples` — ŃŃ‚ĐŸ `dict` с **ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐžĐŒĐž ĐżŃ€ĐžĐŒĐ”Ń€Đ°ĐŒĐž** (ĐČĐŒĐ”ŃŃ‚ĐŸ `list`), ĐșажЎыĐč с ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœĐŸĐč ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐ”Đč, ĐșĐŸŃ‚ĐŸŃ€Đ°Ń таĐșжД Đ±ŃƒĐŽĐ”Ń‚ ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœĐ° ĐČ **OpenAPI**. -Đ­Ń‚ĐŸ ĐœĐ” ĐżĐŸĐŒĐ”Ń‰Đ°Đ”Ń‚ŃŃ ĐČĐœŃƒŃ‚Ń€ŃŒ ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ ĐŸĐ±ŃŠĐ”Đșта Schema ĐČ OpenAPI, ŃŃ‚ĐŸ ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŃ ŃĐœĐ°Ń€ŃƒĐ¶Đž, ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ ĐœĐ° ŃƒŃ€ĐŸĐČĐœĐ” ŃĐ°ĐŒĐŸĐč *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*. +Đ­Ń‚ĐŸ ĐœĐ” ĐżĐŸĐŒĐ”Ń‰Đ°Đ”Ń‚ŃŃ ĐČĐœŃƒŃ‚Ń€ŃŒ ĐșĐ°Đ¶ĐŽĐŸĐč JSON Schema, ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‰Đ”Đčся ĐČ OpenAPI, ŃŃ‚ĐŸ ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŃ ŃĐœĐ°Ń€ŃƒĐ¶Đž, ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ ĐœĐ° ŃƒŃ€ĐŸĐČĐœĐ” ŃĐ°ĐŒĐŸĐč *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо*. ### Đ˜ŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° `openapi_examples` { #using-the-openapi-examples-parameter } diff --git a/docs/ru/docs/tutorial/security/first-steps.md b/docs/ru/docs/tutorial/security/first-steps.md index e702dfadb..35d63c843 100644 --- a/docs/ru/docs/tutorial/security/first-steps.md +++ b/docs/ru/docs/tutorial/security/first-steps.md @@ -186,9 +186,9 @@ oauth2_scheme(some, parameters) ## Đ§Ń‚ĐŸ ĐŸĐœ ЎДлаДт { #what-it-does } -ĐžĐœ Đ±ŃƒĐŽĐ”Ń‚ ОсĐșать ĐČ Đ·Đ°ĐżŃ€ĐŸŃĐ” HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐŸĐș `Authorization`, ĐżŃ€ĐŸĐČĐ”Ń€ŃŃ‚ŃŒ, Ń‡Ń‚ĐŸ Đ”ĐłĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” — ŃŃ‚ĐŸ `Bearer ` плюс ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč Ń‚ĐŸĐșĐ”Đœ, Đž ĐČĐ”Ń€ĐœĐ”Ń‚ Ń‚ĐŸĐșĐ”Đœ ĐșаĐș `str`. +ĐžĐœ Đ±ŃƒĐŽĐ”Ń‚ ОсĐșать ĐČ HTTP-Đ·Đ°ĐżŃ€ĐŸŃĐ” HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐŸĐș `Authorization`, ĐżŃ€ĐŸĐČĐ”Ń€ŃŃ‚ŃŒ, Ń‡Ń‚ĐŸ Đ”ĐłĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” — ŃŃ‚ĐŸ `Bearer ` плюс ĐœĐ”ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč Ń‚ĐŸĐșĐ”Đœ, Đž ĐČĐ”Ń€ĐœĐ”Ń‚ Ń‚ĐŸĐșĐ”Đœ ĐșаĐș `str`. -ЕслО Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐŸĐș `Authorization` ĐŸŃ‚ŃŃƒŃ‚ŃŃ‚ĐČŃƒĐ”Ń‚ ОлО Đ”ĐłĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐœĐ” ŃĐŸĐŽĐ”Ń€Đ¶ĐžŃ‚ Ń‚ĐŸĐșĐ”Đœ `Bearer `, ĐŸĐœ ŃŃ€Đ°Đ·Ńƒ ĐŸŃ‚ĐČДтОт ĐŸŃˆĐžĐ±ĐșĐŸĐč ŃĐŸ статус-ĐșĐŸĐŽĐŸĐŒ 401 (`UNAUTHORIZED`). +ЕслО HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐŸĐș `Authorization` ĐŸŃ‚ŃŃƒŃ‚ŃŃ‚ĐČŃƒĐ”Ń‚ ОлО Đ”ĐłĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐœĐ” ŃĐŸĐŽĐ”Ń€Đ¶ĐžŃ‚ Ń‚ĐŸĐșĐ”Đœ `Bearer `, ĐŸĐœ ŃŃ€Đ°Đ·Ńƒ ĐŸŃ‚ĐČДтОт ĐŸŃˆĐžĐ±ĐșĐŸĐč ŃĐŸ статус-ĐșĐŸĐŽĐŸĐŒ 401 (`UNAUTHORIZED`). Đ’Đ°ĐŒ ЎажД ĐœĐ” ĐœŃƒĐ¶ĐœĐŸ ĐżŃ€ĐŸĐČĐ”Ń€ŃŃ‚ŃŒ ĐœĐ°Đ»ĐžŃ‡ĐžĐ” Ń‚ĐŸĐșĐ”ĐœĐ°, Ń‡Ń‚ĐŸĐ±Ń‹ ĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ ĐŸŃˆĐžĐ±Đșу. Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ±Ń‹Ń‚ŃŒ уĐČĐ”Ń€Đ”ĐœŃ‹: ДслО ĐČаша Ń„ŃƒĐœĐșцоя была ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœĐ°, ĐČ ŃŃ‚ĐŸĐŒ Ń‚ĐŸĐșĐ”ĐœĐ” Đ±ŃƒĐŽĐ”Ń‚ `str`. diff --git a/docs/ru/docs/tutorial/security/get-current-user.md b/docs/ru/docs/tutorial/security/get-current-user.md index 7bd48a9a0..8beebc51d 100644 --- a/docs/ru/docs/tutorial/security/get-current-user.md +++ b/docs/ru/docs/tutorial/security/get-current-user.md @@ -14,7 +14,7 @@ ĐąĐŸŃ‡ĐœĐŸ таĐș жД, ĐșаĐș ĐŒŃ‹ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒ Pydantic ĐŽĐ»Ń ĐŸĐ±ŃŠŃĐČĐ»Đ”ĐœĐžŃ тДл Đ·Đ°ĐżŃ€ĐŸŃĐŸĐČ, ĐŒŃ‹ ĐŒĐŸĐ¶Đ”ĐŒ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ”ĐłĐŸ гЎД ŃƒĐłĐŸĐŽĐœĐŸ: -{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *} +{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *} ## ĐĄĐŸĐ·ĐŽĐ°Ń‚ŃŒ заĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŒ `get_current_user` { #create-a-get-current-user-dependency } @@ -54,7 +54,7 @@ /// tip | ĐŸĐŸĐŽŃĐșазĐșа -ĐąĐŸ, ĐșаĐș ŃƒŃŃ‚Ń€ĐŸĐ”ĐœĐ° эта ŃĐžŃŃ‚Đ”ĐŒĐ° заĐČĐžŃĐžĐŒĐŸŃŃ‚Đ”Đč, ĐżĐŸĐ·ĐČĐŸĐ»ŃĐ”Ń‚ ĐžĐŒĐ”Ń‚ŃŒ Ń€Đ°Đ·ĐœŃ‹Đ” заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐČĐŸĐ·ĐČращают ĐŒĐŸĐŽĐ”Đ»ŃŒ `User`. +ĐąĐŸ, ĐșаĐș ŃƒŃŃ‚Ń€ĐŸĐ”ĐœĐ° эта ŃĐžŃŃ‚Đ”ĐŒĐ° заĐČĐžŃĐžĐŒĐŸŃŃ‚Đ”Đč, ĐżĐŸĐ·ĐČĐŸĐ»ŃĐ”Ń‚ ĐžĐŒĐ”Ń‚ŃŒ Ń€Đ°Đ·ĐœŃ‹Đ” заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž (Ń€Đ°Đ·ĐœŃ‹Đ” "dependables"), ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐČсД ĐČĐŸĐ·ĐČращают ĐŒĐŸĐŽĐ”Đ»ŃŒ `User`. Мы ĐœĐ” ĐŸĐłŃ€Đ°ĐœĐžŃ‡Đ”ĐœŃ‹ ĐœĐ°Đ»ĐžŃ‡ĐžĐ”ĐŒ Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐŸĐŽĐœĐŸĐč заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž, ĐșĐŸŃ‚ĐŸŃ€Đ°Ń ĐŒĐŸĐ¶Đ”Ń‚ ĐČĐŸĐ·ĐČращать таĐșĐŸĐč топ ĐŽĐ°ĐœĐœŃ‹Ń…. diff --git a/docs/ru/docs/tutorial/security/oauth2-jwt.md b/docs/ru/docs/tutorial/security/oauth2-jwt.md index 0409cd0a9..63492e630 100644 --- a/docs/ru/docs/tutorial/security/oauth2-jwt.md +++ b/docs/ru/docs/tutorial/security/oauth2-jwt.md @@ -28,7 +28,7 @@ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4 ## ĐŁŃŃ‚Đ°ĐœĐŸĐČĐșа `PyJWT` { #install-pyjwt } -ĐĐ°ĐŒ ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒĐŸ ŃƒŃŃ‚Đ°ĐœĐŸĐČоть `pyjwt` ĐŽĐ»Ń ĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžĐž Đž ĐżŃ€ĐŸĐČДрĐșĐž JWT-Ń‚ĐŸĐșĐ”ĐœĐŸĐČ ĐœĐ° ŃĐ·Ń‹ĐșĐ” Python. +ĐĐ°ĐŒ ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒĐŸ ŃƒŃŃ‚Đ°ĐœĐŸĐČоть `PyJWT` ĐŽĐ»Ń ĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžĐž Đž ĐżŃ€ĐŸĐČДрĐșĐž JWT-Ń‚ĐŸĐșĐ”ĐœĐŸĐČ ĐœĐ° ŃĐ·Ń‹ĐșĐ” Python. ĐŁĐ±Đ”ĐŽĐžŃ‚Đ”ŃŃŒ, Ń‡Ń‚ĐŸ ĐČы ŃĐŸĐ·ĐŽĐ°Đ»Đž [ĐČĐžŃ€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐ” ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžĐ”](../../virtual-environments.md), аĐșтоĐČоруĐčтД Đ”ĐłĐŸ, а Đ·Đ°Ń‚Đ”ĐŒ ŃƒŃŃ‚Đ°ĐœĐŸĐČОтД `pyjwt`: @@ -42,7 +42,7 @@ $ pip install pyjwt
-/// note | Đ”ĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœĐ°Ń ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ +/// note | ĐŸŃ€ĐžĐŒĐ”Ń‡Đ°ĐœĐžĐ” ЕслО ĐČы ĐżĐ»Đ°ĐœĐžŃ€ŃƒĐ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ°Đ»ĐłĐŸŃ€ĐžŃ‚ĐŒŃ‹ Ń†ĐžŃ„Ń€ĐŸĐČĐŸĐč ĐżĐŸĐŽĐżĐžŃĐž, таĐșОД ĐșаĐș RSA ОлО ECDSA, ĐČĐ°ĐŒ ŃĐ»Đ”ĐŽŃƒĐ”Ń‚ ŃƒŃŃ‚Đ°ĐœĐŸĐČоть заĐČĐžŃĐžĐŒĐŸŃŃ‚ŃŒ Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”ĐșĐž ĐșŃ€ĐžĐżŃ‚ĐŸĐłŃ€Đ°Ń„ĐžĐž `pyjwt[crypto]`. @@ -110,9 +110,9 @@ pwdlib таĐșжД ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČаДт Đ°Đ»ĐłĐŸŃ€ĐžŃ‚ĐŒ Ń…Đ”ŃˆĐžŃ€ĐŸĐČĐ°ĐœĐž /// -ĐĄĐŸĐ·ĐŽĐ°ĐčтД ŃĐ»ŃƒĐ¶Đ”Đ±ĐœŃƒŃŽ Ń„ŃƒĐœĐșцою ĐŽĐ»Ń Ń…ŃŃˆĐžŃ€ĐŸĐČĐ°ĐœĐžŃ ĐżĐ°Ń€ĐŸĐ»Ń, ĐżĐŸŃŃ‚ŃƒĐżĐ°ŃŽŃ‰Đ”ĐłĐŸ ĐŸŃ‚ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń. +ĐĄĐŸĐ·ĐŽĐ°ĐčтД ĐČŃĐżĐŸĐŒĐŸĐłĐ°Ń‚Đ”Đ»ŃŒĐœŃƒŃŽ Ń„ŃƒĐœĐșцою ĐŽĐ»Ń Ń…ŃŃˆĐžŃ€ĐŸĐČĐ°ĐœĐžŃ ĐżĐ°Ń€ĐŸĐ»Ń, ĐżĐŸŃŃ‚ŃƒĐżĐ°ŃŽŃ‰Đ”ĐłĐŸ ĐŸŃ‚ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń. -А Đ·Đ°Ń‚Đ”ĐŒ ŃĐŸĐ·ĐŽĐ°ĐčтД Юругую — ĐŽĐ»Ń ĐżŃ€ĐŸĐČДрĐșĐž ŃĐŸĐŸŃ‚ĐČДтстĐČоя ĐżĐŸĐ»ŃƒŃ‡Đ”ĐœĐœĐŸĐłĐŸ ĐżĐ°Ń€ĐŸĐ»Ń Đž Ń…Ń€Đ°ĐœĐžĐŒĐŸĐłĐŸ хэша. +А Đ·Đ°Ń‚Đ”ĐŒ ŃĐŸĐ·ĐŽĐ°ĐčтД Юругую ĐČŃĐżĐŸĐŒĐŸĐłĐ°Ń‚Đ”Đ»ŃŒĐœŃƒŃŽ Ń„ŃƒĐœĐșцою — ĐŽĐ»Ń ĐżŃ€ĐŸĐČДрĐșĐž ŃĐŸĐŸŃ‚ĐČДтстĐČоя ĐżĐŸĐ»ŃƒŃ‡Đ”ĐœĐœĐŸĐłĐŸ ĐżĐ°Ń€ĐŸĐ»Ń Đž Ń…Ń€Đ°ĐœĐžĐŒĐŸĐłĐŸ хэша. И ДщД ĐŸĐŽĐœŃƒ — ĐŽĐ»Ń Đ°ŃƒŃ‚Đ”ĐœŃ‚ĐžŃ„ĐžĐșацоо Đž ĐČĐŸĐ·ĐČрата ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń. @@ -120,15 +120,15 @@ pwdlib таĐșжД ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČаДт Đ°Đ»ĐłĐŸŃ€ĐžŃ‚ĐŒ Ń…Đ”ŃˆĐžŃ€ĐŸĐČĐ°ĐœĐž ĐšĐŸĐłĐŽĐ° `authenticate_user` ĐČызыĐČĐ°Đ”Ń‚ŃŃ с ĐžĐŒĐ”ĐœĐ”ĐŒ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń, ĐșĐŸŃ‚ĐŸŃ€ĐŸĐłĐŸ ĐœĐ”Ń‚ ĐČ Đ±Đ°Đ·Đ” ĐŽĐ°ĐœĐœŃ‹Ń…, ĐŒŃ‹ ĐČсД раĐČĐœĐŸ запусĐșĐ°Đ”ĐŒ `verify_password` с ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ”ĐŒ фоĐșтоĐČĐœĐŸĐłĐŸ хэша. -Đ­Ń‚ĐŸ ĐłĐ°Ń€Đ°ĐœŃ‚ĐžŃ€ŃƒĐ”Ń‚, Ń‡Ń‚ĐŸ ŃĐœĐŽĐżĐŸĐžĐœŃ‚ ĐŸŃ‚ĐČДчаДт ĐżŃ€ĐžĐŒĐ”Ń€ĐœĐŸ за ĐŸĐŽĐœĐŸ Đž Ń‚ĐŸ жД ĐČŃ€Đ”ĐŒŃ ĐČĐœĐ” заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž ĐŸŃ‚ Ń‚ĐŸĐłĐŸ, ŃŃƒŃ‰Đ”ŃŃ‚ĐČŃƒĐ”Ń‚ ĐžĐŒŃ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń ОлО ĐœĐ”Ń‚, ĐżŃ€Đ”ĐŽĐŸŃ‚ĐČращая таĐčĐŒĐžĐœĐłĐŸĐČыД атаĐșĐž (атаĐșа ĐżĐŸ ĐČŃ€Đ”ĐŒĐ”ĐœĐž), с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ ĐșĐŸŃ‚ĐŸŃ€Ń‹Ń… ĐŒĐŸĐ¶ĐœĐŸ Đ±Ń‹Đ»ĐŸ бы ĐżĐ”Ń€Đ”Ń‡ĐžŃĐ»ŃŃ‚ŃŒ ŃŃƒŃ‰Đ”ŃŃ‚ĐČŃƒŃŽŃ‰ĐžĐ” ĐžĐŒĐ”ĐœĐ° ĐżĐŸĐ»ŃŒĐ·ĐŸĐČатДлДĐč. +Đ­Ń‚ĐŸ ĐłĐ°Ń€Đ°ĐœŃ‚ĐžŃ€ŃƒĐ”Ń‚, Ń‡Ń‚ĐŸ ŃĐœĐŽĐżĐŸĐžĐœŃ‚ ĐŸŃ‚ĐČДчаДт ĐżŃ€ĐžĐŒĐ”Ń€ĐœĐŸ за ĐŸĐŽĐœĐŸ Đž Ń‚ĐŸ жД ĐČŃ€Đ”ĐŒŃ ĐČĐœĐ” заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž ĐŸŃ‚ Ń‚ĐŸĐłĐŸ, ŃŃƒŃ‰Đ”ŃŃ‚ĐČŃƒĐ”Ń‚ ĐžĐŒŃ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń ОлО ĐœĐ”Ń‚, ĐżŃ€Đ”ĐŽĐŸŃ‚ĐČращая **таĐčĐŒĐžĐœĐłĐŸĐČыД атаĐșĐž** (атаĐșĐž ĐżĐŸ ĐČŃ€Đ”ĐŒĐ”ĐœĐž), с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ ĐșĐŸŃ‚ĐŸŃ€Ń‹Ń… ĐŒĐŸĐ¶ĐœĐŸ Đ±Ń‹Đ»ĐŸ бы ĐżĐ”Ń€Đ”Ń‡ĐžŃĐ»ŃŃ‚ŃŒ ŃŃƒŃ‰Đ”ŃŃ‚ĐČŃƒŃŽŃ‰ĐžĐ” ĐžĐŒĐ”ĐœĐ° ĐżĐŸĐ»ŃŒĐ·ĐŸĐČатДлДĐč. -/// note | ĐąĐ”Ń…ĐœĐžŃ‡Đ”ŃĐșОД ЎДталО +/// note | ĐŸŃ€ĐžĐŒĐ”Ń‡Đ°ĐœĐžĐ” ЕслО ĐżŃ€ĐŸĐČĐ”Ń€ĐžŃ‚ŃŒ ĐœĐŸĐČую (Ń„Đ°Đ»ŃŒŃˆĐžĐČую) базу ĐŽĐ°ĐœĐœŃ‹Ń… `fake_users_db`, Ń‚ĐŸ ĐŒĐŸĐ¶ĐœĐŸ уĐČĐžĐŽĐ”Ń‚ŃŒ, ĐșаĐș Ń‚Đ”ĐżĐ”Ń€ŃŒ ĐČŃ‹ĐłĐ»ŃĐŽĐžŃ‚ Ń…ŃŃˆĐžŃ€ĐŸĐČĐ°ĐœĐœŃ‹Đč ĐżĐ°Ń€ĐŸĐ»ŃŒ: `"$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc"`. /// -## Đ Đ°Đ±ĐŸŃ‚Đ° с JWT Ń‚ĐŸĐșĐ”ĐœĐ°ĐŒĐž { #handle-jwt-tokens } +## Đ Đ°Đ±ĐŸŃ‚Đ° с JWT-Ń‚ĐŸĐșĐ”ĐœĐ°ĐŒĐž { #handle-jwt-tokens } Đ˜ĐŒĐżĐŸŃ€Ń‚ĐžŃ€ŃƒĐčтД ŃƒŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ‹Đ” ĐŒĐŸĐŽŃƒĐ»Đž. @@ -154,7 +154,7 @@ $ openssl rand -hex 32 ОпрДЎДлОтД Pydantic-ĐŒĐŸĐŽĐ”Đ»ŃŒ, ĐșĐŸŃ‚ĐŸŃ€Đ°Ń Đ±ŃƒĐŽĐ”Ń‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČаться ĐŽĐ»Ń Ń„ĐŸŃ€ĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžŃ ĐŸŃ‚ĐČДта ĐœĐ° Đ·Đ°ĐżŃ€ĐŸŃ ĐœĐ° ĐżĐŸĐ»ŃƒŃ‡Đ”ĐœĐžĐ” Ń‚ĐŸĐșĐ”ĐœĐ°. -ĐĄĐŸĐ·ĐŽĐ°ĐčтД ŃĐ»ŃƒĐ¶Đ”Đ±ĐœŃƒŃŽ Ń„ŃƒĐœĐșцою ĐŽĐ»Ń ĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžĐž ĐœĐŸĐČĐŸĐłĐŸ Ń‚ĐŸĐșĐ”ĐœĐ° ĐŽĐŸŃŃ‚ŃƒĐżĐ°. +ĐĄĐŸĐ·ĐŽĐ°ĐčтД ĐČŃĐżĐŸĐŒĐŸĐłĐ°Ń‚Đ”Đ»ŃŒĐœŃƒŃŽ Ń„ŃƒĐœĐșцою ĐŽĐ»Ń ĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžĐž ĐœĐŸĐČĐŸĐłĐŸ Ń‚ĐŸĐșĐ”ĐœĐ° ĐŽĐŸŃŃ‚ŃƒĐżĐ°. {* ../../docs_src/security/tutorial004_an_py310.py hl[4,7,13:15,29:31,82:90] *} @@ -172,7 +172,7 @@ $ openssl rand -hex 32 ĐĄĐŸĐ·ĐŽĐ°ĐčтД `timedelta` ŃĐŸ ĐČŃ€Đ”ĐŒĐ”ĐœĐ”ĐŒ ĐžŃŃ‚Đ”Ń‡Đ”ĐœĐžŃ ŃŃ€ĐŸĐșа ĐŽĐ”ĐčстĐČоя Ń‚ĐŸĐșĐ”ĐœĐ°. -ĐĄĐŸĐ·ĐŽĐ°ĐčтД Ń€Đ”Đ°Đ»ŃŒĐœŃ‹Đč Ń‚ĐŸĐșĐ”Đœ ĐŽĐŸŃŃ‚ŃƒĐżĐ° JWT Đž ĐČĐ”Ń€ĐœĐžŃ‚Đ” Đ”ĐłĐŸ +ĐĄĐŸĐ·ĐŽĐ°ĐčтД Ń€Đ”Đ°Đ»ŃŒĐœŃ‹Đč Ń‚ĐŸĐșĐ”Đœ ĐŽĐŸŃŃ‚ŃƒĐżĐ° JWT Đž ĐČĐ”Ń€ĐœĐžŃ‚Đ” Đ”ĐłĐŸ. {* ../../docs_src/security/tutorial004_an_py310.py hl[121:136] *} @@ -188,13 +188,13 @@ JWT ĐŒĐŸĐ¶Đ”Ń‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČаться Đž ĐŽĐ»Ń Юругох цДлДĐč, Đ—Đ°Ń‚Đ”ĐŒ ĐČы ĐŒĐŸĐłĐ»Đž бы ĐŽĐŸĐ±Đ°ĐČоть праĐČа ĐŽĐŸŃŃ‚ŃƒĐżĐ° Đș ŃŃ‚ĐŸĐč ŃŃƒŃ‰ĐœĐŸŃŃ‚Đž, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€ "упраĐČĐ»ŃŃ‚ŃŒ" (ĐŽĐ»Ń аĐČŃ‚ĐŸĐŒĐŸĐ±ĐžĐ»Ń) ОлО "рДЎаĐșŃ‚ĐžŃ€ĐŸĐČать" (ĐŽĐ»Ń Đ±Đ»ĐŸĐłĐ°). -Đ—Đ°Ń‚Đ”ĐŒ ĐČы ĐŒĐŸĐłĐ»Đž бы ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ ŃŃ‚ĐŸŃ‚ JWT-Ń‚ĐŸĐșĐ”Đœ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČатДлю (ОлО Đ±ĐŸŃ‚Ńƒ), Đž ĐŸĐœĐž ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČалО бы Đ”ĐłĐŸ ĐŽĐ»Ń ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœĐžŃ ĐŸĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐœŃ‹Ń… ĐŽĐ”ĐčстĐČĐžĐč (упраĐČĐ»Đ”ĐœĐžĐ” аĐČŃ‚ĐŸĐŒĐŸĐ±ĐžĐ»Đ”ĐŒ ОлО рДЎаĐșŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐžĐ” Đ·Đ°ĐżĐžŃŃŒ ĐČ Đ±Đ»ĐŸĐłĐ”), ЎажД ĐœĐ” ĐžĐŒĐ”Ń ŃƒŃ‡Đ”Ń‚ĐœĐŸĐč запОсО, ĐżŃ€ĐŸŃŃ‚ĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ JWT-Ń‚ĐŸĐșĐ”Đœ, ŃĐłĐ”ĐœĐ”Ń€ĐžŃ€ĐŸĐČĐ°ĐœĐœŃ‹Đč ĐČĐ°ŃˆĐžĐŒ API. +Đ—Đ°Ń‚Đ”ĐŒ ĐČы ĐŒĐŸĐłĐ»Đž бы ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ ŃŃ‚ĐŸŃ‚ JWT-Ń‚ĐŸĐșĐ”Đœ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČатДлю (ОлО Đ±ĐŸŃ‚Ńƒ), Đž ĐŸĐœĐž ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČалО бы Đ”ĐłĐŸ ĐŽĐ»Ń ĐČŃ‹ĐżĐŸĐ»ĐœĐ”ĐœĐžŃ ĐŸĐżŃ€Đ”ĐŽĐ”Đ»Đ”ĐœĐœŃ‹Ń… ĐŽĐ”ĐčстĐČĐžĐč (упраĐČĐ»Đ”ĐœĐžĐ” аĐČŃ‚ĐŸĐŒĐŸĐ±ĐžĐ»Đ”ĐŒ ОлО рДЎаĐșŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐžĐ” запОсО ĐČ Đ±Đ»ĐŸĐłĐ”), ЎажД ĐœĐ” ĐžĐŒĐ”Ń ŃƒŃ‡Đ”Ń‚ĐœĐŸĐč запОсО, ĐżŃ€ĐŸŃŃ‚ĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ JWT-Ń‚ĐŸĐșĐ”Đœ, ŃĐłĐ”ĐœĐ”Ń€ĐžŃ€ĐŸĐČĐ°ĐœĐœŃ‹Đč ĐČĐ°ŃˆĐžĐŒ API. Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ это ОЎДО, JWT ĐŒĐŸĐ¶ĐœĐŸ ĐżŃ€ĐžĐŒĐ”ĐœŃŃ‚ŃŒ ĐŽĐ»Ń ĐłĐŸŃ€Đ°Đ·ĐŽĐŸ Đ±ĐŸĐ»Đ”Đ” ŃĐ»ĐŸĐ¶ĐœŃ‹Ń… ŃŃ†Đ”ĐœĐ°Ń€ĐžĐ”ĐČ. В ĐŸŃ‚ĐŽĐ”Đ»ŃŒĐœŃ‹Ń… ŃĐ»ŃƒŃ‡Đ°ŃŃ… ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ ŃŃƒŃ‰ĐœĐŸŃŃ‚Đ”Đč ĐŒĐŸĐłŃƒŃ‚ ĐžĐŒĐ”Ń‚ŃŒ ĐŸĐŽĐžĐœ Đž Ń‚ĐŸŃ‚ жД ĐžĐŽĐ”ĐœŃ‚ĐžŃ„ĐžĐșĐ°Ń‚ĐŸŃ€, сĐșĐ°Đ¶Đ”ĐŒ, `foo` (ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒ `foo`, аĐČŃ‚ĐŸĐŒĐŸĐ±ĐžĐ»ŃŒ `foo` Đž Đ·Đ°ĐżĐžŃŃŒ ĐČ Đ±Đ»ĐŸĐłĐ” `foo`). -ĐŸĐŸŃŃ‚ĐŸĐŒŃƒ, Ń‡Ń‚ĐŸĐ±Ń‹ ĐžĐ·Đ±Đ”Đ¶Đ°Ń‚ŃŒ ĐșĐŸĐ»Đ»ĐžĐ·ĐžĐč ĐžĐŽĐ”ĐœŃ‚ĐžŃ„ĐžĐșĐ°Ń‚ĐŸŃ€ĐŸĐČ, про ŃĐŸĐ·ĐŽĐ°ĐœĐžĐž JWT-Ń‚ĐŸĐșĐ”ĐœĐ° ĐŽĐ»Ń ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń ĐŒĐŸĐ¶ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČоть прДфОĐșс `username` Đș Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃŽ Đșлюча `sub`. йаĐșĐžĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ, ĐČ ĐŽĐ°ĐœĐœĐŸĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” `sub` Đ±Ń‹Đ»ĐŸ бы `username:johndoe`. +ĐŸĐŸŃŃ‚ĐŸĐŒŃƒ, Ń‡Ń‚ĐŸĐ±Ń‹ ĐžĐ·Đ±Đ”Đ¶Đ°Ń‚ŃŒ ĐșĐŸĐ»Đ»ĐžĐ·ĐžĐč ĐžĐŽĐ”ĐœŃ‚ĐžŃ„ĐžĐșĐ°Ń‚ĐŸŃ€ĐŸĐČ, про ŃĐŸĐ·ĐŽĐ°ĐœĐžĐž JWT-Ń‚ĐŸĐșĐ”ĐœĐ° ĐŽĐ»Ń ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń ĐŒĐŸĐ¶ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČоть прДфОĐșс `username:` Đș Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃŽ Đșлюча `sub`. йаĐșĐžĐŒ ĐŸĐ±Ń€Đ°Đ·ĐŸĐŒ, ĐČ ĐŽĐ°ĐœĐœĐŸĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ” Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” `sub` ĐŒĐŸĐłĐ»ĐŸ бы Đ±Ń‹Ń‚ŃŒ: `username:johndoe`. Đ’Đ°Đ¶ĐœĐŸ ĐżĐŸĐŒĐœĐžŃ‚ŃŒ, Ń‡Ń‚ĐŸ Đșлюч `sub` ĐŽĐŸĐ»Đ¶Đ”Đœ ĐžĐŒĐ”Ń‚ŃŒ ŃƒĐœĐžĐșĐ°Đ»ŃŒĐœŃ‹Đč ĐžĐŽĐ”ĐœŃ‚ĐžŃ„ĐžĐșĐ°Ń‚ĐŸŃ€ ĐŽĐ»Ń ĐČŃĐ”ĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ Đž прДЎстаĐČĐ»ŃŃ‚ŃŒ ŃĐŸĐ±ĐŸĐč ŃŃ‚Ń€ĐŸĐșу. @@ -238,7 +238,7 @@ Password: `secret` -/// note | ĐąĐ”Ń…ĐœĐžŃ‡Đ”ŃĐșая ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃ +/// note | ĐŸŃ€ĐžĐŒĐ”Ń‡Đ°ĐœĐžĐ” ОбратОтД ĐČĐœĐžĐŒĐ°ĐœĐžĐ” ĐœĐ° HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐŸĐș `Authorization`, Đ·ĐœĐ°Ń‡Đ”ĐœĐžĐ” ĐșĐŸŃ‚ĐŸŃ€ĐŸĐłĐŸ ĐœĐ°Ń‡ĐžĐœĐ°Đ”Ń‚ŃŃ с `Bearer `. diff --git a/docs/ru/docs/tutorial/security/simple-oauth2.md b/docs/ru/docs/tutorial/security/simple-oauth2.md index 415ef017b..5ce89730c 100644 --- a/docs/ru/docs/tutorial/security/simple-oauth2.md +++ b/docs/ru/docs/tutorial/security/simple-oauth2.md @@ -14,7 +14,7 @@ OAuth2 ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ŃĐ”Ń‚, Ń‡Ń‚ĐŸ про ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐž "password А ĐČашО ĐŒĐŸĐŽĐ”Đ»Đž баз ĐŽĐ°ĐœĐœŃ‹Ń… ĐŒĐŸĐłŃƒŃ‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать любыД ĐŽŃ€ŃƒĐłĐžĐ” ĐžĐŒĐ”ĐœĐ°. -ĐĐŸ ĐŽĐ»Ń Đ»ĐŸĐłĐžĐœ-ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо ĐœĐ°ĐŒ ĐœŃƒĐ¶ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐžĐŒĐ”ĐœĐœĐŸ это ĐžĐŒĐ”ĐœĐ°, Ń‡Ń‚ĐŸĐ±Ń‹ Đ±Ń‹Ń‚ŃŒ ŃĐŸĐČĐŒĐ”ŃŃ‚ĐžĐŒŃ‹ĐŒĐž ŃĐŸ спДцОфОĐșацОДĐč (Đž ĐžĐŒĐ”Ń‚ŃŒ ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐČŃŃ‚Ń€ĐŸĐ”ĐœĐœŃƒŃŽ ŃĐžŃŃ‚Đ”ĐŒŃƒ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž API). +ĐĐŸ ĐŽĐ»Ń *ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо* ĐČŃ…ĐŸĐŽĐ° ĐČ ŃĐžŃŃ‚Đ”ĐŒŃƒ ĐœĐ°ĐŒ ĐœŃƒĐ¶ĐœĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐžĐŒĐ”ĐœĐœĐŸ это ĐžĐŒĐ”ĐœĐ°, Ń‡Ń‚ĐŸĐ±Ń‹ Đ±Ń‹Ń‚ŃŒ ŃĐŸĐČĐŒĐ”ŃŃ‚ĐžĐŒŃ‹ĐŒĐž ŃĐŸ спДцОфОĐșацОДĐč (Đž ĐžĐŒĐ”Ń‚ŃŒ ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚ŃŒ, ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐČŃŃ‚Ń€ĐŸĐ”ĐœĐœŃƒŃŽ ŃĐžŃŃ‚Đ”ĐŒŃƒ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž API). В спДцОфОĐșацоо таĐșжД уĐșĐ°Đ·Đ°ĐœĐŸ, Ń‡Ń‚ĐŸ `username` Đž `password` ĐŽĐŸĐ»Đ¶ĐœŃ‹ пДрДЎаĐČаться ĐČ ĐČОЎД ĐŽĐ°ĐœĐœŃ‹Ń… Ń„ĐŸŃ€ĐŒŃ‹ (таĐș Ń‡Ń‚ĐŸ ĐœĐžĐșаĐșĐŸĐłĐŸ JSON Đ·ĐŽĐ”ŃŃŒ ĐœĐ”Ń‚). @@ -88,7 +88,7 @@ OAuth2 ĐŸĐżŃ€Đ”ĐŽĐ”Đ»ŃĐ”Ń‚, Ń‡Ń‚ĐŸ про ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐž "password ĐąĐ”ĐżĐ”Ń€ŃŒ ĐżĐŸĐ»ŃƒŃ‡ĐžĐŒ ĐŽĐ°ĐœĐœŃ‹Đ” ĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČатДлД Оз (ĐœĐ”ĐœĐ°ŃŃ‚ĐŸŃŃ‰Đ”Đč) базы ĐŽĐ°ĐœĐœŃ‹Ń…, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ `username` Оз ĐżĐŸĐ»Ń Ń„ĐŸŃ€ĐŒŃ‹. -ЕслО таĐșĐŸĐłĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń ĐœĐ”Ń‚, Ń‚ĐŸ ĐŒŃ‹ ĐČĐŸĐ·ĐČŃ€Đ°Ń‰Đ°Đ”ĐŒ ĐŸŃˆĐžĐ±Đșу "Incorrect username or password" (ĐœĐ”ĐČĐ”Ń€ĐœĐŸĐ” ĐžĐŒŃ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń ОлО ĐżĐ°Ń€ĐŸĐ»ŃŒ). +ЕслО таĐșĐŸĐłĐŸ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń ĐœĐ”Ń‚, Ń‚ĐŸ ĐŒŃ‹ ĐČĐŸĐ·ĐČŃ€Đ°Ń‰Đ°Đ”ĐŒ ĐŸŃˆĐžĐ±Đșу "Incorrect username or password". Đ”Đ»Ń ĐŸŃˆĐžĐ±ĐșĐž ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒ ОсĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐ” `HTTPException`: @@ -137,12 +137,12 @@ UserInDB( ``` /// note | ĐŸŃ€ĐžĐŒĐ”Ń‡Đ°ĐœĐžĐ” -Đ‘ĐŸĐ»Đ”Đ” ĐżĐŸĐ»ĐœĐŸĐ” ĐŸĐ±ŃŠŃŃĐœĐ”ĐœĐžĐ” `**user_dict` ĐŒĐŸĐ¶ĐœĐŸ ĐœĐ°Đčто ĐČ [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž Đș **Đ”ĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹ĐŒ ĐŒĐŸĐŽĐ”Đ»ŃĐŒ**](../extra-models.md#about-user-in-dict). +Đ‘ĐŸĐ»Đ”Đ” ĐżĐŸĐ»ĐœĐŸĐ” ĐŸĐ±ŃŠŃŃĐœĐ”ĐœĐžĐ” `**user_dict` ĐŒĐŸĐ¶ĐœĐŸ ĐœĐ°Đčто ĐČ [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž Đș **Đ”ĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹ĐŒ ĐŒĐŸĐŽĐ”Đ»ŃĐŒ**](../extra-models.md#about-user-in-model-dump). /// ## Đ’ĐŸĐ·ĐČрат Ń‚ĐŸĐșĐ”ĐœĐ° { #return-the-token } -ОтĐČДт ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐž путо `/token` ĐŽĐŸĐ»Đ¶Đ”Đœ Đ±Ń‹Ń‚ŃŒ ĐŸĐ±ŃŠĐ”ĐșŃ‚ĐŸĐŒ JSON. +ОтĐČДт ŃĐœĐŽĐżĐŸĐžĐœŃ‚Đ° `token` ĐŽĐŸĐ»Đ¶Đ”Đœ Đ±Ń‹Ń‚ŃŒ ĐŸĐ±ŃŠĐ”ĐșŃ‚ĐŸĐŒ JSON. В ĐœŃ‘ĐŒ ĐŽĐŸĐ»Đ¶Đ”Đœ Đ±Ń‹Ń‚ŃŒ `token_type`. В ĐœĐ°ŃˆĐ”ĐŒ ŃĐ»ŃƒŃ‡Đ°Đ”, ĐżĐŸŃĐșĐŸĐ»ŃŒĐșу ĐŒŃ‹ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”ĐŒ Ń‚ĐŸĐșĐ”ĐœŃ‹ топа "Bearer", топ Ń‚ĐŸĐșĐ”ĐœĐ° ĐŽĐŸĐ»Đ¶Đ”Đœ Đ±Ń‹Ń‚ŃŒ `bearer`. @@ -151,7 +151,7 @@ UserInDB( В ŃŃ‚ĐŸĐŒ ĐżŃ€ĐŸŃŃ‚ĐŸĐŒ ĐżŃ€ĐžĐŒĐ”Ń€Đ” ĐŒŃ‹ ĐœĐ°ĐŒĐ”Ń€Đ”ĐœĐœĐŸ ĐżĐŸŃŃ‚ŃƒĐżĐžĐŒ ĐœĐ”Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸ Đž ĐČĐ”Ń€ĐœŃ‘ĐŒ Ń‚ĐŸŃ‚ жД `username` ĐČ ĐșачДстĐČĐ” Ń‚ĐŸĐșĐ”ĐœĐ°. /// tip | ĐŸĐŸĐŽŃĐșазĐșа -В ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”Đč глаĐČĐ” ĐČы уĐČОЎОтД Ń€Đ”Đ°Đ»ŃŒĐœŃƒŃŽ Đ·Đ°Ń‰ĐžŃ‰Ń‘ĐœĐœŃƒŃŽ рДалОзацОю с Ń…Đ”ŃˆĐžŃ€ĐŸĐČĐ°ĐœĐžĐ”ĐŒ ĐżĐ°Ń€ĐŸĐ»Đ”Đč Đž Ń‚ĐŸĐșĐ”ĐœĐ°ĐŒĐž JWT. +В ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”Đč глаĐČĐ” ĐČы уĐČОЎОтД Ń€Đ”Đ°Đ»ŃŒĐœŃƒŃŽ Đ·Đ°Ń‰ĐžŃ‰Ń‘ĐœĐœŃƒŃŽ рДалОзацОю с Ń…Đ”ŃˆĐžŃ€ĐŸĐČĐ°ĐœĐžĐ”ĐŒ ĐżĐ°Ń€ĐŸĐ»Đ”Đč Đž Ń‚ĐŸĐșĐ”ĐœĐ°ĐŒĐž JWT. ĐĐŸ ĐżĐŸĐșа ЎаĐČаĐčтД ŃĐŸŃŃ€Đ”ĐŽĐŸŃ‚ĐŸŃ‡ĐžĐŒŃŃ ĐœĐ° ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒŃ‹Ń… ĐœĐ°ĐŒ ĐŽĐ”Ń‚Đ°Đ»ŃŃ…. /// @@ -266,8 +266,8 @@ UserInDB( ĐąĐ”ĐżĐ”Ń€ŃŒ у ĐČас Đ”ŃŃ‚ŃŒ ĐžĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń‹ ĐŽĐ»Ń рДалОзацОО ĐżĐŸĐ»ĐœĐŸŃ†Đ”ĐœĐœĐŸĐč ŃĐžŃŃ‚Đ”ĐŒŃ‹ Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž ĐœĐ° ĐŸŃĐœĐŸĐČĐ” `username` Đž `password` ĐŽĐ»Ń ĐČĐ°ŃˆĐ”ĐłĐŸ API. -Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ это срДЎстĐČа, ĐŒĐŸĐ¶ĐœĐŸ ŃĐŽĐ”Đ»Đ°Ń‚ŃŒ ŃĐžŃŃ‚Đ”ĐŒŃƒ Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž ŃĐŸĐČĐŒĐ”ŃŃ‚ĐžĐŒĐŸĐč с Đ»ŃŽĐ±ĐŸĐč Đ±Đ°Đ·ĐŸĐč ĐŽĐ°ĐœĐœŃ‹Ń… Đž с Đ»ŃŽĐ±ĐŸĐč ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»ŃŒŃĐșĐŸĐč ОлО ĐŒĐŸĐŽĐ”Đ»ŃŒŃŽ ĐŽĐ°ĐœĐœŃ‹Ń…. +Đ˜ŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ это срДЎстĐČа, ĐŒĐŸĐ¶ĐœĐŸ ŃĐŽĐ”Đ»Đ°Ń‚ŃŒ ŃĐžŃŃ‚Đ”ĐŒŃƒ Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž ŃĐŸĐČĐŒĐ”ŃŃ‚ĐžĐŒĐŸĐč с Đ»ŃŽĐ±ĐŸĐč Đ±Đ°Đ·ĐŸĐč ĐŽĐ°ĐœĐœŃ‹Ń… Đž с Đ»ŃŽĐ±ĐŸĐč ĐŒĐŸĐŽĐ”Đ»ŃŒŃŽ ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń ОлО ĐŒĐŸĐŽĐ”Đ»ŃŒŃŽ ĐŽĐ°ĐœĐœŃ‹Ń…. Đ•ĐŽĐžĐœŃŃ‚ĐČĐ”ĐœĐœĐ°Ń ĐŽĐ”Ń‚Đ°Đ»ŃŒ, ĐșĐŸŃ‚ĐŸŃ€ĐŸĐč ĐœĐ” хĐČатаДт, — ŃĐžŃŃ‚Đ”ĐŒĐ° ĐżĐŸĐșа Дщё ĐœĐ” "Đ·Đ°Ń‰ĐžŃ‰Đ”ĐœĐ°" ĐżĐŸ-ĐœĐ°ŃŃ‚ĐŸŃŃ‰Đ”ĐŒŃƒ. -В ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”Đč глаĐČĐ” ĐČы уĐČОЎОтД, ĐșаĐș ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșу Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸĐłĐŸ Ń…Đ”ŃˆĐžŃ€ĐŸĐČĐ°ĐœĐžŃ ĐżĐ°Ń€ĐŸĐ»Đ”Đč Đž Ń‚ĐŸĐșĐ”ĐœŃ‹ JWT. +В ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”Đč глаĐČĐ” ĐČы уĐČОЎОтД, ĐșаĐș ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșу Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸĐłĐŸ Ń…Đ”ŃˆĐžŃ€ĐŸĐČĐ°ĐœĐžŃ ĐżĐ°Ń€ĐŸĐ»Đ”Đč Đž Ń‚ĐŸĐșĐ”ĐœŃ‹ JWT. diff --git a/docs/ru/docs/tutorial/sql-databases.md b/docs/ru/docs/tutorial/sql-databases.md index ae8637338..bf2e16fb9 100644 --- a/docs/ru/docs/tutorial/sql-databases.md +++ b/docs/ru/docs/tutorial/sql-databases.md @@ -1,6 +1,6 @@ # SQL (Ń€Đ”Đ»ŃŃ†ĐžĐŸĐœĐœŃ‹Đ”) базы ĐŽĐ°ĐœĐœŃ‹Ń… { #sql-relational-databases } -**FastAPI** ĐœĐ” Ń‚Ń€Đ”Đ±ŃƒĐ”Ń‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать SQL (Ń€Đ”Đ»ŃŃ†ĐžĐŸĐœĐœŃƒŃŽ) базу ĐŽĐ°ĐœĐœŃ‹Ń…. ĐĐŸ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ»ŃŽĐ±ŃƒŃŽ базу ĐŽĐ°ĐœĐœŃ‹Ń…, ĐșĐŸŃ‚ĐŸŃ€ŃƒŃŽ Ń…ĐŸŃ‚ĐžŃ‚Đ”. +**FastAPI** ĐœĐ” Ń‚Ń€Đ”Đ±ŃƒĐ”Ń‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать SQL (Ń€Đ”Đ»ŃŃ†ĐžĐŸĐœĐœŃƒŃŽ) базу ĐŽĐ°ĐœĐœŃ‹Ń…. ĐĐŸ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать **Đ»ŃŽĐ±ŃƒŃŽ базу ĐŽĐ°ĐœĐœŃ‹Ń…**, ĐșĐŸŃ‚ĐŸŃ€ŃƒŃŽ Ń…ĐŸŃ‚ĐžŃ‚Đ”. Đ—ĐŽĐ”ŃŃŒ ĐŒŃ‹ Ń€Đ°ŃŃĐŒĐŸŃ‚Ń€ĐžĐŒ ĐżŃ€ĐžĐŒĐ”Ń€ с ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ”ĐŒ [SQLModel](https://sqlmodel.tiangolo.com/). @@ -8,7 +8,7 @@ /// tip | ĐŸĐŸĐŽŃĐșазĐșа -Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ»ŃŽĐ±ŃƒŃŽ Юругую Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșу ĐŽĐ»Ń Ń€Đ°Đ±ĐŸŃ‚Ń‹ с SQL ОлО NoSQL Đ±Đ°Đ·Đ°ĐŒĐž ĐŽĐ°ĐœĐœŃ‹Ń… (ĐžĐœĐŸĐłĐŽĐ° ох ĐœĐ°Đ·Ń‹ĐČают "ORMs"), FastAPI ĐœĐžŃ‡Đ”ĐłĐŸ ĐœĐ” ĐœĐ°ĐČŃĐ·Ń‹ĐČаДт. 😎 +Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Đ»ŃŽĐ±ŃƒŃŽ Юругую Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đșу ĐŽĐ»Ń Ń€Đ°Đ±ĐŸŃ‚Ń‹ с SQL ОлО NoSQL Đ±Đ°Đ·Đ°ĐŒĐž ĐŽĐ°ĐœĐœŃ‹Ń… (ĐžĐœĐŸĐłĐŽĐ° ох ĐœĐ°Đ·Ń‹ĐČают "ORMs"), FastAPI ĐœĐžŃ‡Đ”ĐłĐŸ ĐœĐ” ĐœĐ°ĐČŃĐ·Ń‹ĐČаДт. 😎 /// @@ -119,7 +119,7 @@ $ pip install sqlmodel йаĐș ĐșаĐș ĐșĐ°Đ¶ĐŽĐ°Ń ĐŒĐŸĐŽĐ”Đ»ŃŒ SQLModel таĐșжД яĐČĐ»ŃĐ”Ń‚ŃŃ ĐŒĐŸĐŽĐ”Đ»ŃŒŃŽ Pydantic, ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать Дё ĐČ Ń‚Đ”Ń… жД **Đ°ĐœĐœĐŸŃ‚Đ°Ń†ĐžŃŃ… Ń‚ĐžĐżĐŸĐČ**, ĐČ ĐșĐŸŃ‚ĐŸŃ€Ń‹Ń… ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚Đ” ĐŒĐŸĐŽĐ”Đ»Đž Pydantic. -ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ДслО ĐČы ĐŸĐ±ŃŠŃĐČОтД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ топа `Hero`, ĐŸĐœ Đ±ŃƒĐŽĐ”Ń‚ ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Đœ Оз **JSON body (тДла Đ·Đ°ĐżŃ€ĐŸŃĐ°)**. +ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ДслО ĐČы ĐŸĐ±ŃŠŃĐČОтД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ топа `Hero`, ĐŸĐœ Đ±ŃƒĐŽĐ”Ń‚ ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Đœ Оз **JSON-тДла Đ·Đ°ĐżŃ€ĐŸŃĐ°**. ĐĐœĐ°Đ»ĐŸĐłĐžŃ‡ĐœĐŸ ĐČы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±ŃŠŃĐČоть Дё ĐșаĐș **топ ĐČĐŸĐ·ĐČŃ€Đ°Ń‰Đ°Đ”ĐŒĐŸĐłĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐžŃ** Ń„ŃƒĐœĐșцоо, Đž Ń‚ĐŸĐłĐŽĐ° Ń„ĐŸŃ€ĐŒĐ° ĐŽĐ°ĐœĐœŃ‹Ń… ĐŸŃ‚ĐŸĐ±Ń€Đ°Đ·ĐžŃ‚ŃŃ ĐČ Đ°ĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž ŃĐłĐ”ĐœĐ”Ń€ĐžŃ€ĐŸĐČĐ°ĐœĐœĐŸĐŒ UI ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžĐž API. diff --git a/docs/ru/docs/tutorial/static-files.md b/docs/ru/docs/tutorial/static-files.md index dfcc77b6f..84084ffac 100644 --- a/docs/ru/docs/tutorial/static-files.md +++ b/docs/ru/docs/tutorial/static-files.md @@ -2,6 +2,14 @@ Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€Đ”ĐŽĐŸŃŃ‚Đ°ĐČĐ»ŃŃ‚ŃŒ статОчДсĐșОД фаĐčлы аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž Оз ЎОрДĐșŃ‚ĐŸŃ€ĐžĐž, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒŃ `StaticFiles`. +/// tip | ĐĄĐŸĐČДт + +ЕслО ĐČĐ°ĐŒ ĐœŃƒĐ¶ĐœĐŸ Ń€Đ°Đ·ĐŒĐ”ŃŃ‚ĐžŃ‚ŃŒ Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ, ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД ĐČĐŒĐ”ŃŃ‚ĐŸ ŃŃ‚ĐŸĐłĐŸ `app.frontend()`, ĐżĐŸĐŽŃ€ĐŸĐ±ĐœĐ”Đ” чотаĐčтД ĐČ Ń€Đ°Đ·ĐŽĐ”Đ»Đ” [Đ€Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ](frontend.md). + +`app.frontend()` ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐ”Ń‚ `StaticFiles` ĐżĐŸĐŽ ĐșĐ°ĐżĐŸŃ‚ĐŸĐŒ, с ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐžĐŒĐž ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹ĐŒĐž ĐżŃ€Đ”ĐžĐŒŃƒŃ‰Đ”ŃŃ‚ĐČĐ°ĐŒĐž ĐŽĐ»Ń Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐŸĐČ, таĐșĐžĐŒĐž ĐșаĐș ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚Đșа ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†ĐžĐž ĐœĐ° ŃŃ‚ĐŸŃ€ĐŸĐœĐ” ĐșĐ»ĐžĐ”ĐœŃ‚Đ°. + +/// + ## Đ˜ŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐ” `StaticFiles` { #use-staticfiles } * Đ˜ĐŒĐżĐŸŃ€Ń‚ĐžŃ€ŃƒĐčтД `StaticFiles`. @@ -21,8 +29,7 @@ "ĐœĐŸĐœŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐžĐ”" ĐŸĐ·ĐœĐ°Ń‡Đ°Đ”Ń‚ ĐŽĐŸĐ±Đ°ĐČĐ»Đ”ĐœĐžĐ” ĐżĐŸĐ»ĐœĐŸŃ†Đ”ĐœĐœĐŸĐłĐŸ "ĐœĐ”Đ·Đ°ĐČĐžŃĐžĐŒĐŸĐłĐŸ" ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ ĐœĐ° ĐŸĐżŃ€Đ”ĐŽĐ”Đ»Ń‘ĐœĐœŃ‹Đč путь, ĐșĐŸŃ‚ĐŸŃ€ĐŸĐ” Đ·Đ°Ń‚Đ”ĐŒ ĐŸĐ±Ń€Đ°Đ±Đ°Ń‚Ń‹ĐČаДт ĐČсД ĐżĐŸĐŽĐżŃƒŃ‚Đž. -Đ­Ń‚ĐŸ ĐŸŃ‚Đ»ĐžŃ‡Đ°Đ”Ń‚ŃŃ ĐŸŃ‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžŃ `APIRouter`, таĐș ĐșаĐș ĐżŃ€ĐžĐŒĐŸĐœŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐœĐŸĐ” ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” яĐČĐ»ŃĐ”Ń‚ŃŃ ĐżĐŸĐ»ĐœĐŸŃŃ‚ŃŒŃŽ ĐœĐ”Đ·Đ°ĐČĐžŃĐžĐŒŃ‹ĐŒ. -OpenAPI Đž ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃ Оз ĐČĐ°ŃˆĐ”ĐłĐŸ глаĐČĐœĐŸĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ ĐœĐ” Đ±ŃƒĐŽŃƒŃ‚ ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ŃŒ ĐœĐžŃ‡Đ”ĐłĐŸ Оз ĐżŃ€ĐžĐŒĐŸĐœŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐœĐŸĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ, Đž т.ĐŽ. +Đ­Ń‚ĐŸ ĐŸŃ‚Đ»ĐžŃ‡Đ°Đ”Ń‚ŃŃ ĐŸŃ‚ ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžŃ `APIRouter`, таĐș ĐșаĐș ĐżŃ€ĐžĐŒĐŸĐœŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐœĐŸĐ” ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” яĐČĐ»ŃĐ”Ń‚ŃŃ ĐżĐŸĐ»ĐœĐŸŃŃ‚ŃŒŃŽ ĐœĐ”Đ·Đ°ĐČĐžŃĐžĐŒŃ‹ĐŒ. OpenAPI Đž ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†ĐžŃ Оз ĐČĐ°ŃˆĐ”ĐłĐŸ глаĐČĐœĐŸĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ ĐœĐ” Đ±ŃƒĐŽŃƒŃ‚ ŃĐŸĐŽĐ”Ń€Đ¶Đ°Ń‚ŃŒ ĐœĐžŃ‡Đ”ĐłĐŸ Оз ĐżŃ€ĐžĐŒĐŸĐœŃ‚ĐžŃ€ĐŸĐČĐ°ĐœĐœĐŸĐłĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ, Đž т.ĐŽ. Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Ń‚ŃŒ Đ±ĐŸĐ»ŃŒŃˆĐ” ĐŸĐ± ŃŃ‚ĐŸĐŒ ĐČ [Đ Đ°ŃŃˆĐžŃ€Đ”ĐœĐœĐŸĐŒ руĐșĐŸĐČĐŸĐŽŃŃ‚ĐČĐ” ĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°Ń‚Đ”Đ»Ń](../advanced/index.md). diff --git a/docs/ru/docs/tutorial/testing.md b/docs/ru/docs/tutorial/testing.md index f7367bcba..d6038a3de 100644 --- a/docs/ru/docs/tutorial/testing.md +++ b/docs/ru/docs/tutorial/testing.md @@ -90,7 +90,7 @@ $ pip install httpx │   └── test_main.py ``` -йаĐș ĐșаĐș ĐŸĐ±Đ° фаĐčла ĐœĐ°Ń…ĐŸĐŽŃŃ‚ŃŃ ĐČ ĐŸĐŽĐœĐŸĐč ЎОрДĐșŃ‚ĐŸŃ€ĐžĐž, ĐŽĐ»Ń ĐžĐŒĐżĐŸŃ€Ń‚Đ° ĐŸĐ±ŃŠĐ”Đșта ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ Оз фаĐčла `main` ĐČ Ń„Đ°ĐčĐ» `test_main` Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐŸŃ‚ĐœĐŸŃĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đč ĐžĐŒĐżĐŸŃ€Ń‚: +йаĐș ĐșаĐș ŃŃ‚ĐŸŃ‚ фаĐčĐ» ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŃ ĐČ Ń‚ĐŸĐŒ жД паĐșДтД, ĐŽĐ»Ń ĐžĐŒĐżĐŸŃ€Ń‚Đ° ĐŸĐ±ŃŠĐ”Đșта `app` Оз ĐŒĐŸĐŽŃƒĐ»Ń `main` (`main.py`) Вы ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČать ĐŸŃ‚ĐœĐŸŃĐžŃ‚Đ”Đ»ŃŒĐœŃ‹Đč ĐžĐŒĐżĐŸŃ€Ń‚: {* ../../docs_src/app_testing/app_a_py310/test_main.py hl[3] *} @@ -113,7 +113,7 @@ $ pip install httpx │   └── test_main.py ``` -ĐŸŃ€Đ”ĐŽĐżĐŸĐ»ĐŸĐ¶ĐžĐŒ, Ń‡Ń‚ĐŸ ĐČ Ń„Đ°ĐčлД `main.py` с ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”ĐŒ **FastAPI** Đ”ŃŃ‚ŃŒ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ **ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐč путо**. +ĐŸŃ€Đ”ĐŽĐżĐŸĐ»ĐŸĐ¶ĐžĐŒ, Ń‡Ń‚ĐŸ Ń‚Đ”ĐżĐ”Ń€ŃŒ ĐČ Ń„Đ°ĐčлД `main.py` с ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”ĐŒ **FastAPI** Đ”ŃŃ‚ŃŒ ĐœĐ”ŃĐșĐŸĐ»ŃŒĐșĐŸ Юругох **ĐŸĐżĐ”Ń€Đ°Ń†ĐžĐč путо**. В ĐœŃ‘ĐŒ ĐŸĐżĐžŃĐ°ĐœĐ° ĐŸĐżĐ”Ń€Đ°Ń†ĐžŃ `GET`, ĐșĐŸŃ‚ĐŸŃ€Đ°Ń ĐŒĐŸĐ¶Đ”Ń‚ ĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ ĐŸŃˆĐžĐ±Đșу. @@ -125,20 +125,20 @@ $ pip install httpx ### Đ Đ°ŃŃˆĐžŃ€Đ”ĐœĐœŃ‹Đč фаĐčĐ» Ń‚Đ”ŃŃ‚ĐŸĐČ { #extended-testing-file } -ĐąĐ”ĐżĐ”Ń€ŃŒ ĐŸĐ±ĐœĐŸĐČĐžĐŒ фаĐčĐ» `test_main.py`, ĐŽĐŸĐ±Đ°ĐČĐžĐČ ĐČ ĐœĐ”ĐłĐŸ Ń‚Đ”ŃŃ‚ĐŸĐČ: +ĐąĐ”ĐżĐ”Ń€ŃŒ ĐŒĐŸĐ¶ĐœĐŸ ĐŸĐ±ĐœĐŸĐČоть фаĐčĐ» `test_main.py`, ĐŽĐŸĐ±Đ°ĐČĐžĐČ ĐČ ĐœĐ”ĐłĐŸ Ń€Đ°ŃŃˆĐžŃ€Đ”ĐœĐœŃ‹Đ” тДсты: {* ../../docs_src/app_testing/app_b_an_py310/test_main.py *} -ЕслО Вы ĐœĐ” Đ·ĐœĐ°Đ”Ń‚Đ”, ĐșаĐș ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃŽ ĐČ Đ·Đ°ĐżŃ€ĐŸŃĐ”, ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐŸŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČаться ĐżĐŸĐžŃĐșĐŸĐČĐžĐșĐŸĐŒ (ĐżĐŸĐłŃƒĐłĐ»ĐžŃ‚ŃŒ) Đž Đ·Đ°ĐŽĐ°Ń‚ŃŒ ĐČĐŸĐżŃ€ĐŸŃ: "КаĐș ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃŽ ĐČ Đ·Đ°ĐżŃ€ĐŸŃĐ” с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `httpx`", ĐŒĐŸĐ¶ĐœĐŸ ЎажД ŃĐżŃ€ĐŸŃĐžŃ‚ŃŒ: "КаĐș ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃŽ ĐČ Đ·Đ°ĐżŃ€ĐŸŃĐ” с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `requests`", ĐżĐŸŃĐșĐŸĐ»ŃŒĐșу ЎОзаĐčĐœ HTTPX ĐŸŃĐœĐŸĐČĐ°Đœ ĐœĐ° ЎОзаĐčĐœĐ” Requests. +ЕслО Вы ĐœĐ” Đ·ĐœĐ°Đ”Ń‚Đ”, ĐșаĐș ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃŽ ĐČ Đ·Đ°ĐżŃ€ĐŸŃĐ”, ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐŸŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČаться ĐżĐŸĐžŃĐșĐŸĐŒ (Google) Đž Đ·Đ°ĐŽĐ°Ń‚ŃŒ ĐČĐŸĐżŃ€ĐŸŃ: "КаĐș ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃŽ ĐČ Đ·Đ°ĐżŃ€ĐŸŃĐ” с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `httpx`", ĐŒĐŸĐ¶ĐœĐŸ ЎажД ŃĐżŃ€ĐŸŃĐžŃ‚ŃŒ: "КаĐș ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ ĐžĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžŃŽ ĐČ Đ·Đ°ĐżŃ€ĐŸŃĐ” с ĐżĐŸĐŒĐŸŃ‰ŃŒŃŽ `requests`", ĐżĐŸŃĐșĐŸĐ»ŃŒĐșу ЎОзаĐčĐœ HTTPX ĐŸŃĐœĐŸĐČĐ°Đœ ĐœĐ° ЎОзаĐčĐœĐ” Requests. Đ—Đ°Ń‚Đ”ĐŒ Вы ĐżŃ€ĐŸŃŃ‚ĐŸ ĐżŃ€ĐžĐŒĐ”ĐœŃĐ”Ń‚Đ” ĐœĐ°ĐčĐŽĐ”ĐœĐœŃ‹Đ” ĐŸŃ‚ĐČДты ĐČ Ń‚Đ”ŃŃ‚Đ°Ń…. ĐĐ°ĐżŃ€ĐžĐŒĐ”Ń€: -* ĐŸĐ”Ń€Đ”ĐŽĐ°Ń‘Ń‚Đ” *path*-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ ОлО *query*-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹, ĐČпОсаĐČ ĐžŃ… ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ ĐČ ŃŃ‚Ń€ĐŸĐșу URL. +* Đ§Ń‚ĐŸĐ±Ń‹ ĐżĐ”Ń€Đ”ĐŽĐ°Ń‚ŃŒ *path*-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ОлО *query*-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€, ĐŽĐŸĐ±Đ°ĐČŃŒŃ‚Đ” Đ”ĐłĐŸ ĐœĐ”ĐżĐŸŃŃ€Đ”ĐŽŃŃ‚ĐČĐ”ĐœĐœĐŸ ĐČ URL. * ĐŸĐ”Ń€Đ”ĐŽĐ°Ń‘Ń‚Đ” JSON ĐČ Ń‚Đ”Đ»Đ” Đ·Đ°ĐżŃ€ĐŸŃĐ°, пДрДЎаĐČ Python-ĐŸĐ±ŃŠĐ”Đșт (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€: `dict`) чДрДз ĐžĐŒĐ”ĐœĐŸĐČĐ°ĐœĐœŃ‹Đč ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `json`. -* ЕслО жД Đ’Đ°ĐŒ ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒĐŸ ĐŸŃ‚ĐżŃ€Đ°ĐČоть *Ń„ĐŸŃ€ĐŒŃƒ с ĐŽĐ°ĐœĐœŃ‹ĐŒĐž* ĐČĐŒĐ”ŃŃ‚ĐŸ JSON, Ń‚ĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `data` ĐČĐŒĐ”ŃŃ‚ĐŸ `json`. +* ЕслО жД Đ’Đ°ĐŒ ĐœĐ”ĐŸĐ±Ń…ĐŸĐŽĐžĐŒĐŸ ĐŸŃ‚ĐżŃ€Đ°ĐČоть *ĐŽĐ°ĐœĐœŃ‹Đ” Ń„ĐŸŃ€ĐŒŃ‹* ĐČĐŒĐ”ŃŃ‚ĐŸ JSON, Ń‚ĐŸ ĐžŃĐżĐŸĐ»ŃŒĐ·ŃƒĐčтД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `data` ĐČĐŒĐ”ŃŃ‚ĐŸ `json`. * Đ”Đ»Ń пДрДЎачО *HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐŸĐČ*, пДрДЎаĐčтД ĐŸĐ±ŃŠĐ”Đșт `dict` чДрДз ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `headers`. * Đ”Đ»Ń пДрДЎачО *cookies* таĐșжД пДрДЎаĐčтД `dict`, ĐœĐŸ чДрДз ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `cookies`. diff --git a/docs/ru/docs/virtual-environments.md b/docs/ru/docs/virtual-environments.md index 119f3645e..b7c750842 100644 --- a/docs/ru/docs/virtual-environments.md +++ b/docs/ru/docs/virtual-environments.md @@ -811,7 +811,7 @@ $ cd ~/code/prisoner-of-azkaban $ python main.py -// Error importing sirius, it's not installed đŸ˜± +// ĐžŃˆĐžĐ±Đșа про ĐžĐŒĐżĐŸŃ€Ń‚Đ” sirius, ĐŸĐœ ĐœĐ” ŃƒŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”Đœ đŸ˜± Traceback (most recent call last): File "main.py", line 1, in import sirius From 6c0df1738dc8893e6415ec7c58251898bd63a7a0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 12:52:28 +0000 Subject: [PATCH 268/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index edbcb6e10..9473c1b7e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for ru (update-outdated). PR [#15894](https://github.com/fastapi/fastapi/pull/15894) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ko (add-missing). PR [#15888](https://github.com/fastapi/fastapi/pull/15888) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for es (add-missing). PR [#15880](https://github.com/fastapi/fastapi/pull/15880) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for zh-hant (add-missing). PR [#15889](https://github.com/fastapi/fastapi/pull/15889) by [@tiangolo](https://github.com/tiangolo). From 3b7cb60067b982ac682a21485ee413fe89832d80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 15:16:28 +0200 Subject: [PATCH 269/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20ko=20(update-outdated)=20(#15890)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] Co-authored-by: Yurii Motov --- docs/ko/docs/_llm-test.md | 12 +-- .../docs/advanced/additional-status-codes.md | 2 +- .../ko/docs/advanced/advanced-dependencies.md | 2 +- docs/ko/docs/advanced/dataclasses.md | 2 +- docs/ko/docs/advanced/events.md | 14 +-- docs/ko/docs/advanced/generate-clients.md | 14 --- docs/ko/docs/advanced/json-base64-bytes.md | 2 +- docs/ko/docs/advanced/openapi-callbacks.md | 2 +- .../advanced/response-change-status-code.md | 1 + docs/ko/docs/advanced/response-cookies.md | 2 +- docs/ko/docs/advanced/response-headers.md | 1 + .../docs/advanced/security/oauth2-scopes.md | 4 +- docs/ko/docs/advanced/settings.md | 1 + docs/ko/docs/advanced/stream-data.md | 18 ++-- docs/ko/docs/advanced/wsgi.md | 2 +- docs/ko/docs/alternatives.md | 46 +++++----- docs/ko/docs/async.md | 1 + docs/ko/docs/deployment/cloud.md | 4 +- docs/ko/docs/deployment/concepts.md | 10 +-- docs/ko/docs/deployment/docker.md | 36 ++++---- docs/ko/docs/deployment/https.md | 2 +- docs/ko/docs/deployment/manually.md | 12 +-- docs/ko/docs/editor-support.md | 1 + docs/ko/docs/environment-variables.md | 1 + docs/ko/docs/features.md | 8 +- docs/ko/docs/help-fastapi.md | 1 + docs/ko/docs/how-to/configure-swagger-ui.md | 2 +- .../docs/how-to/custom-request-and-route.md | 1 + docs/ko/docs/how-to/graphql.md | 2 +- ...migrate-from-pydantic-v1-to-pydantic-v2.md | 18 ++++ .../docs/how-to/separate-openapi-schemas.md | 2 +- docs/ko/docs/index.md | 10 +-- docs/ko/docs/project-generation.md | 1 + docs/ko/docs/python-types.md | 4 +- docs/ko/docs/tutorial/bigger-applications.md | 90 +++++++++---------- docs/ko/docs/tutorial/body-nested-models.md | 2 +- docs/ko/docs/tutorial/body.md | 10 +-- docs/ko/docs/tutorial/debugging.md | 4 +- .../dependencies/dependencies-with-yield.md | 19 ++-- docs/ko/docs/tutorial/extra-data-types.md | 1 + docs/ko/docs/tutorial/extra-models.md | 8 +- docs/ko/docs/tutorial/first-steps.md | 29 +++--- docs/ko/docs/tutorial/handling-errors.md | 1 + docs/ko/docs/tutorial/index.md | 1 + docs/ko/docs/tutorial/metadata.md | 4 +- .../tutorial/path-operation-configuration.md | 1 + .../tutorial/query-params-str-validations.md | 4 +- docs/ko/docs/tutorial/query-params.md | 1 + docs/ko/docs/tutorial/request-files.md | 4 +- docs/ko/docs/tutorial/request-forms.md | 1 + docs/ko/docs/tutorial/response-status-code.md | 1 + docs/ko/docs/tutorial/schema-extra-example.md | 2 +- docs/ko/docs/tutorial/security/first-steps.md | 1 + .../tutorial/security/get-current-user.md | 2 +- docs/ko/docs/tutorial/security/oauth2-jwt.md | 1 + .../docs/tutorial/security/simple-oauth2.md | 6 +- docs/ko/docs/tutorial/sql-databases.md | 1 + docs/ko/docs/tutorial/static-files.md | 8 ++ docs/ko/docs/tutorial/testing.md | 8 +- docs/ko/docs/virtual-environments.md | 1 + 60 files changed, 243 insertions(+), 209 deletions(-) diff --git a/docs/ko/docs/_llm-test.md b/docs/ko/docs/_llm-test.md index ea22d6191..9e9d0ee73 100644 --- a/docs/ko/docs/_llm-test.md +++ b/docs/ko/docs/_llm-test.md @@ -7,11 +7,11 @@ ì‚Źìš© ë°©ëČ•ì€ ë‹€ìŒêłŒ 같슔니닀: * ì–žì–Žëł„ 프롬프튾 `docs/{language code}/llm-prompt.md`넌 쀀ëč„합니닀. -* 읎 ëŹžì„œë„Œ 원하는 대상 ì–žì–ŽëĄœ ìƒˆëĄœ ëČˆì—­í•©ë‹ˆë‹€(예: `translate.py`의 `translate-page` ëȘ…ë č). ê·žëŸŹë©Ž `docs/{language code}/docs/_llm-test.md` 아래에 ëČˆì—­ìŽ 생성됩니닀. +* 읎 ëŹžì„œë„Œ 원하는 대상 ì–žì–ŽëĄœ ìƒˆëĄœ ëČˆì—­í•©ë‹ˆë‹€(예: `translate.py`의 `translate-page` ëȘ…ë čì–Ž). ê·žëŸŹë©Ž `docs/{language code}/docs/_llm-test.md` 아래에 ëČˆì—­ìŽ 생성됩니닀. * ëČˆì—­ì—ì„œ ëŹžì œê°€ 없는지 확읞합니닀. * 필요하닀멎 ì–žì–Žëł„ 프롬프튾, 음반 프롬프튾, 또는 영얎 ëŹžì„œë„Œ 개선합니닀. * 귞런 닀음 ëČˆì—­ì—ì„œ 낚아 있는 ëŹžì œë„Œ ìˆ˜ë™ìœŒëĄœ 수정핎 ìą‹ì€ ëČˆì—­ìŽ 되êȌ 합니닀. -* ìą‹ì€ ëČˆì—­ì„ 둔 상태에서 닀시 ëČˆì—­í•©ë‹ˆë‹€. 읎상적읞 êČ°êłŒëŠ” LLM읎 더 읎상 ëČˆì—­ì— 변êČœì„ 만듀지 않는 êČƒìž…ë‹ˆë‹€. 읎는 음반 í”„ëĄŹí”„íŠžì™€ ì–žì–Žëł„ í”„ëĄŹí”„íŠžê°€ 가늄한 한 씜선읎띌는 뜻입니닀(때때로 ëȘ‡ 가지 seemingly random 변êČœì„ 할 수 있는데, ê·ž 읎유는 [LLM은 êČ°ì •ëĄ ì  ì•Œêł ëŠŹìŠ˜ìŽ 아니Ʞ 때묾](https://doublespeak.chat/#/handbook#deterministic-output)입니닀). +* ìą‹ì€ ëČˆì—­ì„ 둔 상태에서 닀시 ëČˆì—­í•©ë‹ˆë‹€. 읎상적읞 êČ°êłŒëŠ” LLM읎 더 읎상 ëČˆì—­ì— 변êČœì„ 만듀지 않는 êČƒìž…ë‹ˆë‹€. 읎는 음반 í”„ëĄŹí”„íŠžì™€ ì–žì–Žëł„ í”„ëĄŹí”„íŠžê°€ 가늄한 한 씜선읎띌는 뜻입니닀(때때로 ëȘ‡ 가지 êČ‰ëłŽêž°ì— ëŹŽìž‘ìœ„ìž 변êČœì„ 할 수 있는데, ê·ž 읎유는 [LLM은 êČ°ì •ëĄ ì  ì•Œêł ëŠŹìŠ˜ìŽ 아니Ʞ 때묾](https://doublespeak.chat/#/handbook#deterministic-output)입니닀). 테슀튞: @@ -150,7 +150,7 @@ works(foo="bar") # 읎걎 동작합니닀 🎉 íƒ­êłŒ `Info`/`Note`/`Warning`/등의 ëž”ëĄì€ 제ëȘ© ëČˆì—­ì„ 수직 막대(`|`) 뒀에 추가핎알 합니닀. -`scripts/translate.py`의 음반 í”„ëĄŹí”„íŠžì—ì„œ `### Special blocks`와 `### Tab blocks` 석션을 ì°žêł í•˜ì„žìš”. +`scripts/translate.py`의 음반 í”„ëĄŹí”„íŠžì—ì„œ `### Special blocks`와 `### Tab blocks` ì„č션을 ì°žêł í•˜ì„žìš”. //// @@ -240,7 +240,7 @@ works(foo="bar") # 읎걎 동작합니닀 🎉 `scripts/translate.py`의 음반 í”„ëĄŹí”„íŠžì—ì„œ `### Headings` ì„č션을 ì°žêł í•˜ì„žìš”. -ì–žì–Žëł„ 지ìčšì€ 예넌 듀얎 `docs/de/llm-prompt.md`의 `### Headings` 석션을 ì°žêł í•˜ì„žìš”. +ì–žì–Žëł„ 지ìčšì€ 예넌 듀얎 `docs/de/llm-prompt.md`의 `### Headings` ì„č션을 ì°žêł í•˜ì„žìš”. //// @@ -289,7 +289,7 @@ works(foo="bar") # 읎걎 동작합니닀 🎉 * ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ 서ëč™í•˜ë‹€ * 페읎지넌 서ëč™í•˜ë‹€ -* 앱 +* ì• í”ŒëŠŹìŒ€ìŽì…˜ * ì• í”ŒëŠŹìŒ€ìŽì…˜ * 요ìČ­ @@ -490,6 +490,6 @@ works(foo="bar") # 읎걎 동작합니닀 🎉 읎êČƒì€ ëŹžì„œì—ì„œ ëłŽìŽëŠ” (대부분) Ʞ술 용얎의 ë¶ˆì™„ì „í•˜êł  ëč„ê·œëČ”ì ìž ëȘ©ëĄìž…니닀. 프롬프튾 ì„€êł„ìžê°€ ì–Žë–€ 용얎에 대핮 LLM에 추가적읞 도움읎 필요한지 파악하는 데 유용할 수 있슔니닀. 예넌 듀얎, ìą‹ì€ ëČˆì—­ì„ êł„ì† 덜 ìą‹ì€ ëČˆì—­ìœŒëĄœ 되돌멮 때, 또는 얞얎에서 용얎의 활용/ëł€í™”ë„Œ ìȘ멬하는 데 ëŹžì œê°€ 있을 때 도움읎 됩니닀. -예넌 듀얎 `docs/de/llm-prompt.md`의 `### List of English terms and their preferred German translations` 석션을 ì°žêł í•˜ì„žìš”. +예넌 듀얎 `docs/de/llm-prompt.md`의 `### List of English terms and their preferred German translations` ì„č션을 ì°žêł í•˜ì„žìš”. //// diff --git a/docs/ko/docs/advanced/additional-status-codes.md b/docs/ko/docs/advanced/additional-status-codes.md index 6251b68b2..4762c8eed 100644 --- a/docs/ko/docs/advanced/additional-status-codes.md +++ b/docs/ko/docs/advanced/additional-status-codes.md @@ -8,7 +8,7 @@ êž°ëłž 상태 윔드와 별도로 추가 상태 윔드넌 반환하렀멎 `JSONResponse`와 같읎 `Response`넌 직접 ë°˜í™˜í•˜êł  추가 상태 윔드넌 직접 섀정할 수 있슔니닀. -예넌 듀얎 항ëȘ©ì„ 업데읎튞할 수 있는 *êČœëĄœ ìȘ늏*가 ìžˆêł  ì„±êł” 시 200 “OK”의 HTTP 상태 윔드넌 ë°˜í™˜í•œë‹€êł  가정핎 볎êČ ìŠ”ë‹ˆë‹€. +예넌 듀얎 항ëȘ©ì„ 업데읎튞할 수 있는 *êČœëĄœ ìȘ늏*가 ìžˆêł  ì„±êł” 시 200 "OK"의 HTTP 상태 윔드넌 ë°˜í™˜í•œë‹€êł  가정핎 볎êČ ìŠ”ë‹ˆë‹€. 하지만 ìƒˆëĄœìšŽ 항ëȘ©ì„ 허용하Ʞ넌 원할 êČƒìž…ë‹ˆë‹€. ê·žëŠŹêł  항ëȘ©ìŽ 읎전에 ìĄŽìžŹí•˜ì§€ 않았닀멎 읎넌 ìƒì„±í•˜êł  HTTP 상태 윔드 201 "Created"넌 반환합니닀. diff --git a/docs/ko/docs/advanced/advanced-dependencies.md b/docs/ko/docs/advanced/advanced-dependencies.md index 3a35bbfc7..49b96bdad 100644 --- a/docs/ko/docs/advanced/advanced-dependencies.md +++ b/docs/ko/docs/advanced/advanced-dependencies.md @@ -79,7 +79,7 @@ checker(q="somequery") ### `yield`와 `scope`가 있는 ì˜ìĄŽì„± { #dependencies-with-yield-and-scope } -0.121.0 ëČ„ì „ì—ì„œ FastAPI는 `Depends(scope="function")` 지원을 추가했슔니닀. +0.121.0 ëČ„ì „ì—ì„œ FastAPI는 `yield`가 있는 ì˜ìĄŽì„±ì„ 위한 `Depends(scope="function")` 지원을 추가했슔니닀. `Depends(scope="function")`넌 ì‚Źìš©í•˜ë©Ž, `yield` 읎후의 ìą…ëŁŒ 윔드는 *êČœëĄœ ìȘ늏 핚수*가 끝난 직후(큎띌읎얞튞에 응닔읎 반환되Ʞ 전)에 싀행됩니닀. diff --git a/docs/ko/docs/advanced/dataclasses.md b/docs/ko/docs/advanced/dataclasses.md index fb5d9fbd9..609cb6cd9 100644 --- a/docs/ko/docs/advanced/dataclasses.md +++ b/docs/ko/docs/advanced/dataclasses.md @@ -18,7 +18,7 @@ FastAPI는 **Pydantic** 위에 ê”Źì¶•ë˜ì–Ž 있윌며, 지ꞈêčŒì§€ëŠ” Pydantic 읎는 Pydantic ëȘšëžì„ ì‚Źìš©í•  때와 같은 ë°©ì‹ìœŒëĄœ 동작합니닀. ê·žëŠŹêł  ì‹€ì œëĄœë„ ë‚Žë¶€ì ìœŒëĄœëŠ” Pydantic을 ì‚Źìš©í•Ž 같은 ë°©ì‹ìœŒëĄœ ê”Źí˜„ë©ë‹ˆë‹€. -/// note +/// note | ì°žêł  dataclasses는 Pydantic ëȘšëžìŽ 할 수 있는 ëȘšë“  êČƒì„ 할 수는 없닀는 점을 Ʞ얔하섞요. diff --git a/docs/ko/docs/advanced/events.md b/docs/ko/docs/advanced/events.md index 24ce55b4c..13db29ef2 100644 --- a/docs/ko/docs/advanced/events.md +++ b/docs/ko/docs/advanced/events.md @@ -6,15 +6,15 @@ 읎 윔드는 ì• í”ŒëŠŹìŒ€ìŽì…˜ìŽ 요ìČ­ì„ 받Ʞ **시작**하Ʞ 전에 ì‹€í–‰ë˜êł , 요ìČ­ ìČ˜ëŠŹë„Œ **끝낾 직후**에 싀행되Ʞ ë•ŒëŹžì— 전ìČŽ ì• í”ŒëŠŹìŒ€ìŽì…˜ì˜ **수ëȘ…(lifespan)**을 ë‹€ëŁč니닀(잠시 후 "lifespan"읎띌는 닚얎가 쀑요핎집니닀 😉). -읎는 전ìČŽ 앱에서 ì‚Źìš©í•Žì•Œ 하는 **자원**을 ì„€ì •í•˜êł , 요ìČ­ 간에 **êł”ìœ ë˜ëŠ”** 자원을 ì„€ì •í•˜êł , ê·žëŠŹêł /또는 읎후에 **ì •ëŠŹ**하는 데 맀우 유용할 수 있슔니닀. 예넌 듀얎, 데읎터ëČ ìŽìŠ€ 연êȰ 풀 또는 êł”ìœ  ëšžì‹ ëŸŹë‹ ëȘšëžì„ 로드하는 êČœìš°ìž…ë‹ˆë‹€. +읎는 전ìČŽ ì• í”ŒëŠŹìŒ€ìŽì…˜ì—ì„œ ì‚Źìš©í•Žì•Œ 하는 **자원**을 ì„€ì •í•˜êł , 요ìČ­ 간에 **êł”ìœ ë˜ëŠ”** 자원을 ì„€ì •í•˜êł , ê·žëŠŹêł /또는 읎후에 **ì •ëŠŹ**하는 데 맀우 유용할 수 있슔니닀. 예넌 듀얎, 데읎터ëČ ìŽìŠ€ 연êȰ 풀 또는 êł”ìœ  ëšžì‹ ëŸŹë‹ ëȘšëžì„ 로드하는 êČœìš°ìž…ë‹ˆë‹€. ## ì‚Źìš© ì‚ŹëĄ€ { #use-case } 뚌저 **ì‚Źìš© ì‚ŹëĄ€** ì˜ˆì‹œëĄœ 시작한 닀음, 읎넌 ì–Žë–»êȌ 핮êČ°í• ì§€ ì‚ŽíŽŽëłŽêČ ìŠ”ë‹ˆë‹€. -요ìČ­ì„ ìȘ멬하는 데 ì‚Źìš©í•˜êł  싶은 **ëšžì‹ ëŸŹë‹ ëȘšëž**읎 ìžˆë‹€êł  상상핎 뎅시닀. đŸ€– +요ìČ­ì„ ìȘ멬하는 데 ì‚Źìš©í•˜êł  싶은 ëȘ‡ 가지 **ëšžì‹ ëŸŹë‹ ëȘšëž**읎 ìžˆë‹€êł  상상핎 뎅시닀. đŸ€– -동음한 ëȘšëžìŽ 요ìČ­ 간에 êł”ìœ ë˜ëŻ€ëĄœ, 요ìČ­ë§ˆë‹€ ëȘšëžìŽ 하나씩 있거나 ì‚Źìš©ìžë§ˆë‹€ 하나씩 있는 등의 방식읎 아닙니닀. +동음한 ëȘšëžë“€ìŽ 요ìČ­ 간에 êł”ìœ ë˜ëŻ€ëĄœ, 요ìČ­ë§ˆë‹€ ëȘšëžìŽ 하나씩 있거나 ì‚Źìš©ìžë§ˆë‹€ 하나씩 있는 등의 방식읎 아닙니닀. ëȘšëžì„ 로드하는 데 **상ë‹č한 시간읎 ê±žëŠ°ë‹€êł  상상핎 뎅시닀**, 왜냐하멎 ëȘšëžìŽ **ë””ìŠ€íŹì—ì„œ 많은 데읎터넌 읜얎알** 하Ʞ ë•ŒëŹžìž…ë‹ˆë‹€. 귞래서 ëȘšë“  요ìČ­ë§ˆë‹€ 읎넌 ìˆ˜í–‰í•˜êł  싶지는 않슔니닀. @@ -24,7 +24,7 @@ ## Lifespan { #lifespan } -`FastAPI` 앱의 `lifespan` ë§€ê°œëł€ìˆ˜ì™€ "컚텍슀튞 맀니저"넌 ì‚Źìš©í•˜ì—Ź *시작*êłŒ *ìą…ëŁŒ* ëĄœì§ì„ 정의할 수 있슔니닀(컚텍슀튞 맀니저가 ëŹŽì—‡ìžì§€ 잠시 후에 ëłŽì—Źë“œëŠŹêČ ìŠ”ë‹ˆë‹€). +`FastAPI` ì• í”ŒëŠŹìŒ€ìŽì…˜ì˜ `lifespan` ë§€ê°œëł€ìˆ˜ì™€ "컚텍슀튞 맀니저"넌 ì‚Źìš©í•˜ì—Ź *시작*êłŒ *ìą…ëŁŒ* ëĄœì§ì„ 정의할 수 있슔니닀(컚텍슀튞 맀니저가 ëŹŽì—‡ìžì§€ 잠시 후에 ëłŽì—Źë“œëŠŹêČ ìŠ”ë‹ˆë‹€). ì˜ˆì œëĄœ 시작한 닀음 자섞히 ì‚ŽíŽŽëłŽêČ ìŠ”ë‹ˆë‹€. @@ -32,7 +32,7 @@ {* ../../docs_src/events/tutorial003_py310.py hl[16,19] *} -ì—Źêž°ì„œëŠ” `yield` 읎전에 (가짜) ëȘšëž 핚수넌 ëšžì‹ ëŸŹë‹ ëȘšëžìŽ 듀얎 있는 ë”•ì…”ë„ˆëŠŹì— ë„Łì–Ž ëȘšëžì„ 로드하는 ëč„용읎 큰 *시작* 작업을 ì‹œëźŹë ˆìŽì…˜í•©ë‹ˆë‹€. 읎 윔드는 ì• í”ŒëŠŹìŒ€ìŽì…˜ìŽ **요ìČ­ì„ 받Ʞ 시작하Ʞ 전**, *시작* 동안에 싀행됩니닀. +ì—Źêž°ì„œëŠ” `yield` 읎전에 (가짜) ëȘšëž 핚수넌 ëšžì‹ ëŸŹë‹ ëȘšëžë“€ìŽ 듀얎 있는 ë”•ì…”ë„ˆëŠŹì— ë„Łì–Ž ëȘšëžì„ 로드하는 ëč„용읎 큰 *시작* 작업을 ì‹œëźŹë ˆìŽì…˜í•©ë‹ˆë‹€. 읎 윔드는 ì• í”ŒëŠŹìŒ€ìŽì…˜ìŽ **요ìČ­ì„ 받Ʞ 시작하Ʞ 전**, *시작* 동안에 싀행됩니닀. ê·žëŠŹêł  `yield` 직후에는 ëȘšëžì„ ì–žëĄœë“œí•©ë‹ˆë‹€. 읎 윔드는 ì• í”ŒëŠŹìŒ€ìŽì…˜ìŽ **요ìČ­ ìČ˜ëŠŹë„Œ 마ìčœ í›„**, *ìą…ëŁŒ* 직전에 싀행됩니닀. 예넌 듀얎 메ëȘšëŠŹë‚˜ GPU 같은 자원을 핎제할 수 있슔니닀. @@ -80,7 +80,7 @@ async with lifespan(app): 위의 윔드 예제에서는 직접 ì‚Źìš©í•˜ì§€ ì•Šêł , FastAPI에 ì „ë‹Źí•˜ì—Ź FastAPI가 읎넌 ì‚Źìš©í•˜ë„ëĄ 합니닀. -`FastAPI` 앱의 `lifespan` ë§€ê°œëł€ìˆ˜ëŠ” **ëč„동Ʞ 컚텍슀튞 맀니저**넌 ë°›ìœŒëŻ€ëĄœ, 새 `lifespan` ëč„동Ʞ 컚텍슀튞 맀니저넌 ì „ë‹Źí•  수 있슔니닀. +`FastAPI` ì• í”ŒëŠŹìŒ€ìŽì…˜ì˜ `lifespan` ë§€ê°œëł€ìˆ˜ëŠ” **ëč„동Ʞ 컚텍슀튞 맀니저**넌 ë°›ìœŒëŻ€ëĄœ, 새 `lifespan` ëč„동Ʞ 컚텍슀튞 맀니저넌 ì „ë‹Źí•  수 있슔니닀. {* ../../docs_src/events/tutorial003_py310.py hl[22] *} @@ -88,7 +88,7 @@ async with lifespan(app): /// warning | êČœêł  -*시작*êłŒ *ìą…ëŁŒ*넌 ìȘ멬하는 권임 ë°©ëČ•ì€ 위에서 ì„€ëȘ…한 대로 `FastAPI` 앱의 `lifespan` ë§€ê°œëł€ìˆ˜ë„Œ ì‚Źìš©í•˜ëŠ” êČƒìž…ë‹ˆë‹€. `lifespan` ë§€ê°œëł€ìˆ˜ë„Œ ì œêł”í•˜ë©Ž `startup`êłŒ `shutdown` 읎ëȀ튞 í•žë“€ëŸŹëŠ” 더 읎상 혞출되지 않슔니닀. `lifespan`만 쓰거나 읎ëČ€íŠžë§Œ 쓰거나 둘 쀑 하나읎지, 둘 닀는 아닙니닀. +*시작*êłŒ *ìą…ëŁŒ*넌 ìȘ멬하는 권임 ë°©ëČ•ì€ 위에서 ì„€ëȘ…한 대로 `FastAPI` ì• í”ŒëŠŹìŒ€ìŽì…˜ì˜ `lifespan` ë§€ê°œëł€ìˆ˜ë„Œ ì‚Źìš©í•˜ëŠ” êČƒìž…ë‹ˆë‹€. `lifespan` ë§€ê°œëł€ìˆ˜ë„Œ ì œêł”í•˜ë©Ž `startup`êłŒ `shutdown` 읎ëȀ튞 í•žë“€ëŸŹëŠ” 더 읎상 혞출되지 않슔니닀. `lifespan`만 쓰거나 읎ëČ€íŠžë§Œ 쓰거나 둘 쀑 하나읎지, 둘 닀는 아닙니닀. 읎 부분은 아마 걎너뛰셔도 됩니닀. diff --git a/docs/ko/docs/advanced/generate-clients.md b/docs/ko/docs/advanced/generate-clients.md index f85db8cb9..9cbe46ff8 100644 --- a/docs/ko/docs/advanced/generate-clients.md +++ b/docs/ko/docs/advanced/generate-clients.md @@ -20,20 +20,6 @@ FastAPI는 **OpenAPI 3.1** ì‚Źì–‘ì„ ìžë™ìœŒëĄœ ìƒì„±í•˜ëŻ€ëĄœ, ì‚Źìš©í•˜ëŠ” /// -## FastAPI 슀폰서의 SDK 생성Ʞ { #sdk-generators-from-fastapi-sponsors } - -읎 ì„č션에서는 FastAPI넌 후원하는 íšŒì‚Źë“€ìŽ ì œêł”í•˜ëŠ” **ëČ€ìȘ íˆŹìž êž°ë°˜** 및 **êž°ì—… 지원** ì†”ëŁšì…˜ì„ 소개합니닀. 읎 제품듀은 êł í’ˆì§ˆëĄœ 생성된 SDK에 더핮 **추가 Ʞ늄**êłŒ **톔합**을 ì œêł”í•©ë‹ˆë‹€. - -✹ [**FastAPI 후원하Ʞ**](../help-fastapi.md#sponsor-the-author) ✚넌 톔핎, 읎 íšŒì‚Źë“€ì€ í”„ë ˆìž„ì›ŒíŹì™€ ê·ž **ìƒíƒœêł„**가 ê±Žê°•í•˜êł  **지속 가늄**하êȌ ìœ ì§€ë˜ë„ëĄ 돕슔니닀. - -또한 읎듀의 후원은 FastAPI **ì»€ëź€ë‹ˆí‹°**(ì—ŹëŸŹë¶„)에 대한 강한 헌신을 ëłŽì—ŹìŁŒë©°, **ìą‹ì€ 서ëč„슀**넌 ì œêł”í•˜ëŠ” êȃ뿐 아니띌, êČŹêł í•˜êł  활발한 í”„ë ˆìž„ì›ŒíŹìž FastAPI넌 지원하는 데에도 êŽ€ì‹ŹìŽ 있음을 나타냅니닀. 🙇 - -예넌 듀얎 닀음을 ì‚Źìš©í•Ž ëłŒ 수 있슔니닀: - -* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) - -읎 쀑 음부는 였픈 소슀읎거나 묮료 티얎넌 ì œêł”í•˜ëŻ€ëĄœ, ëč„ìš© 부닎 없읎 ì‚Źìš©í•Ž ëłŒ 수 있슔니닀. 닀넞 상용 SDK 생성Ʞ도 있윌며 옚띌읞에서 찟을 수 있슔니닀. đŸ€“ - ## TypeScript SDK 만듀Ʞ { #create-a-typescript-sdk } 간닚한 FastAPI ì• í”ŒëŠŹìŒ€ìŽì…˜ìœŒëĄœ 시작핎 볎êČ ìŠ”ë‹ˆë‹€: diff --git a/docs/ko/docs/advanced/json-base64-bytes.md b/docs/ko/docs/advanced/json-base64-bytes.md index b5e55a41a..b24acda86 100644 --- a/docs/ko/docs/advanced/json-base64-bytes.md +++ b/docs/ko/docs/advanced/json-base64-bytes.md @@ -4,7 +4,7 @@ ## Base64와 파음 { #base64-vs-files } -ë°”ìŽë„ˆëŠŹ 데읎터 ì—…ëĄœë“œì—ëŠ” [요ìČ­ 파음](../tutorial/request-files.md)을, ë°”ìŽë„ˆëŠŹ 데읎터 ì „ì†Ąì—ëŠ” [컀슀텀 응닔 - FileResponse](./custom-response.md#fileresponse--fileresponse-)넌 ì‚Źìš©í•  수 있는지 뚌저 êł ë €í•˜ì„žìš”. JSONìœŒëĄœ 읞윔딩하는 대신 말입니닀. +ë°”ìŽë„ˆëŠŹ 데읎터 ì—…ëĄœë“œì—ëŠ” [요ìČ­ 파음](../tutorial/request-files.md)을, ë°”ìŽë„ˆëŠŹ 데읎터 ì „ì†Ąì—ëŠ” [컀슀텀 응닔 - FileResponse](./custom-response.md#fileresponse)넌 ì‚Źìš©í•  수 있는지 뚌저 êł ë €í•˜ì„žìš”. JSONìœŒëĄœ 읞윔딩하는 대신 말입니닀. JSON은 UTF-8로 읞윔딩된 ëŹžìžì—Žë§Œ 포핹할 수 ìžˆìœŒëŻ€ëĄœ, 원시 바읎튞넌 ê·žëŒ€ëĄœ 닎을 수 없슔니닀. diff --git a/docs/ko/docs/advanced/openapi-callbacks.md b/docs/ko/docs/advanced/openapi-callbacks.md index f9769209a..a44997ba2 100644 --- a/docs/ko/docs/advanced/openapi-callbacks.md +++ b/docs/ko/docs/advanced/openapi-callbacks.md @@ -165,7 +165,7 @@ https://www.external.org/events/invoices/2expen51ve ### 윜백 띌우터 추가하Ʞ { #add-the-callback-router } -읎 시점에서, 위에서 만든 윜백 띌우터 안에 *윜백 êČœëĄœ ìȘ늏(ë“€)*(슉 *external developer*가 *external API*에 ê”Źí˜„í•Žì•Œ 하는 êČƒë“€)을 쀀ëč„했슔니닀. +읎 시점에서, 위에서 만든 윜백 띌우터 안에 *윜백 êČœëĄœ ìȘ늏(ë“€)*(슉 *왞부 개발자*가 *external API*에 ê”Źí˜„í•Žì•Œ 하는 êČƒë“€)을 쀀ëč„했슔니닀. 읎제 *ì—ŹëŸŹë¶„ì˜ API êČœëĄœ ìȘ늏 데윔레읎터*에서 `callbacks` íŒŒëŒëŻží„°ë„Œ ì‚Źìš©í•Ž, ê·ž 윜백 띌우터의 `.routes` 속성을 ì „ë‹Źí•©ë‹ˆë‹€: diff --git a/docs/ko/docs/advanced/response-change-status-code.md b/docs/ko/docs/advanced/response-change-status-code.md index f30474917..5e54dc75e 100644 --- a/docs/ko/docs/advanced/response-change-status-code.md +++ b/docs/ko/docs/advanced/response-change-status-code.md @@ -1,5 +1,6 @@ # 응닔 - 상태 윔드 변êČœ { #response-change-status-code } + êž°ëłž [응닔 상태 윔드 섀정](../tutorial/response-status-code.md)읎 가늄하닀는 걞 ìŽëŻž ì•Œêł  êł„ì‹€ êČë‹ˆë‹€. 하지만 êČœìš°ì— 따띌 êž°ëłž ì„€ì •êłŒ 닀넞 상태 윔드넌 반환핎알 할 때가 있슔니닀. diff --git a/docs/ko/docs/advanced/response-cookies.md b/docs/ko/docs/advanced/response-cookies.md index b73d71969..f17046e7b 100644 --- a/docs/ko/docs/advanced/response-cookies.md +++ b/docs/ko/docs/advanced/response-cookies.md @@ -26,7 +26,7 @@ {* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *} -/// tip +/// tip | 팁 `Response` ë§€ê°œëł€ìˆ˜ë„Œ ì‚Źìš©í•˜ì§€ ì•Šêł  응닔을 직접 반환하는 êČœìš°, FastAPI는 읎넌 직접 반환한닀는 점에 유의하섞요. diff --git a/docs/ko/docs/advanced/response-headers.md b/docs/ko/docs/advanced/response-headers.md index e7157d8f4..769972967 100644 --- a/docs/ko/docs/advanced/response-headers.md +++ b/docs/ko/docs/advanced/response-headers.md @@ -1,5 +1,6 @@ # 응닔 헀더 { #response-headers } + ## `Response` ë§€ê°œëł€ìˆ˜ ì‚Źìš©í•˜êž° { #use-a-response-parameter } ì—ŹëŸŹë¶„ì€ *êČœëĄœ ìȘ늏 핚수*에서 `Response` 타입의 ë§€ê°œëł€ìˆ˜ë„Œ ì„ ì–ží•  수 있슔니닀 (ìż í‚€ì™€ 같읎 ì‚Źìš©í•  수 있슔니닀). diff --git a/docs/ko/docs/advanced/security/oauth2-scopes.md b/docs/ko/docs/advanced/security/oauth2-scopes.md index 6aed77f75..265f82aa7 100644 --- a/docs/ko/docs/advanced/security/oauth2-scopes.md +++ b/docs/ko/docs/advanced/security/oauth2-scopes.md @@ -4,9 +4,9 @@ 읎넌 톔핎 OAuth2 표쀀을 따넎는 더 섞밀한 권한 시슀템을 OpenAPI ì• í”ŒëŠŹìŒ€ìŽì…˜(및 API ëŹžì„œ)에 톔합할 수 있슔니닀. -슀윔프넌 ì‚Źìš©í•˜ëŠ” OAuth2는 Facebook, Google, GitHub, Microsoft, X(Twitter) 등 많은 대형 읞슝 ì œêł”ìžê°€ ì‚Źìš©í•˜ëŠ” 메컀니슘입니닀. 읎듀은 읎넌 톔핎 ì‚Źìš©ìžì™€ ì• í”ŒëŠŹìŒ€ìŽì…˜ì— íŠč정 권한을 ì œêł”í•©ë‹ˆë‹€. +슀윔프넌 ì‚Źìš©í•˜ëŠ” OAuth2는 Facebook, Google, GitHub, Microsoft, X (Twitter) 등 많은 대형 읞슝 ì œêł”ìžê°€ ì‚Źìš©í•˜ëŠ” 메컀니슘입니닀. 읎듀은 읎넌 톔핎 ì‚Źìš©ìžì™€ ì• í”ŒëŠŹìŒ€ìŽì…˜ì— íŠč정 권한을 ì œêł”í•©ë‹ˆë‹€. -Facebook, Google, GitHub, Microsoft, X(Twitter)로 â€œëĄœê·žìžâ€í•  때마닀, 핮ë‹č ì• í”ŒëŠŹìŒ€ìŽì…˜ì€ 슀윔프가 있는 OAuth2넌 ì‚Źìš©í•˜êł  있슔니닀. +Facebook, Google, GitHub, Microsoft, X (Twitter)로 â€œëĄœê·žìžâ€í•  때마닀, 핮ë‹č ì• í”ŒëŠŹìŒ€ìŽì…˜ì€ 슀윔프가 있는 OAuth2넌 ì‚Źìš©í•˜êł  있슔니닀. 읎 ì„č션에서는 **FastAPI** ì• í”ŒëŠŹìŒ€ìŽì…˜ì—ì„œ 동음한 “슀윔프가 있는 OAuth2”로 읞슝(Authentication)êłŒ 읞가(Authorization)넌 êŽ€ëŠŹí•˜ëŠ” ë°©ëČ•ì„ 확읞합니닀. diff --git a/docs/ko/docs/advanced/settings.md b/docs/ko/docs/advanced/settings.md index 49a2b640e..f7e8c20e7 100644 --- a/docs/ko/docs/advanced/settings.md +++ b/docs/ko/docs/advanced/settings.md @@ -1,5 +1,6 @@ # ì„€ì •êłŒ 환êČœ ëł€ìˆ˜ { #settings-and-environment-variables } + 많은 êČœìš° ì• í”ŒëŠŹìŒ€ìŽì…˜ì—ëŠ” 왞부 섀정읎나 ê”Źì„±(예: secret key, 데읎터ëČ ìŽìŠ€ 자êČ© 슝ëȘ…, 읎메음 서ëč„슀 자êČ© 슝ëȘ… 등)읎 필요할 수 있슔니닀. ìŽëŸŹí•œ 섀정 대부분은 데읎터ëČ ìŽìŠ€ URLìČ˜ëŸŒ 변동 가늄(변êČœë  수 있음)합니닀. ê·žëŠŹêł  많은 섀정은 secretìČ˜ëŸŒ ëŻŒê°í•  수 있슔니닀. diff --git a/docs/ko/docs/advanced/stream-data.md b/docs/ko/docs/advanced/stream-data.md index 33013fddd..94276876f 100644 --- a/docs/ko/docs/advanced/stream-data.md +++ b/docs/ko/docs/advanced/stream-data.md @@ -2,7 +2,7 @@ JSONìœŒëĄœ ê”ŹìĄ°í™”í•  수 있는 데읎터넌 ìŠ€íŠžëŠŹë°í•˜ë €ë©Ž [JSON Lines ìŠ€íŠžëŠŹë°](../tutorial/stream-json-lines.md)을 ì‚Źìš©í•˜ì„žìš”. -하지만 순수 ë°”ìŽë„ˆëŠŹ 데읎터나 ëŹžìžì—Žì„ ìŠ€íŠžëŠŹë°í•˜ë €ë©Ž ë‹€ìŒêłŒ 같읎 하멎 됩니닀. +하지만 **순수 ë°”ìŽë„ˆëŠŹ 데읎터**나 ëŹžìžì—Žì„ ìŠ€íŠžëŠŹë°í•˜ë €ë©Ž ë‹€ìŒêłŒ 같읎 하멎 됩니닀. /// note | ì°žêł  @@ -12,21 +12,21 @@ FastAPI 0.134.0에 추가되었슔니닀. ## ì‚Źìš© 예시 { #use-cases } -예넌 듀얎 AI LLM 서ëč„슀의 출렄에서 바로 순수 ëŹžìžì—Žì„ ìŠ€íŠžëŠŹë°í•˜êł  싶닀멎 읎넌 ì‚Źìš©í•  수 있슔니닀. +예넌 듀얎 **AI LLM** 서ëč„슀의 출렄에서 바로 순수 ëŹžìžì—Žì„ ìŠ€íŠžëŠŹë°í•˜êł  싶닀멎 읎넌 ì‚Źìš©í•  수 있슔니닀. -또한 큰 ë°”ìŽë„ˆëŠŹ 파음을 ìŠ€íŠžëŠŹë°í•˜ëŠ” 데 ì‚Źìš©í•  수 있슔니닀. 한 ëČˆì— ëȘšë‘ 메ëȘšëŠŹëĄœ 읜지 ì•Šêł , 읜는 슉시 데읎터 ìČ­íŹë„Œ ìˆœì°šì ìœŒëĄœ ìŠ€íŠžëŠŹë°í•©ë‹ˆë‹€. +또한 **큰 ë°”ìŽë„ˆëŠŹ 파음**을 ìŠ€íŠžëŠŹë°í•˜ëŠ” 데 ì‚Źìš©í•  수 있슔니닀. 한 ëČˆì— ëȘšë‘ 메ëȘšëŠŹëĄœ 읜지 ì•Šêł , 읜는 슉시 데읎터 ìČ­íŹë„Œ ìˆœì°šì ìœŒëĄœ ìŠ€íŠžëŠŹë°í•©ë‹ˆë‹€. -읎 ë°©ì‹ìœŒëĄœ ëč„디였나 였디였넌 ìŠ€íŠžëŠŹë°í•  수도 있윌며, ìČ˜ëŠŹí•˜ë©Žì„œ 생성된 데읎터넌 êł§ë°”ëĄœ ì „ì†Ąí•  수도 있슔니닀. +읎 ë°©ì‹ìœŒëĄœ **ëč„디였**나 **였디였**넌 ìŠ€íŠžëŠŹë°í•  수도 있윌며, ìČ˜ëŠŹí•˜ë©Žì„œ 생성된 데읎터넌 êł§ë°”ëĄœ ì „ì†Ąí•  수도 있슔니닀. ## `yield`와 핚께 `StreamingResponse` ì‚Źìš©í•˜êž° { #a-streamingresponse-with-yield } -êČœëĄœ ìȘ늏 핚수에서 `response_class=StreamingResponse`넌 선얞하멎 `yield`넌 ì‚Źìš©í•Ž 데읎터 ìČ­íŹë„Œ ìˆœì°šì ìœŒëĄœ ëłŽë‚Œ 수 있슔니닀. +*êČœëĄœ ìȘ늏 핚수*에서 `response_class=StreamingResponse`넌 선얞하멎 `yield`넌 ì‚Źìš©í•Ž 데읎터 ìČ­íŹë„Œ ìˆœì°šì ìœŒëĄœ ëłŽë‚Œ 수 있슔니닀. {* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *} FastAPI는 각 데읎터 ìČ­íŹë„Œ 있는 ê·žëŒ€ëĄœ `StreamingResponse`에 ì „ë‹Źí•˜ë©°, JSON ë“±ìœŒëĄœ ëł€í™˜í•˜ë €êł  하지 않슔니닀. -### async가 아닌 êČœëĄœ ìȘ늏 핚수 { #non-async-path-operation-functions } +### async가 아닌 *êČœëĄœ ìȘ늏 핚수* { #non-async-path-operation-functions } `async`가 없는 음반 `def` 핚수에서도 동음하êȌ `yield`넌 ì‚Źìš©í•  수 있슔니닀. @@ -40,7 +40,7 @@ FastAPI는 데읎터넌 PydanticìœŒëĄœ JSONìœŒëĄœ ëł€í™˜í•˜ê±°ë‚˜ ì–Žë–€ 방식 {* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} -읎는 êł§ `StreamingResponse`넌 ì‚Źìš©í•  때 타입 ì• ë„ˆí…ŒìŽì…˜êłŒ ëŹŽêŽ€í•˜êȌ, ì „ì†Ą Ʞ쀀에 맞춰 바읎튞 데읎터넌 ìƒì„±í•˜êł  읞윔딩할 자유와 책임읎 ì—ŹëŸŹë¶„ì—êȌ 있음을 ì˜ëŻží•©ë‹ˆë‹€. đŸ€“ +읎는 êł§ `StreamingResponse`넌 ì‚Źìš©í•  때 타입 ì• ë„ˆí…ŒìŽì…˜êłŒ ëŹŽêŽ€í•˜êȌ, ì „ì†Ą Ʞ쀀에 맞춰 바읎튞 데읎터넌 ìƒì„±í•˜êł  읞윔딩할 **자유**와 **책임**읎 ì—ŹëŸŹë¶„ì—êȌ 있음을 ì˜ëŻží•©ë‹ˆë‹€. đŸ€“ ### 바읎튞 ìŠ€íŠžëŠŹë° { #stream-bytes } @@ -58,7 +58,7 @@ FastAPI는 데읎터넌 PydanticìœŒëĄœ JSONìœŒëĄœ ëł€í™˜í•˜ê±°ë‚˜ ì–Žë–€ 방식 {* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} -귞런 닀음 êČœëĄœ ìȘ늏 핚수에서 `response_class=PNGStreamingResponse`로 읎 새 큎래슀넌 ì‚Źìš©í•  수 있슔니닀: +귞런 닀음 *êČœëĄœ ìȘ늏 핚수*에서 `response_class=PNGStreamingResponse`로 읎 새 큎래슀넌 ì‚Źìš©í•  수 있슔니닀: {* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} @@ -98,7 +98,7 @@ FastAPI는 데읎터넌 PydanticìœŒëĄœ JSONìœŒëĄœ ëł€í™˜í•˜ê±°ë‚˜ ì–Žë–€ 방식 /// -읎ëȀ튞 ëŁší”„ê°€ 뾔로í‚č되는 êČƒì„ 플하렀멎 êČœëĄœ ìȘ늏 핚수넌 `async def` 대신 음반 `def`로 선얞하섞요. ê·žëŸŹë©Ž FastAPI가 슀레드풀 워컀에서 ì‹€í–‰í•˜ì—Ź 메읞 ëŁší”„ê°€ 막히지 ì•Šë„ëĄ 합니닀. +읎ëȀ튞 ëŁší”„ê°€ 뾔로í‚č되는 êČƒì„ 플하렀멎 *êČœëĄœ ìȘ늏 핚수*넌 `async def` 대신 음반 `def`로 선얞하섞요. ê·žëŸŹë©Ž FastAPI가 슀레드풀 워컀에서 ì‹€í–‰í•˜ì—Ź 메읞 ëŁší”„ê°€ 막히지 ì•Šë„ëĄ 합니닀. {* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} diff --git a/docs/ko/docs/advanced/wsgi.md b/docs/ko/docs/advanced/wsgi.md index bd359661d..2b3012a46 100644 --- a/docs/ko/docs/advanced/wsgi.md +++ b/docs/ko/docs/advanced/wsgi.md @@ -42,7 +42,7 @@ Hello, World from Flask! ``` -ê·žëŠŹêł  [http://localhost:8000/v2](http://localhost:8000/v2)로 읎동하멎 **FastAPI**의 응닔을 ëłŒ 수 있슔니닀: +ê·žëŠŹêł  [http://localhost:8000/v2](http://localhost:8000/v2)로 읎동하멎 FastAPI의 응닔을 ëłŒ 수 있슔니닀: ```JSON { diff --git a/docs/ko/docs/alternatives.md b/docs/ko/docs/alternatives.md index ab92c0ea8..1bd0ba56a 100644 --- a/docs/ko/docs/alternatives.md +++ b/docs/ko/docs/alternatives.md @@ -24,7 +24,7 @@ ### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework } -Django REST framework는 Django넌 êž°ë°˜ìœŒëĄœ Web API넌 ê”Źì¶•í•˜êž° 위한 유연한 toolkitìœŒëĄœ ë§Œë“€ì–ŽìĄŒêł , Django의 API Ʞ늄을 개선하Ʞ 위한 ëȘ©ì ìŽì—ˆìŠ”니닀. +Django REST Framework는 Django넌 êž°ë°˜ìœŒëĄœ Web API넌 ê”Źì¶•í•˜êž° 위한 유연한 toolkitìœŒëĄœ ë§Œë“€ì–ŽìĄŒêł , Django의 API Ʞ늄을 개선하Ʞ 위한 ëȘ©ì ìŽì—ˆìŠ”니닀. Mozilla, Red Hat, Eventbrite넌 포핹핮 많은 íšŒì‚Źì—ì„œ ì‚Źìš©í•©ë‹ˆë‹€. @@ -36,7 +36,7 @@ Django REST Framework는 Tom Christie가 만듀었슔니닀. **FastAPI**의 êž° /// -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 점 자동 API ëŹžì„œí™” ì›č ì‚Źìš©ìž 읞터페읎슀넌 ì œêł”í•˜êž°. @@ -56,7 +56,7 @@ Flask는 "microframework"로, Django에 êž°ëłžìœŒëĄœ 포핹된 데읎터ëČ ìŽ Flask의 닚순핚을 êł ë €í•˜ë©Ž API넌 ê”Źì¶•í•˜ëŠ” 데 잘 맞는 êȃìČ˜ëŸŒ ëłŽì˜€ìŠ”ë‹ˆë‹€. ë‹€ìŒìœŒëĄœ ì°Ÿêł ìž 했던 êČƒì€ Flask용 "Django REST Framework"였슔니닀. -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 점 micro-framework가 되Ʞ. 필요한 ë„ê”Źì™€ ê”Źì„±ìš”ì†Œë„Œ 쉜êȌ ìĄ°í•©í•  수 ìžˆë„ëĄ 하Ʞ. @@ -80,7 +80,7 @@ Requests는 맀우 ë‹šìˆœí•˜êł  직ꎀ적읞 ì„€êł„ë„Œ ê°€ìĄŒêł , í•©ëŠŹì ìž 귞래서 êł”ì‹ ì›čì‚ŹìŽíŠžì—ì„œ ë§í•˜ë“ŻìŽ: -> Requests is one of the most downloaded Python packages of all time +> Requests는 역대 가임 많읎 ë‹€ìšŽëĄœë“œëœ Python 팚킀지 쀑 하나입니닀 ì‚Źìš© ë°©ëČ•ì€ 맀우 간닚합니닀. 예넌 듀얎 `GET` 요ìČ­ì„ 하렀멎 닀음ìČ˜ëŸŒ 작성합니닀: @@ -98,7 +98,7 @@ def read_url(): `requests.get(...)`와 `@app.get(...)`의 ìœ ì‚Źì„±ì„ 확읞핎 ëłŽì„žìš”. -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 점 * ë‹šìˆœí•˜êł  직ꎀ적읞 API넌 ê°–êž°. * HTTP method 읎늄(operations)을 직접, ì§êŽ€ì ìŽêł  ëȘ…확한 ë°©ì‹ìœŒëĄœ ì‚Źìš©í•˜êž°. @@ -118,7 +118,7 @@ def read_url(): 귞래서 2.0 ëČ„ì „ì„ 읎알Ʞ할 때는 "Swagger"ëŒêł  말하는 êČƒìŽ ìŒë°˜ì ìŽêł , 3+ ëČ„ì „ì€ "OpenAPI"ëŒêł  말하는 êČƒìŽ 음반적입니닀. -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 점 컀슀텀 schema 대신, API ì‚Źì–‘ì„ 위한 엎늰 표쀀을 ì±„íƒí•˜êł  ì‚Źìš©í•˜êž°. @@ -147,7 +147,7 @@ API에 또 하나 큏êȌ 필요한 Ʞ늄은 데읎터 êČ€ìŠìž…ë‹ˆë‹€. íŠč정 하지만 Python type hints가 ìĄŽìžŹí•˜êž° 전에 ë§Œë“€ì–ŽìĄŒìŠ”ë‹ˆë‹€. 귞래서 각 슀킀마넌 정의하렀멎 Marshmallow가 ì œêł”í•˜ëŠ” íŠč정 ìœ í‹žëŠŹí‹°ì™€ 큎래슀넌 ì‚Źìš©í•Žì•Œ 합니닀. -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 점 데읎터 íƒ€ìž…êłŒ êČ€ìŠì„ ì œêł”í•˜ëŠ” "schema"넌 ìœ”ë“œëĄœ ì •ì˜í•˜êł , 읎넌 ìžë™ìœŒëĄœ 활용하Ʞ. @@ -169,7 +169,7 @@ Webargs는 Marshmallow와 같은 개발자듀읎 만듀었슔니닀. /// -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 점 듀얎였는 요ìČ­ 데읎터의 자동 êČ€ìŠì„ ê°–êž°. @@ -199,7 +199,7 @@ APISpec은 Marshmallow와 같은 개발자듀읎 만듀었슔니닀. /// -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 점 API넌 위한 엎늰 표쀀읞 OpenAPI넌 지원하Ʞ. @@ -231,7 +231,7 @@ Flask-apispec은 Marshmallow와 같은 개발자듀읎 만듀었슔니닀. /// -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 점 serializationêłŒ validation을 정의하는 동음한 ìœ”ë“œëĄœë¶€í„° OpenAPI schema넌 자동 생성하Ʞ. @@ -251,7 +251,7 @@ Angular 2에서 영감을 받은 ì˜ìĄŽì„± ìŁŒìž… 시슀템읎 톔합되얎 있 쀑ìČ© ëȘšëžì„ 잘 ìČ˜ëŠŹí•˜ì§€ ëȘ»í•©ë‹ˆë‹€. 슉, 요ìČ­ì˜ JSON body가 낎부 필드넌 가진 JSON 객ìČŽìŽêł  ê·ž 낎부 필드듀읎 닀시 쀑ìČ©ëœ JSON 객ìČŽìž êČœìš°, ì œëŒ€ëĄœ ëŹžì„œí™”í•˜êł  êČ€ìŠí•  수 없슔니닀. -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 점 Python 타입을 ì‚Źìš©í•Ž 뛰얎난 에디터 지원을 ì œêł”í•˜êž°. @@ -271,7 +271,7 @@ Python 타입을 ì‚Źìš©í•Ž 뛰얎난 에디터 지원을 ì œêł”í•˜êž°. /// -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 점 믞ìčœ ì„±ëŠ„ì„ 낌 수 있는 ë°©ëČ•ì„ ì°Ÿêž°. @@ -283,11 +283,11 @@ Python 타입을 ì‚Źìš©í•Ž 뛰얎난 에디터 지원을 ì œêł”í•˜êž°. Falcon은 또 닀넞 êł ì„±ëŠ„ Python framework로, ì”œì†Œí•œìœŒëĄœ ì„€êł„ë˜ì—ˆêł  Hug 같은 닀넞 framework의 êž°ë°˜ìœŒëĄœ ë™ìž‘í•˜ë„ëĄ ë§Œë“€ì–ŽìĄŒìŠ”ë‹ˆë‹€. -핚수가 두 개의 íŒŒëŒëŻží„°(하나는 "request", 하나는 "response")넌 받도록 ì„€êł„ë˜ì–Ž 있슔니닀. 귞런 닀음 request에서 음부넌 "ìœêł ", response에 음부넌 "작성"합니닀. 읎 ì„€êł„ ë•ŒëŹžì—, 표쀀 Python type hints넌 핚수 íŒŒëŒëŻží„°ëĄœ ì‚Źìš©í•Ž 요ìČ­ íŒŒëŒëŻží„°ì™€ body넌 선얞하는 êČƒìŽ 불가늄합니닀. +핚수가 두 개의 íŒŒëŒëŻží„°(하나는 "요ìČ­", 하나는 "응닔")넌 받도록 ì„€êł„ë˜ì–Ž 있슔니닀. 귞런 닀음 요ìČ­ì—ì„œ 음부넌 "ìœêł ", 응닔에 음부넌 "작성"합니닀. 읎 ì„€êł„ ë•ŒëŹžì—, 표쀀 Python type hints넌 핚수 íŒŒëŒëŻží„°ëĄœ ì‚Źìš©í•Ž 요ìČ­ íŒŒëŒëŻží„°ì™€ body넌 선얞하는 êČƒìŽ 불가늄합니닀. -따띌서 데읎터 êČ€ìŠ, serialization, ëŹžì„œí™”ëŠ” ìžë™ìœŒëĄœ 되지 ì•Šêł  ìœ”ë“œëĄœ 핎알 합니닀. 또는 HugìČ˜ëŸŒ Falcon 위에 framework넌 ì–čì–Ž ê”Źí˜„í•Žì•Œ 합니닀. request 객ìČŽ 하나와 response 객ìČŽ 하나넌 íŒŒëŒëŻží„°ëĄœ 받는 Falcon의 ì„€êł„ì—ì„œ 영감을 받은 닀넞 framework에서도 같은 ê”Źë¶„ìŽ 나타납니닀. +따띌서 데읎터 êČ€ìŠ, serialization, ëŹžì„œí™”ëŠ” ìžë™ìœŒëĄœ 되지 ì•Šêł  ìœ”ë“œëĄœ 핎알 합니닀. 또는 HugìČ˜ëŸŒ Falcon 위에 framework넌 ì–čì–Ž ê”Źí˜„í•Žì•Œ 합니닀. 요ìČ­ 객ìČŽ 하나와 응닔 객ìČŽ 하나넌 íŒŒëŒëŻží„°ëĄœ 받는 Falcon의 ì„€êł„ì—ì„œ 영감을 받은 닀넞 framework에서도 같은 ê”Źë¶„ìŽ 나타납니닀. -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 점 훌넭한 성늄을 얻는 ë°©ëČ•ì„ ì°Ÿêž°. @@ -313,7 +313,7 @@ Pydantic 같은 서드파티 ëŒìŽëžŒëŸŹëŠŹë„Œ ì‚Źìš©í•Ž 데읎터 êČ€ìŠ/seria Route는 한 êłłì—ì„œ ì„ ì–ží•˜êł , 닀넞 êłłì— 선얞된 핚수넌 ì‚Źìš©í•©ë‹ˆë‹€(ì—”ë“œíŹìžíŠžë„Œ ìȘ멬하는 핚수 바로 위에 둘 수 있는 decorator넌 ì‚Źìš©í•˜ëŠ” 대신). 읎는 Flask(및 Starlette)볎닀는 Django 방식에 가êčìŠ”니닀. 윔드에서 ìƒëŒ€ì ìœŒëĄœ 강하êȌ êČ°í•©ëœ êČƒë“€ì„ 분늏핎 놓슔니닀. -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 점 ëȘšëž 속성의 "default" ê°’ìœŒëĄœ 데읎터 타입에 대한 추가 êČ€ìŠì„ 정의하Ʞ. 읎는 에디터 지원을 개선하며, 읎전에는 Pydantic에 없었슔니닀. @@ -341,7 +341,7 @@ Hug는 Timothy Crosley가 만듀었슔니닀. Python 파음에서 import넌 자 /// -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 아읎디얎 Hug는 APIStar의 음부에 영감을 ìŁŒì—ˆêł , 저는 APIStar와 핚께 Hug넌 가임 유망한 ë„ê”Ź 쀑 하나로 ëłŽì•˜ìŠ”ë‹ˆë‹€. @@ -385,7 +385,7 @@ APIStar는 Tom Christie가 만듀었슔니닀. 닀음을 만든 ì‚ŹëžŒêłŒ 동음 /// -/// tip | 팁 +/// tip | **FastAPI**에 영감을 쀀 점 ìĄŽìžŹí•˜êȌ 만듀Ʞ. @@ -409,7 +409,7 @@ Pydantic은 Python type hints넌 êž°ë°˜ìœŒëĄœ 데읎터 êČ€ìŠ, serialization, Marshmallow와 ëč„ꔐ할 수 있슔니닀. 닀만 benchmark에서 Marshmallow볎닀 ëč ëŠ…ë‹ˆë‹€. ê·žëŠŹêł  동음한 Python type hints넌 êž°ë°˜ìœŒëĄœ 하므로 에디터 지원도 훌넭합니닀. -/// tip | 팁 +/// tip | **FastAPI**는 읎넌 ì‚Źìš©í•Ž ëȘšë“  데읎터 êČ€ìŠ, 데읎터 serialization, 자동 ëȘšëž ëŹžì„œí™”(JSON Schema êž°ë°˜)넌 ìČ˜ëŠŹí•˜êž°. @@ -430,7 +430,7 @@ Starlette는 êČœëŸ‰ -Dockerfile Preview 👀 +Dockerfile ëŻžëŠŹëłŽêž° 👀 ```Dockerfile FROM python:3.14 @@ -46,7 +46,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] **컚테읎너**는 **컚테읎너 ìŽëŻžì§€**에서 싀행됩니닀. -컚테읎너 ìŽëŻžì§€ëŠ” 컚테읎너에 있얎알 하는 ëȘšë“  파음, 환êČœ ëł€ìˆ˜, êž°ëłž ëȘ…ë č/í”„ëĄœê·žëžšì˜ **정적** ëČ„ì „ìž…ë‹ˆë‹€. ì—Źêž°ì„œ **정적**읎띌는 êČƒì€ 컚테읎너 **ìŽëŻžì§€**가 싀행 쀑읎거나 수행되는 êČƒìŽ 아니띌, 팚킀징된 íŒŒìŒêłŒ 메타데읎터음 ëżìŽëŒëŠ” 뜻입니닀. +컚테읎너 ìŽëŻžì§€ëŠ” 컚테읎너에 있얎알 하는 ëȘšë“  파음, 환êČœ ëł€ìˆ˜, êž°ëłž ëȘ…ë čì–Ž/í”„ëĄœê·žëžšì˜ **정적** ëČ„ì „ìž…ë‹ˆë‹€. ì—Źêž°ì„œ **정적**읎띌는 êČƒì€ 컚테읎너 **ìŽëŻžì§€**가 싀행 쀑읎거나 수행되는 êČƒìŽ 아니띌, 팚킀징된 íŒŒìŒêłŒ 메타데읎터음 ëżìŽëŒëŠ” 뜻입니닀. 저임된 정적 윘텐잠읞 "**컚테읎너 ìŽëŻžì§€**"와 달멬, "**컚테읎너**"는 볎톔 싀행 쀑읞 읞슀턎슀, 슉 **싀행되는** 대상을 ì˜ëŻží•©ë‹ˆë‹€. @@ -62,7 +62,7 @@ Docker는 **컚테읎너 ìŽëŻžì§€**와 **컚테읎너**넌 ìƒì„±í•˜êł  êŽ€ëŠŹ 또한 [Docker Hub](https://hub.docker.com/)에는 닀양한 ë„ê”Ź, 환êČœ, 데읎터ëČ ìŽìŠ€, ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ 위한 믞늏 만듀얎진 **êł”ì‹ 컚테읎너 ìŽëŻžì§€**가 êł”ê°œë˜ì–Ž 있슔니닀. -예넌 듀얎, êł”ì‹ [Python Image](https://hub.docker.com/_/python)가 있슔니닀. +예넌 듀얎, êł”ì‹ [Python ìŽëŻžì§€](https://hub.docker.com/_/python)가 있슔니닀. ê·žëŠŹêł  데읎터ëČ ìŽìŠ€ 등 닀양한 용도의 닀넞 ìŽëŻžì§€ë„ 많읎 있슔니닀. 예넌 듀멎: @@ -81,11 +81,11 @@ Docker나 Kubernetes 같은 ëȘšë“  컚테읎너 êŽ€ëŠŹ 시슀템에는 ìŽëŸŹí•œ ## 컚테읎너와 í”„ëĄœì„žìŠ€ { #containers-and-processes } -**컚테읎너 ìŽëŻžì§€**는 볎톔 **컚테읎너**가 시작될 때 싀행되얎알 하는 êž°ëłž í”„ëĄœê·žëžš/ëȘ…ë čêłŒ 핮ë‹č í”„ëĄœê·žëžšì— ì „ë‹Źí•  ë§€ê°œëł€ìˆ˜ë„Œ 메타데읎터에 íŹí•ší•©ë‹ˆë‹€. 컀맚드 띌읞에서 싀행할 때와 맀우 ìœ ì‚Źí•©ë‹ˆë‹€. +**컚테읎너 ìŽëŻžì§€**는 볎톔 **컚테읎너**가 시작될 때 싀행되얎알 하는 êž°ëłž í”„ëĄœê·žëžš/ëȘ…ë č얎와 핮ë‹č í”„ëĄœê·žëžšì— ì „ë‹Źí•  ë§€ê°œëł€ìˆ˜ë„Œ 메타데읎터에 íŹí•ší•©ë‹ˆë‹€. 컀맚드 띌읞에서 싀행할 때와 맀우 ìœ ì‚Źí•©ë‹ˆë‹€. -**컚테읎너**가 시작되멎 핮ë‹č ëȘ…ë č/í”„ëĄœê·žëžšì„ 싀행합니닀(닀만 였ëČ„ëŒìŽë“œí•˜ì—Ź 닀넞 ëȘ…ë č/í”„ëĄœê·žëžšì„ 싀행하êȌ 할 수도 있슔니닀). +**컚테읎너**가 시작되멎 핮ë‹č ëȘ…ë čì–Ž/í”„ëĄœê·žëžšì„ 싀행합니닀(닀만 였ëČ„ëŒìŽë“œí•˜ì—Ź 닀넞 ëȘ…ë čì–Ž/í”„ëĄœê·žëžšì„ 싀행하êȌ 할 수도 있슔니닀). -컚테읎너는 **메읞 í”„ëĄœì„žìŠ€**(ëȘ…ë č 또는 í”„ëĄœê·žëžš)가 싀행되는 동안 싀행됩니닀. +컚테읎너는 **메읞 í”„ëĄœì„žìŠ€**(ëȘ…ë čì–Ž 또는 í”„ëĄœê·žëžš)가 싀행되는 동안 싀행됩니닀. 컚테읎너는 볎톔 **닚음 í”„ëĄœì„žìŠ€**넌 가지지만, 메읞 í”„ëĄœì„žìŠ€ì—ì„œ ì„œëžŒí”„ëĄœì„žìŠ€ë„Œ 시작할 수도 있윌며, ê·žëŸŹë©Ž 같은 컚테읎너에 **ì—ŹëŸŹ í”„ëĄœì„žìŠ€**가 ìĄŽìžŹí•˜êȌ 됩니닀. @@ -218,11 +218,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] 따띌서 컚테읎너 ìŽëŻžì§€ ëčŒë“œ 시간을 씜적화하렀멎 `Dockerfile`의 **끝부분 ê·ŒìȘ**에 두는 êČƒìŽ 쀑요합니닀. -6. ë‚Žë¶€ì ìœŒëĄœ Uvicorn을 ì‚Źìš©í•˜ëŠ” `fastapi run`을 ì‚Źìš©í•˜ë„ëĄ **ëȘ…ë č**을 섀정합니닀. +6. ë‚Žë¶€ì ìœŒëĄœ Uvicorn을 ì‚Źìš©í•˜ëŠ” `fastapi run`을 ì‚Źìš©í•˜ë„ëĄ **ëȘ…ë čì–Ž**넌 섀정합니닀. `CMD`는 ëŹžìžì—Ž ëŠŹìŠ€íŠžë„Œ 받윌며, 각 ëŹžìžì—Žì€ 컀맚드 띌읞에서 êł”ë°±ìœŒëĄœ ê”Źë¶„í•Ž 입렄하는 항ëȘ©ë“€ìž…니닀. - 읎 ëȘ…ë č은 **í˜„ìžŹ 작업 디렉터멬**에서 싀행되며, 읎는 위에서 `WORKDIR /code`로 섀정한 `/code` ë””ë ‰í„°ëŠŹì™€ 같슔니닀. + 읎 ëȘ…ë č얎는 **í˜„ìžŹ 작업 디렉터멬**에서 싀행되며, 읎는 위에서 `WORKDIR /code`로 섀정한 `/code` ë””ë ‰í„°ëŠŹì™€ 같슔니닀. /// tip | 팁 @@ -258,7 +258,7 @@ FastAPI가 ì •ìƒì ìœŒëĄœ ìą…ëŁŒ(graceful shutdown)ë˜êł  [lifespan 읎ëȀ튞]( 자섞한 낎용은 [shell and exec form에 대한 Docker ëŹžì„œ](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form)넌 ì°žêł í•˜ì„žìš”. -읎는 `docker compose`넌 ì‚Źìš©í•  때 ꜀ 눈에 띌 수 있슔니닀. ìą€ 더 Ʞ술적읞 상섞 낎용은 Docker Compose FAQ ì„č션을 ì°žêł í•˜ì„žìš”: [Why do my services take 10 seconds to recreate or stop?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop). +읎는 `docker compose`넌 ì‚Źìš©í•  때 ꜀ 눈에 띌 수 있슔니닀. ìą€ 더 Ʞ술적읞 상섞 낎용은 Docker Compose FAQ ì„č션을 ì°žêł í•˜ì„žìš”: [왜 낮 서ëč„슀는 닀시 생성되거나 쀑지되는 데 10쎈가 ê±žëŠŹë‚˜ìš”?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop). #### 디렉터멬 ê”ŹìĄ° { #directory-structure } @@ -409,7 +409,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"] 2. 닚음 파음 `main.py`에 있는 ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ ì œêł”(serve)하Ʞ 위핎 `fastapi run`을 ì‚Źìš©í•©ë‹ˆë‹€. -`fastapi run`에 파음을 ì „ë‹Źí•˜ë©Ž, 읎êČƒìŽ 팚킀지의 음부가 아닌 닚음 파음읎띌는 êČƒì„ ìžë™ìœŒëĄœ ê°ì§€í•˜êł , ì–Žë–»êȌ ìž„íŹíŠží•Žì„œ FastAPI 앱을 ì œêł”í• ì§€ 알아냅니닀. 😎 +`fastapi run`에 파음을 ì „ë‹Źí•˜ë©Ž, 읎êČƒìŽ 팚킀지의 음부가 아닌 닚음 파음읎띌는 êČƒì„ ìžë™ìœŒëĄœ ê°ì§€í•˜êł , ì–Žë–»êȌ ìž„íŹíŠží•Žì„œ FastAPI ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ ì œêł”í• ì§€ 알아냅니닀. 😎 ## 배포 개념 { #deployment-concepts } @@ -472,17 +472,17 @@ HTTPS에 ì‚Źìš©ë˜ëŠ” 동음한 **TLS ìą…ëŁŒ í”„ëĄì‹œ** ì»ŽíŹë„ŒíŠžê°€ **로 /// -또한 ì»ší…ŒìŽë„ˆëĄœ 작업할 때, 읎넌 ì‹œìž‘í•˜êł  êŽ€ëŠŹí•˜ëŠ” 시슀템은 ìŽëŻž 핮ë‹č **로드 밞런서**(또는 **TLS ìą…ëŁŒ í”„ëĄì‹œ**)에서 ì—ŹëŸŹë¶„ì˜ 앱읎 있는 ì»ší…ŒìŽë„ˆëĄœ **ë„€íŠžì›ŒíŹ 톔신**(예: HTTP 요ìČ­)을 ì „ë‹Źí•˜ëŠ” 낎부 ë„ê”Źë„Œ ê°€ì§€êł  있슔니닀. +또한 ì»ší…ŒìŽë„ˆëĄœ 작업할 때, 읎넌 ì‹œìž‘í•˜êł  êŽ€ëŠŹí•˜ëŠ” 시슀템은 ìŽëŻž 핮ë‹č **로드 밞런서**(또는 **TLS ìą…ëŁŒ í”„ëĄì‹œ**)에서 ì—ŹëŸŹë¶„ì˜ ì• í”ŒëŠŹìŒ€ìŽì…˜ìŽ 있는 ì»ší…ŒìŽë„ˆëĄœ **ë„€íŠžì›ŒíŹ 톔신**(예: HTTP 요ìČ­)을 ì „ë‹Źí•˜ëŠ” 낎부 ë„ê”Źë„Œ ê°€ì§€êł  있슔니닀. ### 하나의 로드 밞런서 - ì—ŹëŸŹ 워컀 컚테읎너 { #one-load-balancer-multiple-worker-containers } -**Kubernetes** 같은 분산 컚테읎너 êŽ€ëŠŹ 시슀템에서는 낎부 넀튞워í‚č 메컀니슘을 톔핎, 메읞 **포튾**에서 대Ʞ하는 닚음 **로드 밞런서**가 ì—ŹëŸŹë¶„ì˜ 앱을 싀행하는 **ì—ŹëŸŹ 컚테읎너**로 톔신(요ìČ­)을 ì „ë‹Źí•  수 있슔니닀. +**Kubernetes** 같은 분산 컚테읎너 êŽ€ëŠŹ 시슀템에서는 낎부 넀튞워í‚č 메컀니슘을 톔핎, 메읞 **포튾**에서 대Ʞ하는 닚음 **로드 밞런서**가 ì—ŹëŸŹë¶„ì˜ ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ 싀행하는 **ì—ŹëŸŹ 컚테읎너**로 톔신(요ìČ­)을 ì „ë‹Źí•  수 있슔니닀. -앱을 싀행하는 각 컚테읎너는 볎톔 **í”„ëĄœì„žìŠ€ 하나만** 가집니닀(예: FastAPI ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ 싀행하는 Uvicorn í”„ëĄœì„žìŠ€). ëȘšë‘ 같은 êČƒì„ 싀행하는 **동음한 컚테읎너**읎지만, 각자 êł ìœ í•œ í”„ëĄœì„žìŠ€, 메ëȘšëŠŹ 등을 가집니닀. 읎렇êȌ 하멎 CPU의 **ì„œëĄœ 닀넞 윔얎** 또는 **ì„œëĄœ 닀넞 ëšžì‹ **에서 **병렬화**의 읎점을 얻을 수 있슔니닀. +ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ 싀행하는 각 컚테읎너는 볎톔 **í”„ëĄœì„žìŠ€ 하나만** 가집니닀(예: FastAPI ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ 싀행하는 Uvicorn í”„ëĄœì„žìŠ€). ëȘšë‘ 같은 êČƒì„ 싀행하는 **동음한 컚테읎너**읎지만, 각자 êł ìœ í•œ í”„ëĄœì„žìŠ€, 메ëȘšëŠŹ 등을 가집니닀. 읎렇êȌ 하멎 CPU의 **ì„œëĄœ 닀넞 윔얎** 또는 **ì„œëĄœ 닀넞 ëšžì‹ **에서 **병렬화**의 읎점을 얻을 수 있슔니닀. -ê·žëŠŹêł  **로드 밞런서**가 있는 분산 컚테읎너 시슀템은 ì—ŹëŸŹë¶„ì˜ 앱을 싀행하는 각 컚테읎너에 **ëČˆê°ˆì•„ê°€ë©°** 요ìČ­ì„ **분산**합니닀. 따띌서 각 요ìČ­ì€ ì—ŹëŸŹë¶„ì˜ 앱을 싀행하는 ì—ŹëŸŹ **ëł”ì œëœ 컚테읎너** 쀑 하나에서 ìȘ늏될 수 있슔니닀. +ê·žëŠŹêł  **로드 밞런서**가 있는 분산 컚테읎너 시슀템은 ì—ŹëŸŹë¶„ì˜ ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ 싀행하는 각 컚테읎너에 **ëČˆê°ˆì•„ê°€ë©°** 요ìČ­ì„ **분산**합니닀. 따띌서 각 요ìČ­ì€ ì—ŹëŸŹë¶„ì˜ ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ 싀행하는 ì—ŹëŸŹ **ëł”ì œëœ 컚테읎너** 쀑 하나에서 ìȘ늏될 수 있슔니닀. -또한 볎톔 읎 **로드 밞런서**는 íŽëŸŹìŠ€í„° 낮 *닀넞* ì•±ìœŒëĄœ 가는 요ìČ­(예: 닀넞 도메읞, 또는 닀넞 URL êČœëĄœ ì ‘ë‘ì‚Ź ì•„ëž˜ëĄœ 가는 요ìČ­)도 ìȘ멬할 수 있윌며, ê·ž 톔신을 íŽëŸŹìŠ€í„°ì—ì„œ 싀행 쀑읞 *ê·ž 닀넞* ì• í”ŒëŠŹìŒ€ìŽì…˜ì˜ ì˜Źë°”ë„ž ì»ší…ŒìŽë„ˆëĄœ ì „ë‹Źí•  수 있슔니닀. +또한 볎톔 읎 **로드 밞런서**는 íŽëŸŹìŠ€í„° 낮 *닀넞* ì• í”ŒëŠŹìŒ€ìŽì…˜ìœŒëĄœ 가는 요ìČ­(예: 닀넞 도메읞, 또는 닀넞 URL êČœëĄœ ì ‘ë‘ì‚Ź ì•„ëž˜ëĄœ 가는 요ìČ­)도 ìȘ멬할 수 있윌며, ê·ž 톔신을 íŽëŸŹìŠ€í„°ì—ì„œ 싀행 쀑읞 *ê·ž 닀넞* ì• í”ŒëŠŹìŒ€ìŽì…˜ì˜ ì˜Źë°”ë„ž ì»ší…ŒìŽë„ˆëĄœ ì „ë‹Źí•  수 있슔니닀. ### 컚테읎너ë‹č 하나의 í”„ëĄœì„žìŠ€ { #one-process-per-container } @@ -566,7 +566,7 @@ Kubernetes넌 ì‚Źìš©í•œë‹€ë©Ž, 읎는 아마도 [Init Container](https://kuberne ### 닚음 컚테읎너 { #single-container } -**닚음 컚테읎너**에서 ì—ŹëŸŹ **워컀 í”„ëĄœì„žìŠ€**(또는 닚음 í”„ëĄœì„žìŠ€)넌 시작하는 닚순한 셋업읎띌멎, 앱읎 있는 í”„ëĄœì„žìŠ€ë„Œ 시작하Ʞ 직전에 같은 컚테읎너에서 시작 전 ì‚Źì „ ë‹šêł„ë„Œ 싀행할 수 있슔니닀. +**닚음 컚테읎너**에서 ì—ŹëŸŹ **워컀 í”„ëĄœì„žìŠ€**(또는 닚음 í”„ëĄœì„žìŠ€)넌 시작하는 닚순한 셋업읎띌멎, ì• í”ŒëŠŹìŒ€ìŽì…˜ìŽ 있는 í”„ëĄœì„žìŠ€ë„Œ 시작하Ʞ 직전에 같은 컚테읎너에서 시작 전 ì‚Źì „ ë‹šêł„ë„Œ 싀행할 수 있슔니닀. ### ëČ ìŽìŠ€ 도컀 ìŽëŻžì§€ { #base-docker-image } @@ -582,7 +582,7 @@ Kubernetes넌 ì‚Źìš©í•œë‹€ë©Ž, 읎는 아마도 [Init Container](https://kuberne 읎 Docker ìŽëŻžì§€ëŠ” Uvicorn읎 ìŁœì€ 워컀넌 êŽ€ëŠŹí•˜êł  ìžŹì‹œìž‘í•˜ëŠ” Ʞ늄을 지원하지 않던 시Ʞ에 ë§Œë“€ì–ŽìĄŒìŠ”ë‹ˆë‹€. 귞래서 GunicornêłŒ Uvicorn을 핚께 ì‚Źìš©í•Žì•Œ í–ˆêł , Gunicorn읎 Uvicorn 워컀 í”„ëĄœì„žìŠ€ë„Œ êŽ€ëŠŹí•˜êł  ìžŹì‹œìž‘í•˜ë„ëĄ 하Ʞ 위핎 상ë‹č한 ëł”ìžĄì„±ìŽ 추가되었슔니닀. -하지만 읎제 Uvicorn(ê·žëŠŹêł  `fastapi` ëȘ…ë č)은 `--workers`넌 ì§€ì›í•˜ëŻ€ëĄœ, ëČ ìŽìŠ€ 도컀 ìŽëŻžì§€ë„Œ ì‚Źìš©í•˜ëŠ” 대신 직접 ìŽëŻžì§€ë„Œ ëčŒë“œí•˜ì§€ 않을 읎유가 없슔니닀(윔드 양도 ì‚Źì‹€ìƒ 거의 같슔니닀 😅). +하지만 읎제 Uvicorn(ê·žëŠŹêł  `fastapi` ëȘ…ë čì–Ž)은 `--workers`넌 ì§€ì›í•˜ëŻ€ëĄœ, ëČ ìŽìŠ€ 도컀 ìŽëŻžì§€ë„Œ ì‚Źìš©í•˜ëŠ” 대신 직접 ìŽëŻžì§€ë„Œ ëčŒë“œí•˜ì§€ 않을 읎유가 없슔니닀(윔드 양도 ì‚Źì‹€ìƒ 거의 같슔니닀 😅). /// @@ -600,7 +600,7 @@ Kubernetes넌 ì‚Źìš©í•œë‹€ë©Ž, 읎는 아마도 [Init Container](https://kuberne ## `uv`넌 ì‚Źìš©í•˜ëŠ” 도컀 ìŽëŻžì§€ { #docker-image-with-uv } -í”„ëĄœì íŠžë„Œ ì„€ìč˜í•˜êł  êŽ€ëŠŹí•˜êž° 위핎 [uv](https://github.com/astral-sh/uv)넌 ì‚Źìš©í•œë‹€ë©Ž, [uv Docker guide](https://docs.astral.sh/uv/guides/integration/docker/)넌 따넌 수 있슔니닀. +í”„ëĄœì íŠžë„Œ ì„€ìč˜í•˜êł  êŽ€ëŠŹí•˜êž° 위핎 [uv](https://github.com/astral-sh/uv)넌 ì‚Źìš©í•œë‹€ë©Ž, [uv Docker 가읎드](https://docs.astral.sh/uv/guides/integration/docker/)넌 따넌 수 있슔니닀. ## 요앜 { #recap } diff --git a/docs/ko/docs/deployment/https.md b/docs/ko/docs/deployment/https.md index 06ac147cd..1db7dd25c 100644 --- a/docs/ko/docs/deployment/https.md +++ b/docs/ko/docs/deployment/https.md @@ -14,7 +14,7 @@ HTTPS는 귞냄 “쌜젞 있거나” 아니멎 “êșŒì ž 있는” êČƒìŽëŒ 읎제 **개발자 ꎀ점**에서 HTTPS넌 생각할 때 엌두에 두얎알 할 ì—ŹëŸŹ 가지가 있슔니닀: -* HTTPS넌 ì‚Źìš©í•˜ë €ë©Ž, **서ëȄ**가 **제3자**가 발꞉한 **"읞슝서(certificates)"**넌 **ëłŽìœ **핎알 합니닀. +* HTTPS넌 ì‚Źìš©í•˜ë €ë©Ž, **서ëȄ**가 **제3자**가 생성한 **"읞슝서(certificates)"**넌 **ëłŽìœ **핎알 합니닀. * 읎 읞슝서는 ì‹€ì œëĄœ '생성'되는 êČƒìŽ 아니띌 제3ìžëĄœë¶€í„° **발꞉/획득**하는 êČƒìž…ë‹ˆë‹€. * 읞슝서에는 **유횚 êž°ê°„**읎 있슔니닀. * 슉, **만료**됩니닀. diff --git a/docs/ko/docs/deployment/manually.md b/docs/ko/docs/deployment/manually.md index b2a91bd94..fbac8169f 100644 --- a/docs/ko/docs/deployment/manually.md +++ b/docs/ko/docs/deployment/manually.md @@ -1,6 +1,6 @@ # 서ëČ„ë„Œ ìˆ˜ë™ìœŒëĄœ 싀행하Ʞ { #run-a-server-manually } -## `fastapi run` ëȘ…ë č ì‚Źìš©í•˜êž° { #use-the-fastapi-run-command } +## `fastapi run` ëȘ…ë čì–Ž ì‚Źìš©í•˜êž° { #use-the-fastapi-run-command } 요앜하멎, `fastapi run`을 ì‚Źìš©í•Ž FastAPI ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ 서ëč„슀하섞요: @@ -40,7 +40,7 @@ $ fastapi run fastapi run ASGIëŒêł  ë¶ˆëŠŹëŠ”, Python ì›č í”„ë ˆìž„ì›ŒíŹì™€ 서ëČ„ë„Œ 만듀Ʞ 위한 표쀀을 ì‚Źìš©í•©ë‹ˆë‹€. FastAPI는 ASGI ì›č í”„ë ˆìž„ì›ŒíŹìž…ë‹ˆë‹€. -원êČ© 서ëȄ 뚞신에서 **FastAPI** ì• í”ŒëŠŹìŒ€ìŽì…˜(또는 닀넞 ASGI ì• í”ŒëŠŹìŒ€ìŽì…˜)을 싀행하Ʞ 위핎 필요한 í•”ì‹Ź 요소는 **Uvicorn** 같은 ASGI 서ëȄ í”„ëĄœê·žëžšìž…ë‹ˆë‹€. `fastapi` ëȘ…ë č에는 êž°ëłžìœŒëĄœ 읎êČƒìŽ íŹí•šë˜ì–Ž 있슔니닀. +원êČ© 서ëȄ 뚞신에서 **FastAPI** ì• í”ŒëŠŹìŒ€ìŽì…˜(또는 닀넞 ASGI ì• í”ŒëŠŹìŒ€ìŽì…˜)을 싀행하Ʞ 위핎 필요한 í•”ì‹Ź 요소는 **Uvicorn** 같은 ASGI 서ëȄ í”„ëĄœê·žëžšìž…ë‹ˆë‹€. `fastapi` ëȘ…ë č얎에는 êž°ëłžìœŒëĄœ 읎êČƒìŽ íŹí•šë˜ì–Ž 있슔니닀. 닀음을 포핹핮 ì—ŹëŸŹ 대안읎 있슔니닀: @@ -69,7 +69,7 @@ FastAPI는 -"_[...] 저는 요슘 **FastAPI**넌 많읎 ì‚Źìš©í•˜êł  있슔니닀. [...] ì‚Źì‹€ ìš°ëŠŹ 팀의 **ë§ˆìŽíŹëĄœì†Œí”„íŠž ML 서ëč„슀** 전부넌 ë°”êż€ êł„íšìž…ë‹ˆë‹€. 귞쀑 음부는 í•”ì‹Ź **Windows**와 ëȘ‡ëȘ‡ì˜ **Office** 제품듀읎 í†”í•©ë˜êł  있슔니닀._" +"_[...] 저는 요슘 **FastAPI**넌 많읎 ì‚Źìš©í•˜êł  있슔니닀. [...] ì‚Źì‹€ ìš°ëŠŹ 팀의 **ë§ˆìŽíŹëĄœì†Œí”„íŠž ML 서ëč„슀** 전부에 ì‚Źìš©í•  êł„íšìž…ë‹ˆë‹€. 귞쀑 음부는 í•”ì‹Ź **Windows** ì œí’ˆêłŒ 음부 **Office** 제품에 í†”í•©ë˜êł  있슔니닀._"
Kabir Khan - Microsoft (ref)
@@ -137,7 +137,7 @@ FastAPI는 í˜„ëŒ€ì ìŽêł , ëč ë„Žë©°(êł ì„±ëŠ„), íŒŒìŽìŹ 표쀀 타입 힌튾 --- -"_**Netflix**는 ìš°ëŠŹì˜ 였픈 소슀 ë°°íŹíŒìž **위Ʞ êŽ€ëŠŹ** 였쌀슀튞레읎션 í”„ë ˆìž„ì›ŒíŹë„Œ 발표할 수 있얎 Ʞ쁩니닀: 바로 **Dispatch**입니닀! [**FastAPI**로 ëčŒë“œ]_" +"_**Netflix**는 ìš°ëŠŹì˜ **위Ʞ êŽ€ëŠŹ** 였쌀슀튞레읎션 í”„ë ˆìž„ì›ŒíŹìž **Dispatch**의 였픈 소슀 êł”ê°œë„Œ 발표하êȌ 되얎 Ʞ쁩니닀! [**FastAPI**로 ëčŒë“œ]_"
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
@@ -192,7 +192,7 @@ $ pip install "fastapi[standard]"
-**Note**: ëȘšë“  í„°ëŻžë„ì—ì„œ ë™ìž‘í•˜ë„ëĄ `"fastapi[standard]"`넌 ë”°ì˜Ží‘œëĄœ 감싞 ë„Łì—ˆëŠ”ì§€ 확읞하섞요. +**ì°žêł **: ëȘšë“  í„°ëŻžë„ì—ì„œ ë™ìž‘í•˜ë„ëĄ `"fastapi[standard]"`넌 ë”°ì˜Ží‘œëĄœ 감싞 ë„Łì—ˆëŠ”ì§€ 확읞하섞요. ## 예제 { #example } @@ -237,9 +237,9 @@ async def read_item(item_id: int, q: str | None = None): return {"item_id": item_id, "q": q} ``` -**Note**: +**ì°žêł **: -잘 ëȘšë„ŽêȠ닀멎, ["꞉하섞요?"](https://fastapi.tiangolo.com/ko/async/#in-a-hurry) ì„č션을 확읞핎 ëłŽì‹­ì‹œì˜€. +잘 ëȘšë„ŽêȠ닀멎, ëŹžì„œì˜ [`async`와 `await`](https://fastapi.tiangolo.com/ko/async/#in-a-hurry)에 ꎀ한 _"꞉하섞요?"_ ì„č션을 확읞핎 ëłŽì‹­ì‹œì˜€. diff --git a/docs/ko/docs/project-generation.md b/docs/ko/docs/project-generation.md index 774b03a19..3a5a9b940 100644 --- a/docs/ko/docs/project-generation.md +++ b/docs/ko/docs/project-generation.md @@ -1,5 +1,6 @@ # Full Stack FastAPI 템플멿 { #full-stack-fastapi-template } + í…œí”ŒëŠżì€ ìŒë°˜ì ìœŒëĄœ íŠč정 ì„€ì •êłŒ 핚께 ì œêł”ë˜ì§€ë§Œ, ìœ ì—°í•˜êł  컀슀터마읎징읎 가늄하êȌ 디자읞 되었슔니닀. 읎 íŠč성듀은 ì—ŹëŸŹë¶„ìŽ í”„ëĄœì íŠžì˜ ìš”ê”Źì‚Źí•­ì— 맞춰 수정, 적용을 할 수 있êȌ í•ŽìŁŒêł , í…œí”ŒëŠżìŽ 완ëČœí•œ 시작점읎 되êȌ 핎쀍니닀. 🏁 많은 쎈Ʞ 섀정, ëłŽì•ˆ, 데읎터ëČ ìŽìŠ€ 및 음부 API ì—”ë“œíŹìžíŠžê°€ ìŽëŻž 쀀ëč„되얎 ìžˆìœŒëŻ€ëĄœ, ì—ŹëŸŹë¶„ì€ 읎 í…œí”ŒëŠżì„ 시작하는 데 ì‚Źìš©í•  수 있슔니닀. diff --git a/docs/ko/docs/python-types.md b/docs/ko/docs/python-types.md index 10b74b228..a0216cd5b 100644 --- a/docs/ko/docs/python-types.md +++ b/docs/ko/docs/python-types.md @@ -124,7 +124,7 @@ John Doe 읎êČƒì€ **FastAPI**와 핚께 ì‚Źìš©í•  때도 ìŁŒìš” 위ìč˜ìž…니닀. -### Simple 타입 { #simple-types } +### 간닚한 타입 { #simple-types } `str`뿐 아니띌 ëȘšë“  íŒŒìŽìŹ 표쀀 타입을 ì„ ì–ží•  수 있슔니닀. @@ -287,7 +287,7 @@ Pydantic êł”ì‹ ëŹžì„œì˜ 예시: /// note | ì°žêł  -Pydantic에 대핮 더 ì•Œì•„ëłŽë €ë©Ž [ëŹžì„œë„Œ 확읞하섞요](https://docs.pydantic.dev/). +더 ì•Œì•„ëłŽë €ë©Ž [Pydantic ëŹžì„œë„Œ 확읞하섞요](https://docs.pydantic.dev/). /// diff --git a/docs/ko/docs/tutorial/bigger-applications.md b/docs/ko/docs/tutorial/bigger-applications.md index f95286047..bb3637f75 100644 --- a/docs/ko/docs/tutorial/bigger-applications.md +++ b/docs/ko/docs/tutorial/bigger-applications.md @@ -17,16 +17,16 @@ Flask넌 ì‚Źìš©í•Ž ëłŽì…šë‹€ë©Ž, 읎는 Flask의 Blueprints에 핮ë‹č하는 개 ``` . ├── app -│   ├── __init__.py -│   ├── main.py -│   ├── dependencies.py -│   └── routers -│   │ ├── __init__.py -│   │ ├── items.py -│   │ └── users.py -│   └── internal -│   ├── __init__.py -│   └── admin.py +│ ├── __init__.py +│ ├── main.py +│ ├── dependencies.py +│ └── routers +│ │ ├── __init__.py +│ │ ├── items.py +│ │ └── users.py +│ └── internal +│ ├── __init__.py +│ └── admin.py ``` /// tip | 팁 @@ -75,11 +75,11 @@ from app.routers import items ì‚Źìš©ìžë§Œ ìȘ멬하는 전용 파음읎 `/app/routers/users.py`의 submoduleìŽëŒêł  핎뎅시닀. -윔드넌 ì •ëŠŹí•˜êž° 위핎 ì‚Źìš©ìžì™€ ꎀ렚된 *path operations*넌 나뚞지 윔드와 분늏핎 ë‘êł  싶을 êČƒìž…ë‹ˆë‹€. +윔드넌 ì •ëŠŹí•˜êž° 위핎 ì‚Źìš©ìžì™€ ꎀ렚된 *êČœëĄœ ìȘ늏*넌 나뚞지 윔드와 분늏핎 ë‘êł  싶을 êČƒìž…ë‹ˆë‹€. 하지만 읎êČƒì€ ì—Źì „ížˆ 같은 **FastAPI** ì• í”ŒëŠŹìŒ€ìŽì…˜/ì›č API의 음부입니닀(같은 "Python Package"의 음부입니닀). -`APIRouter`넌 ì‚Źìš©í•Ž 핮ë‹č ëȘšë“ˆì˜ *path operations*넌 만듀 수 있슔니닀. +`APIRouter`넌 ì‚Źìš©í•Ž 핮ë‹č ëȘšë“ˆì˜ *êČœëĄœ ìȘ늏*넌 만듀 수 있슔니닀. ### `APIRouter` import하Ʞ { #import-apirouter } @@ -87,9 +87,9 @@ from app.routers import items {* ../../docs_src/bigger_applications/app_an_py310/routers/users.py hl[1,3] title["app/routers/users.py"] *} -### `APIRouter`로 *path operations* 만듀Ʞ { #path-operations-with-apirouter } +### `APIRouter`로 *êČœëĄœ ìȘ늏* 만듀Ʞ { #path-operations-with-apirouter } -ê·ž 닀음 읎넌 ì‚Źìš©í•Ž *path operations*넌 선얞합니닀. +ê·ž 닀음 읎넌 ì‚Źìš©í•Ž *êČœëĄœ ìȘ늏*넌 선얞합니닀. `FastAPI` 큎래슀넌 ì‚Źìš©í•  때와 동음한 ë°©ì‹ìœŒëĄœ ì‚Źìš©í•©ë‹ˆë‹€: @@ -107,7 +107,7 @@ from app.routers import items /// -읎제 읎 `APIRouter`넌 메읞 `FastAPI` 앱에 포핹(include)할 êČƒìŽì§€ë§Œ, 뚌저 dependencies와 닀넞 `APIRouter` 하나넌 확읞핎 볎êČ ìŠ”ë‹ˆë‹€. +읎제 읎 `APIRouter`넌 메읞 `FastAPI` ì• í”ŒëŠŹìŒ€ìŽì…˜ì— 포핹(include)할 êČƒìŽì§€ë§Œ, 뚌저 dependencies와 닀넞 `APIRouter` 하나넌 확읞핎 볎êČ ìŠ”ë‹ˆë‹€. ## Dependencies { #dependencies } @@ -131,7 +131,7 @@ from app.routers import items ì• í”ŒëŠŹìŒ€ìŽì…˜ì˜ "items"넌 ìȘ멬하는 전용 endpoint듀도 `app/routers/items.py` ëȘšë“ˆì— ìžˆë‹€êł  핎뎅시닀. -ì—Źêž°ì—ëŠ” 닀음에 대한 *path operations*가 있슔니닀: +ì—Źêž°ì—ëŠ” 닀음에 대한 *êČœëĄœ ìȘ늏*가 있슔니닀: * `/items/` * `/items/{item_id}` @@ -140,18 +140,18 @@ from app.routers import items 하지만 ìš°ëŠŹëŠ” ìĄ°êžˆ 더 똑똑하êȌ, 윔드넌 앜간 ë‹šìˆœí™”í•˜êł  싶슔니닀. -읎 ëȘšë“ˆì˜ ëȘšë“  *path operations*에는 닀음읎 동음하êȌ 적용됩니닀: +읎 ëȘšë“ˆì˜ ëȘšë“  *êČœëĄœ ìȘ늏*에는 닀음읎 동음하êȌ 적용됩니닀: * êČœëĄœ `prefix`: `/items`. * `tags`: (태귞 하나: `items`). * 추가 `responses`. * `dependencies`: ëȘšë‘ ìš°ëŠŹê°€ 만든 `X-Token` dependency가 필요합니닀. -따띌서 각 *path operation*마닀 ë§€ëȈ ëȘšë‘ 추가하는 대신, `APIRouter`에 한 ëČˆì— 추가할 수 있슔니닀. +따띌서 각 *êČœëĄœ ìȘ늏*마닀 ë§€ëȈ ëȘšë‘ 추가하는 대신, `APIRouter`에 한 ëČˆì— 추가할 수 있슔니닀. {* ../../docs_src/bigger_applications/app_an_py310/routers/items.py hl[5:10,16,21] title["app/routers/items.py"] *} -각 *path operation*의 êČœëĄœëŠ” 닀음ìČ˜ëŸŒ `/`로 시작핎알 하므로: +각 *êČœëĄœ ìȘ늏*의 êČœëĄœëŠ” 닀음ìČ˜ëŸŒ `/`로 시작핎알 하므로: ```Python hl_lines="1" @router.get("/{item_id}") @@ -163,13 +163,13 @@ async def read_item(item_id: str): 따띌서 읎 êČœìš° prefix는 `/items`입니닀. -또한 읎 router에 포핹된 ëȘšë“  *path operations*에 적용될 `tags` ëȘ©ëĄêłŒ 추가 `responses`도 ë„Łì„ 수 있슔니닀. +또한 읎 router에 포핹된 ëȘšë“  *êČœëĄœ ìȘ늏*에 적용될 `tags` ëȘ©ëĄêłŒ 추가 `responses`도 ë„Łì„ 수 있슔니닀. -ê·žëŠŹêł  router의 ëȘšë“  *path operations*에 추가될 `dependencies` ëȘ©ëĄë„ 추가할 수 있윌며, 핮ë‹č êČœëĄœë“€ëĄœ 듀얎였는 각 요ìČ­ë§ˆë‹€ 싀행/핮êČ°ë©ë‹ˆë‹€. +ê·žëŠŹêł  router의 ëȘšë“  *êČœëĄœ ìȘ늏*에 추가될 `dependencies` ëȘ©ëĄë„ 추가할 수 있윌며, 핮ë‹č êČœëĄœë“€ëĄœ 듀얎였는 각 요ìČ­ë§ˆë‹€ 싀행/핮êČ°ë©ë‹ˆë‹€. /// tip | 팁 -[*path operation decorator의 dependencies*](dependencies/dependencies-in-path-operation-decorators.md)와 ë§ˆì°Źê°€ì§€ëĄœ, *path operation function*에 ì–Žë–€ 값도 ì „ë‹Źë˜ì§€ 않슔니닀. +[*êČœëĄœ ìȘ늏 데윔레읎터*의 dependencies](dependencies/dependencies-in-path-operation-decorators.md)와 ë§ˆì°Źê°€ì§€ëĄœ, *êČœëĄœ ìȘ늏 핚수*에 ì–Žë–€ 값도 ì „ë‹Źë˜ì§€ 않슔니닀. /// @@ -183,14 +183,14 @@ async def read_item(item_id: str): * 닚음 ëŹžìžì—Ž `"items"`넌 포핹하는 태귞 ëȘ©ëĄìœŒëĄœ 표시됩니닀. * 읎 "tags"는 자동 대화형 ëŹžì„œ 시슀템(OpenAPI ì‚Źìš©)에 íŠč히 유용합니닀. * ëȘšë‘ 믞늏 정의된 `responses`넌 íŹí•ší•©ë‹ˆë‹€. -* 읎 ëȘšë“  *path operations*는 싀행되Ʞ 전에 `dependencies` ëȘ©ëĄìŽ 평가/싀행됩니닀. - * íŠč정 *path operation*에 dependencies넌 ì¶”ê°€ëĄœ 선얞하멎 **ê·žêČƒë“€ë„ 싀행됩니닀**. - * router dependencies가 뚌저 ì‹€í–‰ë˜êł , ê·ž 닀음에 [decorator의 `dependencies`](dependencies/dependencies-in-path-operation-decorators.md), ê·žëŠŹêł  음반 íŒŒëŒëŻží„° dependencies가 싀행됩니닀. +* 읎 ëȘšë“  *êČœëĄœ ìȘ늏*는 싀행되Ʞ 전에 `dependencies` ëȘ©ëĄìŽ 평가/싀행됩니닀. + * íŠč정 *êČœëĄœ ìȘ늏*에 dependencies넌 ì¶”ê°€ëĄœ 선얞하멎 **ê·žêČƒë“€ë„ 싀행됩니닀**. + * router dependencies가 뚌저 ì‹€í–‰ë˜êł , ê·ž 닀음에 [데윔레읎터의 `dependencies`](dependencies/dependencies-in-path-operation-decorators.md), ê·žëŠŹêł  음반 íŒŒëŒëŻží„° dependencies가 싀행됩니닀. * [`scopes`가 있는 `Security` dependencies](../advanced/security/oauth2-scopes.md)도 추가할 수 있슔니닀. /// tip | 팁 -`APIRouter`에 `dependencies`넌 두는 êČƒì€ 예넌 듀얎 전ìČŽ *path operations* ê·žëŁč에 읞슝을 ìš”ê”Źí•  때 ì‚Źìš©í•  수 있슔니닀. 각 êČœëĄœ ìČ˜ëŠŹì— ê°œëł„ì ìœŒëĄœ dependencies넌 추가하지 않아도 됩니닀. +`APIRouter`에 `dependencies`넌 두는 êČƒì€ 예넌 듀얎 전ìČŽ *êČœëĄœ ìȘ늏* ê·žëŁč에 읞슝을 ìš”ê”Źí•  때 ì‚Źìš©í•  수 있슔니닀. 각 êČœëĄœ ìČ˜ëŠŹì— ê°œëł„ì ìœŒëĄœ dependencies넌 추가하지 않아도 됩니닀. /// @@ -232,7 +232,7 @@ from .dependencies import get_token_header 하지만 ê·ž 파음은 ìĄŽìžŹí•˜ì§€ 않슔니닀. dependencies는 `app/dependencies.py` 파음에 있슔니닀. -ìš°ëŠŹ 앱/파음 ê”ŹìĄ°ë„Œ 닀시 ë– ì˜Źë € ëłŽì„žìš”: +ìš°ëŠŹ ì• í”ŒëŠŹìŒ€ìŽì…˜/파음 ê”ŹìĄ°ë„Œ 닀시 ë– ì˜Źë € ëłŽì„žìš”: @@ -271,13 +271,13 @@ from ...dependencies import get_token_header 읎는 `app/` 위ìȘœì˜ ì–Žë–€ package(자신의 `__init__.py` 파음 등을 가진)에 대한 ì°žìĄ°ê°€ 됩니닀. 하지만 ìš°ëŠŹëŠ” 귞런 êČƒìŽ 없슔니닀. 귞래서 읎 예시에서는 ì—ëŸŹê°€ 발생합니닀. 🚹 -읎제 ì–Žë–»êȌ 동작하는지 알았윌니, 앱읎 얌마나 ëł”ìžĄí•˜ë“  상대 import넌 ì‚Źìš©í•  수 있슔니닀. đŸ€“ +읎제 ì–Žë–»êȌ 동작하는지 알았윌니, ì• í”ŒëŠŹìŒ€ìŽì…˜ìŽ 얌마나 ëł”ìžĄí•˜ë“  상대 import넌 ì‚Źìš©í•  수 있슔니닀. đŸ€“ ### 컀슀텀 `tags`, `responses`, `dependencies` 추가하Ʞ { #add-some-custom-tags-responses-and-dependencies } -`APIRouter`에 ìŽëŻž prefix `/items`와 `tags=["items"]`넌 추가했Ʞ ë•ŒëŹžì— 각 *path operation*에 읎넌 추가하지 않슔니닀. +`APIRouter`에 ìŽëŻž prefix `/items`와 `tags=["items"]`넌 추가했Ʞ ë•ŒëŹžì— 각 *êČœëĄœ ìȘ늏*에 읎넌 추가하지 않슔니닀. -하지만 íŠč정 *path operation*에만 적용될 _추가_ `tags`넌 더할 수도 ìžˆêł , ê·ž *path operation* 전용의 추가 `responses`도 ë„Łì„ 수 있슔니닀: +하지만 íŠč정 *êČœëĄœ ìȘ늏*에만 적용될 _추가_ `tags`넌 더할 수도 ìžˆêł , ê·ž *êČœëĄœ ìȘ늏* 전용의 추가 `responses`도 ë„Łì„ 수 있슔니닀: {* ../../docs_src/bigger_applications/app_an_py310/routers/items.py hl[30:31] title["app/routers/items.py"] *} @@ -416,13 +416,13 @@ router넌 포핹(include)할 때 성늄을 걱정할 필요는 없슔니닀. 읎제 ìĄ°ì§ì—ì„œ `app/internal/admin.py` 파음을 ë°›ì•˜ë‹€êł  가정핎 뎅시닀. -ì—Źêž°ì—ëŠ” ìĄ°ì§ì—ì„œ ì—ŹëŸŹ í”„ëĄœì íŠž 간에 êł”ìœ í•˜ëŠ” êŽ€ëŠŹìžìš© *path operations*가 있는 `APIRouter`가 듀얎 있슔니닀. +ì—Źêž°ì—ëŠ” ìĄ°ì§ì—ì„œ ì—ŹëŸŹ í”„ëĄœì íŠž 간에 êł”ìœ í•˜ëŠ” êŽ€ëŠŹìžìš© *êČœëĄœ ìȘ늏*가 있는 `APIRouter`가 듀얎 있슔니닀. 읎 예시에서는 맀우 닚순하êȌ 만듀êČ ìŠ”ë‹ˆë‹€. 하지만 ìĄ°ì§ 낮 닀넞 í”„ëĄœì íŠžì™€ êł”ìœ ë˜êž° ë•ŒëŹžì—, 읎넌 수정할 수 없얎 `prefix`, `dependencies`, `tags` 등을 `APIRouter`에 직접 추가할 수 ì—†ë‹€êł  핎뎅시닀: {* ../../docs_src/bigger_applications/app_an_py310/internal/admin.py hl[3] title["app/internal/admin.py"] *} -하지만 `APIRouter`넌 포핹할 때 컀슀텀 `prefix`넌 지정핎 ëȘšë“  *path operations*가 `/admin`ìœŒëĄœ 시작하êȌ í•˜êł , 읎 í”„ëĄœì íŠžì—ì„œ ìŽëŻž 가진 `dependencies`로 ëłŽí˜ží•˜êł , `tags`와 `responses`도 íŹí•ší•˜êł  싶슔니닀. +하지만 `APIRouter`넌 포핹할 때 컀슀텀 `prefix`넌 지정핎 ëȘšë“  *êČœëĄœ ìȘ늏*가 `/admin`ìœŒëĄœ 시작하êȌ í•˜êł , 읎 í”„ëĄœì íŠžì—ì„œ ìŽëŻž 가진 `dependencies`로 ëłŽí˜ží•˜êł , `tags`와 `responses`도 íŹí•ší•˜êł  싶슔니닀. 원래 `APIRouter`넌 수정하지 ì•Šêł ë„ `app.include_router()`에 íŒŒëŒëŻží„°ë„Œ ì „ë‹Źí•Žì„œ 읎넌 ì„ ì–ží•  수 있슔니닀: @@ -430,26 +430,26 @@ router넌 포핹(include)할 때 성늄을 걱정할 필요는 없슔니닀. 읎렇êȌ 하멎 원래 `APIRouter`는 수정되지 ì•ŠìœŒëŻ€ëĄœ, ìĄ°ì§ 낮 닀넞 í”„ëĄœì íŠžì—ì„œë„ 동음한 `app/internal/admin.py` 파음을 êł„ì† êł”ìœ í•  수 있슔니닀. -êČ°êłŒì ìœŒëĄœ ìš°ëŠŹ 앱에서 `admin` ëȘšë“ˆì˜ 각 *path operations*는 닀음을 갖êȌ 됩니닀: +êČ°êłŒì ìœŒëĄœ ìš°ëŠŹ ì• í”ŒëŠŹìŒ€ìŽì…˜ì—ì„œ `admin` ëȘšë“ˆì˜ 각 *êČœëĄœ ìȘ늏*는 닀음을 갖êȌ 됩니닀: * prefix `/admin`. * tag `admin`. * dependency `get_token_header`. * 응닔 `418`. đŸ” -하지만 읎는 ìš°ëŠŹ 앱에서 ê·ž `APIRouter`에만 영햄을 ìŁŒë©°, 읎넌 ì‚Źìš©í•˜ëŠ” 닀넞 윔드에는 영햄을 ìŁŒì§€ 않슔니닀. +하지만 읎는 ìš°ëŠŹ ì• í”ŒëŠŹìŒ€ìŽì…˜ì—ì„œ ê·ž `APIRouter`에만 영햄을 ìŁŒë©°, 읎넌 ì‚Źìš©í•˜ëŠ” 닀넞 윔드에는 영햄을 ìŁŒì§€ 않슔니닀. 따띌서 닀넞 í”„ëĄœì íŠžë“€ì€ 같은 `APIRouter`넌 닀넞 읞슝 ë°©ì‹ìœŒëĄœ ì‚Źìš©í•  수도 있슔니닀. -### *path operation* íŹí•ší•˜êž° { #include-a-path-operation } +### *êČœëĄœ ìȘ늏* íŹí•ší•˜êž° { #include-a-path-operation } -*path operations*넌 `FastAPI` 앱에 직접 추가할 수도 있슔니닀. +*êČœëĄœ ìȘ늏*넌 `FastAPI` ì• í”ŒëŠŹìŒ€ìŽì…˜ì— 직접 추가할 수도 있슔니닀. ì—Źêž°ì„œëŠ” 가늄하닀는 êČƒì„ ëłŽì—ŹìŁŒêž° 위핎... 귞냄 핎뎅니닀 đŸ€·: {* ../../docs_src/bigger_applications/app_an_py310/main.py hl[21:23] title["app/main.py"] *} -ê·žëŠŹêł  `app.include_router()`로 추가한 닀넞 ëȘšë“  *path operations*와 핚께 ì˜Źë°”ë„ŽêȌ 동작합니닀. +ê·žëŠŹêł  `app.include_router()`로 추가한 닀넞 ëȘšë“  *êČœëĄœ ìȘ늏*와 핚께 ì˜Źë°”ë„ŽêȌ 동작합니닀. /// note | 맀우 Ʞ술적읞 ì„žë¶€ì‚Źí•­ @@ -459,9 +459,9 @@ router넌 포핹(include)할 때 성늄을 걱정할 필요는 없슔니닀. `APIRouter`는 "mount"되는 êČƒìŽ 아니며, ì• í”ŒëŠŹìŒ€ìŽì…˜ì˜ 나뚞지 ë¶€ë¶„êłŒ êČ©ëŠŹë˜ì–Ž 있지 않슔니닀. -읎는 OpenAPI 슀킀마와 ì‚Źìš©ìž 읞터페읎슀에 귞듀의 *path operations*넌 íŹí•šì‹œí‚€êž° 위핚입니닀. +읎는 OpenAPI 슀킀마와 ì‚Źìš©ìž 읞터페읎슀에 귞듀의 *êČœëĄœ ìȘ늏*넌 íŹí•šì‹œí‚€êž° 위핚입니닀. -FastAPI는 원래의 router와 *path operations*넌 활성 ìƒíƒœëĄœ ìœ ì§€í•˜êł , 요ìČ­ì„ ìČ˜ëŠŹí•˜êł  OpenAPI넌 생성할 때 router의 prefix, dependencies, tags, responses 및 Ʞ타 메타데읎터넌 êČ°í•©í•©ë‹ˆë‹€. +FastAPI는 원래의 router와 êČœëĄœ ìČ˜ëŠŹë„Œ 활성 ìƒíƒœëĄœ ìœ ì§€í•˜êł , 요ìČ­ì„ ìČ˜ëŠŹí•˜êł  OpenAPI넌 생성할 때 router의 prefix, dependencies, tags, responses 및 Ʞ타 메타데읎터넌 êČ°í•©í•©ë‹ˆë‹€. /// @@ -480,7 +480,7 @@ entrypoint = "app.main:app" from app.main import app ``` -읎렇êȌ 하멎 `fastapi` ëȘ…ë čì–Žê°€ ì—ŹëŸŹë¶„ì˜ 앱읎 얎디에 있는지 알 수 있슔니닀. +읎렇êȌ 하멎 `fastapi` ëȘ…ë čì–Žê°€ ì—ŹëŸŹë¶„ì˜ ì• í”ŒëŠŹìŒ€ìŽì…˜ìŽ 얎디에 있는지 알 수 있슔니닀. /// Note | ì°žêł  @@ -498,7 +498,7 @@ $ fastapi dev app/main.py ## 자동 API ëŹžì„œ 확읞하Ʞ { #check-the-automatic-api-docs } -읎제 앱을 싀행하섞요: +읎제 ì• í”ŒëŠŹìŒ€ìŽì…˜ì„ 싀행하섞요:
@@ -532,16 +532,16 @@ $ fastapi dev router.include_router(other_router) ``` -`router`넌 `FastAPI` 앱에 íŹí•ší•˜êž° 전읎든 후든, 얎느 시점에 핮도 됩니닀. FastAPI는 ëŒìš°íŒ…êłŒ OpenAPI에 `other_router`의 *path operations*도 íŹí•ší•©ë‹ˆë‹€. +`router`넌 `FastAPI` ì• í”ŒëŠŹìŒ€ìŽì…˜ì— íŹí•ší•˜êž° 전읎든 후든, 얎느 시점에 핮도 됩니닀. FastAPI는 ëŒìš°íŒ…êłŒ OpenAPI에 `other_router`의 *êČœëĄœ ìȘ늏*도 íŹí•ší•©ë‹ˆë‹€. -나쀑에 router듀에 추가된 *path operations*도 동음하êȌ 적용됩니닀. 읎전에 수행한 íŹí•šì„ 톔핎서도 ëłŽìŽêȌ 됩니닀. +나쀑에 router듀에 추가된 *êČœëĄœ ìȘ늏*도 동음하êȌ 적용됩니닀. 읎전에 수행한 íŹí•šì„ 톔핎서도 ëłŽìŽêȌ 됩니닀. /// warning | Ʞ술 ì„žë¶€ì‚Źí•­ router넌 포핹한 뒀에 `router.routes`넌 직접 변형하는 êČƒì€ 플하섞요. FastAPI는 router íŹí•šì„ ì‹€ì‹œê°„ìœŒëĄœ ìȘ멬하므로, 원래 router와 ê·ž routes는 ëŒìš°íŒ…êłŒ OpenAPI 생성의 ìŒë¶€ëĄœ 낚아 있슔니닀. -êČœëĄœì™€ router넌 추가할 때는 path operation 데윔레읎터와 `.include_router()` 같은 ëŹžì„œí™”ëœ API넌 ì‚Źìš©í•˜ì„žìš”. +êČœëĄœì™€ router넌 추가할 때는 êČœëĄœ ìȘ늏 데윔레읎터와 `.include_router()` 같은 ëŹžì„œí™”ëœ API넌 ì‚Źìš©í•˜ì„žìš”. -`router.routes`는 ì”œìą… *path operations*의 평탄화된 ëȘ©ëĄìŽ 아니띌, route 정의와 포핹된 router넌 닮는 하위 수쀀의 튾멬로 ì·šêž‰í•˜êł , ì—Źêž°ì— ì˜ìĄŽí•˜ì§€ 마섞요. +`router.routes`는 ì”œìą… *êČœëĄœ ìȘ늏*의 평탄화된 ëȘ©ëĄìŽ 아니띌, route 정의와 포핹된 router넌 닮는 하위 수쀀의 튾멬로 ì·šêž‰í•˜êł , ì—Źêž°ì— ì˜ìĄŽí•˜ì§€ 마섞요. /// diff --git a/docs/ko/docs/tutorial/body-nested-models.md b/docs/ko/docs/tutorial/body-nested-models.md index e6c70d179..7ca6305c3 100644 --- a/docs/ko/docs/tutorial/body-nested-models.md +++ b/docs/ko/docs/tutorial/body-nested-models.md @@ -182,7 +182,7 @@ Pydantic ëȘšëž 대신 `dict`로 직접 작업한닀멎 읎런 ìą…ë„˜ì˜ 펞집 또한 킀는 ì–Žë–€ íƒ€ìž…ìŽêł  값은 닀넞 타입읞 `dict`로 ëłžëŹžì„ ì„ ì–ží•  수 있슔니닀. -읎렇êȌ 하멎 (Pydantic ëȘšëžì„ ì‚Źìš©í•˜ëŠ” êČœìš°ìČ˜ëŸŒ) 유횚한 필드/ì–ŽíŠžëŠŹë·°íŠž 읎늄읎 ëŹŽì—‡ìžì§€ 믞늏 알 필요가 없슔니닀. +읎렇êȌ 하멎 (Pydantic ëȘšëžì„ ì‚Źìš©í•˜ëŠ” êČœìš°ì™€ 달멬) 유횚한 필드/ì–ŽíŠžëŠŹë·°íŠž 읎늄읎 ëŹŽì—‡ìžì§€ 믞늏 알 필요가 없슔니닀. 아직 ëȘšë„ŽëŠ” 킀넌 받윌렀는 êČœìš°ì— 유용합니닀. diff --git a/docs/ko/docs/tutorial/body.md b/docs/ko/docs/tutorial/body.md index e5a670baf..dde070807 100644 --- a/docs/ko/docs/tutorial/body.md +++ b/docs/ko/docs/tutorial/body.md @@ -10,7 +10,7 @@ /// note | ì°žêł  -데읎터넌 ëłŽë‚Žêž° 위핎, (ìą€ 더 ëłŽíŽžì ìž) `POST`, `PUT`, `DELETE` í˜č은 `PATCH` 쀑에 하나넌 ì‚Źìš©í•˜ëŠ” êČƒìŽ ìą‹ìŠ”ë‹ˆë‹€. +데읎터넌 ëłŽë‚Žêž° 위핎, `POST` (가임 음반적), `PUT`, `DELETE` í˜č은 `PATCH` 쀑에 하나넌 ì‚Źìš©í•˜ëŠ” êČƒìŽ ìą‹ìŠ”ë‹ˆë‹€. `GET` 요ìČ­ì— ëłžëŹžì„ 닎아 볮낮는 êČƒì€ ëȘ…섞서에 정의되지 않은 행동입니닀. 귞럌에도 ë¶ˆê”Źí•˜êł , 읎 방식은 ì•„ìŁŒ ëł”ìžĄí•œ/ê·č한의 ì‚Źìš© 상황에서만 FastAPI에 의핎 지원됩니닀. @@ -88,7 +88,7 @@ ## 펞집Ʞ 지원 { #editor-support } -펞집Ʞ에서, 핚수 낎에서 타입 힌튞와 완성을 얎디서나 (만앜 Pydantic model 대신에 `dict`을 받을 êČœìš° 나타나지 않을 수 있슔니닀) 받을 수 있슔니닀: +펞집Ʞ에서, 핚수 낎에서 타입 힌튞와 완성을 얎디서나 (만앜 Pydantic ëȘšëž 대신에 `dict`을 받을 êČœìš° 나타나지 않을 수 있슔니닀) 받을 수 있슔니닀: @@ -141,14 +141,14 @@ **볞돞**, **êČœëĄœ** ê·žëŠŹêł  **ìżŒëŠŹ** ë§€ê°œëł€ìˆ˜ ëȘšë‘ 동시에 ì„ ì–ží•  수도 있슔니닀. -**FastAPI**는 각각을 ìžì§€í•˜êł  데읎터넌 ì˜Źë°”ë„ž 위ìč˜ì— ê°€ì žì˜Ź êČƒìž…ë‹ˆë‹€. +**FastAPI**는 각각을 ìžì§€í•˜êł  데읎터넌 ì˜Źë°”ë„ž 위ìč˜ì—ì„œ ê°€ì žì˜Ź êČƒìž…ë‹ˆë‹€. {* ../../docs_src/body/tutorial004_py310.py hl[16] *} 핚수 ë§€ê°œëł€ìˆ˜ëŠ” 닀음을 따띌서 읞지하êȌ 됩니닀: * 만앜 ë§€ê°œëł€ìˆ˜ê°€ **êČœëĄœ**에도 선얞되얎 있닀멎, 읎는 êČœëĄœ ë§€ê°œëł€ìˆ˜ëĄœ ì‚Źìš©ë  êČƒìž…ë‹ˆë‹€. -* 만앜 ë§€ê°œëł€ìˆ˜ê°€ (`int`, `float`, `str`, `bool` ë“±êłŒ 같은) **유음한 타입**ìœŒëĄœ 되얎있윌멎, **ìżŒëŠŹ** ë§€ê°œëł€ìˆ˜ëĄœ 핎석될 êČƒìž…ë‹ˆë‹€. +* 만앜 ë§€ê°œëł€ìˆ˜ê°€ (`int`, `float`, `str`, `bool` ë“±êłŒ 같은) **닚음 타입**ìœŒëĄœ 되얎있윌멎, **ìżŒëŠŹ** ë§€ê°œëł€ìˆ˜ëĄœ 핎석될 êČƒìž…ë‹ˆë‹€. * 만앜 ë§€ê°œëł€ìˆ˜ê°€ **Pydantic ëȘšëž** íƒ€ìž…ìœŒëĄœ 선얞되얎 있윌멎, 요ìČ­ **볞돞**ìœŒëĄœ 핎석될 êČƒìž…ë‹ˆë‹€. /// note | ì°žêł  @@ -163,4 +163,4 @@ FastAPI는 `q`의 값읎 필요없음을 êž°ëłž 값 `= None` ë•ŒëŹžì— 알êȌ ## Pydantic없읎 { #without-pydantic } -만앜 Pydantic ëȘšëžì„ ì‚Źìš©í•˜êł  싶지 않닀멎, **Body** ë§€ê°œëł€ìˆ˜ë„Œ ì‚Źìš©í•  수도 있슔니닀. [Body - Multiple Parameters: Singular values in body](body-multiple-params.md#singular-values-in-body) ëŹžì„œë„Œ 확읞하섞요. +만앜 Pydantic ëȘšëžì„ ì‚Źìš©í•˜êł  싶지 않닀멎, **Body** ë§€ê°œëł€ìˆ˜ë„Œ ì‚Źìš©í•  수도 있슔니닀. [Body - ì—ŹëŸŹ ë§€ê°œëł€ìˆ˜: ëłžëŹžì˜ 닚음 값](body-multiple-params.md#singular-values-in-body) ëŹžì„œë„Œ 확읞하섞요. diff --git a/docs/ko/docs/tutorial/debugging.md b/docs/ko/docs/tutorial/debugging.md index f437286b2..c3d06c0b8 100644 --- a/docs/ko/docs/tutorial/debugging.md +++ b/docs/ko/docs/tutorial/debugging.md @@ -59,7 +59,7 @@ Python에 의핎 ìžë™ìœŒëĄœ 생성된 파음의 낎부 ëł€ìˆ˜ `__name__`은 ```Python from myapp import app -# Some more code +# 추가 윔드 ``` 읎 êČœìš° `myapp.py` 낎부의 자동 ëł€ìˆ˜ `__name__`에는 값읎 `"__main__"`읎 듀얎가지 않슔니닀. @@ -99,7 +99,7 @@ from myapp import app --- -Pycharm을 ì‚Źìš©í•˜ëŠ” êČœìš° 닀음을 수행할 수 있슔니닀 +PyCharm을 ì‚Źìš©í•˜ëŠ” êČœìš° 닀음을 수행할 수 있슔니닀 * "Run" 메뉎넌 엜니닀. * "Debug..." 옔션을 선택합니닀. diff --git a/docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md index 61bb47d9d..67405ff6c 100644 --- a/docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md @@ -4,7 +4,7 @@ FastAPI는 diff --git a/docs/uk/docs/advanced/response-change-status-code.md b/docs/uk/docs/advanced/response-change-status-code.md index 167df8313..e52479228 100644 --- a/docs/uk/docs/advanced/response-change-status-code.md +++ b/docs/uk/docs/advanced/response-change-status-code.md @@ -1,5 +1,6 @@ # Đ’Ń–ĐŽĐżĐŸĐČіЮь - Đ·ĐŒŃ–ĐœĐ° ĐșĐŸĐŽŃƒ статусу { #response-change-status-code } + Đ™ĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐČĐž ĐČжД чОталО, Ń‰ĐŸ ĐŒĐŸĐ¶ĐœĐ° ĐČŃŃ‚Đ°ĐœĐŸĐČото Ń‚ĐžĐżĐŸĐČĐžĐč [ĐșĐŸĐŽ статусу ĐČŃ–ĐŽĐżĐŸĐČіЮі](../tutorial/response-status-code.md). АлД Ń–ĐœĐșĐŸĐ»Đž ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐżĐŸĐČĐ”Ń€ĐœŃƒŃ‚Đž Ń–ĐœŃˆĐžĐč ĐșĐŸĐŽ статусу, ĐœŃ–Đ¶ Ń‚ĐžĐżĐŸĐČĐžĐč. diff --git a/docs/uk/docs/advanced/response-cookies.md b/docs/uk/docs/advanced/response-cookies.md index f4a79fb98..2e062adff 100644 --- a/docs/uk/docs/advanced/response-cookies.md +++ b/docs/uk/docs/advanced/response-cookies.md @@ -26,7 +26,7 @@ {* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *} -/// tip +/// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° МаĐčтД ĐœĐ° уĐČазі, Ń‰ĐŸ яĐșŃ‰ĐŸ ĐČĐž ĐżĐŸĐČДртаєтД ĐČŃ–ĐŽĐżĐŸĐČіЮь Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° `Response`, FastAPI ĐżĐŸĐČĐ”Ń€ĐœĐ” її ĐœĐ°ĐżŃ€ŃĐŒŃƒ. diff --git a/docs/uk/docs/advanced/response-headers.md b/docs/uk/docs/advanced/response-headers.md index 95ab57fe0..67f1f0c6a 100644 --- a/docs/uk/docs/advanced/response-headers.md +++ b/docs/uk/docs/advanced/response-headers.md @@ -38,4 +38,4 @@ МаĐčтД ĐœĐ° уĐČазі, Ń‰ĐŸ ĐČĐ»Đ°ŃĐœŃ– ĐżŃ€ĐŸĐżŃ€Ń–Ń”Ń‚Đ°Ń€ĐœŃ– Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž ĐŒĐŸĐ¶ĐœĐ° ĐŽĐŸĐŽĐ°ĐČато [за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ прДфіĐșса `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -АлД яĐșŃ‰ĐŸ у ĐČас є ĐČĐ»Đ°ŃĐœŃ– Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž, яĐșі ĐșĐ»Ń–Ń”ĐœŃ‚ у Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Ń– ĐŒĐ°Ń” бачОтО, ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐŽĐŸĐŽĐ°Ń‚Đž їх у ĐČашу ĐșĐŸĐœŃ„Ń–ĐłŃƒŃ€Đ°Ń†Ń–ŃŽ CORS (ĐŽĐŸĐșĐ»Đ°ĐŽĐœŃ–ŃˆĐ” ĐČ [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `expose_headers`, Đ·Đ°ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐŸĐČĐ°ĐœĐžĐč у [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— Starlette Ń‰ĐŸĐŽĐŸ CORS](https://www.starlette.dev/middleware/#corsmiddleware). +АлД яĐșŃ‰ĐŸ у ĐČас є ĐČĐ»Đ°ŃĐœŃ– Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž, яĐșі ĐșĐ»Ń–Ń”ĐœŃ‚ у Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Ń– ĐŒĐ°Ń” бачОтО, ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐŽĐŸĐŽĐ°Ń‚Đž їх у ĐČашу ĐșĐŸĐœŃ„Ń–ĐłŃƒŃ€Đ°Ń†Ń–ŃŽ CORS (ĐŽĐŸĐșĐ»Đ°ĐŽĐœŃ–ŃˆĐ” ĐČ [CORS (ŃĐżŃ–Đ»ŃŒĐœĐ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Ń€Đ”ŃŃƒŃ€ŃŃ–ĐČ ĐŒŃ–Đ¶ Ń€Ń–Đ·ĐœĐžĐŒĐž ĐŽĐ¶Đ”Ń€Đ”Đ»Đ°ĐŒĐž)](../tutorial/cors.md)), ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `expose_headers`, Đ·Đ°ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐŸĐČĐ°ĐœĐžĐč у [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— Starlette Ń‰ĐŸĐŽĐŸ CORS](https://www.starlette.dev/middleware/#corsmiddleware). diff --git a/docs/uk/docs/advanced/security/oauth2-scopes.md b/docs/uk/docs/advanced/security/oauth2-scopes.md index 769365d24..7c898da70 100644 --- a/docs/uk/docs/advanced/security/oauth2-scopes.md +++ b/docs/uk/docs/advanced/security/oauth2-scopes.md @@ -76,7 +76,7 @@ OAuth2 Đ·Ń– scopes - цД ĐŒĐ”Ń…Đ°ĐœŃ–Đ·ĐŒ, яĐșĐžĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуют ОсĐșŃ–Đ»ŃŒĐșĐž тДпДр ĐŒĐž ĐŸĐłĐŸĐ»ĐŸŃˆŃƒŃ”ĐŒĐŸ ці scopes, ĐČĐŸĐœĐž Đ·â€™ŃĐČĐ»ŃŃ‚ŃŒŃŃ ĐČ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— API, ĐșĐŸĐ»Đž ĐČĐž уĐČіĐčЎДтД/аĐČŃ‚ĐŸŃ€ĐžĐ·ŃƒŃ”Ń‚Đ”ŃŃ. -І ĐČĐž Đ·ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±Ń€Đ°Ń‚Đž, яĐșі scopes ĐœĐ°ĐŽĐ°Ń‚Đž ĐŽĐŸŃŃ‚ŃƒĐż: `me` і `items`. +І ĐČĐž Đ·ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐ±Ń€Đ°Ń‚Đž, яĐșĐžĐŒ scopes ĐœĐ°ĐŽĐ°Ń‚Đž ĐŽĐŸŃŃ‚ŃƒĐż: `me` і `items`. ĐŠĐ” Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč ĐŒĐ”Ń…Đ°ĐœŃ–Đ·ĐŒ, яĐșĐžĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується, ĐșĐŸĐ»Đž ĐČĐž ĐœĐ°ĐŽĐ°Ń”Ń‚Đ” ĐŽĐŸĐ·ĐČĐŸĐ»Đž піЮ час ĐČŃ…ĐŸĐŽŃƒ чДрДз Facebook, Google, GitHub Ń‚ĐŸŃ‰ĐŸ: @@ -132,7 +132,7 @@ OAuth2 Đ·Ń– scopes - цД ĐŒĐ”Ń…Đ°ĐœŃ–Đ·ĐŒ, яĐșĐžĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуют АлД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо `Security` Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ `Depends`, **FastAPI** Đ·ĐœĐ°Ń‚ĐžĐŒĐ”, Ń‰ĐŸ ĐŒĐŸĐ¶ĐœĐ° ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐČато scopes бДзпДĐșĐž, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато їх ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃŒĐŸ та ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ŃƒĐČато API чДрДз OpenAPI. -ĐšĐŸĐ»Đž ĐČĐž Ń–ĐŒĐżĐŸŃ€Ń‚ŃƒŃ”Ń‚Đ” `Query`, `Path`, `Depends`, `Security` та Ń–ĐœŃˆŃ– Đ· `fastapi`, цД ĐœĐ°ŃĐżŃ€Đ°ĐČЮі Ń„ŃƒĐœĐșції, Ń‰ĐŸ ĐżĐŸĐČĐ”Ń€Ń‚Đ°ŃŽŃ‚ŃŒ ŃĐżĐ”Ń†Ń–Đ°Đ»ŃŒĐœŃ– ĐșласО. +АлД ĐșĐŸĐ»Đž ĐČĐž Ń–ĐŒĐżĐŸŃ€Ń‚ŃƒŃ”Ń‚Đ” `Query`, `Path`, `Depends`, `Security` та Ń–ĐœŃˆŃ– Đ· `fastapi`, цД ĐœĐ°ŃĐżŃ€Đ°ĐČЮі Ń„ŃƒĐœĐșції, Ń‰ĐŸ ĐżĐŸĐČĐ”Ń€Ń‚Đ°ŃŽŃ‚ŃŒ ŃĐżĐ”Ń†Ń–Đ°Đ»ŃŒĐœŃ– ĐșласО. /// @@ -152,7 +152,7 @@ OAuth2 Đ·Ń– scopes - цД ĐŒĐ”Ń…Đ°ĐœŃ–Đ·ĐŒ, яĐșĐžĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуют {* ../../docs_src/security/tutorial005_an_py310.py hl[9,106] *} -## ВоĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД scopes { #use-the-scopes } +## ВоĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД `scopes` { #use-the-scopes } ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `security_scopes` ĐŒĐ°Ń‚ĐžĐŒĐ” топ `SecurityScopes`. @@ -194,9 +194,9 @@ OAuth2 Đ·Ń– scopes - цД ĐŒĐ”Ń…Đ°ĐœŃ–Đ·ĐŒ, яĐșĐžĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуют ЩД раз Ń€ĐŸĐ·ĐłĐ»ŃĐœŃŒĐŒĐŸ ЎДрДĐČĐŸ Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč і scopes. -ОсĐșŃ–Đ»ŃŒĐșĐž Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ `get_current_active_user` ĐŒĐ°Ń” ĐżŃ–ĐŽĐ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ `get_current_user`, scope «me», ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐžĐč у `get_current_active_user`, буЎД ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč ĐŽĐŸ спОсĐșу ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžŃ… scopes у `security_scopes.scopes`, ĐżĐ”Ń€Đ”ĐŽĐ°ĐœĐŸĐłĐŸ ĐŽĐŸ `get_current_user`. +ОсĐșŃ–Đ»ŃŒĐșĐž Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ `get_current_active_user` ĐŒĐ°Ń” ĐżŃ–ĐŽĐ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ `get_current_user`, scope `"me"`, ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐžĐč у `get_current_active_user`, буЎД ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐč ĐŽĐŸ спОсĐșу ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžŃ… scopes у `security_scopes.scopes`, ĐżĐ”Ń€Đ”ĐŽĐ°ĐœĐŸĐłĐŸ ĐŽĐŸ `get_current_user`. -ĐĄĐ°ĐŒĐ° ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń ŃˆĐ»ŃŃ…Ńƒ таĐșĐŸĐ¶ ĐŸĐłĐŸĐ»ĐŸŃˆŃƒŃ” scope «items», ĐŸŃ‚Đ¶Đ” ĐČŃ–Đœ таĐșĐŸĐ¶ буЎД у спОсĐșу `security_scopes.scopes`, ĐżĐ”Ń€Đ”ĐŽĐ°ĐœĐŸĐŒŃƒ ĐŽĐŸ `get_current_user`. +ĐĄĐ°ĐŒĐ° ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń ŃˆĐ»ŃŃ…Ńƒ таĐșĐŸĐ¶ ĐŸĐłĐŸĐ»ĐŸŃˆŃƒŃ” scope `"items"`, ĐŸŃ‚Đ¶Đ” ĐČŃ–Đœ таĐșĐŸĐ¶ буЎД у спОсĐșу `security_scopes.scopes`, ĐżĐ”Ń€Đ”ĐŽĐ°ĐœĐŸĐŒŃƒ ĐŽĐŸ `get_current_user`. Ось яĐș ĐČĐžĐłĐ»ŃĐŽĐ°Ń” ієрархія Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč і scopes: diff --git a/docs/uk/docs/advanced/settings.md b/docs/uk/docs/advanced/settings.md index b369e2f12..867eb23b0 100644 --- a/docs/uk/docs/advanced/settings.md +++ b/docs/uk/docs/advanced/settings.md @@ -100,7 +100,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p ## ĐĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ ĐČ Ń–ĐœŃˆĐŸĐŒŃƒ ĐŒĐŸĐŽŃƒĐ»Ń– { #settings-in-another-module } -Во ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń€ĐŸĐ·ĐŒŃ–ŃŃ‚ĐžŃ‚Đž ці ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ ĐČ Ń–ĐœŃˆĐŸĐŒŃƒ ĐŒĐŸĐŽŃƒĐ»Ń–, яĐș ĐČĐž бачОлО ĐČ [Đ‘Ń–Đ»ŃŒŃˆŃ– Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž - ĐșŃ–Đ»ŃŒĐșа фаĐčліĐČ](../tutorial/bigger-applications.md). +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń€ĐŸĐ·ĐŒŃ–ŃŃ‚ĐžŃ‚Đž ці ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ ĐČ Ń–ĐœŃˆĐŸĐŒŃƒ фаĐčлі ĐŒĐŸĐŽŃƒĐ»Ń, яĐș ĐČĐž бачОлО ĐČ [Đ‘Ń–Đ»ŃŒŃˆŃ– Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž - ĐșŃ–Đ»ŃŒĐșа фаĐčліĐČ](../tutorial/bigger-applications.md). НапроĐșлаЎ, у ĐČас ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž фаĐčĐ» `config.py` Đ·: @@ -297,6 +297,6 @@ participant execute as Execute function Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Pydantic Settings ĐŽĐ»Ń ĐŸĐ±Ń€ĐŸĐ±ĐșĐž ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœŃŒ Đ°Đ±ĐŸ ĐșĐŸĐœŃ„Ń–ĐłŃƒŃ€Đ°Ń†Ń–Đč ĐČĐ°ŃˆĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу, Đ· усією ĐżĐŸŃ‚ŃƒĐ¶ĐœŃ–ŃŃ‚ŃŽ ĐŒĐŸĐŽĐ”Đ»Đ”Đč Pydantic. -- ВоĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃĐżŃ€ĐŸŃŃ‚ĐžŃ‚Đž Ń‚Đ”ŃŃ‚ŃƒĐČĐ°ĐœĐœŃ. -- Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Đ· ĐœĐžĐŒ фаĐčлО `.env`. -- ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ `@lru_cache` Юає Đ·ĐŒĐŸĐłŃƒ ŃƒĐœĐžĐșĐœŃƒŃ‚Đž ĐżĐŸĐČŃ‚ĐŸŃ€ĐœĐŸĐłĐŸ Ń‡ĐžŃ‚Đ°ĐœĐœŃ фаĐčла dotenv ĐŽĐ»Ń ĐșĐŸĐ¶ĐœĐŸĐłĐŸ Đ·Đ°ĐżĐžŃ‚Ńƒ, ĐČĐŸĐŽĐœĐŸŃ‡Đ°Ń ĐŽĐŸĐ·ĐČĐŸĐ»ŃŃŽŃ‡Đž ĐżĐ”Ń€Đ”ĐżĐžŃŃƒĐČато ĐčĐŸĐłĐŸ піЮ час Ń‚Đ”ŃŃ‚ŃƒĐČĐ°ĐœĐœŃ. +* ВоĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ŃĐżŃ€ĐŸŃŃ‚ĐžŃ‚Đž Ń‚Đ”ŃŃ‚ŃƒĐČĐ°ĐœĐœŃ. +* Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Đ· ĐœĐžĐŒ фаĐčлО `.env`. +* ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ `@lru_cache` Юає Đ·ĐŒĐŸĐłŃƒ ŃƒĐœĐžĐșĐœŃƒŃ‚Đž ĐżĐŸĐČŃ‚ĐŸŃ€ĐœĐŸĐłĐŸ Ń‡ĐžŃ‚Đ°ĐœĐœŃ фаĐčла dotenv ĐŽĐ»Ń ĐșĐŸĐ¶ĐœĐŸĐłĐŸ Đ·Đ°ĐżĐžŃ‚Ńƒ, ĐČĐŸĐŽĐœĐŸŃ‡Đ°Ń ĐŽĐŸĐ·ĐČĐŸĐ»ŃŃŽŃ‡Đž ĐżĐ”Ń€Đ”ĐżĐžŃŃƒĐČато ĐčĐŸĐłĐŸ піЮ час Ń‚Đ”ŃŃ‚ŃƒĐČĐ°ĐœĐœŃ. diff --git a/docs/uk/docs/advanced/stream-data.md b/docs/uk/docs/advanced/stream-data.md index 8ddfa38fb..29d66739e 100644 --- a/docs/uk/docs/advanced/stream-data.md +++ b/docs/uk/docs/advanced/stream-data.md @@ -2,7 +2,7 @@ ĐŻĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” пДрДЎаĐČато ĐżĐŸŃ‚ĐŸĐșĐŸĐŒ ĐŽĐ°ĐœŃ–, яĐșі ĐŒĐŸĐ¶ĐœĐ° струĐșтуруĐČато яĐș JSON, ĐŽĐžĐČ. [ĐŸĐŸŃ‚ĐŸĐșĐŸĐČа пДрДЎача JSON Lines](../tutorial/stream-json-lines.md). -АлД яĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” пДрДЎаĐČато ĐżĐŸŃ‚ĐŸĐșĐŸĐŒ чості Đ±Ń–ĐœĐ°Ń€ĐœŃ– ĐŽĐ°ĐœŃ– Đ°Đ±ĐŸ ŃŃ‚Ń€ĐŸĐșĐž, ĐŸŃŃŒ яĐș цД Đ·Ń€ĐŸĐ±ĐžŃ‚Đž. +АлД яĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” пДрДЎаĐČато ĐżĐŸŃ‚ĐŸĐșĐŸĐŒ **чості Đ±Ń–ĐœĐ°Ń€ĐœŃ– ĐŽĐ°ĐœŃ–** Đ°Đ±ĐŸ ŃŃ‚Ń€ĐŸĐșĐž, ĐŸŃŃŒ яĐș цД Đ·Ń€ĐŸĐ±ĐžŃ‚Đž. /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа @@ -12,21 +12,21 @@ ## Đ’Đ°Ń€Ń–Đ°ĐœŃ‚Đž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ { #use-cases } -ĐŠĐ” ĐŒĐŸĐ¶ĐœĐ° ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато, яĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” пДрДЎаĐČато ĐżĐŸŃ‚ĐŸĐșĐŸĐŒ чості ŃŃ‚Ń€ĐŸĐșĐž, ĐœĐ°ĐżŃ€ĐžĐșлаЎ Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Đ· ĐČĐžĐČĐŸĐŽŃƒ сДрĐČісу AI LLM. +ĐŠĐ” ĐŒĐŸĐ¶ĐœĐ° ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато, яĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” пДрДЎаĐČато ĐżĐŸŃ‚ĐŸĐșĐŸĐŒ чості ŃŃ‚Ń€ĐŸĐșĐž, ĐœĐ°ĐżŃ€ĐžĐșлаЎ Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Đ· ĐČĐžĐČĐŸĐŽŃƒ сДрĐČісу **AI LLM**. -йаĐșĐŸĐ¶ цД ĐŒĐŸĐ¶ĐœĐ° ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐŽĐ»Ń ĐżĐŸŃ‚ĐŸĐșĐŸĐČĐŸŃ— пДрДЎачі ĐČДлОĐșох Đ±Ń–ĐœĐ°Ń€ĐœĐžŃ… фаĐčліĐČ, ĐșĐŸĐ»Đž ĐČĐž ĐœĐ°ĐŽŃĐžĐ»Đ°Ń”Ń‚Đ” ĐșĐŸĐ¶ĐœĐžĐč Ń„Ń€Đ°ĐłĐŒĐ”ĐœŃ‚ ĐŽĐ°ĐœĐžŃ… піЮ час Ń‡ĐžŃ‚Đ°ĐœĐœŃ, бДз ĐżĐŸŃ‚Ń€Đ”Đ±Đž заĐČĐ°ĐœŃ‚Đ°Đ¶ŃƒĐČато ĐČсД ĐČ ĐżĐ°ĐŒ'ять ĐŸĐŽŃ€Đ°Đ·Ńƒ. +йаĐșĐŸĐ¶ цД ĐŒĐŸĐ¶ĐœĐ° ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐŽĐ»Ń ĐżĐŸŃ‚ĐŸĐșĐŸĐČĐŸŃ— пДрДЎачі **ĐČДлОĐșох Đ±Ń–ĐœĐ°Ń€ĐœĐžŃ… фаĐčліĐČ**, ĐșĐŸĐ»Đž ĐČĐž ĐœĐ°ĐŽŃĐžĐ»Đ°Ń”Ń‚Đ” ĐșĐŸĐ¶ĐœĐžĐč Ń„Ń€Đ°ĐłĐŒĐ”ĐœŃ‚ ĐŽĐ°ĐœĐžŃ… піЮ час Ń‡ĐžŃ‚Đ°ĐœĐœŃ, бДз ĐżĐŸŃ‚Ń€Đ”Đ±Đž заĐČĐ°ĐœŃ‚Đ°Đ¶ŃƒĐČато ĐČсД ĐČ ĐżĐ°ĐŒ'ять ĐŸĐŽŃ€Đ°Đ·Ńƒ. -йаĐș ŃĐ°ĐŒĐŸ ĐŒĐŸĐ¶ĐœĐ° ŃŃ‚Ń€Ń–ĐŒĐžŃ‚Đž ĐČŃ–ĐŽĐ”ĐŸ чо Đ°ŃƒĐŽŃ–ĐŸ; їх ĐœĐ°ĐČіть ĐŒĐŸĐ¶ĐœĐ° ĐłĐ”ĐœĐ”Ń€ŃƒĐČато піЮ час ĐŸĐ±Ń€ĐŸĐ±ĐșĐž та ĐœĐ°ĐŽŃĐžĐ»Đ°ĐœĐœŃ. +йаĐș ŃĐ°ĐŒĐŸ ĐŒĐŸĐ¶ĐœĐ° ŃŃ‚Ń€Ń–ĐŒĐžŃ‚Đž **ĐČŃ–ĐŽĐ”ĐŸ** чо **Đ°ŃƒĐŽŃ–ĐŸ**; їх ĐœĐ°ĐČіть ĐŒĐŸĐ¶ĐœĐ° ĐłĐ”ĐœĐ”Ń€ŃƒĐČато піЮ час ĐŸĐ±Ń€ĐŸĐ±ĐșĐž та ĐœĐ°ĐŽŃĐžĐ»Đ°ĐœĐœŃ. ## `StreamingResponse` Đ· `yield` { #a-streamingresponse-with-yield } -ĐŻĐșŃ‰ĐŸ ĐČĐž ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đ” `response_class=StreamingResponse` у ĐČашіĐč Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `yield`, Ń‰ĐŸĐ± ĐżĐŸŃĐ»Ń–ĐŽĐŸĐČĐœĐŸ ĐœĐ°ĐŽŃĐžĐ»Đ°Ń‚Đž ĐșĐŸĐ¶ĐœĐžĐč Ń„Ń€Đ°ĐłĐŒĐ”ĐœŃ‚ ĐŽĐ°ĐœĐžŃ…. +ĐŻĐșŃ‰ĐŸ ĐČĐž ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đ” `response_class=StreamingResponse` у ĐČашіĐč *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `yield`, Ń‰ĐŸĐ± ĐżĐŸŃĐ»Ń–ĐŽĐŸĐČĐœĐŸ ĐœĐ°ĐŽŃĐžĐ»Đ°Ń‚Đž ĐșĐŸĐ¶ĐœĐžĐč Ń„Ń€Đ°ĐłĐŒĐ”ĐœŃ‚ ĐŽĐ°ĐœĐžŃ…. {* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *} FastAPI пДрДЎаĐČĐ°Ń‚ĐžĐŒĐ” ĐșĐŸĐ¶ĐœĐžĐč Ń„Ń€Đ°ĐłĐŒĐ”ĐœŃ‚ ĐŽĐ°ĐœĐžŃ… ĐŽĐŸ `StreamingResponse` яĐș є; ĐČŃ–Đœ ĐœĐ” ĐœĐ°ĐŒĐ°ĐłĐ°Ń‚ĐžĐŒĐ”Ń‚ŃŒŃŃ пДрДтĐČĐŸŃ€ĐžŃ‚Đž ĐčĐŸĐłĐŸ ĐœĐ° JSON чо Ń‰ĐŸŃŃŒ ĐżĐŸĐŽŃ–Đ±ĐœĐ”. -### ĐĐ”-async Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ { #non-async-path-operation-functions } +### ĐĐ”-async *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* { #non-async-path-operation-functions } ĐœĐŸĐ¶ĐœĐ° таĐșĐŸĐ¶ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Đ·ĐČочаĐčĐœŃ– Ń„ŃƒĐœĐșції `def` (бДз `async`) і таĐș ŃĐ°ĐŒĐŸ Đ·Đ°ŃŃ‚ĐŸŃĐŸĐČуĐČато `yield`. @@ -40,7 +40,7 @@ FastAPI пДрДЎаĐČĐ°Ń‚ĐžĐŒĐ” ĐșĐŸĐ¶ĐœĐžĐč Ń„Ń€Đ°ĐłĐŒĐ”ĐœŃ‚ ĐŽĐ°ĐœĐžŃ… ĐŽĐŸ ` {* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} -ĐŠĐ” таĐșĐŸĐ¶ ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ Đ· `StreamingResponse` у ĐČас є сĐČĐŸĐ±ĐŸĐŽĐ° і ĐČŃ–ĐŽĐżĐŸĐČŃ–ĐŽĐ°Đ»ŃŒĐœŃ–ŃŃ‚ŃŒ Ń„ĐŸŃ€ĐŒŃƒĐČато та ĐșĐŸĐŽŃƒĐČато баĐčто ĐŽĐ°ĐœĐžŃ… ŃĐ°ĐŒĐ” таĐș, яĐș їх ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐœĐ°ĐŽŃ–ŃĐ»Đ°Ń‚Đž, ĐœĐ”Đ·Đ°Đ»Đ”Đ¶ĐœĐŸ ĐČіЮ Đ°ĐœĐŸŃ‚Đ°Ń†Ń–Đč топіĐČ. đŸ€“ +ĐŠĐ” таĐșĐŸĐ¶ ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ Đ· `StreamingResponse` у ĐČас є **сĐČĐŸĐ±ĐŸĐŽĐ°** і **ĐČŃ–ĐŽĐżĐŸĐČŃ–ĐŽĐ°Đ»ŃŒĐœŃ–ŃŃ‚ŃŒ** Ń„ĐŸŃ€ĐŒŃƒĐČато та ĐșĐŸĐŽŃƒĐČато баĐčто ĐŽĐ°ĐœĐžŃ… ŃĐ°ĐŒĐ” таĐș, яĐș їх ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐœĐ°ĐŽŃ–ŃĐ»Đ°Ń‚Đž, ĐœĐ”Đ·Đ°Đ»Đ”Đ¶ĐœĐŸ ĐČіЮ Đ°ĐœĐŸŃ‚Đ°Ń†Ń–Đč топіĐČ. đŸ€“ ### ĐŸĐŸŃ‚Ń–Đș баĐčтіĐČ { #stream-bytes } @@ -58,7 +58,7 @@ FastAPI пДрДЎаĐČĐ°Ń‚ĐžĐŒĐ” ĐșĐŸĐ¶ĐœĐžĐč Ń„Ń€Đ°ĐłĐŒĐ”ĐœŃ‚ ĐŽĐ°ĐœĐžŃ… ĐŽĐŸ ` {* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} -ĐŸĐŸŃ‚Ń–ĐŒ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž цДĐč ĐœĐŸĐČĐžĐč Đșлас у `response_class=PNGStreamingResponse` у ĐČашіĐč Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ: +ĐŸĐŸŃ‚Ń–ĐŒ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž цДĐč ĐœĐŸĐČĐžĐč Đșлас у `response_class=PNGStreamingResponse` у ĐČашіĐč *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*: {* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} @@ -98,7 +98,7 @@ FastAPI пДрДЎаĐČĐ°Ń‚ĐžĐŒĐ” ĐșĐŸĐ¶ĐœĐžĐč Ń„Ń€Đ°ĐłĐŒĐ”ĐœŃ‚ ĐŽĐ°ĐœĐžŃ… ĐŽĐŸ ` /// -Đ©ĐŸĐ± ŃƒĐœĐžĐșĐœŃƒŃ‚Đž Đ±Đ»ĐŸĐșуĐČĐ°ĐœĐœŃ цоĐșлу ĐżĐŸĐŽŃ–Đč, ĐżŃ€ĐŸŃŃ‚ĐŸ ĐŸĐłĐŸĐ»ĐŸŃŃ–Ń‚ŃŒ Ń„ŃƒĐœĐșцію ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ Đ·Ń– Đ·ĐČочаĐčĐœĐžĐŒ `def` Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ `async def`. ĐąĐŸĐŽŃ– FastAPI ĐČĐžĐșĐŸĐœŃƒĐČĐ°Ń‚ĐžĐŒĐ” її ĐČ ĐżŃ€Đ°Ń†Ń–ĐČĐœĐžĐșу пулу ĐżĐŸŃ‚ĐŸĐșіĐČ, Ń‰ĐŸĐ± ĐœĐ” Đ±Đ»ĐŸĐșуĐČато ĐłĐŸĐ»ĐŸĐČĐœĐžĐč цоĐșĐ». +Đ©ĐŸĐ± ŃƒĐœĐžĐșĐœŃƒŃ‚Đž Đ±Đ»ĐŸĐșуĐČĐ°ĐœĐœŃ цоĐșлу ĐżĐŸĐŽŃ–Đč, ĐżŃ€ĐŸŃŃ‚ĐŸ ĐŸĐłĐŸĐ»ĐŸŃŃ–Ń‚ŃŒ *Ń„ŃƒĐœĐșцію ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* Đ·Ń– Đ·ĐČочаĐčĐœĐžĐŒ `def` Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ `async def`. ĐąĐŸĐŽŃ– FastAPI ĐČĐžĐșĐŸĐœŃƒĐČĐ°Ń‚ĐžĐŒĐ” її ĐČ ĐżŃ€Đ°Ń†Ń–ĐČĐœĐžĐșу пулу ĐżĐŸŃ‚ĐŸĐșіĐČ, Ń‰ĐŸĐ± ĐœĐ” Đ±Đ»ĐŸĐșуĐČато ĐłĐŸĐ»ĐŸĐČĐœĐžĐč цоĐșĐ». {* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} diff --git a/docs/uk/docs/advanced/wsgi.md b/docs/uk/docs/advanced/wsgi.md index 51ca6f6fb..aa4dcb6b0 100644 --- a/docs/uk/docs/advanced/wsgi.md +++ b/docs/uk/docs/advanced/wsgi.md @@ -1,5 +1,6 @@ # ПіЮĐșĐ»ŃŽŃ‡Đ”ĐœĐœŃ WSGI - Flask, Django та Ń–ĐœŃˆŃ– { #including-wsgi-flask-django-others } + Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŒĐŸĐœŃ‚ŃƒĐČато Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž WSGI, яĐș ĐČĐž бачОлО ĐČ [ĐŸŃ–ĐŽĐ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž - ĐŒĐŸĐœŃ‚ŃƒĐČĐ°ĐœĐœŃ](sub-applications.md), [За прДЎстаĐČĐœĐžĐșĐŸĐŒ](behind-a-proxy.md). Đ”Đ»Ń Ń†ŃŒĐŸĐłĐŸ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž `WSGIMiddleware` і ĐŸĐ±ĐłĐŸŃ€ĐœŃƒŃ‚Đž ĐœĐžĐŒ ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș WSGI, ĐœĐ°ĐżŃ€ĐžĐșлаЎ Flask, Django Ń‚ĐŸŃ‰ĐŸ. diff --git a/docs/uk/docs/alternatives.md b/docs/uk/docs/alternatives.md index 155c727df..f903f3f20 100644 --- a/docs/uk/docs/alternatives.md +++ b/docs/uk/docs/alternatives.md @@ -44,11 +44,11 @@ Django REST Framework стĐČĐŸŃ€ĐžĐČ ĐąĐŸĐŒ Крісті. ĐąĐŸĐč ŃĐ°ĐŒĐžĐč тĐČ ### [Flask](https://flask.palletsprojects.com) { #flask } -Flask — цД Â«ĐŒŃ–ĐșŃ€ĐŸŃ„Ń€Đ”ĐčĐŒĐČĐŸŃ€Đș», ĐČŃ–Đœ ĐœĐ” ĐČĐșлючає Ń–ĐœŃ‚Đ”ĐłŃ€Đ°Ń†Ń–ŃŽ базО ĐŽĐ°ĐœĐžŃ…, а таĐșĐŸĐ¶ Đ±Đ°ĐłĐ°Ń‚ĐŸ рДчДĐč, яĐșі за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ є ĐČ Django. +Flask - цД Â«ĐŒŃ–ĐșŃ€ĐŸŃ„Ń€Đ”ĐčĐŒĐČĐŸŃ€Đș», ĐČŃ–Đœ ĐœĐ” ĐČĐșлючає Ń–ĐœŃ‚Đ”ĐłŃ€Đ°Ń†Ń–ŃŽ базО ĐŽĐ°ĐœĐžŃ…, а таĐșĐŸĐ¶ Đ±Đ°ĐłĐ°Ń‚ĐŸ рДчДĐč, яĐșі за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ є ĐČ Django. Щя ĐżŃ€ĐŸŃŃ‚ĐŸŃ‚Đ° та ĐłĐœŃƒŃ‡Đșість ĐŽĐŸĐ·ĐČĐŸĐ»ŃŃŽŃ‚ŃŒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато базО ĐŽĐ°ĐœĐžŃ… NoSQL яĐș ĐŸŃĐœĐŸĐČĐœŃƒ ŃĐžŃŃ‚Đ”ĐŒŃƒ Đ·Đ±Đ”Ń€Ń–ĐłĐ°ĐœĐœŃ ĐŽĐ°ĐœĐžŃ…. -ОсĐșŃ–Đ»ŃŒĐșĐž ĐČŃ–Đœ ЎужД ĐżŃ€ĐŸŃŃ‚ĐžĐč, ĐČŃ–Đœ ĐżĐŸŃ€Ń–ĐČĐœŃĐœĐŸ лДгĐșĐžĐč та Ń–ĐœŃ‚ŃƒŃ—Ń‚ĐžĐČĐœĐžĐč ĐŽĐ»Ń ĐŸŃĐČĐŸŃ”ĐœĐœŃ, Ń…ĐŸŃ‡Đ° ĐČ ĐŽĐ”ŃĐșох ĐŒĐŸĐŒĐ”ĐœŃ‚Đ°Ń… ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń стає ĐŽĐ”Ń‰ĐŸ Ń‚Đ”Ń…ĐœŃ–Ń‡ĐœĐŸŃŽ. +ОсĐșŃ–Đ»ŃŒĐșĐž ĐČŃ–Đœ ЎужД ĐżŃ€ĐŸŃŃ‚ĐžĐč, ĐČŃ–Đœ ĐżĐŸŃ€Ń–ĐČĐœŃĐœĐŸ Ń–ĐœŃ‚ŃƒŃ—Ń‚ĐžĐČĐœĐžĐč ĐŽĐ»Ń ĐŸŃĐČĐŸŃ”ĐœĐœŃ, Ń…ĐŸŃ‡Đ° ĐČ ĐŽĐ”ŃĐșох ĐŒĐŸĐŒĐ”ĐœŃ‚Đ°Ń… ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń стає ĐŽĐ”Ń‰ĐŸ Ń‚Đ”Ń…ĐœŃ–Ń‡ĐœĐŸŃŽ. Đ’Ń–Đœ таĐșĐŸĐ¶ зазĐČочаĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ĐŽĐ»Ń Ń–ĐœŃˆĐžŃ… ĐżŃ€ĐŸĐłŃ€Đ°ĐŒ, яĐșĐžĐŒ ĐœĐ” ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐŸ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐ° база ĐŽĐ°ĐœĐžŃ…, ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČĐ°Ń‡Đ°ĐŒĐž Đ°Đ±ĐŸ Đ±ŃƒĐŽŃŒ-яĐșа Đ· Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… Ń„ŃƒĐœĐșціĐč, яĐșі є ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐČĐ±ŃƒĐŽĐŸĐČĐ°ĐœĐžĐŒĐž ĐČ Django. Đ„ĐŸŃ‡Đ° Đ±Đ°ĐłĐ°Ń‚ĐŸ Đ· цох Ń„ŃƒĐœĐșціĐč ĐŒĐŸĐ¶ĐœĐ° ĐŽĐŸĐŽĐ°Ń‚Đž за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ ĐżĐ»Đ°ĐłŃ–ĐœŃ–ĐČ. @@ -72,7 +72,7 @@ Flask — цД Â«ĐŒŃ–ĐșŃ€ĐŸŃ„Ń€Đ”ĐčĐŒĐČĐŸŃ€Đș», ĐČŃ–Đœ ĐœĐ” ĐČĐșлючає Ń–Đœ АлД ĐČсД ж FastAPI чДрпаĐČ ĐœĐ°Ń‚Ń…ĐœĐ”ĐœĐœŃ Đ· Requests. -**Requests** — цД Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșа ĐŽĐ»Ń *ĐČĐ·Đ°Ń”ĐŒĐŸĐŽŃ–Ń—* Đ· API (яĐș ĐșĐ»Ń–Ń”ĐœŃ‚), а **FastAPI** — цД Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșа ĐŽĐ»Ń *стĐČĐŸŃ€Đ”ĐœĐœŃ* API (яĐș сДрĐČДр). +**Requests** - цД Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșа ĐŽĐ»Ń *ĐČĐ·Đ°Ń”ĐŒĐŸĐŽŃ–Ń—* Đ· API (яĐș ĐșĐ»Ń–Ń”ĐœŃ‚), а **FastAPI** - цД Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșа ĐŽĐ»Ń *стĐČĐŸŃ€Đ”ĐœĐœŃ* API (яĐș сДрĐČДр). Đ’ĐŸĐœĐž Đ±Ń–Đ»ŃŒŃˆ-ĐŒĐ”ĐœŃˆ Đ·ĐœĐ°Ń…ĐŸĐŽŃŃ‚ŃŒŃŃ ĐœĐ° ĐżŃ€ĐŸŃ‚ĐžĐ»Đ”Đ¶ĐœĐžŃ… ĐșŃ–ĐœŃ†ŃŃ…, ĐŽĐŸĐżĐŸĐČĐœŃŽŃŽŃ‡Đž ĐŸĐŽĐœĐ° ĐŸĐŽĐœŃƒ. @@ -88,7 +88,7 @@ Requests ĐŒĐ°ŃŽŃ‚ŃŒ ЎужД ĐżŃ€ĐŸŃŃ‚ĐžĐč та Ń–ĐœŃ‚ŃƒŃ—Ń‚ĐžĐČĐœĐŸ Đ·Ń€ĐŸĐ·Ńƒ response = requests.get("http://example.com/some/url") ``` -Đ’Ń–ĐŽĐżĐŸĐČŃ–ĐŽĐœĐ° ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń ŃˆĐ»ŃŃ…Ńƒ API FastAPI ĐŒĐŸĐ¶Đ” ĐČĐžĐłĐ»ŃĐŽĐ°Ń‚Đž таĐș: +Đ’Ń–ĐŽĐżĐŸĐČŃ–ĐŽĐœĐ° *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń ŃˆĐ»ŃŃ…Ńƒ* API FastAPI ĐŒĐŸĐ¶Đ” ĐČĐžĐłĐ»ŃĐŽĐ°Ń‚Đž таĐș: ```Python hl_lines="1" @app.get("/some/url") @@ -124,7 +124,7 @@ def read_url(): Đ†ĐœŃ‚Đ”ĐłŃ€ŃƒĐČато Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž Ń–ĐœŃ‚Đ”Ń€Ń„Đ”Đčсу ĐœĐ° ĐŸŃĐœĐŸĐČі ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Ń–ĐČ: -* [Đ†ĐœŃ‚Đ”Ń€Ń„Đ”Đčс Swagger](https://github.com/swagger-api/swagger-ui) +* [Swagger UI](https://github.com/swagger-api/swagger-ui) * [ReDoc](https://github.com/Rebilly/ReDoc) Щі ĐŽĐČа Đ±ŃƒĐ»ĐŸ ĐŸĐ±Ń€Đ°ĐœĐŸ чДрДз тД, Ń‰ĐŸ ĐČĐŸĐœĐž ĐŽĐŸŃĐžŃ‚ŃŒ ĐżĐŸĐżŃƒĐ»ŃŃ€ĐœŃ– та ŃŃ‚Đ°Đ±Ń–Đ»ŃŒĐœŃ–, алД, ĐČĐžĐșĐŸĐœĐ°ĐČшО шĐČОЎĐșĐžĐč ĐżĐŸŃˆŃƒĐș, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·ĐœĐ°Đčто ĐŽĐ”ŃŃŃ‚ĐșĐž ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČох Đ°Đ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČĐœĐžŃ… Ń–ĐœŃ‚Đ”Ń€Ń„Đ”ĐčсіĐČ ĐŽĐ»Ń OpenAPI (яĐșі ĐŒĐŸĐ¶ĐœĐ° ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Đ· **FastAPI**). @@ -157,7 +157,7 @@ Marshmallow стĐČĐŸŃ€Đ”ĐœĐŸ ĐŽĐ»Ń Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡Đ”ĐœĐœŃ цох Ń„ŃƒĐœĐșці Đ†ĐœŃˆĐŸŃŽ ĐČажлОĐČĐŸŃŽ Ń„ŃƒĐœĐșцією, ĐœĐ”ĐŸĐ±Ń…Ń–ĐŽĐœĐŸŃŽ ĐŽĐ»Ń API, є Đ°ĐœĐ°Đ»Ń–Đ· ĐŽĐ°ĐœĐžŃ… Ń–Đ· ĐČŃ…Ń–ĐŽĐœĐžŃ… запОтіĐČ. -Webargs — цД Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚, стĐČĐŸŃ€Đ”ĐœĐžĐč, Ń‰ĐŸĐ± забДзпДчОтО цД ĐżĐŸĐČДрх ĐșŃ–Đ»ŃŒĐșĐŸŃ… фрДĐčĐŒĐČĐŸŃ€ĐșіĐČ, ĐČĐșлючаючО Flask. +Webargs - цД Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚, стĐČĐŸŃ€Đ”ĐœĐžĐč, Ń‰ĐŸĐ± забДзпДчОтО цД ĐżĐŸĐČДрх ĐșŃ–Đ»ŃŒĐșĐŸŃ… фрДĐčĐŒĐČĐŸŃ€ĐșіĐČ, ĐČĐșлючаючО Flask. Đ’Ń–Đœ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČує Marshmallow ĐČ ĐŸŃĐœĐŸĐČі ĐŽĐ»Ń пДрДĐČірĐșĐž ĐŽĐ°ĐœĐžŃ…. І стĐČĐŸŃ€Đ”ĐœĐžĐč Ń‚ĐžĐŒĐž ж Ń€ĐŸĐ·Ń€ĐŸĐ±ĐœĐžĐșĐ°ĐŒĐž. @@ -239,7 +239,7 @@ Flask-apispec буĐČ ŃŃ‚ĐČĐŸŃ€Đ”ĐœĐžĐč Ń‚ĐžĐŒĐž ж Ń€ĐŸĐ·Ń€ĐŸĐ±ĐœĐžĐșĐ°ĐŒĐž Mar ### [NestJS](https://nestjs.com/) (та [Angular](https://angular.io/)) { #nestjs-and-angular } -ĐŠĐ” ĐœĐ°ĐČіть ĐœĐ” Python, NestJS — цД фрДĐčĐŒĐČĐŸŃ€Đș NodeJS JavaScript (TypeScript), ĐœĐ°Ń‚Ń…ĐœĐ”ĐœĐœĐžĐč Angular. +ĐŠĐ” ĐœĐ°ĐČіть ĐœĐ” Python, NestJS - цД фрДĐčĐŒĐČĐŸŃ€Đș NodeJS JavaScript (TypeScript), ĐœĐ°Ń‚Ń…ĐœĐ”ĐœĐœĐžĐč Angular. ĐŠĐ” ĐŽĐŸŃŃĐłĐ°Ń” Ń‡ĐŸĐłĐŸŃŃŒ ĐżĐŸĐŽŃ–Đ±ĐœĐŸĐłĐŸ ĐŽĐŸ Ń‚ĐŸĐłĐŸ, Ń‰ĐŸ ĐŒĐŸĐ¶ĐœĐ° Đ·Ń€ĐŸĐ±ĐžŃ‚Đž Đ· Flask-apispec. @@ -281,7 +281,7 @@ Flask-apispec буĐČ ŃŃ‚ĐČĐŸŃ€Đ”ĐœĐžĐč Ń‚ĐžĐŒĐž ж Ń€ĐŸĐ·Ń€ĐŸĐ±ĐœĐžĐșĐ°ĐŒĐž Mar ### [Falcon](https://falconframework.org/) { #falcon } -Falcon — щД ĐŸĐŽĐžĐœ ĐČĐžŃĐŸĐșĐŸĐżŃ€ĐŸĐŽŃƒĐșтоĐČĐœĐžĐč фрДĐčĐŒĐČĐŸŃ€Đș Python, ĐČŃ–Đœ Ń€ĐŸĐ·Ń€ĐŸĐ±Đ»Đ”ĐœĐžĐč яĐș ĐŒŃ–ĐœŃ–ĐŒĐ°Đ»ŃŒĐœĐžĐč і працює яĐș ĐŸŃĐœĐŸĐČа Ń–ĐœŃˆĐžŃ… фрДĐčĐŒĐČĐŸŃ€ĐșіĐČ, таĐșох яĐș Hug. +Falcon - щД ĐŸĐŽĐžĐœ ĐČĐžŃĐŸĐșĐŸĐżŃ€ĐŸĐŽŃƒĐșтоĐČĐœĐžĐč фрДĐčĐŒĐČĐŸŃ€Đș Python, ĐČŃ–Đœ Ń€ĐŸĐ·Ń€ĐŸĐ±Đ»Đ”ĐœĐžĐč яĐș ĐŒŃ–ĐœŃ–ĐŒĐ°Đ»ŃŒĐœĐžĐč і працює яĐș ĐŸŃĐœĐŸĐČа Ń–ĐœŃˆĐžŃ… фрДĐčĐŒĐČĐŸŃ€ĐșіĐČ, таĐșох яĐș Hug. Đ’Ń–Đœ Ń€ĐŸĐ·Ń€ĐŸĐ±Đ»Đ”ĐœĐžĐč таĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ, Ń‰ĐŸĐ± ĐŒĐ°Ń‚Đž Ń„ŃƒĐœĐșції, яĐșі ĐŸŃ‚Ń€ĐžĐŒŃƒŃŽŃ‚ŃŒ ĐŽĐČа ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž, ĐŸĐŽĐžĐœ «запОт» і ĐŸĐŽĐžĐœ «ĐČŃ–ĐŽĐżĐŸĐČŃ–ĐŽŃŒÂ». ĐŸĐŸŃ‚Ń–ĐŒ ĐČĐž «чОтаєтД» Ń‡Đ°ŃŃ‚ĐžĐœĐž Đ·Đ°ĐżĐžŃ‚Ńƒ та Â«Đ·Đ°ĐżĐžŃŃƒŃ”Ń‚Đ”Â» Ń‡Đ°ŃŃ‚ĐžĐœĐž у ĐČŃ–ĐŽĐżĐŸĐČіЮь. ЧДрДз таĐșĐžĐč ЎОзаĐčĐœ ĐœĐ”ĐŒĐŸĐ¶Đ»ĐžĐČĐŸ ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž Đ·Đ°ĐżĐžŃ‚Ńƒ та тіла за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœĐžŃ… піЮĐșĐ°Đ·ĐŸĐș топу Python яĐș ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž Ń„ŃƒĐœĐșції. @@ -351,7 +351,7 @@ Hug ĐœĐ°ĐŽĐžŃ…ĐœŃƒĐČ **FastAPI** ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `response` /// -### [APIStar](https://github.com/encode/apistar) (<= 0,5) { #apistar-0-5 } +### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 } Đ‘Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ пДрДЎ Ń‚ĐžĐŒ, яĐș ĐČорішото стĐČĐŸŃ€ĐžŃ‚Đž **FastAPI**, я Đ·ĐœĐ°ĐčŃˆĐŸĐČ ŃĐ”Ń€ĐČДр **APIStar**. Đ’Ń–Đœ ĐŒĐ°ĐČ ĐŒĐ°ĐčжД ĐČсД, Ń‰ĐŸ я шуĐșаĐČ, і ĐŒĐ°ĐČ Ń‡ŃƒĐŽĐŸĐČĐžĐč ЎОзаĐčĐœ. @@ -373,7 +373,7 @@ Hug ĐœĐ°ĐŽĐžŃ…ĐœŃƒĐČ **FastAPI** ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `response` ĐŠĐ” ĐČжД ĐœĐ” буĐČ ĐČДб-фрДĐčĐŒĐČĐŸŃ€Đș API, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž тĐČĐŸŃ€Ń†ŃŽ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ Đ±ŃƒĐ»ĐŸ Đ·ĐŸŃĐ”Ń€Đ”ĐŽĐžŃ‚ĐžŃŃ ĐœĐ° Starlette. -йДпДр APIStar — цД ĐœĐ°Đ±Ń–Ń€ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ ĐŽĐ»Ń пДрДĐČірĐșĐž спДцОфіĐșаціĐč OpenAPI, а ĐœĐ” ĐČДб-фрДĐčĐŒĐČĐŸŃ€Đș. +йДпДр APIStar - цД ĐœĐ°Đ±Ń–Ń€ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ ĐŽĐ»Ń пДрДĐČірĐșĐž спДцОфіĐșаціĐč OpenAPI, а ĐœĐ” ĐČДб-фрДĐčĐŒĐČĐŸŃ€Đș. /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа @@ -403,7 +403,7 @@ APIStar стĐČĐŸŃ€ĐžĐČ ĐąĐŸĐŒ Крісті. ĐąĐŸĐč ŃĐ°ĐŒĐžĐč Ń…Đ»ĐŸĐżĐ”Ń†ŃŒ, я ### [Pydantic](https://docs.pydantic.dev/) { #pydantic } -Pydantic — цД Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșа ĐŽĐ»Ń ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃ пДрДĐČірĐșĐž ĐŽĐ°ĐœĐžŃ…, сДріалізації та ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— (за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ ĐĄŃ…Đ”ĐŒĐž JSON) ĐœĐ° ĐŸŃĐœĐŸĐČі піЮĐșĐ°Đ·ĐŸĐș топу Python. +Pydantic - цД Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșа ĐŽĐ»Ń ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃ пДрДĐČірĐșĐž ĐŽĐ°ĐœĐžŃ…, сДріалізації та ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— (за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ ĐĄŃ…Đ”ĐŒĐž JSON) ĐœĐ° ĐŸŃĐœĐŸĐČі піЮĐșĐ°Đ·ĐŸĐș топу Python. ĐŠĐ” Ń€ĐŸĐ±ĐžŃ‚ŃŒ ĐčĐŸĐłĐŸ ĐœĐ°ĐŽĐ·ĐČочаĐčĐœĐŸ Ń–ĐœŃ‚ŃƒŃ—Ń‚ĐžĐČĐœĐžĐŒ. @@ -419,7 +419,7 @@ Pydantic — цД Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșа ĐŽĐ»Ń ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃ пДрДĐČі ### [Starlette](https://www.starlette.dev/) { #starlette } -Starlette — цД лДгĐșĐžĐč фрДĐčĐŒĐČĐŸŃ€Đș/ĐœĐ°Đ±Ń–Ń€ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ ASGI, яĐșĐžĐč Ń–ĐŽĐ”Đ°Đ»ŃŒĐœĐŸ ĐżŃ–ĐŽŃ…ĐŸĐŽĐžŃ‚ŃŒ ĐŽĐ»Ń стĐČĐŸŃ€Đ”ĐœĐœŃ ĐČĐžŃĐŸĐșĐŸĐżŃ€ĐŸĐŽŃƒĐșтоĐČĐœĐžŃ… asyncio сДрĐČісіĐČ. +Starlette - цД лДгĐșĐžĐč фрДĐčĐŒĐČĐŸŃ€Đș/ĐœĐ°Đ±Ń–Ń€ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ ASGI, яĐșĐžĐč Ń–ĐŽĐ”Đ°Đ»ŃŒĐœĐŸ ĐżŃ–ĐŽŃ…ĐŸĐŽĐžŃ‚ŃŒ ĐŽĐ»Ń стĐČĐŸŃ€Đ”ĐœĐœŃ ĐČĐžŃĐŸĐșĐŸĐżŃ€ĐŸĐŽŃƒĐșтоĐČĐœĐžŃ… asyncio сДрĐČісіĐČ. Đ’Ń–Đœ ЎужД ĐżŃ€ĐŸŃŃ‚ĐžĐč та Ń–ĐœŃ‚ŃƒŃ—Ń‚ĐžĐČĐœĐŸ Đ·Ń€ĐŸĐ·ŃƒĐŒŃ–Đ»ĐžĐč. Đ™ĐŸĐłĐŸ Ń€ĐŸĐ·Ń€ĐŸĐ±Đ»Đ”ĐœĐŸ таĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ, Ń‰ĐŸĐ± ĐčĐŸĐłĐŸ ĐŒĐŸĐ¶ĐœĐ° Đ±ŃƒĐ»ĐŸ лДгĐșĐŸ Ń€ĐŸĐ·ŃˆĐžŃ€ŃŽĐČато та ĐŒĐ°Ń‚Đž ĐŒĐŸĐŽŃƒĐ»ŃŒĐœŃ– ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚Đž. @@ -433,7 +433,7 @@ Starlette — цД лДгĐșĐžĐč фрДĐčĐŒĐČĐŸŃ€Đș/ĐœĐ°Đ±Ń–Ń€ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”Đœ * CORS, GZip, ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ– фаĐčлО, ĐżĐŸŃ‚ĐŸĐșĐŸĐČі ĐČŃ–ĐŽĐżĐŸĐČіЮі. * ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу ŃĐ”Đ°ĐœŃŃ–ĐČ Ń– ĐșуĐșі. * 100% ĐżĐŸĐșроття Ń‚Đ”ŃŃ‚ĐŸĐŒ. -* 100% Đ°ĐœĐŸŃ‚ĐŸĐČĐ°ĐœŃƒ ĐșĐŸĐŽĐŸĐČу базу. +* 100% Đ°ĐœĐŸŃ‚ĐŸĐČĐ°ĐœŃƒ Ń‚ĐžĐżĐ°ĐŒĐž ĐșĐŸĐŽĐŸĐČу базу. * ĐšŃ–Đ»ŃŒĐșа Đ¶ĐŸŃ€ŃŃ‚Đșох Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč. Starlette ĐœĐ°Ń€Đ°Đ·Ń– є ĐœĐ°ĐčшĐČĐžĐŽŃˆĐžĐŒ фрДĐčĐŒĐČĐŸŃ€ĐșĐŸĐŒ Python Ń–Đ· пДрДĐČŃ–Ń€Đ”ĐœĐžŃ…. ĐŸĐ”Ń€Đ”ĐČĐ”Ń€ŃˆŃƒŃ” лОшД Uvicorn, яĐșĐžĐč є ĐœĐ” фрДĐčĐŒĐČĐŸŃ€ĐșĐŸĐŒ, а сДрĐČĐ”Ń€ĐŸĐŒ. @@ -446,7 +446,7 @@ Starlette ĐœĐ°ĐŽĐ°Ń” ĐČсі ĐŸŃĐœĐŸĐČĐœŃ– Ń„ŃƒĐœĐșції ĐČДб-ĐŒŃ–ĐșŃ€ĐŸŃ„Ń€ /// note | ĐąĐ”Ń…ĐœŃ–Ń‡ĐœŃ– ЎДталі -ASGI — цД ĐœĐŸĐČĐžĐč Â«ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Â», яĐșĐžĐč Ń€ĐŸĐ·Ń€ĐŸĐ±Đ»ŃŃ”Ń‚ŃŒŃŃ Ń‡Đ»Đ”ĐœĐ°ĐŒĐž ĐŸŃĐœĐŸĐČĐœĐŸŃ— ĐșĐŸĐŒĐ°ĐœĐŽĐž Django. ĐŠĐ” щД ĐœĐ” Â«ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ Python» (PEP), Ń…ĐŸŃ‡Đ° ĐČĐŸĐœĐž ĐČ ĐżŃ€ĐŸŃ†Đ”ŃŃ– Ń†ŃŒĐŸĐłĐŸ. +ASGI - цД ĐœĐŸĐČĐžĐč Â«ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Â», яĐșĐžĐč Ń€ĐŸĐ·Ń€ĐŸĐ±Đ»ŃŃ”Ń‚ŃŒŃŃ Ń‡Đ»Đ”ĐœĐ°ĐŒĐž ĐŸŃĐœĐŸĐČĐœĐŸŃ— ĐșĐŸĐŒĐ°ĐœĐŽĐž Django. ĐŠĐ” щД ĐœĐ” Â«ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ Python» (PEP), Ń…ĐŸŃ‡Đ° ĐČĐŸĐœĐž ĐČ ĐżŃ€ĐŸŃ†Đ”ŃŃ– Ń†ŃŒĐŸĐłĐŸ. ĐąĐžĐŒ ĐœĐ” ĐŒĐ”ĐœŃˆ, ĐČŃ–Đœ ужД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується яĐș Â«ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Â» ĐșŃ–Đ»ŃŒĐșĐŸĐŒĐ° Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đ°ĐŒĐž. ĐŠĐ” Đ·ĐœĐ°Ń‡ĐœĐŸ ĐżĐŸĐșращує ŃŃƒĐŒŃ–ŃĐœŃ–ŃŃ‚ŃŒ, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” пДрДĐșлючОтО Uvicorn ĐœĐ° Đ±ŃƒĐŽŃŒ-яĐșĐžĐč Ń–ĐœŃˆĐžĐč сДрĐČДр ASGI (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Daphne Đ°Đ±ĐŸ Hypercorn), Đ°Đ±ĐŸ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽĐŸĐŽĐ°Ń‚Đž Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž, ŃŃƒĐŒŃ–ŃĐœŃ– Đ· ASGI, яĐș-ĐŸŃ‚ `python-socketio`. @@ -464,9 +464,9 @@ ASGI — цД ĐœĐŸĐČĐžĐč Â«ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Â», яĐșĐžĐč Ń€ĐŸĐ·Ń€ĐŸĐ±Đ»ŃŃ”Ń‚ŃŒŃ ### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn } -Uvicorn — цД блОсĐșаĐČĐžŃ‡ĐœĐžĐč сДрĐČДр ASGI, ĐżĐŸĐ±ŃƒĐŽĐŸĐČĐ°ĐœĐžĐč ĐœĐ° uvloop і httptools. +Uvicorn - цД блОсĐșаĐČĐžŃ‡ĐœĐžĐč сДрĐČДр ASGI, ĐżĐŸĐ±ŃƒĐŽĐŸĐČĐ°ĐœĐžĐč ĐœĐ° uvloop і httptools. -ĐŠĐ” ĐœĐ” ĐČДб-фрДĐčĐŒĐČĐŸŃ€Đș, а сДрĐČДр. НапроĐșлаЎ, ĐČŃ–Đœ ĐœĐ” ĐœĐ°ĐŽĐ°Ń” Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ ĐŽĐ»Ń ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†Ń–Ń—. ĐŠĐ” тД, Ń‰ĐŸ фрДĐčĐŒĐČĐŸŃ€Đș ĐœĐ° ĐșŃˆŃ‚Đ°Đ»Ń‚ Starlette (Đ°Đ±ĐŸ **FastAPI**) Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡ĐžŃ‚ŃŒ ĐżĐŸĐČДрх ĐœŃŒĐŸĐłĐŸ. +ĐŠĐ” ĐœĐ” ĐČДб-фрДĐčĐŒĐČĐŸŃ€Đș, а сДрĐČДр. НапроĐșлаЎ, ĐČŃ–Đœ ĐœĐ” ĐœĐ°ĐŽĐ°Ń” Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ ĐŽĐ»Ń ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†Ń–Ń— за ŃˆĐ»ŃŃ…Đ°ĐŒĐž. ĐŠĐ” тД, Ń‰ĐŸ фрДĐčĐŒĐČĐŸŃ€Đș ĐœĐ° ĐșŃˆŃ‚Đ°Đ»Ń‚ Starlette (Đ°Đ±ĐŸ **FastAPI**) Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡ĐžŃ‚ŃŒ ĐżĐŸĐČДрх ĐœŃŒĐŸĐłĐŸ. ĐŠĐ” рДĐșĐŸĐŒĐ”ĐœĐŽĐŸĐČĐ°ĐœĐžĐč сДрĐČДр ĐŽĐ»Ń Starlette і **FastAPI**. diff --git a/docs/uk/docs/async.md b/docs/uk/docs/async.md index 72e29b3ea..9a9a90d12 100644 --- a/docs/uk/docs/async.md +++ b/docs/uk/docs/async.md @@ -1,6 +1,6 @@ # РіĐČĐœĐŸŃ‡Đ°ŃĐœŃ–ŃŃ‚ŃŒ і async / await { #concurrency-and-async-await } -ДДталі Ń‰ĐŸĐŽĐŸ ŃĐžĐœŃ‚Đ°ĐșсОсу `async def` ĐŽĐ»Ń Ń„ŃƒĐœĐșціĐč ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ і ĐŽĐ”ŃĐșі ĐČŃ–ĐŽĐŸĐŒĐŸŃŃ‚Ń– ĐżŃ€ĐŸ Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœĐžĐč ĐșĐŸĐŽ, ріĐČĐœĐŸŃ‡Đ°ŃĐœŃ–ŃŃ‚ŃŒ і ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒ. +ДДталі Ń‰ĐŸĐŽĐŸ ŃĐžĐœŃ‚Đ°ĐșсОсу `async def` ĐŽĐ»Ń *Ń„ŃƒĐœĐșціĐč ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* і ĐŽĐ”ŃĐșі ĐČŃ–ĐŽĐŸĐŒĐŸŃŃ‚Ń– ĐżŃ€ĐŸ Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœĐžĐč ĐșĐŸĐŽ, ріĐČĐœĐŸŃ‡Đ°ŃĐœŃ–ŃŃ‚ŃŒ і ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒ. ## ĐŸĐŸŃĐżŃ–ŃˆĐ°Ń”Ń‚Đ”? { #in-a-hurry } @@ -12,7 +12,7 @@ results = await some_library() ``` -ĐąĐŸĐŽŃ– ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐčтД ĐČаші Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ Đ· `async def`, ĐœĐ°ĐżŃ€ĐžĐșлаЎ: +ĐąĐŸĐŽŃ– ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐčтД ĐČаші *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* Đ· `async def`, ĐœĐ°ĐżŃ€ĐžĐșлаЎ: ```Python hl_lines="2" @app.get('/') @@ -29,7 +29,7 @@ async def read_results(): --- -ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ŃŃ‚ĐŸŃ€ĐŸĐœĐœŃŽ Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșу, яĐșа ĐČĐ·Đ°Ń”ĐŒĐŸĐŽŃ–Ń” Đ· Ń‡ĐžĐŒĐŸŃŃŒ (база ĐŽĐ°ĐœĐžŃ…, API, фаĐčĐ»ĐŸĐČа ŃĐžŃŃ‚Đ”ĐŒĐ° Ń‚ĐŸŃ‰ĐŸ) і ĐœĐ” ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ `await` (ĐœĐ°Ń€Đ°Đ·Ń– цД ŃŃ‚ĐŸŃŃƒŃ”Ń‚ŃŒŃŃ Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đș баз ĐŽĐ°ĐœĐžŃ…), Ń‚ĐŸĐŽŃ– ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐčтД ĐČаші Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ яĐș зазĐČочаĐč, ĐżŃ€ĐŸŃŃ‚ĐŸ Đ· `def`, ĐœĐ°ĐżŃ€ĐžĐșлаЎ: +ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ŃŃ‚ĐŸŃ€ĐŸĐœĐœŃŽ Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșу, яĐșа ĐČĐ·Đ°Ń”ĐŒĐŸĐŽŃ–Ń” Đ· Ń‡ĐžĐŒĐŸŃŃŒ (база ĐŽĐ°ĐœĐžŃ…, API, фаĐčĐ»ĐŸĐČа ŃĐžŃŃ‚Đ”ĐŒĐ° Ń‚ĐŸŃ‰ĐŸ) і ĐœĐ” ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ `await` (ĐœĐ°Ń€Đ°Đ·Ń– цД ŃŃ‚ĐŸŃŃƒŃ”Ń‚ŃŒŃŃ Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đș баз ĐŽĐ°ĐœĐžŃ…), Ń‚ĐŸĐŽŃ– ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐčтД ĐČаші *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* яĐș зазĐČочаĐč, ĐżŃ€ĐŸŃŃ‚ĐŸ Đ· `def`, ĐœĐ°ĐżŃ€ĐžĐșлаЎ: ```Python hl_lines="2" @app.get('/') @@ -48,7 +48,7 @@ def results(): --- -ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа: ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·ĐŒŃ–ŃˆŃƒĐČато `def` і `async def` у ĐČашох Ń„ŃƒĐœĐșціях ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ сĐșŃ–Đ»ŃŒĐșĐž заĐČĐłĐŸĐŽĐœĐŸ і ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń‚Đž ĐșĐŸĐ¶ĐœŃƒ Đ· ĐœĐžŃ… ĐœĐ°ĐčĐșŃ€Đ°Ń‰ĐžĐŒ ĐŽĐ»Ń ĐČас ŃĐżĐŸŃĐŸĐ±ĐŸĐŒ. FastAPI Đ·Ń€ĐŸĐ±ĐžŃ‚ŃŒ Đ· ĐœĐžĐŒĐž ĐČсД праĐČĐžĐ»ŃŒĐœĐŸ. +**ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа**: ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·ĐŒŃ–ŃˆŃƒĐČато `def` і `async def` у ĐČашох *Ń„ŃƒĐœĐșціях ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* сĐșŃ–Đ»ŃŒĐșĐž заĐČĐłĐŸĐŽĐœĐŸ і ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń‚Đž ĐșĐŸĐ¶ĐœŃƒ Đ· ĐœĐžŃ… ĐœĐ°ĐčĐșŃ€Đ°Ń‰ĐžĐŒ ĐŽĐ»Ń ĐČас ŃĐżĐŸŃĐŸĐ±ĐŸĐŒ. FastAPI Đ·Ń€ĐŸĐ±ĐžŃ‚ŃŒ Đ· ĐœĐžĐŒĐž ĐČсД праĐČĐžĐ»ŃŒĐœĐŸ. ĐŁ Đ±ŃƒĐŽŃŒ-яĐșĐŸĐŒŃƒ Đ· ĐœĐ°ĐČĐ”ĐŽĐ”ĐœĐžŃ… ĐČОпаЎĐșіĐČ FastAPI ĐČсД ĐŸĐŽĐœĐŸ працюĐČĐ°Ń‚ĐžĐŒĐ” Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸ і буЎД ĐœĐ°ĐŽĐ·ĐČочаĐčĐœĐŸ шĐČОЎĐșĐžĐŒ. @@ -56,17 +56,17 @@ def results(): ## ĐąĐ”Ń…ĐœŃ–Ń‡ĐœŃ– ЎДталі { #technical-details } -ĐĄŃƒŃ‡Đ°ŃĐœŃ– ĐČДрсії Python ĐŒĐ°ŃŽŃ‚ŃŒ ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу Â«Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸĐłĐŸ ĐșĐŸĐŽŃƒÂ» за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ таĐș Đ·ĐČĐ°ĐœĐžŃ… «спіĐČĐżŃ€ĐŸĐłŃ€Đ°ĐŒÂ» Đ· ŃĐžĐœŃ‚Đ°ĐșŃĐžŃĐŸĐŒ **`async` і `await`**. +ĐĄŃƒŃ‡Đ°ŃĐœŃ– ĐČДрсії Python ĐŒĐ°ŃŽŃ‚ŃŒ ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу **Â«Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸĐłĐŸ ĐșĐŸĐŽŃƒÂ»** за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ таĐș Đ·ĐČĐ°ĐœĐžŃ… **«спіĐČĐżŃ€ĐŸĐłŃ€Đ°ĐŒÂ»** Đ· ŃĐžĐœŃ‚Đ°ĐșŃĐžŃĐŸĐŒ **`async` і `await`**. Đ ĐŸĐ·ĐłĐ»ŃĐœŃŒĐŒĐŸ цю Ń„Ń€Đ°Đ·Ńƒ ĐżĐŸ Ń‡Đ°ŃŃ‚ĐžĐœĐ°Ń… у сДĐșціях ĐœĐžĐ¶Ń‡Đ”: -- ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœĐžĐč ĐșĐŸĐŽ -- `async` і `await` -- СпіĐČĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž +- **ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœĐžĐč ĐșĐŸĐŽ** +- **`async` і `await`** +- **СпіĐČĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž** ## ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœĐžĐč ĐșĐŸĐŽ { #asynchronous-code } -ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœĐžĐč ĐșĐŸĐŽ ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐŒĐŸĐČа 💬 ĐŒĐ°Ń” ŃĐżĐŸŃŃ–Đ± сĐșазатО ĐșĐŸĐŒĐżâ€™ŃŽŃ‚Đ”Ń€Ńƒ/ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃ– đŸ€–, Ń‰ĐŸ ĐČ ĐżĐ”ĐČĐœĐžĐč ĐŒĐŸĐŒĐ”ĐœŃ‚ у ĐșĐŸĐŽŃ– ĐČŃ–Đœ đŸ€– ĐŒĐ°Ń” ĐżĐŸŃ‡Đ”Đșато, ĐżĐŸĐșĐž Â«Ń‰ĐŸŃŃŒ Ń–ĐœŃˆĐ”Â» заĐČĐ”Ń€ŃˆĐžŃ‚ŃŒŃŃ ĐŽĐ”ŃŃŒ щД. ĐĄĐșĐ°Đ¶Ń–ĐŒĐŸ, цД Â«Ń‰ĐŸŃŃŒ Ń–ĐœŃˆĐ”Â» ĐœĐ°Đ·ĐžĐČається «slow-file» 📝. +ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœĐžĐč ĐșĐŸĐŽ ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐŒĐŸĐČа 💬 ĐŒĐ°Ń” ŃĐżĐŸŃŃ–Đ± сĐșазатО ĐșĐŸĐŒĐżâ€™ŃŽŃ‚Đ”Ń€Ńƒ/ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃ– đŸ€–, Ń‰ĐŸ ĐČ ĐżĐ”ĐČĐœĐžĐč ĐŒĐŸĐŒĐ”ĐœŃ‚ у ĐșĐŸĐŽŃ– ĐČŃ–Đœ đŸ€– ĐŒĐ°Ń” ĐżĐŸŃ‡Đ”Đșато, ĐżĐŸĐșĐž *Â«Ń‰ĐŸŃŃŒ Ń–ĐœŃˆĐ”Â»* заĐČĐ”Ń€ŃˆĐžŃ‚ŃŒŃŃ ĐŽĐ”ŃŃŒ щД. ĐĄĐșĐ°Đ¶Ń–ĐŒĐŸ, цД *Â«Ń‰ĐŸŃŃŒ Ń–ĐœŃˆĐ”Â»* ĐœĐ°Đ·ĐžĐČається «slow-file» 📝. ОтжД, ĐČ Ń†Đ”Đč час ĐșĐŸĐŒĐżâ€™ŃŽŃ‚Đ”Ń€ ĐŒĐŸĐ¶Đ” піто і Đ·Ń€ĐŸĐ±ĐžŃ‚Đž Ń–ĐœŃˆŃƒ Ń€ĐŸĐ±ĐŸŃ‚Ńƒ, ĐŽĐŸĐșĐž «slow-file» 📝 заĐČĐ”Ń€ŃˆŃƒŃ”Ń‚ŃŒŃŃ. @@ -97,9 +97,9 @@ def results(): ІЎДю **Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸĐłĐŸ** ĐșĐŸĐŽŃƒ, ĐŸĐżĐžŃĐ°ĐœŃƒ ĐČОщД, Ń–ĐœĐșĐŸĐ»Đž таĐșĐŸĐ¶ ĐœĐ°Đ·ĐžĐČають **«ріĐČĐœĐŸŃ‡Đ°ŃĐœŃ–ŃŃ‚ŃŽÂ»**. Đ’ĐŸĐœĐ° ĐČŃ–ĐŽŃ€Ń–Đ·ĐœŃŃ”Ń‚ŃŒŃŃ ĐČіЮ **Â«ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒŃƒÂ»**. -І ріĐČĐœĐŸŃ‡Đ°ŃĐœŃ–ŃŃ‚ŃŒ, і ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒ ŃŃ‚ĐŸŃŃƒŃŽŃ‚ŃŒŃŃ Â«Ń€Ń–Đ·ĐœĐžŃ… рДчДĐč, Ń‰ĐŸ ĐČŃ–ĐŽĐ±ŃƒĐČаються Đ±Ń–Đ»ŃŒŃˆ-ĐŒĐ”ĐœŃˆ ĐŸĐŽĐœĐŸŃ‡Đ°ŃĐœĐŸÂ». +**РіĐČĐœĐŸŃ‡Đ°ŃĐœŃ–ŃŃ‚ŃŒ** і **ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒ** ŃŃ‚ĐŸŃŃƒŃŽŃ‚ŃŒŃŃ Â«Ń€Ń–Đ·ĐœĐžŃ… рДчДĐč, Ń‰ĐŸ ĐČŃ–ĐŽĐ±ŃƒĐČаються Đ±Ń–Đ»ŃŒŃˆ-ĐŒĐ”ĐœŃˆ ĐŸĐŽĐœĐŸŃ‡Đ°ŃĐœĐŸÂ». -АлД ЎДталі ĐŒŃ–Đ¶ ріĐČĐœĐŸŃ‡Đ°ŃĐœŃ–ŃŃ‚ŃŽ і ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒĐŸĐŒ ĐŽĐŸŃĐžŃ‚ŃŒ Ń€Ń–Đ·ĐœŃ–. +АлД ЎДталі ĐŒŃ–Đ¶ *ріĐČĐœĐŸŃ‡Đ°ŃĐœŃ–ŃŃ‚ŃŽ* і *ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒĐŸĐŒ* ĐŽĐŸŃĐžŃ‚ŃŒ Ń€Ń–Đ·ĐœŃ–. Đ©ĐŸĐ± ĐżĐŸĐ±Đ°Ń‡ĐžŃ‚Đž Ń€Ń–Đ·ĐœĐžŃ†ŃŽ, уяĐČŃ–ĐŒĐŸ таĐșу Ń–ŃŃ‚ĐŸŃ€Ń–ŃŽ ĐżŃ€ĐŸ Đ±ŃƒŃ€ĐłĐ”Ń€Đž: @@ -257,7 +257,7 @@ def results(): Ні! ĐŠĐ” ĐœĐ” ĐŒĐŸŃ€Đ°Đ»ŃŒ Ń–ŃŃ‚ĐŸŃ€Ń–Ń—. -РіĐČĐœĐŸŃ‡Đ°ŃĐœŃ–ŃŃ‚ŃŒ ĐČŃ–ĐŽŃ€Ń–Đ·ĐœŃŃ”Ń‚ŃŒŃŃ ĐČіЮ ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒŃƒ. І ĐČĐŸĐœĐ° Đșраща у ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐžŃ… ŃŃ†Đ”ĐœĐ°Ń€Ń–ŃŃ…, Ń‰ĐŸ ĐŒŃ–ŃŃ‚ŃŃ‚ŃŒ Đ±Đ°ĐłĐ°Ń‚ĐŸ ĐŸŃ‡Ń–ĐșуĐČĐ°ĐœĐœŃ. ЧДрДз цД зазĐČочаĐč ĐČĐŸĐœĐ° Đ·ĐœĐ°Ń‡ĐœĐŸ Đșраща за ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒ ĐŽĐ»Ń Ń€ĐŸĐ·Ń€ĐŸĐ±ĐșĐž ĐČĐ”Đ±Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ. АлД ĐœĐ” ĐŽĐ»Ń ĐČŃŃŒĐŸĐłĐŸ. +РіĐČĐœĐŸŃ‡Đ°ŃĐœŃ–ŃŃ‚ŃŒ ĐČŃ–ĐŽŃ€Ń–Đ·ĐœŃŃ”Ń‚ŃŒŃŃ ĐČіЮ ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒŃƒ. І ĐČĐŸĐœĐ° Đșраща у **ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐžŃ…** ŃŃ†Đ”ĐœĐ°Ń€Ń–ŃŃ…, Ń‰ĐŸ ĐŒŃ–ŃŃ‚ŃŃ‚ŃŒ Đ±Đ°ĐłĐ°Ń‚ĐŸ ĐŸŃ‡Ń–ĐșуĐČĐ°ĐœĐœŃ. ЧДрДз цД зазĐČочаĐč ĐČĐŸĐœĐ° Đ·ĐœĐ°Ń‡ĐœĐŸ Đșраща за ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒ ĐŽĐ»Ń Ń€ĐŸĐ·Ń€ĐŸĐ±ĐșĐž ĐČĐ”Đ±Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ. АлД ĐœĐ” ĐŽĐ»Ń ĐČŃŃŒĐŸĐłĐŸ. Đ©ĐŸĐ± уріĐČĐœĐŸĐČажОтО цД, уяĐČŃ–ĐŒĐŸ ĐșĐŸŃ€ĐŸŃ‚Đșу Ń–ŃŃ‚ĐŸŃ€Ń–ŃŽ: @@ -273,15 +273,15 @@ def results(): ЗаĐČĐ”Ń€ŃˆĐ”ĐœĐœŃ заĐčĐŒĐ” Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč час Ń–Đ· Â«Ń‡Đ”Ń€ĐłĐ°ĐŒĐžÂ» чо бДз (ріĐČĐœĐŸŃ‡Đ°ŃĐœŃ–ŃŃ‚ŃŒ), і ĐČĐž ĐČĐžĐșĐŸĐœĐ°Ń”Ń‚Đ” Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč ĐŸĐ±ŃŃĐł Ń€ĐŸĐ±ĐŸŃ‚Đž. -АлД ĐČ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу, яĐșбО ĐČĐž ĐŒĐŸĐłĐ»Đž проĐČДстО 8 ĐșĐŸĐ»ĐžŃˆĐœŃ–Ń… ĐșасоріĐČ/ĐșухаріĐČ/тДпДр ĐżŃ€ĐžĐ±ĐžŃ€Đ°Đ»ŃŒĐœĐžĐșіĐČ, і ĐșĐŸĐ¶Đ”Đœ Đ· ĐœĐžŃ… (Ń€Đ°Đ·ĐŸĐŒ Ń–Đ· ĐČĐ°ĐŒĐž) ĐČĐ·ŃĐČ Đ±Đž сĐČĐŸŃŽ Đ·ĐŸĐœŃƒ Đ±ŃƒĐŽĐžĐœĐșу ĐŽĐ»Ń ĐżŃ€ĐžĐ±ĐžŃ€Đ°ĐœĐœŃ, ĐČĐž ĐŒĐŸĐłĐ»Đž б ĐČĐžĐșĐŸĐœĐ°Ń‚Đž ĐČсю Ń€ĐŸĐ±ĐŸŃ‚Ńƒ ĐżĐ°Ń€Đ°Đ»Đ”Đ»ŃŒĐœĐŸ — Đ· ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČĐŸŃŽ ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ — і заĐČĐ”Ń€ŃˆĐžŃ‚Đž Đ·ĐœĐ°Ń‡ĐœĐŸ шĐČОЎшД. +АлД ĐČ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу, яĐșбО ĐČĐž ĐŒĐŸĐłĐ»Đž проĐČДстО 8 ĐșĐŸĐ»ĐžŃˆĐœŃ–Ń… ĐșасоріĐČ/ĐșухаріĐČ/тДпДр ĐżŃ€ĐžĐ±ĐžŃ€Đ°Đ»ŃŒĐœĐžĐșіĐČ, і ĐșĐŸĐ¶Đ”Đœ Đ· ĐœĐžŃ… (Ń€Đ°Đ·ĐŸĐŒ Ń–Đ· ĐČĐ°ĐŒĐž) ĐČĐ·ŃĐČ Đ±Đž сĐČĐŸŃŽ Đ·ĐŸĐœŃƒ Đ±ŃƒĐŽĐžĐœĐșу ĐŽĐ»Ń ĐżŃ€ĐžĐ±ĐžŃ€Đ°ĐœĐœŃ, ĐČĐž ĐŒĐŸĐłĐ»Đž б ĐČĐžĐșĐŸĐœĐ°Ń‚Đž ĐČсю Ń€ĐŸĐ±ĐŸŃ‚Ńƒ **ĐżĐ°Ń€Đ°Đ»Đ”Đ»ŃŒĐœĐŸ** - Đ· ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČĐŸŃŽ ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ - і заĐČĐ”Ń€ŃˆĐžŃ‚Đž Đ·ĐœĐ°Ń‡ĐœĐŸ шĐČОЎшД. ĐŁ Ń†ŃŒĐŸĐŒŃƒ ŃŃ†Đ”ĐœĐ°Ń€Ń–Ń— ĐșĐŸĐ¶Đ”Đœ Đ· ĐżŃ€ĐžĐ±ĐžŃ€Đ°Đ»ŃŒĐœĐžĐșіĐČ (ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ· ĐČĐ°ĐŒĐž) буĐČ Đ±Đž ĐżŃ€ĐŸŃ†Đ”ŃĐŸŃ€ĐŸĐŒ, Ń‰ĐŸ ĐČĐžĐșĐŸĐœŃƒŃ” сĐČĐŸŃŽ Ń‡Đ°ŃŃ‚ĐžĐœŃƒ Ń€ĐŸĐ±ĐŸŃ‚Đž. -І ĐŸŃĐșŃ–Đ»ŃŒĐșĐž Đ±Ń–Đ»ŃŒŃˆŃ–ŃŃ‚ŃŒ часу ĐČĐžĐșĐŸĐœĐ°ĐœĐœŃ заĐčĐŒĐ°Ń” Ń€Đ”Đ°Đ»ŃŒĐœĐ° Ń€ĐŸĐ±ĐŸŃ‚Đ° (а ĐœĐ” ĐŸŃ‡Ń–ĐșуĐČĐ°ĐœĐœŃ), а Ń€ĐŸĐ±ĐŸŃ‚Ńƒ ĐœĐ° ĐșĐŸĐŒĐżâ€™ŃŽŃ‚Đ”Ń€Ń– ĐČĐžĐșĐŸĐœŃƒŃ” CPU, ці ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒĐž ĐœĐ°Đ·ĐžĐČають «CPU bound». +І ĐŸŃĐșŃ–Đ»ŃŒĐșĐž Đ±Ń–Đ»ŃŒŃˆŃ–ŃŃ‚ŃŒ часу ĐČĐžĐșĐŸĐœĐ°ĐœĐœŃ заĐčĐŒĐ°Ń” Ń€Đ”Đ°Đ»ŃŒĐœĐ° Ń€ĐŸĐ±ĐŸŃ‚Đ° (а ĐœĐ” ĐŸŃ‡Ń–ĐșуĐČĐ°ĐœĐœŃ), а Ń€ĐŸĐ±ĐŸŃ‚Ńƒ ĐœĐ° ĐșĐŸĐŒĐżâ€™ŃŽŃ‚Đ”Ń€Ń– ĐČĐžĐșĐŸĐœŃƒŃ” CPU, ці ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒĐž ĐœĐ°Đ·ĐžĐČають **«CPU bound»**. --- -ĐŸĐŸŃˆĐžŃ€Đ”ĐœŃ– проĐșлаЎО «CPU bound» ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč - цД рДчі, Ń‰ĐŸ ĐżĐŸŃ‚Ń€Đ”Đ±ŃƒŃŽŃ‚ŃŒ сĐșĐ»Đ°ĐŽĐœĐŸŃ— ĐŒĐ°Ń‚Đ”ĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸŃ— ĐŸĐ±Ń€ĐŸĐ±ĐșĐž. +ĐŸĐŸŃˆĐžŃ€Đ”ĐœŃ– проĐșлаЎО **CPU bound** ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč - цД рДчі, Ń‰ĐŸ ĐżĐŸŃ‚Ń€Đ”Đ±ŃƒŃŽŃ‚ŃŒ сĐșĐ»Đ°ĐŽĐœĐŸŃ— ĐŒĐ°Ń‚Đ”ĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸŃ— ĐŸĐ±Ń€ĐŸĐ±ĐșĐž. НапроĐșлаЎ: @@ -294,7 +294,7 @@ def results(): З **FastAPI** ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” сĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚ĐžŃŃ ріĐČĐœĐŸŃ‡Đ°ŃĐœŃ–ŃŃ‚ŃŽ, Ń‰ĐŸ ЎужД ĐżĐŸŃˆĐžŃ€Đ”ĐœĐ° у ĐČĐ”Đ±Ń€ĐŸĐ·Ń€ĐŸĐ±Ń†Ń– (та ж ĐłĐŸĐ»ĐŸĐČĐœĐ° ĐżŃ€ĐžĐœĐ°ĐŽĐ° NodeJS). -АлД ĐČĐž таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž пДрДĐČагО ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒŃƒ і Đ±Đ°ĐłĐ°Ń‚ĐŸĐżŃ€ĐŸŃ†Đ”ŃĐŸŃ€ĐœĐŸŃŃ‚Ń– (ĐœĐ°ŃĐČĐœŃ–ŃŃ‚ŃŒ ĐșŃ–Đ»ŃŒĐșĐŸŃ… ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ, Ń‰ĐŸ працюють ĐżĐ°Ń€Đ°Đ»Đ”Đ»ŃŒĐœĐŸ) ĐŽĐ»Ń ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœŃŒ «CPU bound», яĐș у ŃĐžŃŃ‚Đ”ĐŒĐ°Ń… ĐŒĐ°ŃˆĐžĐœĐœĐŸĐłĐŸ ĐœĐ°ĐČŃ‡Đ°ĐœĐœŃ. +АлД ĐČĐž таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž пДрДĐČагО ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒŃƒ і Đ±Đ°ĐłĐ°Ń‚ĐŸĐżŃ€ĐŸŃ†Đ”ŃĐŸŃ€ĐœĐŸŃŃ‚Ń– (ĐœĐ°ŃĐČĐœŃ–ŃŃ‚ŃŒ ĐșŃ–Đ»ŃŒĐșĐŸŃ… ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ, Ń‰ĐŸ працюють ĐżĐ°Ń€Đ°Đ»Đ”Đ»ŃŒĐœĐŸ) ĐŽĐ»Ń ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœŃŒ **«CPU bound»**, яĐș у ŃĐžŃŃ‚Đ”ĐŒĐ°Ń… ĐŒĐ°ŃˆĐžĐœĐœĐŸĐłĐŸ ĐœĐ°ĐČŃ‡Đ°ĐœĐœŃ. ĐŠĐ”, плюс ĐżŃ€ĐŸŃŃ‚ĐžĐč фаĐșт, Ń‰ĐŸ Python є ĐŸŃĐœĐŸĐČĐœĐŸŃŽ ĐŒĐŸĐČĐŸŃŽ ĐŽĐ»Ń **Data Science**, ĐŒĐ°ŃˆĐžĐœĐœĐŸĐłĐŸ ĐœĐ°ĐČŃ‡Đ°ĐœĐœŃ і ĐŸŃĐŸĐ±Đ»ĐžĐČĐŸ ĐłĐ»ĐžĐ±ĐŸĐșĐŸĐłĐŸ ĐœĐ°ĐČŃ‡Đ°ĐœĐœŃ, Ń€ĐŸĐ±ĐžŃ‚ŃŒ FastAPI ЎужД ĐČĐŽĐ°Đ»ĐžĐŒ ĐČĐžĐ±ĐŸŃ€ĐŸĐŒ ĐŽĐ»Ń ĐČДб API та Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ Data Science / ĐŒĐ°ŃˆĐžĐœĐœĐŸĐłĐŸ ĐœĐ°ĐČŃ‡Đ°ĐœĐœŃ (сДрДЎ Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… Ń–ĐœŃˆĐžŃ…). @@ -340,7 +340,7 @@ burgers = get_burgers(2) --- -ОтжД, яĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșу, яĐșу ĐŒĐŸĐ¶ĐœĐ° ĐČĐžĐșлОĐșато Đ· `await`, ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ стĐČĐŸŃ€ĐžŃ‚Đž Ń„ŃƒĐœĐșцію ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ, Ń‰ĐŸ її ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČує, Đ· `async def`, яĐș тут: +ОтжД, яĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșу, яĐșу ĐŒĐŸĐ¶ĐœĐ° ĐČĐžĐșлОĐșато Đ· `await`, ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ стĐČĐŸŃ€ĐžŃ‚Đž *Ń„ŃƒĐœĐșцію ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, Ń‰ĐŸ її ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČує, Đ· `async def`, яĐș тут: ```Python hl_lines="2-3" @app.get('/burgers') @@ -357,7 +357,7 @@ async def read_burgers(): ĐąĐŸĐ¶ яĐș жД ĐČĐžĐșлОĐșато ĐżĐ”Ń€ŃˆŃƒ `async`-Ń„ŃƒĐœĐșцію - ĐșурĐșа чо яĐčцД? -ĐŻĐșŃ‰ĐŸ ĐČĐž працюєтД Đ· **FastAPI**, ĐČĐ°ĐŒ ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐżŃ€ĐŸ цД Ń‚ŃƒŃ€Đ±ŃƒĐČатося, аЎжД цією Â«ĐżĐ”Ń€ŃˆĐŸŃŽÂ» Ń„ŃƒĐœĐșцією буЎД ĐČаша Ń„ŃƒĐœĐșція ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ, і FastAPI Đ·ĐœĐ°Ń‚ĐžĐŒĐ”, яĐș ŃƒŃ‡ĐžĐœĐžŃ‚Đž праĐČĐžĐ»ŃŒĐœĐŸ. +ĐŻĐșŃ‰ĐŸ ĐČĐž працюєтД Đ· **FastAPI**, ĐČĐ°ĐŒ ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐżŃ€ĐŸ цД Ń‚ŃƒŃ€Đ±ŃƒĐČатося, аЎжД цією Â«ĐżĐ”Ń€ŃˆĐŸŃŽÂ» Ń„ŃƒĐœĐșцією буЎД ĐČаша *Ń„ŃƒĐœĐșція ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, і FastAPI Đ·ĐœĐ°Ń‚ĐžĐŒĐ”, яĐș ŃƒŃ‡ĐžĐœĐžŃ‚Đž праĐČĐžĐ»ŃŒĐœĐŸ. АлД яĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `async` / `await` бДз FastAPI, ĐČĐž таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” цД Đ·Ń€ĐŸĐ±ĐžŃ‚Đž. @@ -395,7 +395,7 @@ Starlette (і **FastAPI**) Đ±Đ°Đ·ŃƒŃŽŃ‚ŃŒŃŃ ĐœĐ° [AnyIO](https://anyio.readthe ĐŸĐŸĐłĐ»ŃĐœŃŒĐŒĐŸ ĐœĐ° ту ŃĐ°ĐŒŃƒ Ń„Ń€Đ°Đ·Ńƒ щД раз: -> ĐĄŃƒŃ‡Đ°ŃĐœŃ– ĐČДрсії Python ĐŒĐ°ŃŽŃ‚ŃŒ ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу Â«Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸĐłĐŸ ĐșĐŸĐŽŃƒÂ» за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ таĐș Đ·ĐČĐ°ĐœĐžŃ… «спіĐČĐżŃ€ĐŸĐłŃ€Đ°ĐŒÂ», Đ· ŃĐžĐœŃ‚Đ°ĐșŃĐžŃĐŸĐŒ **`async` і `await`**. +> ĐĄŃƒŃ‡Đ°ŃĐœŃ– ĐČДрсії Python ĐŒĐ°ŃŽŃ‚ŃŒ ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу **Â«Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸĐłĐŸ ĐșĐŸĐŽŃƒÂ»** за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ таĐș Đ·ĐČĐ°ĐœĐžŃ… **«спіĐČĐżŃ€ĐŸĐłŃ€Đ°ĐŒÂ»**, Đ· ŃĐžĐœŃ‚Đ°ĐșŃĐžŃĐŸĐŒ **`async` і `await`**. йДпДр цД ĐŒĐ°Ń” Đ±Ń–Đ»ŃŒŃˆĐ” ŃĐ”ĐœŃŃƒ. ✹ @@ -415,11 +415,11 @@ Starlette (і **FastAPI**) Đ±Đ°Đ·ŃƒŃŽŃ‚ŃŒŃŃ ĐœĐ° [AnyIO](https://anyio.readthe ### Đ€ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ { #path-operation-functions } -ĐšĐŸĐ»Đž ĐČĐž ĐŸĐłĐŸĐ»ĐŸŃˆŃƒŃ”Ń‚Đ” Ń„ŃƒĐœĐșцію ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ Đ·Ń– Đ·ĐČочаĐčĐœĐžĐŒ `def` Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ `async def`, ĐČĐŸĐœĐ° ĐČĐžĐșĐŸĐœŃƒŃ”Ń‚ŃŒŃŃ у Đ·ĐŸĐČĐœŃ–ŃˆĐœŃŒĐŸĐŒŃƒ ĐżŃƒĐ»Ń– ĐżĐŸŃ‚ĐŸĐșіĐČ (threadpool), яĐșĐžĐč ĐżĐŸŃ‚Ń–ĐŒ Â«ĐŸŃ‡Ń–ĐșŃƒŃ”Ń‚ŃŒŃŃÂ», Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ ĐżŃ€ŃĐŒĐŸĐłĐŸ ĐČĐžĐșлОĐșу (ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐżŃ€ŃĐŒĐžĐč ĐČĐžĐșлОĐș Đ±Đ»ĐŸĐșуĐČаĐČ Đ±Đž сДрĐČДр). +ĐšĐŸĐ»Đž ĐČĐž ĐŸĐłĐŸĐ»ĐŸŃˆŃƒŃ”Ń‚Đ” *Ń„ŃƒĐœĐșцію ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* Đ·Ń– Đ·ĐČочаĐčĐœĐžĐŒ `def` Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ `async def`, ĐČĐŸĐœĐ° ĐČĐžĐșĐŸĐœŃƒŃ”Ń‚ŃŒŃŃ у Đ·ĐŸĐČĐœŃ–ŃˆĐœŃŒĐŸĐŒŃƒ ĐżŃƒĐ»Ń– ĐżĐŸŃ‚ĐŸĐșіĐČ (threadpool), яĐșĐžĐč ĐżĐŸŃ‚Ń–ĐŒ Â«ĐŸŃ‡Ń–ĐșŃƒŃ”Ń‚ŃŒŃŃÂ», Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ ĐżŃ€ŃĐŒĐŸĐłĐŸ ĐČĐžĐșлОĐșу (ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐżŃ€ŃĐŒĐžĐč ĐČĐžĐșлОĐș Đ±Đ»ĐŸĐșуĐČаĐČ Đ±Đž сДрĐČДр). -ĐŻĐșŃ‰ĐŸ ĐČĐž проĐčшлО Đ· Ń–ĐœŃˆĐŸĐłĐŸ async-фрДĐčĐŒĐČĐŸŃ€Đșу, яĐșĐžĐč ĐœĐ” працює таĐș, яĐș ĐŸĐżĐžŃĐ°ĐœĐŸ ĐČОщД, і Đ·ĐČĐžĐșлО ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń‚Đž троĐČŃ–Đ°Đ»ŃŒĐœŃ–, лОшД ĐŸĐ±Ń‡ĐžŃĐ»ŃŽĐČĐ°Đ»ŃŒĐœŃ– Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ Đ·Ń– Đ·ĐČочаĐčĐœĐžĐŒ `def` зараЎО ĐșŃ€ĐžŃ…Ń–Ń‚ĐœĐŸĐłĐŸ ĐČограшу у ĐżŃ€ĐŸĐŽŃƒĐșтоĐČĐœĐŸŃŃ‚Ń– (Đ±Đ»ĐžĐ·ŃŒĐșĐŸ 100 ĐœĐ°ĐœĐŸŃĐ”ĐșŃƒĐœĐŽ), Đ·ĐČĐ”Ń€ĐœŃ–Ń‚ŃŒ уĐČагу, Ń‰ĐŸ у **FastAPI** ДфДĐșт буЎД ĐżŃ€ĐŸŃ‚ĐžĐ»Đ”Đ¶ĐœĐžĐŒ. ĐŁ таĐșох ĐČОпаЎĐșах ĐșращД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `async def`, яĐșŃ‰ĐŸ Ń‚Ń–Đ»ŃŒĐșĐž ĐČаші Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ ĐœĐ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують ĐșĐŸĐŽ, Ń‰ĐŸ ĐČĐžĐșĐŸĐœŃƒŃ” Đ±Đ»ĐŸĐșŃƒŃŽŃ‡Đ” I/O. +ĐŻĐșŃ‰ĐŸ ĐČĐž проĐčшлО Đ· Ń–ĐœŃˆĐŸĐłĐŸ async-фрДĐčĐŒĐČĐŸŃ€Đșу, яĐșĐžĐč ĐœĐ” працює таĐș, яĐș ĐŸĐżĐžŃĐ°ĐœĐŸ ĐČОщД, і Đ·ĐČĐžĐșлО ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń‚Đž троĐČŃ–Đ°Đ»ŃŒĐœŃ–, лОшД ĐŸĐ±Ń‡ĐžŃĐ»ŃŽĐČĐ°Đ»ŃŒĐœŃ– *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* Đ·Ń– Đ·ĐČочаĐčĐœĐžĐŒ `def` зараЎО ĐșŃ€ĐžŃ…Ń–Ń‚ĐœĐŸĐłĐŸ ĐČограшу у ĐżŃ€ĐŸĐŽŃƒĐșтоĐČĐœĐŸŃŃ‚Ń– (Đ±Đ»ĐžĐ·ŃŒĐșĐŸ 100 ĐœĐ°ĐœĐŸŃĐ”ĐșŃƒĐœĐŽ), Đ·ĐČĐ”Ń€ĐœŃ–Ń‚ŃŒ уĐČагу, Ń‰ĐŸ у **FastAPI** ДфДĐșт буЎД ĐżŃ€ĐŸŃ‚ĐžĐ»Đ”Đ¶ĐœĐžĐŒ. ĐŁ таĐșох ĐČОпаЎĐșах ĐșращД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `async def`, яĐșŃ‰ĐŸ Ń‚Ń–Đ»ŃŒĐșĐž ĐČаші *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* ĐœĐ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують ĐșĐŸĐŽ, Ń‰ĐŸ ĐČĐžĐșĐŸĐœŃƒŃ” Đ±Đ»ĐŸĐșŃƒŃŽŃ‡Đ” I/O. -Đ’Ń‚Ń–ĐŒ, у Đ±ŃƒĐŽŃŒ-яĐșіĐč сотуації є ĐČДлОĐșа ĐčĐŒĐŸĐČŃ–Ń€ĐœŃ–ŃŃ‚ŃŒ, Ń‰ĐŸ **FastAPI** [ĐČсД ĐŸĐŽĐœĐŸ буЎД шĐČĐžĐŽŃˆĐžĐŒ](index.md#performance) (Đ°Đ±ĐŸ ĐżŃ€ĐžĐœĐ°ĐčĐŒĐœŃ– ĐżĐŸŃ€Ń–ĐČĐœŃĐœĐœĐžĐŒ) за ĐČаш ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ–Đč фрДĐčĐŒĐČĐŸŃ€Đș. +Đ’Ń‚Ń–ĐŒ, ĐČ ĐŸĐ±ĐŸŃ… сотуаціях є ĐČДлОĐșа ĐčĐŒĐŸĐČŃ–Ń€ĐœŃ–ŃŃ‚ŃŒ, Ń‰ĐŸ **FastAPI** [ĐČсД ĐŸĐŽĐœĐŸ буЎД шĐČĐžĐŽŃˆĐžĐŒ](index.md#performance) (Đ°Đ±ĐŸ ĐżŃ€ĐžĐœĐ°ĐčĐŒĐœŃ– ĐżĐŸŃ€Ń–ĐČĐœŃĐœĐœĐžĐŒ) за ĐČаш ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ–Đč фрДĐčĐŒĐČĐŸŃ€Đș. ### Đ—Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– { #dependencies } @@ -433,7 +433,7 @@ Starlette (і **FastAPI**) Đ±Đ°Đ·ŃƒŃŽŃ‚ŃŒŃŃ ĐœĐ° [AnyIO](https://anyio.readthe БуЮь-яĐșа Ń–ĐœŃˆĐ° ĐŽĐŸĐżĐŸĐŒŃ–Đ¶ĐœĐ° Ń„ŃƒĐœĐșція, яĐșу ĐČĐž ĐČĐžĐșлОĐșаєтД Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ, ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž стĐČĐŸŃ€Đ”ĐœĐ° Đ·Ń– Đ·ĐČочаĐčĐœĐžĐŒ `def` Đ°Đ±ĐŸ `async def`, і FastAPI ĐœĐ” ĐČплОĐČĐ°Ń‚ĐžĐŒĐ” ĐœĐ° ŃĐżĐŸŃŃ–Đ± її ĐČĐžĐșлОĐșу. -ĐŠĐ” ĐČŃ–ĐŽŃ€Ń–Đ·ĐœŃŃ”Ń‚ŃŒŃŃ ĐČіЮ Ń„ŃƒĐœĐșціĐč, яĐșі FastAPI ĐČĐžĐșлОĐșає за ĐČас: Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ і Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń–. +ĐŠĐ” ĐČŃ–ĐŽŃ€Ń–Đ·ĐœŃŃ”Ń‚ŃŒŃŃ ĐČіЮ Ń„ŃƒĐœĐșціĐč, яĐșі FastAPI ĐČĐžĐșлОĐșає за ĐČас: *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* і Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń–. ĐŻĐșŃ‰ĐŸ ĐČаша ĐŽĐŸĐżĐŸĐŒŃ–Đ¶ĐœĐ° Ń„ŃƒĐœĐșція є Đ·ĐČочаĐčĐœĐŸŃŽ Ń„ŃƒĐœĐșцією Đ· `def`, її буЎД ĐČĐžĐșлОĐșĐ°ĐœĐŸ Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ (яĐș ĐČĐž ĐœĐ°ĐżĐžŃĐ°Đ»Đž у сĐČĐŸŃ”ĐŒŃƒ ĐșĐŸĐŽŃ–), ĐœĐ” ĐČ ĐżŃƒĐ»Ń– ĐżĐŸŃ‚ĐŸĐșіĐČ; яĐșŃ‰ĐŸ Ń„ŃƒĐœĐșція стĐČĐŸŃ€Đ”ĐœĐ° Đ· `async def`, Ń‚ĐŸĐŽŃ– ĐČĐ°ĐŒ сліЎ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `await` про її ĐČĐžĐșлОĐșу у ĐČĐ°ŃˆĐŸĐŒŃƒ ĐșĐŸĐŽŃ–. diff --git a/docs/uk/docs/deployment/cloud.md b/docs/uk/docs/deployment/cloud.md index 97d972717..8c7259946 100644 --- a/docs/uk/docs/deployment/cloud.md +++ b/docs/uk/docs/deployment/cloud.md @@ -16,7 +16,7 @@ FastAPI Cloud є ĐŸŃĐœĐŸĐČĐœĐžĐŒ ŃĐżĐŸĐœŃĐŸŃ€ĐŸĐŒ і ĐŽĐ¶Đ”Ń€Đ”Đ»ĐŸĐŒ Ń„Ń–Đœ ## Đ„ĐŒĐ°Ń€ĐœŃ– ĐżĐŸŃŃ‚Đ°Ń‡Đ°Đ»ŃŒĐœĐžĐșĐž - ŃĐżĐŸĐœŃĐŸŃ€Đž { #cloud-providers-sponsors } -Đ”Đ”ŃĐșі Ń–ĐœŃˆŃ– Ń…ĐŒĐ°Ń€ĐœŃ– ĐżĐŸŃŃ‚Đ°Ń‡Đ°Đ»ŃŒĐœĐžĐșĐž ✹ [**ŃĐżĐŸĐœŃĐŸŃ€ŃƒŃŽŃ‚ŃŒ FastAPI**](../help-fastapi.md#sponsor-the-author) ✹ таĐșĐŸĐ¶. 🙇 +Đ”Đ”ŃĐșі Ń–ĐœŃˆŃ– Ń…ĐŒĐ°Ń€ĐœŃ– ĐżĐŸŃŃ‚Đ°Ń‡Đ°Đ»ŃŒĐœĐžĐșĐž ✹ [**ŃĐżĐŸĐœŃĐŸŃ€ŃƒŃŽŃ‚ŃŒ FastAPI**](https://github.com/sponsors/tiangolo) ✹ таĐșĐŸĐ¶. 🙇 ĐœĐŸĐ¶Đ»ĐžĐČĐŸ, ĐČĐž Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” Ń€ĐŸĐ·ĐłĐ»ŃĐœŃƒŃ‚Đž їх, Ń‰ĐŸĐ± ĐŽĐŸŃ‚Ń€ĐžĐŒŃƒĐČатося Ń—Ń…ĐœŃ–Ń… Ń–ĐœŃŃ‚Ń€ŃƒĐșціĐč і ŃĐżŃ€ĐŸĐ±ŃƒĐČато Ń—Ń…ĐœŃ– сДрĐČісо: diff --git a/docs/uk/docs/deployment/concepts.md b/docs/uk/docs/deployment/concepts.md index a6a5bc80e..cec4d8f01 100644 --- a/docs/uk/docs/deployment/concepts.md +++ b/docs/uk/docs/deployment/concepts.md @@ -5,11 +5,11 @@ Đ”Đ”ŃĐșі ĐČажлОĐČі ĐșĐŸĐœŃ†Đ”ĐżŃ†Ń–Ń—: - БДзпДĐșа - HTTPS -- ЗапусĐș піЮ час старту +- ЗапусĐș піЮ час запусĐșу - ĐŸĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșĐž - РДпліĐșація (ĐșŃ–Đ»ŃŒĐșість Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžŃ… ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ) - ĐŸĐ°ĐŒ'ять -- ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž пДрДЎ ŃŃ‚Đ°Ń€Ń‚ĐŸĐŒ +- ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž пДрДЎ запусĐșĐŸĐŒ ĐŸĐŸĐŽĐžĐČĐžĐŒĐŸŃŃŒ, яĐș ĐČĐŸĐœĐž ĐČплОĐČають ĐœĐ° **Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ**. @@ -88,7 +88,7 @@ йДпДр, ĐșĐŸĐ»Đž ĐŒĐž Đ·ĐœĐ°Ń”ĐŒĐŸ Ń€Ń–Đ·ĐœĐžŃ†ŃŽ ĐŒŃ–Đ¶ Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°ĐŒĐž **ĐżŃ€ĐŸŃ†Đ”Ń** і **ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ°**, ĐżŃ€ĐŸĐŽĐŸĐČĐ¶ĐžĐŒĐŸ ĐłĐŸĐČĐŸŃ€ĐžŃ‚Đž ĐżŃ€ĐŸ Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ. -## ЗапусĐș піЮ час старту { #running-on-startup } +## ЗапусĐș піЮ час запусĐșу { #running-on-startup } ĐŁ Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– ĐČОпаЎĐșіĐČ, ĐșĐŸĐ»Đž ĐČĐž стĐČĐŸŃ€ŃŽŃ”Ń‚Đ” ĐČДб-API, ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ”, Ń‰ĐŸĐ± ĐČŃ–Đœ **працюĐČаĐČ ĐżĐŸŃŃ‚Ń–ĐčĐœĐŸ**, бДз пДрДрĐČ, Ń‰ĐŸĐ± ĐșĐ»Ń–Ń”ĐœŃ‚Đž заĐČжЎО ĐŒĐ°Đ»Đž ĐŽĐŸ ĐœŃŒĐŸĐłĐŸ ĐŽĐŸŃŃ‚ŃƒĐż. ЗĐČŃ–ŃĐœĐŸ, яĐșŃ‰ĐŸ ĐœĐ”ĐŒĐ°Ń” ĐŸŃĐŸĐ±Đ»ĐžĐČох ĐżŃ€ĐžŃ‡ĐžĐœ запусĐșато ĐčĐŸĐłĐŸ лОшД ĐČ ĐżĐ”ĐČĐœĐžŃ… сотуаціях. АлД зазĐČочаĐč ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ”, Ń‰ĐŸĐ± ĐČŃ–Đœ ĐżĐŸŃŃ‚Ń–ĐčĐœĐŸ працюĐČаĐČ Ń– буĐČ **ĐŽĐŸŃŃ‚ŃƒĐżĐœĐžĐč**. @@ -102,15 +102,15 @@ І яĐșŃ‰ĐŸ сДрĐČДр буЎД пДрДзаĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐŸ (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, ĐżŃ–ŃĐ»Ń ĐŸĐœĐŸĐČĐ»Đ”ĐœŃŒ Đ°Đ±ĐŸ ĐŒŃ–ĐłŃ€Đ°Ń†Ń–Đč у Ń…ĐŒĐ°Ń€ĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐČаĐčЎДра), ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, **ĐœĐ” ĐżĐŸĐŒŃ–Ń‚ĐžŃ‚Đ” Ń†ŃŒĐŸĐłĐŸ**. І чДрДз цД ĐČĐž ĐœĐ°ĐČіть ĐœĐ” Đ·ĐœĐ°Ń‚ĐžĐŒĐ”Ń‚Đ”, Ń‰ĐŸ трДба ĐČŃ€ŃƒŃ‡ĐœŃƒ ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž ĐżŃ€ĐŸŃ†Đ”Ń. ĐŁ Ń€Đ”Đ·ŃƒĐ»ŃŒŃ‚Đ°Ń‚Ń– ĐČаш API ĐżŃ€ĐŸŃŃ‚ĐŸ Đ·Đ°Đ»ĐžŃˆĐžŃ‚ŃŒŃŃ Â«ĐŒĐ”Ń€Ń‚ĐČĐžĐŒÂ». đŸ˜± -### АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐžĐč запусĐș піЮ час старту { #run-automatically-on-startup } +### АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐžĐč запусĐș піЮ час запусĐșу { #run-automatically-on-startup } -Đ—Đ°ĐłĐ°Đ»ĐŸĐŒ ĐČĐž, ĐœĐ°ĐżĐ”ĐČĐœĐŸ, Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ”, Ń‰ĐŸĐ± сДрĐČĐ”Ń€ĐœĐ° ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ° (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Uvicorn) запусĐșĐ°Đ»Đ°ŃŃ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ піЮ час старту сДрĐČДра і бДз Đ±ŃƒĐŽŃŒ-яĐșĐŸĐłĐŸ **Đ»ŃŽĐŽŃŃŒĐșĐŸĐłĐŸ ĐČŃ‚Ń€ŃƒŃ‡Đ°ĐœĐœŃ**, Ń‰ĐŸĐ± заĐČжЎО буĐČ Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžĐč ĐżŃ€ĐŸŃ†Đ”Ń Ń–Đ· ĐČĐ°ŃˆĐžĐŒ API (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Uvicorn Ń–Đ· ĐČĐ°ŃˆĐžĐŒ FastAPI-Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐŸĐŒ). +Đ—Đ°ĐłĐ°Đ»ĐŸĐŒ ĐČĐž, ĐœĐ°ĐżĐ”ĐČĐœĐŸ, Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ”, Ń‰ĐŸĐ± сДрĐČĐ”Ń€ĐœĐ° ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ° (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Uvicorn) запусĐșĐ°Đ»Đ°ŃŃ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ піЮ час запусĐșу сДрĐČДра і бДз Đ±ŃƒĐŽŃŒ-яĐșĐŸĐłĐŸ **Đ»ŃŽĐŽŃŃŒĐșĐŸĐłĐŸ ĐČŃ‚Ń€ŃƒŃ‡Đ°ĐœĐœŃ**, Ń‰ĐŸĐ± заĐČжЎО буĐČ Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžĐč ĐżŃ€ĐŸŃ†Đ”Ń Ń–Đ· ĐČĐ°ŃˆĐžĐŒ API (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Uvicorn Ń–Đ· ĐČĐ°ŃˆĐžĐŒ FastAPI-Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐŸĐŒ). ### ОĐșŃ€Đ”ĐŒĐ° ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ° { #separate-program } -Đ©ĐŸĐ± Ń†ŃŒĐŸĐłĐŸ ĐŽĐŸŃŃĐłŃ‚Đž, зазĐČочаĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують **ĐŸĐșŃ€Đ”ĐŒŃƒ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ**, яĐșа ĐłĐ°Ń€Đ°ĐœŃ‚ŃƒŃ” запусĐș ĐČĐ°ŃˆĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу піЮ час старту. І ĐČ Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… ĐČОпаЎĐșах ĐČĐŸĐœĐ° таĐșĐŸĐ¶ Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡ŃƒŃ” запусĐș Ń–ĐœŃˆĐžŃ… ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚Ń–ĐČ Đ°Đ±ĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ, ĐœĐ°ĐżŃ€ĐžĐșлаЎ базО ĐŽĐ°ĐœĐžŃ…. +Đ©ĐŸĐ± Ń†ŃŒĐŸĐłĐŸ ĐŽĐŸŃŃĐłŃ‚Đž, зазĐČочаĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують **ĐŸĐșŃ€Đ”ĐŒŃƒ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ**, яĐșа ĐłĐ°Ń€Đ°ĐœŃ‚ŃƒŃ” запусĐș ĐČĐ°ŃˆĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу піЮ час запусĐșу. І ĐČ Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… ĐČОпаЎĐșах ĐČĐŸĐœĐ° таĐșĐŸĐ¶ Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡ŃƒŃ” запусĐș Ń–ĐœŃˆĐžŃ… ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚Ń–ĐČ Đ°Đ±ĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ, ĐœĐ°ĐżŃ€ĐžĐșлаЎ базО ĐŽĐ°ĐœĐžŃ…. -### ПроĐșлаЎО Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ ĐŽĐ»Ń запусĐșу піЮ час старту { #example-tools-to-run-at-startup } +### ПроĐșлаЎО Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ ĐŽĐ»Ń запусĐșу піЮ час запусĐșу { #example-tools-to-run-at-startup } ПроĐșлаЎО Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ, яĐșі ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ цД Ń€ĐŸĐ±ĐžŃ‚Đž: @@ -127,7 +127,7 @@ ## ĐŸĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșĐž { #restarts } -ĐŸĐŸĐŽŃ–Đ±ĐœĐŸ ĐŽĐŸ Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡Đ”ĐœĐœŃ запусĐșу Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу піЮ час старту ŃĐžŃŃ‚Đ”ĐŒĐž, ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, таĐșĐŸĐ¶ Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐłĐ°Ń€Đ°ĐœŃ‚ŃƒĐČато ĐčĐŸĐłĐŸ **ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐș** ĐżŃ–ŃĐ»Ń Đ·Đ±ĐŸŃ—ĐČ. +ĐŸĐŸĐŽŃ–Đ±ĐœĐŸ ĐŽĐŸ Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡Đ”ĐœĐœŃ запусĐșу Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу піЮ час запусĐșу ŃĐžŃŃ‚Đ”ĐŒĐž, ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, таĐșĐŸĐ¶ Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐłĐ°Ń€Đ°ĐœŃ‚ŃƒĐČато ĐčĐŸĐłĐŸ **ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐș** ĐżŃ–ŃĐ»Ń Đ·Đ±ĐŸŃ—ĐČ. ### Мо ĐżĐŸĐŒĐžĐ»ŃŃ”ĐŒĐŸŃŃ { #we-make-mistakes } @@ -163,7 +163,7 @@ ### ПроĐșлаЎО Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ ĐŽĐ»Ń аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸĐłĐŸ ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșу { #example-tools-to-restart-automatically } -ĐŁ Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– ĐČОпаЎĐșіĐČ Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚, яĐșĐžĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ĐŽĐ»Ń **запусĐșу ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž піЮ час старту**, таĐșĐŸĐ¶ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ĐŽĐ»Ń аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐžŃ… **ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșіĐČ**. +ĐŁ Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– ĐČОпаЎĐșіĐČ Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚, яĐșĐžĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ĐŽĐ»Ń **запусĐșу ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž піЮ час запусĐșу**, таĐșĐŸĐ¶ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ĐŽĐ»Ń аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐžŃ… **ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșіĐČ**. НапроĐșлаЎ, цД ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡ŃƒĐČато: @@ -192,7 +192,7 @@ ĐŸĐ°ĐŒ'ŃŃ‚Đ°Ń”Ń‚Đ” Đ· ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— [ĐŸŃ€ĐŸ HTTPS](https.md), Ń‰ĐŸ ĐœĐ° сДрĐČДрі лОшД ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń ĐŒĐŸĐ¶Đ” ŃĐ»ŃƒŃ…Đ°Ń‚Đž пДĐČĐœŃƒ ĐșĐŸĐŒĐ±Ń–ĐœĐ°Ń†Ń–ŃŽ ĐżĐŸŃ€Ń‚Ńƒ та IP-аЎрДсО? -Đ­Ń‚ĐŸ ĐŽĐŸŃŃ– таĐș. +ĐŠĐ” ĐŽĐŸŃŃ– таĐș. ОтжД, Ń‰ĐŸĐ± ĐŒĐ°Ń‚Đž **ĐșŃ–Đ»ŃŒĐșа ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ** ĐŸĐŽĐœĐŸŃ‡Đ°ŃĐœĐŸ, ĐŒĐ°Ń” Đ±ŃƒŃ‚Đž **Ń”ĐŽĐžĐœĐžĐč ĐżŃ€ĐŸŃ†Đ”Ń, яĐșĐžĐč ŃĐ»ŃƒŃ…Đ°Ń” ĐżĐŸŃ€Ń‚**, і яĐșĐžĐč Ўалі яĐșĐžĐŒĐŸŃŃŒ Ń‡ĐžĐœĐŸĐŒ пДрДЎає ĐșĐŸĐŒŃƒĐœŃ–Đșацію ĐșĐŸĐ¶ĐœĐŸĐŒŃƒ ĐżŃ€ĐŸŃ†Đ”ŃŃƒ-праціĐČĐœĐžĐșу. @@ -247,9 +247,9 @@ /// -## ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž пДрДЎ ŃŃ‚Đ°Ń€Ń‚ĐŸĐŒ { #previous-steps-before-starting } +## ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž пДрДЎ запусĐșĐŸĐŒ { #previous-steps-before-starting } -Є Đ±Đ°ĐłĐ°Ń‚ĐŸ ĐČОпаЎĐșіĐČ, ĐșĐŸĐ»Đž ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐČĐžĐșĐŸĐœĐ°Ń‚Đž ĐŽĐ”ŃĐșі ĐșŃ€ĐŸĐșĐž **пДрДЎ ŃŃ‚Đ°Ń€Ń‚ĐŸĐŒ** ĐČĐ°ŃˆĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу. +Є Đ±Đ°ĐłĐ°Ń‚ĐŸ ĐČОпаЎĐșіĐČ, ĐșĐŸĐ»Đž ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐČĐžĐșĐŸĐœĐ°Ń‚Đž ĐŽĐ”ŃĐșі ĐșŃ€ĐŸĐșĐž **пДрДЎ запусĐșĐŸĐŒ** ĐČĐ°ŃˆĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу. НапроĐșлаЎ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°Ń…ĐŸŃ‚Ń–Ń‚Đž Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž **ĐŒŃ–ĐłŃ€Đ°Ń†Ń–Ń— базО ĐŽĐ°ĐœĐžŃ…**. @@ -310,11 +310,11 @@ бут ĐČĐž ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Đ»Đž ĐżŃ€ĐŸ ĐŸŃĐœĐŸĐČĐœŃ– ĐșĐŸĐœŃ†Đ”ĐżŃ†Ń–Ń—, яĐșі, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ Ń‚Ń€ĐžĐŒĐ°Ń‚Đž ĐČ ĐłĐŸĐ»ĐŸĐČі, ĐČорішуючо, яĐș Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°Ń‚Đž ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș: - БДзпДĐșа - HTTPS -- ЗапусĐș піЮ час старту +- ЗапусĐș піЮ час запусĐșу - ĐŸĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșĐž - РДпліĐșація (ĐșŃ–Đ»ŃŒĐșість Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžŃ… ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ) - ĐŸĐ°ĐŒ'ять -- ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž пДрДЎ ŃŃ‚Đ°Ń€Ń‚ĐŸĐŒ +- ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž пДрДЎ запусĐșĐŸĐŒ Đ ĐŸĐ·ŃƒĐŒŃ–ĐœĐœŃ цох Ń–ĐŽĐ”Đč і Ń‚ĐŸĐłĐŸ, яĐș їх Đ·Đ°ŃŃ‚ĐŸŃĐŸĐČуĐČато, ĐŒĐ°Ń” Юато ĐČĐ°ĐŒ Ń–ĐœŃ‚ŃƒŃ—Ń†Ń–ŃŽ, ĐœĐ”ĐŸĐ±Ń…Ń–ĐŽĐœŃƒ ĐŽĐ»Ń проĐčĐœŃŃ‚Ń‚Ń Ń€Ń–ŃˆĐ”ĐœŃŒ піЮ час ĐșĐŸĐœŃ„Ń–ĐłŃƒŃ€ŃƒĐČĐ°ĐœĐœŃ і Ń‚ĐŸĐœĐșĐŸĐłĐŸ ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ ĐČашох Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœŃŒ. đŸ€“ diff --git a/docs/uk/docs/deployment/docker.md b/docs/uk/docs/deployment/docker.md index ead651b2d..83799a00f 100644 --- a/docs/uk/docs/deployment/docker.md +++ b/docs/uk/docs/deployment/docker.md @@ -1,8 +1,8 @@ # FastAPI у ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°Ń… - Docker { #fastapi-in-containers-docker } -ПіЮ час Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ FastAPI ĐżĐŸŃˆĐžŃ€Đ”ĐœĐžĐč піЮхіЮ - збОратО ĐŸĐ±Ń€Đ°Đ·Đž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Linux. ЗазĐČочаĐč цД Ń€ĐŸĐ±ĐžŃ‚ŃŒŃŃ за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ [Docker](https://www.docker.com/). ĐŸĐŸŃ‚Ń–ĐŒ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń€ĐŸĐ·ĐłĐŸŃ€ĐœŃƒŃ‚Đž цДĐč ĐŸĐ±Ń€Đ°Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° ĐșŃ–Đ»ŃŒĐșĐŸĐŒĐ° Ń€Ń–Đ·ĐœĐžĐŒĐž ŃĐżĐŸŃĐŸĐ±Đ°ĐŒĐž. +ПіЮ час Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ FastAPI ĐżĐŸŃˆĐžŃ€Đ”ĐœĐžĐč піЮхіЮ - збОратО **ĐŸĐ±Ń€Đ°Đ·Đž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Linux**. ЗазĐČочаĐč цД Ń€ĐŸĐ±ĐžŃ‚ŃŒŃŃ за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ [**Docker**](https://www.docker.com/). ĐŸĐŸŃ‚Ń–ĐŒ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń€ĐŸĐ·ĐłĐŸŃ€ĐœŃƒŃ‚Đž цДĐč ĐŸĐ±Ń€Đ°Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° ĐșŃ–Đ»ŃŒĐșĐŸĐŒĐ° Ń€Ń–Đ·ĐœĐžĐŒĐž ŃĐżĐŸŃĐŸĐ±Đ°ĐŒĐž. -ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Linux ĐŒĐ°Ń” ĐșŃ–Đ»ŃŒĐșа пДрДĐČаг, Đ·ĐŸĐșŃ€Đ”ĐŒĐ° бДзпДĐșа, ĐČіЮтĐČĐŸŃ€ŃŽĐČĐ°ĐœŃ–ŃŃ‚ŃŒ, ĐżŃ€ĐŸŃŃ‚ĐŸŃ‚Đ° та Ń–ĐœŃˆŃ–. +ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Linux ĐŒĐ°Ń” ĐșŃ–Đ»ŃŒĐșа пДрДĐČаг, Đ·ĐŸĐșŃ€Đ”ĐŒĐ° **бДзпДĐșа**, **ĐČіЮтĐČĐŸŃ€ŃŽĐČĐ°ĐœŃ–ŃŃ‚ŃŒ**, **ĐżŃ€ĐŸŃŃ‚ĐŸŃ‚Đ°** та Ń–ĐœŃˆŃ–. /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° @@ -34,33 +34,33 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] ## Đ©ĐŸ таĐșĐ” ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ { #what-is-a-container } -ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž (пДрДĐČĐ°Đ¶ĐœĐŸ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž Linux) - цД ЎужД лДгĐșĐžĐč ŃĐżĐŸŃŃ–Đ± упаĐșуĐČато Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž Đ· ŃƒŃŃ–ĐŒĐ° Ń—Ń…ĐœŃ–ĐŒĐž Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃĐŒĐž та ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžĐŒĐž фаĐčĐ»Đ°ĐŒĐž, Ń–Đ·ĐŸĐ»ŃŽĐČаĐČшО їх ĐČіЮ Ń–ĐœŃˆĐžŃ… ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ (Ń–ĐœŃˆĐžŃ… Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ Đ°Đ±ĐŸ ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚Ń–ĐČ) у тіĐč ŃĐ°ĐŒŃ–Đč ŃĐžŃŃ‚Đ”ĐŒŃ–. +ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž (пДрДĐČĐ°Đ¶ĐœĐŸ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž Linux) - цД ЎужД **лДгĐșĐžĐč** ŃĐżĐŸŃŃ–Đ± упаĐșуĐČато Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž Đ· ŃƒŃŃ–ĐŒĐ° Ń—Ń…ĐœŃ–ĐŒĐž Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃĐŒĐž та ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžĐŒĐž фаĐčĐ»Đ°ĐŒĐž, Ń–Đ·ĐŸĐ»ŃŽĐČаĐČшО їх ĐČіЮ Ń–ĐœŃˆĐžŃ… ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ (Ń–ĐœŃˆĐžŃ… Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ Đ°Đ±ĐŸ ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚Ń–ĐČ) у тіĐč ŃĐ°ĐŒŃ–Đč ŃĐžŃŃ‚Đ”ĐŒŃ–. -ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž Linux працюють, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč ŃĐŽŃ€ĐŸ Linux, Ń‰ĐŸ Đč Ń…ĐŸŃŃ‚ (ĐŒĐ°ŃˆĐžĐœĐ°, ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ° ĐŒĐ°ŃˆĐžĐœĐ°, Ń…ĐŒĐ°Ń€ĐœĐžĐč сДрĐČДр Ń‚ĐŸŃ‰ĐŸ). ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐČĐŸĐœĐž ЎужД лДгĐșі (у ĐżĐŸŃ€Ń–ĐČĐœŃĐœĐœŃ– Đ· ĐżĐŸĐČĐœĐžĐŒĐž ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐžĐŒĐž ĐŒĐ°ŃˆĐžĐœĐ°ĐŒĐž, яĐșі Đ”ĐŒŃƒĐ»ŃŽŃŽŃ‚ŃŒ Ń†Ń–Đ»Ńƒ ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœŃƒ ŃĐžŃŃ‚Đ”ĐŒŃƒ). +ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž Linux працюють, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо тД ŃĐ°ĐŒĐ” ŃĐŽŃ€ĐŸ Linux, Ń‰ĐŸ Đč Ń…ĐŸŃŃ‚ (ĐŒĐ°ŃˆĐžĐœĐ°, ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ° ĐŒĐ°ŃˆĐžĐœĐ°, Ń…ĐŒĐ°Ń€ĐœĐžĐč сДрĐČДр Ń‚ĐŸŃ‰ĐŸ). ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐČĐŸĐœĐž ЎужД лДгĐșі (у ĐżĐŸŃ€Ń–ĐČĐœŃĐœĐœŃ– Đ· ĐżĐŸĐČĐœĐžĐŒĐž ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐžĐŒĐž ĐŒĐ°ŃˆĐžĐœĐ°ĐŒĐž, яĐșі Đ”ĐŒŃƒĐ»ŃŽŃŽŃ‚ŃŒ Ń†Ń–Đ»Ńƒ ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœŃƒ ŃĐžŃŃ‚Đ”ĐŒŃƒ). -йаĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž ŃĐżĐŸĐ¶ĐžĐČають ĐŒĐ°Đ»ĐŸ Ń€Đ”ŃŃƒŃ€ŃŃ–ĐČ, ĐżŃ€ĐžĐ±Đ»ĐžĐ·ĐœĐŸ яĐș Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Đ·Đ°ĐżŃƒŃ‰Đ”ĐœŃ– ĐżŃ€ĐŸŃ†Đ”ŃĐž (ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ° ĐŒĐ°ŃˆĐžĐœĐ° ŃĐżĐŸĐ¶ĐžĐČала б Đ·ĐœĐ°Ń‡ĐœĐŸ Đ±Ń–Đ»ŃŒŃˆĐ”). +йаĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž ŃĐżĐŸĐ¶ĐžĐČають **ĐŒĐ°Đ»ĐŸ Ń€Đ”ŃŃƒŃ€ŃŃ–ĐČ**, ĐżŃ€ĐžĐ±Đ»ĐžĐ·ĐœĐŸ яĐș Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Đ·Đ°ĐżŃƒŃ‰Đ”ĐœŃ– ĐżŃ€ĐŸŃ†Đ”ŃĐž (ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ° ĐŒĐ°ŃˆĐžĐœĐ° ŃĐżĐŸĐ¶ĐžĐČала б Đ·ĐœĐ°Ń‡ĐœĐŸ Đ±Ń–Đ»ŃŒŃˆĐ”). -ĐŁ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Ń‚Đ°ĐșĐŸĐ¶ є ĐČĐ»Đ°ŃĐœŃ– Ń–Đ·ĐŸĐ»ŃŒĐŸĐČĐ°ĐœŃ– ĐżŃ€ĐŸŃ†Đ”ŃĐž ĐČĐžĐșĐŸĐœĐ°ĐœĐœŃ (зазĐČочаĐč лОшД ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń), фаĐčĐ»ĐŸĐČі ŃĐžŃŃ‚Đ”ĐŒĐž та ĐŒĐ”Ń€Đ”Đ¶Ń–, Ń‰ĐŸ ŃĐżŃ€ĐŸŃ‰ŃƒŃ” Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ, бДзпДĐșу, Ń€ĐŸĐ·Ń€ĐŸĐ±Đșу Ń‚ĐŸŃ‰ĐŸ. +ĐŁ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Ń‚Đ°ĐșĐŸĐ¶ є ĐČĐ»Đ°ŃĐœŃ– **Ń–Đ·ĐŸĐ»ŃŒĐŸĐČĐ°ĐœŃ–** ĐżŃ€ĐŸŃ†Đ”ŃĐž ĐČĐžĐșĐŸĐœĐ°ĐœĐœŃ (зазĐČочаĐč лОшД ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń), фаĐčĐ»ĐŸĐČі ŃĐžŃŃ‚Đ”ĐŒĐž та ĐŒĐ”Ń€Đ”Đ¶Ń–, Ń‰ĐŸ ŃĐżŃ€ĐŸŃ‰ŃƒŃ” Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ, бДзпДĐșу, Ń€ĐŸĐ·Ń€ĐŸĐ±Đșу Ń‚ĐŸŃ‰ĐŸ. ## Đ©ĐŸ таĐșĐ” ĐŸĐ±Ń€Đ°Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° { #what-is-a-container-image } -ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ запусĐșається Đ· ĐŸĐ±Ń€Đ°Đ·Ńƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°. +**ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€** запусĐșається Đ· **ĐŸĐ±Ń€Đ°Đ·Ńƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°**. -Образ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° - цД ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœĐ° ĐČĐ”Ń€ŃŃ–Ń ĐČсіх фаĐčліĐČ, Đ·ĐŒŃ–ĐœĐœĐžŃ… ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ та Ń‚ĐžĐżĐŸĐČа ĐșĐŸĐŒĐ°ĐœĐŽĐ°/ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ°, яĐșа ĐŒĐ°Ń” Đ±ŃƒŃ‚Đž ĐżŃ€ĐžŃŃƒŃ‚ĐœŃ ĐČ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–. бут Â«ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœĐ°Â» ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐŸĐ±Ń€Đ°Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° ĐœĐ” Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžĐč, ĐČŃ–Đœ ĐœĐ” ĐČĐžĐșĐŸĐœŃƒŃ”Ń‚ŃŒŃŃ, цД лОшД упаĐșĐŸĐČĐ°ĐœŃ– фаĐčлО та ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœŃ–. +Образ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° - цД **ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœĐ°** ĐČĐ”Ń€ŃŃ–Ń ĐČсіх фаĐčліĐČ, Đ·ĐŒŃ–ĐœĐœĐžŃ… ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ та Ń‚ĐžĐżĐŸĐČа ĐșĐŸĐŒĐ°ĐœĐŽĐ°/ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ°, яĐșа ĐŒĐ°Ń” Đ±ŃƒŃ‚Đž ĐżŃ€ĐžŃŃƒŃ‚ĐœŃ ĐČ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–. бут **Â«ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœĐ°Â»** ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ **ĐŸĐ±Ń€Đ°Đ·** ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° ĐœĐ” Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžĐč, ĐČŃ–Đœ ĐœĐ” ĐČĐžĐșĐŸĐœŃƒŃ”Ń‚ŃŒŃŃ, цД лОшД упаĐșĐŸĐČĐ°ĐœŃ– фаĐčлО та ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœŃ–. -На ĐżŃ€ĐŸŃ‚ĐžĐČагу Â«ĐŸĐ±Ń€Đ°Đ·Ńƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°Â», Ń‰ĐŸ є Đ·Đ±Đ”Ń€Đ”Đ¶Đ”ĐœĐžĐŒ ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœĐžĐŒ ĐČĐŒŃ–ŃŃ‚ĐŸĐŒ, «ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Â» зазĐČочаĐč ĐŸĐ·ĐœĐ°Ń‡Đ°Ń” Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžĐč Đ”ĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€, тД, Ń‰ĐŸ ĐČĐžĐșĐŸĐœŃƒŃ”Ń‚ŃŒŃŃ. +На ĐżŃ€ĐŸŃ‚ĐžĐČагу «**ĐŸĐ±Ń€Đ°Đ·Ńƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°**», Ń‰ĐŸ є Đ·Đ±Đ”Ń€Đ”Đ¶Đ”ĐœĐžĐŒ ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœĐžĐŒ ĐČĐŒŃ–ŃŃ‚ĐŸĐŒ, «**ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€**» зазĐČочаĐč ĐŸĐ·ĐœĐ°Ń‡Đ°Ń” Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžĐč Đ”ĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€, тД, Ń‰ĐŸ **ĐČĐžĐșĐŸĐœŃƒŃ”Ń‚ŃŒŃŃ**. -ĐšĐŸĐ»Đž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐŸ (Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžĐč Đ· ĐŸĐ±Ń€Đ°Đ·Ńƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°), ĐČŃ–Đœ ĐŒĐŸĐ¶Đ” стĐČĐŸŃ€ŃŽĐČато Đ°Đ±ĐŸ Đ·ĐŒŃ–ĐœŃŽĐČато фаĐčлО, Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ Ń‚ĐŸŃ‰ĐŸ. Щі Đ·ĐŒŃ–ĐœĐž Ń–ŃĐœŃƒĐČĐ°Ń‚ĐžĐŒŃƒŃ‚ŃŒ лОшД ĐČ Ń†ŃŒĐŸĐŒŃƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–, алД ĐœĐ” Đ·Đ±Đ”Ń€Đ”Đ¶ŃƒŃ‚ŃŒŃŃ ĐČ Đ±Đ°Đ·ĐŸĐČĐŸĐŒŃƒ ĐŸĐ±Ń€Đ°Đ·Ń– ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° (ĐœĐ” Đ±ŃƒĐŽŃƒŃ‚ŃŒ Đ·Đ°ĐżĐžŃĐ°ĐœŃ– ĐœĐ° ЎОсĐș). +ĐšĐŸĐ»Đž **ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€** Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐŸ (Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžĐč Đ· **ĐŸĐ±Ń€Đ°Đ·Ńƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°**), ĐČŃ–Đœ ĐŒĐŸĐ¶Đ” стĐČĐŸŃ€ŃŽĐČато Đ°Đ±ĐŸ Đ·ĐŒŃ–ĐœŃŽĐČато фаĐčлО, Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ Ń‚ĐŸŃ‰ĐŸ. Щі Đ·ĐŒŃ–ĐœĐž Ń–ŃĐœŃƒĐČĐ°Ń‚ĐžĐŒŃƒŃ‚ŃŒ лОшД ĐČ Ń†ŃŒĐŸĐŒŃƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–, алД ĐœĐ” Đ·Đ±Đ”Ń€Đ”Đ¶ŃƒŃ‚ŃŒŃŃ ĐČ Đ±Đ°Đ·ĐŸĐČĐŸĐŒŃƒ ĐŸĐ±Ń€Đ°Đ·Ń– ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° (ĐœĐ” Đ±ŃƒĐŽŃƒŃ‚ŃŒ Đ·Đ°ĐżĐžŃĐ°ĐœŃ– ĐœĐ° ЎОсĐș). -Образ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° ĐŒĐŸĐ¶ĐœĐ° ĐżĐŸŃ€Ń–ĐČĐœŃŃ‚Đž Đ· фаĐčĐ»ĐŸĐŒ і ĐČĐŒŃ–ŃŃ‚ĐŸĐŒ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž, ĐœĐ°ĐżŃ€ĐžĐșлаЎ `python` і фаĐčĐ»ĐŸĐŒ `main.py`. +Образ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° ĐŒĐŸĐ¶ĐœĐ° ĐżĐŸŃ€Ń–ĐČĐœŃŃ‚Đž Đ· фаĐčĐ»ĐŸĐŒ і ĐČĐŒŃ–ŃŃ‚ĐŸĐŒ **ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž**, ĐœĐ°ĐżŃ€ĐžĐșлаЎ `python` і фаĐčĐ»ĐŸĐŒ `main.py`. -А ŃĐ°ĐŒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ (ĐœĐ° ĐČŃ–ĐŽĐŒŃ–ĐœŃƒ ĐČіЮ ĐŸĐ±Ń€Đ°Đ·Ńƒ) - цД фаĐșŃ‚ĐžŃ‡ĐœĐŸ Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžĐč Đ”ĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€ ĐŸĐ±Ń€Đ°Đ·Ńƒ, ĐżĐŸŃ€Ń–ĐČĐœŃĐœĐœĐžĐč Ń–Đ· ĐżŃ€ĐŸŃ†Đ”ŃĐŸĐŒ. НаспраĐČЮі ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ працює лОшД Ń‚ĐŸĐŽŃ–, ĐșĐŸĐ»Đž ĐČ ĐœŃŒĐŸĐŒŃƒ працює ĐżŃ€ĐŸŃ†Đ”Ń (і зазĐČочаĐč цД ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń). ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ Đ·ŃƒĐżĐžĐœŃŃ”Ń‚ŃŒŃŃ, ĐșĐŸĐ»Đž ĐČ ĐœŃŒĐŸĐŒŃƒ ĐœĐ” працює Đ¶ĐŸĐŽĐ”Đœ ĐżŃ€ĐŸŃ†Đ”Ń. +А ŃĐ°ĐŒ **ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€** (ĐœĐ° ĐČŃ–ĐŽĐŒŃ–ĐœŃƒ ĐČіЮ **ĐŸĐ±Ń€Đ°Đ·Ńƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°**) - цД фаĐșŃ‚ĐžŃ‡ĐœĐŸ Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžĐč Đ”ĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€ ĐŸĐ±Ń€Đ°Đ·Ńƒ, ĐżĐŸŃ€Ń–ĐČĐœŃĐœĐœĐžĐč Ń–Đ· **ĐżŃ€ĐŸŃ†Đ”ŃĐŸĐŒ**. НаспраĐČЮі ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ працює лОшД Ń‚ĐŸĐŽŃ–, ĐșĐŸĐ»Đž ĐČ ĐœŃŒĐŸĐŒŃƒ **працює ĐżŃ€ĐŸŃ†Đ”Ń** (і зазĐČочаĐč цД ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń). ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ Đ·ŃƒĐżĐžĐœŃŃ”Ń‚ŃŒŃŃ, ĐșĐŸĐ»Đž ĐČ ĐœŃŒĐŸĐŒŃƒ ĐœĐ” працює Đ¶ĐŸĐŽĐ”Đœ ĐżŃ€ĐŸŃ†Đ”Ń. ## ОбразО ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ { #container-images } -Docker буĐČ ĐŸĐŽĐœĐžĐŒ Đ· ĐŸŃĐœĐŸĐČĐœĐžŃ… Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ ĐŽĐ»Ń стĐČĐŸŃ€Đ”ĐœĐœŃ та ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐŸĐ±Ń€Đ°Đ·Đ°ĐŒĐž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Ń– ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž. +Docker буĐČ ĐŸĐŽĐœĐžĐŒ Đ· ĐŸŃĐœĐŸĐČĐœĐžŃ… Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ ĐŽĐ»Ń стĐČĐŸŃ€Đ”ĐœĐœŃ та ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ **ĐŸĐ±Ń€Đ°Đ·Đ°ĐŒĐž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ** і **ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž**. -Đ†ŃĐœŃƒŃ” ĐżŃƒĐ±Đ»Ń–Ń‡ĐœĐžĐč [Docker Hub](https://hub.docker.com/) Đ· ĐłĐŸŃ‚ĐŸĐČĐžĐŒĐž ĐŸŃ„Ń–Ń†Ń–ĐčĐœĐžĐŒĐž ĐŸĐ±Ń€Đ°Đ·Đ°ĐŒĐž ĐŽĐ»Ń Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ, ŃĐ”Ń€Đ”ĐŽĐŸĐČощ, баз ĐŽĐ°ĐœĐžŃ… і Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ. +Đ†ŃĐœŃƒŃ” ĐżŃƒĐ±Đ»Ń–Ń‡ĐœĐžĐč [Docker Hub](https://hub.docker.com/) Đ· ĐłĐŸŃ‚ĐŸĐČĐžĐŒĐž **ĐŸŃ„Ń–Ń†Ń–ĐčĐœĐžĐŒĐž ĐŸĐ±Ń€Đ°Đ·Đ°ĐŒĐž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ** ĐŽĐ»Ń Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ, ŃĐ”Ń€Đ”ĐŽĐŸĐČощ, баз ĐŽĐ°ĐœĐžŃ… і Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ. НапроĐșлаЎ, є ĐŸŃ„Ń–Ń†Ń–ĐčĐœĐžĐč [ĐŸĐ±Ń€Đ°Đ· Python](https://hub.docker.com/_/python). @@ -71,43 +71,43 @@ Docker буĐČ ĐŸĐŽĐœĐžĐŒ Đ· ĐŸŃĐœĐŸĐČĐœĐžŃ… Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ ĐŽĐ»Ń с * [MongoDB](https://hub.docker.com/_/mongo) * [Redis](https://hub.docker.com/_/redis) Ń‚ĐŸŃ‰ĐŸ. -ВоĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо ĐłĐŸŃ‚ĐŸĐČĐžĐč ĐŸĐ±Ń€Đ°Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°, ЎужД лДгĐșĐŸ ĐżĐŸŃ”ĐŽĐœŃƒĐČато та ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Ń€Ń–Đ·ĐœŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž. НапроĐșлаЎ, Ń‰ĐŸĐ± ĐČĐžĐżŃ€ĐŸĐ±ŃƒĐČато ĐœĐŸĐČу базу ĐŽĐ°ĐœĐžŃ…. ĐŁ Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– ĐČОпаЎĐșіĐČ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐŸŃ„Ń–Ń†Ń–ĐčĐœŃ– ĐŸĐ±Ń€Đ°Đ·Đž та ĐżŃ€ĐŸŃŃ‚ĐŸ ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČато їх Đ·ĐŒŃ–ĐœĐœĐžĐŒĐž ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ. +ВоĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо ĐłĐŸŃ‚ĐŸĐČĐžĐč ĐŸĐ±Ń€Đ°Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°, ЎужД лДгĐșĐŸ **ĐżĐŸŃ”ĐŽĐœŃƒĐČато** та ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Ń€Ń–Đ·ĐœŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž. НапроĐșлаЎ, Ń‰ĐŸĐ± ĐČĐžĐżŃ€ĐŸĐ±ŃƒĐČато ĐœĐŸĐČу базу ĐŽĐ°ĐœĐžŃ…. ĐŁ Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– ĐČОпаЎĐșіĐČ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž **ĐŸŃ„Ń–Ń†Ń–ĐčĐœŃ– ĐŸĐ±Ń€Đ°Đ·Đž** та ĐżŃ€ĐŸŃŃ‚ĐŸ ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČато їх Đ·ĐŒŃ–ĐœĐœĐžĐŒĐž ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ. йаĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ, у Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… ĐČОпаЎĐșах ĐČĐž Đ·ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐœĐ°ĐČчотося працюĐČато Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž і Docker та ĐżĐŸĐČŃ‚ĐŸŃ€ĐœĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ці Đ·ĐœĐ°ĐœĐœŃ Đ· Đ±Đ°ĐłĐ°Ń‚ŃŒĐŒĐ° Ń€Ń–Đ·ĐœĐžĐŒĐž Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đ°ĐŒĐž і ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚Đ°ĐŒĐž. -ĐąĐŸĐ±Ń‚ĐŸ ĐČĐž запусĐșĐ°Ń‚ĐžĐŒĐ”Ń‚Đ” ĐșŃ–Đ»ŃŒĐșа ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Đ· Ń€Ń–Đ·ĐœĐžĐŒĐž Ń€Đ”Ń‡Đ°ĐŒĐž, яĐș-ĐŸŃ‚ базу ĐŽĐ°ĐœĐžŃ…, Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș ĐœĐ° Python, ĐČДбсДрĐČДр Ń–Đ· Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐŸĐŒ ĐœĐ° React, і Đ·â€™Ń”ĐŽĐœĐ°Ń”Ń‚Đ” їх чДрДз ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃŽ ĐŒĐ”Ń€Đ”Đ¶Ńƒ. +ĐąĐŸĐ±Ń‚ĐŸ ĐČĐž запусĐșĐ°Ń‚ĐžĐŒĐ”Ń‚Đ” **ĐșŃ–Đ»ŃŒĐșа ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ** Đ· Ń€Ń–Đ·ĐœĐžĐŒĐž Ń€Đ”Ń‡Đ°ĐŒĐž, яĐș-ĐŸŃ‚ базу ĐŽĐ°ĐœĐžŃ…, Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș ĐœĐ° Python, ĐČДбсДрĐČДр Ń–Đ· Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐŸĐŒ ĐœĐ° React, і Đ·â€™Ń”ĐŽĐœĐ°Ń”Ń‚Đ” їх чДрДз ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃŽ ĐŒĐ”Ń€Đ”Đ¶Ńƒ. Усі ŃĐžŃŃ‚Đ”ĐŒĐž ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž (яĐș Docker чо Kubernetes) ĐŒĐ°ŃŽŃ‚ŃŒ ці ĐŒĐ”Ń€Đ”Đ¶Đ”ĐČі ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Ń– ĐČĐ±ŃƒĐŽĐŸĐČĐ°ĐœĐŸ. ## ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž і ĐżŃ€ĐŸŃ†Đ”ŃĐž { #containers-and-processes } -Образ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° зазĐČочаĐč ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ у сĐČĐŸŃ—Ń… ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐžŃ… Ń‚ĐžĐżĐŸĐČу ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ Đ°Đ±ĐŸ ĐșĐŸĐŒĐ°ĐœĐŽŃƒ, яĐșу сліЎ ĐČĐžĐșĐŸĐœĐ°Ń‚Đž піЮ час запусĐșу ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°, і ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž ĐŽĐ»Ń цієї ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž. Đ”ŃƒĐ¶Đ” ŃŃ…ĐŸĐ¶Đ” ĐœĐ° тД, Ń‰ĐŸ ĐČĐž б ĐČĐžĐșĐŸĐœĐ°Đ»Đž ĐČ ĐșĐŸĐŒĐ°ĐœĐŽĐœĐŸĐŒŃƒ ряЮĐșу. +**Образ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°** зазĐČочаĐč ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ у сĐČĐŸŃ—Ń… ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐžŃ… Ń‚ĐžĐżĐŸĐČу ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ Đ°Đ±ĐŸ ĐșĐŸĐŒĐ°ĐœĐŽŃƒ, яĐșу сліЎ ĐČĐžĐșĐŸĐœĐ°Ń‚Đž піЮ час запусĐșу **ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°**, і ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž ĐŽĐ»Ń цієї ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž. Đ”ŃƒĐ¶Đ” ŃŃ…ĐŸĐ¶Đ” ĐœĐ° тД, Ń‰ĐŸ ĐČĐž б ĐČĐžĐșĐŸĐœĐ°Đ»Đž ĐČ ĐșĐŸĐŒĐ°ĐœĐŽĐœĐŸĐŒŃƒ ряЮĐșу. -ĐšĐŸĐ»Đž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ запусĐșається, ĐČŃ–Đœ ĐČĐžĐșĐŸĐœĐ°Ń” цю ĐșĐŸĐŒĐ°ĐœĐŽŃƒ/ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ (Ń…ĐŸŃ‡Đ° ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” пДрДĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚Đž її і Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž Ń–ĐœŃˆŃƒ ĐșĐŸĐŒĐ°ĐœĐŽŃƒ/ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ). +ĐšĐŸĐ»Đž **ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€** запусĐșається, ĐČŃ–Đœ ĐČĐžĐșĐŸĐœĐ°Ń” цю ĐșĐŸĐŒĐ°ĐœĐŽŃƒ/ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ (Ń…ĐŸŃ‡Đ° ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” пДрДĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚Đž її і Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž Ń–ĐœŃˆŃƒ ĐșĐŸĐŒĐ°ĐœĐŽŃƒ/ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ). -ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ працює ĐŽĐŸŃ‚Đž, ĐŽĐŸĐșĐž працює ĐłĐŸĐ»ĐŸĐČĐœĐžĐč ĐżŃ€ĐŸŃ†Đ”Ń (ĐșĐŸĐŒĐ°ĐœĐŽĐ° Đ°Đ±ĐŸ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ°). +ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ працює ĐŽĐŸŃ‚Đž, ĐŽĐŸĐșĐž працює **ĐłĐŸĐ»ĐŸĐČĐœĐžĐč ĐżŃ€ĐŸŃ†Đ”Ń** (ĐșĐŸĐŒĐ°ĐœĐŽĐ° Đ°Đ±ĐŸ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ°). -ЗазĐČочаĐč ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ ĐŒĐ°Ń” ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń, алД таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ»ĐžĐČĐŸ запусĐșато ĐżŃ–ĐŽĐżŃ€ĐŸŃ†Đ”ŃĐž Đ· ĐłĐŸĐ»ĐŸĐČĐœĐŸĐłĐŸ ĐżŃ€ĐŸŃ†Đ”ŃŃƒ, і таĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ у ĐČас ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐșŃ–Đ»ŃŒĐșа ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ Ńƒ Ń‚ĐŸĐŒŃƒ ŃĐ°ĐŒĐŸĐŒŃƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–. +ЗазĐČочаĐč ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ ĐŒĐ°Ń” **ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń**, алД таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ»ĐžĐČĐŸ запусĐșато ĐżŃ–ĐŽĐżŃ€ĐŸŃ†Đ”ŃĐž Đ· ĐłĐŸĐ»ĐŸĐČĐœĐŸĐłĐŸ ĐżŃ€ĐŸŃ†Đ”ŃŃƒ, і таĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ у ĐČас ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž **ĐșŃ–Đ»ŃŒĐșа ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ** у Ń‚ĐŸĐŒŃƒ ŃĐ°ĐŒĐŸĐŒŃƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–. -АлД ĐœĐ”ĐŒĐŸĐ¶Đ»ĐžĐČĐŸ ĐŒĐ°Ń‚Đž Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžĐč ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ бДз ĐżŃ€ĐžĐœĐ°ĐčĐŒĐœŃ– ĐŸĐŽĐœĐŸĐłĐŸ Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐŸĐłĐŸ ĐżŃ€ĐŸŃ†Đ”ŃŃƒ. ĐŻĐșŃ‰ĐŸ ĐłĐŸĐ»ĐŸĐČĐœĐžĐč ĐżŃ€ĐŸŃ†Đ”Ń Đ·ŃƒĐżĐžĐœŃŃ”Ń‚ŃŒŃŃ, ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ Đ·ŃƒĐżĐžĐœŃŃ”Ń‚ŃŒŃŃ. +АлД ĐœĐ”ĐŒĐŸĐ¶Đ»ĐžĐČĐŸ ĐŒĐ°Ń‚Đž Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžĐč ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ бДз **ĐżŃ€ĐžĐœĐ°ĐčĐŒĐœŃ– ĐŸĐŽĐœĐŸĐłĐŸ Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐŸĐłĐŸ ĐżŃ€ĐŸŃ†Đ”ŃŃƒ**. ĐŻĐșŃ‰ĐŸ ĐłĐŸĐ»ĐŸĐČĐœĐžĐč ĐżŃ€ĐŸŃ†Đ”Ń Đ·ŃƒĐżĐžĐœŃŃ”Ń‚ŃŒŃŃ, ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ Đ·ŃƒĐżĐžĐœŃŃ”Ń‚ŃŒŃŃ. ## ЗібратО Docker-ĐŸĐ±Ń€Đ°Đ· ĐŽĐ»Ń FastAPI { #build-a-docker-image-for-fastapi } ГаразЎ, Đ·Đ±Đ”Ń€Ń–ĐŒĐŸ Ń‰ĐŸŃŃŒ зараз! 🚀 -ĐŻ ĐżĐŸĐșажу ĐČĐ°ĐŒ, яĐș зібратО ĐŸĐ±Ń€Đ°Đ· Docker ĐŽĐ»Ń FastAPI Đ· ĐœŃƒĐ»Ń ĐœĐ° ĐŸŃĐœĐŸĐČі ĐŸŃ„Ń–Ń†Ń–ĐčĐœĐŸĐłĐŸ ĐŸĐ±Ń€Đ°Đ·Ńƒ Python. +ĐŻ ĐżĐŸĐșажу ĐČĐ°ĐŒ, яĐș зібратО **ĐŸĐ±Ń€Đ°Đ· Docker** ĐŽĐ»Ń FastAPI **Đ· ĐœŃƒĐ»Ń** ĐœĐ° ĐŸŃĐœĐŸĐČі **ĐŸŃ„Ń–Ń†Ń–ĐčĐœĐŸĐłĐŸ ĐŸĐ±Ń€Đ°Đ·Ńƒ Python**. -ĐŠĐ” тД, Ń‰ĐŸ ĐČĐž Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” Ń€ĐŸĐ±ĐžŃ‚Đž у Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– ĐČОпаЎĐșіĐČ, ĐœĐ°ĐżŃ€ĐžĐșлаЎ: +ĐŠĐ” тД, Ń‰ĐŸ ĐČĐž Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” Ń€ĐŸĐ±ĐžŃ‚Đž у **Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– ĐČОпаЎĐșіĐČ**, ĐœĐ°ĐżŃ€ĐžĐșлаЎ: -* ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Kubernetes Đ°Đ±ĐŸ ĐżĐŸĐŽŃ–Đ±ĐœĐžŃ… Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ -* ПіЮ час запусĐșу ĐœĐ° Raspberry Pi +* ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ **Kubernetes** Đ°Đ±ĐŸ ĐżĐŸĐŽŃ–Đ±ĐœĐžŃ… Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ +* ПіЮ час запусĐșу ĐœĐ° **Raspberry Pi** * ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Ń…ĐŒĐ°Ń€ĐœĐŸĐłĐŸ сДрĐČісу, яĐșĐžĐč Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚ŃŒ ĐŽĐ»Ń ĐČас ĐŸĐ±Ń€Đ°Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° Ń‚ĐŸŃ‰ĐŸ ### Đ’ĐžĐŒĐŸĐłĐž ĐŽĐŸ паĐșДтіĐČ { #package-requirements } -ЗазĐČочаĐč ĐČĐž ĐŒĐ°Ń”Ń‚Đ” ĐČĐžĐŒĐŸĐłĐž ĐŽĐŸ паĐșДтіĐČ ĐŽĐ»Ń ĐČĐ°ŃˆĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу ĐČ ĐŸĐșŃ€Đ”ĐŒĐŸĐŒŃƒ фаĐčлі. +ЗазĐČочаĐč ĐČĐž ĐŒĐ°Ń”Ń‚Đ” **ĐČĐžĐŒĐŸĐłĐž ĐŽĐŸ паĐșДтіĐČ** ĐŽĐ»Ń ĐČĐ°ŃˆĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу ĐČ ĐŸĐșŃ€Đ”ĐŒĐŸĐŒŃƒ фаĐčлі. -ĐŠĐ” Đ·Đ°Đ»Đ”Đ¶ĐžŃ‚ŃŒ пДрДĐČĐ°Đ¶ĐœĐŸ ĐČіЮ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ńƒ, яĐșĐžĐč ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ĐŽĐ»Ń ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ цох ĐČĐžĐŒĐŸĐł. +ĐŠĐ” Đ·Đ°Đ»Đ”Đ¶ĐžŃ‚ŃŒ пДрДĐČĐ°Đ¶ĐœĐŸ ĐČіЮ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ńƒ, яĐșĐžĐč ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ĐŽĐ»Ń **ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ** цох ĐČĐžĐŒĐŸĐł. НаĐčĐżĐŸŃˆĐžŃ€Đ”ĐœŃ–ŃˆĐžĐč ŃĐżĐŸŃŃ–Đ± - ĐŒĐ°Ń‚Đž фаĐčĐ» `requirements.txt` Đ· ĐœĐ°Đ·ĐČĐ°ĐŒĐž паĐșДтіĐČ Ń– Ń—Ń…ĐœŃ–ĐŒĐž ĐČĐ”Ń€ŃŃ–ŃĐŒĐž, ĐżĐŸ ĐŸĐŽĐœĐŸĐŒŃƒ ĐœĐ° Ń€ŃĐŽĐŸĐș. @@ -192,9 +192,9 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] 3. ĐĄĐșĐŸĐżŃ–ŃŽĐčтД фаĐčĐ» Đ· ĐČĐžĐŒĐŸĐłĐ°ĐŒĐž ĐČ ĐŽĐžŃ€Đ”ĐșŃ‚ĐŸŃ€Ń–ŃŽ `/code`. - ĐĄĐżĐŸŃ‡Đ°Ń‚Đșу сĐșĐŸĐżŃ–ŃŽĐčтД лОшД фаĐčĐ» Đ· ĐČĐžĐŒĐŸĐłĐ°ĐŒĐž, а ĐœĐ” Ń€Đ”ŃˆŃ‚Ńƒ ĐșĐŸĐŽŃƒ. + ĐĄĐżĐŸŃ‡Đ°Ń‚Đșу сĐșĐŸĐżŃ–ŃŽĐčтД **лОшД** фаĐčĐ» Đ· ĐČĐžĐŒĐŸĐłĐ°ĐŒĐž, а ĐœĐ” Ń€Đ”ŃˆŃ‚Ńƒ ĐșĐŸĐŽŃƒ. - ОсĐșŃ–Đ»ŃŒĐșĐž цДĐč фаĐčĐ» Đ·ĐŒŃ–ĐœŃŽŃ”Ń‚ŃŒŃŃ ĐœĐ”Ń‡Đ°ŃŃ‚ĐŸ, Docker ĐČояĐČоть цД і ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń” ĐșДш ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ ĐșŃ€ĐŸĐșу, Ń‰ĐŸ таĐșĐŸĐ¶ уĐČŃ–ĐŒĐșĐœĐ” ĐșДш і ĐŽĐ»Ń ĐœĐ°ŃŃ‚ŃƒĐżĐœĐŸĐłĐŸ ĐșŃ€ĐŸĐșу. + ОсĐșŃ–Đ»ŃŒĐșĐž цДĐč фаĐčĐ» **Đ·ĐŒŃ–ĐœŃŽŃ”Ń‚ŃŒŃŃ ĐœĐ”Ń‡Đ°ŃŃ‚ĐŸ**, Docker ĐČояĐČоть цД і ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń” **ĐșДш** ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ ĐșŃ€ĐŸĐșу, Ń‰ĐŸ таĐșĐŸĐ¶ уĐČŃ–ĐŒĐșĐœĐ” ĐșДш і ĐŽĐ»Ń ĐœĐ°ŃŃ‚ŃƒĐżĐœĐŸĐłĐŸ ĐșŃ€ĐŸĐșу. 4. Đ’ŃŃ‚Đ°ĐœĐŸĐČіть Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– паĐșДтіĐČ Ń–Đ· фаĐčлу ĐČĐžĐŒĐŸĐł. @@ -208,21 +208,21 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] Опція `--upgrade` ĐșажД `pip` ĐŸĐœĐŸĐČото паĐșДтО, яĐșŃ‰ĐŸ ĐČĐŸĐœĐž ĐČжД ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœŃ–. - ОсĐșŃ–Đ»ŃŒĐșĐž ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ–Đč ĐșŃ€ĐŸĐș ĐșĐŸĐżŃ–ŃŽĐČĐ°ĐœĐœŃ фаĐčлу ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐČояĐČĐ»Đ”ĐœĐžĐč ĐșĐ”ŃˆĐ”ĐŒ Docker, цДĐč ĐșŃ€ĐŸĐș таĐșĐŸĐ¶ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČĐ°Ń‚ĐžĐŒĐ” ĐșДш Docker, ĐșĐŸĐ»Đž цД ĐŒĐŸĐ¶Đ»ĐžĐČĐŸ. + ОсĐșŃ–Đ»ŃŒĐșĐž ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ–Đč ĐșŃ€ĐŸĐș ĐșĐŸĐżŃ–ŃŽĐČĐ°ĐœĐœŃ фаĐčлу ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐČояĐČĐ»Đ”ĐœĐžĐč **ĐșĐ”ŃˆĐ”ĐŒ Docker**, цДĐč ĐșŃ€ĐŸĐș таĐșĐŸĐ¶ **ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČĐ°Ń‚ĐžĐŒĐ” ĐșДш Docker**, ĐșĐŸĐ»Đž цД ĐŒĐŸĐ¶Đ»ĐžĐČĐŸ. - ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐșДшу ĐœĐ° Ń†ŃŒĐŸĐŒŃƒ ĐșŃ€ĐŸŃ†Ń– збДрДжД ĐČĐ°ĐŒ Đ±Đ°ĐłĐ°Ń‚ĐŸ часу піЮ час ĐżĐŸĐČŃ‚ĐŸŃ€ĐœĐžŃ… Đ·Đ±Ń–Ń€ĐŸĐș ĐŸĐ±Ń€Đ°Đ·Ńƒ ĐČ Ń€ĐŸĐ·Ń€ĐŸĐ±Ń†Ń–, Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ Ń‚ĐŸĐłĐŸ Ń‰ĐŸĐ± заĐČжЎО заĐČĐ°ĐœŃ‚Đ°Đ¶ŃƒĐČато і ĐČŃŃ‚Đ°ĐœĐŸĐČлюĐČато ĐČсі Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń–. + ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐșДшу ĐœĐ° Ń†ŃŒĐŸĐŒŃƒ ĐșŃ€ĐŸŃ†Ń– **збДрДжД** ĐČĐ°ĐŒ Đ±Đ°ĐłĐ°Ń‚ĐŸ **часу** піЮ час ĐżĐŸĐČŃ‚ĐŸŃ€ĐœĐžŃ… Đ·Đ±Ń–Ń€ĐŸĐș ĐŸĐ±Ń€Đ°Đ·Ńƒ ĐČ Ń€ĐŸĐ·Ń€ĐŸĐ±Ń†Ń–, Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ Ń‚ĐŸĐłĐŸ Ń‰ĐŸĐ± **заĐČĐ°ĐœŃ‚Đ°Đ¶ŃƒĐČато і ĐČŃŃ‚Đ°ĐœĐŸĐČлюĐČато** ĐČсі Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– **Ń‰ĐŸŃ€Đ°Đ·Ńƒ**. 5. ĐĄĐșĐŸĐżŃ–ŃŽĐčтД ЎОрДĐșŃ‚ĐŸŃ€Ń–ŃŽ `./app` у ЎОрДĐșŃ‚ĐŸŃ€Ń–ŃŽ `/code`. - ОсĐșŃ–Đ»ŃŒĐșĐž тут уĐČĐ”ŃŃŒ ĐșĐŸĐŽ, яĐșĐžĐč Đ·ĐŒŃ–ĐœŃŽŃ”Ń‚ŃŒŃŃ ĐœĐ°ĐčŃ‡Đ°ŃŃ‚Ń–ŃˆĐ”, ĐșДш Docker ĐœĐ” буЎД лДгĐșĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐžĐč ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ Đ°Đ±ĐŸ Đ±ŃƒĐŽŃŒ-яĐșох ĐœĐ°ŃŃ‚ŃƒĐżĐœĐžŃ… ĐșŃ€ĐŸĐșіĐČ. + ОсĐșŃ–Đ»ŃŒĐșĐž тут уĐČĐ”ŃŃŒ ĐșĐŸĐŽ, яĐșĐžĐč **Đ·ĐŒŃ–ĐœŃŽŃ”Ń‚ŃŒŃŃ ĐœĐ°ĐčŃ‡Đ°ŃŃ‚Ń–ŃˆĐ”**, **ĐșДш** Docker ĐœĐ” буЎД лДгĐșĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐžĐč ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ Đ°Đ±ĐŸ Đ±ŃƒĐŽŃŒ-яĐșох **ĐœĐ°ŃŃ‚ŃƒĐżĐœĐžŃ… ĐșŃ€ĐŸĐșіĐČ**. - ĐąĐŸĐŒŃƒ ĐČажлОĐČĐŸ Ń€ĐŸĐ·ĐŒŃ–ŃŃ‚ĐžŃ‚Đž цД блОжчД ĐŽĐŸ ĐșŃ–ĐœŃ†Ń `Dockerfile`, Ń‰ĐŸĐ± ĐŸĐżŃ‚ĐžĐŒŃ–Đ·ŃƒĐČато час збірĐșĐž ĐŸĐ±Ń€Đ°Đ·Ńƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°. + ĐąĐŸĐŒŃƒ ĐČажлОĐČĐŸ Ń€ĐŸĐ·ĐŒŃ–ŃŃ‚ĐžŃ‚Đž цД **блОжчД ĐŽĐŸ ĐșŃ–ĐœŃ†Ń** `Dockerfile`, Ń‰ĐŸĐ± ĐŸĐżŃ‚ĐžĐŒŃ–Đ·ŃƒĐČато час збірĐșĐž ĐŸĐ±Ń€Đ°Đ·Ńƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°. -6. Đ’ŃŃ‚Đ°ĐœĐŸĐČіть ĐșĐŸĐŒĐ°ĐœĐŽŃƒ ĐŽĐ»Ń ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ `fastapi run`, яĐșа ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČує Uvicorn. +6. Đ’ŃŃ‚Đ°ĐœĐŸĐČіть **ĐșĐŸĐŒĐ°ĐœĐŽŃƒ** ĐŽĐ»Ń ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ `fastapi run`, яĐșа ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČує Uvicorn. `CMD` проĐčĐŒĐ°Ń” ŃĐżĐžŃĐŸĐș ŃŃ‚Ń€ĐŸĐș, ĐșĐŸĐ¶ĐœĐ° Đ· яĐșох - цД тД, Ń‰ĐŸ ĐČĐž б ĐœĐ°Đ±ĐžŃ€Đ°Đ»Đž ĐČ ĐșĐŸĐŒĐ°ĐœĐŽĐœĐŸĐŒŃƒ ряЮĐșу, Ń€ĐŸĐ·ĐŽŃ–Đ»Đ”ĐœĐ” ĐżŃ€ĐŸĐ±Ń–Đ»Đ°ĐŒĐž. - Щя ĐșĐŸĐŒĐ°ĐœĐŽĐ° буЎД ĐČĐžĐșĐŸĐœĐ°ĐœĐ° Đ· ĐżĐŸŃ‚ĐŸŃ‡ĐœĐŸŃ— Ń€ĐŸĐ±ĐŸŃ‡ĐŸŃ— ЎОрДĐșŃ‚ĐŸŃ€Ń–Ń—, тієї ŃĐ°ĐŒĐŸŃ— `/code`, яĐșу ĐČĐž ĐČĐșазалО ĐČОщД чДрДз `WORKDIR /code`. + Щя ĐșĐŸĐŒĐ°ĐœĐŽĐ° буЎД ĐČĐžĐșĐŸĐœĐ°ĐœĐ° Đ· **ĐżĐŸŃ‚ĐŸŃ‡ĐœĐŸŃ— Ń€ĐŸĐ±ĐŸŃ‡ĐŸŃ— ЎОрДĐșŃ‚ĐŸŃ€Ń–Ń—**, тієї ŃĐ°ĐŒĐŸŃ— `/code`, яĐșу ĐČĐž ĐČĐșазалО ĐČОщД чДрДз `WORKDIR /code`. /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° @@ -232,7 +232,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] /// warning | ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐ¶Đ”ĐœĐœŃ -ĐžĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐŸ заĐČжЎО ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД exec form Ń–ĐœŃŃ‚Ń€ŃƒĐșції `CMD`, яĐș ĐżĐŸŃŃĐœĐ”ĐœĐŸ ĐœĐžĐ¶Ń‡Đ”. +ĐžĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐŸ **заĐČжЎО** ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД **exec form** Ń–ĐœŃŃ‚Ń€ŃƒĐșції `CMD`, яĐș ĐżĐŸŃŃĐœĐ”ĐœĐŸ ĐœĐžĐ¶Ń‡Đ”. /// @@ -240,21 +240,21 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] Đ†ĐœŃŃ‚Ń€ŃƒĐșцію Docker [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) ĐŒĐŸĐ¶ĐœĐ° запОсатО у ĐŽĐČĐŸŃ… Ń„ĐŸŃ€ĐŒĐ°Ń…: -✅ Exec form: +✅ **Exec** form: ```Dockerfile # ✅ Đ ĐŸĐ±Ń–Ń‚ŃŒ таĐș CMD ["fastapi", "run", "app/main.py", "--port", "80"] ``` -⛔ Shell form: +⛔ **Shell** form: ```Dockerfile # ⛔ ĐĐ” Ń€ĐŸĐ±Ń–Ń‚ŃŒ таĐș CMD fastapi run app/main.py --port 80 ``` -ĐžĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐŸ заĐČжЎО ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД exec form, Ń‰ĐŸĐ± FastAPI ĐŒŃ–Đł ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐŸ заĐČĐ”Ń€ŃˆŃƒĐČато Ń€ĐŸĐ±ĐŸŃ‚Ńƒ та Ń‰ĐŸĐ± булО ĐČĐžĐșлОĐșĐ°ĐœŃ– [ĐżĐŸĐŽŃ–Ń— троĐČĐ°Đ»ĐŸŃŃ‚Ń– Đ¶ĐžŃ‚Ń‚Ń](../advanced/events.md). +ĐžĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐŸ заĐČжЎО ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД **exec** form, Ń‰ĐŸĐ± FastAPI ĐŒŃ–Đł ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐŸ заĐČĐ”Ń€ŃˆŃƒĐČато Ń€ĐŸĐ±ĐŸŃ‚Ńƒ та Ń‰ĐŸĐ± булО ĐČĐžĐșлОĐșĐ°ĐœŃ– [ĐżĐŸĐŽŃ–Ń— троĐČĐ°Đ»ĐŸŃŃ‚Ń– Đ¶ĐžŃ‚Ń‚Ń](../advanced/events.md). Đ”ĐŸĐșĐ»Đ°ĐŽĐœŃ–ŃˆĐ” ĐżŃ€ĐŸ цД ĐŒĐŸĐ¶ĐœĐ° ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Ń‚Đž ĐČ [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— Docker ĐżŃ€ĐŸ shell та exec form](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form). @@ -283,31 +283,31 @@ CMD ["fastapi", "run", "app/main.py", "--proxy-headers", "--port", "80"] #### ĐšĐ”Ńˆ Docker { #docker-cache } -ĐŁ Ń†ŃŒĐŸĐŒŃƒ `Dockerfile` є ĐČажлОĐČĐžĐč трюĐș: ŃĐżĐŸŃ‡Đ°Ń‚Đșу ĐŒĐž ĐșĐŸĐżŃ–ŃŽŃ”ĐŒĐŸ лОшД фаĐčĐ» Ń–Đ· Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃĐŒĐž, а ĐœĐ” Ń€Đ”ŃˆŃ‚Ńƒ ĐșĐŸĐŽŃƒ. Ось Ń‡ĐŸĐŒŃƒ. +ĐŁ Ń†ŃŒĐŸĐŒŃƒ `Dockerfile` є ĐČажлОĐČĐžĐč трюĐș: ŃĐżĐŸŃ‡Đ°Ń‚Đșу ĐŒĐž ĐșĐŸĐżŃ–ŃŽŃ”ĐŒĐŸ лОшД **фаĐčĐ» Ń–Đ· Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃĐŒĐž**, а ĐœĐ” Ń€Đ”ŃˆŃ‚Ńƒ ĐșĐŸĐŽŃƒ. Ось Ń‡ĐŸĐŒŃƒ. ```Dockerfile COPY ./requirements.txt /code/requirements.txt ``` -Docker та Ń–ĐœŃˆŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž Đ·Đ±ĐžŃ€Đ°ŃŽŃ‚ŃŒ ці ĐŸĐ±Ń€Đ°Đ·Đž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Ń–ĐœĐșŃ€Đ”ĐŒĐ”ĐœŃ‚Đ°Đ»ŃŒĐœĐŸ, ĐŽĐŸĐŽĐ°ŃŽŃ‡Đž ĐŸĐŽĐžĐœ шар ĐżĐŸĐČДрх Ń–ĐœŃˆĐŸĐłĐŸ, ĐżĐŸŃ‡ĐžĐœĐ°ŃŽŃ‡Đž Đ· ĐČĐ”Ń€Ń…ĐœŃŒĐŸŃ— Ń‡Đ°ŃŃ‚ĐžĐœĐž `Dockerfile` і ĐŽĐŸĐŽĐ°ŃŽŃ‡Đž Đ±ŃƒĐŽŃŒ-яĐșі фаĐčлО, стĐČĐŸŃ€Đ”ĐœŃ– ĐșĐŸĐ¶ĐœĐŸŃŽ Ń–ĐœŃŃ‚Ń€ŃƒĐșцією ĐČ `Dockerfile`. +Docker та Ń–ĐœŃˆŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž **Đ·Đ±ĐžŃ€Đ°ŃŽŃ‚ŃŒ** ці ĐŸĐ±Ń€Đ°Đ·Đž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ **Ń–ĐœĐșŃ€Đ”ĐŒĐ”ĐœŃ‚Đ°Đ»ŃŒĐœĐŸ**, ĐŽĐŸĐŽĐ°ŃŽŃ‡Đž **ĐŸĐŽĐžĐœ шар ĐżĐŸĐČДрх Ń–ĐœŃˆĐŸĐłĐŸ**, ĐżĐŸŃ‡ĐžĐœĐ°ŃŽŃ‡Đž Đ· ĐČĐ”Ń€Ń…ĐœŃŒĐŸŃ— Ń‡Đ°ŃŃ‚ĐžĐœĐž `Dockerfile` і ĐŽĐŸĐŽĐ°ŃŽŃ‡Đž Đ±ŃƒĐŽŃŒ-яĐșі фаĐčлО, стĐČĐŸŃ€Đ”ĐœŃ– ĐșĐŸĐ¶ĐœĐŸŃŽ Ń–ĐœŃŃ‚Ń€ŃƒĐșцією ĐČ `Dockerfile`. -Docker та ĐżĐŸĐŽŃ–Đ±ĐœŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž таĐșĐŸĐ¶ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃ–Đč ĐșДш піЮ час збірĐșĐž ĐŸĐ±Ń€Đ°Đ·Ńƒ. ĐŻĐșŃ‰ĐŸ фаĐčĐ» ĐœĐ” Đ·ĐŒŃ–ĐœŃŽĐČаĐČся Đ· ĐŒĐŸĐŒĐ”ĐœŃ‚Ńƒ ĐŸŃŃ‚Đ°ĐœĐœŃŒĐŸŃ— збірĐșĐž, Ń‚ĐŸĐŽŃ– ĐČŃ–Đœ ĐżĐŸĐČŃ‚ĐŸŃ€ĐœĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń” Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč шар, стĐČĐŸŃ€Đ”ĐœĐžĐč ĐČĐŸŃŃ‚Đ°ĐœŃ”, Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ ĐșĐŸĐżŃ–ŃŽĐČĐ°ĐœĐœŃ фаĐčлу Đ·ĐœĐŸĐČу та стĐČĐŸŃ€Đ”ĐœĐœŃ ĐœĐŸĐČĐŸĐłĐŸ шару Đ· ĐœŃƒĐ»Ń. +Docker та ĐżĐŸĐŽŃ–Đ±ĐœŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž таĐșĐŸĐ¶ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують **ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃ–Đč ĐșДш** піЮ час збірĐșĐž ĐŸĐ±Ń€Đ°Đ·Ńƒ. ĐŻĐșŃ‰ĐŸ фаĐčĐ» ĐœĐ” Đ·ĐŒŃ–ĐœŃŽĐČаĐČся Đ· ĐŒĐŸĐŒĐ”ĐœŃ‚Ńƒ ĐŸŃŃ‚Đ°ĐœĐœŃŒĐŸŃ— збірĐșĐž, Ń‚ĐŸĐŽŃ– ĐČŃ–Đœ **ĐżĐŸĐČŃ‚ĐŸŃ€ĐœĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń” Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč шар**, стĐČĐŸŃ€Đ”ĐœĐžĐč ĐČĐŸŃŃ‚Đ°ĐœĐœŃ”, Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ ĐșĐŸĐżŃ–ŃŽĐČĐ°ĐœĐœŃ фаĐčлу Đ·ĐœĐŸĐČу та стĐČĐŸŃ€Đ”ĐœĐœŃ ĐœĐŸĐČĐŸĐłĐŸ шару Đ· ĐœŃƒĐ»Ń. -ĐŸŃ€ĐŸŃŃ‚Đ” ŃƒĐœĐžĐșĐœĐ”ĐœĐœŃ ĐșĐŸĐżŃ–ŃŽĐČĐ°ĐœĐœŃ фаĐčліĐČ ĐœĐ” ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐŸ суттєĐČĐŸ ĐżĐŸĐșращує сотуацію, алД ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ ĐșŃ€ĐŸĐșу ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐŸ ĐșДш, ĐČŃ–Đœ ĐŒĐŸĐ¶Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐșДш і ĐŽĐ»Ń ĐœĐ°ŃŃ‚ŃƒĐżĐœĐŸĐłĐŸ ĐșŃ€ĐŸĐșу. НапроĐșлаЎ, ĐČŃ–Đœ ĐŒĐŸĐ¶Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐșДш ĐŽĐ»Ń Ń–ĐœŃŃ‚Ń€ŃƒĐșції, яĐșа ĐČŃŃ‚Đ°ĐœĐŸĐČлює Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń–: +ĐŸŃ€ĐŸŃŃ‚Đ” ŃƒĐœĐžĐșĐœĐ”ĐœĐœŃ ĐșĐŸĐżŃ–ŃŽĐČĐ°ĐœĐœŃ фаĐčліĐČ ĐœĐ” ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐŸ суттєĐČĐŸ ĐżĐŸĐșращує сотуацію, алД ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ ĐșŃ€ĐŸĐșу ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐŸ ĐșДш, ĐČŃ–Đœ ĐŒĐŸĐ¶Đ” **ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐșДш і ĐŽĐ»Ń ĐœĐ°ŃŃ‚ŃƒĐżĐœĐŸĐłĐŸ ĐșŃ€ĐŸĐșу**. НапроĐșлаЎ, ĐČŃ–Đœ ĐŒĐŸĐ¶Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐșДш ĐŽĐ»Ń Ń–ĐœŃŃ‚Ń€ŃƒĐșції, яĐșа ĐČŃŃ‚Đ°ĐœĐŸĐČлює Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń–: ```Dockerfile RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt ``` -ЀаĐčĐ» Ń–Đ· ĐČĐžĐŒĐŸĐłĐ°ĐŒĐž ĐŽĐŸ паĐșДтіĐČ Đ·ĐŒŃ–ĐœŃŽĐČĐ°Ń‚ĐžĐŒĐ”Ń‚ŃŒŃŃ ĐœĐ”Ń‡Đ°ŃŃ‚ĐŸ. ОтжД, ĐșĐŸĐżŃ–ŃŽŃŽŃ‡Đž лОшД цДĐč фаĐčĐ», Docker Đ·ĐŒĐŸĐ¶Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐșДш ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ ĐșŃ€ĐŸĐșу. +ЀаĐčĐ» Ń–Đ· ĐČĐžĐŒĐŸĐłĐ°ĐŒĐž ĐŽĐŸ паĐșДтіĐČ **Đ·ĐŒŃ–ĐœŃŽĐČĐ°Ń‚ĐžĐŒĐ”Ń‚ŃŒŃŃ ĐœĐ”Ń‡Đ°ŃŃ‚ĐŸ**. ОтжД, ĐșĐŸĐżŃ–ŃŽŃŽŃ‡Đž лОшД цДĐč фаĐčĐ», Docker Đ·ĐŒĐŸĐ¶Đ” **ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐșДш** ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ ĐșŃ€ĐŸĐșу. -А ĐżĐŸŃ‚Ń–ĐŒ Docker Đ·ĐŒĐŸĐ¶Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐșДш і ĐŽĐ»Ń ĐœĐ°ŃŃ‚ŃƒĐżĐœĐŸĐłĐŸ ĐșŃ€ĐŸĐșу, яĐșĐžĐč заĐČĐ°ĐœŃ‚Đ°Đ¶ŃƒŃ” та ĐČŃŃ‚Đ°ĐœĐŸĐČлює ці Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń–. І ŃĐ°ĐŒĐ” тут ĐŒĐž Đ·Đ°ĐŸŃ‰Đ°ĐŽĐ¶ŃƒŃ”ĐŒĐŸ Đ±Đ°ĐłĐ°Ń‚ĐŸ часу. ✹ ...і ŃƒĐœĐžĐșĐ°Ń”ĐŒĐŸ ĐœŃƒĐŽĐœĐŸĐłĐŸ ĐŸŃ‡Ń–ĐșуĐČĐ°ĐœĐœŃ. đŸ˜Ș😆 +А ĐżĐŸŃ‚Ń–ĐŒ Docker Đ·ĐŒĐŸĐ¶Đ” **ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐșДш і ĐŽĐ»Ń ĐœĐ°ŃŃ‚ŃƒĐżĐœĐŸĐłĐŸ ĐșŃ€ĐŸĐșу**, яĐșĐžĐč заĐČĐ°ĐœŃ‚Đ°Đ¶ŃƒŃ” та ĐČŃŃ‚Đ°ĐœĐŸĐČлює ці Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń–. І ŃĐ°ĐŒĐ” тут ĐŒĐž **Đ·Đ°ĐŸŃ‰Đ°ĐŽĐ¶ŃƒŃ”ĐŒĐŸ Đ±Đ°ĐłĐ°Ń‚ĐŸ часу**. ✹ ...і ŃƒĐœĐžĐșĐ°Ń”ĐŒĐŸ ĐœŃƒĐŽĐœĐŸĐłĐŸ ĐŸŃ‡Ń–ĐșуĐČĐ°ĐœĐœŃ. đŸ˜Ș😆 -ЗаĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ і ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč паĐșДтіĐČ ĐŒĐŸĐ¶Đ” заĐčĐŒĐ°Ń‚Đž хĐČĐžĐ»ĐžĐœĐž, алД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐșДшу заĐčĐŒĐ” ĐŒĐ°ĐșŃĐžĐŒŃƒĐŒ сДĐșŃƒĐœĐŽĐž. +ЗаĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ і ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč паĐșДтіĐČ **ĐŒĐŸĐ¶Đ” заĐčĐŒĐ°Ń‚Đž хĐČĐžĐ»ĐžĐœĐž**, алД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ **ĐșДшу** заĐčĐŒĐ” **ĐŒĐ°ĐșŃĐžĐŒŃƒĐŒ сДĐșŃƒĐœĐŽĐž**. І ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐČĐž Đ·Đ±ĐžŃ€Đ°Ń‚ĐžĐŒĐ”Ń‚Đ” ĐŸĐ±Ń€Đ°Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° Đ·ĐœĐŸĐČу і Đ·ĐœĐŸĐČу піЮ час Ń€ĐŸĐ·Ń€ĐŸĐ±ĐșĐž, Ń‰ĐŸĐ± пДрДĐČірято, Ń‰ĐŸ Đ·ĐŒŃ–ĐœĐž у ĐČĐ°ŃˆĐŸĐŒŃƒ ĐșĐŸĐŽŃ– працюють, цД Đ·Đ°ĐŸŃ‰Đ°ĐŽĐžŃ‚ŃŒ Đ±Đ°ĐłĐ°Ń‚ĐŸ ĐœĐ°ĐșĐŸĐżĐžŃ‡Đ”ĐœĐŸĐłĐŸ часу. -ĐŸĐŸŃ‚Ń–ĐŒ, блОжчД ĐŽĐŸ ĐșŃ–ĐœŃ†Ń `Dockerfile`, ĐŒĐž ĐșĐŸĐżŃ–ŃŽŃ”ĐŒĐŸ ĐČĐ”ŃŃŒ ĐșĐŸĐŽ. ОсĐșŃ–Đ»ŃŒĐșĐž цД тД, Ń‰ĐŸ Đ·ĐŒŃ–ĐœŃŽŃ”Ń‚ŃŒŃŃ ĐœĐ°ĐčŃ‡Đ°ŃŃ‚Ń–ŃˆĐ”, ĐŒĐž Ń€ĐŸĐ·ĐŒŃ–Ń‰ŃƒŃ”ĐŒĐŸ цД блОжчД ĐŽĐŸ ĐșŃ–ĐœŃ†Ń, аЎжД ĐŒĐ°ĐčжД заĐČжЎО ĐČсД ĐżŃ–ŃĐ»Ń Ń†ŃŒĐŸĐłĐŸ ĐșŃ€ĐŸĐșу ĐœĐ” Đ·ĐŒĐŸĐ¶Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐșДш. +ĐŸĐŸŃ‚Ń–ĐŒ, блОжчД ĐŽĐŸ ĐșŃ–ĐœŃ†Ń `Dockerfile`, ĐŒĐž ĐșĐŸĐżŃ–ŃŽŃ”ĐŒĐŸ ĐČĐ”ŃŃŒ ĐșĐŸĐŽ. ОсĐșŃ–Đ»ŃŒĐșĐž цД тД, Ń‰ĐŸ **Đ·ĐŒŃ–ĐœŃŽŃ”Ń‚ŃŒŃŃ ĐœĐ°ĐčŃ‡Đ°ŃŃ‚Ń–ŃˆĐ”**, ĐŒĐž Ń€ĐŸĐ·ĐŒŃ–Ń‰ŃƒŃ”ĐŒĐŸ цД блОжчД ĐŽĐŸ ĐșŃ–ĐœŃ†Ń, аЎжД ĐŒĐ°ĐčжД заĐČжЎО ĐČсД ĐżŃ–ŃĐ»Ń Ń†ŃŒĐŸĐłĐŸ ĐșŃ€ĐŸĐșу ĐœĐ” Đ·ĐŒĐŸĐ¶Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐșДш. ```Dockerfile COPY ./app /code/app @@ -415,11 +415,11 @@ CMD ["fastapi", "run", "main.py", "--port", "80"] ĐŸĐŸĐłĐŸĐČĐŸŃ€Ń–ĐŒĐŸ Đ·ĐœĐŸĐČу ĐżŃ€ĐŸ ĐŽĐ”ŃĐșі Đ· тох ŃĐ°ĐŒĐžŃ… [ĐšĐŸĐœŃ†Đ”ĐżŃ†Ń–Đč Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ](concepts.md) у Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Ń… ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ. -ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž - цД пДрДĐČĐ°Đ¶ĐœĐŸ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚ ĐŽĐ»Ń ŃĐżŃ€ĐŸŃ‰Đ”ĐœĐœŃ ĐżŃ€ĐŸŃ†Đ”ŃŃƒ Đ·Đ±ĐžŃ€Đ°ĐœĐœŃ та Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу, алД ĐČĐŸĐœĐž ĐœĐ” ĐœĐ°ĐČâ€™ŃĐ·ŃƒŃŽŃ‚ŃŒ ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐžĐč піЮхіЮ ĐŽĐŸ ĐŸĐ±Ń€ĐŸĐ±ĐșĐž цох ĐșĐŸĐœŃ†Đ”ĐżŃ†Ń–Đč Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ, і Ń–ŃĐœŃƒŃ” ĐșŃ–Đ»ŃŒĐșа ĐŒĐŸĐ¶Đ»ĐžĐČох стратДгіĐč. +ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž - цД пДрДĐČĐ°Đ¶ĐœĐŸ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚ ĐŽĐ»Ń ŃĐżŃ€ĐŸŃ‰Đ”ĐœĐœŃ ĐżŃ€ĐŸŃ†Đ”ŃŃƒ **Đ·Đ±ĐžŃ€Đ°ĐœĐœŃ та Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ** Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу, алД ĐČĐŸĐœĐž ĐœĐ” ĐœĐ°ĐČâ€™ŃĐ·ŃƒŃŽŃ‚ŃŒ ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐžĐč піЮхіЮ ĐŽĐŸ ĐŸĐ±Ń€ĐŸĐ±ĐșĐž цох **ĐșĐŸĐœŃ†Đ”ĐżŃ†Ń–Đč Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ**, і Ń–ŃĐœŃƒŃ” ĐșŃ–Đ»ŃŒĐșа ĐŒĐŸĐ¶Đ»ĐžĐČох стратДгіĐč. -Đ“Đ°Ń€ĐœĐ° ĐœĐŸĐČĐžĐœĐ° ĐżĐŸĐ»ŃĐłĐ°Ń” ĐČ Ń‚ĐŸĐŒŃƒ, Ń‰ĐŸ ĐŽĐ»Ń ĐșĐŸĐ¶ĐœĐŸŃ— стратДгії є ŃĐżĐŸŃŃ–Đ± ĐżĐŸĐșрото ĐČсі ĐșĐŸĐœŃ†Đ”ĐżŃ†Ń–Ń— Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ. 🎉 +**Đ“Đ°Ń€ĐœĐ° ĐœĐŸĐČĐžĐœĐ°** ĐżĐŸĐ»ŃĐłĐ°Ń” ĐČ Ń‚ĐŸĐŒŃƒ, Ń‰ĐŸ ĐŽĐ»Ń ĐșĐŸĐ¶ĐœĐŸŃ— стратДгії є ŃĐżĐŸŃŃ–Đ± ĐżĐŸĐșрото ĐČсі ĐșĐŸĐœŃ†Đ”ĐżŃ†Ń–Ń— Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ. 🎉 -Đ ĐŸĐ·ĐłĐ»ŃĐœŃŒĐŒĐŸ ці ĐșĐŸĐœŃ†Đ”ĐżŃ†Ń–Ń— Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ ĐČ ĐșĐŸĐœŃ‚Đ”Đșсті ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ: +Đ ĐŸĐ·ĐłĐ»ŃĐœŃŒĐŒĐŸ ці **ĐșĐŸĐœŃ†Đ”ĐżŃ†Ń–Ń— Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ** ĐČ ĐșĐŸĐœŃ‚Đ”Đșсті ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ: * HTTPS * АĐČŃ‚ĐŸĐ·Đ°ĐżŃƒŃĐș @@ -430,9 +430,9 @@ CMD ["fastapi", "run", "main.py", "--port", "80"] ## HTTPS { #https } -ĐŻĐșŃ‰ĐŸ Đ·ĐŸŃĐ”Ń€Đ”ĐŽĐžŃ‚ĐžŃŃŒ лОшД ĐœĐ° ĐŸĐ±Ń€Đ°Đ·Ń– ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° ĐŽĐ»Ń Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу FastAPI (а Đ·ĐłĐŸĐŽĐŸĐŒ ĐœĐ° Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐŸĐŒŃƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–), HTTPS зазĐČочаĐč ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ”Ń‚ŃŒŃŃ Đ·ĐŸĐČĐœŃ–ŃˆĐœŃ–ĐŒ Ń–ĐœŃˆĐžĐŒ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚ĐŸĐŒ. +ĐŻĐșŃ‰ĐŸ Đ·ĐŸŃĐ”Ń€Đ”ĐŽĐžŃ‚ĐžŃŃŒ лОшД ĐœĐ° **ĐŸĐ±Ń€Đ°Đ·Ń– ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°** ĐŽĐ»Ń Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу FastAPI (а Đ·ĐłĐŸĐŽĐŸĐŒ ĐœĐ° Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐŸĐŒŃƒ **ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–**), HTTPS зазĐČочаĐč ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ”Ń‚ŃŒŃŃ **Đ·ĐŸĐČĐœŃ–ŃˆĐœŃ–ĐŒ** Ń–ĐœŃˆĐžĐŒ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚ĐŸĐŒ. -ĐŠĐ” ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž Ń–ĐœŃˆĐžĐč ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€, ĐœĐ°ĐżŃ€ĐžĐșлаЎ Đ· [Traefik](https://traefik.io/), Ń‰ĐŸ ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ” HTTPS і аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐ” ĐŸŃ‚Ń€ĐžĐŒĐ°ĐœĐœŃ сДртОфіĐșатіĐČ. +ĐŠĐ” ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž Ń–ĐœŃˆĐžĐč ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€, ĐœĐ°ĐżŃ€ĐžĐșлаЎ Đ· [Traefik](https://traefik.io/), Ń‰ĐŸ ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ” **HTTPS** і **аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐ”** ĐŸŃ‚Ń€ĐžĐŒĐ°ĐœĐœŃ **сДртОфіĐșатіĐČ**. /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° @@ -444,57 +444,57 @@ Traefik ĐŒĐ°Ń” Ń–ĐœŃ‚Đ”ĐłŃ€Đ°Ń†Ń–Ń— Đ· Docker, Kubernetes та Ń–ĐœŃˆĐžĐŒĐž, т ## АĐČŃ‚ĐŸĐ·Đ°ĐżŃƒŃĐș і ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșĐž { #running-on-startup-and-restarts } -ЗазĐČочаĐč Ń–ĐœŃˆĐžĐč Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚ ĐČŃ–ĐŽĐżĐŸĐČіЮає за запусĐș і ĐČĐžĐșĐŸĐœĐ°ĐœĐœŃ ĐČĐ°ŃˆĐŸĐłĐŸ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°. +ЗазĐČочаĐč Ń–ĐœŃˆĐžĐč Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚ ĐČŃ–ĐŽĐżĐŸĐČіЮає за **запусĐș і ĐČĐžĐșĐŸĐœĐ°ĐœĐœŃ** ĐČĐ°ŃˆĐŸĐłĐŸ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°. -ĐŠĐ” ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Docker, Docker Compose, Kubernetes, Ń…ĐŒĐ°Ń€ĐœĐžĐč сДрĐČіс Ń‚ĐŸŃ‰ĐŸ. +ĐŠĐ” ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ **Docker**, **Docker Compose**, **Kubernetes**, **Ń…ĐŒĐ°Ń€ĐœĐžĐč сДрĐČіс** Ń‚ĐŸŃ‰ĐŸ. ĐŁ Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– (Đ°Đ±ĐŸ ĐČсіх) ĐČОпаЎĐșіĐČ Ń” ĐżŃ€ĐŸŃŃ‚Đ° ĐŸĐżŃ†Ń–Ń, Ń‰ĐŸĐ± уĐČŃ–ĐŒĐșĐœŃƒŃ‚Đž запусĐș ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° про старті ŃĐžŃŃ‚Đ”ĐŒĐž та ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșĐž у разі Đ·Đ±ĐŸŃ—ĐČ. НапроĐșлаЎ, у Docker цД ĐŸĐżŃ†Ń–Ń ĐșĐŸĐŒĐ°ĐœĐŽĐœĐŸĐłĐŸ ряЮĐșа `--restart`. -БДз ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Đ·ĐŒŃƒŃĐžŃ‚Đž Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž запусĐșатося про старті ŃĐžŃŃ‚Đ”ĐŒĐž та Đ· ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșĐ°ĐŒĐž ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐșĐ»ĐŸĐżŃ–Ń‚ĐœĐŸ і сĐșĐ»Đ°ĐŽĐœĐŸ. АлД піЮ час Ń€ĐŸĐ±ĐŸŃ‚Đž Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž у Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– ĐČОпаЎĐșіĐČ Ń†Ń Ń„ŃƒĐœĐșŃ†Ń–ĐŸĐœĐ°Đ»ŃŒĐœŃ–ŃŃ‚ŃŒ ĐČĐ±ŃƒĐŽĐŸĐČĐ°ĐœĐ° за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ. ✹ +БДз ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Đ·ĐŒŃƒŃĐžŃ‚Đž Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž запусĐșатося про старті ŃĐžŃŃ‚Đ”ĐŒĐž та Đ· ĐżĐ”Ń€Đ”Đ·Đ°ĐżŃƒŃĐșĐ°ĐŒĐž ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐșĐ»ĐŸĐżŃ–Ń‚ĐœĐŸ і сĐșĐ»Đ°ĐŽĐœĐŸ. АлД піЮ час **Ń€ĐŸĐ±ĐŸŃ‚Đž Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž** у Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– ĐČОпаЎĐșіĐČ Ń†Ń Ń„ŃƒĐœĐșŃ†Ń–ĐŸĐœĐ°Đ»ŃŒĐœŃ–ŃŃ‚ŃŒ ĐČĐ±ŃƒĐŽĐŸĐČĐ°ĐœĐ° за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ. ✹ ## РДпліĐșація - ĐșŃ–Đ»ŃŒĐșість ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ { #replication-number-of-processes } -ĐŻĐșŃ‰ĐŸ у ĐČас є ĐșластДр ĐŒĐ°ŃˆĐžĐœ Ń–Đ· Kubernetes, Docker Swarm Mode, Nomad Đ°Đ±ĐŸ Ń–ĐœŃˆĐŸŃŽ ĐżĐŸĐŽŃ–Đ±ĐœĐŸŃŽ сĐșĐ»Đ°ĐŽĐœĐŸŃŽ ŃĐžŃŃ‚Đ”ĐŒĐŸŃŽ ĐŽĐ»Ń ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ Ń€ĐŸĐ·ĐżĐŸĐŽŃ–Đ»Đ”ĐœĐžĐŒĐž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž ĐœĐ° ĐșŃ–Đ»ŃŒĐșĐŸŃ… ĐŒĐ°ŃˆĐžĐœĐ°Ń…, Ń‚ĐŸĐŽŃ– ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ‚Đž рДпліĐșацію ĐœĐ° ріĐČĐœŃ– ĐșластДра Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€Đ° ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ (яĐș-ĐŸŃ‚ Uvicorn Đ· праціĐČĐœĐžĐșĐ°ĐŒĐž) у ĐșĐŸĐ¶ĐœĐŸĐŒŃƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–. +ĐŻĐșŃ‰ĐŸ у ĐČас є ĐșластДр ĐŒĐ°ŃˆĐžĐœ Ń–Đ· **Kubernetes**, Docker Swarm Mode, Nomad Đ°Đ±ĐŸ Ń–ĐœŃˆĐŸŃŽ ĐżĐŸĐŽŃ–Đ±ĐœĐŸŃŽ сĐșĐ»Đ°ĐŽĐœĐŸŃŽ ŃĐžŃŃ‚Đ”ĐŒĐŸŃŽ ĐŽĐ»Ń ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ Ń€ĐŸĐ·ĐżĐŸĐŽŃ–Đ»Đ”ĐœĐžĐŒĐž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž ĐœĐ° ĐșŃ–Đ»ŃŒĐșĐŸŃ… ĐŒĐ°ŃˆĐžĐœĐ°Ń…, Ń‚ĐŸĐŽŃ– ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” **ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ‚Đž рДпліĐșацію** ĐœĐ° **ріĐČĐœŃ– ĐșластДра** Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ **ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€Đ° ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ** (яĐș-ĐŸŃ‚ Uvicorn Đ· праціĐČĐœĐžĐșĐ°ĐŒĐž) у ĐșĐŸĐ¶ĐœĐŸĐŒŃƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–. -ĐžĐŽĐœĐ° Đ· таĐșох Ń€ĐŸĐ·ĐżĐŸĐŽŃ–Đ»Đ”ĐœĐžŃ… ŃĐžŃŃ‚Đ”ĐŒ ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž, яĐș-ĐŸŃ‚ Kubernetes, зазĐČочаĐč ĐŒĐ°Ń” Ń–ĐœŃ‚Đ”ĐłŃ€ĐŸĐČĐ°ĐœŃ– ŃĐżĐŸŃĐŸĐ±Đž ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ‚Đž рДпліĐșацію ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ, ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃŽŃ‡Đž ĐČĐŸĐŽĐœĐŸŃ‡Đ°Ń Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°ĐœĐœŃ ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ ĐŽĐ»Ń ĐČŃ…Ń–ĐŽĐœĐžŃ… запОтіĐČ. УсД цД - ĐœĐ° ріĐČĐœŃ– ĐșластДра. +ĐžĐŽĐœĐ° Đ· таĐșох Ń€ĐŸĐ·ĐżĐŸĐŽŃ–Đ»Đ”ĐœĐžŃ… ŃĐžŃŃ‚Đ”ĐŒ ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž, яĐș-ĐŸŃ‚ Kubernetes, зазĐČочаĐč ĐŒĐ°Ń” Ń–ĐœŃ‚Đ”ĐłŃ€ĐŸĐČĐ°ĐœŃ– ŃĐżĐŸŃĐŸĐ±Đž ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ‚Đž **рДпліĐșацію ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ**, ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃŽŃ‡Đž ĐČĐŸĐŽĐœĐŸŃ‡Đ°Ń **Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°ĐœĐœŃ ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ** ĐŽĐ»Ń ĐČŃ…Ń–ĐŽĐœĐžŃ… запОтіĐČ. УсД цД - ĐœĐ° **ріĐČĐœŃ– ĐșластДра**. -ĐŁ таĐșох ĐČОпаЎĐșах ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” зібратО Docker-ĐŸĐ±Ń€Đ°Đ· Đ· ĐœŃƒĐ»Ń, яĐș [ĐżĐŸŃŃĐœĐ”ĐœĐŸ ĐČОщД](#dockerfile), ĐČŃŃ‚Đ°ĐœĐŸĐČĐžĐČшО ĐČаші Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– і Đ·Đ°ĐżŃƒŃŃ‚ĐžĐČшО ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń Uvicorn Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐșŃ–Đ»ŃŒĐșĐŸŃ… праціĐČĐœĐžĐșіĐČ Uvicorn. +ĐŁ таĐșох ĐČОпаЎĐșах ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” зібратО **Docker-ĐŸĐ±Ń€Đ°Đ· Đ· ĐœŃƒĐ»Ń**, яĐș [ĐżĐŸŃŃĐœĐ”ĐœĐŸ ĐČОщД](#dockerfile), ĐČŃŃ‚Đ°ĐœĐŸĐČĐžĐČшО ĐČаші Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– і Đ·Đ°ĐżŃƒŃŃ‚ĐžĐČшО **ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń Uvicorn** Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐșŃ–Đ»ŃŒĐșĐŸŃ… праціĐČĐœĐžĐșіĐČ Uvicorn. ### Đ‘Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐș ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ { #load-balancer } -Про ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ– ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Đ·Đ°Đ·ĐČочаĐč є яĐșĐžĐčсь ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚, Ń‰ĐŸ ŃĐ»ŃƒŃ…Đ°Ń” ĐœĐ° ĐłĐŸĐ»ĐŸĐČĐœĐŸĐŒŃƒ ĐżĐŸŃ€Ń‚Ńƒ. ĐŠĐ” ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž Ń–ĐœŃˆĐžĐč ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€, яĐșĐžĐč таĐșĐŸĐ¶ є прДЎстаĐČĐœĐžĐșĐŸĐŒ Đ· Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Ń†Ń–Ń”ŃŽ TLS ĐŽĐ»Ń ĐŸĐ±Ń€ĐŸĐ±ĐșĐž HTTPS, Đ°Đ±ĐŸ ĐżĐŸĐŽŃ–Đ±ĐœĐžĐč Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚. +Про ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ– ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Đ·Đ°Đ·ĐČочаĐč є яĐșĐžĐčсь ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚, Ń‰ĐŸ **ŃĐ»ŃƒŃ…Đ°Ń” ĐœĐ° ĐłĐŸĐ»ĐŸĐČĐœĐŸĐŒŃƒ ĐżĐŸŃ€Ń‚Ńƒ**. ĐŠĐ” ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž Ń–ĐœŃˆĐžĐč ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€, яĐșĐžĐč таĐșĐŸĐ¶ є **прДЎстаĐČĐœĐžĐșĐŸĐŒ Đ· Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Ń†Ń–Ń”ŃŽ TLS** ĐŽĐ»Ń ĐŸĐ±Ń€ĐŸĐ±ĐșĐž **HTTPS**, Đ°Đ±ĐŸ ĐżĐŸĐŽŃ–Đ±ĐœĐžĐč Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚. -ОсĐșŃ–Đ»ŃŒĐșĐž цДĐč ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚ проĐčĐŒĐ°Ń” ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ запОтіĐČ Ń– Ń€ĐŸĐ·ĐżĐŸĐŽŃ–Đ»ŃŃ” ĐčĐŸĐłĐŸ ĐŒŃ–Đ¶ праціĐČĐœĐžĐșĐ°ĐŒĐž (ŃĐżĐŸĐŽŃ–ĐČĐ°Ń”ĐŒĐŸŃŃŒ) Đ·Đ±Đ°Đ»Đ°ĐœŃĐŸĐČĐ°ĐœĐŸ, ĐčĐŸĐłĐŸ таĐșĐŸĐ¶ Ń‡Đ°ŃŃ‚ĐŸ ĐœĐ°Đ·ĐžĐČають Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐșĐŸĐŒ ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ. +ОсĐșŃ–Đ»ŃŒĐșĐž цДĐč ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚ проĐčĐŒĐ°Ń” **ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ** запОтіĐČ Ń– Ń€ĐŸĐ·ĐżĐŸĐŽŃ–Đ»ŃŃ” ĐčĐŸĐłĐŸ ĐŒŃ–Đ¶ праціĐČĐœĐžĐșĐ°ĐŒĐž (ŃĐżĐŸĐŽŃ–ĐČĐ°Ń”ĐŒĐŸŃŃŒ) **Đ·Đ±Đ°Đ»Đ°ĐœŃĐŸĐČĐ°ĐœĐŸ**, ĐčĐŸĐłĐŸ таĐșĐŸĐ¶ Ń‡Đ°ŃŃ‚ĐŸ ĐœĐ°Đ·ĐžĐČають **Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐșĐŸĐŒ ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ**. /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -ĐąĐŸĐč ŃĐ°ĐŒĐžĐč ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚ прДЎстаĐČĐœĐžĐșа Đ· Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Ń†Ń–Ń”ŃŽ TLS, Ń‰ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ĐŽĐ»Ń HTTPS, шĐČОЎшД за ĐČсД, таĐșĐŸĐ¶ буЎД Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐșĐŸĐŒ ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ. +ĐąĐŸĐč ŃĐ°ĐŒĐžĐč ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚ **прДЎстаĐČĐœĐžĐșа Đ· Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Ń†Ń–Ń”ŃŽ TLS**, Ń‰ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ĐŽĐ»Ń HTTPS, шĐČОЎшД за ĐČсД, таĐșĐŸĐ¶ буЎД **Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐșĐŸĐŒ ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ**. /// -І піЮ час Ń€ĐŸĐ±ĐŸŃ‚Đž Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž та ŃĐ°ĐŒĐ° ŃĐžŃŃ‚Đ”ĐŒĐ°, яĐșу ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ĐŽĐ»Ń їх запусĐșу і ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐœĐžĐŒĐž, ĐČжД ĐŒĐ°Ń‚ĐžĐŒĐ” ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž ĐŽĐ»Ń пДрДЎаĐČĐ°ĐœĐœŃ ĐŒĐ”Ń€Đ”Đ¶Đ”ĐČĐŸŃ— ĐșĐŸĐŒŃƒĐœŃ–Đșації (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, HTTP-запОтіĐČ) ĐČіЮ Ń†ŃŒĐŸĐłĐŸ Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐșа ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ (яĐșĐžĐč таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž прДЎстаĐČĐœĐžĐșĐŸĐŒ Đ· Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Ń†Ń–Ń”ŃŽ TLS) ĐŽĐŸ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Ń–Đ· ĐČĐ°ŃˆĐžĐŒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐŸĐŒ. +І піЮ час Ń€ĐŸĐ±ĐŸŃ‚Đž Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž та ŃĐ°ĐŒĐ° ŃĐžŃŃ‚Đ”ĐŒĐ°, яĐșу ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ĐŽĐ»Ń їх запусĐșу і ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐœĐžĐŒĐž, ĐČжД ĐŒĐ°Ń‚ĐžĐŒĐ” ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž ĐŽĐ»Ń пДрДЎаĐČĐ°ĐœĐœŃ **ĐŒĐ”Ń€Đ”Đ¶Đ”ĐČĐŸŃ— ĐșĐŸĐŒŃƒĐœŃ–Đșації** (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, HTTP-запОтіĐČ) ĐČіЮ Ń†ŃŒĐŸĐłĐŸ **Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐșа ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ** (яĐșĐžĐč таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž **прДЎстаĐČĐœĐžĐșĐŸĐŒ Đ· Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Ń†Ń–Ń”ŃŽ TLS**) ĐŽĐŸ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Ń–Đ· ĐČĐ°ŃˆĐžĐŒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐŸĐŒ. ### ĐžĐŽĐžĐœ Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐș ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ - ĐșŃ–Đ»ŃŒĐșа ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ-праціĐČĐœĐžĐșіĐČ { #one-load-balancer-multiple-worker-containers } -ПіЮ час Ń€ĐŸĐ±ĐŸŃ‚Đž Đ· Kubernetes Đ°Đ±ĐŸ ĐżĐŸĐŽŃ–Đ±ĐœĐžĐŒĐž Ń€ĐŸĐ·ĐżĐŸĐŽŃ–Đ»Đ”ĐœĐžĐŒĐž ŃĐžŃŃ‚Đ”ĐŒĐ°ĐŒĐž ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Ń—Ń…ĐœŃ–Ń… ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃ–Ń… ĐŒĐ”Ń€Đ”Đ¶Đ”ĐČох ĐŒĐ”Ń…Đ°ĐœŃ–Đ·ĐŒŃ–ĐČ ĐŽĐŸĐ·ĐČĐŸĐ»ŃŃ” Ń”ĐŽĐžĐœĐŸĐŒŃƒ Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐșу ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ, Ń‰ĐŸ ŃĐ»ŃƒŃ…Đ°Ń” ĐœĐ° ĐłĐŸĐ»ĐŸĐČĐœĐŸĐŒŃƒ ĐżĐŸŃ€Ń‚Ńƒ, пДрДЎаĐČато ĐșĐŸĐŒŃƒĐœŃ–Đșацію (запОтО) ĐŽĐŸ ĐșŃ–Đ»ŃŒĐșĐŸŃ… ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ, у яĐșох Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐŸ ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș. +ПіЮ час Ń€ĐŸĐ±ĐŸŃ‚Đž Đ· **Kubernetes** Đ°Đ±ĐŸ ĐżĐŸĐŽŃ–Đ±ĐœĐžĐŒĐž Ń€ĐŸĐ·ĐżĐŸĐŽŃ–Đ»Đ”ĐœĐžĐŒĐž ŃĐžŃŃ‚Đ”ĐŒĐ°ĐŒĐž ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Ń—Ń…ĐœŃ–Ń… ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃ–Ń… ĐŒĐ”Ń€Đ”Đ¶Đ”ĐČох ĐŒĐ”Ń…Đ°ĐœŃ–Đ·ĐŒŃ–ĐČ ĐŽĐŸĐ·ĐČĐŸĐ»ŃŃ” Ń”ĐŽĐžĐœĐŸĐŒŃƒ **Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐșу ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ**, Ń‰ĐŸ ŃĐ»ŃƒŃ…Đ°Ń” ĐœĐ° ĐłĐŸĐ»ĐŸĐČĐœĐŸĐŒŃƒ **ĐżĐŸŃ€Ń‚Ńƒ**, пДрДЎаĐČато ĐșĐŸĐŒŃƒĐœŃ–Đșацію (запОтО) ĐŽĐŸ ĐșŃ–Đ»ŃŒĐșĐŸŃ… **ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ**, у яĐșох Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐŸ ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș. -ĐšĐŸĐ¶Đ”Đœ Đ· цох ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Ń–Đ· ĐČĐ°ŃˆĐžĐŒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐŸĐŒ зазĐČочаĐč ĐŒĐ°Ń” лОшД ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, ĐżŃ€ĐŸŃ†Đ”Ń Uvicorn, Ń‰ĐŸ запусĐșає ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș FastAPI). Усі ĐČĐŸĐœĐž Đ±ŃƒĐŽŃƒŃ‚ŃŒ Ń–ĐŽĐ”ĐœŃ‚ĐžŃ‡ĐœĐžĐŒĐž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž, яĐșі запусĐșають тД ŃĐ°ĐŒĐ”, алД ĐșĐŸĐ¶Đ”Đœ Đ·Ń– сĐČĐŸŃ—ĐŒ ĐżŃ€ĐŸŃ†Đ”ŃĐŸĐŒ, ĐżĐ°ĐŒâ€™ŃŃ‚Ń‚ŃŽ Ń‚ĐŸŃ‰ĐŸ. йаĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń”Ń‚Đ” пДрДĐČагО ĐżĐ°Ń€Đ°Đ»Đ”Đ»Ń–Đ·ĐŒŃƒ ĐœĐ° Ń€Ń–Đ·ĐœĐžŃ… яЮрах ĐżŃ€ĐŸŃ†Đ”ŃĐŸŃ€Đ° Đ°Đ±ĐŸ ĐœĐ°ĐČіть ĐœĐ° Ń€Ń–Đ·ĐœĐžŃ… ĐŒĐ°ŃˆĐžĐœĐ°Ń…. +ĐšĐŸĐ¶Đ”Đœ Đ· цох ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Ń–Đ· ĐČĐ°ŃˆĐžĐŒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐŸĐŒ зазĐČочаĐč ĐŒĐ°Ń” **лОшД ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń** (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, ĐżŃ€ĐŸŃ†Đ”Ń Uvicorn, Ń‰ĐŸ запусĐșає ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș FastAPI). Усі ĐČĐŸĐœĐž Đ±ŃƒĐŽŃƒŃ‚ŃŒ **Ń–ĐŽĐ”ĐœŃ‚ĐžŃ‡ĐœĐžĐŒĐž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž**, яĐșі запусĐșають тД ŃĐ°ĐŒĐ”, алД ĐșĐŸĐ¶Đ”Đœ Đ·Ń– сĐČĐŸŃ—ĐŒ ĐżŃ€ĐŸŃ†Đ”ŃĐŸĐŒ, ĐżĐ°ĐŒâ€™ŃŃ‚Ń‚ŃŽ Ń‚ĐŸŃ‰ĐŸ. йаĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń”Ń‚Đ” пДрДĐČагО **паралДлізації** ĐœĐ° **Ń€Ń–Đ·ĐœĐžŃ… яЮрах** ĐżŃ€ĐŸŃ†Đ”ŃĐŸŃ€Đ° Đ°Đ±ĐŸ ĐœĐ°ĐČіть ĐœĐ° **Ń€Ń–Đ·ĐœĐžŃ… ĐŒĐ°ŃˆĐžĐœĐ°Ń…**. -А Ń€ĐŸĐ·ĐżĐŸĐŽŃ–Đ»Đ”ĐœĐ° ŃĐžŃŃ‚Đ”ĐŒĐ° ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Ń–Đ· Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐșĐŸĐŒ ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ Ń€ĐŸĐ·ĐżĐŸĐŽŃ–Đ»ŃŃ‚ĐžĐŒĐ” запОтО ĐŒŃ–Đ¶ ĐșĐŸĐ¶ĐœĐžĐŒ Ń–Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Ń–Đ· ĐČĐ°ŃˆĐžĐŒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐŸĐŒ ĐżĐŸ чДрзі. ĐąĐŸĐ¶ ĐșĐŸĐ¶Đ”Đœ запОт ĐŒĐŸĐ¶Đ” ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ‚ĐžŃŃ ĐŸĐŽĐœĐžĐŒ Ń–Đ· ĐșŃ–Đ»ŃŒĐșĐŸŃ… рДпліĐșĐŸĐČĐ°ĐœĐžŃ… ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ, Ń‰ĐŸ запусĐșають ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș. +А Ń€ĐŸĐ·ĐżĐŸĐŽŃ–Đ»Đ”ĐœĐ° ŃĐžŃŃ‚Đ”ĐŒĐ° ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Ń–Đ· **Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐșĐŸĐŒ ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ** **Ń€ĐŸĐ·ĐżĐŸĐŽŃ–Đ»ŃŃ‚ĐžĐŒĐ” запОтО** ĐŒŃ–Đ¶ ĐșĐŸĐ¶ĐœĐžĐŒ Ń–Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ Ń–Đ· ĐČĐ°ŃˆĐžĐŒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐŸĐŒ **ĐżĐŸ чДрзі**. ĐąĐŸĐ¶ ĐșĐŸĐ¶Đ”Đœ запОт ĐŒĐŸĐ¶Đ” ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ‚ĐžŃŃ ĐŸĐŽĐœĐžĐŒ Ń–Đ· ĐșŃ–Đ»ŃŒĐșĐŸŃ… **рДпліĐșĐŸĐČĐ°ĐœĐžŃ… ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ**, Ń‰ĐŸ запусĐșають ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș. -І зазĐČочаĐč цДĐč Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐș ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ Đ·ĐŒĐŸĐ¶Đ” ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ‚Đž запОтО, яĐșі ĐčЮуть ĐŽĐŸ Ń–ĐœŃˆĐžŃ… Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ Ńƒ ĐČĐ°ŃˆĐŸĐŒŃƒ ĐșластДрі (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, ĐŽĐŸ Ń–ĐœŃˆĐŸĐłĐŸ ĐŽĐŸĐŒĐ”ĐœŃƒ Đ°Đ±ĐŸ піЮ Ń–ĐœŃˆĐžĐŒ прДфіĐșŃĐŸĐŒ ŃˆĐ»ŃŃ…Ńƒ URL), і пДрДЎаĐČĐ°Ń‚ĐžĐŒĐ” ĐșĐŸĐŒŃƒĐœŃ–Đșацію ĐŽĐŸ ĐČŃ–ĐŽĐżĐŸĐČŃ–ĐŽĐœĐžŃ… ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ ĐŽĐ»Ń Ń‚ĐŸĐłĐŸ Ń–ĐœŃˆĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу, Ń‰ĐŸ працює у ĐČĐ°ŃˆĐŸĐŒŃƒ ĐșластДрі. +І зазĐČочаĐč цДĐč **Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°Đ»ŃŒĐœĐžĐș ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ** Đ·ĐŒĐŸĐ¶Đ” ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ‚Đž запОтО, яĐșі ĐčЮуть ĐŽĐŸ *Ń–ĐœŃˆĐžŃ…* Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ Ńƒ ĐČĐ°ŃˆĐŸĐŒŃƒ ĐșластДрі (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, ĐŽĐŸ Ń–ĐœŃˆĐŸĐłĐŸ ĐŽĐŸĐŒĐ”ĐœŃƒ Đ°Đ±ĐŸ піЮ Ń–ĐœŃˆĐžĐŒ прДфіĐșŃĐŸĐŒ ŃˆĐ»ŃŃ…Ńƒ URL), і пДрДЎаĐČĐ°Ń‚ĐžĐŒĐ” ĐșĐŸĐŒŃƒĐœŃ–Đșацію ĐŽĐŸ ĐČŃ–ĐŽĐżĐŸĐČŃ–ĐŽĐœĐžŃ… ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ ĐŽĐ»Ń *Ń‚ĐŸĐłĐŸ Ń–ĐœŃˆĐŸĐłĐŸ* Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу, Ń‰ĐŸ працює у ĐČĐ°ŃˆĐŸĐŒŃƒ ĐșластДрі. ### ĐžĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń ĐœĐ° ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ { #one-process-per-container } -ĐŁ таĐșĐŸĐŒŃƒ ŃŃ†Đ”ĐœĐ°Ń€Ń–Ń— ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž ĐŸĐŽĐžĐœ (Uvicorn) ĐżŃ€ĐŸŃ†Đ”Ń ĐœĐ° ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€, аЎжД ĐČĐž ĐČжД ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ”Ń‚Đ” рДпліĐșацію ĐœĐ° ріĐČĐœŃ– ĐșластДра. +ĐŁ таĐșĐŸĐŒŃƒ ŃŃ†Đ”ĐœĐ°Ń€Ń–Ń— ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž **ĐŸĐŽĐžĐœ (Uvicorn) ĐżŃ€ĐŸŃ†Đ”Ń ĐœĐ° ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€**, аЎжД ĐČĐž ĐČжД ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ”Ń‚Đ” рДпліĐșацію ĐœĐ° ріĐČĐœŃ– ĐșластДра. -ĐąĐŸĐ±Ń‚ĐŸ ĐČ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу ĐČĐž ĐœĐ” Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž ĐșŃ–Đ»ŃŒĐșĐŸŃ… праціĐČĐœĐžĐșіĐČ Ńƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–, ĐœĐ°ĐżŃ€ĐžĐșлаЎ чДрДз ĐŸĐżŃ†Ń–ŃŽ ĐșĐŸĐŒĐ°ĐœĐŽĐœĐŸĐłĐŸ ряЮĐșа `--workers`. Во Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž лОшД ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń Uvicorn ĐœĐ° ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ (алД, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐșŃ–Đ»ŃŒĐșа ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ). +ĐąĐŸĐ±Ń‚ĐŸ ĐČ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу ĐČĐž **ĐœĐ” Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ”** ĐŒĐ°Ń‚Đž ĐșŃ–Đ»ŃŒĐșĐŸŃ… праціĐČĐœĐžĐșіĐČ Ńƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–, ĐœĐ°ĐżŃ€ĐžĐșлаЎ чДрДз ĐŸĐżŃ†Ń–ŃŽ ĐșĐŸĐŒĐ°ĐœĐŽĐœĐŸĐłĐŸ ряЮĐșа `--workers`. Во Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž лОшД **ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń Uvicorn** ĐœĐ° ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ (алД, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐșŃ–Đ»ŃŒĐșа ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ). -НаяĐČĐœŃ–ŃŃ‚ŃŒ Ń–ĐœŃˆĐŸĐłĐŸ ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€Đ° ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° (яĐș цД Đ±ŃƒĐ»ĐŸ б Ń–Đ· ĐșŃ–Đ»ŃŒĐșĐŸĐŒĐ° праціĐČĐœĐžĐșĐ°ĐŒĐž) лОшД ĐŽĐŸĐŽĐ°ŃŃ‚ŃŒ заĐčĐČĐŸŃ— сĐșĐ»Đ°ĐŽĐœĐŸŃŃ‚Ń–, яĐșу, ĐœĐ°ĐčŃ–ĐŒĐŸĐČŃ–Ń€ĐœŃ–ŃˆĐ”, ĐČĐž ĐČжД ĐČĐžŃ€Ń–ŃˆŃƒŃ”Ń‚Đ” ĐœĐ° ріĐČĐœŃ– ĐșластДра. +НаяĐČĐœŃ–ŃŃ‚ŃŒ Ń–ĐœŃˆĐŸĐłĐŸ ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€Đ° ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° (яĐș цД Đ±ŃƒĐ»ĐŸ б Ń–Đ· ĐșŃ–Đ»ŃŒĐșĐŸĐŒĐ° праціĐČĐœĐžĐșĐ°ĐŒĐž) лОшД ĐŽĐŸĐŽĐ°ŃŃ‚ŃŒ **заĐčĐČĐŸŃ— сĐșĐ»Đ°ĐŽĐœĐŸŃŃ‚Ń–**, яĐșу, ĐœĐ°ĐčŃ–ĐŒĐŸĐČŃ–Ń€ĐœŃ–ŃˆĐ”, ĐČĐž ĐČжД ĐČĐžŃ€Ń–ŃˆŃƒŃ”Ń‚Đ” ĐœĐ° ріĐČĐœŃ– ĐșластДра. -### ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž Đ· ĐșŃ–Đ»ŃŒĐșĐŸĐŒĐž ĐżŃ€ĐŸŃ†Đ”ŃĐ°ĐŒĐž та ĐŸŃĐŸĐ±Đ»ĐžĐČі ĐČОпаЎĐșĐž { #containers-with-multiple-processes-and-special-cases } +### ĐšĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž Đ· ĐșŃ–Đ»ŃŒĐșĐŸĐŒĐ° ĐżŃ€ĐŸŃ†Đ”ŃĐ°ĐŒĐž та ĐŸŃĐŸĐ±Đ»ĐžĐČі ĐČОпаЎĐșĐž { #containers-with-multiple-processes-and-special-cases } -ЗĐČŃ–ŃĐœĐŸ, є ĐŸŃĐŸĐ±Đ»ĐžĐČі ĐČОпаЎĐșĐž, ĐșĐŸĐ»Đž ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°Ń…ĐŸŃ‚Ń–Ń‚Đž ĐŒĐ°Ń‚Đž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ Ń–Đ· ĐșŃ–Đ»ŃŒĐșĐŸĐŒĐ° ĐżŃ€ĐŸŃ†Đ”ŃĐ°ĐŒĐž-праціĐČĐœĐžĐșĐ°ĐŒĐž Uvicorn ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ–. +ЗĐČŃ–ŃĐœĐŸ, є **ĐŸŃĐŸĐ±Đ»ĐžĐČі ĐČОпаЎĐșĐž**, ĐșĐŸĐ»Đž ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°Ń…ĐŸŃ‚Ń–Ń‚Đž ĐŒĐ°Ń‚Đž **ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€** Ń–Đ· ĐșŃ–Đ»ŃŒĐșĐŸĐŒĐ° **ĐżŃ€ĐŸŃ†Đ”ŃĐ°ĐŒĐž-праціĐČĐœĐžĐșĐ°ĐŒĐž Uvicorn** ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ–. ĐŁ таĐșох ĐČОпаЎĐșах ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐŸĐżŃ†Ń–ŃŽ ĐșĐŸĐŒĐ°ĐœĐŽĐœĐŸĐłĐŸ ряЮĐșа `--workers`, Ń‰ĐŸĐ± заЎатО ĐșŃ–Đ»ŃŒĐșість праціĐČĐœĐžĐșіĐČ, яĐșох ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž: @@ -519,17 +519,17 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] #### ĐŸŃ€ĐŸŃŃ‚ĐžĐč Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș { #a-simple-app } -Во ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°Ń…ĐŸŃ‚Ń–Ń‚Đž ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ Ńƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–, яĐșŃ‰ĐŸ ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș ĐŽĐŸŃŃ‚Đ°Ń‚ĐœŃŒĐŸ ĐżŃ€ĐŸŃŃ‚ĐžĐč, Ń‰ĐŸĐ± запусĐșато ĐčĐŸĐłĐŸ ĐœĐ° ĐŸĐŽĐœĐŸĐŒŃƒ сДрĐČДрі, а ĐœĐ” ĐœĐ° ĐșластДрі. +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°Ń…ĐŸŃ‚Ń–Ń‚Đž ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ Ńƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–, яĐșŃ‰ĐŸ ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș **ĐŽĐŸŃŃ‚Đ°Ń‚ĐœŃŒĐŸ ĐżŃ€ĐŸŃŃ‚ĐžĐč**, Ń‰ĐŸĐ± запусĐșато ĐčĐŸĐłĐŸ ĐœĐ° **ĐŸĐŽĐœĐŸĐŒŃƒ сДрĐČДрі**, а ĐœĐ” ĐœĐ° ĐșластДрі. #### Docker Compose { #docker-compose } -Во ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°Ń‚Đž ĐœĐ° ĐŸĐŽĐœĐŸĐŒŃƒ сДрĐČДрі (ĐœĐ” ĐČ ĐșластДрі) за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ Docker Compose, Ń‚ĐŸĐ¶ у ĐČас ĐœĐ” буЎД ĐżŃ€ĐŸŃŃ‚ĐŸĐłĐŸ ŃĐżĐŸŃĐŸĐ±Ńƒ ĐșĐ”Ń€ŃƒĐČато рДпліĐșацією ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ (у Docker Compose), збДрігаючО ŃĐżŃ–Đ»ŃŒĐœŃƒ ĐŒĐ”Ń€Đ”Đ¶Ńƒ та Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°ĐœĐœŃ ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ. +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°Ń‚Đž ĐœĐ° **ĐŸĐŽĐœĐŸĐŒŃƒ сДрĐČДрі** (ĐœĐ” ĐČ ĐșластДрі) за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ **Docker Compose**, Ń‚ĐŸĐ¶ у ĐČас ĐœĐ” буЎД ĐżŃ€ĐŸŃŃ‚ĐŸĐłĐŸ ŃĐżĐŸŃĐŸĐ±Ńƒ ĐșĐ”Ń€ŃƒĐČато рДпліĐșацією ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ (у Docker Compose), збДрігаючО ŃĐżŃ–Đ»ŃŒĐœŃƒ ĐŒĐ”Ń€Đ”Đ¶Ńƒ та **Đ±Đ°Đ»Đ°ĐœŃŃƒĐČĐ°ĐœĐœŃ ĐœĐ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ**. -ĐąĐŸĐŽŃ– ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°Ń…ĐŸŃ‚Ń–Ń‚Đž ĐŒĐ°Ń‚Đž ĐŸĐŽĐžĐœ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ Ń–Đ· ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ĐŸĐŒ ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ, Ń‰ĐŸ запусĐșає ĐșŃ–Đ»ŃŒĐșа ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ-праціĐČĐœĐžĐșіĐČ ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ–. +ĐąĐŸĐŽŃ– ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°Ń…ĐŸŃ‚Ń–Ń‚Đž ĐŒĐ°Ń‚Đž **ĐŸĐŽĐžĐœ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€** Ń–Đ· **ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€ĐŸĐŒ ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ**, Ń‰ĐŸ запусĐșає **ĐșŃ–Đ»ŃŒĐșа ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ-праціĐČĐœĐžĐșіĐČ** ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ–. --- -Đ“ĐŸĐ»ĐŸĐČĐœĐ° ĐŽŃƒĐŒĐșа: цД ĐœĐ” праĐČОла, ĐČĐžĐșĐ°Ń€Đ±ŃƒĐČĐ°ĐœŃ– ĐČ ĐșĐ°ĐŒĐ”ĐœŃ–, яĐșох ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ŃĐ»Ń–ĐżĐŸ ĐŽĐŸŃ‚Ń€ĐžĐŒŃƒĐČатося. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ці іЎДї, Ń‰ĐŸĐ± ĐŸŃ†Ń–ĐœĐžŃ‚Đž ĐČĐ»Đ°ŃĐœĐžĐč ĐșĐ”Đčс і ĐČорішото, яĐșĐžĐč піЮхіЮ ĐœĐ°ĐčĐșращоĐč ĐŽĐ»Ń ĐČĐ°ŃˆĐŸŃ— ŃĐžŃŃ‚Đ”ĐŒĐž, Ń€ĐŸĐ·ĐłĐ»ŃĐŽĐ°ŃŽŃ‡Đž, яĐș ĐșĐ”Ń€ŃƒĐČато таĐșĐžĐŒĐž ĐșĐŸĐœŃ†Đ”ĐżŃ†Ń–ŃĐŒĐž: +Đ“ĐŸĐ»ĐŸĐČĐœĐ° ĐŽŃƒĐŒĐșа: **Đ¶ĐŸĐŽĐœĐ”** Đ· Ń†ŃŒĐŸĐłĐŸ ĐœĐ” є **праĐČĐžĐ»Đ°ĐŒĐž, ĐČĐžĐșĐ°Ń€Đ±ŃƒĐČĐ°ĐœĐžĐŒĐž ĐČ ĐșĐ°ĐŒĐ”ĐœŃ–**, яĐșох ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ŃĐ»Ń–ĐżĐŸ ĐŽĐŸŃ‚Ń€ĐžĐŒŃƒĐČатося. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ці іЎДї, Ń‰ĐŸĐ± **ĐŸŃ†Ń–ĐœĐžŃ‚Đž ĐČĐ»Đ°ŃĐœĐžĐč ĐșĐ”Đčс** і ĐČорішото, яĐșĐžĐč піЮхіЮ ĐœĐ°ĐčĐșращоĐč ĐŽĐ»Ń ĐČĐ°ŃˆĐŸŃ— ŃĐžŃŃ‚Đ”ĐŒĐž, Ń€ĐŸĐ·ĐłĐ»ŃĐŽĐ°ŃŽŃ‡Đž, яĐș ĐșĐ”Ń€ŃƒĐČато таĐșĐžĐŒĐž ĐșĐŸĐœŃ†Đ”ĐżŃ†Ń–ŃĐŒĐž: * БДзпДĐșа - HTTPS * АĐČŃ‚ĐŸĐ·Đ°ĐżŃƒŃĐș @@ -540,13 +540,13 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] ## ĐŸĐ°ĐŒâ€™ŃŃ‚ŃŒ { #memory } -ĐŻĐșŃ‰ĐŸ ĐČĐž запусĐșаєтД ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń ĐœĐ° ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€, ĐČĐž ĐŒĐ°Ń‚ĐžĐŒĐ”Ń‚Đ” Đ±Ń–Đ»ŃŒŃˆ-ĐŒĐ”ĐœŃˆ чітĐșĐŸ ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐžĐč, ŃŃ‚Đ°Đ±Ń–Đ»ŃŒĐœĐžĐč і ĐŸĐ±ĐŒĐ”Đ¶Đ”ĐœĐžĐč ĐŸĐ±ŃŃĐł ĐżĐ°ĐŒâ€™ŃŃ‚Ń–, Ń‰ĐŸ ŃĐżĐŸĐ¶ĐžĐČається ĐșĐŸĐ¶ĐœĐžĐŒ Ń–Đ· цох ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ (їх ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž Đ±Ń–Đ»ŃŒŃˆĐ” ĐŸĐŽĐœĐŸĐłĐŸ, яĐșŃ‰ĐŸ ĐČĐŸĐœĐž рДпліĐșĐŸĐČĐ°ĐœŃ–). +ĐŻĐșŃ‰ĐŸ ĐČĐž запусĐșаєтД **ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń ĐœĐ° ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€**, ĐČĐž ĐŒĐ°Ń‚ĐžĐŒĐ”Ń‚Đ” Đ±Ń–Đ»ŃŒŃˆ-ĐŒĐ”ĐœŃˆ чітĐșĐŸ ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐžĐč, ŃŃ‚Đ°Đ±Ń–Đ»ŃŒĐœĐžĐč і ĐŸĐ±ĐŒĐ”Đ¶Đ”ĐœĐžĐč ĐŸĐ±ŃŃĐł ĐżĐ°ĐŒâ€™ŃŃ‚Ń–, Ń‰ĐŸ ŃĐżĐŸĐ¶ĐžĐČається ĐșĐŸĐ¶ĐœĐžĐŒ Ń–Đ· цох ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ (їх ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž Đ±Ń–Đ»ŃŒŃˆĐ” ĐŸĐŽĐœĐŸĐłĐŸ, яĐșŃ‰ĐŸ ĐČĐŸĐœĐž рДпліĐșĐŸĐČĐ°ĐœŃ–). -ĐŸĐŸŃ‚Ń–ĐŒ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČŃŃ‚Đ°ĐœĐŸĐČото ті ŃĐ°ĐŒŃ– Đ»Ń–ĐŒŃ–Ń‚Đž та ĐČĐžĐŒĐŸĐłĐž ĐŽĐŸ ĐżĐ°ĐŒâ€™ŃŃ‚Ń– у ĐČашох ĐșĐŸĐœŃ„Ń–ĐłŃƒŃ€Đ°Ń†Ń–ŃŃ… ĐŽĐ»Ń ŃĐžŃŃ‚Đ”ĐŒĐž ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, у Kubernetes). йаĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ ĐČĐŸĐœĐ° Đ·ĐŒĐŸĐ¶Đ” рДпліĐșуĐČато ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž ĐœĐ° ĐŽĐŸŃŃ‚ŃƒĐżĐœĐžŃ… ĐŒĐ°ŃˆĐžĐœĐ°Ń…, ĐČŃ€Đ°Ń…ĐŸĐČуючо ĐŸĐ±ŃŃĐł ĐżĐ°ĐŒâ€™ŃŃ‚Ń–, ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžĐč Ń—ĐŒ, і ĐŸĐ±ŃŃĐł ĐŽĐŸŃŃ‚ŃƒĐżĐœĐŸŃ— ĐżĐ°ĐŒâ€™ŃŃ‚Ń– ĐœĐ° ĐŒĐ°ŃˆĐžĐœĐ°Ń… у ĐșластДрі. +ĐŸĐŸŃ‚Ń–ĐŒ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČŃŃ‚Đ°ĐœĐŸĐČото ті ŃĐ°ĐŒŃ– Đ»Ń–ĐŒŃ–Ń‚Đž та ĐČĐžĐŒĐŸĐłĐž ĐŽĐŸ ĐżĐ°ĐŒâ€™ŃŃ‚Ń– у ĐČашох ĐșĐŸĐœŃ„Ń–ĐłŃƒŃ€Đ°Ń†Ń–ŃŃ… ĐŽĐ»Ń ŃĐžŃŃ‚Đ”ĐŒĐž ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, у **Kubernetes**). йаĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ ĐČĐŸĐœĐ° Đ·ĐŒĐŸĐ¶Đ” **рДпліĐșуĐČато ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž** ĐœĐ° **ĐŽĐŸŃŃ‚ŃƒĐżĐœĐžŃ… ĐŒĐ°ŃˆĐžĐœĐ°Ń…**, ĐČŃ€Đ°Ń…ĐŸĐČуючо ĐŸĐ±ŃŃĐł ĐżĐ°ĐŒâ€™ŃŃ‚Ń–, ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžĐč Ń—ĐŒ, і ĐŸĐ±ŃŃĐł ĐŽĐŸŃŃ‚ŃƒĐżĐœĐŸŃ— ĐżĐ°ĐŒâ€™ŃŃ‚Ń– ĐœĐ° ĐŒĐ°ŃˆĐžĐœĐ°Ń… у ĐșластДрі. -ĐŻĐșŃ‰ĐŸ ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș ĐżŃ€ĐŸŃŃ‚ĐžĐč, Ń–ĐŒĐŸĐČŃ–Ń€ĐœĐŸ, цД ĐœĐ” буЎД ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒĐŸŃŽ, і ĐČĐ°ĐŒ ĐŒĐŸĐ¶Đ” ĐœĐ” Đ·ĐœĐ°ĐŽĐŸĐ±ĐžŃ‚ĐžŃŃ заЎаĐČато Đ¶ĐŸŃ€ŃŃ‚Đșі Đ»Ń–ĐŒŃ–Ń‚Đž ĐżĐ°ĐŒâ€™ŃŃ‚Ń–. АлД яĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” Đ±Đ°ĐłĐ°Ń‚ĐŸ ĐżĐ°ĐŒâ€™ŃŃ‚Ń– (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Ń–Đ· ĐŒĐŸĐŽĐ”Đ»ŃĐŒĐž ĐŒĐ°ŃˆĐžĐœĐœĐŸĐłĐŸ ĐœĐ°ĐČŃ‡Đ°ĐœĐœŃ), ĐČĐ°ĐŒ сліЎ пДрДĐČірото, сĐșŃ–Đ»ŃŒĐșĐž ĐżĐ°ĐŒâ€™ŃŃ‚Ń– ĐČĐž ŃĐżĐŸĐ¶ĐžĐČаєтД, і ĐČіЮĐșĐŸŃ€ĐžĐłŃƒĐČато ĐșŃ–Đ»ŃŒĐșість ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ, Ń‰ĐŸ запусĐșаються ĐœĐ° ĐșĐŸĐ¶ĐœŃ–Đč ĐŒĐ°ŃˆĐžĐœŃ– (і, ĐŒĐŸĐ¶Đ»ĐžĐČĐŸ, ĐŽĐŸĐŽĐ°Ń‚Đž Đ±Ń–Đ»ŃŒŃˆĐ” ĐŒĐ°ŃˆĐžĐœ у ĐČаш ĐșластДр). +ĐŻĐșŃ‰ĐŸ ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș **ĐżŃ€ĐŸŃŃ‚ĐžĐč**, Ń–ĐŒĐŸĐČŃ–Ń€ĐœĐŸ, цД **ĐœĐ” буЎД ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒĐŸŃŽ**, і ĐČĐ°ĐŒ ĐŒĐŸĐ¶Đ” ĐœĐ” Đ·ĐœĐ°ĐŽĐŸĐ±ĐžŃ‚ĐžŃŃ заЎаĐČато Đ¶ĐŸŃ€ŃŃ‚Đșі Đ»Ń–ĐŒŃ–Ń‚Đž ĐżĐ°ĐŒâ€™ŃŃ‚Ń–. АлД яĐșŃ‰ĐŸ ĐČĐž **ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” Đ±Đ°ĐłĐ°Ń‚ĐŸ ĐżĐ°ĐŒâ€™ŃŃ‚Ń–** (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Ń–Đ· ĐŒĐŸĐŽĐ”Đ»ŃĐŒĐž **ĐŒĐ°ŃˆĐžĐœĐœĐŸĐłĐŸ ĐœĐ°ĐČŃ‡Đ°ĐœĐœŃ**), ĐČĐ°ĐŒ сліЎ пДрДĐČірото, сĐșŃ–Đ»ŃŒĐșĐž ĐżĐ°ĐŒâ€™ŃŃ‚Ń– ĐČĐž ŃĐżĐŸĐ¶ĐžĐČаєтД, і ĐČіЮĐșĐŸŃ€ĐžĐłŃƒĐČато **ĐșŃ–Đ»ŃŒĐșість ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ**, Ń‰ĐŸ запусĐșаються ĐœĐ° **ĐșĐŸĐ¶ĐœŃ–Đč ĐŒĐ°ŃˆĐžĐœŃ–** (і, ĐŒĐŸĐ¶Đ»ĐžĐČĐŸ, ĐŽĐŸĐŽĐ°Ń‚Đž Đ±Ń–Đ»ŃŒŃˆĐ” ĐŒĐ°ŃˆĐžĐœ у ĐČаш ĐșластДр). -ĐŻĐșŃ‰ĐŸ ĐČĐž запусĐșаєтД ĐșŃ–Đ»ŃŒĐșа ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ ĐœĐ° ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€, ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ пДрДĐșĐŸĐœĐ°Ń‚ĐžŃŃ, Ń‰ĐŸ ĐșŃ–Đ»ŃŒĐșість Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžŃ… ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ ĐœĐ” ŃĐżĐŸĐ¶ĐžĐČає Đ±Ń–Đ»ŃŒŃˆĐ” ĐżĐ°ĐŒâ€™ŃŃ‚Ń–, ĐœŃ–Đ¶ ĐŽĐŸŃŃ‚ŃƒĐżĐœĐŸ. +ĐŻĐșŃ‰ĐŸ ĐČĐž запусĐșаєтД **ĐșŃ–Đ»ŃŒĐșа ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ ĐœĐ° ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€**, ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ пДрДĐșĐŸĐœĐ°Ń‚ĐžŃŃ, Ń‰ĐŸ ĐșŃ–Đ»ŃŒĐșість Đ·Đ°ĐżŃƒŃ‰Đ”ĐœĐžŃ… ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ ĐœĐ” **ŃĐżĐŸĐ¶ĐžĐČає Đ±Ń–Đ»ŃŒŃˆĐ” ĐżĐ°ĐŒâ€™ŃŃ‚Ń–**, ĐœŃ–Đ¶ ĐŽĐŸŃŃ‚ŃƒĐżĐœĐŸ. ## ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž пДрДЎ запусĐșĐŸĐŒ і ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đž { #previous-steps-before-starting-and-containers } @@ -554,7 +554,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] ### ĐšŃ–Đ»ŃŒĐșа ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ { #multiple-containers } -ĐŻĐșŃ‰ĐŸ у ĐČас ĐșŃ–Đ»ŃŒĐșа ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ, Ń–ĐŒĐŸĐČŃ–Ń€ĐœĐŸ ĐșĐŸĐ¶Đ”Đœ запусĐșає ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, у ĐșластДрі Kubernetes), Ń‚ĐŸĐŽŃ– ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž ĐŸĐșŃ€Đ”ĐŒĐžĐč ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€, яĐșĐžĐč ĐČĐžĐșĐŸĐœĐ°Ń” ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž ĐČ ĐŸĐŽĐœĐŸĐŒŃƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–, Đ·Đ°ĐżŃƒŃŃ‚ĐžĐČшО ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń, пДрДЎ запусĐșĐŸĐŒ рДпліĐșĐŸĐČĐ°ĐœĐžŃ… ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ-праціĐČĐœĐžĐșіĐČ. +ĐŻĐșŃ‰ĐŸ у ĐČас **ĐșŃ–Đ»ŃŒĐșа ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ**, Ń–ĐŒĐŸĐČŃ–Ń€ĐœĐŸ ĐșĐŸĐ¶Đ”Đœ запусĐșає **ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń** (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, у ĐșластДрі **Kubernetes**), Ń‚ĐŸĐŽŃ– ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž **ĐŸĐșŃ€Đ”ĐŒĐžĐč ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€**, яĐșĐžĐč ĐČĐžĐșĐŸĐœĐ°Ń” **ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž** ĐČ ĐŸĐŽĐœĐŸĐŒŃƒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–, Đ·Đ°ĐżŃƒŃŃ‚ĐžĐČшО ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń, **пДрДЎ** запусĐșĐŸĐŒ рДпліĐșĐŸĐČĐ°ĐœĐžŃ… ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ-праціĐČĐœĐžĐșіĐČ. /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа @@ -562,19 +562,19 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] /// -ĐŻĐșŃ‰ĐŸ у ĐČĐ°ŃˆĐŸĐŒŃƒ ĐČОпаЎĐșу ĐœĐ”ĐŒĐ°Ń” ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒĐž запусĐșато ці ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž ĐșŃ–Đ»ŃŒĐșа разіĐČ ĐżĐ°Ń€Đ°Đ»Đ”Đ»ŃŒĐœĐŸ (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, яĐșŃ‰ĐŸ ĐČĐž ĐœĐ” ĐČĐžĐșĐŸĐœŃƒŃ”Ń‚Đ” ĐŒŃ–ĐłŃ€Đ°Ń†Ń–Ń— базО ĐŽĐ°ĐœĐžŃ…, а лОшД пДрДĐČŃ–Ń€ŃŃ”Ń‚Đ”, чо база ĐČжД ĐłĐŸŃ‚ĐŸĐČа), Ń‚ĐŸĐŽŃ– ĐČĐž таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸŃŃ‚ĐŸ ĐżĐŸĐŒŃ–ŃŃ‚ĐžŃ‚Đž їх у ĐșĐŸĐ¶Đ”Đœ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ пДрДЎ запусĐșĐŸĐŒ ĐłĐŸĐ»ĐŸĐČĐœĐŸĐłĐŸ ĐżŃ€ĐŸŃ†Đ”ŃŃƒ. +ĐŻĐșŃ‰ĐŸ у ĐČĐ°ŃˆĐŸĐŒŃƒ ĐČОпаЎĐșу ĐœĐ”ĐŒĐ°Ń” ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒĐž запусĐșато ці ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž **ĐșŃ–Đ»ŃŒĐșа разіĐČ ĐżĐ°Ń€Đ°Đ»Đ”Đ»ŃŒĐœĐŸ** (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, яĐșŃ‰ĐŸ ĐČĐž ĐœĐ” ĐČĐžĐșĐŸĐœŃƒŃ”Ń‚Đ” ĐŒŃ–ĐłŃ€Đ°Ń†Ń–Ń— базО ĐŽĐ°ĐœĐžŃ…, а лОшД пДрДĐČŃ–Ń€ŃŃ”Ń‚Đ”, чо база ĐČжД ĐłĐŸŃ‚ĐŸĐČа), Ń‚ĐŸĐŽŃ– ĐČĐž таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸŃŃ‚ĐŸ ĐżĐŸĐŒŃ–ŃŃ‚ĐžŃ‚Đž їх у ĐșĐŸĐ¶Đ”Đœ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ пДрДЎ запусĐșĐŸĐŒ ĐłĐŸĐ»ĐŸĐČĐœĐŸĐłĐŸ ĐżŃ€ĐŸŃ†Đ”ŃŃƒ. ### ĐžĐŽĐžĐœ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ { #single-container } -ĐŻĐșŃ‰ĐŸ у ĐČас ĐżŃ€ĐŸŃŃ‚Đ” ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ Đ· ĐŸĐŽĐœĐžĐŒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ĐŸĐŒ, яĐșĐžĐč ĐżĐŸŃ‚Ń–ĐŒ запусĐșає ĐșŃ–Đ»ŃŒĐșа ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ-праціĐČĐœĐžĐșіĐČ (Đ°Đ±ĐŸ тДж лОшД ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń), Ń‚ĐŸĐŽŃ– ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸĐœĐ°Ń‚Đž ці ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž ĐČ Ń‚ĐŸĐŒŃƒ ж ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń– Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ пДрДЎ запусĐșĐŸĐŒ ĐżŃ€ĐŸŃ†Đ”ŃŃƒ Ń–Đ· Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐŸĐŒ. +ĐŻĐșŃ‰ĐŸ у ĐČас ĐżŃ€ĐŸŃŃ‚Đ” ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ Đ· **ĐŸĐŽĐœĐžĐŒ ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€ĐŸĐŒ**, яĐșĐžĐč ĐżĐŸŃ‚Ń–ĐŒ запусĐșає ĐșŃ–Đ»ŃŒĐșа **ĐżŃ€ĐŸŃ†Đ”ŃŃ–ĐČ-праціĐČĐœĐžĐșіĐČ** (Đ°Đ±ĐŸ тДж лОшД ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń), Ń‚ĐŸĐŽŃ– ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸĐœĐ°Ń‚Đž ці ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž ĐČ Ń‚ĐŸĐŒŃƒ ж ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń– Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ пДрДЎ запусĐșĐŸĐŒ ĐżŃ€ĐŸŃ†Đ”ŃŃƒ Ń–Đ· Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐŸĐŒ. ### Đ‘Đ°Đ·ĐŸĐČĐžĐč ĐŸĐ±Ń€Đ°Đ· Docker { #base-docker-image } ĐšĐŸĐ»ĐžŃŃŒ Ń–ŃĐœŃƒĐČаĐČ ĐŸŃ„Ń–Ń†Ń–ĐčĐœĐžĐč ĐŸĐ±Ń€Đ°Đ· Docker ĐŽĐ»Ń FastAPI: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker). АлД зараз ĐČŃ–Đœ застарілОĐč. ⛔ -Đ™ĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐČĐ°ĐŒ ĐœĐ” сліЎ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато цДĐč Đ±Đ°Đ·ĐŸĐČĐžĐč ĐŸĐ±Ń€Đ°Đ· Docker (Đ°Đ±ĐŸ Đ±ŃƒĐŽŃŒ-яĐșĐžĐč Ń–ĐœŃˆĐžĐč ĐżĐŸĐŽŃ–Đ±ĐœĐžĐč). +Đ™ĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐČĐ°ĐŒ **ĐœĐ”** сліЎ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато цДĐč Đ±Đ°Đ·ĐŸĐČĐžĐč ĐŸĐ±Ń€Đ°Đ· Docker (Đ°Đ±ĐŸ Đ±ŃƒĐŽŃŒ-яĐșĐžĐč Ń–ĐœŃˆĐžĐč ĐżĐŸĐŽŃ–Đ±ĐœĐžĐč). -ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” Kubernetes (Đ°Đ±ĐŸ Ń–ĐœŃˆŃ–) і ĐČжД ĐœĐ°Đ»Đ°ŃˆŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” рДпліĐșацію ĐœĐ° ріĐČĐœŃ– ĐșластДра Đ· ĐșŃ–Đ»ŃŒĐșĐŸĐŒĐ° ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž. ĐŁ таĐșох ĐČОпаЎĐșах ĐșращД зібратО ĐŸĐ±Ń€Đ°Đ· Đ· ĐœŃƒĐ»Ń, яĐș ĐŸĐżĐžŃĐ°ĐœĐŸ ĐČОщД: [ЗібратО Docker-ĐŸĐ±Ń€Đ°Đ· ĐŽĐ»Ń FastAPI](#build-a-docker-image-for-fastapi). +ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” **Kubernetes** (Đ°Đ±ĐŸ Ń–ĐœŃˆŃ–) і ĐČжД ĐœĐ°Đ»Đ°ŃˆŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” **рДпліĐșацію** ĐœĐ° ріĐČĐœŃ– ĐșластДра Đ· ĐșŃ–Đ»ŃŒĐșĐŸĐŒĐ° **ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ°ĐŒĐž**. ĐŁ таĐșох ĐČОпаЎĐșах ĐșращД **зібратО ĐŸĐ±Ń€Đ°Đ· Đ· ĐœŃƒĐ»Ń**, яĐș ĐŸĐżĐžŃĐ°ĐœĐŸ ĐČОщД: [ЗібратО Docker-ĐŸĐ±Ń€Đ°Đ· ĐŽĐ»Ń FastAPI](#build-a-docker-image-for-fastapi). А яĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐŒĐ°Ń‚Đž ĐșŃ–Đ»ŃŒĐșа праціĐČĐœĐžĐșіĐČ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸŃŃ‚ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐŸĐżŃ†Ń–ŃŽ ĐșĐŸĐŒĐ°ĐœĐŽĐœĐŸĐłĐŸ ряЮĐșа `--workers`. @@ -592,8 +592,8 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] НапроĐșлаЎ: -* З Docker Compose ĐœĐ° ĐŸĐŽĐœĐŸĐŒŃƒ сДрĐČДрі -* З ĐșĐ»Đ°ŃŃ‚Đ”Ń€ĐŸĐŒ Kubernetes +* З **Docker Compose** ĐœĐ° ĐŸĐŽĐœĐŸĐŒŃƒ сДрĐČДрі +* З ĐșĐ»Đ°ŃŃ‚Đ”Ń€ĐŸĐŒ **Kubernetes** * З ĐșĐ»Đ°ŃŃ‚Đ”Ń€ĐŸĐŒ Docker Swarm Mode * З Ń–ĐœŃˆĐžĐŒ Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚ĐŸĐŒ, яĐș-ĐŸŃ‚ Nomad * З Ń…ĐŒĐ°Ń€ĐœĐžĐŒ сДрĐČŃ–ŃĐŸĐŒ, яĐșĐžĐč бДрД ĐČаш ĐŸĐ±Ń€Đ°Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° і Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°Ń” ĐčĐŸĐłĐŸ @@ -604,7 +604,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] ## ĐŸŃ–ĐŽŃŃƒĐŒĐŸĐș { #recap } -ВоĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо ŃĐžŃŃ‚Đ”ĐŒĐž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Đ· Docker і Kubernetes), ĐŽĐŸŃĐžŃ‚ŃŒ ĐżŃ€ĐŸŃŃ‚ĐŸ ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ‚Đž ĐČсі ĐșĐŸĐœŃ†Đ”ĐżŃ†Ń–Ń— Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ: +ВоĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо ŃĐžŃŃ‚Đ”ĐŒĐž ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Ń–ĐČ (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Đ· **Docker** і **Kubernetes**), ĐŽĐŸŃĐžŃ‚ŃŒ ĐżŃ€ĐŸŃŃ‚ĐŸ ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ‚Đž ĐČсі **ĐșĐŸĐœŃ†Đ”ĐżŃ†Ń–Ń— Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ**: * HTTPS * АĐČŃ‚ĐŸĐ·Đ°ĐżŃƒŃĐș @@ -613,6 +613,6 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] * ĐŸĐ°ĐŒâ€™ŃŃ‚ŃŒ * ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐșŃ€ĐŸĐșĐž пДрДЎ запусĐșĐŸĐŒ -ĐŁ Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– ĐČОпаЎĐșіĐČ ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐœĐ” Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Đ±ŃƒĐŽŃŒ-яĐșĐžĐč Đ±Đ°Đ·ĐŸĐČĐžĐč ĐŸĐ±Ń€Đ°Đ·, а ĐœĐ°Ń‚ĐŸĐŒŃ–ŃŃ‚ŃŒ зібратО ĐŸĐ±Ń€Đ°Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° Đ· ĐœŃƒĐ»Ń ĐœĐ° ĐŸŃĐœĐŸĐČі ĐŸŃ„Ń–Ń†Ń–ĐčĐœĐŸĐłĐŸ ĐŸĐ±Ń€Đ°Đ·Ńƒ Python ĐŽĐ»Ń Docker. +ĐŁ Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– ĐČОпаЎĐșіĐČ ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐœĐ” Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Đ±ŃƒĐŽŃŒ-яĐșĐžĐč Đ±Đ°Đ·ĐŸĐČĐžĐč ĐŸĐ±Ń€Đ°Đ·, а ĐœĐ°Ń‚ĐŸĐŒŃ–ŃŃ‚ŃŒ **зібратО ĐŸĐ±Ń€Đ°Đ· ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° Đ· ĐœŃƒĐ»Ń** ĐœĐ° ĐŸŃĐœĐŸĐČі ĐŸŃ„Ń–Ń†Ń–ĐčĐœĐŸĐłĐŸ ĐŸĐ±Ń€Đ°Đ·Ńƒ Python ĐŽĐ»Ń Docker. -Đ”ĐŸŃ‚Ń€ĐžĐŒŃƒŃŽŃ‡ĐžŃŃŒ ĐżĐŸŃ€ŃĐŽĐșу Ń–ĐœŃŃ‚Ń€ŃƒĐșціĐč у `Dockerfile` і ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо ĐșДш Docker, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŒŃ–ĐœŃ–ĐŒŃ–Đ·ŃƒĐČато час збірĐșĐž, Ń‰ĐŸĐ± ĐŒĐ°ĐșŃĐžĐŒŃ–Đ·ŃƒĐČато сĐČĐŸŃŽ ĐżŃ€ĐŸĐŽŃƒĐșтоĐČĐœŃ–ŃŃ‚ŃŒ (і ŃƒĐœĐžĐșĐœŃƒŃ‚Đž ĐœŃƒĐŽŃŒĐłĐž). 😎 +Đ”ĐŸŃ‚Ń€ĐžĐŒŃƒŃŽŃ‡ĐžŃŃŒ **ĐżĐŸŃ€ŃĐŽĐșу** Ń–ĐœŃŃ‚Ń€ŃƒĐșціĐč у `Dockerfile` і ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо **ĐșДш Docker**, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” **ĐŒŃ–ĐœŃ–ĐŒŃ–Đ·ŃƒĐČато час збірĐșĐž**, Ń‰ĐŸĐ± ĐŒĐ°ĐșŃĐžĐŒŃ–Đ·ŃƒĐČато сĐČĐŸŃŽ ĐżŃ€ĐŸĐŽŃƒĐșтоĐČĐœŃ–ŃŃ‚ŃŒ (і ŃƒĐœĐžĐșĐœŃƒŃ‚Đž ĐœŃƒĐŽŃŒĐłĐž). 😎 diff --git a/docs/uk/docs/deployment/https.md b/docs/uk/docs/deployment/https.md index 439adf61e..fd5471470 100644 --- a/docs/uk/docs/deployment/https.md +++ b/docs/uk/docs/deployment/https.md @@ -14,8 +14,8 @@ йДпДр, Đ· **Ń‚ĐŸŃ‡ĐșĐž Đ·ĐŸŃ€Ńƒ Ń€ĐŸĐ·Ń€ĐŸĐ±ĐœĐžĐșа**, ĐŸŃŃŒ ĐșŃ–Đ»ŃŒĐșа рДчДĐč, яĐșі ĐČĐ°Ń€Ń‚ĐŸ ĐżĐ°ĐŒ'ятато, Ń€ĐŸĐ·ĐŒŃ–Ń€ĐșĐŸĐČуючо ĐżŃ€ĐŸ HTTPS: -* Đ”Đ»Ń HTTPS **сДрĐČДр** ĐŒĐ°Ń” **ĐŒĐ°Ń‚Đž «сДртОфіĐșатО»**, ĐČĐžĐŽĐ°ĐœŃ– **Ń‚Ń€Đ”Ń‚ŃŒĐŸŃŽ ŃŃ‚ĐŸŃ€ĐŸĐœĐŸŃŽ**. - * НаспраĐČЮі ці сДртОфіĐșато **Â«ĐŸŃ‚Ń€ĐžĐŒŃƒŃŽŃ‚ŃŒŃŃÂ»** у Ń‚Ń€Đ”Ń‚ŃŒĐŸŃ— ŃŃ‚ĐŸŃ€ĐŸĐœĐž, а ĐœĐ” **Â«ĐłĐ”ĐœĐ”Ń€ŃƒŃŽŃ‚ŃŒŃŃÂ»**. +* Đ”Đ»Ń HTTPS **сДрĐČДр** ĐŒĐ°Ń” **ĐŒĐ°Ń‚Đž «сДртОфіĐșатО»**, Đ·ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœŃ– **Ń‚Ń€Đ”Ń‚ŃŒĐŸŃŽ ŃŃ‚ĐŸŃ€ĐŸĐœĐŸŃŽ**. + * НаспраĐČЮі ці сДртОфіĐșато **Â«ĐŸŃ‚Ń€ĐžĐŒŃƒŃŽŃ‚ŃŒŃŃÂ»** у Ń‚Ń€Đ”Ń‚ŃŒĐŸŃ— ŃŃ‚ĐŸŃ€ĐŸĐœĐž, а ĐœĐ” **Â«Đ·ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœŃ–Â»**. * ХДртОфіĐșато ĐŒĐ°ŃŽŃ‚ŃŒ **ŃŃ‚Ń€ĐŸĐș Юії**. * Đ‡Ń…ĐœŃ–Đč ŃŃ‚Ń€ĐŸĐș Юії **сплОĐČає**. * І Ń‚ĐŸĐŽŃ– їх ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ **ĐżĐŸĐœĐŸĐČото**, **Đ·ĐœĐŸĐČу ĐŸŃ‚Ń€ĐžĐŒĐ°ĐČшО** у Ń‚Ń€Đ”Ń‚ŃŒĐŸŃ— ŃŃ‚ĐŸŃ€ĐŸĐœĐž. @@ -190,15 +190,15 @@ TLS Termination Proxy ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń” ŃƒĐ·ĐłĐŸĐŽĐ¶Đ”ĐœĐ” шофруĐČĐ°ĐœĐœ ĐŁĐČĐ”ŃŃŒ цДĐč ĐżŃ€ĐŸŃ†Đ”Ń ĐżĐŸĐœĐŸĐČĐ»Đ”ĐœĐœŃ, ĐżĐ°Ń€Đ°Đ»Đ”Đ»ŃŒĐœĐŸ Đ· ĐŸĐ±ŃĐ»ŃƒĐłĐŸĐČуĐČĐ°ĐœĐœŃĐŒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу, - ĐŸĐŽĐœĐ° Đ· ĐłĐŸĐ»ĐŸĐČĐœĐžŃ… ĐżŃ€ĐžŃ‡ĐžĐœ, Ń‡ĐŸĐŒŃƒ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°Ń…ĐŸŃ‚Ń–Ń‚Đž ĐŒĐ°Ń‚Đž **ĐŸĐșŃ€Đ”ĐŒŃƒ ŃĐžŃŃ‚Đ”ĐŒŃƒ ĐŽĐ»Ń ĐŸĐ±Ń€ĐŸĐ±ĐșĐž HTTPS** за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ TLS Termination Proxy Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ Ń‚ĐŸĐłĐŸ, Ń‰ĐŸĐ± ĐżŃ€ĐŸŃŃ‚ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато сДртОфіĐșато TLS Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Đ· сДрĐČĐ”Ń€ĐŸĐŒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Uvicorn). -## НапраĐČĐ»Đ”ĐœŃ– Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž ĐżŃ€ĐŸĐșсі { #proxy-forwarded-headers } +## НапраĐČĐ»Đ”ĐœŃ– Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž прДЎстаĐČĐœĐžĐșа { #proxy-forwarded-headers } -ĐšĐŸĐ»Đž ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ĐżŃ€ĐŸĐșсі ĐŽĐ»Ń ĐŸĐ±Ń€ĐŸĐ±ĐșĐž HTTPS, ĐČаш **сДрĐČДр Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу** (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Uvicorn чДрДз FastAPI CLI) ĐœŃ–Ń‡ĐŸĐłĐŸ ĐœĐ” Đ·ĐœĐ°Ń” ĐżŃ€ĐŸ ĐżŃ€ĐŸŃ†Đ”Ń HTTPS, ĐČŃ–Đœ спілĐșується Đ·ĐČочаĐčĐœĐžĐŒ HTTP Ń–Đ· **TLS Termination Proxy**. +ĐšĐŸĐ»Đž ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” прДЎстаĐČĐœĐžĐșа ĐŽĐ»Ń ĐŸĐ±Ń€ĐŸĐ±ĐșĐž HTTPS, ĐČаш **сДрĐČДр Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу** (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Uvicorn чДрДз FastAPI CLI) ĐœŃ–Ń‡ĐŸĐłĐŸ ĐœĐ” Đ·ĐœĐ°Ń” ĐżŃ€ĐŸ ĐżŃ€ĐŸŃ†Đ”Ń HTTPS, ĐČŃ–Đœ спілĐșується Đ·ĐČочаĐčĐœĐžĐŒ HTTP Ń–Đ· **TLS Termination Proxy**. -ĐŠĐ”Đč **ĐżŃ€ĐŸĐșсі** зазĐČочаĐč ĐŽĐžĐœĐ°ĐŒŃ–Ń‡ĐœĐŸ ĐČŃŃ‚Đ°ĐœĐŸĐČлює ĐŽĐ”ŃĐșі HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž пДрДЎ пДрДЎачДю Đ·Đ°ĐżĐžŃ‚Ńƒ **сДрĐČĐ”Ń€Ńƒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу**, Ń‰ĐŸĐ± Юато ĐčĐŸĐŒŃƒ Đ·ĐœĐ°Ń‚Đž, Ń‰ĐŸ запОт **ĐœĐ°ĐżŃ€Đ°ĐČĐ»ŃŃ”Ń‚ŃŒŃŃ** ĐżŃ€ĐŸĐșсі. +ĐŠĐ”Đč **прДЎстаĐČĐœĐžĐș** зазĐČочаĐč ĐŽĐžĐœĐ°ĐŒŃ–Ń‡ĐœĐŸ ĐČŃŃ‚Đ°ĐœĐŸĐČлює ĐŽĐ”ŃĐșі HTTP-Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž пДрДЎ пДрДЎачДю Đ·Đ°ĐżĐžŃ‚Ńƒ **сДрĐČĐ”Ń€Ńƒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу**, Ń‰ĐŸĐ± Юато ĐčĐŸĐŒŃƒ Đ·ĐœĐ°Ń‚Đž, Ń‰ĐŸ запОт **ĐœĐ°ĐżŃ€Đ°ĐČĐ»ŃŃ”Ń‚ŃŒŃŃ** прДЎстаĐČĐœĐžĐșĐŸĐŒ. /// note | ĐąĐ”Ń…ĐœŃ–Ń‡ĐœŃ– ЎДталі -Đ—Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž ĐżŃ€ĐŸĐșсі: +Đ—Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž прДЎстаĐČĐœĐžĐșа: * [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) * [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) @@ -206,11 +206,11 @@ TLS Termination Proxy ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń” ŃƒĐ·ĐłĐŸĐŽĐ¶Đ”ĐœĐ” шофруĐČĐ°ĐœĐœ /// -Đ’Ń‚Ń–ĐŒ, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž **сДрĐČДр Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу** ĐœĐ” Đ·ĐœĐ°Ń”, Ń‰ĐŸ ĐČŃ–Đœ ŃŃ‚ĐŸŃ—Ń‚ŃŒ за ĐŽĐŸĐČŃ–Ń€Đ”ĐœĐžĐŒ **ĐżŃ€ĐŸĐșсі**, за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ ĐČŃ–Đœ ĐœĐ” ĐŽĐŸĐČŃ–Ń€ŃŃ‚ĐžĐŒĐ” Ń†ĐžĐŒ Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐ°ĐŒ. +Đ’Ń‚Ń–ĐŒ, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž **сДрĐČДр Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу** ĐœĐ” Đ·ĐœĐ°Ń”, Ń‰ĐŸ ĐČŃ–Đœ ŃŃ‚ĐŸŃ—Ń‚ŃŒ за ĐŽĐŸĐČŃ–Ń€Đ”ĐœĐžĐŒ **прДЎстаĐČĐœĐžĐșĐŸĐŒ**, за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ ĐČŃ–Đœ ĐœĐ” ĐŽĐŸĐČŃ–Ń€ŃŃ‚ĐžĐŒĐ” Ń†ĐžĐŒ Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐ°ĐŒ. -АлД ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČато **сДрĐČДр Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу**, Ń‰ĐŸĐ± ĐŽĐŸĐČірято ĐœĐ°ĐżŃ€Đ°ĐČĐ»Đ”ĐœĐžĐŒ Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐ°ĐŒ, ĐœĐ°ĐŽŃ–ŃĐ»Đ°ĐœĐžĐŒ **ĐżŃ€ĐŸĐșсі**. ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” FastAPI CLI, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” сĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚ĐžŃŃ ĐșурсоĐČĐœĐŸŃŽ *ĐŸĐżŃ†Ń–Ń”ŃŽ CLI* `--forwarded-allow-ips`, Ń‰ĐŸĐ± ĐżĐŸĐČŃ–ĐŽĐŸĐŒĐžŃ‚Đž, Đ· яĐșох IP-аЎрДс сліЎ ĐŽĐŸĐČірято Ń†ĐžĐŒ ĐœĐ°ĐżŃ€Đ°ĐČĐ»Đ”ĐœĐžĐŒ Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐ°ĐŒ. +АлД ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČато **сДрĐČДр Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу**, Ń‰ĐŸĐ± ĐŽĐŸĐČірято *ĐœĐ°ĐżŃ€Đ°ĐČĐ»Đ”ĐœĐžĐŒ* Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐ°ĐŒ, ĐœĐ°ĐŽŃ–ŃĐ»Đ°ĐœĐžĐŒ **прДЎстаĐČĐœĐžĐșĐŸĐŒ**. ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” FastAPI CLI, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” сĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚ĐžŃŃ *ĐŸĐżŃ†Ń–Ń”ŃŽ CLI* `--forwarded-allow-ips`, Ń‰ĐŸĐ± ĐżĐŸĐČŃ–ĐŽĐŸĐŒĐžŃ‚Đž, Đ· яĐșох IP-аЎрДс сліЎ ĐŽĐŸĐČірято Ń†ĐžĐŒ *ĐœĐ°ĐżŃ€Đ°ĐČĐ»Đ”ĐœĐžĐŒ* Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐ°ĐŒ. -НапроĐșлаЎ, яĐșŃ‰ĐŸ **сДрĐČДр Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу** ĐŸŃ‚Ń€ĐžĐŒŃƒŃ” ĐșĐŸĐŒŃƒĐœŃ–Đșацію лОшД ĐČіЮ ĐŽĐŸĐČŃ–Ń€Đ”ĐœĐŸĐłĐŸ **ĐżŃ€ĐŸĐșсі**, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČŃŃ‚Đ°ĐœĐŸĐČото `--forwarded-allow-ips="*"`, Ń‰ĐŸĐ± ĐŽĐŸĐČірято ĐČŃŃ–ĐŒ ĐČŃ…Ń–ĐŽĐœĐžĐŒ IP-Đ°ĐŽŃ€Đ”ŃĐ°ĐŒ, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐČŃ–Đœ ĐŸŃ‚Ń€ĐžĐŒŃƒĐČĐ°Ń‚ĐžĐŒĐ” запОтО лОшД Đ· тієї IP-аЎрДсО, яĐșу ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČує **ĐżŃ€ĐŸĐșсі**. +НапроĐșлаЎ, яĐșŃ‰ĐŸ **сДрĐČДр Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу** ĐŸŃ‚Ń€ĐžĐŒŃƒŃ” ĐșĐŸĐŒŃƒĐœŃ–Đșацію лОшД ĐČіЮ ĐŽĐŸĐČŃ–Ń€Đ”ĐœĐŸĐłĐŸ **прДЎстаĐČĐœĐžĐșа**, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČŃŃ‚Đ°ĐœĐŸĐČото `--forwarded-allow-ips="*"`, Ń‰ĐŸĐ± ĐŽĐŸĐČірято ĐČŃŃ–ĐŒ ĐČŃ…Ń–ĐŽĐœĐžĐŒ IP-Đ°ĐŽŃ€Đ”ŃĐ°ĐŒ, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐČŃ–Đœ ĐŸŃ‚Ń€ĐžĐŒŃƒĐČĐ°Ń‚ĐžĐŒĐ” запОтО лОшД Đ· тієї IP-аЎрДсО, яĐșу ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČує **прДЎстаĐČĐœĐžĐș**. йаĐș Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș Đ·ĐŒĐŸĐ¶Đ” Đ·ĐœĐ°Ń‚Đž сĐČĐŸŃŽ ĐżŃƒĐ±Đ»Ń–Ń‡ĐœŃƒ URL-Đ°ĐŽŃ€Đ”ŃŃƒ, чо ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČує ĐČŃ–Đœ HTTPS, ĐŽĐŸĐŒĐ”Đœ Ń‚ĐŸŃ‰ĐŸ. @@ -218,7 +218,7 @@ TLS Termination Proxy ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń” ŃƒĐ·ĐłĐŸĐŽĐ¶Đ”ĐœĐ” шофруĐČĐ°ĐœĐœ /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽŃ–Đ·ĐœĐ°Ń‚ĐžŃŃ Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ цД ĐČ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— [За ĐżŃ€ĐŸĐșсі - ĐŁĐČŃ–ĐŒĐșĐœŃƒŃ‚Đž ĐœĐ°ĐżŃ€Đ°ĐČĐ»Đ”ĐœŃ– Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž ĐżŃ€ĐŸĐșсі](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽŃ–Đ·ĐœĐ°Ń‚ĐžŃŃ Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ цД ĐČ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— [За прДЎстаĐČĐœĐžĐșĐŸĐŒ - ĐŁĐČŃ–ĐŒĐșĐœŃƒŃ‚Đž ĐœĐ°ĐżŃ€Đ°ĐČĐ»Đ”ĐœŃ– Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž прДЎстаĐČĐœĐžĐșа](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) /// diff --git a/docs/uk/docs/deployment/manually.md b/docs/uk/docs/deployment/manually.md index 9a6507403..6692efd56 100644 --- a/docs/uk/docs/deployment/manually.md +++ b/docs/uk/docs/deployment/manually.md @@ -40,7 +40,7 @@ $ fastapi run @@ -142,7 +142,7 @@ Uvicorn та Ń–ĐœŃˆŃ– сДрĐČДрО ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃŽŃ‚ŃŒ ĐŸĐżŃ†Ń–ŃŽ `--reload ## ĐšĐŸĐœŃ†Đ”ĐżŃ†Ń–Ń— Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ { #deployment-concepts } -Щі проĐșлаЎО запусĐșають сДрĐČĐ”Ń€ĐœŃƒ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Uvicorn), ĐżŃ–ĐŽĐœŃ–ĐŒĐ°ŃŽŃ‡Đž ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń, Ń‰ĐŸ ŃĐ»ŃƒŃ…Đ°Ń” ĐČсі IP (`0.0.0.0`) ĐœĐ° ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐŸĐŒŃƒ ĐżĐŸŃ€Ń‚Ńƒ (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, `80`). +Щі проĐșлаЎО запусĐșають сДрĐČĐ”Ń€ĐœŃƒ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Uvicorn), ĐżŃ–ĐŽĐœŃ–ĐŒĐ°ŃŽŃ‡Đž **ĐŸĐŽĐžĐœ ĐżŃ€ĐŸŃ†Đ”Ń**, Ń‰ĐŸ ŃĐ»ŃƒŃ…Đ°Ń” ĐČсі IP (`0.0.0.0`) ĐœĐ° ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐŸĐŒŃƒ ĐżĐŸŃ€Ń‚Ńƒ (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, `80`). ĐŠĐ” Đ±Đ°Đ·ĐŸĐČа Ń–ĐŽĐ”Ń. АлД, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐČĐ°ĐŒ Đ·ĐœĐ°ĐŽĐŸĐ±ĐžŃ‚ŃŒŃŃ ĐżĐŸĐŽĐ±Đ°Ń‚Đž щД ĐżŃ€ĐŸ таĐșĐ”: diff --git a/docs/uk/docs/editor-support.md b/docs/uk/docs/editor-support.md index f0edf6297..cc4c2ccb7 100644 --- a/docs/uk/docs/editor-support.md +++ b/docs/uk/docs/editor-support.md @@ -1,5 +1,6 @@ # ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа рДЎаĐșŃ‚ĐŸŃ€Ń–ĐČ { #editor-support } + ОфіціĐčĐœĐ” [FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) ĐżĐŸĐșращує ĐČаш Ń€ĐŸĐ±ĐŸŃ‡ĐžĐč ĐżŃ€ĐŸŃ†Đ”Ń Ń€ĐŸĐ·Ń€ĐŸĐ±ĐșĐž FastAPI заĐČЮяĐșĐž ĐČояĐČĐ»Đ”ĐœĐœŃŽ Đč ĐœĐ°ĐČігації ĐżĐŸ *ĐŸĐżĐ”Ń€Đ°Ń†Ń–ŃŃ… ŃˆĐ»ŃŃ…Ńƒ*, а таĐșĐŸĐ¶ Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃŽ у FastAPI Cloud і ĐżĐŸŃ‚ĐŸĐșĐŸĐČĐŸĐŒŃƒ пДрДЎаĐČĐ°ĐœĐœŃŽ Đ¶ŃƒŃ€ĐœĐ°Đ»Ń–ĐČ Ńƒ Ń€Đ”Đ°Đ»ŃŒĐœĐŸĐŒŃƒ часі. Đ”ĐŸĐșĐ»Đ°ĐŽĐœŃ–ŃˆĐ” ĐżŃ€ĐŸ Ń€ĐŸĐ·ŃˆĐžŃ€Đ”ĐœĐœŃ ĐŽĐžĐČіться у README ĐČ [Ń€Đ”ĐżĐŸĐ·ĐžŃ‚ĐŸŃ€Ń–Ń— GitHub](https://github.com/fastapi/fastapi-vscode). diff --git a/docs/uk/docs/environment-variables.md b/docs/uk/docs/environment-variables.md index 7b5223bc2..95c142c7c 100644 --- a/docs/uk/docs/environment-variables.md +++ b/docs/uk/docs/environment-variables.md @@ -6,13 +6,13 @@ /// -Đ—ĐŒŃ–ĐœĐœĐ° ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ (таĐșĐŸĐ¶ ĐČŃ–ĐŽĐŸĐŒĐ° яĐș «env var») - цД Đ·ĐŒŃ–ĐœĐœĐ°, Ń‰ĐŸ Ń–ŃĐœŃƒŃ” ĐżĐŸĐ·Đ° ĐșĐŸĐŽĐŸĐŒ Python, ĐČ ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœŃ–Đč ŃĐžŃŃ‚Đ”ĐŒŃ–, і ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°ĐœĐ° ĐČĐ°ŃˆĐžĐŒ ĐșĐŸĐŽĐŸĐŒ Python (а таĐșĐŸĐ¶ Ń–ĐœŃˆĐžĐŒĐž ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ°ĐŒĐž). +Đ—ĐŒŃ–ĐœĐœĐ° ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ (таĐșĐŸĐ¶ ĐČŃ–ĐŽĐŸĐŒĐ° яĐș «**env var**») - цД Đ·ĐŒŃ–ĐœĐœĐ°, Ń‰ĐŸ Ń–ŃĐœŃƒŃ” **ĐżĐŸĐ·Đ°** ĐșĐŸĐŽĐŸĐŒ Python, ĐČ **ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœŃ–Đč ŃĐžŃŃ‚Đ”ĐŒŃ–**, і ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°ĐœĐ° ĐČĐ°ŃˆĐžĐŒ ĐșĐŸĐŽĐŸĐŒ Python (а таĐșĐŸĐ¶ Ń–ĐœŃˆĐžĐŒĐž ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ°ĐŒĐž). -Đ—ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ ĐșĐŸŃ€ĐžŃĐœŃ– ĐŽĐ»Ń Ń€ĐŸĐ±ĐŸŃ‚Đž Đ· ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃĐŒĐž Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу, яĐș Ń‡Đ°ŃŃ‚ĐžĐœĐ° ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ Python Ń‚ĐŸŃ‰ĐŸ. +Đ—ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ ĐșĐŸŃ€ĐžŃĐœŃ– ĐŽĐ»Ń Ń€ĐŸĐ±ĐŸŃ‚Đž Đ· **ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃĐŒĐž** Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу, яĐș Ń‡Đ°ŃŃ‚ĐžĐœĐ° **ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ** Python Ń‚ĐŸŃ‰ĐŸ. ## СтĐČĐŸŃ€Đ”ĐœĐœŃ і ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Đ·ĐŒŃ–ĐœĐœĐžŃ… ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ { #create-and-use-env-vars } -Во ĐŒĐŸĐ¶Đ”Ń‚Đ” стĐČĐŸŃ€ŃŽĐČато і ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ ĐČ ĐŸĐ±ĐŸĐ»ĐŸĐœŃ†Ń– (Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Đ»Ń–) бДз участі Python: +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” **стĐČĐŸŃ€ŃŽĐČато** і ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ ĐČ **ĐŸĐ±ĐŸĐ»ĐŸĐœŃ†Ń– (Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Đ»Ń–)** бДз участі Python: //// tab | Linux, macOS, Windows Bash @@ -52,7 +52,7 @@ Hello Wade Wilson ## Đ§ĐžŃ‚Đ°ĐœĐœŃ Đ·ĐŒŃ–ĐœĐœĐžŃ… ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ ĐČ Python { #read-env-vars-in-python } -Во таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” стĐČĐŸŃ€ĐžŃ‚Đž Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ ĐżĐŸĐ·Đ° Python, у Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Đ»Ń– (Đ°Đ±ĐŸ Đ±ŃƒĐŽŃŒ-яĐșĐžĐŒ Ń–ĐœŃˆĐžĐŒ ŃĐżĐŸŃĐŸĐ±ĐŸĐŒ), а ĐżĐŸŃ‚Ń–ĐŒ зчОтатО їх у Python. +Во таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” стĐČĐŸŃ€ĐžŃ‚Đž Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ **ĐżĐŸĐ·Đ°** Python, у Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Đ»Ń– (Đ°Đ±ĐŸ Đ±ŃƒĐŽŃŒ-яĐșĐžĐŒ Ń–ĐœŃˆĐžĐŒ ŃĐżĐŸŃĐŸĐ±ĐŸĐŒ), а ĐżĐŸŃ‚Ń–ĐŒ **зчОтатО їх у Python**. НапроĐșлаЎ, у ĐČас ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž фаĐčĐ» `main.py` Đ·: @@ -127,9 +127,9 @@ Hello Wade Wilson from Python //// -ОсĐșŃ–Đ»ŃŒĐșĐž Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ ĐŒĐŸĐ¶ĐœĐ° ĐČŃŃ‚Đ°ĐœĐŸĐČлюĐČато ĐżĐŸĐ·Đ° ĐșĐŸĐŽĐŸĐŒ, алД чотато ĐČ ĐșĐŸĐŽŃ–, і їх ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ збДрігатО (фіĐșсуĐČато у `git`) Ń€Đ°Đ·ĐŸĐŒ Đ· Ń–ĐœŃˆĐžĐŒĐž фаĐčĐ»Đ°ĐŒĐž, їх Ń‡Đ°ŃŃ‚ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують ĐŽĐ»Ń ĐșĐŸĐœŃ„Ń–ĐłŃƒŃ€Đ°Ń†Ń–Đč Đ°Đ±ĐŸ ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœŃŒ. +ОсĐșŃ–Đ»ŃŒĐșĐž Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ ĐŒĐŸĐ¶ĐœĐ° ĐČŃŃ‚Đ°ĐœĐŸĐČлюĐČато ĐżĐŸĐ·Đ° ĐșĐŸĐŽĐŸĐŒ, алД чотато ĐČ ĐșĐŸĐŽŃ–, і їх ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ збДрігатО (фіĐșсуĐČато у `git`) Ń€Đ°Đ·ĐŸĐŒ Đ· Ń–ĐœŃˆĐžĐŒĐž фаĐčĐ»Đ°ĐŒĐž, їх Ń‡Đ°ŃŃ‚ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують ĐŽĐ»Ń ĐșĐŸĐœŃ„Ń–ĐłŃƒŃ€Đ°Ń†Ń–Đč Đ°Đ±ĐŸ **ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœŃŒ**. -Во таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” стĐČĐŸŃ€ĐžŃ‚Đž Đ·ĐŒŃ–ĐœĐœŃƒ ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ лОшД ĐŽĐ»Ń ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐŸĐłĐŸ запусĐșу ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž, ĐČĐŸĐœĐ° буЎД ĐŽĐŸŃŃ‚ŃƒĐżĐœĐ° Ń‚Ń–Đ»ŃŒĐșĐž ціĐč ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃ– і лОшД ĐœĐ° час її ĐČĐžĐșĐŸĐœĐ°ĐœĐœŃ. +Во таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” стĐČĐŸŃ€ĐžŃ‚Đž Đ·ĐŒŃ–ĐœĐœŃƒ ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ лОшД ĐŽĐ»Ń **ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐŸĐłĐŸ запусĐșу ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž**, ĐČĐŸĐœĐ° буЎД ĐŽĐŸŃŃ‚ŃƒĐżĐœĐ° Ń‚Ń–Đ»ŃŒĐșĐž ціĐč ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃ– і лОшД ĐœĐ° час її ĐČĐžĐșĐŸĐœĐ°ĐœĐœŃ. Đ©ĐŸĐ± Đ·Ń€ĐŸĐ±ĐžŃ‚Đž цД, стĐČĐŸŃ€Ń–Ń‚ŃŒ її Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ пДрДЎ ĐșĐŸĐŒĐ°ĐœĐŽĐŸŃŽ запусĐșу ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž, ĐČ Ń‚ĐŸĐŒŃƒ ŃĐ°ĐŒĐŸĐŒŃƒ ряЮĐșу: @@ -159,15 +159,15 @@ Hello World from Python ## йОпО і пДрДĐČірĐșа { #types-and-validation } -Щі Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ ĐŒŃ–ŃŃ‚ĐžŃ‚Đž лОшД тДĐșŃŃ‚ĐŸĐČі ŃŃ‚Ń€ĐŸĐșĐž, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐČĐŸĐœĐž Đ·ĐŸĐČĐœŃ–ŃˆĐœŃ– Ń‰ĐŸĐŽĐŸ Python і ĐŒĐ°ŃŽŃ‚ŃŒ Đ±ŃƒŃ‚Đž ŃŃƒĐŒŃ–ŃĐœĐžĐŒĐž Đ· Ń–ĐœŃˆĐžĐŒĐž ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ°ĐŒĐž та Ń€Đ”ŃˆŃ‚ĐŸŃŽ ŃĐžŃŃ‚Đ”ĐŒĐž (і ĐœĐ°ĐČіть Đ· Ń€Ń–Đ·ĐœĐžĐŒĐž ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœĐžĐŒĐž ŃĐžŃŃ‚Đ”ĐŒĐ°ĐŒĐž, яĐș-ĐŸŃ‚ Linux, Windows, macOS). +Щі Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ ĐŒŃ–ŃŃ‚ĐžŃ‚Đž лОшД **тДĐșŃŃ‚ĐŸĐČі ŃŃ‚Ń€ĐŸĐșĐž**, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐČĐŸĐœĐž Đ·ĐŸĐČĐœŃ–ŃˆĐœŃ– Ń‰ĐŸĐŽĐŸ Python і ĐŒĐ°ŃŽŃ‚ŃŒ Đ±ŃƒŃ‚Đž ŃŃƒĐŒŃ–ŃĐœĐžĐŒĐž Đ· Ń–ĐœŃˆĐžĐŒĐž ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ°ĐŒĐž та Ń€Đ”ŃˆŃ‚ĐŸŃŽ ŃĐžŃŃ‚Đ”ĐŒĐž (і ĐœĐ°ĐČіть Đ· Ń€Ń–Đ·ĐœĐžĐŒĐž ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœĐžĐŒĐž ŃĐžŃŃ‚Đ”ĐŒĐ°ĐŒĐž, яĐș-ĐŸŃ‚ Linux, Windows, macOS). -ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ Đ±ŃƒĐŽŃŒ-яĐșĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ, ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°ĐœĐ” ĐČ Python Đ·Ń– Đ·ĐŒŃ–ĐœĐœĐŸŃ— ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ, буЎД `str`, а Đ±ŃƒĐŽŃŒ-яĐșĐ” пДрДтĐČĐŸŃ€Đ”ĐœĐœŃ ĐŽĐŸ Ń–ĐœŃˆĐŸĐłĐŸ топу Đ°Đ±ĐŸ Đ±ŃƒĐŽŃŒ-яĐșа пДрДĐČірĐșа ĐŒĐ°Ń” ĐČĐžĐșĐŸĐœŃƒĐČатося ĐČ ĐșĐŸĐŽŃ–. +ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ **Đ±ŃƒĐŽŃŒ-яĐșĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ**, ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°ĐœĐ” ĐČ Python Đ·Ń– Đ·ĐŒŃ–ĐœĐœĐŸŃ— ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ, **буЎД `str`**, а Đ±ŃƒĐŽŃŒ-яĐșĐ” пДрДтĐČĐŸŃ€Đ”ĐœĐœŃ ĐŽĐŸ Ń–ĐœŃˆĐŸĐłĐŸ топу Đ°Đ±ĐŸ Đ±ŃƒĐŽŃŒ-яĐșа пДрДĐČірĐșа ĐŒĐ°Ń” ĐČĐžĐșĐŸĐœŃƒĐČатося ĐČ ĐșĐŸĐŽŃ–. -Во ĐŽŃ–Đ·ĐœĐ°Ń”Ń‚Đ”ŃŃ Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Đ·ĐŒŃ–ĐœĐœĐžŃ… ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ ĐŽĐ»Ń Ń€ĐŸĐ±ĐŸŃ‚Đž Đ· ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃĐŒĐž Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу ĐČ Ń€ĐŸĐ·ĐŽŃ–Đ»Ń– [ĐŸŃ€ĐŸŃŃƒĐœŃƒŃ‚ĐžĐč ĐżĐŸŃŃ–Đ±ĐœĐžĐș ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача - ĐĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ і Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ](./advanced/settings.md). +Во ĐŽŃ–Đ·ĐœĐ°Ń”Ń‚Đ”ŃŃ Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Đ·ĐŒŃ–ĐœĐœĐžŃ… ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ ĐŽĐ»Ń Ń€ĐŸĐ±ĐŸŃ‚Đž Đ· **ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃĐŒĐž Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу** ĐČ Ń€ĐŸĐ·ĐŽŃ–Đ»Ń– [ĐŸŃ€ĐŸŃŃƒĐœŃƒŃ‚ĐžĐč ĐżĐŸŃŃ–Đ±ĐœĐžĐș ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача - ĐĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ і Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ](./advanced/settings.md). ## Đ—ĐŒŃ–ĐœĐœĐ° ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ `PATH` { #path-environment-variable } -Є ŃĐżĐ”Ń†Ń–Đ°Đ»ŃŒĐœĐ° Đ·ĐŒŃ–ĐœĐœĐ° ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ `PATH`, яĐșу ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœŃ– ŃĐžŃŃ‚Đ”ĐŒĐž (Linux, macOS, Windows) ĐŽĐ»Ń ĐżĐŸŃˆŃƒĐșу ĐżŃ€ĐŸĐłŃ€Đ°ĐŒ ĐŽĐ»Ń запусĐșу. +Є **ŃĐżĐ”Ń†Ń–Đ°Đ»ŃŒĐœĐ°** Đ·ĐŒŃ–ĐœĐœĐ° ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ **`PATH`**, яĐșу ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœŃ– ŃĐžŃŃ‚Đ”ĐŒĐž (Linux, macOS, Windows) ĐŽĐ»Ń ĐżĐŸŃˆŃƒĐșу ĐżŃ€ĐŸĐłŃ€Đ°ĐŒ ĐŽĐ»Ń запусĐșу. Đ—ĐœĐ°Ń‡Đ”ĐœĐœŃ Đ·ĐŒŃ–ĐœĐœĐŸŃ— `PATH` - цД ĐŽĐŸĐČга ŃŃ‚Ń€ĐŸĐșа, Ń‰ĐŸ сĐșĐ»Đ°ĐŽĐ°Ń”Ń‚ŃŒŃŃ Đ· ĐșĐ°Ń‚Đ°Đ»ĐŸĐłŃ–ĐČ, Ń€ĐŸĐ·ĐŽŃ–Đ»Đ”ĐœĐžŃ… ĐŽĐČĐŸĐșрапĐșĐŸŃŽ `:` у Linux і macOS та ĐșрапĐșĐŸŃŽ Đ· ĐșĐŸĐŒĐŸŃŽ `;` у Windows. @@ -203,11 +203,11 @@ C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System3 //// -ĐšĐŸĐ»Đž ĐČĐž ĐČĐČĐŸĐŽĐžŃ‚Đ” ĐșĐŸĐŒĐ°ĐœĐŽŃƒ ĐČ Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Đ»Ń–, ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœĐ° ŃĐžŃŃ‚Đ”ĐŒĐ° шуĐșає ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ ĐČ ĐșĐŸĐ¶ĐœĐŸĐŒŃƒ Đ· тох ĐșĐ°Ń‚Đ°Đ»ĐŸĐłŃ–ĐČ, ĐżĐ”Ń€Đ”Đ»Ń–Ń‡Đ”ĐœĐžŃ… у Đ·ĐŒŃ–ĐœĐœŃ–Đč ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ `PATH`. +ĐšĐŸĐ»Đž ĐČĐž ĐČĐČĐŸĐŽĐžŃ‚Đ” **ĐșĐŸĐŒĐ°ĐœĐŽŃƒ** ĐČ Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Đ»Ń–, ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœĐ° ŃĐžŃŃ‚Đ”ĐŒĐ° **шуĐșає** ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ ĐČ **ĐșĐŸĐ¶ĐœĐŸĐŒŃƒ Đ· тох ĐșĐ°Ń‚Đ°Đ»ĐŸĐłŃ–ĐČ**, ĐżĐ”Ń€Đ”Đ»Ń–Ń‡Đ”ĐœĐžŃ… у Đ·ĐŒŃ–ĐœĐœŃ–Đč ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ `PATH`. -НапроĐșлаЎ, ĐșĐŸĐ»Đž ĐČĐž ĐČĐČĐŸĐŽĐžŃ‚Đ” `python` у Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Đ»Ń–, ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœĐ° ŃĐžŃŃ‚Đ”ĐŒĐ° шуĐșає ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ Đ· ĐœĐ°Đ·ĐČĐŸŃŽ `python` у ĐżĐ”Ń€ŃˆĐŸĐŒŃƒ ĐșĐ°Ń‚Đ°Đ»ĐŸĐ·Ń– Ń†ŃŒĐŸĐłĐŸ спОсĐșу. +НапроĐșлаЎ, ĐșĐŸĐ»Đž ĐČĐž ĐČĐČĐŸĐŽĐžŃ‚Đ” `python` у Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Đ»Ń–, ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœĐ° ŃĐžŃŃ‚Đ”ĐŒĐ° шуĐșає ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ Đ· ĐœĐ°Đ·ĐČĐŸŃŽ `python` у **ĐżĐ”Ń€ŃˆĐŸĐŒŃƒ ĐșĐ°Ń‚Đ°Đ»ĐŸĐ·Ń–** Ń†ŃŒĐŸĐłĐŸ спОсĐșу. -ĐŻĐșŃ‰ĐŸ Đ·ĐœĐ°ĐčĐŽĐ”, ĐČĐŸĐœĐ° ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń” її. Đ†ĐœĐ°ĐșшД ĐżŃ€ĐŸĐŽĐŸĐČĐ¶ĐžŃ‚ŃŒ ĐżĐŸŃˆŃƒĐș ĐČ Ń–ĐœŃˆĐžŃ… ĐșĐ°Ń‚Đ°Đ»ĐŸĐłĐ°Ń…. +ĐŻĐșŃ‰ĐŸ Đ·ĐœĐ°ĐčĐŽĐ”, ĐČĐŸĐœĐ° **ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń” її**. Đ†ĐœĐ°ĐșшД ĐżŃ€ĐŸĐŽĐŸĐČĐ¶ĐžŃ‚ŃŒ ĐżĐŸŃˆŃƒĐș ĐČ **Ń–ĐœŃˆĐžŃ… ĐșĐ°Ń‚Đ°Đ»ĐŸĐłĐ°Ń…**. ### Đ’ŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ Python і ĐŸĐœĐŸĐČĐ»Đ”ĐœĐœŃ `PATH` { #installing-python-and-updating-the-path } @@ -255,7 +255,7 @@ $ python //// tab | Linux, macOS -ĐĄĐžŃŃ‚Đ”ĐŒĐ° Đ·ĐœĐ°ĐčĐŽĐ” ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ `python` у `/opt/custompython/bin` і Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚ŃŒ її. +ĐĄĐžŃŃ‚Đ”ĐŒĐ° **Đ·ĐœĐ°ĐčĐŽĐ”** ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ `python` у `/opt/custompython/bin` і Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚ŃŒ її. ĐŠĐ” ĐżŃ€ĐžĐ±Đ»ĐžĐ·ĐœĐŸ Đ”ĐșĐČіĐČĐ°Đ»Đ”ĐœŃ‚ĐœĐŸ ĐČĐČĐ”ĐŽĐ”ĐœĐœŃŽ: @@ -271,7 +271,7 @@ $ /opt/custompython/bin/python //// tab | Windows -ĐĄĐžŃŃ‚Đ”ĐŒĐ° Đ·ĐœĐ°ĐčĐŽĐ” ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ `python` у `C:\opt\custompython\bin\python` і Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚ŃŒ її. +ĐĄĐžŃŃ‚Đ”ĐŒĐ° **Đ·ĐœĐ°ĐčĐŽĐ”** ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ `python` у `C:\opt\custompython\bin\python` і Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚ŃŒ її. ĐŠĐ” ĐżŃ€ĐžĐ±Đ»ĐžĐ·ĐœĐŸ Đ”ĐșĐČіĐČĐ°Đ»Đ”ĐœŃ‚ĐœĐŸ ĐČĐČĐ”ĐŽĐ”ĐœĐœŃŽ: @@ -289,7 +289,7 @@ $ C:\opt\custompython\bin\python ## Đ’ĐžŃĐœĐŸĐČĐŸĐș { #conclusion } -йДпДр ĐČĐž ĐŒĐ°Ń”Ń‚Đ” Đ±Đ°Đ·ĐŸĐČĐ” Ń€ĐŸĐ·ŃƒĐŒŃ–ĐœĐœŃ Ń‚ĐŸĐłĐŸ, Ń‰ĐŸ таĐșĐ” Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ і яĐș їх ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐČ Python. +йДпДр ĐČĐž ĐŒĐ°Ń”Ń‚Đ” Đ±Đ°Đ·ĐŸĐČĐ” Ń€ĐŸĐ·ŃƒĐŒŃ–ĐœĐœŃ Ń‚ĐŸĐłĐŸ, Ń‰ĐŸ таĐșĐ” **Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ** і яĐș їх ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐČ Python. йаĐșĐŸĐ¶ ĐŒĐŸĐ¶ĐœĐ° ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Ń‚Đž Đ±Ń–Đ»ŃŒŃˆĐ” у [ВіĐșіпДЎії ĐżŃ€ĐŸ Đ·ĐŒŃ–ĐœĐœŃƒ ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ](https://en.wikipedia.org/wiki/Environment_variable). diff --git a/docs/uk/docs/features.md b/docs/uk/docs/features.md index 2ee24181f..3f8b0049b 100644 --- a/docs/uk/docs/features.md +++ b/docs/uk/docs/features.md @@ -6,8 +6,8 @@ ### На ĐŸŃĐœĐŸĐČі ĐČіЮĐșротох ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Ń–ĐČ { #based-on-open-standards } -* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) ĐŽĐ»Ń стĐČĐŸŃ€Đ”ĐœĐœŃ API, ĐČĐșлючаючО ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐœŃ ŃˆĐ»ŃŃ…Ń–ĐČ ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč, ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ, тіл запОтіĐČ, бДзпДĐșĐž Ń‚ĐŸŃ‰ĐŸ. -* АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐ° ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń ĐŒĐŸĐŽĐ”Đ»Đ”Đč ĐŽĐ°ĐœĐžŃ… за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ [**JSON Schema**](https://json-schema.org/) (ĐŸŃĐșŃ–Đ»ŃŒĐșĐž OpenAPI Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ŃĐ°ĐŒĐ” ĐœĐ° JSON Schema). +* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) ĐŽĐ»Ń стĐČĐŸŃ€Đ”ĐœĐœŃ API, ĐČĐșлючаючО ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐœŃ ŃˆĐ»ŃŃ…ĐŸĐČох ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč, ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ, тіл запОтіĐČ, бДзпДĐșĐž Ń‚ĐŸŃ‰ĐŸ. +* АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐ° ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń ĐŒĐŸĐŽĐ”Đ»Đ”Đč ĐŽĐ°ĐœĐžŃ… за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ [**ĐĄŃ…Đ”ĐŒĐž JSON**](https://json-schema.org/) (ĐŸŃĐșŃ–Đ»ŃŒĐșĐž OpenAPI Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ŃĐ°ĐŒĐ” ĐœĐ° ĐĄŃ…Đ”ĐŒŃ– JSON). * Đ ĐŸĐ·Ń€ĐŸĐ±Đ»Đ”ĐœĐŸ ĐœĐ° ĐŸŃĐœĐŸĐČі цох ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Ń–ĐČ ĐżŃ–ŃĐ»Ń Ń€Đ”Ń‚Đ”Đ»ŃŒĐœĐŸĐłĐŸ Đ°ĐœĐ°Đ»Ń–Đ·Ńƒ, а ĐœĐ” яĐș ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČĐžĐč ріĐČĐ”ĐœŃŒ ĐżĐŸĐČДрх ĐŸŃĐœĐŸĐČĐœĐŸŃ— архітДĐșтуро. * ĐŠĐ” таĐșĐŸĐ¶ Юає Đ·ĐŒĐŸĐłŃƒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœŃƒ **ĐłĐ”ĐœĐ”Ń€Đ°Ń†Ń–ŃŽ ĐșĐ»Ń–Ń”ĐœŃ‚ŃŃŒĐșĐŸĐłĐŸ ĐșĐŸĐŽŃƒ** Đ±Đ°ĐłĐ°Ń‚ŃŒĐŒĐ° ĐŒĐŸĐČĐ°ĐŒĐž. @@ -15,9 +15,9 @@ Đ†ĐœŃ‚Đ”Ń€Đ°ĐșтоĐČĐœĐ° ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń API та ĐČĐ”Đ±Ń–ĐœŃ‚Đ”Ń€Ń„Đ”ĐčсО ĐŽĐ»Ń ĐčĐŸĐłĐŸ ĐŽĐŸŃĐ»Ń–ĐŽĐ¶Đ”ĐœĐœŃ. ОсĐșŃ–Đ»ŃŒĐșĐž фрДĐčĐŒĐČĐŸŃ€Đș Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° OpenAPI, є ĐșŃ–Đ»ŃŒĐșа ĐČĐ°Ń€Ń–Đ°ĐœŃ‚Ń–ĐČ, 2 Đ· яĐșох ĐČĐșĐ»ŃŽŃ‡Đ”ĐœŃ– за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ. -* [**Swagger UI**](https://github.com/swagger-api/swagger-ui) — Đ· Ń–ĐœŃ‚Đ”Ń€Đ°ĐșтоĐČĐœĐžĐŒ ĐŽĐŸŃĐ»Ń–ĐŽĐ¶Đ”ĐœĐœŃĐŒ, ĐČĐžĐșлОĐșĐŸĐŒ і Ń‚Đ”ŃŃ‚ŃƒĐČĐ°ĐœĐœŃĐŒ ĐČĐ°ŃˆĐŸĐłĐŸ API ĐżŃ€ŃĐŒĐŸ Đ· Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Đ°. +* [**Swagger UI**](https://github.com/swagger-api/swagger-ui) - Đ· Ń–ĐœŃ‚Đ”Ń€Đ°ĐșтоĐČĐœĐžĐŒ ĐŽĐŸŃĐ»Ń–ĐŽĐ¶Đ”ĐœĐœŃĐŒ, ĐČĐžĐșлОĐșĐŸĐŒ і Ń‚Đ”ŃŃ‚ŃƒĐČĐ°ĐœĐœŃĐŒ ĐČĐ°ŃˆĐŸĐłĐŸ API ĐżŃ€ŃĐŒĐŸ Đ· Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Đ°. -![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) +![ĐČĐ·Đ°Ń”ĐŒĐŸĐŽŃ–Ń Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * ĐĐ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČĐœĐ° ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń API за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ [**ReDoc**](https://github.com/Rebilly/ReDoc). @@ -27,7 +27,7 @@ УсД Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœĐžŃ… ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐœŃŃ… **топіĐČ Python** (заĐČЮяĐșĐž Pydantic). Đ–ĐŸĐŽĐœĐŸĐłĐŸ ĐœĐŸĐČĐŸĐłĐŸ ŃĐžĐœŃ‚Đ°ĐșсОсу ĐŽĐ»Ń ĐČĐžĐČŃ‡Đ”ĐœĐœŃ. Đ›ĐžŃˆĐ” ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœĐžĐč ŃŃƒŃ‡Đ°ŃĐœĐžĐč Python. -ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ 2-хĐČĐžĐ»ĐžĐœĐœĐ” ĐœĐ°ĐłĐ°ĐŽŃƒĐČĐ°ĐœĐœŃ ĐżŃ€ĐŸ тД, яĐș ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато топо Python (ĐœĐ°ĐČіть яĐșŃ‰ĐŸ ĐČĐž ĐœĐ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” FastAPI), ĐżĐ”Ń€Đ”ĐłĐ»ŃĐœŃŒŃ‚Đ” ĐșĐŸŃ€ĐŸŃ‚ĐșĐžĐč ĐżŃ–ĐŽŃ€ŃƒŃ‡ĐœĐžĐș: [йОпО Python](python-types.md). +ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ 2-хĐČĐžĐ»ĐžĐœĐœĐ” ĐœĐ°ĐłĐ°ĐŽŃƒĐČĐ°ĐœĐœŃ ĐżŃ€ĐŸ тД, яĐș ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато топо Python (ĐœĐ°ĐČіть яĐșŃ‰ĐŸ ĐČĐž ĐœĐ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” FastAPI), ĐżĐ”Ń€Đ”ĐłĐ»ŃĐœŃŒŃ‚Đ” ĐșĐŸŃ€ĐŸŃ‚ĐșĐžĐč ĐœĐ°ĐČŃ‡Đ°Đ»ŃŒĐœĐžĐč ĐżĐŸŃŃ–Đ±ĐœĐžĐș: [йОпО Python](python-types.md). Во ĐżĐžŃˆĐ”Ń‚Đ” ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœĐžĐč Python Đ· Ń‚ĐžĐżĐ°ĐŒĐž: @@ -85,13 +85,13 @@ my_second_user: User = User(**second_user_data) * у [Visual Studio Code](https://code.visualstudio.com/): -![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) +![ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа рДЎаĐșŃ‚ĐŸŃ€Đ°](https://fastapi.tiangolo.com/img/vscode-completion.png) * у [PyCharm](https://www.jetbrains.com/pycharm/): -![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) +![ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа рДЎаĐșŃ‚ĐŸŃ€Đ°](https://fastapi.tiangolo.com/img/pycharm-completion.png) -Во ĐŸŃ‚Ń€ĐžĐŒĐ°Ń”Ń‚Đ” аĐČŃ‚ĐŸĐŽĐŸĐżĐŸĐČĐœĐ”ĐœĐœŃ ĐČ ĐșĐŸĐŽŃ–, яĐșĐžĐč Ń€Đ°ĐœŃ–ŃˆĐ” ĐŒĐŸĐłĐ»Đž ĐČĐČажатО ĐœĐ°ĐČіть ĐœĐ”ĐŒĐŸĐ¶Đ»ĐžĐČĐžĐŒ. НапроĐșлаЎ, ĐŽĐ»Ń Đșлюча `price` ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– JSON body (яĐșĐžĐč ĐŒŃ–Đł Đ±ŃƒŃ‚Đž ĐČĐșĐ»Đ°ĐŽĐ”ĐœĐžĐŒ), Ń‰ĐŸ ĐœĐ°ĐŽŃ…ĐŸĐŽĐžŃ‚ŃŒ Ń–Đ· Đ·Đ°ĐżĐžŃ‚Ńƒ. +Во ĐŸŃ‚Ń€ĐžĐŒĐ°Ń”Ń‚Đ” аĐČŃ‚ĐŸĐŽĐŸĐżĐŸĐČĐœĐ”ĐœĐœŃ ĐČ ĐșĐŸĐŽŃ–, яĐșĐžĐč Ń€Đ°ĐœŃ–ŃˆĐ” ĐŒĐŸĐłĐ»Đž ĐČĐČажатО ĐœĐ°ĐČіть ĐœĐ”ĐŒĐŸĐ¶Đ»ĐžĐČĐžĐŒ. НапроĐșлаЎ, ĐŽĐ»Ń Đșлюча `price` ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– тіла JSON (яĐșĐ” ĐŒĐŸĐłĐ»ĐŸ Đ±ŃƒŃ‚Đž ĐČĐșĐ»Đ°ĐŽĐ”ĐœĐžĐŒ), Ń‰ĐŸ ĐœĐ°ĐŽŃ…ĐŸĐŽĐžŃ‚ŃŒ Ń–Đ· Đ·Đ°ĐżĐžŃ‚Ńƒ. Đ‘Ń–Đ»ŃŒŃˆĐ” ĐœĐ” ĐŽĐŸĐČĐ”ĐŽĐ”Ń‚ŃŒŃŃ ĐČĐČĐŸĐŽĐžŃ‚Đž ĐœĐ”ĐżŃ€Đ°ĐČĐžĐ»ŃŒĐœŃ– ĐœĐ°Đ·ĐČĐž ĐșлючіĐČ, ĐżĐŸŃŃ‚Ń–ĐčĐœĐŸ ĐżĐŸĐČĐ”Ń€Ń‚Đ°Ń‚ĐžŃŃ ĐŽĐŸ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— Đ°Đ±ĐŸ ĐżŃ€ĐŸĐșручуĐČато ĐČĐłĐŸŃ€Ńƒ-ĐČĐœĐžĐ·, Ń‰ĐŸĐ± Đ·ĐœĐ°Đčто, чо ĐČĐž Đ·Ń€Đ”ŃˆŃ‚ĐŸŃŽ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Đ»Đž `username` чо `user_name`. @@ -106,7 +106,7 @@ FastAPI ĐŒĐ°Ń” Ń€ĐŸĐ·ŃƒĐŒĐœŃ– **ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČа * ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа ĐČаліЎації ĐŽĐ»Ń Đ±Ń–Đ»ŃŒŃˆĐŸŃŃ‚Ń– (Đ°Đ±ĐŸ ĐČсіх?) **топіĐČ ĐŽĐ°ĐœĐžŃ… Python**, Đ·ĐŸĐșŃ€Đ”ĐŒĐ°: * JSON-ĐŸĐ±'єĐșтіĐČ (`dict`). * JSON-ĐŒĐ°ŃĐžĐČіĐČ (`list`) Ń–Đ· ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ топіĐČ Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚Ń–ĐČ. - * ĐŸĐŸĐ»Ń–ĐČ-ряЮĐșіĐČ (`str`) Ń–Đ· ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ ĐŒŃ–ĐœŃ–ĐŒĐ°Đ»ŃŒĐœĐŸŃ— та ĐŒĐ°ĐșŃĐžĐŒĐ°Đ»ŃŒĐœĐŸŃ— ĐŽĐŸĐČĐ¶ĐžĐœĐž. + * ĐŸĐŸĐ»Ń–ĐČ-ŃŃ‚Ń€ĐŸĐș (`str`) Ń–Đ· ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ ĐŒŃ–ĐœŃ–ĐŒĐ°Đ»ŃŒĐœĐŸŃ— та ĐŒĐ°ĐșŃĐžĐŒĐ°Đ»ŃŒĐœĐŸŃ— ĐŽĐŸĐČĐ¶ĐžĐœĐž. * ЧОсДл (`int`, `float`) Đ· ĐŒŃ–ĐœŃ–ĐŒĐ°Đ»ŃŒĐœĐžĐŒĐž та ĐŒĐ°ĐșŃĐžĐŒĐ°Đ»ŃŒĐœĐžĐŒĐž Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒĐž Ń‚ĐŸŃ‰ĐŸ. * Đ’Đ°Đ»Ń–ĐŽĐ°Ń†Ń–Ń ĐŽĐ»Ń Đ±Ń–Đ»ŃŒŃˆ Đ”ĐșĐ·ĐŸŃ‚ĐžŃ‡ĐœĐžŃ… топіĐČ, яĐș-ĐŸŃ‚: @@ -124,30 +124,30 @@ FastAPI ĐŒĐ°Ń” Ń€ĐŸĐ·ŃƒĐŒĐœŃ– **ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČа ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃŽŃ‚ŃŒŃŃ ĐČсі ŃŃ…Đ”ĐŒĐž бДзпДĐșĐž, ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœŃ– ĐČ OpenAPI, ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ·: * HTTP Basic. -* **OAuth2** (таĐșĐŸĐ¶ Ń–Đ· ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșĐŸŃŽ **JWT tokens**). ĐŸĐ”Ń€Đ”ĐłĐ»ŃĐœŃŒŃ‚Đ” ĐżŃ–ĐŽŃ€ŃƒŃ‡ĐœĐžĐș: [OAuth2 Ń–Đ· JWT](tutorial/security/oauth2-jwt.md). +* **OAuth2** (таĐșĐŸĐ¶ Ń–Đ· ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșĐŸŃŽ **JWT tokens**). ĐŸĐ”Ń€Đ”ĐłĐ»ŃĐœŃŒŃ‚Đ” ĐœĐ°ĐČŃ‡Đ°Đ»ŃŒĐœĐžĐč ĐżĐŸŃŃ–Đ±ĐœĐžĐș: [OAuth2 Ń–Đ· JWT](tutorial/security/oauth2-jwt.md). * Ключі API ĐČ: * Đ—Đ°ĐłĐŸĐ»ĐŸĐČĐșах. * ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°Ń… Đ·Đ°ĐżĐžŃ‚Ńƒ. - * Cookies Ń‚ĐŸŃ‰ĐŸ. + * КуĐșі Ń‚ĐŸŃ‰ĐŸ. -А таĐșĐŸĐ¶ усі ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Ń– бДзпДĐșĐž ĐČіЮ Starlette (Đ·ĐŸĐșŃ€Đ”ĐŒĐ° **session cookies**). +А таĐșĐŸĐ¶ усі ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Ń– бДзпДĐșĐž ĐČіЮ Starlette (Đ·ĐŸĐșŃ€Đ”ĐŒĐ° **сДсіĐčĐœŃ– ĐșуĐșі**). УсД цД Đ·Ń€ĐŸĐ±Đ»Đ”ĐœĐŸ яĐș Đ±Đ°ĐłĐ°Ń‚ĐŸŃ€Đ°Đ·ĐŸĐČі Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž та ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚Đž, яĐșі лДгĐșĐŸ Ń–ĐœŃ‚Đ”ĐłŃ€ŃƒŃŽŃ‚ŃŒŃŃ Đ· ĐČĐ°ŃˆĐžĐŒĐž ŃĐžŃŃ‚Đ”ĐŒĐ°ĐŒĐž, ŃŃ…ĐŸĐČĐžŃ‰Đ°ĐŒĐž ĐŽĐ°ĐœĐžŃ…, Ń€Đ”Đ»ŃŃ†Ń–ĐčĐœĐžĐŒĐž та NoSQL Đ±Đ°Đ·Đ°ĐŒĐž ĐŽĐ°ĐœĐžŃ… Ń‚ĐŸŃ‰ĐŸ. ### Đ’ĐżŃ€ĐŸĐČĐ°ĐŽĐ¶Đ”ĐœĐœŃ Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč { #dependency-injection } -FastAPI ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ ĐœĐ°ĐŽĐ·ĐČочаĐčĐœĐŸ ĐżŃ€ĐŸŃŃ‚Ńƒ у ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ–, алД ĐœĐ°ĐŽĐ·ĐČочаĐčĐœĐŸ ĐżĐŸŃ‚ŃƒĐ¶ĐœŃƒ ŃĐžŃŃ‚Đ”ĐŒŃƒ Đ’ĐżŃ€ĐŸĐČĐ°ĐŽĐ¶Đ”ĐœĐœŃ Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč. +FastAPI ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ ĐœĐ°ĐŽĐ·ĐČочаĐčĐœĐŸ ĐżŃ€ĐŸŃŃ‚Ńƒ у ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ–, алД ĐœĐ°ĐŽĐ·ĐČочаĐčĐœĐŸ ĐżĐŸŃ‚ŃƒĐ¶ĐœŃƒ ŃĐžŃŃ‚Đ”ĐŒŃƒ Đ’ĐżŃ€ĐŸĐČĐ°ĐŽĐ¶Đ”ĐœĐœŃ Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč. * НаĐČіть Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ ĐŒĐ°Ń‚Đž ĐČĐ»Đ°ŃĐœŃ– Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń–, утĐČĐŸŃ€ŃŽŃŽŃ‡Đž ієрархію Đ°Đ±ĐŸ **«граф» Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč**. * УсД **аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ”Ń‚ŃŒŃŃ** фрДĐčĐŒĐČĐŸŃ€ĐșĐŸĐŒ. * Усі Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ ĐČĐžĐŒĐ°ĐłĐ°Ń‚Đž ĐŽĐ°ĐœŃ– Ń–Đ· запОтіĐČ Ń– **Ń€ĐŸĐ·ŃˆĐžŃ€ŃŽĐČато ĐŸĐ±ĐŒĐ”Đ¶Đ”ĐœĐœŃ ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ** та аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœŃƒ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–ŃŽ. -* **АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐ° ĐČĐ°Đ»Ń–ĐŽĐ°Ń†Ń–Ń** ĐœĐ°ĐČіть ĐŽĐ»Ń *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐžŃ… у Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃŃ…. +* **АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐ° ĐČĐ°Đ»Ń–ĐŽĐ°Ń†Ń–Ń** ĐœĐ°ĐČіть ĐŽĐ»Ń ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐžŃ… у Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃŃ…. * ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа сĐșĐ»Đ°ĐŽĐœĐžŃ… ŃĐžŃŃ‚Đ”ĐŒ аĐČŃ‚Đ”ĐœŃ‚ĐžŃ„Ń–Đșації ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČачіĐČ, **піЮĐșĐ»ŃŽŃ‡Đ”ĐœŃŒ ĐŽĐŸ баз ĐŽĐ°ĐœĐžŃ…** Ń‚ĐŸŃ‰ĐŸ. * **Đ–ĐŸĐŽĐœĐžŃ… ĐșĐŸĐŒĐżŃ€ĐŸĐŒŃ–ŃŃ–ĐČ** Ń–Đ· Đ±Đ°Đ·Đ°ĐŒĐž ĐŽĐ°ĐœĐžŃ…, Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽĐ°ĐŒĐž Ń‚ĐŸŃ‰ĐŸ. АлД ĐżŃ€ĐŸŃŃ‚Đ° Ń–ĐœŃ‚Đ”ĐłŃ€Đ°Ń†Ń–Ń Đ· ŃƒŃŃ–ĐŒĐ° ĐœĐžĐŒĐž. ### ĐĐ”ĐŸĐ±ĐŒĐ”Đ¶Đ”ĐœŃ– Â«ĐżĐ»Đ°ĐłŃ–ĐœĐžÂ» { #unlimited-plug-ins } -Đ†ĐœĐ°ĐșшД ĐșĐ°Đ¶ŃƒŃ‡Đž, ĐČĐŸĐœĐž ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœŃ– — Ń–ĐŒĐżĐŸŃ€Ń‚ŃƒĐčтД та ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД ĐșĐŸĐŽ, яĐșĐžĐč ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±Đ”Đœ. +Đ†ĐœĐ°ĐșшД ĐșĐ°Đ¶ŃƒŃ‡Đž, ĐČĐŸĐœĐž ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœŃ– - Ń–ĐŒĐżĐŸŃ€Ń‚ŃƒĐčтД та ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД ĐșĐŸĐŽ, яĐșĐžĐč ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±Đ”Đœ. БуЮь-яĐșа Ń–ĐœŃ‚Đ”ĐłŃ€Đ°Ń†Ń–Ń ŃĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐČĐ°ĐœĐ° таĐș, Ń‰ĐŸĐ± її Đ±ŃƒĐ»ĐŸ ЎужД ĐżŃ€ĐŸŃŃ‚ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато (Ń–Đ· Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃĐŒĐž), Ń‚ĐŸĐ¶ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” стĐČĐŸŃ€ĐžŃ‚Đž Â«ĐżĐ»Đ°ĐłŃ–ĐœÂ» ĐŽĐ»Ń сĐČĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу у 2 ряЮĐșах ĐșĐŸĐŽŃƒ, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо ту ŃĐ°ĐŒŃƒ струĐșтуру та ŃĐžĐœŃ‚Đ°ĐșсОс, Ń‰ĐŸ Đč ĐŽĐ»Ń ĐČашох *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…Ńƒ*. @@ -163,15 +163,15 @@ FastAPI ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ ĐœĐ°ĐŽĐ·ĐČочаĐčĐœĐŸ ĐżŃ€ĐŸŃŃ‚Ńƒ у ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ° `FastAPI` фаĐșŃ‚ĐžŃ‡ĐœĐŸ є піЮĐșĐ»Đ°ŃĐŸĐŒ `Starlette`. ĐąĐŸĐŒŃƒ, яĐșŃ‰ĐŸ ĐČĐž ĐČжД Đ·ĐœĐ°ĐčĐŸĐŒŃ– Đ·Ń– Starlette Đ°Đ±ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ĐčĐŸĐłĐŸ, Đ±Ń–Đ»ŃŒŃˆŃ–ŃŃ‚ŃŒ Ń„ŃƒĐœĐșŃ†Ń–ĐŸĐœĐ°Đ»ŃŒĐœĐŸŃŃ‚Ń– працюĐČĐ°Ń‚ĐžĐŒĐ” таĐș ŃĐ°ĐŒĐŸ. -З **FastAPI** ĐČĐž ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”Ń‚Đ” ĐČсі ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Ń– **Starlette** (аЎжД FastAPI — цД ĐżŃ€ĐŸŃŃ‚ĐŸ Starlette ĐœĐ° ŃŃ‚Đ”Ń€ĐŸŃ—ĐŽĐ°Ń…): +З **FastAPI** ĐČĐž ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”Ń‚Đ” ĐČсі ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Ń– **Starlette** (аЎжД FastAPI - цД ĐżŃ€ĐŸŃŃ‚ĐŸ Starlette ĐœĐ° ŃŃ‚Đ”Ń€ĐŸŃ—ĐŽĐ°Ń…): * Разюча ĐżŃ€ĐŸĐŽŃƒĐșтоĐČĐœŃ–ŃŃ‚ŃŒ. ĐŠĐ” [ĐŸĐŽĐžĐœ Ń–Đ· ĐœĐ°ĐčшĐČоЮшох ĐŽĐŸŃŃ‚ŃƒĐżĐœĐžŃ… Python-фрДĐčĐŒĐČĐŸŃ€ĐșіĐČ, ĐœĐ° ріĐČĐœŃ– Đ· **NodeJS** і **Go**](https://github.com/encode/starlette#performance). * ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа **WebSocket**. * Đ€ĐŸĐœĐŸĐČі заЎачі у ĐżŃ€ĐŸŃ†Đ”ŃŃ–. -* ĐŸĐŸĐŽŃ–Ń— запусĐșу та заĐČĐ”Ń€ŃˆĐ”ĐœĐœŃ Ń€ĐŸĐ±ĐŸŃ‚Đž. +* ĐŸĐŸĐŽŃ–Ń— запусĐșу та ĐČĐžĐŒĐșĐœĐ”ĐœĐœŃ. * ĐšĐ»Ń–Ń”ĐœŃ‚ ĐŽĐ»Ń Ń‚Đ”ŃŃ‚ŃƒĐČĐ°ĐœĐœŃ, ĐżĐŸĐ±ŃƒĐŽĐŸĐČĐ°ĐœĐžĐč ĐœĐ° HTTPX. * ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа **CORS**, **GZip**, ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœĐžŃ… фаĐčліĐČ, ĐżĐŸŃ‚ĐŸĐșĐŸĐČох ĐČŃ–ĐŽĐżĐŸĐČŃ–ĐŽĐ”Đč. -* ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа **сДсіĐč** і **cookie**. +* ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа **сДсіĐč і ĐșуĐșі**. * 100% ĐżĐŸĐșроття Ń‚Đ”ŃŃ‚Đ°ĐŒĐž. * 100% Đ°ĐœĐŸŃ‚ĐŸĐČĐ°ĐœĐ° Ń‚ĐžĐżĐ°ĐŒĐž ĐșĐŸĐŽĐŸĐČа база. @@ -183,7 +183,7 @@ FastAPI ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ ĐœĐ°ĐŽĐ·ĐČочаĐčĐœĐŸ ĐżŃ€ĐŸŃŃ‚Ńƒ у ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ° ĐŠĐ” таĐșĐŸĐ¶ ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐČ Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… ĐČОпаЎĐșах ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” пДрДЎатО Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč ĐŸĐ±'єĐșт, яĐșĐžĐč ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”Ń‚Đ” Ń–Đ· Đ·Đ°ĐżĐžŃ‚Ńƒ, **Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐČ Đ±Đ°Đ·Ńƒ ĐŽĐ°ĐœĐžŃ…**, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐČсД аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ пДрДĐČіряється. -йД ŃĐ°ĐŒĐ” Đ·Đ°ŃŃ‚ĐŸŃĐŸĐČується Đč у Đ·ĐČĐŸŃ€ĐŸŃ‚ĐœĐŸĐŒŃƒ ĐœĐ°ĐżŃ€ŃĐŒĐșу — у Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… ĐČОпаЎĐșах ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸŃŃ‚ĐŸ пДрДЎатО ĐŸĐ±'єĐșт, яĐșĐžĐč ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”Ń‚Đ” Đ· базО ĐŽĐ°ĐœĐžŃ…, **Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐșĐ»Ń–Ń”ĐœŃ‚Ńƒ**. +йД ŃĐ°ĐŒĐ” Đ·Đ°ŃŃ‚ĐŸŃĐŸĐČується Đč у Đ·ĐČĐŸŃ€ĐŸŃ‚ĐœĐŸĐŒŃƒ ĐœĐ°ĐżŃ€ŃĐŒĐșу - у Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… ĐČОпаЎĐșах ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸŃŃ‚ĐŸ пДрДЎатО ĐŸĐ±'єĐșт, яĐșĐžĐč ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”Ń‚Đ” Đ· базО ĐŽĐ°ĐœĐžŃ…, **Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐșĐ»Ń–Ń”ĐœŃ‚Ńƒ**. З **FastAPI** ĐČĐž ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”Ń‚Đ” ĐČсі ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Ń– **Pydantic** (аЎжД FastAPI Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° Pydantic ĐŽĐ»Ń ĐŸĐ±Ń€ĐŸĐ±ĐșĐž ĐČсіх ĐŽĐ°ĐœĐžŃ…): @@ -193,8 +193,8 @@ FastAPI ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ ĐœĐ°ĐŽĐ·ĐČочаĐčĐœĐŸ ĐżŃ€ĐŸŃŃ‚Ńƒ у ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ° * ЛДгĐșĐŸ працює Đ· ĐČĐ°ŃˆĐžĐŒ **IDE/linter/ĐŒĐŸĐ·ĐșĐŸĐŒ**: * ОсĐșŃ–Đ»ŃŒĐșĐž струĐșтуро ĐŽĐ°ĐœĐžŃ… pydantic є ĐżŃ€ĐŸŃŃ‚ĐŸ Đ”ĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€Đ°ĐŒĐž ĐșласіĐČ, яĐșі ĐČĐž ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń”Ń‚Đ”; аĐČŃ‚ĐŸĐŽĐŸĐżĐŸĐČĐœĐ”ĐœĐœŃ, Đ»Ń–ĐœŃ‚ĐžĐœĐł, mypy і ĐČаша Ń–ĐœŃ‚ŃƒŃ—Ń†Ń–Ń ĐżĐŸĐČĐžĐœĐœŃ– ĐŽĐŸĐ±Ń€Đ” працюĐČато Đ· ĐČĐ°ŃˆĐžĐŒĐž пДрДĐČŃ–Ń€Đ”ĐœĐžĐŒĐž ĐŽĐ°ĐœĐžĐŒĐž. * Đ’Đ°Đ»Ń–ĐŽŃƒŃ” **сĐșĐ»Đ°ĐŽĐœŃ– струĐșтуро**: - * ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Ń–Ń”Ń€Đ°Ń€Ń…Ń–Ń‡ĐœĐžŃ… ĐŒĐŸĐŽĐ”Đ»Đ”Đč Pydantic, Python `typing`’s `List` і `Dict` Ń‚ĐŸŃ‰ĐŸ. - * Đ’Đ°Đ»Ń–ĐŽĐ°Ń‚ĐŸŃ€Đž Юають Đ·ĐŒĐŸĐłŃƒ сĐșĐ»Đ°ĐŽĐœŃ– ŃŃ…Đ”ĐŒĐž ĐŽĐ°ĐœĐžŃ… чітĐșĐŸ Đč ĐżŃ€ĐŸŃŃ‚ĐŸ ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń‚Đž, пДрДĐČірято Đč ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ŃƒĐČато яĐș JSON Schema. + * ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Ń–Ń”Ń€Đ°Ń€Ń…Ń–Ń‡ĐœĐžŃ… ĐŒĐŸĐŽĐ”Đ»Đ”Đč Pydantic, `List` і `Dict` Đ· Python `typing` Ń‚ĐŸŃ‰ĐŸ. + * Đ’Đ°Đ»Ń–ĐŽĐ°Ń‚ĐŸŃ€Đž Юають Đ·ĐŒĐŸĐłŃƒ сĐșĐ»Đ°ĐŽĐœŃ– ŃŃ…Đ”ĐŒĐž ĐŽĐ°ĐœĐžŃ… чітĐșĐŸ Đč ĐżŃ€ĐŸŃŃ‚ĐŸ ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń‚Đž, пДрДĐČірято Đč ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ŃƒĐČато яĐș ĐĄŃ…Đ”ĐŒŃƒ JSON. * Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž ĐłĐ»ĐžĐ±ĐŸĐșĐŸ **ĐČĐșĐ»Đ°ĐŽĐ”ĐœŃ– JSON** ĐŸĐ±'єĐșто, і ĐČсі ĐČĐŸĐœĐž Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐČĐ°Đ»Ń–ĐŽĐŸĐČĐ°ĐœŃ– та Đ°ĐœĐŸŃ‚ĐŸĐČĐ°ĐœŃ–. * **Đ ĐŸĐ·ŃˆĐžŃ€ŃŽĐČĐ°ĐœŃ–ŃŃ‚ŃŒ**: * Pydantic ĐŽĐŸĐ·ĐČĐŸĐ»ŃŃ” ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń‚Đž ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČацьĐșі топо ĐŽĐ°ĐœĐžŃ… Đ°Đ±ĐŸ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń€ĐŸĐ·ŃˆĐžŃ€ĐžŃ‚Đž ĐČаліЎацію ĐŒĐ”Ń‚ĐŸĐŽĐ°ĐŒĐž ĐČ ĐŒĐŸĐŽĐ”Đ»Ń–, ĐżĐŸĐ·ĐœĐ°Ń‡Đ”ĐœĐžĐŒĐž ĐŽĐ”ĐșĐŸŃ€Đ°Ń‚ĐŸŃ€ĐŸĐŒ validator. diff --git a/docs/uk/docs/help-fastapi.md b/docs/uk/docs/help-fastapi.md index e093bdece..fe1b35c47 100644 --- a/docs/uk/docs/help-fastapi.md +++ b/docs/uk/docs/help-fastapi.md @@ -6,7 +6,7 @@ ## ПіЮпошіться ĐœĐ° Ń€ĐŸĐ·ŃĐžĐ»Đșу { #subscribe-to-the-newsletter } -Во ĐŒĐŸĐ¶Đ”Ń‚Đ” піЮпосатося ĐœĐ° (ĐœĐ”Ń‡Đ°ŃŃ‚Ńƒ) Ń€ĐŸĐ·ŃĐžĐ»Đșу [**FastAPI and friends**](newsletter.md), Ń‰ĐŸĐ± Đ±ŃƒŃ‚Đž ĐČ Đșурсі: +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” піЮпосатося ĐœĐ° (ĐœĐ”Ń‡Đ°ŃŃ‚Ńƒ) [Ń€ĐŸĐ·ŃĐžĐ»Đșу **FastAPI and friends**](newsletter.md), Ń‰ĐŸĐ± Đ±ŃƒŃ‚Đž ĐČ Đșурсі: * ĐĐŸĐČĐžĐœ ĐżŃ€ĐŸ FastAPI та ĐŽŃ€ŃƒĐ·Ń–ĐČ đŸš€ * ĐŸĐŸŃŃ–Đ±ĐœĐžĐșіĐČ đŸ“ diff --git a/docs/uk/docs/how-to/configure-swagger-ui.md b/docs/uk/docs/how-to/configure-swagger-ui.md index 5fe47d12e..2322c67bc 100644 --- a/docs/uk/docs/how-to/configure-swagger-ui.md +++ b/docs/uk/docs/how-to/configure-swagger-ui.md @@ -67,4 +67,4 @@ presets: [ ĐŠĐ” ĐŸĐ±â€™Ń”Đșто **JavaScript**, а ĐœĐ” ŃŃ‚Ń€ĐŸĐșĐž, Ń‚ĐŸĐŒŃƒ ĐČĐž ĐœĐ” ĐŒĐŸĐ¶Đ”Ń‚Đ” пДрДЎатО їх Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Đ· ĐșĐŸĐŽŃƒ Python. -ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž таĐșі ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ лОшД ĐŽĐ»Ń JavaScript, сĐșĐŸŃ€ĐžŃŃ‚Đ°ĐčŃ‚Đ”ŃŃ ĐŸĐŽĐœĐžĐŒ Ń–Đ· ĐŒĐ”Ń‚ĐŸĐŽŃ–ĐČ ĐČОщД. ĐŸĐŸĐČĐœŃ–ŃŃ‚ŃŽ ĐżĐ”Ń€Đ”ĐżĐžŃˆŃ–Ń‚ŃŒ ĐŸĐżĐ”Ń€Đ°Ń†Ń–ŃŽ ŃˆĐ»ŃŃ…Ńƒ Swagger UI та ĐČŃ€ŃƒŃ‡ĐœŃƒ ĐœĐ°ĐżĐžŃˆŃ–Ń‚ŃŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžĐč JavaScript. +ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž таĐșі ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ лОшД ĐŽĐ»Ń JavaScript, сĐșĐŸŃ€ĐžŃŃ‚Đ°ĐčŃ‚Đ”ŃŃ ĐŸĐŽĐœĐžĐŒ Ń–Đ· ĐŒĐ”Ń‚ĐŸĐŽŃ–ĐČ ĐČОщД. ĐŸĐŸĐČĐœŃ–ŃŃ‚ŃŽ ĐżĐ”Ń€Đ”ĐżĐžŃˆŃ–Ń‚ŃŒ *ĐŸĐżĐ”Ń€Đ°Ń†Ń–ŃŽ ŃˆĐ»ŃŃ…Ńƒ* Swagger UI та ĐČŃ€ŃƒŃ‡ĐœŃƒ ĐœĐ°ĐżĐžŃˆŃ–Ń‚ŃŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžĐč JavaScript. diff --git a/docs/uk/docs/how-to/custom-request-and-route.md b/docs/uk/docs/how-to/custom-request-and-route.md index 6a46b5723..f45fc1eea 100644 --- a/docs/uk/docs/how-to/custom-request-and-route.md +++ b/docs/uk/docs/how-to/custom-request-and-route.md @@ -18,9 +18,9 @@ Đ”Đ”ŃĐșі ĐČĐ°Ń€Ń–Đ°ĐœŃ‚Đž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ: -- ĐŸĐ”Ń€Đ”Ń‚ĐČĐŸŃ€Đ”ĐœĐœŃ ĐœĐ”-JSON тіл запОтіĐČ ĐœĐ° JSON (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, [`msgpack`](https://msgpack.org/index.html)). -- Đ ĐŸĐ·ĐżĐ°ĐșуĐČĐ°ĐœĐœŃ тіл запОтіĐČ, ŃŃ‚ĐžŃĐœĐ”ĐœĐžŃ… gzip. -- АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐ” Đ»ĐŸĐłŃƒĐČĐ°ĐœĐœŃ ĐČсіх тіл запОтіĐČ. +* ĐŸĐ”Ń€Đ”Ń‚ĐČĐŸŃ€Đ”ĐœĐœŃ ĐœĐ”-JSON тіл запОтіĐČ ĐœĐ° JSON (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, [`msgpack`](https://msgpack.org/index.html)). +* Đ ĐŸĐ·ĐżĐ°ĐșуĐČĐ°ĐœĐœŃ тіл запОтіĐČ, ŃŃ‚ĐžŃĐœĐ”ĐœĐžŃ… gzip. +* АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐ” Đ»ĐŸĐłŃƒĐČĐ°ĐœĐœŃ ĐČсіх тіл запОтіĐČ. ## ĐžĐ±Ń€ĐŸĐ±Đșа ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČацьĐșох ĐșĐŸĐŽŃƒĐČĐ°ĐœŃŒ тіла Đ·Đ°ĐżĐžŃ‚Ńƒ { #handling-custom-request-body-encodings } @@ -76,7 +76,7 @@ ĐŸŃ–ŃĐ»Ń Ń†ŃŒĐŸĐłĐŸ ĐČся Đ»ĐŸĐłŃ–Đșа ĐŸĐ±Ń€ĐŸĐ±ĐșĐž Đ·Đ°Đ»ĐžŃˆĐ°Ń”Ń‚ŃŒŃŃ тією ŃĐ°ĐŒĐŸŃŽ. -А заĐČЮяĐșĐž Đ·ĐŒŃ–ĐœĐ°ĐŒ у `GzipRequest.body` Ń‚Ń–Đ»ĐŸ Đ·Đ°ĐżĐžŃ‚Ńƒ за ĐżĐŸŃ‚Ń€Đ”Đ±Đž буЎД аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ Ń€ĐŸĐ·ĐżĐ°ĐșĐŸĐČĐ°ĐœĐ” піЮ час заĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ **FastAPI**. +АлД заĐČЮяĐșĐž Đ·ĐŒŃ–ĐœĐ°ĐŒ у `GzipRequest.body` Ń‚Ń–Đ»ĐŸ Đ·Đ°ĐżĐžŃ‚Ńƒ за ĐżĐŸŃ‚Ń€Đ”Đ±Đž буЎД аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ Ń€ĐŸĐ·ĐżĐ°ĐșĐŸĐČĐ°ĐœĐ”, ĐșĐŸĐ»Đž **FastAPI** заĐČĐ°ĐœŃ‚Đ°Đ¶ŃƒĐČĐ°Ń‚ĐžĐŒĐ” ĐčĐŸĐłĐŸ. ## Đ”ĐŸŃŃ‚ŃƒĐż ĐŽĐŸ тіла Đ·Đ°ĐżĐžŃ‚Ńƒ ĐČ ĐŸĐ±Ń€ĐŸĐ±ĐœĐžĐșу ĐČĐžĐșĐ»ŃŽŃ‡Đ”ĐœŃŒ { #accessing-the-request-body-in-an-exception-handler } diff --git a/docs/uk/docs/how-to/graphql.md b/docs/uk/docs/how-to/graphql.md index c070c7e0c..91fa3619d 100644 --- a/docs/uk/docs/how-to/graphql.md +++ b/docs/uk/docs/how-to/graphql.md @@ -1,22 +1,22 @@ # GraphQL { #graphql } -ОсĐșŃ–Đ»ŃŒĐșĐž FastAPI Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Ń– ASGI, ЎужД ĐżŃ€ĐŸŃŃ‚ĐŸ Ń–ĐœŃ‚Đ”ĐłŃ€ŃƒĐČато Đ±ŃƒĐŽŃŒ-яĐșу Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșу GraphQL, ŃŃƒĐŒŃ–ŃĐœŃƒ Đ· ASGI. +ОсĐșŃ–Đ»ŃŒĐșĐž **FastAPI** Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Ń– **ASGI**, ЎужД ĐżŃ€ĐŸŃŃ‚ĐŸ Ń–ĐœŃ‚Đ”ĐłŃ€ŃƒĐČато Đ±ŃƒĐŽŃŒ-яĐșу Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșу **GraphQL**, ŃŃƒĐŒŃ–ŃĐœŃƒ Đ· ASGI. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸŃ”ĐŽĐœŃƒĐČато Đ·ĐČочаĐčĐœŃ– *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* FastAPI Đ· GraphQL ĐČ ĐŸĐŽĐœĐŸĐŒŃƒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу. /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -GraphQL Ń€ĐŸĐ·ĐČâ€™ŃĐ·ŃƒŃ” ĐŽĐ”ŃĐșі ЎужД ŃĐżĐ”Ń†ĐžŃ„Ń–Ń‡ĐœŃ– ŃŃ†Đ”ĐœĐ°Ń€Ń–Ń— ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ. +**GraphQL** Ń€ĐŸĐ·ĐČâ€™ŃĐ·ŃƒŃ” ĐŽĐ”ŃĐșі ЎужД ŃĐżĐ”Ń†ĐžŃ„Ń–Ń‡ĐœŃ– ŃŃ†Đ”ĐœĐ°Ń€Ń–Ń— ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ. -ĐŸĐŸŃ€Ń–ĐČĐœŃĐœĐŸ Đ·Ń– Đ·ĐČочаĐčĐœĐžĐŒĐž ĐČДб-API ĐČŃ–Đœ ĐŒĐ°Ń” пДрДĐČагО та ĐœĐ”ĐŽĐŸĐ»Ń–ĐșĐž. +ĐŸĐŸŃ€Ń–ĐČĐœŃĐœĐŸ Đ·Ń– Đ·ĐČочаĐčĐœĐžĐŒĐž **ĐČДб-API** ĐČŃ–Đœ ĐŒĐ°Ń” **пДрДĐČагО** та **ĐœĐ”ĐŽĐŸĐ»Ń–ĐșĐž**. -ĐŸĐ”Ń€Đ”ĐșĐŸĐœĐ°ĐčŃ‚Đ”ŃŃ, Ń‰ĐŸ пДрДĐČагО ĐŽĐ»Ń ĐČĐ°ŃˆĐŸĐłĐŸ ĐČОпаЎĐșу ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ пДрДĐČĐ°Đ¶Đ°ŃŽŃ‚ŃŒ ĐœĐ”ĐŽĐŸĐ»Ń–ĐșĐž. đŸ€“ +ĐŸĐ”Ń€Đ”ĐșĐŸĐœĐ°ĐčŃ‚Đ”ŃŃ, Ń‰ĐŸ **пДрДĐČагО** ĐŽĐ»Ń ĐČĐ°ŃˆĐŸĐłĐŸ ĐČОпаЎĐșу ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ пДрДĐČĐ°Đ¶Đ°ŃŽŃ‚ŃŒ **ĐœĐ”ĐŽĐŸĐ»Ń–ĐșĐž**. đŸ€“ /// ## Đ‘Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”ĐșĐž GraphQL { #graphql-libraries } -Ось ĐŽĐ”ŃĐșі Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”ĐșĐž GraphQL Đ· ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșĐŸŃŽ ASGI. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато їх Ń–Đ· FastAPI: +Ось ĐŽĐ”ŃĐșі Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”ĐșĐž **GraphQL** Đ· ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșĐŸŃŽ **ASGI**. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато їх Ń–Đ· **FastAPI**: * [Strawberry](https://strawberry.rocks/) 🍓 * З [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń”ŃŽ ĐŽĐ»Ń FastAPI](https://strawberry.rocks/docs/integrations/fastapi) @@ -29,23 +29,23 @@ GraphQL Ń€ĐŸĐ·ĐČâ€™ŃĐ·ŃƒŃ” ĐŽĐ”ŃĐșі ЎужД ŃĐżĐ”Ń†ĐžŃ„Ń–Ń‡ĐœŃ– ŃŃ†Đ”ĐœĐ° ## GraphQL Đ·Ń– Strawberry { #graphql-with-strawberry } -ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±Đ”Đœ Đ°Đ±ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато GraphQL, [Strawberry](https://strawberry.rocks/) - рДĐșĐŸĐŒĐ”ĐœĐŽĐŸĐČĐ°ĐœĐ° Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșа, аЎжД її ЎОзаĐčĐœ ĐœĐ°ĐčблОжчОĐč ĐŽĐŸ ЎОзаĐčĐœŃƒ FastAPI; усД Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° Đ°ĐœĐŸŃ‚Đ°Ń†Ń–ŃŃ… топіĐČ. +ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±Đ”Đœ Đ°Đ±ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато **GraphQL**, [**Strawberry**](https://strawberry.rocks/) - **рДĐșĐŸĐŒĐ”ĐœĐŽĐŸĐČĐ°ĐœĐ°** Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșа, аЎжД її ЎОзаĐčĐœ ĐœĐ°ĐčблОжчОĐč ĐŽĐŸ ЎОзаĐčĐœŃƒ **FastAPI**; усД Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° **Đ°ĐœĐŸŃ‚Đ°Ń†Ń–ŃŃ… топіĐČ**. -Đ—Đ°Đ»Đ”Đ¶ĐœĐŸ ĐČіЮ ĐČĐ°ŃˆĐŸĐłĐŸ ŃŃ†Đ”ĐœĐ°Ń€Ń–ŃŽ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐœĐ°ĐŽĐ°Ń‚Đž пДрДĐČагу Ń–ĐœŃˆŃ–Đč Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Ń†Ń–, алД яĐșбО ĐČĐž запОталО ĐŒĐ”ĐœĐ”, я, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐżĐŸŃ€Đ°ĐŽĐžĐČ Đ±Đž ŃĐżŃ€ĐŸĐ±ŃƒĐČато Strawberry. +Đ—Đ°Đ»Đ”Đ¶ĐœĐŸ ĐČіЮ ĐČĐ°ŃˆĐŸĐłĐŸ ŃŃ†Đ”ĐœĐ°Ń€Ń–ŃŽ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐœĐ°ĐŽĐ°Ń‚Đž пДрДĐČагу Ń–ĐœŃˆŃ–Đč Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Ń†Ń–, алД яĐșбО ĐČĐž запОталО ĐŒĐ”ĐœĐ”, я, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐżĐŸŃ€Đ°ĐŽĐžĐČ Đ±Đž ŃĐżŃ€ĐŸĐ±ŃƒĐČато **Strawberry**. -Ось ĐœĐ”ĐČДлОĐșĐžĐč проĐșлаЎ Ń‚ĐŸĐłĐŸ, яĐș Ń–ĐœŃ‚Đ”ĐłŃ€ŃƒĐČато Strawberry Đ· FastAPI: +Ось ĐœĐ”ĐČДлОĐșĐžĐč ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ–Đč ĐżĐ”Ń€Đ”ĐłĐ»ŃĐŽ Ń‚ĐŸĐłĐŸ, яĐș ĐČĐž ĐŒĐŸĐłĐ»Đž б Ń–ĐœŃ‚Đ”ĐłŃ€ŃƒĐČато Strawberry Đ· FastAPI: {* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *} Đ‘Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ Strawberry ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽŃ–Đ·ĐœĐ°Ń‚ĐžŃŃ ĐČ [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— Strawberry](https://strawberry.rocks/). -І таĐșĐŸĐ¶ [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–ŃŽ ĐżŃ€ĐŸ Strawberry Đ· FastAPI](https://strawberry.rocks/docs/integrations/fastapi). +І таĐșĐŸĐ¶ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–ŃŽ ĐżŃ€ĐŸ [Strawberry Đ· FastAPI](https://strawberry.rocks/docs/integrations/fastapi). ## ЗастарілОĐč `GraphQLApp` Đ·Ń– Starlette { #older-graphqlapp-from-starlette } ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ– ĐČДрсії Starlette ĐŒŃ–ŃŃ‚ĐžĐ»Đž Đșлас `GraphQLApp` ĐŽĐ»Ń Ń–ĐœŃ‚Đ”ĐłŃ€Đ°Ń†Ń–Ń— Đ· [Graphene](https://graphene-python.org/). -Đ™ĐŸĐłĐŸ ĐČĐžĐ»ŃƒŃ‡Đ”ĐœĐŸ Đ· Starlette яĐș застарілОĐč, алД яĐșŃ‰ĐŸ у ĐČас є ĐșĐŸĐŽ, Ń‰ĐŸ ĐčĐŸĐłĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČаĐČ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” лДгĐșĐŸ ĐŒŃ–ĐłŃ€ŃƒĐČато ĐœĐ° [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3), яĐșĐžĐč ĐżĐŸĐșроĐČає Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč ŃŃ†Đ”ĐœĐ°Ń€Ń–Đč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ та ĐŒĐ°Ń” ĐŒĐ°ĐčжД Ń–ĐŽĐ”ĐœŃ‚ĐžŃ‡ĐœĐžĐč Ń–ĐœŃ‚Đ”Ń€Ń„Đ”Đčс. +Đ™ĐŸĐłĐŸ Đ±ŃƒĐ»ĐŸ ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐŸ Đ·Đ°ŃŃ‚Đ°Ń€Ń–Đ»ĐžĐŒ у Starlette, алД яĐșŃ‰ĐŸ у ĐČас є ĐșĐŸĐŽ, Ń‰ĐŸ ĐčĐŸĐłĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČаĐČ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” лДгĐșĐŸ **ĐŒŃ–ĐłŃ€ŃƒĐČато** ĐœĐ° [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3), яĐșĐžĐč ĐżĐŸĐșроĐČає Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč ŃŃ†Đ”ĐœĐ°Ń€Ń–Đč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ та ĐŒĐ°Ń” **ĐŒĐ°ĐčжД Ń–ĐŽĐ”ĐœŃ‚ĐžŃ‡ĐœĐžĐč Ń–ĐœŃ‚Đ”Ń€Ń„Đ”Đčс**. /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° @@ -55,6 +55,6 @@ GraphQL Ń€ĐŸĐ·ĐČâ€™ŃĐ·ŃƒŃ” ĐŽĐ”ŃĐșі ЎужД ŃĐżĐ”Ń†ĐžŃ„Ń–Ń‡ĐœŃ– ŃŃ†Đ”ĐœĐ° ## Đ”Ń–Đ·ĐœĐ°ĐčŃ‚Đ”ŃŃ Đ±Ń–Đ»ŃŒŃˆĐ” { #learn-more } -Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽŃ–Đ·ĐœĐ°Ń‚ĐžŃŃ Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ GraphQL ĐČ [ĐŸŃ„Ń–Ń†Ń–ĐčĐœŃ–Đč ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— GraphQL](https://graphql.org/). +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽŃ–Đ·ĐœĐ°Ń‚ĐžŃŃ Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ **GraphQL** ĐČ [ĐŸŃ„Ń–Ń†Ń–ĐčĐœŃ–Đč ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— GraphQL](https://graphql.org/). -йаĐșĐŸĐ¶ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸŃ‡ĐžŃ‚Đ°Ń‚Đž Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ ĐșĐŸĐ¶ĐœŃƒ Đ· цох Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đș за ĐœĐ°ĐČĐ”ĐŽĐ”ĐœĐžĐŒĐž ĐżĐŸŃĐžĐ»Đ°ĐœĐœŃĐŒĐž. +йаĐșĐŸĐ¶ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸŃ‡ĐžŃ‚Đ°Ń‚Đž Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ ĐșĐŸĐ¶ĐœŃƒ Đ· цох Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đș, ĐŸĐżĐžŃĐ°ĐœĐžŃ… ĐČОщД, за ĐœĐ°ĐČĐ”ĐŽĐ”ĐœĐžĐŒĐž ĐżĐŸŃĐžĐ»Đ°ĐœĐœŃĐŒĐž. diff --git a/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md index c5519b98d..7f71df245 100644 --- a/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md +++ b/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -8,9 +8,11 @@ FastAPI ĐČДрсії 0.119.0 Đ·Đ°ĐżŃ€ĐŸĐČаЎОĐČ Ń‡Đ°ŃŃ‚ĐșĐŸĐČу піЮтро FastAPI 0.126.0 ĐżŃ€ĐžĐżĐžĐœĐžĐČ ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу Pydantic v1, ĐČĐŸĐŽĐœĐŸŃ‡Đ°Ń щД пДĐČĐœĐžĐč час ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒĐČаĐČ `pydantic.v1`. +FastAPI 0.128.0 таĐșĐŸĐ¶ ĐżŃ€ĐžĐżĐžĐœĐžĐČ ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу `pydantic.v1`, Ń‚ĐŸĐŒŃƒ ĐœĐ°ĐčĐœĐŸĐČіші ĐČДрсії FastAPI ĐČĐžĐŒĐ°ĐłĐ°ŃŽŃ‚ŃŒ Pydantic v2. + /// warning | ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐ¶Đ”ĐœĐœŃ -ĐšĐŸĐŒĐ°ĐœĐŽĐ° Pydantic ĐżŃ€ĐžĐżĐžĐœĐžĐ»Đ° ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу Pydantic v1 ĐŽĐ»Ń ĐŸŃŃ‚Đ°ĐœĐœŃ–Ń… ĐČДрсіĐč Python, ĐżĐŸŃ‡ĐžĐœĐ°ŃŽŃ‡Đž Đ· Python 3.14. +ĐšĐŸĐŒĐ°ĐœĐŽĐ° Pydantic ĐżŃ€ĐžĐżĐžĐœĐžĐ»Đ° ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу Pydantic v1 ĐŽĐ»Ń ĐŸŃŃ‚Đ°ĐœĐœŃ–Ń… ĐČДрсіĐč Python, ĐżĐŸŃ‡ĐžĐœĐ°ŃŽŃ‡Đž Đ· **Python 3.14**. ĐŠĐ” ŃŃ‚ĐŸŃŃƒŃ”Ń‚ŃŒŃŃ і `pydantic.v1`, яĐșĐžĐč Đ±Ń–Đ»ŃŒŃˆĐ” ĐœĐ” ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃ”Ń‚ŃŒŃŃ ĐČ Python 3.14 і ĐœĐŸĐČішох. @@ -18,7 +20,7 @@ FastAPI 0.126.0 ĐżŃ€ĐžĐżĐžĐœĐžĐČ ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу Pydantic v1, ĐČĐŸĐŽĐœĐŸŃ‡Đ° /// -ĐŻĐșŃ‰ĐŸ у ĐČас стара ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ° FastAPI Đ· Pydantic v1, ĐœĐžĐ¶Ń‡Đ” я ĐżĐŸĐșажу, яĐș ĐŒŃ–ĐłŃ€ŃƒĐČато ĐœĐ° Pydantic v2, а таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Ń– FastAPI 0.119.0, яĐșі ĐŽĐŸĐżĐŸĐŒĐŸĐ¶ŃƒŃ‚ŃŒ Đ· ĐżĐŸŃŃ‚ŃƒĐżĐŸĐČĐŸŃŽ ĐŒŃ–ĐłŃ€Đ°Ń†Ń–Ń”ŃŽ. +ĐŻĐșŃ‰ĐŸ у ĐČас стара ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ° FastAPI Đ· Pydantic v1, ĐœĐžĐ¶Ń‡Đ” я ĐżĐŸĐșажу, яĐș ĐŒŃ–ĐłŃ€ŃƒĐČато ĐœĐ° Pydantic v2, а таĐșĐŸĐ¶ **ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Ń– FastAPI 0.119.0**, яĐșі ĐŽĐŸĐżĐŸĐŒĐŸĐ¶ŃƒŃ‚ŃŒ Đ· ĐżĐŸŃŃ‚ŃƒĐżĐŸĐČĐŸŃŽ ĐŒŃ–ĐłŃ€Đ°Ń†Ń–Ń”ŃŽ. ## ОфіціĐčĐœĐžĐč ĐżĐŸŃŃ–Đ±ĐœĐžĐș { #official-guide } @@ -54,6 +56,16 @@ Pydantic v2 ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ усД Đ· Pydantic v1 яĐș ĐżŃ–ĐŽĐŒĐŸĐŽŃƒĐ»ŃŒ `pydant ### ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа FastAPI ĐŽĐ»Ń Pydantic v1 у v2 { #fastapi-support-for-pydantic-v1-in-v2 } +/// warning | ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐ¶Đ”ĐœĐœŃ + +Щю ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу FastAPI ĐŽĐ»Ń ĐŒĐŸĐŽĐ”Đ»Đ”Đč `pydantic.v1` Đ±ŃƒĐ»ĐŸ ĐŽĐŸĐŽĐ°ĐœĐŸ у **FastAPI 0.119.0** і ĐČĐžĐŽĐ°Đ»Đ”ĐœĐŸ у **FastAPI 0.128.0**. Đ’ĐŸĐœĐ° була Đ·Đ°ĐŽŃƒĐŒĐ°ĐœĐ° яĐș Ń‚ĐžĐŒŃ‡Đ°ŃĐŸĐČа ĐŽĐŸĐżĐŸĐŒĐŸĐłĐ° ĐŽĐ»Ń ĐŒŃ–ĐłŃ€Đ°Ń†Ń–Ń— ĐœĐ° Pydantic v2. + +ĐŁ ĐżĐŸŃ‚ĐŸŃ‡ĐœĐžŃ… ĐČĐ”Ń€ŃŃ–ŃŃ… FastAPI ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐŒĐŸĐŽĐ”Đ»Ń– `pydantic.v1` у ĐČашіĐč ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃ– ŃĐżŃ€ĐžŃ‡ĐžĐœĐžŃ‚ŃŒ ĐżĐŸĐŒĐžĐ»Đșу. + +Đ Đ”ŃˆŃ‚Đ° Ń†ŃŒĐŸĐłĐŸ Ń€ĐŸĐ·ĐŽŃ–Đ»Ńƒ ĐŸĐżĐžŃŃƒŃ” Ń‚ĐžĐŒŃ‡Đ°ŃĐŸĐČу ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу, ĐŽĐŸŃŃ‚ŃƒĐżĐœŃƒ лОшД ĐČ Ń‚ĐžŃ… старішох ĐČĐ”Ń€ŃŃ–ŃŃ…. + +/// + ĐŸĐŸŃ‡ĐžĐœĐ°ŃŽŃ‡Đž Đ· FastAPI 0.119.0, таĐșĐŸĐ¶ є частĐșĐŸĐČа ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа Pydantic v1 ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– Pydantic v2, Ń‰ĐŸĐ± ŃĐżŃ€ĐŸŃŃ‚ĐžŃ‚Đž пДрДхіЎ ĐœĐ° v2. ĐąĐŸĐ¶ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐœĐŸĐČото Pydantic ĐŽĐŸ ĐŸŃŃ‚Đ°ĐœĐœŃŒĐŸŃ— ĐČДрсії 2 і Đ·ĐŒŃ–ĐœĐžŃ‚Đž Ń–ĐŒĐżĐŸŃ€Ń‚Đž ĐœĐ° ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐżŃ–ĐŽĐŒĐŸĐŽŃƒĐ»Ń `pydantic.v1`, і ĐČ Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… ĐČОпаЎĐșах усД ĐżŃ€ĐŸŃŃ‚ĐŸ запрацює. @@ -122,6 +134,12 @@ graph TB ### ĐŸĐŸĐșŃ€ĐŸĐșĐŸĐČа ĐŒŃ–ĐłŃ€Đ°Ń†Ń–Ń { #migrate-in-steps } +/// warning | ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐ¶Đ”ĐœĐœŃ + +ĐŸĐŸŃŃ‚ŃƒĐżĐŸĐČа ĐŒŃ–ĐłŃ€Đ°Ń†Ń–Ń Đ· ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃĐŒ ĐŒĐŸĐŽĐ”Đ»Đ”Đč Pydantic v1 і v2 ĐČ ĐŸĐŽĐœŃ–Đč ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃ–, ĐŸĐżĐžŃĐ°ĐœĐ° ĐœĐžĐ¶Ń‡Đ”, працює лОшД у **FastAPI 0.119.0 ĐŽĐŸ 0.127.x**. Її Đ±ŃƒĐ»ĐŸ ĐČĐžĐŽĐ°Đ»Đ”ĐœĐŸ у **FastAPI 0.128.0**, ĐœĐ°ĐčĐœĐŸĐČіші ĐČДрсії ĐČĐžĐŒĐ°ĐłĐ°ŃŽŃ‚ŃŒ ĐŒĐŸĐŽĐ”Đ»Đ”Đč **Pydantic v2**. + +/// + /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° ĐĄĐżĐ”Ń€ŃˆŃƒ ŃĐżŃ€ĐŸĐ±ŃƒĐčтД `bump-pydantic`: яĐșŃ‰ĐŸ ĐČаші тДстО ĐżŃ€ĐŸŃ…ĐŸĐŽŃŃ‚ŃŒ і ĐČсД працює - ĐČĐž ĐČĐżĐŸŃ€Đ°Đ»ĐžŃŃ ĐŸĐŽĐœŃ–Ń”ŃŽ ĐșĐŸĐŒĐ°ĐœĐŽĐŸŃŽ. ✹ diff --git a/docs/uk/docs/how-to/separate-openapi-schemas.md b/docs/uk/docs/how-to/separate-openapi-schemas.md index 3903aac7f..3e9baead6 100644 --- a/docs/uk/docs/how-to/separate-openapi-schemas.md +++ b/docs/uk/docs/how-to/separate-openapi-schemas.md @@ -2,7 +2,7 @@ ВіЮĐșĐŸĐ»Đž ĐČĐžĐčŃˆĐŸĐČ **Pydantic v2**, Đ·ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœĐžĐč OpenAPI стаĐČ Ń‚Ń€ĐŸŃ…Đž Ń‚ĐŸŃ‡ĐœŃ–ŃˆĐžĐŒ і Đ±Ń–Đ»ŃŒŃˆ **ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐžĐŒ**, ĐœŃ–Đ¶ Ń€Đ°ĐœŃ–ŃˆĐ”. 😎 -НаспраĐČЮі ĐżĐŸĐŽĐ”ĐșуЎО буЎД ĐœĐ°ĐČіть **ĐŽĐČі ŃŃ…Đ”ĐŒĐž JSON** ĐČ OpenAPI ĐŽĐ»Ń тієї ŃĐ°ĐŒĐŸŃ— ĐŒĐŸĐŽĐ”Đ»Ń– Pydantic: ĐŽĐ»Ń ĐČĐČĐ”ĐŽĐ”ĐœĐœŃ та ĐŽĐ»Ń ĐČĐžĐČĐ”ĐŽĐ”ĐœĐœŃ - Đ·Đ°Đ»Đ”Đ¶ĐœĐŸ ĐČіЮ ĐœĐ°ŃĐČĐœĐŸŃŃ‚Ń– Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ. +НаспраĐČЮі ĐżĐŸĐŽĐ”ĐșуЎО буЎД ĐœĐ°ĐČіть **ĐŽĐČі ĐĄŃ…Đ”ĐŒĐž JSON** ĐČ OpenAPI ĐŽĐ»Ń тієї ŃĐ°ĐŒĐŸŃ— ĐŒĐŸĐŽĐ”Đ»Ń– Pydantic: ĐŽĐ»Ń ĐČĐČĐ”ĐŽĐ”ĐœĐœŃ та ĐŽĐ»Ń ĐČĐžĐČĐ”ĐŽĐ”ĐœĐœŃ - Đ·Đ°Đ»Đ”Đ¶ĐœĐŸ ĐČіЮ ĐœĐ°ŃĐČĐœĐŸŃŃ‚Ń– **Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ**. Đ ĐŸĐ·ĐłĐ»ŃĐœŃŒĐŒĐŸ, яĐș цД працює, і яĐș цД Đ·ĐŒŃ–ĐœĐžŃ‚Đž за ĐżĐŸŃ‚Ń€Đ”Đ±Đž. @@ -18,7 +18,7 @@ {* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:15] hl[14] *} -â€ŠŃ‚ĐŸĐŽŃ– ĐżĐŸĐ»Đ” `description` ĐœĐ” буЎД ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ, аЎжД ĐČĐŸĐœĐŸ ĐŒĐ°Ń” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `None`. +â€ŠŃ‚ĐŸĐŽŃ– ĐżĐŸĐ»Đ” `description` **ĐœĐ” буЎД ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ**. АЎжД ĐČĐŸĐœĐŸ ĐŒĐ°Ń” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `None`. ### ĐœĐŸĐŽĐ”Đ»ŃŒ ĐŽĐ»Ń ĐČĐČĐ”ĐŽĐ”ĐœĐœŃ ĐČ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— { #input-model-in-docs } @@ -34,7 +34,7 @@ {* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py hl[19] *} -â€ŠŃ‚ĐŸĐŽŃ–, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž `description` ĐŒĐ°Ń” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ, яĐșŃ‰ĐŸ ĐČĐž ĐœŃ–Ń‡ĐŸĐłĐŸ ĐœĐ” ĐżĐŸĐČĐ”Ń€ĐœĐ”Ń‚Đ” ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ ĐżĐŸĐ»Ń, ĐČĐŸĐœĐŸ ĐČсД ĐŸĐŽĐœĐŸ ĐŒĐ°Ń‚ĐžĐŒĐ” цД **Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ**. +â€ŠŃ‚ĐŸĐŽŃ–, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž `description` ĐŒĐ°Ń” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ, яĐșŃ‰ĐŸ ĐČĐž **ĐœŃ–Ń‡ĐŸĐłĐŸ ĐœĐ” ĐżĐŸĐČĐ”Ń€ĐœĐ”Ń‚Đ”** ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ ĐżĐŸĐ»Ń, ĐČĐŸĐœĐŸ ĐČсД ĐŸĐŽĐœĐŸ ĐŒĐ°Ń‚ĐžĐŒĐ” цД **Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ**. ### ĐœĐŸĐŽĐ”Đ»ŃŒ ĐŽĐ»Ń ĐŽĐ°ĐœĐžŃ… ĐČŃ–ĐŽĐżĐŸĐČіЮі про ĐČĐžĐČĐ”ĐŽĐ”ĐœĐœŃ– { #model-for-output-response-data } @@ -51,12 +51,13 @@ ĐŁ OpenAPI цД ĐŸĐżĐžŃŃƒŃ”Ń‚ŃŒŃŃ Ń‚ĐžĐŒ, Ń‰ĐŸ ĐżĐŸĐ»Đ” ĐżĐŸĐ·ĐœĐ°Ń‡Đ°Ń”Ń‚ŃŒŃŃ яĐș **ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐ”**, аЎжД ĐČĐŸĐœĐŸ заĐČжЎО ĐżŃ€ĐžŃŃƒŃ‚ĐœŃ”. ĐąĐŸĐŒŃƒ ĐĄŃ…Đ”ĐŒĐ° JSON ĐŽĐ»Ń ĐŒĐŸĐŽĐ”Đ»Ń– ĐŒĐŸĐ¶Đ” ĐČŃ–ĐŽŃ€Ń–Đ·ĐœŃŃ‚ĐžŃŃ Đ·Đ°Đ»Đ”Đ¶ĐœĐŸ ĐČіЮ Ń‚ĐŸĐłĐŸ, чо ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ĐČĐŸĐœĐ° ĐŽĐ»Ń **ĐČĐČĐ”ĐŽĐ”ĐœĐœŃ Đ°Đ±ĐŸ ĐČĐžĐČĐ”ĐŽĐ”ĐœĐœŃ**: -- ĐŽĐ»Ń **ĐČĐČĐ”ĐŽĐ”ĐœĐœŃ** `description` ĐœĐ” буЎД ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ -- ĐŽĐ»Ń **ĐČĐžĐČĐ”ĐŽĐ”ĐœĐœŃ** ĐČĐŸĐœĐŸ буЎД **ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ** (і ĐŒĐŸĐ¶Đ»ĐžĐČĐŸ `None`, Đ°Đ±ĐŸ ĐČ Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Ń… JSON - `null`) + +* ĐŽĐ»Ń **ĐČĐČĐ”ĐŽĐ”ĐœĐœŃ** `description` **ĐœĐ” буЎД ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ** +* ĐŽĐ»Ń **ĐČĐžĐČĐ”ĐŽĐ”ĐœĐœŃ** ĐČĐŸĐœĐŸ буЎД **ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ** (і ĐŒĐŸĐ¶Đ»ĐžĐČĐŸ `None`, Đ°Đ±ĐŸ ĐČ Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Ń… JSON - `null`) ### ĐœĐŸĐŽĐ”Đ»ŃŒ ĐŽĐ»Ń ĐČĐžĐČĐ”ĐŽĐ”ĐœĐœŃ ĐČ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— { #model-for-output-in-docs } -ĐŁ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— ĐČĐž таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” пДрДĐČірото ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐŽĐ»Ń ĐČĐžĐČĐ”ĐŽĐ”ĐœĐœŃ: **і** `name`, і `description` ĐżĐŸĐ·ĐœĐ°Ń‡Đ”ĐœŃ– яĐș **ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČі** чДрĐČĐŸĐœĐŸŃŽ Đ·Ń–Ń€ĐŸŃ‡ĐșĐŸŃŽ: +ĐŁ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— ĐČĐž таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” пДрДĐČірото ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐŽĐ»Ń ĐČĐžĐČĐ”ĐŽĐ”ĐœĐœŃ: **і** `name`, і `description` ĐżĐŸĐ·ĐœĐ°Ń‡Đ”ĐœŃ– яĐș **ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČі** **чДрĐČĐŸĐœĐŸŃŽ Đ·Ń–Ń€ĐŸŃ‡ĐșĐŸŃŽ**:
diff --git a/docs/uk/docs/index.md b/docs/uk/docs/index.md index bcc429c7e..fe7d111d7 100644 --- a/docs/uk/docs/index.md +++ b/docs/uk/docs/index.md @@ -49,7 +49,7 @@ FastAPI - цД ŃŃƒŃ‡Đ°ŃĐœĐžĐč, шĐČОЎĐșĐžĐč (ĐČĐžŃĐŸĐșĐŸĐżŃ€ĐŸĐŽŃƒĐșтоĐČ * **ĐŸŃ€ĐŸŃŃ‚ĐžĐč**: ŃĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐČĐ°ĐœĐžĐč таĐș, Ń‰ĐŸĐ± Đ±ŃƒŃ‚Đž ĐżŃ€ĐŸŃŃ‚ĐžĐŒ у ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ– та ĐČĐžĐČŃ‡Đ”ĐœĐœŃ–. ĐœĐ”ĐœŃˆĐ” часу ĐœĐ° Ń‡ĐžŃ‚Đ°ĐœĐœŃ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń—. * **ĐšĐŸŃ€ĐŸŃ‚ĐșĐžĐč**: ĐŒŃ–ĐœŃ–ĐŒŃ–Đ·ŃƒŃ” ĐŽŃƒĐ±Đ»ŃŽĐČĐ°ĐœĐœŃ ĐșĐŸĐŽŃƒ. ĐšŃ–Đ»ŃŒĐșа ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Đ”Đč Đ· ĐșĐŸĐ¶ĐœĐŸĐłĐŸ ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐœŃ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°. ĐœĐ”ĐœŃˆĐ” ĐżĐŸĐŒĐžĐ»ĐŸĐș. * **НаЮіĐčĐœĐžĐč**: ĐČĐž ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”Ń‚Đ” ĐșĐŸĐŽ, ĐłĐŸŃ‚ĐŸĐČĐžĐč ĐŽĐŸ ĐżŃ€ĐŸĐŽĐ°ĐșŃˆĐœŃƒ. З аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸŃŽ Ń–ĐœŃ‚Đ”Ń€Đ°ĐșтоĐČĐœĐŸŃŽ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń”ŃŽ. -* **Đ—Đ°ŃĐœĐŸĐČĐ°ĐœĐžĐč ĐœĐ° ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ°Ń…**: Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° (і ĐżĐŸĐČĐœŃ–ŃŃ‚ŃŽ ŃŃƒĐŒŃ–ŃĐœĐžĐč Đ·) ĐČіЮĐșŃ€ĐžŃ‚ĐžĐŒĐž ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ°ĐŒĐž ĐŽĐ»Ń API: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (Ń€Đ°ĐœŃ–ŃˆĐ” ĐČŃ–ĐŽĐŸĐŒĐžĐč яĐș Swagger) та [JSON Schema](https://json-schema.org/). +* **Đ—Đ°ŃĐœĐŸĐČĐ°ĐœĐžĐč ĐœĐ° ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ°Ń…**: Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° (і ĐżĐŸĐČĐœŃ–ŃŃ‚ŃŽ ŃŃƒĐŒŃ–ŃĐœĐžĐč Đ·) ĐČіЮĐșŃ€ĐžŃ‚ĐžĐŒĐž ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ°ĐŒĐž ĐŽĐ»Ń API: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (Ń€Đ°ĐœŃ–ŃˆĐ” ĐČŃ–ĐŽĐŸĐŒĐžĐč яĐș Swagger) та [ĐĄŃ…Đ”ĐŒĐ° JSON](https://json-schema.org/). * ĐŸŃ†Ń–ĐœĐșа ĐœĐ° ĐŸŃĐœĐŸĐČі тДстіĐČ, ĐżŃ€ĐŸĐČĐ”ĐŽĐ”ĐœĐžŃ… ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃŒĐŸŃŽ ĐșĐŸĐŒĐ°ĐœĐŽĐŸŃŽ Ń€ĐŸĐ·Ń€ĐŸĐ±ĐœĐžĐșіĐČ, Ń‰ĐŸ стĐČĐŸŃ€ŃŽŃ” ĐżŃ€ĐŸĐŽĐ°ĐșŃˆĐœ-Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž. @@ -105,47 +105,47 @@ FastAPI - цД ŃŃƒŃ‡Đ°ŃĐœĐžĐč, шĐČОЎĐșĐžĐč (ĐČĐžŃĐŸĐșĐŸĐżŃ€ĐŸĐŽŃƒĐșтоĐČ
-
«Я ЎужД Ń‡Đ°ŃŃ‚ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČую FastAPI ĐŸŃŃ‚Đ°ĐœĐœŃ–ĐŒ Ń‡Đ°ŃĐŸĐŒ. ĐŻ ĐœĐ°ŃĐżŃ€Đ°ĐČЮі ĐżĐ»Đ°ĐœŃƒŃŽ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐčĐŸĐłĐŸ ĐŽĐ»Ń ĐČсіх ML-сДрĐČісіĐČ ĐŒĐŸŃ”Ń— ĐșĐŸĐŒĐ°ĐœĐŽĐž ĐČ Microsoft. Đ”Đ”ŃĐșі Đ· ĐœĐžŃ… Ń–ĐœŃ‚Đ”ĐłŃ€ŃƒŃŽŃ‚ŃŒŃŃ ĐŽĐŸ ĐŸŃĐœĐŸĐČĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐŽŃƒĐșту Windows і ĐŽĐ”ŃĐșі Đ· ĐżŃ€ĐŸĐŽŃƒĐșтіĐČ Office».
-
— Kabir Khan, Microsoft (ref)
+
«Я ЎужД Ń‡Đ°ŃŃ‚ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČую FastAPI ĐŸŃŃ‚Đ°ĐœĐœŃ–ĐŒ Ń‡Đ°ŃĐŸĐŒ. ĐŻ ĐœĐ°ŃĐżŃ€Đ°ĐČЮі ĐżĐ»Đ°ĐœŃƒŃŽ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐčĐŸĐłĐŸ ĐŽĐ»Ń ĐČсіх ML-сДрĐČісіĐČ ĐŒĐŸŃ”Ń— ĐșĐŸĐŒĐ°ĐœĐŽĐž ĐČ Microsoft. Đ”Đ”ŃĐșі Đ· ĐœĐžŃ… Ń–ĐœŃ‚Đ”ĐłŃ€ŃƒŃŽŃ‚ŃŒŃŃ ĐŽĐŸ ĐŸŃĐœĐŸĐČĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐŽŃƒĐșту Windows і ĐŽĐ”ŃĐșох ĐżŃ€ĐŸĐŽŃƒĐșтіĐČ Office».
+
- Kabir Khan, Microsoft (ĐŽĐ¶Đ”Ń€Đ”Đ»ĐŸ)
-"_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._" +"_[...] ĐŻ ЎужД Ń‡Đ°ŃŃ‚ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČую **FastAPI** ĐŸŃŃ‚Đ°ĐœĐœŃ–ĐŒ Ń‡Đ°ŃĐŸĐŒ. [...] ĐŻ ĐœĐ°ŃĐżŃ€Đ°ĐČЮі ĐżĐ»Đ°ĐœŃƒŃŽ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐčĐŸĐłĐŸ ĐŽĐ»Ń ĐČсіх **ML-сДрĐČісіĐČ ĐŒĐŸŃ”Ń— ĐșĐŸĐŒĐ°ĐœĐŽĐž ĐČ Microsoft**. Đ”Đ”ŃĐșі Đ· ĐœĐžŃ… Ń–ĐœŃ‚Đ”ĐłŃ€ŃƒŃŽŃ‚ŃŒŃŃ ĐŽĐŸ ĐŸŃĐœĐŸĐČĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐŽŃƒĐșту **Windows** і ĐŽĐ”ŃĐșох ĐżŃ€ĐŸĐŽŃƒĐșтіĐČ **Office**._" -
Kabir Khan - Microsoft (ref)
+
Kabir Khan - Microsoft (ĐŽĐ¶Đ”Ń€Đ”Đ»ĐŸ)
--- -"_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_" +"_Мо проĐčĐœŃĐ»Đž Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșу **FastAPI**, Ń‰ĐŸĐ± Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž сДрĐČДр **REST**, ĐŽĐŸ яĐșĐŸĐłĐŸ ĐŒĐŸĐ¶ĐœĐ° ĐœĐ°ĐŽŃĐžĐ»Đ°Ń‚Đž запОтО ĐŽĐ»Ń ĐŸŃ‚Ń€ĐžĐŒĐ°ĐœĐœŃ **ĐżŃ€ĐŸĐłĐœĐŸĐ·Ń–ĐČ**. [ĐŽĐ»Ń Ludwig]_" -
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
+
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ĐŽĐ¶Đ”Ń€Đ”Đ»ĐŸ)
--- -"_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_" +"_**Netflix** Ń–Đ· Đ·Đ°ĐŽĐŸĐČĐŸĐ»Đ”ĐœĐœŃĐŒ ĐŸĐłĐŸĐ»ĐŸŃˆŃƒŃ” ĐżŃ€ĐŸ ĐČОпусĐș Đ· ĐČіЮĐșŃ€ĐžŃ‚ĐžĐŒ ĐșĐŸĐŽĐŸĐŒ ĐœĐ°ŃˆĐŸĐłĐŸ фрДĐčĐŒĐČĐŸŃ€Đșу ĐŸŃ€ĐșДстрації **ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐșŃ€ĐžĐ·Đ°ĐŒĐž**: **Dispatch**! [ĐżĐŸĐ±ŃƒĐŽĐŸĐČĐ°ĐœĐŸ Đ· **FastAPI**]_" -
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ĐŽĐ¶Đ”Ń€Đ”Đ»ĐŸ)
--- -"_If anyone is looking to build a production Python API, I would highly recommend **FastAPI**. It is **beautifully designed**, **simple to use** and **highly scalable**, it has become a **key component** in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer._" +"_ĐŻĐșŃ‰ĐŸ Ń…Ń‚ĐŸŃŃŒ Ń…ĐŸŃ‡Đ” стĐČĐŸŃ€ŃŽĐČато ĐżŃ€ĐŸĐŽĐ°ĐșŃˆĐœ-API ĐœĐ° Python, я ЎужД рДĐșĐŸĐŒĐ”ĐœĐŽŃƒŃŽ **FastAPI**. Đ’Ń–Đœ **Ń‡ŃƒĐŽĐŸĐČĐŸ ŃĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐČĐ°ĐœĐžĐč**, **ĐżŃ€ĐŸŃŃ‚ĐžĐč у ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ–** і **ЎужД ĐŒĐ°ŃŃˆŃ‚Đ°Đ±ĐŸĐČĐ°ĐœĐžĐč**, ĐČŃ–Đœ стаĐČ **ĐșĐ»ŃŽŃ‡ĐŸĐČĐžĐŒ ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚ĐŸĐŒ** у ĐœĐ°ŃˆŃ–Đč стратДгії Ń€ĐŸĐ·Ń€ĐŸĐ±ĐșĐž Đ· ĐżŃ€Ń–ĐŸŃ€ĐžŃ‚Đ”Ń‚ĐŸĐŒ API і Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡ŃƒŃ” Đ±Đ°ĐłĐ°Ń‚ĐŸ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžĐ·Đ°Ń†Ń–Đč та сДрĐČісіĐČ, яĐș-ĐŸŃ‚ ĐœĐ°Ńˆ Virtual TAC Engineer._" -
Deon Pillsbury - Cisco (ref)
+
Deon Pillsbury - Cisco (ĐŽĐ¶Đ”Ń€Đ”Đ»ĐŸ)
--- @@ -239,7 +239,7 @@ async def read_item(item_id: int, q: str | None = None): **ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа**: -ĐŻĐșŃ‰ĐŸ ĐČĐž ĐœĐ” Đ·ĐœĐ°Ń”Ń‚Đ”, ĐżĐ”Ń€Đ”ĐłĐ»ŃĐœŃŒŃ‚Đ” Ń€ĐŸĐ·ĐŽŃ–Đ» _"In a hurry?"_ ĐżŃ€ĐŸ [`async` та `await` у ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń—](https://fastapi.tiangolo.com/uk/async/#in-a-hurry). +ĐŻĐșŃ‰ĐŸ ĐČĐž ĐœĐ” Đ·ĐœĐ°Ń”Ń‚Đ”, ĐżĐ”Ń€Đ”ĐłĐ»ŃĐœŃŒŃ‚Đ” Ń€ĐŸĐ·ĐŽŃ–Đ» _Â«ĐŸĐŸŃĐżŃ–ŃˆĐ°Ń”Ń‚Đ”?»_ ĐżŃ€ĐŸ [`async` та `await` у ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń—](https://fastapi.tiangolo.com/uk/async/#in-a-hurry). @@ -412,10 +412,10 @@ item: Item * JSON. * ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ ŃˆĐ»ŃŃ…Ńƒ. * ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ Đ·Đ°ĐżĐžŃ‚Ńƒ. - * Cookies. - * Headers. - * Forms. - * Files. + * КуĐșі. + * Đ—Đ°ĐłĐŸĐ»ĐŸĐČĐșіĐČ. + * Đ€ĐŸŃ€ĐŒ. + * ЀаĐčліĐČ. * ĐŸĐ”Ń€Đ”Ń‚ĐČĐŸŃ€Đ”ĐœĐœŃ ĐČĐžŃ…Ń–ĐŽĐœĐžŃ… ĐŽĐ°ĐœĐžŃ…: пДрДтĐČĐŸŃ€Đ”ĐœĐœŃ Đ· ĐŽĐ°ĐœĐžŃ… і топіĐČ Python у ĐŒĐ”Ń€Đ”Đ¶Đ”ĐČі ĐŽĐ°ĐœŃ– (яĐș JSON): * ĐŸĐ”Ń€Đ”Ń‚ĐČĐŸŃ€Đ”ĐœĐœŃ топіĐČ Python (`str`, `int`, `float`, `bool`, `list`, Ń‚ĐŸŃ‰ĐŸ). * ĐžĐ±ÊŒŃ”ĐșтіĐČ `datetime`. @@ -477,10 +477,10 @@ item: Item **ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐ¶Đ”ĐœĐœŃ ĐżŃ€ĐŸ ŃĐżĐŸĐčлДр**: ĐœĐ°ĐČŃ‡Đ°Đ»ŃŒĐœĐžĐč ĐżĐŸŃŃ–Đ±ĐœĐžĐș - ĐżĐŸŃŃ–Đ±ĐœĐžĐș ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ: -* ĐžĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐœŃ **ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ** Đ· Ń–ĐœŃˆĐžŃ… Ń€Ń–Đ·ĐœĐžŃ… ĐŒŃ–ŃŃ†ŃŒ, яĐș-ĐŸŃ‚: **headers**, **cookies**, **form fields** та **files**. +* ĐžĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐœŃ **ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ** Đ· Ń–ĐœŃˆĐžŃ… Ń€Ń–Đ·ĐœĐžŃ… ĐŒŃ–ŃŃ†ŃŒ, яĐș-ĐŸŃ‚: **Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž**, **ĐșуĐșі**, **ĐżĐŸĐ»Ń Ń„ĐŸŃ€ĐŒĐž** та **фаĐčлО**. * ĐŻĐș ĐČŃŃ‚Đ°ĐœĐŸĐČлюĐČато **ĐŸĐ±ĐŒĐ”Đ¶Đ”ĐœĐœŃ ĐČаліЎації** яĐș `maximum_length` Đ°Đ±ĐŸ `regex`. * Đ”ŃƒĐ¶Đ” ĐżĐŸŃ‚ŃƒĐ¶ĐœŃƒ і ĐżŃ€ĐŸŃŃ‚Ńƒ у ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ– ŃĐžŃŃ‚Đ”ĐŒŃƒ **Đ’ĐżŃ€ĐŸĐČĐ°ĐŽĐ¶Đ”ĐœĐœŃ Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč**. -* БДзпДĐșу та аĐČŃ‚Đ”ĐœŃ‚ĐžŃ„Ń–Đșацію, ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ· ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșĐŸŃŽ **OAuth2** Đ· **JWT tokens** та **HTTP Basic** auth. +* БДзпДĐșу та аĐČŃ‚Đ”ĐœŃ‚ĐžŃ„Ń–Đșацію, ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ· ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșĐŸŃŽ **OAuth2** Đ· **Ń‚ĐŸĐșĐ”ĐœĐ°ĐŒĐž JWT** та **Đ±Đ°Đ·ĐŸĐČĐŸŃŽ аĐČŃ‚Đ”ĐœŃ‚ĐžŃ„Ń–Đșацією HTTP**. * Đ”ĐŸŃĐșĐŸĐœĐ°Đ»Ń–ŃˆŃ– (алД ĐŸĐŽĐœĐ°ĐșĐŸĐČĐŸ ĐżŃ€ĐŸŃŃ‚Ń–) Ń‚Đ”Ń…ĐœŃ–ĐșĐž ĐŽĐ»Ń ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐœŃ **ĐłĐ»ĐžĐ±ĐŸĐșĐŸ ĐČĐșĐ»Đ°ĐŽĐ”ĐœĐžŃ… ĐŒĐŸĐŽĐ”Đ»Đ”Đč JSON** (заĐČЮяĐșĐž Pydantic). * Đ†ĐœŃ‚Đ”ĐłŃ€Đ°Ń†Ń–ŃŽ **GraphQL** Đ· [Strawberry](https://strawberry.rocks) та Ń–ĐœŃˆĐžĐŒĐž Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”ĐșĐ°ĐŒĐž. * Đ‘Đ°ĐłĐ°Ń‚ĐŸ ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČох ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Đ”Đč (заĐČЮяĐșĐž Starlette) яĐș-ĐŸŃ‚: @@ -518,13 +518,13 @@ CLI аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ ĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚ŃŒ ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș FastAP Đ’Ń–Đœ ŃĐżŃ€ĐŸŃ‰ŃƒŃ” ĐżŃ€ĐŸŃ†Đ”Ń **стĐČĐŸŃ€Đ”ĐœĐœŃ**, **Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ** та **ĐŽĐŸŃŃ‚ŃƒĐżŃƒ** ĐŽĐŸ API Đ· ĐŒŃ–ĐœŃ–ĐŒĐ°Đ»ŃŒĐœĐžĐŒĐž Đ·ŃƒŃĐžĐ»Đ»ŃĐŒĐž. -Đ’Ń–Đœ Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡ŃƒŃ” Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč **developer experience** стĐČĐŸŃ€Đ”ĐœĐœŃ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ ĐœĐ° FastAPI піЮ час їх **Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ** у Ń…ĐŒĐ°Ń€Ń–. 🎉 +Đ’Ń–Đœ Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡ŃƒŃ” Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč **ĐŽĐŸŃĐČіЮ Ń€ĐŸĐ·Ń€ĐŸĐ±ĐœĐžĐșа** стĐČĐŸŃ€Đ”ĐœĐœŃ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ ĐœĐ° FastAPI піЮ час їх **Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ** у Ń…ĐŒĐ°Ń€Ń–. 🎉 -FastAPI Cloud - ĐŸŃĐœĐŸĐČĐœĐžĐč ŃĐżĐŸĐœŃĐŸŃ€ і ĐŽĐ¶Đ”Ń€Đ”Đ»ĐŸ Ń„Ń–ĐœĐ°ĐœŃŃƒĐČĐ°ĐœĐœŃ open source ĐżŃ€ĐŸŃ”ĐșтіĐČ *FastAPI and friends*. ✹ +FastAPI Cloud - ĐŸŃĐœĐŸĐČĐœĐžĐč ŃĐżĐŸĐœŃĐŸŃ€ і ĐŽĐ¶Đ”Ń€Đ”Đ»ĐŸ Ń„Ń–ĐœĐ°ĐœŃŃƒĐČĐ°ĐœĐœŃ ĐżŃ€ĐŸŃ”ĐșтіĐČ Đ· ĐČіЮĐșŃ€ĐžŃ‚ĐžĐŒ ĐșĐŸĐŽĐŸĐŒ *FastAPI and friends*. ✹ #### Đ ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ ĐČ Ń–ĐœŃˆĐžŃ… Ń…ĐŒĐ°Ń€ĐœĐžŃ… ĐżŃ€ĐŸĐČаĐčЎДріĐČ { #deploy-to-other-cloud-providers } -FastAPI - open source ĐżŃ€ĐŸŃ”Đșт і Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ°Ń…. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°Ń‚Đž Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž FastAPI ĐČ Đ±ŃƒĐŽŃŒ-яĐșĐŸĐŒŃƒ Ń…ĐŒĐ°Ń€ĐœĐŸĐŒŃƒ ĐżŃ€ĐŸĐČаĐčЎДрі, яĐșĐžĐč ĐČĐž ĐŸĐ±Đ”Ń€Đ”Ń‚Đ”. +FastAPI - ĐżŃ€ĐŸŃ”Đșт Đ· ĐČіЮĐșŃ€ĐžŃ‚ĐžĐŒ ĐșĐŸĐŽĐŸĐŒ і Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ°Ń…. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°Ń‚Đž Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž FastAPI ĐČ Đ±ŃƒĐŽŃŒ-яĐșĐŸĐŒŃƒ Ń…ĐŒĐ°Ń€ĐœĐŸĐŒŃƒ ĐżŃ€ĐŸĐČаĐčЎДрі, яĐșĐžĐč ĐČĐž ĐŸĐ±Đ”Ń€Đ”Ń‚Đ”. Đ”ĐŸŃ‚Ń€ĐžĐŒŃƒĐčŃ‚Đ”ŃŃ Ń–ĐœŃŃ‚Ń€ŃƒĐșціĐč ĐČĐ°ŃˆĐŸĐłĐŸ Ń…ĐŒĐ°Ń€ĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐČаĐčЎДра, Ń‰ĐŸĐ± Ń€ĐŸĐ·ĐłĐŸŃ€ĐœŃƒŃ‚Đž Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž FastAPI у ĐœŃŒĐŸĐłĐŸ. đŸ€“ @@ -532,7 +532,7 @@ FastAPI - open source ĐżŃ€ĐŸŃ”Đșт і Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ° ĐĐ”Đ·Đ°Đ»Đ”Đ¶ĐœŃ– тДстО TechEmpower ĐżĐŸĐșĐ°Đ·ŃƒŃŽŃ‚ŃŒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž **FastAPI**, яĐșі працюють піЮ ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃĐŒ Uvicorn, яĐș [ĐŸĐŽĐœŃ– Đ· ĐœĐ°ĐčшĐČоЮшох ĐŽĐŸŃŃ‚ŃƒĐżĐœĐžŃ… Python-фрДĐčĐŒĐČĐŸŃ€ĐșіĐČ](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), ĐżĐŸŃŃ‚ŃƒĐżĐ°ŃŽŃ‡ĐžŃŃŒ лОшД Starlette та Uvicorn (яĐșі ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃŒĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуються ĐČ FastAPI). (*) -Đ©ĐŸĐ± ĐŽŃ–Đ·ĐœĐ°Ń‚ĐžŃŃ Đ±Ń–Đ»ŃŒŃˆĐ”, ĐżĐ”Ń€Đ”ĐłĐ»ŃĐœŃŒŃ‚Đ” Ń€ĐŸĐ·ĐŽŃ–Đ» [Benchmarks](https://fastapi.tiangolo.com/uk/benchmarks/). +Đ©ĐŸĐ± ĐŽŃ–Đ·ĐœĐ°Ń‚ĐžŃŃ Đ±Ń–Đ»ŃŒŃˆĐ”, ĐżĐ”Ń€Đ”ĐłĐ»ŃĐœŃŒŃ‚Đ” Ń€ĐŸĐ·ĐŽŃ–Đ» [йДстО ĐżŃ€ĐŸĐŽŃƒĐșтоĐČĐœĐŸŃŃ‚Ń–](https://fastapi.tiangolo.com/uk/benchmarks/). ## Đ—Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– { #dependencies } diff --git a/docs/uk/docs/project-generation.md b/docs/uk/docs/project-generation.md index 6e3781740..e4e825607 100644 --- a/docs/uk/docs/project-generation.md +++ b/docs/uk/docs/project-generation.md @@ -1,5 +1,6 @@ # ĐšĐ°Đ±Đ»ĐŸĐœ Full Stack FastAPI { #full-stack-fastapi-template } + ĐšĐ°Đ±Đ»ĐŸĐœĐž, Ń…ĐŸŃ‡Đ° зазĐČочаĐč ĐżĐŸŃŃ‚Đ°Ń‡Đ°ŃŽŃ‚ŃŒŃŃ Đ· пДĐČĐœĐžĐŒ ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃĐŒ, ŃĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐČĐ°ĐœŃ– Đ±ŃƒŃ‚Đž ĐłĐœŃƒŃ‡ĐșĐžĐŒĐž та ĐœĐ°Đ»Đ°ŃˆŃ‚ĐŸĐČуĐČĐ°ĐœĐžĐŒĐž. ĐŠĐ” Юає Đ·ĐŒĐŸĐłŃƒ Đ·ĐŒŃ–ĐœŃŽĐČато їх і аЮаптуĐČато ĐŽĐŸ ĐČĐžĐŒĐŸĐł ĐČĐ°ŃˆĐŸĐłĐŸ ĐżŃ€ĐŸŃ”Đșту, Ń‰ĐŸ Ń€ĐŸĐ±ĐžŃ‚ŃŒ їх Ń‡ŃƒĐŽĐŸĐČĐŸŃŽ ĐČіЮпраĐČĐœĐŸŃŽ Ń‚ĐŸŃ‡ĐșĐŸŃŽ. 🏁 Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž цДĐč ŃˆĐ°Đ±Đ»ĐŸĐœ ĐŽĐ»Ń старту, аЎжД ĐČ ĐœŃŒĐŸĐŒŃƒ ĐČжД ĐČĐžĐșĐŸĐœĐ°ĐœĐŸ Đ·ĐœĐ°Ń‡ĐœŃƒ Ń‡Đ°ŃŃ‚ĐžĐœŃƒ ĐżĐŸŃ‡Đ°Ń‚ĐșĐŸĐČĐŸĐłĐŸ ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ, бДзпДĐșĐž, Ń€ĐŸĐ±ĐŸŃ‚Đž Đ· Đ±Đ°Đ·ĐŸŃŽ ĐŽĐ°ĐœĐžŃ… і ĐŽĐ”ŃĐșох ĐșŃ–ĐœŃ†Đ”ĐČох Ń‚ĐŸŃ‡ĐŸĐș API. diff --git a/docs/uk/docs/python-types.md b/docs/uk/docs/python-types.md index 332d78f21..06cc67f02 100644 --- a/docs/uk/docs/python-types.md +++ b/docs/uk/docs/python-types.md @@ -2,7 +2,7 @@ Python ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃ” ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČі «піЎĐșазĐșĐž топіĐČ» (таĐșĐŸĐ¶ Đ·ĐČĐ°ĐœŃ– Â«Đ°ĐœĐŸŃ‚Đ°Ń†Ń–ŃĐŒĐž топіĐČ»). -Щі **«піЎĐșазĐșĐž топіĐČ»** Đ°Đ±ĐŸ Đ°ĐœĐŸŃ‚Đ°Ń†Ń–Ń— — цД ŃĐżĐ”Ń†Ń–Đ°Đ»ŃŒĐœĐžĐč ŃĐžĐœŃ‚Đ°ĐșсОс, Ń‰ĐŸ ĐŽĐŸĐ·ĐČĐŸĐ»ŃŃ” ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐČато топ Đ·ĐŒŃ–ĐœĐœĐŸŃ—. +Щі **«піЎĐșазĐșĐž топіĐČ»** Đ°Đ±ĐŸ Đ°ĐœĐŸŃ‚Đ°Ń†Ń–Ń— - цД ŃĐżĐ”Ń†Ń–Đ°Đ»ŃŒĐœĐžĐč ŃĐžĐœŃ‚Đ°ĐșсОс, Ń‰ĐŸ ĐŽĐŸĐ·ĐČĐŸĐ»ŃŃ” ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐČато топ Đ·ĐŒŃ–ĐœĐœĐŸŃ—. За ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐœŃ топіĐČ ĐŽĐ»Ń ĐČашох Đ·ĐŒŃ–ĐœĐœĐžŃ… рДЎаĐșŃ‚ĐŸŃ€Đž та Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ ĐœĐ°ĐŽĐ°Ń‚Đž ĐČĐ°ĐŒ Đșращу ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу. @@ -50,7 +50,7 @@ John Doe ĐŠĐ” буЎД `upper`? ЧО `uppercase`? `first_uppercase`? `capitalize`? -ĐąĐŸĐŽŃ– ĐČĐž ŃĐżŃ€ĐŸĐ±ŃƒŃ”Ń‚Đ” ЎаĐČĐœŃŒĐŸĐłĐŸ Юруга ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃ–ŃŃ‚Đ° — аĐČŃ‚ĐŸĐ·Đ°ĐżĐŸĐČĐœĐ”ĐœĐœŃ рДЎаĐșŃ‚ĐŸŃ€Đ° ĐșĐŸĐŽŃƒ. +ĐąĐŸĐŽŃ– ĐČĐž ŃĐżŃ€ĐŸĐ±ŃƒŃ”Ń‚Đ” ЎаĐČĐœŃŒĐŸĐłĐŸ Юруга ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃ–ŃŃ‚Đ° - аĐČŃ‚ĐŸĐ·Đ°ĐżĐŸĐČĐœĐ”ĐœĐœŃ рДЎаĐșŃ‚ĐŸŃ€Đ° ĐșĐŸĐŽŃƒ. Во ĐœĐ°ĐŽŃ€ŃƒĐșŃƒŃ”Ń‚Đ” ĐżĐ”Ń€ŃˆĐžĐč ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Ń„ŃƒĐœĐșції, `first_name`, Ń‚ĐŸĐŽŃ– ĐșрапĐșу (`.`), а Ń‚ĐŸĐŽŃ– ĐœĐ°Ń‚ĐžŃĐœĐ”Ń‚Đ” `Ctrl+Space`, Ń‰ĐŸĐ± Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž аĐČŃ‚ĐŸĐ·Đ°ĐżĐŸĐČĐœĐ”ĐœĐœŃ. @@ -147,20 +147,20 @@ def some_function(data: Any): print(data) ``` -### Generic топо { #generic-types } +### ĐŁĐ·Đ°ĐłĐ°Đ»ŃŒĐœĐ”ĐœŃ– топо { #generic-types } Đ”Đ”ŃĐșі топо ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ проĐčĐŒĐ°Ń‚Đž Â«ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž топіĐČ» у ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœĐžŃ… ЎужĐșах, Ń‰ĐŸĐ± ĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚Đž їх ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃ– топо. НапроĐșлаЎ, «list ŃŃ‚Ń€ĐŸĐș» буЎД ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐžĐč яĐș `list[str]`. -Щі топо, яĐșі ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ проĐčĐŒĐ°Ń‚Đž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž топіĐČ, ĐœĐ°Đ·ĐžĐČаються **generic Ń‚ĐžĐżĐ°ĐŒĐž** Đ°Đ±ĐŸ **generics**. +Щі топо, яĐșі ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ проĐčĐŒĐ°Ń‚Đž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž топіĐČ, ĐœĐ°Đ·ĐžĐČаються **ŃƒĐ·Đ°ĐłĐ°Đ»ŃŒĐœĐ”ĐœĐžĐŒĐž Ń‚ĐžĐżĐ°ĐŒĐž** Đ°Đ±ĐŸ **ĐŽĐ¶Đ”ĐœĐ”Ń€ĐžĐșĐ°ĐŒĐž**. -Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ті ŃĐ°ĐŒŃ– ĐČĐ±ŃƒĐŽĐŸĐČĐ°ĐœŃ– топо яĐș generics (Đ· ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœĐžĐŒĐž ЎужĐșĐ°ĐŒĐž та Ń‚ĐžĐżĐ°ĐŒĐž ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ–): +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ті ŃĐ°ĐŒŃ– ĐČĐ±ŃƒĐŽĐŸĐČĐ°ĐœŃ– топо яĐș ĐŽĐ¶Đ”ĐœĐ”Ń€ĐžĐșĐž (Đ· ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœĐžĐŒĐž ЎужĐșĐ°ĐŒĐž та Ń‚ĐžĐżĐ°ĐŒĐž ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ–): * `list` * `tuple` * `set` * `dict` -#### List { #list } +#### ĐĄĐżĐžŃĐŸĐș { #list } НапроĐșлаЎ, ЎаĐČаĐčтД ĐČĐžĐ·ĐœĐ°Ń‡ĐžĐŒĐŸ Đ·ĐŒŃ–ĐœĐœŃƒ, яĐșа буЎД `list` Ń–Đ· `str`. @@ -176,11 +176,11 @@ def some_function(data: Any): Щі ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃ– топо ĐČ ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐœĐžŃ… ЎужĐșах ĐœĐ°Đ·ĐžĐČаються Â«ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒĐž Ń‚ĐžĐżŃƒÂ». -ĐŁ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу `str` — цД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ топу, ĐżĐ”Ń€Đ”ĐŽĐ°ĐœĐžĐč у `list`. +ĐŁ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу `str` - цД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ топу, ĐżĐ”Ń€Đ”ĐŽĐ°ĐœĐžĐč у `list`. /// -ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”: Â«Đ·ĐŒŃ–ĐœĐœĐ° `items` — цД `list`, і ĐșĐŸĐ¶Đ”Đœ Đ· Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚Ń–ĐČ Ńƒ Ń†ŃŒĐŸĐŒŃƒ спОсĐșу — `str`». +ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”: Â«Đ·ĐŒŃ–ĐœĐœĐ° `items` - цД `list`, і ĐșĐŸĐ¶Đ”Đœ Đ· Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚Ń–ĐČ Ńƒ Ń†ŃŒĐŸĐŒŃƒ спОсĐșу - `str`». Đ—Ń€ĐŸĐ±ĐžĐČшО цД, ĐČаш рДЎаĐșŃ‚ĐŸŃ€ ĐŒĐŸĐ¶Đ” ĐœĐ°ĐŽĐ°Ń‚Đž ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу ĐœĐ°ĐČіть піЮ час ĐŸĐ±Ń€ĐŸĐ±ĐșĐž Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚Ń–ĐČ Đ·Ń– спОсĐșу: @@ -192,7 +192,7 @@ def some_function(data: Any): І ĐČсД ж рДЎаĐșŃ‚ĐŸŃ€ Đ·ĐœĐ°Ń”, Ń‰ĐŸ цД `str`, і ĐœĐ°ĐŽĐ°Ń” ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ. -#### Tuple and Set { #tuple-and-set } +#### ĐšĐŸŃ€Ń‚Đ”Đ¶ і ĐŒĐœĐŸĐ¶ĐžĐœĐ° { #tuple-and-set } Во ĐżĐŸĐČĐžĐœĐœŃ– Đ·Ń€ĐŸĐ±ĐžŃ‚Đž тД ж ŃĐ°ĐŒĐ”, Ń‰ĐŸĐ± ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž `tuple` і `set`: @@ -200,10 +200,10 @@ def some_function(data: Any): ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”: -* Đ—ĐŒŃ–ĐœĐœĐ° `items_t` — цД `tuple` Đ· 3 Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚Đ°ĐŒĐž: `int`, щД `int`, та `str`. -* Đ—ĐŒŃ–ĐœĐœĐ° `items_s` — цД `set`, і ĐșĐŸĐ¶Đ”Đœ ĐčĐŸĐłĐŸ Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚ ĐŒĐ°Ń” топ `bytes`. +* Đ—ĐŒŃ–ĐœĐœĐ° `items_t` - цД `tuple` Đ· 3 Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚Đ°ĐŒĐž: `int`, щД `int`, та `str`. +* Đ—ĐŒŃ–ĐœĐœĐ° `items_s` - цД `set`, і ĐșĐŸĐ¶Đ”Đœ ĐčĐŸĐłĐŸ Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚ ĐŒĐ°Ń” топ `bytes`. -#### Dict { #dict } +#### ĐĄĐ»ĐŸĐČĐœĐžĐș { #dict } Đ©ĐŸĐ± ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž `dict`, ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ пДрДЎатО 2 ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž топу, Ń€ĐŸĐ·ĐŽŃ–Đ»Đ”ĐœŃ– ĐșĐŸĐŒĐ°ĐŒĐž. @@ -215,17 +215,17 @@ def some_function(data: Any): ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”: -* Đ—ĐŒŃ–ĐœĐœĐ° `prices` — цД `dict`: +* Đ—ĐŒŃ–ĐœĐœĐ° `prices` - цД `dict`: * Ключі Ń†ŃŒĐŸĐłĐŸ `dict` ĐŒĐ°ŃŽŃ‚ŃŒ топ `str` (сĐșĐ°Đ¶Ń–ĐŒĐŸ, ĐœĐ°Đ·ĐČа ĐșĐŸĐ¶ĐœĐŸĐłĐŸ ĐżŃ€Đ”ĐŽĐŒĐ”Ń‚Đ°). * Đ—ĐœĐ°Ń‡Đ”ĐœĐœŃ Ń†ŃŒĐŸĐłĐŸ `dict` ĐŒĐ°ŃŽŃ‚ŃŒ топ `float` (сĐșĐ°Đ¶Ń–ĐŒĐŸ, Ń†Ń–ĐœĐ° ĐșĐŸĐ¶ĐœĐŸĐłĐŸ ĐżŃ€Đ”ĐŽĐŒĐ”Ń‚Đ°). -#### Union { #union } +#### ĐžĐ±â€™Ń”ĐŽĐœĐ°ĐœĐœŃ { #union } Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž, Ń‰ĐŸ Đ·ĐŒŃ–ĐœĐœĐ° ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž Đ±ŃƒĐŽŃŒ-яĐșĐžĐŒ Ń–Đ· **ĐșŃ–Đ»ŃŒĐșĐŸŃ… топіĐČ**, ĐœĐ°ĐżŃ€ĐžĐșлаЎ `int` Đ°Đ±ĐŸ `str`. Đ©ĐŸĐ± ĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚Đž цД, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД ĐČДртОĐșĐ°Đ»ŃŒĐœŃƒ росĐșу (`|`), Ń‰ĐŸĐ± Ń€ĐŸĐ·ĐŽŃ–Đ»ĐžŃ‚Đž ĐŸĐ±ĐžĐŽĐČа топо. -ĐŠĐ” ĐœĐ°Đ·ĐžĐČається «union», Ń‚ĐŸĐŒŃƒ Ń‰ĐŸ Đ·ĐŒŃ–ĐœĐœĐ° ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž Ń‡ĐžĐŒĐŸŃŃŒ Ń–Đ· ĐŸĐ±â€™Ń”ĐŽĐœĐ°ĐœĐœŃ цох ĐŽĐČĐŸŃ… ĐŒĐœĐŸĐ¶ĐžĐœ топіĐČ. +ĐŠĐ” ĐœĐ°Đ·ĐžĐČається Â«ĐŸĐ±â€™Ń”ĐŽĐœĐ°ĐœĐœŃĐŒÂ», Ń‚ĐŸĐŒŃƒ Ń‰ĐŸ Đ·ĐŒŃ–ĐœĐœĐ° ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž Ń‡ĐžĐŒĐŸŃŃŒ Ń–Đ· ĐŸĐ±â€™Ń”ĐŽĐœĐ°ĐœĐœŃ цох ĐŽĐČĐŸŃ… ĐŒĐœĐŸĐ¶ĐžĐœ топіĐČ. ```Python hl_lines="1" {!> ../../docs_src/python_types/tutorial008b_py310.py!} @@ -263,11 +263,11 @@ def some_function(data: Any): -ЗĐČĐ”Ń€ĐœŃ–Ń‚ŃŒ уĐČагу, Ń‰ĐŸ цД ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”: «`one_person` — цД **Đ”ĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€** Đșласу `Person`». +ЗĐČĐ”Ń€ĐœŃ–Ń‚ŃŒ уĐČагу, Ń‰ĐŸ цД ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”: «`one_person` - цД **Đ”ĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€** Đșласу `Person`». -ĐŠĐ” ĐœĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”: «`one_person` — цД **Đșлас** Đ· ĐœĐ°Đ·ĐČĐŸŃŽ `Person`». +ĐŠĐ” ĐœĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”: «`one_person` - цД **Đșлас** Đ· ĐœĐ°Đ·ĐČĐŸŃŽ `Person`». -## Pydantic ĐŒĐŸĐŽĐ”Đ»Ń– { #pydantic-models } +## ĐœĐŸĐŽĐ”Đ»Ń– Pydantic { #pydantic-models } [Pydantic](https://docs.pydantic.dev/) — цД Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșа Python ĐŽĐ»Ń ĐČаліЎації ĐŽĐ°ĐœĐžŃ…. @@ -295,7 +295,7 @@ def some_function(data: Any): ## ПіЮĐșазĐșĐž топіĐČ Đ· Đ°ĐœĐŸŃ‚Đ°Ń†Ń–ŃĐŒĐž ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐžŃ… { #type-hints-with-metadata-annotations } -ĐŁ Python таĐșĐŸĐ¶ є ĐŒĐŸĐ¶Đ»ĐžĐČість ĐŽĐŸĐŽĐ°ĐČато **ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČі ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœŃ–** ĐŽĐŸ цох піЮĐșĐ°Đ·ĐŸĐș топіĐČ Đ·Đ° ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ `Annotated`. +ĐŁ Python таĐșĐŸĐ¶ є ĐŒĐŸĐ¶Đ»ĐžĐČість ĐŽĐŸĐŽĐ°ĐČато **ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČі ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœŃ–** ĐŽĐŸ цох піЮĐșĐ°Đ·ĐŸĐș топіĐČ Đ·Đ° ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ `Annotated`. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń–ĐŒĐżĐŸŃ€Ń‚ŃƒĐČато `Annotated` Đ· `typing`. @@ -305,7 +305,7 @@ def some_function(data: Any): АлД ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž цД ĐŒŃ–ŃŃ†Đ” ĐČ `Annotated`, Ń‰ĐŸĐ± ĐœĐ°ĐŽĐ°Ń‚Đž **FastAPI** ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČі ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœŃ– ĐżŃ€ĐŸ тД, яĐș ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ”, Ń‰ĐŸĐ± ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș ĐżĐŸĐČĐŸĐŽĐžĐČся. -ВажлОĐČĐŸ ĐżĐ°ĐŒâ€™ŃŃ‚Đ°Ń‚Đž, Ń‰ĐŸ **ĐżĐ”Ń€ŃˆĐžĐč *ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ топу***, яĐșĐžĐč ĐČĐž пДрДЎаєтД ĐČ `Annotated`, — цД **фаĐșŃ‚ĐžŃ‡ĐœĐžĐč топ**. Đ Đ”ŃˆŃ‚Đ° — цД лОшД ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœŃ– ĐŽĐ»Ń Ń–ĐœŃˆĐžŃ… Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ. +ВажлОĐČĐŸ ĐżĐ°ĐŒâ€™ŃŃ‚Đ°Ń‚Đž, Ń‰ĐŸ **ĐżĐ”Ń€ŃˆĐžĐč *ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ топу***, яĐșĐžĐč ĐČĐž пДрДЎаєтД ĐČ `Annotated`, - цД **фаĐșŃ‚ĐžŃ‡ĐœĐžĐč топ**. Đ Đ”ŃˆŃ‚Đ° - цД лОшД ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœŃ– ĐŽĐ»Ń Ń–ĐœŃˆĐžŃ… Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ. ĐĐ°Ń€Đ°Đ·Ń– ĐČĐ°ĐŒ ĐżŃ€ĐŸŃŃ‚ĐŸ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ Đ·ĐœĐ°Ń‚Đž, Ń‰ĐŸ `Annotated` Ń–ŃĐœŃƒŃ” і Ń‰ĐŸ цД ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœĐžĐč Python. 😎 @@ -335,7 +335,7 @@ def some_function(data: Any): * **ĐŸĐ”Ń€Đ”ĐČірĐșĐž ĐŽĐ°ĐœĐžŃ…**: Ń‰ĐŸ ĐœĐ°ĐŽŃ…ĐŸĐŽŃŃ‚ŃŒ ĐČіЮ ĐșĐŸĐ¶ĐœĐŸĐłĐŸ Đ·Đ°ĐżĐžŃ‚Ńƒ: * Đ“Đ”ĐœĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ **аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐžŃ… ĐżĐŸĐŒĐžĐ»ĐŸĐș**, Ń‰ĐŸ ĐżĐŸĐČĐ”Ń€Ń‚Đ°ŃŽŃ‚ŃŒŃŃ ĐșĐ»Ń–Ń”ĐœŃ‚Ńƒ, ĐșĐŸĐ»Đž ĐŽĐ°ĐœŃ– ĐœĐ”ĐŽŃ–ĐčŃĐœŃ–. * **Đ”ĐŸĐșŃƒĐŒĐ”ĐœŃ‚ŃƒĐČĐ°ĐœĐœŃ** API за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ OpenAPI: - * яĐșĐžĐč ĐżĐŸŃ‚Ń–ĐŒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ĐŽĐ»Ń аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸŃ— Ń–ĐœŃ‚Đ”Ń€Đ°ĐșтоĐČĐœĐŸŃ— ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČĐ°Đ»ŃŒĐœĐžŃ†ŃŒĐșох Ń–ĐœŃ‚Đ”Ń€Ń„Đ”ĐčсіĐČ. + * Ń‰ĐŸ ĐżĐŸŃ‚Ń–ĐŒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐžĐŒĐž Ń–ĐœŃ‚Đ”Ń€Đ°ĐșтоĐČĐœĐžĐŒĐž ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČацьĐșĐžĐŒĐž Ń–ĐœŃ‚Đ”Ń€Ń„Đ”ĐčŃĐ°ĐŒĐž ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń—. ВсД цД ĐŒĐŸĐ¶Đ” Đ·ĐŽĐ°Ń‚ĐžŃŃ абстраĐșŃ‚ĐœĐžĐŒ. ĐĐ” хĐČОлюĐčŃ‚Đ”ŃŃ. Во ĐżĐŸĐ±Đ°Ń‡ĐžŃ‚Đ” ĐČсД цД ĐČ ĐŽŃ–Ń— ĐČ [НаĐČŃ‡Đ°Đ»ŃŒĐœĐžĐč ĐżĐŸŃŃ–Đ±ĐœĐžĐș - ĐŸĐŸŃŃ–Đ±ĐœĐžĐș ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача](tutorial/index.md). diff --git a/docs/uk/docs/tutorial/bigger-applications.md b/docs/uk/docs/tutorial/bigger-applications.md index db2bf11c6..85a6c66a0 100644 --- a/docs/uk/docs/tutorial/bigger-applications.md +++ b/docs/uk/docs/tutorial/bigger-applications.md @@ -17,16 +17,16 @@ ``` . ├── app -│   ├── __init__.py -│   ├── main.py -│   ├── dependencies.py -│   └── routers -│   │ ├── __init__.py -│   │ ├── items.py -│   │ └── users.py -│   └── internal -│   ├── __init__.py -│   └── admin.py +│ ├── __init__.py +│ ├── main.py +│ ├── dependencies.py +│ └── routers +│ │ ├── __init__.py +│ │ ├── items.py +│ │ └── users.py +│ └── internal +│ ├── __init__.py +│ └── admin.py ``` /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° @@ -382,11 +382,11 @@ from .routers.users import router {* ../../docs_src/bigger_applications/app_an_py310/main.py hl[10:11] title["app/main.py"] *} -/// note | ĐąĐ”Ń…ĐœŃ–Ń‡ĐœŃ– ЎДталі +/// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа -FastAPI збДрігає ĐŸŃ€ĐžĐłŃ–ĐœĐ°Đ»ŃŒĐœĐžĐč `APIRouter` і ĐčĐŸĐłĐŸ `APIRoute` аĐșтоĐČĐœĐžĐŒĐž ĐżŃ–ŃĐ»Ń ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐœŃ router'а ĐŽĐŸ ĐŸŃĐœĐŸĐČĐœĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу. +`users.router` ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ `APIRouter` ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– фаĐčлу `app/routers/users.py`. -ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČацьĐșі піЮĐșласО `APIRouter` і `APIRoute` і ĐœĐ°ĐŽĐ°Đ»Ń– Đ±Ń€Đ°Ń‚ĐžĐŒŃƒŃ‚ŃŒ участь ĐżŃ–ŃĐ»Ń ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐœŃ router'а. +А `items.router` ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ `APIRouter` ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– фаĐčлу `app/routers/items.py`. /// @@ -394,6 +394,14 @@ FastAPI збДрігає ĐŸŃ€ĐžĐłŃ–ĐœĐ°Đ»ŃŒĐœĐžĐč `APIRouter` і ĐčĐŸĐłĐŸ `APIRo ĐŠĐ” ĐČĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ усі ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Đž Đ· Ń†ŃŒĐŸĐłĐŸ router'а яĐș Ń‡Đ°ŃŃ‚ĐžĐœŃƒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу. +/// note | ĐąĐ”Ń…ĐœŃ–Ń‡ĐœŃ– ЎДталі + +FastAPI збДрігає ĐŸŃ€ĐžĐłŃ–ĐœĐ°Đ»ŃŒĐœĐžĐč `APIRouter` і ĐčĐŸĐłĐŸ `APIRoute` аĐșтоĐČĐœĐžĐŒĐž ĐżŃ–ŃĐ»Ń ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐœŃ router'а ĐŽĐŸ ĐŸŃĐœĐŸĐČĐœĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу. + +ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČацьĐșі піЮĐșласО `APIRouter` і `APIRoute` і ĐœĐ°ĐŽĐ°Đ»Ń– Đ±Ń€Đ°Ń‚ĐžĐŒŃƒŃ‚ŃŒ участь ĐżŃ–ŃĐ»Ń ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐœŃ router'а. + +/// + /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° Đ’Đ°ĐŒ ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ пДрДĐčĐŒĐ°Ń‚ĐžŃŃ ĐżŃ€ĐŸĐŽŃƒĐșтоĐČĐœŃ–ŃŃ‚ŃŽ піЮ час ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐœŃ router'іĐČ. @@ -445,7 +453,7 @@ FastAPI збДрігає ĐŸŃ€ĐžĐłŃ–ĐœĐ°Đ»ŃŒĐœĐžĐč `APIRouter` і ĐčĐŸĐłĐŸ `APIRo /// note | Đ”ŃƒĐ¶Đ” Ń‚Đ”Ń…ĐœŃ–Ń‡ĐœŃ– ЎДталі -ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа: цД ЎужД Ń‚Đ”Ń…ĐœŃ–Ń‡ĐœĐ° ĐŽĐ”Ń‚Đ°Đ»ŃŒ, яĐșу ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸŃŃ‚ĐŸ ĐżŃ€ĐŸĐżŃƒŃŃ‚ĐžŃ‚Đž. +**ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа**: цД ЎужД Ń‚Đ”Ń…ĐœŃ–Ń‡ĐœĐ° ĐŽĐ”Ń‚Đ°Đ»ŃŒ, яĐșу ĐČĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐŒĐŸĐ¶Đ”Ń‚Đ” **ĐżŃ€ĐŸŃŃ‚ĐŸ ĐżŃ€ĐŸĐżŃƒŃŃ‚ĐžŃ‚Đž**. --- @@ -510,7 +518,7 @@ $ fastapi dev ## ВĐșлючаĐčтД Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč router ĐșŃ–Đ»ŃŒĐșа разіĐČ Đ· Ń€Ń–Đ·ĐœĐžĐŒĐž `prefix` { #include-the-same-router-multiple-times-with-different-prefix } -Во таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `.include_router()` ĐșŃ–Đ»ŃŒĐșа разіĐČ Đ· ĐŸĐŽĐœĐžĐŒ і Ń‚ĐžĐŒ ŃĐ°ĐŒĐžĐŒ router'ĐŸĐŒ, алД Đ· Ń€Ń–Đ·ĐœĐžĐŒĐž прДфіĐșŃĐ°ĐŒĐž. +Во таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `.include_router()` ĐșŃ–Đ»ŃŒĐșа разіĐČ Đ· *Ń‚ĐžĐŒ ŃĐ°ĐŒĐžĐŒ* router'ĐŸĐŒ, алД Đ· Ń€Ń–Đ·ĐœĐžĐŒĐž прДфіĐșŃĐ°ĐŒĐž. ĐŠĐ” ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐșĐŸŃ€ĐžŃĐœĐŸ, ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Ń‰ĐŸĐ± ĐżŃƒĐ±Đ»Ń–ĐșуĐČато Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč API піЮ Ń€Ń–Đ·ĐœĐžĐŒĐž прДфіĐșŃĐ°ĐŒĐž, ĐœĐ°ĐżŃ€ĐžĐșлаЎ `/api/v1` і `/api/latest`. diff --git a/docs/uk/docs/tutorial/body-nested-models.md b/docs/uk/docs/tutorial/body-nested-models.md index 6919d3e11..c1daaf671 100644 --- a/docs/uk/docs/tutorial/body-nested-models.md +++ b/docs/uk/docs/tutorial/body-nested-models.md @@ -27,17 +27,17 @@ my_list: list[str] ВоĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœĐžĐč ŃĐžĐœŃ‚Đ°ĐșсОс ĐŽĐ»Ń Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚Ń–ĐČ ĐŒĐŸĐŽĐ”Đ»Đ”Đč Đ· ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃ–ĐŒĐž Ń‚ĐžĐżĐ°ĐŒĐž. -ОтжД, у ĐœĐ°ŃˆĐŸĐŒŃƒ проĐșлаЎі, ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ Đ·Ń€ĐŸĐ±ĐžŃ‚Đž `tags` ŃĐ°ĐŒĐ” «спОсĐșĐŸĐŒ ряЮĐșіĐČ»: +ОтжД, у ĐœĐ°ŃˆĐŸĐŒŃƒ проĐșлаЎі, ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ Đ·Ń€ĐŸĐ±ĐžŃ‚Đž `tags` ŃĐ°ĐŒĐ” «спОсĐșĐŸĐŒ ŃŃ‚Ń€ĐŸĐș»: {* ../../docs_src/body_nested_models/tutorial002_py310.py hl[12] *} ## йОпО ĐŒĐœĐŸĐ¶ĐžĐœ { #set-types } -АлД ĐżĐŸŃ‚Ń–ĐŒ ĐŒĐž ĐżĐŸĐŽŃƒĐŒĐ°Đ»Đž, Ń‰ĐŸ тДгО ĐœĐ” ĐżĐŸĐČĐžĐœĐœŃ– ĐżĐŸĐČŃ‚ĐŸŃ€ŃŽĐČатося, ĐČĐŸĐœĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐżĐŸĐČĐžĐœĐœŃ– Đ±ŃƒŃ‚Đž ŃƒĐœŃ–ĐșĐ°Đ»ŃŒĐœĐžĐŒĐž ряЮĐșĐ°ĐŒĐž. +АлД ĐżĐŸŃ‚Ń–ĐŒ ĐŒĐž ĐżĐŸĐŽŃƒĐŒĐ°Đ»Đž, Ń‰ĐŸ тДгО ĐœĐ” ĐżĐŸĐČĐžĐœĐœŃ– ĐżĐŸĐČŃ‚ĐŸŃ€ŃŽĐČатося, ĐČĐŸĐœĐž, ĐčĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ĐżĐŸĐČĐžĐœĐœŃ– Đ±ŃƒŃ‚Đž ŃƒĐœŃ–ĐșĐ°Đ»ŃŒĐœĐžĐŒĐž ŃŃ‚Ń€ĐŸĐșĐ°ĐŒĐž. -І Python ĐŒĐ°Ń” ŃĐżĐ”Ń†Ń–Đ°Đ»ŃŒĐœĐžĐč топ ĐŽĐ°ĐœĐžŃ… ĐŽĐ»Ń ĐŒĐœĐŸĐ¶ĐžĐœ ŃƒĐœŃ–ĐșĐ°Đ»ŃŒĐœĐžŃ… Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚Ń–ĐČ â€” цД `set`. +І Python ĐŒĐ°Ń” ŃĐżĐ”Ń†Ń–Đ°Đ»ŃŒĐœĐžĐč топ ĐŽĐ°ĐœĐžŃ… ĐŽĐ»Ń ĐŒĐœĐŸĐ¶ĐžĐœ ŃƒĐœŃ–ĐșĐ°Đ»ŃŒĐœĐžŃ… Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚Ń–ĐČ - цД `set`. -ĐąĐŸĐŒŃƒ ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž `tags` яĐș ĐŒĐœĐŸĐ¶ĐžĐœŃƒ ряЮĐșіĐČ: +ĐąĐŸĐŒŃƒ ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž `tags` яĐș ĐŒĐœĐŸĐ¶ĐžĐœŃƒ ŃŃ‚Ń€ĐŸĐș: {* ../../docs_src/body_nested_models/tutorial003_py310.py hl[12] *} @@ -45,7 +45,7 @@ my_list: list[str] І ĐșĐŸĐ»Đž ĐČĐž Đ±ŃƒĐŽĐ”Ń‚Đ” ĐČĐžĐČĐŸĐŽĐžŃ‚Đž ці ĐŽĐ°ĐœŃ–, ĐœĐ°ĐČіть яĐșŃ‰ĐŸ ĐŽĐ¶Đ”Ń€Đ”Đ»ĐŸ ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ ĐŽŃƒĐ±Đ»Ń–Đșато, ĐČĐŸĐœĐž Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐČĐžĐČĐ”ĐŽĐ”ĐœŃ– яĐș ĐŒĐœĐŸĐ¶ĐžĐœĐ° ŃƒĐœŃ–ĐșĐ°Đ»ŃŒĐœĐžŃ… Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚Ń–ĐČ. -І цД буЎД Đ°ĐœĐŸŃ‚ĐŸĐČĐ°ĐœĐŸ/ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐŸĐČĐ°ĐœĐŸ ĐČŃ–ĐŽĐżĐŸĐČŃ–ĐŽĐœĐŸ. +І цД буЎД Đ°ĐœĐŸŃ‚ĐŸĐČĐ°ĐœĐŸ / ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐŸĐČĐ°ĐœĐŸ ĐČŃ–ĐŽĐżĐŸĐČŃ–ĐŽĐœĐŸ. ## ВĐșĐ»Đ°ĐŽĐ”ĐœŃ– ĐŒĐŸĐŽĐ”Đ»Ń– { #nested-models } @@ -69,7 +69,7 @@ my_list: list[str] {* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *} -ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń‚ĐžĐŒĐ”, Ń‰ĐŸ **FastAPI** ĐŸŃ‡Ń–ĐșуĐČĐ°Ń‚ĐžĐŒĐ” Ń‚Ń–Đ»ĐŸ Đ·Đ°ĐżĐžŃ‚Ńƒ таĐșĐŸĐłĐŸ ĐČĐžĐłĐ»ŃĐŽŃƒ: +ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń‚ĐžĐŒĐ”, Ń‰ĐŸ **FastAPI** ĐŸŃ‡Ń–ĐșуĐČĐ°Ń‚ĐžĐŒĐ” Ń‚Ń–Đ»ĐŸ, ĐżĐŸĐŽŃ–Đ±ĐœĐ” ĐŽĐŸ: ```JSON { @@ -85,7 +85,7 @@ my_list: list[str] } ``` -ЗаĐČЮяĐșĐž таĐșіĐč ĐŽĐ”Đșларації у **FastAPI** ĐČĐž ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”Ń‚Đ”: +Đ—ĐœĐŸĐČу ж, лОшД заĐČЮяĐșĐž таĐșĐŸĐŒŃƒ ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐœŃŽ, Đ· **FastAPI** ĐČĐž ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”Ń‚Đ”: * ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу ĐČ Ń€Đ”ĐŽĐ°ĐșŃ‚ĐŸŃ€Ń– (аĐČŃ‚ĐŸĐ·Đ°ĐČĐ”Ń€ŃˆĐ”ĐœĐœŃ Ń‚ĐŸŃ‰ĐŸ), ĐœĐ°ĐČіть ĐŽĐ»Ń ĐČĐșĐ»Đ°ĐŽĐ”ĐœĐžŃ… ĐŒĐŸĐŽĐ”Đ»Đ”Đč * ĐšĐŸĐœĐČДртацію ĐŽĐ°ĐœĐžŃ… @@ -94,23 +94,23 @@ my_list: list[str] ## ĐĄĐżĐ”Ń†Ń–Đ°Đ»ŃŒĐœŃ– топо та ĐČĐ°Đ»Ń–ĐŽĐ°Ń†Ń–Ń { #special-types-and-validation } -ОĐșŃ€Ń–ĐŒ Đ·ĐČочаĐčĐœĐžŃ… топіĐČ, таĐșох яĐș `str`, `int`, `float`, та Ń–Đœ. ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато сĐșĐ»Đ°ĐŽĐœŃ–ŃˆŃ– топо, яĐșі ĐœĐ°ŃĐ»Ń–ĐŽŃƒŃŽŃ‚ŃŒ `str`. +ОĐșŃ€Ń–ĐŒ Đ·ĐČочаĐčĐœĐžŃ… ĐŸĐŽĐžĐœĐžŃ‡ĐœĐžŃ… топіĐČ, таĐșох яĐș `str`, `int`, `float`, та Ń–Đœ. ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато сĐșĐ»Đ°ĐŽĐœŃ–ŃˆŃ– ĐŸĐŽĐžĐœĐžŃ‡ĐœŃ– топо, яĐșі ĐœĐ°ŃĐ»Ń–ĐŽŃƒŃŽŃ‚ŃŒ `str`. Đ©ĐŸĐ± ĐżĐŸĐ±Đ°Ń‡ĐžŃ‚Đž ĐČсі ĐŽĐŸŃŃ‚ŃƒĐżĐœŃ– ĐČĐ°Ń€Ń–Đ°ĐœŃ‚Đž, ĐŸĐ·ĐœĐ°ĐčĐŸĐŒŃ‚Đ”ŃŃ Đ· [ĐžĐłĐ»ŃĐŽĐŸĐŒ топіĐČ Ńƒ Pydantic](https://docs.pydantic.dev/latest/concepts/types/). Đ”Đ”ŃĐșі проĐșлаЎО Đ±ŃƒĐŽŃƒŃ‚ŃŒ у ĐœĐ°ŃŃ‚ŃƒĐżĐœĐŸĐŒŃƒ Ń€ĐŸĐ·ĐŽŃ–Đ»Ń–. -НапроĐșлаЎ, у ĐŒĐŸĐŽĐ”Đ»Ń– `Image` є ĐżĐŸĐ»Đ” `url`, Ń‚ĐŸĐŒŃƒ ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž ĐčĐŸĐłĐŸ яĐș `HttpUrl` ĐČіЮ Pydantic Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ `str`: +НапроĐșлаЎ, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐČ ĐŒĐŸĐŽĐ”Đ»Ń– `Image` є ĐżĐŸĐ»Đ” `url`, ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž ĐčĐŸĐłĐŸ яĐș Đ”ĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€ `HttpUrl` ĐČіЮ Pydantic Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ `str`: {* ../../docs_src/body_nested_models/tutorial005_py310.py hl[2,8] *} -Đ ŃĐŽĐŸĐș буЎД пДрДĐČŃ–Ń€Đ”ĐœĐŸ яĐș ЮіĐčŃĐœŃƒ URL-Đ°ĐŽŃ€Đ”ŃŃƒ і Đ·Đ°ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐŸĐČĐ°ĐœĐŸ ĐČ JSON Schema / OpenAPI яĐș URL. +ĐĄŃ‚Ń€ĐŸĐșу буЎД пДрДĐČŃ–Ń€Đ”ĐœĐŸ яĐș ЮіĐčŃĐœŃƒ URL-Đ°ĐŽŃ€Đ”ŃŃƒ і Đ·Đ°ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ĐŸĐČĐ°ĐœĐŸ ĐČ ĐĄŃ…Đ”ĐŒŃ– JSON / OpenAPI яĐș таĐșу. ## ĐŃ‚Ń€ĐžĐ±ŃƒŃ‚Đž Đ·Ń– спОсĐșĐ°ĐŒĐž ĐżŃ–ĐŽĐŒĐŸĐŽĐ”Đ»Đ”Đč { #attributes-with-lists-of-submodels } -ĐŁ Pydantic ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐŒĐŸĐŽĐ”Đ»Ń– яĐș піЮтопо ĐŽĐ»Ń `list`, `set` Ń‚ĐŸŃ‰ĐŸ: +ĐŁ Pydantic ĐČĐž таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐŒĐŸĐŽĐ”Đ»Ń– яĐș піЮтопо ĐŽĐ»Ń `list`, `set` Ń‚ĐŸŃ‰ĐŸ: {* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *} -ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ **FastAPI** буЎД ĐŸŃ‡Ń–ĐșуĐČато (ĐșĐŸĐœĐČĐ”Ń€Ń‚ŃƒĐČато, ĐČĐ°Đ»Ń–ĐŽŃƒĐČато, ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ŃƒĐČато Ń‚ĐŸŃ‰ĐŸ) JSON Ń‚Ń–Đ»ĐŸ Đ·Đ°ĐżĐžŃ‚Ńƒ у ĐČĐžĐłĐ»ŃĐŽŃ–: +ĐŠĐ” ĐŸŃ‡Ń–ĐșуĐČĐ°Ń‚ĐžĐŒĐ” (ĐșĐŸĐœĐČĐ”Ń€Ń‚ŃƒĐČĐ°Ń‚ĐžĐŒĐ”, ĐČĐ°Đ»Ń–ĐŽŃƒĐČĐ°Ń‚ĐžĐŒĐ”, ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ŃƒĐČĐ°Ń‚ĐžĐŒĐ” Ń‚ĐŸŃ‰ĐŸ) Ń‚Ń–Đ»ĐŸ JSON у ĐČĐžĐłĐ»ŃĐŽŃ–: ```JSON hl_lines="11" { @@ -150,61 +150,61 @@ my_list: list[str] /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа -ЗĐČĐ”Ń€ĐœŃ–Ń‚ŃŒ уĐČагу, Ń‰ĐŸ ĐČ ĐŒĐŸĐŽĐ”Đ»Ń– `Offer` є ŃĐżĐžŃĐŸĐș `Item`іĐČ, яĐșі, сĐČĐŸŃ”ŃŽ Ń‡Đ”Ń€ĐłĐŸŃŽ, ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ ĐŒĐ°Ń‚Đž ĐœĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐč ŃĐżĐžŃĐŸĐș `Image`іĐČ. +ЗĐČĐ”Ń€ĐœŃ–Ń‚ŃŒ уĐČагу, Ń‰ĐŸ `Offer` ĐŒĐ°Ń” ŃĐżĐžŃĐŸĐș `Item`іĐČ, яĐșі, сĐČĐŸŃ”ŃŽ Ń‡Đ”Ń€ĐłĐŸŃŽ, ĐŒĐ°ŃŽŃ‚ŃŒ ĐœĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐč ŃĐżĐžŃĐŸĐș `Image`іĐČ /// ## йіла запОтіĐČ, Ń‰ĐŸ сĐșĐ»Đ°ĐŽĐ°ŃŽŃ‚ŃŒŃŃ Đ·Ń– спОсĐșіĐČ { #bodies-of-pure-lists } -ĐŻĐșŃ‰ĐŸ ĐČĐ”Ń€Ń…ĐœŃ–Đč ріĐČĐ”ĐœŃŒ JSON тіла, яĐșĐ” ĐČĐž ĐŸŃ‡Ń–ĐșŃƒŃ”Ń‚Đ”, є JSON `ĐŒĐ°ŃĐžĐČĐŸĐŒ` (у Python — `list`), ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž топ у ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń– Ń„ŃƒĐœĐșції, яĐș і ĐČ ĐŒĐŸĐŽĐ”Đ»ŃŃ… Pydantic: +ĐŻĐșŃ‰ĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ ĐČĐ”Ń€Ń…ĐœŃŒĐŸĐłĐŸ ріĐČĐœŃ JSON тіла, яĐșĐ” ĐČĐž ĐŸŃ‡Ń–ĐșŃƒŃ”Ń‚Đ”, є JSON `array` (Python `list`), ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž топ у ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń– Ń„ŃƒĐœĐșції таĐș ŃĐ°ĐŒĐŸ, яĐș у ĐŒĐŸĐŽĐ”Đ»ŃŃ… Pydantic: ```Python images: list[Image] ``` -ĐœĐ°ĐżŃ€ĐžĐșлаЎ: +яĐș у: {* ../../docs_src/body_nested_models/tutorial008_py310.py hl[13] *} ## ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа ĐČ Ń€Đ”ĐŽĐ°ĐșŃ‚ĐŸŃ€Ń– ĐČсюЮо { #editor-support-everywhere } -Во ĐŸŃ‚Ń€ĐžĐŒĐ°Ń”Ń‚Đ” ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу ĐČ Ń€Đ”ĐŽĐ°ĐșŃ‚ĐŸŃ€Ń– ĐČсюЮо. +І ĐČĐž ĐŸŃ‚Ń€ĐžĐŒĐ°Ń”Ń‚Đ” ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу ĐČ Ń€Đ”ĐŽĐ°ĐșŃ‚ĐŸŃ€Ń– ĐČсюЮо. НаĐČіть ĐŽĐ»Ń Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚Ń–ĐČ Ńƒ спОсĐșах: -Во ĐœĐ” Đ·ĐŒĐŸĐłĐ»Đž б ĐŸŃ‚Ń€ĐžĐŒĐ°Ń‚Đž таĐșу ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу ĐČ Ń€Đ”ĐŽĐ°ĐșŃ‚ĐŸŃ€Ń–, яĐșбО працюĐČалО ĐœĐ°ĐżŃ€ŃĐŒŃƒ Đ·Ń– `dict`, а ĐœĐ” Đ· ĐŒĐŸĐŽĐ”Đ»ŃĐŒĐž Pydantic. +Во ĐœĐ” Đ·ĐŒĐŸĐłĐ»Đž б ĐŸŃ‚Ń€ĐžĐŒĐ°Ń‚Đž таĐșу ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу ĐČ Ń€Đ”ĐŽĐ°ĐșŃ‚ĐŸŃ€Ń–, яĐșбО працюĐČалО ĐœĐ°ĐżŃ€ŃĐŒŃƒ Đ·Ń– `dict`, а ĐœĐ” Đ· ĐŒĐŸĐŽĐ”Đ»ŃĐŒĐž Pydantic. -АлД ĐČĐ°ĐŒ ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ Ń‚ŃƒŃ€Đ±ŃƒĐČатося ĐżŃ€ĐŸ цД: ĐČŃ…Ń–ĐŽĐœŃ– dict'Đž аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ ĐșĐŸĐœĐČĐ”Ń€Ń‚ŃƒŃŽŃ‚ŃŒŃŃ, а ĐČĐžŃ…Ń–ĐŽĐœŃ– ĐŽĐ°ĐœŃ– аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ пДрДтĐČĐŸŃ€ŃŽŃŽŃ‚ŃŒŃŃ ĐČ JSON. +АлД ĐČĐ°ĐŒ таĐșĐŸĐ¶ ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ Ń‚ŃƒŃ€Đ±ŃƒĐČатося ĐżŃ€ĐŸ ĐœĐžŃ…: ĐČŃ…Ń–ĐŽĐœŃ– ŃĐ»ĐŸĐČĐœĐžĐșĐž аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ ĐșĐŸĐœĐČĐ”Ń€Ń‚ŃƒŃŽŃ‚ŃŒŃŃ, а ĐČĐžŃ…Ń–ĐŽĐœŃ– ĐŽĐ°ĐœŃ– аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ пДрДтĐČĐŸŃ€ŃŽŃŽŃ‚ŃŒŃŃ ĐČ JSON. ## йіла Đ· ĐŽĐŸĐČŃ–Đ»ŃŒĐœĐžĐŒĐž `dict` { #bodies-of-arbitrary-dicts } Во таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž Ń‚Ń–Đ»ĐŸ яĐș `dict` Đ· ĐșĐ»ŃŽŃ‡Đ°ĐŒĐž ĐŸĐŽĐœĐŸĐłĐŸ топу та Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒĐž Ń–ĐœŃˆĐŸĐłĐŸ топу. -ĐŠĐ” ĐșĐŸŃ€ĐžŃĐœĐŸ, яĐșŃ‰ĐŸ ĐČĐž ĐœĐ” Đ·ĐœĐ°Ń”Ń‚Đ” ĐœĐ°ĐżĐ”Ń€Đ”ĐŽ, яĐșі Ń–ĐŒĐ”ĐœĐ° ĐżĐŸĐ»Ń–ĐČ Đ±ŃƒĐŽŃƒŃ‚ŃŒ ЮіĐčŃĐœĐžĐŒĐž (яĐș у ĐČОпаЎĐșу Đ· ĐŒĐŸĐŽĐ”Đ»ŃĐŒĐž Pydantic). +йаĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ, ĐČĐ°ĐŒ ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐœĐ°ĐżĐ”Ń€Đ”ĐŽ Đ·ĐœĐ°Ń‚Đž, яĐșі Ń–ĐŒĐ”ĐœĐ° ĐżĐŸĐ»Ń–ĐČ/Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚Ń–ĐČ Ń” ЮіĐčŃĐœĐžĐŒĐž (яĐș цД Đ±ŃƒĐ»ĐŸ б у ĐČОпаЎĐșу Đ· ĐŒĐŸĐŽĐ”Đ»ŃĐŒĐž Pydantic). ĐŠĐ” буЎД ĐșĐŸŃ€ĐžŃĐœĐŸ, яĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” проĐčĐŒĐ°Ń‚Đž Đșлючі, яĐșі Đ·Đ°Đ·ĐŽĐ°Đ»Đ”ĐłŃ–ĐŽŃŒ ĐœĐ”ĐČŃ–ĐŽĐŸĐŒŃ–. --- -ĐŠĐ” таĐșĐŸĐ¶ Đ·Ń€ŃƒŃ‡ĐœĐŸ, яĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž Đșлючі Ń–ĐœŃˆĐŸĐłĐŸ топу (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, `int`). +Đ†ĐœŃˆĐžĐč ĐșĐŸŃ€ĐžŃĐœĐžĐč ĐČĐžĐżĐ°ĐŽĐŸĐș - ĐșĐŸĐ»Đž ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž Đșлючі Ń–ĐœŃˆĐŸĐłĐŸ топу (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, `int`). -Ось Ń‰ĐŸ ĐŒĐž Ń€ĐŸĐ·ĐłĐ»ŃĐœĐ”ĐŒĐŸ Ўалі. +Ось Ń‰ĐŸ ĐŒĐž Ń€ĐŸĐ·ĐłĐ»ŃĐœĐ”ĐŒĐŸ тут. -ĐŁ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” проĐčĐŒĐ°Ń‚Đž Đ±ŃƒĐŽŃŒ-яĐșĐžĐč `dict`, яĐșŃ‰ĐŸ ĐčĐŸĐłĐŸ Đșлючі — цД `int`, а Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ — `float`: +ĐŁ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” проĐčĐŒĐ°Ń‚Đž Đ±ŃƒĐŽŃŒ-яĐșĐžĐč `dict`, яĐșŃ‰ĐŸ ĐČŃ–Đœ ĐŒĐ°Ń” Đșлючі `int` Đ·Ń– Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒĐž `float`: {* ../../docs_src/body_nested_models/tutorial009_py310.py hl[7] *} /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -МаĐčтД ĐœĐ° уĐČазі, Ń‰ĐŸ ĐČ JSON тілі Đșлючі ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ Đ±ŃƒŃ‚Đž лОшД ряЮĐșĐ°ĐŒĐž (`str`). +МаĐčтД ĐœĐ° уĐČазі, Ń‰ĐŸ JSON ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃ” лОшД `str` яĐș Đșлючі. -АлД Pydantic аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ ĐșĐŸĐœĐČĐ”Ń€Ń‚ŃƒŃ” ĐŽĐ°ĐœŃ–. +АлД Pydantic ĐŒĐ°Ń” аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœŃƒ ĐșĐŸĐœĐČДртацію ĐŽĐ°ĐœĐžŃ…. -ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐœĐ°ĐČіть яĐșŃ‰ĐŸ ĐșĐ»Ń–Ń”ĐœŃ‚Đž ĐČĐ°ŃˆĐŸĐłĐŸ API ĐœĐ°ĐŽŃĐžĐ»Đ°Ń‚ĐžĐŒŃƒŃ‚ŃŒ Đșлючі у ĐČĐžĐłĐ»ŃĐŽŃ– ряЮĐșіĐČ, яĐșŃ‰ĐŸ ĐČĐŸĐœĐž ĐŒŃ–ŃŃ‚ŃŃ‚ŃŒ цілі чОсла, Pydantic ĐșĐŸĐœĐČĐ”Ń€Ń‚ŃƒŃ” їх і ĐżŃ€ĐŸĐČДЎД ĐČаліЎацію. +ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐœĐ°ĐČіть яĐșŃ‰ĐŸ ĐșĐ»Ń–Ń”ĐœŃ‚Đž ĐČĐ°ŃˆĐŸĐłĐŸ API ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ ĐœĐ°ĐŽŃĐžĐ»Đ°Ń‚Đž лОшД ŃŃ‚Ń€ĐŸĐșĐž яĐș Đșлючі, яĐșŃ‰ĐŸ ці ŃŃ‚Ń€ĐŸĐșĐž ĐŒŃ–ŃŃ‚ŃŃ‚ŃŒ цілі чОсла, Pydantic ĐșĐŸĐœĐČĐ”Ń€Ń‚ŃƒŃ” їх і ĐżŃ€ĐŸĐČДЎД ĐČаліЎацію. -ĐąĐŸĐ±Ń‚ĐŸ `dict`, яĐșĐžĐč ĐČĐž ĐŸŃ‚Ń€ĐžĐŒĐ°Ń”Ń‚Đ” яĐș `weights`, ĐŒĐ°Ń‚ĐžĐŒĐ” Đșлючі топу `int` та Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ топу `float`. +І `dict`, яĐșĐžĐč ĐČĐž ĐŸŃ‚Ń€ĐžĐŒĐ°Ń”Ń‚Đ” яĐș `weights`, фаĐșŃ‚ĐžŃ‡ĐœĐŸ ĐŒĐ°Ń‚ĐžĐŒĐ” Đșлючі топу `int` та Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ топу `float`. /// @@ -212,10 +212,10 @@ images: list[Image] З **FastAPI** ĐČĐž ĐŒĐ°Ń”Ń‚Đ” ĐŒĐ°ĐșŃĐžĐŒĐ°Đ»ŃŒĐœŃƒ ĐłĐœŃƒŃ‡Đșість заĐČЮяĐșĐž ĐŒĐŸĐŽĐ”Đ»ŃĐŒ Pydantic, збДрігаючО про Ń†ŃŒĐŸĐŒŃƒ ĐșĐŸĐŽ ĐżŃ€ĐŸŃŃ‚ĐžĐŒ, ĐșĐŸŃ€ĐŸŃ‚ĐșĐžĐŒ та Đ”Đ»Đ”ĐłĐ°ĐœŃ‚ĐœĐžĐŒ. -А таĐșĐŸĐ¶ ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”Ń‚Đ” ĐČсі пДрДĐČагО: +АлД Đ· ŃƒŃŃ–ĐŒĐ° пДрДĐČĐ°ĐłĐ°ĐŒĐž: -* ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа ĐČ Ń€Đ”ĐŽĐ°ĐșŃ‚ĐŸŃ€Ń– (аĐČŃ‚ĐŸĐŽĐŸĐżĐŸĐČĐœĐ”ĐœĐœŃ ĐČсюЮо!) -* ĐšĐŸĐœĐČĐ”Ń€Ń‚Đ°Ń†Ń–Ń ĐŽĐ°ĐœĐžŃ… (ĐżĐ°Ń€ŃĐžĐœĐł/ŃĐ”Ń€Ń–Đ°Đ»Ń–Đ·Đ°Ń†Ń–Ń) +* ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа ĐČ Ń€Đ”ĐŽĐ°ĐșŃ‚ĐŸŃ€Ń– (аĐČŃ‚ĐŸĐ·Đ°ĐČĐ”Ń€ŃˆĐ”ĐœĐœŃ ĐČсюЮо!) +* ĐšĐŸĐœĐČĐ”Ń€Ń‚Đ°Ń†Ń–Ń ĐŽĐ°ĐœĐžŃ… (таĐșĐŸĐ¶ ĐČŃ–ĐŽĐŸĐŒĐ° яĐș ĐżĐ°Ń€ŃĐžĐœĐł / ŃĐ”Ń€Ń–Đ°Đ»Ń–Đ·Đ°Ń†Ń–Ń) * Đ’Đ°Đ»Ń–ĐŽĐ°Ń†Ń–Ń ĐŽĐ°ĐœĐžŃ… * Đ”ĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń ŃŃ…Đ”ĐŒ -* АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐ” стĐČĐŸŃ€Đ”ĐœĐœŃ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— +* АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐ° ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń diff --git a/docs/uk/docs/tutorial/body.md b/docs/uk/docs/tutorial/body.md index bd1a8f128..64d9af95e 100644 --- a/docs/uk/docs/tutorial/body.md +++ b/docs/uk/docs/tutorial/body.md @@ -4,7 +4,7 @@ ĐąŃ–Đ»ĐŸ **Đ·Đ°ĐżĐžŃ‚Ńƒ** - цД ĐŽĐ°ĐœŃ–, ĐœĐ°ĐŽŃ–ŃĐ»Đ°ĐœŃ– ĐșĐ»Ń–Ń”ĐœŃ‚ĐŸĐŒ ĐŽĐŸ ĐČĐ°ŃˆĐŸĐłĐŸ API. ĐąŃ–Đ»ĐŸ **ĐČŃ–ĐŽĐżĐŸĐČіЮі** - цД ĐŽĐ°ĐœŃ–, яĐșі ĐČаш API ĐœĐ°ĐŽŃĐžĐ»Đ°Ń” ĐșĐ»Ń–Ń”ĐœŃ‚Ńƒ. -Ваш API ĐŒĐ°ĐčжД заĐČжЎО ĐŒĐ°Ń” ĐœĐ°ĐŽŃĐžĐ»Đ°Ń‚Đž Ń‚Ń–Đ»ĐŸ **ĐČŃ–ĐŽĐżĐŸĐČіЮі**. АлД ĐșĐ»Ń–Ń”ĐœŃ‚Đ°ĐŒ ĐœĐ” ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐŸ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐżĐŸŃŃ‚Ń–ĐčĐœĐŸ ĐœĐ°ĐŽŃĐžĐ»Đ°Ń‚Đž тіла **запОтіĐČ** — Ń–ĐœĐșĐŸĐ»Đž ĐČĐŸĐœĐž лОшД Đ·Đ°ĐżĐžŃ‚ŃƒŃŽŃ‚ŃŒ ŃˆĐ»ŃŃ…, ĐŒĐŸĐ¶Đ»ĐžĐČĐŸ Đ· ĐŽĐ”ŃĐșĐžĐŒĐž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒĐž Đ·Đ°ĐżĐžŃ‚Ńƒ, алД ĐœĐ” ĐœĐ°ĐŽŃĐžĐ»Đ°ŃŽŃ‚ŃŒ Ń‚Ń–Đ»ĐŸ. +Ваш API ĐŒĐ°ĐčжД заĐČжЎО ĐŒĐ°Ń” ĐœĐ°ĐŽŃĐžĐ»Đ°Ń‚Đž Ń‚Ń–Đ»ĐŸ **ĐČŃ–ĐŽĐżĐŸĐČіЮі**. АлД ĐșĐ»Ń–Ń”ĐœŃ‚Đ°ĐŒ ĐœĐ” ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐŸ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐżĐŸŃŃ‚Ń–ĐčĐœĐŸ ĐœĐ°ĐŽŃĐžĐ»Đ°Ń‚Đž тіла **запОтіĐČ** - Ń–ĐœĐșĐŸĐ»Đž ĐČĐŸĐœĐž лОшД Đ·Đ°ĐżĐžŃ‚ŃƒŃŽŃ‚ŃŒ ŃˆĐ»ŃŃ…, ĐŒĐŸĐ¶Đ»ĐžĐČĐŸ Đ· ĐŽĐ”ŃĐșĐžĐŒĐž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒĐž Đ·Đ°ĐżĐžŃ‚Ńƒ, алД ĐœĐ” ĐœĐ°ĐŽŃĐžĐ»Đ°ŃŽŃ‚ŃŒ Ń‚Ń–Đ»ĐŸ. Đ©ĐŸĐ± ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž Ń‚Ń–Đ»ĐŸ **Đ·Đ°ĐżĐžŃ‚Ńƒ**, ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” [Pydantic](https://docs.pydantic.dev/) ĐŒĐŸĐŽĐ”Đ»Ń– Đ· усією їх ĐżĐŸŃ‚ŃƒĐ¶ĐœŃ–ŃŃ‚ŃŽ та пДрДĐČĐ°ĐłĐ°ĐŒĐž. diff --git a/docs/uk/docs/tutorial/debugging.md b/docs/uk/docs/tutorial/debugging.md index 821b55801..4d995698c 100644 --- a/docs/uk/docs/tutorial/debugging.md +++ b/docs/uk/docs/tutorial/debugging.md @@ -1,5 +1,6 @@ # ĐĐ°Đ»Đ°ĐłĐŸĐŽĐ¶Đ”ĐœĐœŃ { #debugging } + Во ĐŒĐŸĐ¶Đ”Ń‚Đ” піЮ'Ń”ĐŽĐœĐ°Ń‚Đž ЎДбагДр у ĐČĐ°ŃˆĐŸĐŒŃƒ рДЎаĐșŃ‚ĐŸŃ€Ń– ĐșĐŸĐŽŃƒ, ĐœĐ°ĐżŃ€ĐžĐșлаЎ, у Visual Studio Code Đ°Đ±ĐŸ PyCharm. ## ВоĐșлОĐș `uvicorn` { #call-uvicorn } diff --git a/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md index 348cbf25b..9642cebe0 100644 --- a/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md @@ -63,7 +63,7 @@ FastAPI ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃ” Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń–, яĐșі ĐČĐžĐșĐŸĐœŃƒŃŽŃ‚ŃŒ ĐŽĐ” Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž ĐżŃ–ĐŽĐ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– та «ЎДрДĐČа» ĐżŃ–ĐŽĐ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč Đ±ŃƒĐŽŃŒ-яĐșĐŸĐłĐŸ Ń€ĐŸĐ·ĐŒŃ–Ń€Ńƒ і Ń„ĐŸŃ€ĐŒĐž, і Đ±ŃƒĐŽŃŒ-яĐșа Đ°Đ±ĐŸ ĐČсі Đ· ĐœĐžŃ… ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `yield`. -**FastAPI** ĐłĐ°Ń€Đ°ĐœŃ‚ŃƒŃ”, Ń‰ĐŸ «exit code» у ĐșĐŸĐ¶ĐœŃ–Đč Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– Đ· `yield` буЎД ĐČĐžĐșĐŸĐœĐ°ĐœĐŸ ĐČ ĐżŃ€Đ°ĐČĐžĐ»ŃŒĐœĐŸĐŒŃƒ ĐżĐŸŃ€ŃĐŽĐșу. +**FastAPI** ĐłĐ°Ń€Đ°ĐœŃ‚ŃƒŃ”, Ń‰ĐŸ «ĐșĐŸĐŽ ĐČĐžŃ…ĐŸĐŽŃƒÂ» у ĐșĐŸĐ¶ĐœŃ–Đč Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– Đ· `yield` буЎД ĐČĐžĐșĐŸĐœĐ°ĐœĐŸ ĐČ ĐżŃ€Đ°ĐČĐžĐ»ŃŒĐœĐŸĐŒŃƒ ĐżĐŸŃ€ŃĐŽĐșу. НапроĐșлаЎ, `dependency_c` ĐŒĐŸĐ¶Đ” залДжатО ĐČіЮ `dependency_b`, а `dependency_b` - ĐČіЮ `dependency_a`: @@ -194,7 +194,7 @@ participant tasks as Background tasks `Depends()` проĐčĐŒĐ°Ń” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `scope`, яĐșĐžĐč ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž: -* `"function"`: Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ пДрДЎ *Ń„ŃƒĐœĐșцією ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, Ń‰ĐŸ ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ” запОт, заĐČĐ”Ń€ŃˆĐžŃ‚Đž Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ ĐżŃ–ŃĐ»Ń заĐČĐ”Ń€ŃˆĐ”ĐœĐœŃ *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, алД **ĐŽĐŸ** Ń‚ĐŸĐłĐŸ, яĐș ĐČŃ–ĐŽĐżĐŸĐČіЮь буЎД ĐČіЮпраĐČĐ»Đ”ĐœĐ° ĐșĐ»Ń–Ń”ĐœŃ‚Ńƒ. ĐąĐŸĐ±Ń‚ĐŸ Ń„ŃƒĐœĐșція Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– буЎД ĐČĐžĐșĐŸĐœŃƒĐČатося **ĐœĐ°ĐČĐșĐŸĐ»ĐŸ** *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— **ŃˆĐ»ŃŃ…Ńƒ***. +* `"function"`: Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ пДрДЎ *Ń„ŃƒĐœĐșцією ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, Ń‰ĐŸ ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ” запОт, заĐČĐ”Ń€ŃˆĐžŃ‚Đž Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ ĐżŃ–ŃĐ»Ń заĐČĐ”Ń€ŃˆĐ”ĐœĐœŃ *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, алД **ĐŽĐŸ** Ń‚ĐŸĐłĐŸ, яĐș ĐČŃ–ĐŽĐżĐŸĐČіЮь буЎД ĐČіЮпраĐČĐ»Đ”ĐœĐ° ĐșĐ»Ń–Ń”ĐœŃ‚Ńƒ. ĐąĐŸĐ±Ń‚ĐŸ Ń„ŃƒĐœĐșція Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– буЎД ĐČĐžĐșĐŸĐœŃƒĐČатося **ĐœĐ°ĐČĐșĐŸĐ»ĐŸ** ***Ń„ŃƒĐœĐșції** ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*. * `"request"`: Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ пДрДЎ *Ń„ŃƒĐœĐșцією ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, Ń‰ĐŸ ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ” запОт (ĐżĐŸĐŽŃ–Đ±ĐœĐŸ ĐŽĐŸ `"function"`), алД заĐČĐ”Ń€ŃˆĐžŃ‚Đž **ĐżŃ–ŃĐ»Ń** Ń‚ĐŸĐłĐŸ, яĐș ĐČŃ–ĐŽĐżĐŸĐČіЮь буЎД ĐČіЮпраĐČĐ»Đ”ĐœĐ° ĐșĐ»Ń–Ń”ĐœŃ‚Ńƒ. ĐąĐŸĐ±Ń‚ĐŸ Ń„ŃƒĐœĐșція Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– буЎД ĐČĐžĐșĐŸĐœŃƒĐČатося **ĐœĐ°ĐČĐșĐŸĐ»ĐŸ** цоĐșлу **Đ·Đ°ĐżĐžŃ‚Ńƒ** та ĐČŃ–ĐŽĐżĐŸĐČіЮі. ĐŻĐșŃ‰ĐŸ ĐœĐ” ĐČĐșĐ°Đ·Đ°ĐœĐŸ, і Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ ĐŒĐ°Ń” `yield`, за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `scope` ĐŽĐŸŃ€Ń–ĐČĐœŃŽŃ” `"request"`. @@ -234,6 +234,7 @@ participant operation as Path Operation Đ—Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– Đ· `yield` Đ”ĐČĐŸĐ»ŃŽŃ†Ń–ĐŸĐœŃƒĐČалО Đ· Ń‡Đ°ŃĐŸĐŒ, Ń‰ĐŸĐ± ĐżĐŸĐșрото Ń€Ń–Đ·ĐœŃ– ŃŃ†Đ”ĐœĐ°Ń€Ń–Ń— та ĐČопраĐČото ĐŽĐ”ŃĐșі ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒĐž. ĐŻĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŽŃ–Đ·ĐœĐ°Ń‚ĐžŃŃ, Ń‰ĐŸ Đ·ĐŒŃ–ĐœŃŽĐČĐ°Đ»ĐŸŃŃ ĐČ Ń€Ń–Đ·ĐœĐžŃ… ĐČĐ”Ń€ŃŃ–ŃŃ… FastAPI, ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°ĐčтД ĐżŃ€ĐŸ цД ĐČ ĐżŃ€ĐŸŃŃƒĐœŃƒŃ‚ĐŸĐŒŃƒ ĐżĐŸŃŃ–Đ±ĐœĐžĐșу ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача: [Đ ĐŸĐ·ŃˆĐžŃ€Đ”ĐœŃ– Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– - Đ—Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– Đ· `yield`, `HTTPException`, `except` і Ń„ĐŸĐœĐŸĐČĐžĐŒĐž Đ·Đ°ĐŽĐ°Ń‡Đ°ĐŒĐž](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks). + ## ĐœĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€Đž ĐșĐŸĐœŃ‚Đ”Đșсту { #context-managers } ### Đ©ĐŸ таĐșĐ” Â«ĐœĐ”ĐœĐ”ĐŽĐ¶Đ”Ń€Đž ĐșĐŸĐœŃ‚Đ”ĐșŃŃ‚ŃƒÂ» { #what-are-context-managers } diff --git a/docs/uk/docs/tutorial/extra-data-types.md b/docs/uk/docs/tutorial/extra-data-types.md index 26d7c306f..15e6b64a4 100644 --- a/docs/uk/docs/tutorial/extra-data-types.md +++ b/docs/uk/docs/tutorial/extra-data-types.md @@ -22,7 +22,7 @@ Ось ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČі топо ĐŽĐ°ĐœĐžŃ… ĐŽĐ»Ń ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ: * `UUID`: - * ĐĄŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœĐžĐč "ĐŁĐœŃ–ĐČĐ”Ń€ŃĐ°Đ»ŃŒĐœĐžĐč ŃƒĐœŃ–ĐșĐ°Đ»ŃŒĐœĐžĐč Ń–ĐŽĐ”ĐœŃ‚ĐžŃ„Ń–ĐșĐ°Ń‚ĐŸŃ€", яĐșĐžĐč Ń‡Đ°ŃŃ‚ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується яĐș ID у Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… базах ĐŽĐ°ĐœĐžŃ… та ŃĐžŃŃ‚Đ”ĐŒĐ°Ń…. + * ĐĄŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœĐžĐč Â«ĐŁĐœŃ–ĐČĐ”Ń€ŃĐ°Đ»ŃŒĐœĐžĐč ŃƒĐœŃ–ĐșĐ°Đ»ŃŒĐœĐžĐč Ń–ĐŽĐ”ĐœŃ‚ĐžŃ„Ń–ĐșĐ°Ń‚ĐŸŃ€Â», яĐșĐžĐč Ń‡Đ°ŃŃ‚ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується яĐș ID у Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… базах ĐŽĐ°ĐœĐžŃ… та ŃĐžŃŃ‚Đ”ĐŒĐ°Ń…. * ĐŁ запОтах та ĐČŃ–ĐŽĐżĐŸĐČіЮях буЎД прДЎстаĐČĐ»Đ”ĐœĐžĐč яĐș `str`. * `datetime.datetime`: * ПаĐčŃ‚ĐŸĐœŃ–ĐČсьĐșĐžĐč `datetime.datetime`. @@ -36,16 +36,16 @@ * `datetime.timedelta`: * ПаĐčŃ‚ĐŸĐœŃ–ĐČсьĐșĐžĐč `datetime.timedelta`. * ĐŁ запОтах та ĐČŃ–ĐŽĐżĐŸĐČіЮях буЎД прДЎстаĐČĐ»Đ”ĐœĐžĐč яĐș `float` Đ·Đ°ĐłĐ°Đ»ŃŒĐœĐŸŃ— ĐșŃ–Đ»ŃŒĐșĐŸŃŃ‚Ń– сДĐșŃƒĐœĐŽ. - * Pydantic таĐșĐŸĐ¶ ĐŽĐŸĐ·ĐČĐŸĐ»ŃŃ” прДЎстаĐČĐ»ŃŃ‚Đž цД яĐș "ISO 8601 time diff encoding", [ĐŽĐžĐČіться ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–ŃŽ ĐŽĐ»Ń ĐŸŃ‚Ń€ĐžĐŒĐ°ĐœĐœŃ ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČĐŸŃ— Ń–ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–Ń—](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). + * Pydantic таĐșĐŸĐ¶ ĐŽĐŸĐ·ĐČĐŸĐ»ŃŃ” прДЎстаĐČĐ»ŃŃ‚Đž цД яĐș «ISO 8601 time diff encoding», [ĐŽĐžĐČіться ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–ŃŽ ĐŽĐ»Ń ĐŸŃ‚Ń€ĐžĐŒĐ°ĐœĐœŃ ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČĐŸŃ— Ń–ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–Ń—](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). * `frozenset`: * ĐŁ запОтах і ĐČŃ–ĐŽĐżĐŸĐČіЮях цД буЎД ĐŸĐ±Ń€ĐŸĐ±Đ»Đ”ĐœĐŸ таĐș ŃĐ°ĐŒĐŸ, яĐș і `set`: * ĐŁ запОтах ŃĐżĐžŃĐŸĐș буЎД Đ·Ń‡ĐžŃ‚Đ°ĐœĐŸ, ĐŽŃƒĐ±Đ»Ń–Đșато буЎД ĐČĐžĐŽĐ°Đ»Đ”ĐœĐŸ, і ĐčĐŸĐłĐŸ буЎД пДрДтĐČĐŸŃ€Đ”ĐœĐŸ ĐœĐ° `set`. * ĐŁ ĐČŃ–ĐŽĐżĐŸĐČіЮях `set` буЎД пДрДтĐČĐŸŃ€Đ”ĐœĐŸ ĐœĐ° `list`. - * Đ—ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœĐ° ŃŃ…Đ”ĐŒĐ° буЎД ĐČĐșазуĐČато, Ń‰ĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ `set` є ŃƒĐœŃ–ĐșĐ°Đ»ŃŒĐœĐžĐŒĐž (Đ· ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃĐŒ JSON Schema's `uniqueItems`). + * Đ—ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœĐ° ŃŃ…Đ”ĐŒĐ° буЎД ĐČĐșазуĐČато, Ń‰ĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ `set` є ŃƒĐœŃ–ĐșĐ°Đ»ŃŒĐœĐžĐŒĐž (Đ· ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃĐŒ `uniqueItems` ĐĄŃ…Đ”ĐŒĐž JSON). * `bytes`: * ĐĄŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœĐžĐč ПаĐčŃ‚ĐŸĐœŃ–ĐČсьĐșĐžĐč `bytes`. * ĐŁ запОтах і ĐČŃ–ĐŽĐżĐŸĐČіЮях цД буЎД ĐŸĐ±Ń€ĐŸĐ±Đ»Đ”ĐœĐŸ яĐș `str`. - * Đ—ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœĐ° ŃŃ…Đ”ĐŒĐ° буЎД ĐČĐșазуĐČато, Ń‰ĐŸ цД `str` Đ· "Ń„ĐŸŃ€ĐŒĐ°Ń‚ĐŸĐŒ" `binary`. + * Đ—ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœĐ° ŃŃ…Đ”ĐŒĐ° буЎД ĐČĐșазуĐČато, Ń‰ĐŸ цД `str` Đ· Â«Ń„ĐŸŃ€ĐŒĐ°Ń‚ĐŸĐŒÂ» `binary`. * `Decimal`: * ĐĄŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ĐœĐžĐč ПаĐčŃ‚ĐŸĐœŃ–ĐČсьĐșĐžĐč `Decimal`. * ĐŁ запОтах і ĐČŃ–ĐŽĐżĐŸĐČіЮях цД буЎД ĐŸĐ±Ń€ĐŸĐ±Đ»Đ”ĐœĐŸ таĐș ŃĐ°ĐŒĐŸ, яĐș і `float`. diff --git a/docs/uk/docs/tutorial/extra-models.md b/docs/uk/docs/tutorial/extra-models.md index 271e553fd..564f9fc44 100644 --- a/docs/uk/docs/tutorial/extra-models.md +++ b/docs/uk/docs/tutorial/extra-models.md @@ -63,7 +63,7 @@ print(user_dict) #### Đ ĐŸĐ·ĐżĐ°ĐșуĐČĐ°ĐœĐœŃ `dict` { #unpacking-a-dict } -ĐŻĐșŃ‰ĐŸ ĐČĐ·ŃŃ‚Đž `dict`, ĐœĐ°ĐżŃ€ĐžĐșлаЎ `user_dict`, і пДрДЎатО ĐčĐŸĐłĐŸ у Ń„ŃƒĐœĐșцію (Đ°Đ±ĐŸ Đșлас) яĐș `**user_dict`, Python Â«Ń€ĐŸĐ·ĐżĐ°ĐșŃƒŃ”Â» ĐčĐŸĐłĐŸ. Ключі та Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ `user_dict` Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐżĐ”Ń€Đ”ĐŽĐ°ĐœŃ– Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ яĐș Ń–ĐŒĐ”ĐœĐŸĐČĐ°ĐœŃ– Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Đž. +ĐŻĐșŃ‰ĐŸ ĐČĐ·ŃŃ‚Đž `dict`, ĐœĐ°ĐżŃ€ĐžĐșлаЎ `user_dict`, і пДрДЎатО ĐčĐŸĐłĐŸ у Ń„ŃƒĐœĐșцію (Đ°Đ±ĐŸ Đșлас) яĐș `**user_dict`, Python Â«Ń€ĐŸĐ·ĐżĐ°ĐșŃƒŃ”Â» ĐčĐŸĐłĐŸ. Ключі та Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ `user_dict` Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐżĐ”Ń€Đ”ĐŽĐ°ĐœŃ– Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ яĐș Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Đž Đșлюч-Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ. ОтжД, ĐżŃ€ĐŸĐŽĐŸĐČĐ¶ŃƒŃŽŃ‡Đž Đ· `user_dict` ĐČОщД, запОс: @@ -176,7 +176,7 @@ UserInDB( ĐŁ Ń†ŃŒĐŸĐŒŃƒ проĐșлаЎі ĐŒĐž ĐżĐ”Ń€Đ”ĐŽĐ°Ń”ĐŒĐŸ `Union[PlaneItem, CarItem]` яĐș Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Ńƒ `response_model`. -ОсĐșŃ–Đ»ŃŒĐșĐž ĐŒĐž ĐżĐ”Ń€Đ”ĐŽĐ°Ń”ĐŒĐŸ ĐčĐŸĐłĐŸ яĐș Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Ńƒ, а ĐœĐ” ĐČ Đ°ĐœĐŸŃ‚Đ°Ń†Ń–Ń— топу, ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `Union` ĐœĐ°ĐČіть у Python 3.10. +ОсĐșŃ–Đ»ŃŒĐșĐž ĐŒĐž ĐżĐ”Ń€Đ”ĐŽĐ°Ń”ĐŒĐŸ ĐčĐŸĐłĐŸ яĐș **Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Ńƒ**, а ĐœĐ” Ń€ĐŸĐ·ĐŒŃ–Ń‰ŃƒŃ”ĐŒĐŸ ĐČ **Đ°ĐœĐŸŃ‚Đ°Ń†Ń–Ń— топу**, ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `Union` ĐœĐ°ĐČіть у Python 3.10. ĐŻĐșбО цД була Đ°ĐœĐŸŃ‚Đ°Ń†Ń–Ń топу, ĐŒĐŸĐ¶ĐœĐ° Đ±ŃƒĐ»ĐŸ б ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐČДртОĐșĐ°Đ»ŃŒĐœŃƒ росĐșу, ĐœĐ°ĐżŃ€ĐžĐșлаЎ: @@ -184,7 +184,7 @@ UserInDB( some_variable: PlaneItem | CarItem ``` -АлД яĐșŃ‰ĐŸ запОсатО цД яĐș просĐČĐŸŃ”ĐœĐœŃ `response_model=PlaneItem | CarItem`, ĐŸŃ‚Ń€ĐžĐŒĐ°Ń”ĐŒĐŸ ĐżĐŸĐŒĐžĐ»Đșу, Ń‚ĐŸĐŒŃƒ Ń‰ĐŸ Python ŃĐżŃ€ĐŸĐ±ŃƒŃ” ĐČĐžĐșĐŸĐœĐ°Ń‚Đž ĐœĐ”ĐČĐ°Đ»Ń–ĐŽĐœŃƒ ĐŸĐżĐ”Ń€Đ°Ń†Ń–ŃŽ ĐŒŃ–Đ¶ `PlaneItem` і `CarItem`, Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ Ń‚ĐŸĐłĐŸ Ń‰ĐŸĐ± траĐșтуĐČато цД яĐș Đ°ĐœĐŸŃ‚Đ°Ń†Ń–ŃŽ топу. +АлД яĐșŃ‰ĐŸ запОсатО цД яĐș просĐČĐŸŃ”ĐœĐœŃ `response_model=PlaneItem | CarItem`, ĐŸŃ‚Ń€ĐžĐŒĐ°Ń”ĐŒĐŸ ĐżĐŸĐŒĐžĐ»Đșу, Ń‚ĐŸĐŒŃƒ Ń‰ĐŸ Python ŃĐżŃ€ĐŸĐ±ŃƒŃ” ĐČĐžĐșĐŸĐœĐ°Ń‚Đž **ĐœĐ”ĐČĐ°Đ»Ń–ĐŽĐœŃƒ ĐŸĐżĐ”Ń€Đ°Ń†Ń–ŃŽ** ĐŒŃ–Đ¶ `PlaneItem` і `CarItem`, Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ Ń‚ĐŸĐłĐŸ Ń‰ĐŸĐ± траĐșтуĐČато цД яĐș Đ°ĐœĐŸŃ‚Đ°Ń†Ń–ŃŽ топу. ## ĐĄĐżĐžŃĐŸĐș ĐŒĐŸĐŽĐ”Đ»Đ”Đč { #list-of-models } @@ -208,4 +208,4 @@ some_variable: PlaneItem | CarItem ВоĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД ĐșŃ–Đ»ŃŒĐșа ĐŒĐŸĐŽĐ”Đ»Đ”Đč Pydantic і ĐČŃ–Đ»ŃŒĐœĐŸ ĐœĐ°ŃĐ»Ń–ĐŽŃƒĐčтД ĐŽĐ»Ń ĐșĐŸĐ¶ĐœĐŸĐłĐŸ ĐČОпаЎĐșу. -ĐĐ” ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐŸ ĐŒĐ°Ń‚Đž ĐŸĐŽĐœŃƒ ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐŽĐ°ĐœĐžŃ… ĐœĐ° ŃŃƒŃ‚ĐœŃ–ŃŃ‚ŃŒ, яĐșŃ‰ĐŸ ця ŃŃƒŃ‚ĐœŃ–ŃŃ‚ŃŒ ĐŒĐŸĐ¶Đ” ĐŒĐ°Ń‚Đž Ń€Ń–Đ·ĐœŃ– Â«ŃŃ‚Đ°ĐœĐžÂ». ĐŻĐș у ĐČОпаЎĐșу ŃŃƒŃ‚ĐœĐŸŃŃ‚Ń– ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача Đ·Ń– ŃŃ‚Đ°ĐœĐ°ĐŒĐž: Đ· `password`, Đ· `password_hash` і бДз ĐżĐ°Ń€ĐŸĐ»Ń. +ĐĐ” ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐŸ ĐŒĐ°Ń‚Đž ĐŸĐŽĐœŃƒ ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐŽĐ°ĐœĐžŃ… ĐœĐ° ŃŃƒŃ‚ĐœŃ–ŃŃ‚ŃŒ, яĐșŃ‰ĐŸ ця ŃŃƒŃ‚ĐœŃ–ŃŃ‚ŃŒ ĐżĐŸĐČĐžĐœĐœĐ° ĐŒĐ°Ń‚Đž Ń€Ń–Đ·ĐœŃ– Â«ŃŃ‚Đ°ĐœĐžÂ». Â«ĐĄŃƒŃ‚ĐœŃ–ŃŃ‚ŃŒÂ» **ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČач** є проĐșĐ»Đ°ĐŽĐŸĐŒ Đ·Ń– ŃŃ‚Đ°ĐœĐ°ĐŒĐž, Ń‰ĐŸ ĐČĐșĐ»ŃŽŃ‡Đ°ŃŽŃ‚ŃŒ `password`, `password_hash` Đ°Đ±ĐŸ ĐČŃ–ĐŽŃŃƒŃ‚ĐœŃ–ŃŃ‚ŃŒ ĐżĐ°Ń€ĐŸĐ»Ń. diff --git a/docs/uk/docs/tutorial/first-steps.md b/docs/uk/docs/tutorial/first-steps.md index 2557d646c..0469e6c4d 100644 --- a/docs/uk/docs/tutorial/first-steps.md +++ b/docs/uk/docs/tutorial/first-steps.md @@ -88,13 +88,13 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) #### Â«ĐĄŃ…Đ”ĐŒĐ°Â» { #schema } -Â«ĐĄŃ…Đ”ĐŒĐ°Â» — цД ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃ Đ°Đ±ĐŸ ĐŸĐżĐžŃ Ń‡ĐŸĐłĐŸŃŃŒ. ĐŠĐ” ĐœĐ” ĐșĐŸĐŽ, яĐșĐžĐč ĐčĐŸĐłĐŸ Ń€Đ”Đ°Đ»Ń–Đ·ŃƒŃ”, а ĐżŃ€ĐŸŃŃ‚ĐŸ абстраĐșŃ‚ĐœĐžĐč ĐŸĐżĐžŃ. +Â«ĐĄŃ…Đ”ĐŒĐ°Â» - цД ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃ Đ°Đ±ĐŸ ĐŸĐżĐžŃ Ń‡ĐŸĐłĐŸŃŃŒ. ĐŠĐ” ĐœĐ” ĐșĐŸĐŽ, яĐșĐžĐč ĐčĐŸĐłĐŸ Ń€Đ”Đ°Đ»Ń–Đ·ŃƒŃ”, а ĐżŃ€ĐŸŃŃ‚ĐŸ абстраĐșŃ‚ĐœĐžĐč ĐŸĐżĐžŃ. #### API Â«ŃŃ…Đ”ĐŒĐ°Â» { #api-schema } ĐŁ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу, [OpenAPI](https://github.com/OAI/OpenAPI-Specification) є спДцОфіĐșацією, яĐșа ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń”, яĐș ĐŸĐżĐžŃĐ°Ń‚Đž ŃŃ…Đ”ĐŒŃƒ ĐČĐ°ŃˆĐŸĐłĐŸ API. -ĐŠĐ” ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃ ŃŃ…Đ”ĐŒĐž ĐČĐșлючає ŃˆĐ»ŃŃ…Đž (paths) ĐČĐ°ŃˆĐŸĐłĐŸ API, ĐŒĐŸĐ¶Đ»ĐžĐČі ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž, яĐșі ĐČĐŸĐœĐž проĐčĐŒĐ°ŃŽŃ‚ŃŒ, Ń‚ĐŸŃ‰ĐŸ. +ĐŠĐ” ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃ ŃŃ…Đ”ĐŒĐž ĐČĐșлючає ŃˆĐ»ŃŃ…Đž ĐČĐ°ŃˆĐŸĐłĐŸ API, ĐŒĐŸĐ¶Đ»ĐžĐČі ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž, яĐșі ĐČĐŸĐœĐž проĐčĐŒĐ°ŃŽŃ‚ŃŒ, Ń‚ĐŸŃ‰ĐŸ. #### Â«ĐĄŃ…Đ”ĐŒĐ°Â» ĐŽĐ°ĐœĐžŃ… { #data-schema } @@ -102,13 +102,13 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ĐŁ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу цД ĐŸĐ·ĐœĐ°Ń‡Đ°Ń” Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚Đž JSON і топо ĐŽĐ°ĐœĐžŃ…, яĐșі ĐČĐŸĐœĐž ĐŒĐ°ŃŽŃ‚ŃŒ, Ń‚ĐŸŃ‰ĐŸ. -#### OpenAPI і JSON Schema { #openapi-and-json-schema } +#### OpenAPI і ĐĄŃ…Đ”ĐŒĐ° JSON { #openapi-and-json-schema } -OpenAPI ĐŸĐżĐžŃŃƒŃ” ŃŃ…Đ”ĐŒŃƒ API ĐŽĐ»Ń ĐČĐ°ŃˆĐŸĐłĐŸ API. І ця ŃŃ…Đ”ĐŒĐ° ĐČĐșлючає ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃ (Đ°Đ±ĐŸ Â«ŃŃ…Đ”ĐŒĐžÂ») ĐŽĐ°ĐœĐžŃ…, Ń‰ĐŸ ĐœĐ°ĐŽŃĐžĐ»Đ°ŃŽŃ‚ŃŒŃŃ та ĐŸŃ‚Ń€ĐžĐŒŃƒŃŽŃ‚ŃŒŃŃ ĐČĐ°ŃˆĐžĐŒ API, за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ **JSON Schema**, ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Ńƒ ĐŽĐ»Ń ŃŃ…Đ”ĐŒ ĐŽĐ°ĐœĐžŃ… JSON. +OpenAPI ĐŸĐżĐžŃŃƒŃ” ŃŃ…Đ”ĐŒŃƒ API ĐŽĐ»Ń ĐČĐ°ŃˆĐŸĐłĐŸ API. І ця ŃŃ…Đ”ĐŒĐ° ĐČĐșлючає ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃ (Đ°Đ±ĐŸ Â«ŃŃ…Đ”ĐŒĐžÂ») ĐŽĐ°ĐœĐžŃ…, Ń‰ĐŸ ĐœĐ°ĐŽŃĐžĐ»Đ°ŃŽŃ‚ŃŒŃŃ та ĐŸŃ‚Ń€ĐžĐŒŃƒŃŽŃ‚ŃŒŃŃ ĐČĐ°ŃˆĐžĐŒ API, за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ **ĐĄŃ…Đ”ĐŒĐž JSON**, ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Ńƒ ĐŽĐ»Ń ŃŃ…Đ”ĐŒ ĐŽĐ°ĐœĐžŃ… JSON. #### ĐŸĐ”Ń€Đ”ĐČіртД `openapi.json` { #check-the-openapi-json } -ĐŻĐșŃ‰ĐŸ ĐČас ціĐșаĐČоть, яĐș ĐČĐžĐłĐ»ŃĐŽĐ°Ń” «сОрОĐč» OpenAPI schema, FastAPI аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ ĐłĐ”ĐœĐ”Ń€ŃƒŃ” JSON (schema) Đ· ĐŸĐżĐžŃĐ°ĐŒĐž ĐČŃŃŒĐŸĐłĐŸ ĐČĐ°ŃˆĐŸĐłĐŸ API. +ĐŻĐșŃ‰ĐŸ ĐČас ціĐșаĐČоть, яĐș ĐČĐžĐłĐ»ŃĐŽĐ°Ń” «сОрa» ŃŃ…Đ”ĐŒĐ° OpenAPI, FastAPI аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ ĐłĐ”ĐœĐ”Ń€ŃƒŃ” JSON (ŃŃ…Đ”ĐŒŃƒ) Đ· ĐŸĐżĐžŃĐ°ĐŒĐž ĐČŃŃŒĐŸĐłĐŸ ĐČĐ°ŃˆĐŸĐłĐŸ API. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸĐ±Đ°Ń‡ĐžŃ‚Đž цД ĐœĐ°ĐżŃ€ŃĐŒŃƒ тут: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json). @@ -137,7 +137,7 @@ OpenAPI ĐŸĐżĐžŃŃƒŃ” ŃŃ…Đ”ĐŒŃƒ API ĐŽĐ»Ń ĐČĐ°ŃˆĐŸĐłĐŸ API. І ця ŃŃ…Đ”ĐŒĐ° #### Đ”Đ»Ń Ń‡ĐŸĐłĐŸ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžĐč OpenAPI { #what-is-openapi-for } -OpenAPI schema — цД тД, ĐœĐ° Ń‡ĐŸĐŒŃƒ працюють ĐŽĐČі ĐČĐșĐ»ŃŽŃ‡Đ”ĐœŃ– ŃĐžŃŃ‚Đ”ĐŒĐž Ń–ĐœŃ‚Đ”Ń€Đ°ĐșтоĐČĐœĐŸŃ— ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń—. +ĐĄŃ…Đ”ĐŒĐ° OpenAPI - цД тД, ĐœĐ° Ń‡ĐŸĐŒŃƒ працюють ĐŽĐČі ĐČĐșĐ»ŃŽŃ‡Đ”ĐœŃ– ŃĐžŃŃ‚Đ”ĐŒĐž Ń–ĐœŃ‚Đ”Ń€Đ°ĐșтоĐČĐœĐŸŃ— ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń—. йаĐșĐŸĐ¶ Ń–ŃĐœŃƒŃŽŃ‚ŃŒ ĐŽĐ”ŃŃŃ‚ĐșĐž Đ°Đ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČ, і ĐČсі ĐČĐŸĐœĐž Đ·Đ°ŃĐœĐŸĐČĐ°ĐœŃ– ĐœĐ° OpenAPI. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” лДгĐșĐŸ ĐŽĐŸĐŽĐ°Ń‚Đž Đ±ŃƒĐŽŃŒ-яĐșу Đ· цох Đ°Đ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČ ĐŽĐŸ ĐČĐ°ŃˆĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу, стĐČĐŸŃ€Đ”ĐœĐŸĐłĐŸ Đ· **FastAPI**. @@ -226,11 +226,11 @@ CLI аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ ĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚ŃŒ ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș FastAP {* ../../docs_src/first_steps/tutorial001_py310.py hl[1] *} -`FastAPI` — цД Đșлас у Python, яĐșĐžĐč ĐœĐ°ĐŽĐ°Ń” ĐČсю Ń„ŃƒĐœĐșŃ†Ń–ĐŸĐœĐ°Đ»ŃŒĐœŃ–ŃŃ‚ŃŒ ĐŽĐ»Ń ĐČĐ°ŃˆĐŸĐłĐŸ API. +`FastAPI` - цД Đșлас у Python, яĐșĐžĐč ĐœĐ°ĐŽĐ°Ń” ĐČсю Ń„ŃƒĐœĐșŃ†Ń–ĐŸĐœĐ°Đ»ŃŒĐœŃ–ŃŃ‚ŃŒ ĐŽĐ»Ń ĐČĐ°ŃˆĐŸĐłĐŸ API. /// note | ĐąĐ”Ń…ĐœŃ–Ń‡ĐœŃ– ЎДталі -`FastAPI` — цД Đșлас, яĐșĐžĐč успаЎĐșĐŸĐČується Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐČіЮ `Starlette`. +`FastAPI` - цД Đșлас, яĐșĐžĐč успаЎĐșĐŸĐČується Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐČіЮ `Starlette`. Во таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐČсю Ń„ŃƒĐœĐșŃ†Ń–ĐŸĐœĐ°Đ»ŃŒĐœŃ–ŃŃ‚ŃŒ [Starlette](https://www.starlette.dev/) у `FastAPI`. @@ -312,7 +312,7 @@ https://example.com/items/foo ДДĐșĐŸŃ€Đ°Ń‚ĐŸŃ€ `@app.get("/")` ĐżĐŸĐČŃ–ĐŽĐŸĐŒĐ»ŃŃ” **FastAPI**, Ń‰ĐŸ Ń„ŃƒĐœĐșція ĐŸĐŽŃ€Đ°Đ·Ńƒ ĐœĐžĐ¶Ń‡Đ” ĐČŃ–ĐŽĐżĐŸĐČіЮає за ĐŸĐ±Ń€ĐŸĐ±Đșу запОтіĐČ, яĐșі ĐœĐ°ĐŽŃ…ĐŸĐŽŃŃ‚ŃŒ ĐŽĐŸ: * ŃˆĐ»ŃŃ…Ńƒ `/` -* ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо get ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń +* ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо ĐŸĐżĐ”Ń€Đ°Ń†Ń–ŃŽ get /// note | `@decorator` Đ†ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–Ń @@ -389,7 +389,7 @@ https://example.com/items/foo йаĐșĐŸĐ¶ ĐŒĐŸĐ¶ĐœĐ° ĐżĐŸĐČĐ”Ń€ĐœŃƒŃ‚Đž ĐŒĐŸĐŽĐ”Đ»Ń– Pydantic (ĐżŃ€ĐŸ цД ĐČĐž ĐŽŃ–Đ·ĐœĐ°Ń”Ń‚Đ”ŃŃŒ ĐżŃ–Đ·ĐœŃ–ŃˆĐ”). -Đ†ŃĐœŃƒŃ” Đ±Đ°ĐłĐ°Ń‚ĐŸ Ń–ĐœŃˆĐžŃ… ĐŸĐ±ÊŒŃ”ĐșтіĐČ Ń– ĐŒĐŸĐŽĐ”Đ»Đ”Đč, яĐșі Đ±ŃƒĐŽŃƒŃ‚ŃŒ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ ĐșĐŸĐœĐČĐ”Ń€Ń‚ĐŸĐČĐ°ĐœŃ– ĐČ JSON (Đ·ĐŸĐșŃ€Đ”ĐŒĐ° ORM Ń‚ĐŸŃ‰ĐŸ). ĐĄĐżŃ€ĐŸĐ±ŃƒĐčтД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž сĐČĐŸŃ— ŃƒĐ»ŃŽĐ±Đ»Đ”ĐœŃ– — ĐČДлОĐșа ĐčĐŒĐŸĐČŃ–Ń€ĐœŃ–ŃŃ‚ŃŒ, Ń‰ĐŸ ĐČĐŸĐœĐž ĐČжД ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃŽŃ‚ŃŒŃŃ. +Đ†ŃĐœŃƒŃ” Đ±Đ°ĐłĐ°Ń‚ĐŸ Ń–ĐœŃˆĐžŃ… ĐŸĐ±ÊŒŃ”ĐșтіĐČ Ń– ĐŒĐŸĐŽĐ”Đ»Đ”Đč, яĐșі Đ±ŃƒĐŽŃƒŃ‚ŃŒ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ ĐșĐŸĐœĐČĐ”Ń€Ń‚ĐŸĐČĐ°ĐœŃ– ĐČ JSON (Đ·ĐŸĐșŃ€Đ”ĐŒĐ° ORM Ń‚ĐŸŃ‰ĐŸ). ĐĄĐżŃ€ĐŸĐ±ŃƒĐčтД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž сĐČĐŸŃ— ŃƒĐ»ŃŽĐ±Đ»Đ”ĐœŃ– - ĐČДлОĐșа ĐčĐŒĐŸĐČŃ–Ń€ĐœŃ–ŃŃ‚ŃŒ, Ń‰ĐŸ ĐČĐŸĐœĐž ĐČжД ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃŽŃ‚ŃŒŃŃ. ### ĐšŃ€ĐŸĐș 6: Ń€ĐŸĐ·ĐłĐŸŃ€ĐœŃ–Ń‚ŃŒ ĐčĐŸĐłĐŸ { #step-6-deploy-it } @@ -403,11 +403,11 @@ https://example.com/items/foo Đ’Ń–Đœ ĐżĐ”Ń€Đ”ĐœĐŸŃĐžŃ‚ŃŒ Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč **ĐŽĐŸŃĐČіЮ Ń€ĐŸĐ·Ń€ĐŸĐ±ĐœĐžĐșа** Đ·Ń– стĐČĐŸŃ€Đ”ĐœĐœŃ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșіĐČ ĐœĐ° FastAPI ĐœĐ° **Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ** їх у Ń…ĐŒĐ°Ń€Ń–. 🎉 -FastAPI Cloud — ĐŸŃĐœĐŸĐČĐœĐžĐč ŃĐżĐŸĐœŃĐŸŃ€ і ĐŽĐ¶Đ”Ń€Đ”Đ»ĐŸ Ń„Ń–ĐœĐ°ĐœŃŃƒĐČĐ°ĐœĐœŃ ĐŽĐ»Ń open source ĐżŃ€ĐŸŃ”ĐșтіĐČ *FastAPI and friends*. ✹ +FastAPI Cloud - ĐŸŃĐœĐŸĐČĐœĐžĐč ŃĐżĐŸĐœŃĐŸŃ€ і ĐŽĐ¶Đ”Ń€Đ”Đ»ĐŸ Ń„Ń–ĐœĐ°ĐœŃŃƒĐČĐ°ĐœĐœŃ ĐŽĐ»Ń open source ĐżŃ€ĐŸŃ”ĐșтіĐČ *FastAPI and friends*. ✹ #### Đ ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃ ĐČ Ń–ĐœŃˆĐžŃ… Ń…ĐŒĐ°Ń€ĐœĐžŃ… ĐżŃ€ĐŸĐČаĐčЎДрах { #deploy-to-other-cloud-providers } -FastAPI — цД open source і Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ°Ń…. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°Ń‚Đž FastAPI-Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž у Đ±ŃƒĐŽŃŒ-яĐșĐŸĐłĐŸ Ń…ĐŒĐ°Ń€ĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐČаĐčЎДра ĐœĐ° ĐČаш ĐČОбір. +FastAPI - цД open source і Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚Đ°Ń…. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°Ń‚Đž FastAPI-Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž у Đ±ŃƒĐŽŃŒ-яĐșĐŸĐłĐŸ Ń…ĐŒĐ°Ń€ĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐČаĐčЎДра ĐœĐ° ĐČаш ĐČОбір. Đ”ĐŸŃ‚Ń€ĐžĐŒŃƒĐčŃ‚Đ”ŃŃ Ń–ĐœŃŃ‚Ń€ŃƒĐșціĐč ĐČĐ°ŃˆĐŸĐłĐŸ Ń…ĐŒĐ°Ń€ĐœĐŸĐłĐŸ ĐżŃ€ĐŸĐČаĐčЎДра, Ń‰ĐŸĐ± Ń€ĐŸĐ·ĐłĐŸŃ€ĐœŃƒŃ‚Đž FastAPI-Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž Đ· Ń—Ń…ĐœŃŒĐŸŃŽ ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ. đŸ€“ diff --git a/docs/uk/docs/tutorial/handling-errors.md b/docs/uk/docs/tutorial/handling-errors.md index 262efa0e0..381e65cc0 100644 --- a/docs/uk/docs/tutorial/handling-errors.md +++ b/docs/uk/docs/tutorial/handling-errors.md @@ -33,7 +33,7 @@ ОсĐșŃ–Đ»ŃŒĐșĐž цД ĐżĐŸĐŒĐžĐ»Đșа Python, ĐČĐž ĐœĐ” `return` її, а `raise` її. -ĐŠĐ” таĐșĐŸĐ¶ ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ яĐșŃ‰ĐŸ ĐČĐž ĐżĐ”Ń€Đ”Đ±ŃƒĐČаєтД ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– ĐŽĐŸĐżĐŸĐŒŃ–Đ¶ĐœĐŸŃ— Ń„ŃƒĐœĐșції, яĐșу ĐČĐžĐșлОĐșаєтД ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– сĐČĐŸŃ”Ń— *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, і Ń‚Đ°ĐŒ Đ·ĐłĐ”ĐœĐ”Ń€ŃƒŃ”Ń‚Đ” `HTTPException` ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– цієї ĐŽĐŸĐżĐŸĐŒŃ–Đ¶ĐœĐŸŃ— Ń„ŃƒĐœĐșції, Ń‚ĐŸ Ń€Đ”ŃˆŃ‚Đ° ĐșĐŸĐŽŃƒ ĐČ *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* ĐœĐ” буЎД ĐČĐžĐșĐŸĐœĐ°ĐœĐ°. Запот ĐŸĐŽŃ€Đ°Đ·Ńƒ заĐČĐ”Ń€ŃˆĐžŃ‚ŃŒŃŃ, і HTTP-ĐżĐŸĐŒĐžĐ»Đșа Đ· `HTTPException` буЎД ĐœĐ°ĐŽŃ–ŃĐ»Đ°ĐœĐ° ĐșĐ»Ń–Ń”ĐœŃ‚Ńƒ. +ĐŠĐ” таĐșĐŸĐ¶ ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ яĐșŃ‰ĐŸ ĐČĐž пДрДбĐČаєтД ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– ĐŽĐŸĐżĐŸĐŒŃ–Đ¶ĐœĐŸŃ— Ń„ŃƒĐœĐșції, яĐșу ĐČĐžĐșлОĐșаєтД ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– сĐČĐŸŃ”Ń— *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, і Ń‚Đ°ĐŒ Đ·ĐłĐ”ĐœĐ”Ń€ŃƒŃ”Ń‚Đ” `HTTPException` ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– цієї ĐŽĐŸĐżĐŸĐŒŃ–Đ¶ĐœĐŸŃ— Ń„ŃƒĐœĐșції, Ń‚ĐŸ Ń€Đ”ŃˆŃ‚Đ° ĐșĐŸĐŽŃƒ ĐČ *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* ĐœĐ” буЎД ĐČĐžĐșĐŸĐœĐ°ĐœĐ°. Запот ĐŸĐŽŃ€Đ°Đ·Ńƒ заĐČĐ”Ń€ŃˆĐžŃ‚ŃŒŃŃ, і HTTP-ĐżĐŸĐŒĐžĐ»Đșа Đ· `HTTPException` буЎД ĐœĐ°ĐŽŃ–ŃĐ»Đ°ĐœĐ° ĐșĐ»Ń–Ń”ĐœŃ‚Ńƒ. ĐŸĐ”Ń€Đ”ĐČага ĐłĐ”ĐœĐ”Ń€Đ°Ń†Ń–Ń— ĐČĐžĐșĐ»ŃŽŃ‡Đ”ĐœĐœŃ Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ ĐżĐŸĐČĐ”Ń€ĐœĐ”ĐœĐœŃ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ ŃŃ‚Đ°ĐœĐ” Đ±Ń–Đ»ŃŒŃˆ ĐŸŃ‡Đ”ĐČĐžĐŽĐœĐŸŃŽ ĐČ Ń€ĐŸĐ·ĐŽŃ–Đ»Ń– ĐżŃ€ĐŸ Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– та бДзпДĐșу. diff --git a/docs/uk/docs/tutorial/index.md b/docs/uk/docs/tutorial/index.md index 629b71dec..f89656236 100644 --- a/docs/uk/docs/tutorial/index.md +++ b/docs/uk/docs/tutorial/index.md @@ -54,7 +54,7 @@ $ fastapi dev **ДУЖЕ Ń€Đ°ĐŽĐžĐŒĐŸ** ĐœĐ°ĐżĐžŃĐ°Ń‚Đž Đ°Đ±ĐŸ сĐșĐŸĐżŃ–ŃŽĐČато ĐșĐŸĐŽ, ĐČŃ–ĐŽŃ€Đ”ĐŽĐ°ĐłŃƒĐČато ĐčĐŸĐłĐŸ та Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž Đ»ĐŸĐșĐ°Đ»ŃŒĐœĐŸ. -ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐčĐŸĐłĐŸ у сĐČĐŸŃ”ĐŒŃƒ рДЎаĐșŃ‚ĐŸŃ€Ń– – цД тД, Ń‰ĐŸ ЮіĐčŃĐœĐŸ ĐżĐŸĐșĐ°Đ·ŃƒŃ” ĐČĐ°ĐŒ пДрДĐČагО FastAPI, бачОтД, яĐș ĐŒĐ°Đ»ĐŸ ĐșĐŸĐŽŃƒ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐœĐ°ĐżĐžŃĐ°Ń‚Đž, ĐČсі пДрДĐČірĐșĐž топіĐČ, аĐČŃ‚ĐŸĐ·Đ°ĐżĐŸĐČĐœĐ”ĐœĐœŃ Ń‚ĐŸŃ‰ĐŸ. +ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐčĐŸĐłĐŸ у сĐČĐŸŃ”ĐŒŃƒ рДЎаĐșŃ‚ĐŸŃ€Ń– - цД тД, Ń‰ĐŸ ЮіĐčŃĐœĐŸ ĐżĐŸĐșĐ°Đ·ŃƒŃ” ĐČĐ°ĐŒ пДрДĐČагО FastAPI, бачОтД, яĐș ĐŒĐ°Đ»ĐŸ ĐșĐŸĐŽŃƒ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐœĐ°ĐżĐžŃĐ°Ń‚Đž, ĐČсі пДрДĐČірĐșĐž топіĐČ, аĐČŃ‚ĐŸĐ·Đ°ĐżĐŸĐČĐœĐ”ĐœĐœŃ Ń‚ĐŸŃ‰ĐŸ. --- @@ -86,7 +86,7 @@ $ pip install "fastapi[standard]" /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -FastAPI ĐŒĐ°Ń” [ĐŸŃ„Ń–Ń†Ń–ĐčĐœĐ” Ń€ĐŸĐ·ŃˆĐžŃ€Đ”ĐœĐœŃ ĐŽĐ»Ń VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (та Cursor), яĐșĐ” ĐœĐ°ĐŽĐ°Ń” Đ±Đ°ĐłĐ°Ń‚ĐŸ ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Đ”Đč, ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ· ĐżĐ”Ń€Đ”ĐłĐ»ŃĐŽĐ°Ń‡Đ”ĐŒ ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…Ńƒ, ĐżĐŸŃˆŃƒĐșĐŸĐŒ ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…Ńƒ, ĐœĐ°ĐČігацією CodeLens у тДстах (пДрДхіЎ ĐŽĐŸ ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃ Đ· тДстіĐČ), а таĐșĐŸĐ¶ Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃĐŒ і Đ¶ŃƒŃ€ĐœĐ°Đ»Đ°ĐŒĐž FastAPI Cloud — усД Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Đ· ĐČĐ°ŃˆĐŸĐłĐŸ рДЎаĐșŃ‚ĐŸŃ€Đ°. +FastAPI ĐŒĐ°Ń” [ĐŸŃ„Ń–Ń†Ń–ĐčĐœĐ” Ń€ĐŸĐ·ŃˆĐžŃ€Đ”ĐœĐœŃ ĐŽĐ»Ń VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (та Cursor), яĐșĐ” ĐœĐ°ĐŽĐ°Ń” Đ±Đ°ĐłĐ°Ń‚ĐŸ ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Đ”Đč, ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ· ĐżĐ”Ń€Đ”ĐłĐ»ŃĐŽĐ°Ń‡Đ”ĐŒ ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…Ńƒ, ĐżĐŸŃˆŃƒĐșĐŸĐŒ ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…Ńƒ, ĐœĐ°ĐČігацією CodeLens у тДстах (пДрДхіЎ ĐŽĐŸ ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃ Đ· тДстіĐČ), а таĐșĐŸĐ¶ Ń€ĐŸĐ·ĐłĐŸŃ€Ń‚Đ°ĐœĐœŃĐŒ і Đ¶ŃƒŃ€ĐœĐ°Đ»Đ°ĐŒĐž FastAPI Cloud - усД Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Đ· ĐČĐ°ŃˆĐŸĐłĐŸ рДЎаĐșŃ‚ĐŸŃ€Đ°. /// diff --git a/docs/uk/docs/tutorial/metadata.md b/docs/uk/docs/tutorial/metadata.md index d34b83b38..fd7a13b72 100644 --- a/docs/uk/docs/tutorial/metadata.md +++ b/docs/uk/docs/tutorial/metadata.md @@ -11,7 +11,7 @@ | `title` | `str` | ĐĐ°Đ·ĐČа API. | | `summary` | `str` | ĐšĐŸŃ€ĐŸŃ‚ĐșĐžĐč ĐżŃ–ĐŽŃŃƒĐŒĐŸĐș API. Đ”ĐŸŃŃ‚ŃƒĐżĐœĐŸ Đ· OpenAPI 3.1.0, FastAPI 0.99.0. | | `description` | `str` | ĐšĐŸŃ€ĐŸŃ‚ĐșĐžĐč ĐŸĐżĐžŃ API. ĐœĐŸĐ¶Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Markdown. | -| `version` | `string` | Đ’Đ”Ń€ŃŃ–Ń API. ĐŠĐ” ĐČĐ”Ń€ŃŃ–Ń ĐČĐ°ŃˆĐŸĐłĐŸ ĐŽĐŸĐŽĐ°Ń‚Đșа, а ĐœĐ” OpenAPI. НапроĐșлаЎ, `2.5.0`. | +| `version` | `str` | Đ’Đ”Ń€ŃŃ–Ń API. ĐŠĐ” ĐČĐ”Ń€ŃŃ–Ń ĐČĐ°ŃˆĐŸĐłĐŸ ĐŽĐŸĐŽĐ°Ń‚Đșа, а ĐœĐ” OpenAPI. НапроĐșлаЎ, `2.5.0`. | | `terms_of_service` | `str` | URL ĐŽĐŸ ŃƒĐŒĐŸĐČ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ API. ĐŻĐșŃ‰ĐŸ ĐČĐșĐ°Đ·Đ°ĐœĐŸ, ĐŒĐ°Ń” Đ±ŃƒŃ‚Đž у Ń„ĐŸŃ€ĐŒĐ°Ń‚Ń– URL. | | `contact` | `dict` | Đ†ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–Ń ĐŽĐ»Ń ĐșĐŸĐœŃ‚Đ°Đșту Đ· ĐŸĐżŃƒĐ±Đ»Ń–ĐșĐŸĐČĐ°ĐœĐžĐŒ API. ĐœĐŸĐ¶Đ” ĐŒŃ–ŃŃ‚ĐžŃ‚Đž ĐșŃ–Đ»ŃŒĐșа ĐżĐŸĐ»Ń–ĐČ.
contact ĐżĐŸĐ»Ń
ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐąĐžĐżĐžĐżĐžŃ
namestrĐ†ĐŽĐ”ĐœŃ‚ĐžŃ„Ń–ĐșаціĐčĐœĐ” Ń–ĐŒ'я ĐșĐŸĐœŃ‚Đ°ĐșŃ‚ĐœĐŸŃ— ĐŸŃĐŸĐ±Đž Đ°Đ±ĐŸ ĐŸŃ€ĐłĐ°ĐœŃ–Đ·Đ°Ń†Ń–Ń—.
urlstrURL, Ń‰ĐŸ ĐČĐșĐ°Đ·ŃƒŃ” ĐœĐ° ĐșĐŸĐœŃ‚Đ°ĐșŃ‚ĐœŃƒ Ń–ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–ŃŽ. МАЄ Đ±ŃƒŃ‚Đž у Ń„ĐŸŃ€ĐŒĐ°Ń‚Ń– URL.
emailstrАЎрДса ДлДĐșŃ‚Ń€ĐŸĐœĐœĐŸŃ— ĐżĐŸŃˆŃ‚Đž ĐșĐŸĐœŃ‚Đ°ĐșŃ‚ĐœĐŸŃ— ĐŸŃĐŸĐ±Đž Đ°Đ±ĐŸ ĐŸŃ€ĐłĐ°ĐœŃ–Đ·Đ°Ń†Ń–Ń—. МАЄ Đ±ŃƒŃ‚Đž у Ń„ĐŸŃ€ĐŒĐ°Ń‚Ń– аЎрДсО ДлДĐșŃ‚Ń€ĐŸĐœĐœĐŸŃ— ĐżĐŸŃˆŃ‚Đž.
| | `license_info` | `dict` | Đ†ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–Ń ĐżŃ€ĐŸ Đ»Ń–Ń†Đ”ĐœĐ·Ń–ŃŽ ĐŽĐ»Ń ĐŸĐżŃƒĐ±Đ»Ń–ĐșĐŸĐČĐ°ĐœĐŸĐłĐŸ API. ĐœĐŸĐ¶Đ” ĐŒŃ–ŃŃ‚ĐžŃ‚Đž ĐșŃ–Đ»ŃŒĐșа ĐżĐŸĐ»Ń–ĐČ.
license_info ĐżĐŸĐ»Ń
ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐąĐžĐżĐžĐżĐžŃ
namestrОБОВ'ЯЗКОВО (яĐșŃ‰ĐŸ ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐŸ license_info). ĐĐ°Đ·ĐČа Đ»Ń–Ń†Đ”ĐœĐ·Ń–Ń— ĐŽĐ»Ń API.
identifierstrĐ›Ń–Ń†Đ”ĐœĐ·Ń–ĐčĐœĐžĐč ĐČОраз за [SPDX](https://spdx.org/licenses/) ĐŽĐ»Ń API. ĐŸĐŸĐ»Đ” identifier ĐČĐ·Đ°Ń”ĐŒĐŸĐČĐžĐșĐ»ŃŽŃ‡ĐœĐ” Đ· ĐżĐŸĐ»Đ”ĐŒ url. Đ”ĐŸŃŃ‚ŃƒĐżĐœĐŸ Đ· OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrURL ĐŽĐŸ Đ»Ń–Ń†Đ”ĐœĐ·Ń–Ń—, яĐșа ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ĐŽĐ»Ń API. МАЄ Đ±ŃƒŃ‚Đž у Ń„ĐŸŃ€ĐŒĐ°Ń‚Ń– URL.
| diff --git a/docs/uk/docs/tutorial/path-operation-configuration.md b/docs/uk/docs/tutorial/path-operation-configuration.md index 47ae65f3e..151e79d1e 100644 --- a/docs/uk/docs/tutorial/path-operation-configuration.md +++ b/docs/uk/docs/tutorial/path-operation-configuration.md @@ -12,7 +12,7 @@ Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚Đž (HTTP) `status_code`, яĐșĐžĐč буЎД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐŸ у ĐČŃ–ĐŽĐżĐŸĐČіЮі ĐČĐ°ŃˆĐŸŃ— Â«ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…ŃƒÂ». -ĐœĐŸĐ¶ĐœĐ° пДрДЎатО Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ цілОĐč ĐșĐŸĐŽ, ĐœĐ°ĐżŃ€ĐžĐșлаЎ `404`. +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” пДрДЎатО Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐșĐŸĐŽ `int`, ĐœĐ°ĐżŃ€ĐžĐșлаЎ `404`. ĐŻĐșŃ‰ĐŸ ĐČĐž ĐœĐ” ĐżĐ°ĐŒ'ŃŃ‚Đ°Ń”Ń‚Đ” ĐżŃ€ĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐœŃ Ń‡ĐžŃĐ»ĐŸĐČох ĐșĐŸĐŽŃ–ĐČ, сĐșĐŸŃ€ĐžŃŃ‚Đ°ĐčŃ‚Đ”ŃŃ сĐșĐŸŃ€ĐŸŃ‡Đ”ĐœĐžĐŒĐž ĐșĐŸĐœŃŃ‚Đ°ĐœŃ‚Đ°ĐŒĐž ĐČ `status`: @@ -24,7 +24,7 @@ Во таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž `from starlette import status`. -FastAPI ĐœĐ°ĐŽĐ°Ń” Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč `starlette.status` яĐș `fastapi.status` ĐŽĐ»Ń ĐČĐ°ŃˆĐŸŃ— Đ·Ń€ŃƒŃ‡ĐœĐŸŃŃ‚Ń– яĐș Ń€ĐŸĐ·Ń€ĐŸĐ±ĐœĐžĐșа. АлД ĐČŃ–Đœ ĐżĐŸŃ…ĐŸĐŽĐžŃ‚ŃŒ Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Đ·Ń– Starlette. +**FastAPI** ĐœĐ°ĐŽĐ°Ń” Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč `starlette.status` яĐș `fastapi.status` ĐŽĐ»Ń ĐČĐ°ŃˆĐŸŃ— Đ·Ń€ŃƒŃ‡ĐœĐŸŃŃ‚Ń– яĐș Ń€ĐŸĐ·Ń€ĐŸĐ±ĐœĐžĐșа. АлД ĐČŃ–Đœ ĐżĐŸŃ…ĐŸĐŽĐžŃ‚ŃŒ Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Đ·Ń– Starlette. /// @@ -40,11 +40,11 @@ FastAPI ĐœĐ°ĐŽĐ°Ń” Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč `starlette.status` яĐș `fastapi.status` ĐŽ ### МітĐșĐž Đ· пДрДліĐșĐ°ĐŒĐž { #tags-with-enums } -ĐŁ ĐČДлОĐșĐŸĐŒŃƒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐœĐ°ĐșĐŸĐżĐžŃ‡ĐžŃ‚Đž Đ±Đ°ĐłĐ°Ń‚ĐŸ ĐŒŃ–Ń‚ĐŸĐș і Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” пДрДĐșĐŸĐœĐ°Ń‚ĐžŃŃ, Ń‰ĐŸ заĐČжЎО ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ту ŃĐ°ĐŒŃƒ ĐŒŃ–Ń‚Đșу ĐŽĐ»Ń ĐżĐŸĐČ'ŃĐ·Đ°ĐœĐžŃ… Â«ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…ŃƒÂ». +ĐŁ ĐČДлОĐșĐŸĐŒŃƒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐœĐ°ĐșĐŸĐżĐžŃ‡ĐžŃ‚Đž **Đ±Đ°ĐłĐ°Ń‚ĐŸ ĐŒŃ–Ń‚ĐŸĐș** і Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” пДрДĐșĐŸĐœĐ°Ń‚ĐžŃŃ, Ń‰ĐŸ заĐČжЎО ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” **ту ŃĐ°ĐŒŃƒ ĐŒŃ–Ń‚Đșу** ĐŽĐ»Ń ĐżĐŸĐČ'ŃĐ·Đ°ĐœĐžŃ… Â«ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…ŃƒÂ». ĐŁ таĐșох ĐČОпаЎĐșах ĐŒĐ°Ń” ŃĐ”ĐœŃ збДрігатО ĐŒŃ–Ń‚ĐșĐž ĐČ `Enum`. -FastAPI ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃ” цД таĐș ŃĐ°ĐŒĐŸ, яĐș і Đ·Ń– Đ·ĐČочаĐčĐœĐžĐŒĐž ŃŃ‚Ń€ĐŸĐșĐ°ĐŒĐž: +**FastAPI** ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃ” цД таĐș ŃĐ°ĐŒĐŸ, яĐș і Đ·Ń– Đ·ĐČочаĐčĐœĐžĐŒĐž ŃŃ‚Ń€ĐŸĐșĐ°ĐŒĐž: {* ../../docs_src/path_operation_configuration/tutorial002b_py310.py hl[1,8:10,13,18] *} @@ -56,7 +56,7 @@ FastAPI ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃ” цД таĐș ŃĐ°ĐŒĐŸ, яĐș і Đ·Ń– Đ·ĐČочаĐčĐœĐžĐŒ ## Опос Đ·Ń– ŃŃ‚Ń€ĐŸĐșĐž ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— { #description-from-docstring } -ОсĐșŃ–Đ»ŃŒĐșĐž ĐŸĐżĐžŃĐž зазĐČочаĐč ĐŽĐŸĐČгі та заĐčĐŒĐ°ŃŽŃ‚ŃŒ ĐșŃ–Đ»ŃŒĐșа ряЮĐșіĐČ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž ĐŸĐżĐžŃ Â«ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…ŃƒÂ» у ŃŃ‚Ń€ĐŸŃ†Ń– ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— Ń„ŃƒĐœĐșції, і FastAPI ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Ń” ĐčĐŸĐłĐŸ Đ·ĐČіЮто. +ОсĐșŃ–Đ»ŃŒĐșĐž ĐŸĐżĐžŃĐž зазĐČочаĐč ĐŽĐŸĐČгі та заĐčĐŒĐ°ŃŽŃ‚ŃŒ ĐșŃ–Đ»ŃŒĐșа ряЮĐșіĐČ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž ĐŸĐżĐžŃ Â«ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…ŃƒÂ» у ŃŃ‚Ń€ĐŸŃ†Ń– ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— Ń„ŃƒĐœĐșції, і **FastAPI** ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Ń” ĐčĐŸĐłĐŸ Đ·ĐČіЮто. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” посато [Markdown](https://en.wikipedia.org/wiki/Markdown) у ŃŃ‚Ń€ĐŸŃ†Ń– ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń—, ĐčĐŸĐłĐŸ буЎД Ń–ĐœŃ‚Đ”Ń€ĐżŃ€Đ”Ń‚ĐŸĐČĐ°ĐœĐŸ та ĐżĐŸĐșĐ°Đ·Đ°ĐœĐŸ ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐŸ (Đ· урахуĐČĐ°ĐœĐœŃĐŒ ĐČіЮступіĐČ Ńƒ ŃŃ‚Ń€ĐŸŃ†Ń– ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń—). @@ -82,7 +82,7 @@ FastAPI ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒŃ” цД таĐș ŃĐ°ĐŒĐŸ, яĐș і Đ·Ń– Đ·ĐČочаĐčĐœĐžĐŒ OpenAPI ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐșĐŸĐ¶ĐœĐ° Â«ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń ŃˆĐ»ŃŃ…ŃƒÂ» ĐżĐŸŃ‚Ń€Đ”Đ±ŃƒŃ” ĐŸĐżĐžŃŃƒ ĐČŃ–ĐŽĐżĐŸĐČіЮі. -ĐąĐŸĐŒŃƒ, яĐșŃ‰ĐŸ ĐČĐž ĐčĐŸĐłĐŸ ĐœĐ” ĐœĐ°ĐŽĐ°ŃŃ‚Đ”, FastAPI аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ Đ·ĐłĐ”ĐœĐ”Ń€ŃƒŃ” «Successful response». +ĐąĐŸĐŒŃƒ, яĐșŃ‰ĐŸ ĐČĐž ĐčĐŸĐłĐŸ ĐœĐ” ĐœĐ°ĐŽĐ°ŃŃ‚Đ”, **FastAPI** аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ Đ·ĐłĐ”ĐœĐ”Ń€ŃƒŃ” «Successful response». /// @@ -98,7 +98,7 @@ OpenAPI ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐșĐŸĐ¶ĐœĐ° Â«ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń ŃˆĐ»ŃŃ…ŃƒÂ» ĐżĐŸŃ‚ -ĐŸĐŸĐŽĐžĐČіться, яĐș ĐČĐžĐłĐ»ŃĐŽĐ°ŃŽŃ‚ŃŒ застарілі та ĐœĐ”Đ·Đ°ŃŃ‚Đ°Ń€Ń–Đ»Ń– Â«ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…ŃƒÂ»: +ĐŸĐ”Ń€Đ”ĐČіртД, яĐș ĐČĐžĐłĐ»ŃĐŽĐ°ŃŽŃ‚ŃŒ застарілі та ĐœĐ”Đ·Đ°ŃŃ‚Đ°Ń€Ń–Đ»Ń– Â«ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…ŃƒÂ»: diff --git a/docs/uk/docs/tutorial/query-params-str-validations.md b/docs/uk/docs/tutorial/query-params-str-validations.md index bca5874c2..610e83f41 100644 --- a/docs/uk/docs/tutorial/query-params-str-validations.md +++ b/docs/uk/docs/tutorial/query-params-str-validations.md @@ -1,4 +1,4 @@ -# Query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž та ĐČĐ°Đ»Ń–ĐŽĐ°Ń†Ń–Ń ряЮĐșіĐČ { #query-parameters-and-string-validations } +# ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž Đ·Đ°ĐżĐžŃ‚Ńƒ та ĐČĐ°Đ»Ń–ĐŽĐ°Ń†Ń–Ń ŃŃ‚Ń€ĐŸĐș { #query-parameters-and-string-validations } **FastAPI** ĐŽĐŸĐ·ĐČĐŸĐ»ŃŃ” ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐČато ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČу Ń–ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–ŃŽ та ĐČĐžĐșĐŸĐœŃƒĐČато ĐČаліЎацію ĐŽĐ»Ń ĐČашох ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ. @@ -6,7 +6,7 @@ {* ../../docs_src/query_params_str_validations/tutorial001_py310.py hl[7] *} -Query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `q` ĐŒĐ°Ń” топ `str | None`, Ń‰ĐŸ ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐČŃ–Đœ ĐŒĐ°Ń” топ `str`, алД таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž `None`, і спраĐČЮі, Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ — `None`, Ń‚ĐŸĐ¶ FastAPI Đ·ĐœĐ°Ń‚ĐžĐŒĐ”, Ń‰ĐŸ ĐČŃ–Đœ ĐœĐ” є ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ. +ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżĐžŃ‚Ńƒ `q` ĐŒĐ°Ń” топ `str | None`, Ń‰ĐŸ ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐČŃ–Đœ ĐŒĐ°Ń” топ `str`, алД таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž `None`, і спраĐČЮі, Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ - `None`, Ń‚ĐŸĐ¶ FastAPI Đ·ĐœĐ°Ń‚ĐžĐŒĐ”, Ń‰ĐŸ ĐČŃ–Đœ ĐœĐ” є ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ. /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа @@ -18,7 +18,7 @@ FastAPI Đ·ĐœĐ°Ń‚ĐžĐŒĐ”, Ń‰ĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ `q` ĐœĐ” є ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČ ## Đ”ĐŸĐŽĐ°Ń‚ĐșĐŸĐČа ĐČĐ°Đ»Ń–ĐŽĐ°Ń†Ń–Ń { #additional-validation } -Мо Ń…ĐŸŃ‡Đ”ĐŒĐŸ, Ń‰ĐŸĐ± ĐœĐ°ĐČіть яĐșŃ‰ĐŸ `q` є ĐœĐ”ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒ, ĐșĐŸĐ»Đž ĐčĐŸĐłĐŸ ĐżĐ”Ń€Đ”ĐŽĐ°ŃŽŃ‚ŃŒ, ĐčĐŸĐłĐŸ ĐŽĐŸĐČĐ¶ĐžĐœĐ° ĐœĐ” пДрДĐČощуĐČала 50 ŃĐžĐŒĐČĐŸĐ»Ń–ĐČ. +Мо Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡ĐžĐŒĐŸ, Ń‰ĐŸ ĐœĐ°ĐČіть яĐșŃ‰ĐŸ `q` є ĐœĐ”ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒ, ĐșĐŸĐ»Đž ĐčĐŸĐłĐŸ ĐżĐ”Ń€Đ”ĐŽĐ°ŃŽŃ‚ŃŒ, **ĐčĐŸĐłĐŸ ĐŽĐŸĐČĐ¶ĐžĐœĐ° ĐœĐ” пДрДĐČощуĐČала 50 ŃĐžĐŒĐČĐŸĐ»Ń–ĐČ**. ### Đ†ĐŒĐżĐŸŃ€Ń‚ `Query` та `Annotated` { #import-query-and-annotated } @@ -45,7 +45,7 @@ FastAPI ĐŽĐŸĐŽĐ°ĐČ ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒĐșу `Annotated` (і ĐżĐŸŃ‡Đ°ĐČ Ń€Đ”ĐșĐŸĐŒĐ”Đœ Зараз ŃĐ°ĐŒĐ” час ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐčĐŸĐłĐŸ Ń€Đ°Đ·ĐŸĐŒ Ń–Đ· FastAPI. 🚀 -Đ Đ°ĐœŃ–ŃˆĐ” ĐŒĐž ĐŒĐ°Đ»Đž таĐșу Đ°ĐœĐŸŃ‚Đ°Ń†Ń–ŃŽ топу: +Мо ĐŒĐ°Đ»Đž таĐșу Đ°ĐœĐŸŃ‚Đ°Ń†Ń–ŃŽ топу: ```Python q: str | None = None @@ -57,31 +57,31 @@ q: str | None = None q: Annotated[str | None] = None ``` -ОбОЎĐČі ці ĐČДрсії ĐŸĐ·ĐœĐ°Ń‡Đ°ŃŽŃ‚ŃŒ ĐŸĐŽĐœĐ” Đč тД ŃĐ°ĐŒĐ”: `q` — цД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€, яĐșĐžĐč ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž `str` Đ°Đ±ĐŸ `None`, і за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ ĐŒĐ°Ń” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ `None`. +ОбОЎĐČі ці ĐČДрсії ĐŸĐ·ĐœĐ°Ń‡Đ°ŃŽŃ‚ŃŒ ĐŸĐŽĐœĐ” Đč тД ŃĐ°ĐŒĐ”: `q` - цД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€, яĐșĐžĐč ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž `str` Đ°Đ±ĐŸ `None`, і за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ ĐŒĐ°Ń” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ `None`. А тДпДр ĐżĐ”Ń€Đ”Ń…ĐŸĐŽĐžĐŒĐŸ ĐŽĐŸ ціĐșаĐČĐŸĐłĐŸ! 🎉 ## Đ”ĐŸĐŽĐ°ĐČĐ°ĐœĐœŃ `Query` ĐŽĐŸ `Annotated` у ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `q` { #add-query-to-annotated-in-the-q-parameter } -йДпДр, ĐșĐŸĐ»Đž у ĐœĐ°Ń є `Annotated`, ĐŽĐ” ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ ĐŽĐŸĐŽĐ°ĐČато ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČу Ń–ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–ŃŽ (у Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу — ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČу ĐČаліЎацію), ĐŽĐŸĐŽĐ°ĐŒĐŸ `Query` ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃƒ `Annotated` і ĐČŃŃ‚Đ°ĐœĐŸĐČĐžĐŒĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `max_length` у `50`: +йДпДр, ĐșĐŸĐ»Đž у ĐœĐ°Ń є `Annotated`, ĐŽĐ” ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ ĐŽĐŸĐŽĐ°ĐČато ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČу Ń–ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–ŃŽ (у Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу - ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČу ĐČаліЎацію), ĐŽĐŸĐŽĐ°ĐŒĐŸ `Query` ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃƒ `Annotated` і ĐČŃŃ‚Đ°ĐœĐŸĐČĐžĐŒĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `max_length` у `50`: {* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[9] *} ЗĐČĐ”Ń€ĐœŃ–Ń‚ŃŒ уĐČагу, Ń‰ĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ усД щД `None`, Ń‚ĐŸĐŒŃƒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°Đ»ĐžŃˆĐ°Ń”Ń‚ŃŒŃŃ ĐœĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ. -АлД тДпДр, ĐŽĐŸĐŽĐ°ĐČшО `Query(max_length=50)` ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃƒ `Annotated`, ĐŒĐž ĐżĐŸĐČŃ–ĐŽĐŸĐŒĐ»ŃŃ”ĐŒĐŸ FastAPI, Ń‰ĐŸ Ń…ĐŸŃ‡Đ”ĐŒĐŸ ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČу ĐČаліЎацію ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ: ĐŒĐž Ń…ĐŸŃ‡Đ”ĐŒĐŸ, Ń‰ĐŸĐ± ĐČĐŸĐœĐŸ ĐŒĐ°Đ»ĐŸ ĐŒĐ°ĐșŃĐžĐŒŃƒĐŒ 50 ŃĐžĐŒĐČĐŸĐ»Ń–ĐČ. 😎 +АлД тДпДр, ĐŽĐŸĐŽĐ°ĐČшО `Query(max_length=50)` ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃƒ `Annotated`, ĐŒĐž ĐżĐŸĐČŃ–ĐŽĐŸĐŒĐ»ŃŃ”ĐŒĐŸ FastAPI, Ń‰ĐŸ Ń…ĐŸŃ‡Đ”ĐŒĐŸ **ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČу ĐČаліЎацію** ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ: ĐŒĐž Ń…ĐŸŃ‡Đ”ĐŒĐŸ, Ń‰ĐŸĐ± ĐČĐŸĐœĐŸ ĐŒĐ°Đ»ĐŸ ĐŒĐ°ĐșŃĐžĐŒŃƒĐŒ 50 ŃĐžĐŒĐČĐŸĐ»Ń–ĐČ. 😎 /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -бут ĐŒĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”ĐŒĐŸ `Query()`, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž цД query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€. Далі ĐŒĐž Ń€ĐŸĐ·ĐłĐ»ŃĐœĐ”ĐŒĐŸ Ń–ĐœŃˆŃ– ĐČĐ°Ń€Ń–Đ°ĐœŃ‚Đž, яĐș-ĐŸŃ‚ `Path()`, `Body()`, `Header()` та `Cookie()`, яĐșі проĐčĐŒĐ°ŃŽŃ‚ŃŒ ті ŃĐ°ĐŒŃ– Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Đž, Ń‰ĐŸ Đč `Query()`. +бут ĐŒĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”ĐŒĐŸ `Query()`, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž цД **ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżĐžŃ‚Ńƒ**. Далі ĐŒĐž Ń€ĐŸĐ·ĐłĐ»ŃĐœĐ”ĐŒĐŸ Ń–ĐœŃˆŃ– ĐČĐ°Ń€Ń–Đ°ĐœŃ‚Đž, яĐș-ĐŸŃ‚ `Path()`, `Body()`, `Header()` та `Cookie()`, яĐșі проĐčĐŒĐ°ŃŽŃ‚ŃŒ ті ŃĐ°ĐŒŃ– Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Đž, Ń‰ĐŸ Đč `Query()`. /// йДпДр FastAPI: -* ĐŸĐ”Ń€Đ”ĐČіроть ĐŽĐ°ĐœŃ–, Ń‰ĐŸĐ± пДрДĐșĐŸĐœĐ°Ń‚ĐžŃŃ, Ń‰ĐŸ Ń—Ń…ĐœŃ ĐŒĐ°ĐșŃĐžĐŒĐ°Đ»ŃŒĐœĐ° ĐŽĐŸĐČĐ¶ĐžĐœĐ° — 50 ŃĐžĐŒĐČĐŸĐ»Ń–ĐČ -* ĐŸĐŸĐșажe чітĐșу ĐżĐŸĐŒĐžĐ»Đșу ĐșĐ»Ń–Ń”ĐœŃ‚Ńƒ, яĐșŃ‰ĐŸ ĐŽĐ°ĐœŃ– ĐœĐ”ĐŽŃ–ĐčŃĐœŃ– -* Đ—Đ°ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ŃƒŃ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐČ OpenAPI-ŃŃ…Đ”ĐŒŃ– ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ (Ń‰ĐŸ ĐČŃ–ĐŽĐŸĐ±Ń€Đ°Đ·ĐžŃ‚ŃŒŃŃ ĐČ Đ°ĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ Đ·ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœŃ–Đč ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń—) +* **ĐŸĐ”Ń€Đ”ĐČіроть** ĐŽĐ°ĐœŃ–, Ń‰ĐŸĐ± пДрДĐșĐŸĐœĐ°Ń‚ĐžŃŃ, Ń‰ĐŸ Ń—Ń…ĐœŃ ĐŒĐ°ĐșŃĐžĐŒĐ°Đ»ŃŒĐœĐ° ĐŽĐŸĐČĐ¶ĐžĐœĐ° - 50 ŃĐžĐŒĐČĐŸĐ»Ń–ĐČ +* ĐŸĐŸĐșажe **чітĐșу ĐżĐŸĐŒĐžĐ»Đșу** ĐșĐ»Ń–Ń”ĐœŃ‚Ńƒ, яĐșŃ‰ĐŸ ĐŽĐ°ĐœŃ– ĐœĐ”ĐŽŃ–ĐčŃĐœŃ– +* **Đ—Đ°ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ŃƒŃ”** ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐČ *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* ŃŃ…Đ”ĐŒĐž OpenAPI (Ń‰ĐŸ ĐČŃ–ĐŽĐŸĐ±Ń€Đ°Đ·ĐžŃ‚ŃŒŃŃ ĐČ **аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸĐŒŃƒ Ń–ĐœŃ‚Đ”Ń€Ń„Đ”Đčсі ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń—**) ## ĐĐ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČĐœĐžĐč (застарілОĐč) ĐŒĐ”Ń‚ĐŸĐŽ: `Query` яĐș Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ { #alternative-old-query-as-the-default-value } @@ -93,7 +93,7 @@ q: Annotated[str | None] = None /// -Đ Đ°ĐœŃ–ŃˆĐ” ĐŒĐž пОсалО `Query()` яĐș Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ ĐŽĐ»Ń ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° Ń„ŃƒĐœĐșції, ĐČŃŃ‚Đ°ĐœĐŸĐČлюючО `max_length` у 50: +Đ Đ°ĐœŃ–ŃˆĐ” ĐŒĐž пОсалО `Query()` яĐș Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ ĐŽĐ»Ń ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° Ń„ŃƒĐœĐșції, ĐČŃŃ‚Đ°ĐœĐŸĐČлюючО ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `max_length` у 50: {* ../../docs_src/query_params_str_validations/tutorial002_py310.py hl[7] *} @@ -107,19 +107,20 @@ q: str | None = Query(default=None) ...Ń€ĐŸĐ±ĐžŃ‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐœĐ”ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒ Đ·Ń– Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `None`, Ń‰ĐŸ Đ”ĐșĐČіĐČĐ°Đ»Đ”ĐœŃ‚ĐœĐŸ: + ```Python q: str | None = None ``` -АлД у ĐČДрсії Đ· `Query` ĐŒĐž яĐČĐœĐŸ ĐČĐșĐ°Đ·ŃƒŃ”ĐŒĐŸ, Ń‰ĐŸ цД query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€. +АлД у ĐČДрсії Đ· `Query` ĐŒĐž яĐČĐœĐŸ ĐČĐșĐ°Đ·ŃƒŃ”ĐŒĐŸ, Ń‰ĐŸ цД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżĐžŃ‚Ńƒ. -Далі ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ пДрДЎаĐČато `Query` ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČі ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž. ĐŁ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу — ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `max_length`, яĐșĐžĐč Đ·Đ°ŃŃ‚ĐŸŃĐŸĐČується ĐŽĐŸ ряЮĐșіĐČ: +Далі ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ пДрДЎаĐČато `Query` ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČі ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž. ĐŁ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу - ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `max_length`, яĐșĐžĐč Đ·Đ°ŃŃ‚ĐŸŃĐŸĐČується ĐŽĐŸ ŃŃ‚Ń€ĐŸĐș: ```Python q: str | None = Query(default=None, max_length=50) ``` -ĐŠĐ” Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡ĐžŃ‚ŃŒ ĐČаліЎацію ĐŽĐ°ĐœĐžŃ…, ĐČĐžĐČДЎД Đ·Ń€ĐŸĐ·ŃƒĐŒŃ–Đ»Ńƒ ĐżĐŸĐŒĐžĐ»Đșу у разі ĐœĐ”ĐŽŃ–ĐčŃĐœĐžŃ… ĐŽĐ°ĐœĐžŃ… і Đ·Đ°ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ŃƒŃ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ у ŃŃ…Đ”ĐŒŃ– OpenAPI ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ. +ĐŠĐ” Đ·Đ°Đ±Đ”Đ·ĐżĐ”Ń‡ĐžŃ‚ŃŒ ĐČаліЎацію ĐŽĐ°ĐœĐžŃ…, ĐČĐžĐČДЎД Đ·Ń€ĐŸĐ·ŃƒĐŒŃ–Đ»Ńƒ ĐżĐŸĐŒĐžĐ»Đșу у разі ĐœĐ”ĐŽŃ–ĐčŃĐœĐžŃ… ĐŽĐ°ĐœĐžŃ… і Đ·Đ°ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ŃƒŃ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ у *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* ŃŃ…Đ”ĐŒĐž OpenAPI. ### `Query` яĐș Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ Đ°Đ±ĐŸ ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– `Annotated` { #query-as-the-default-value-or-in-annotated } @@ -149,13 +150,13 @@ q: str = Query(default="rick") ### ĐŸĐ”Ń€Đ”ĐČагО ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ `Annotated` { #advantages-of-annotated } -ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ `Annotated` є рДĐșĐŸĐŒĐ”ĐœĐŽĐŸĐČĐ°ĐœĐžĐŒ Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ Đ·Đ°ĐŽĐ°ĐœĐœŃ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ у ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°Ń… Ń„ŃƒĐœĐșції, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐČĐŸĐœĐŸ ĐșращД Đ· ĐșŃ–Đ»ŃŒĐșĐŸŃ… ĐżŃ€ĐžŃ‡ĐžĐœ. đŸ€“ +**ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ `Annotated` є рДĐșĐŸĐŒĐ”ĐœĐŽĐŸĐČĐ°ĐœĐžĐŒ** Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ Đ·Đ°ĐŽĐ°ĐœĐœŃ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ у ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°Ń… Ń„ŃƒĐœĐșції, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ĐČĐŸĐœĐŸ **ĐșращД** Đ· ĐșŃ–Đ»ŃŒĐșĐŸŃ… ĐżŃ€ĐžŃ‡ĐžĐœ. đŸ€“ -Đ—ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° Ń„ŃƒĐœĐșції є фаĐșŃ‚ĐžŃ‡ĐœĐžĐŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ, Ń‰ĐŸ є Đ±Ń–Đ»ŃŒŃˆ Ń–ĐœŃ‚ŃƒŃ—Ń‚ĐžĐČĐœĐžĐŒ у Python Đ·Đ°ĐłĐ°Đ»ĐŸĐŒ. 😌 +**Đ—ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ** **ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° Ń„ŃƒĐœĐșції** є **фаĐșŃ‚ĐžŃ‡ĐœĐžĐŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ**, Ń‰ĐŸ є Đ±Ń–Đ»ŃŒŃˆ Ń–ĐœŃ‚ŃƒŃ—Ń‚ĐžĐČĐœĐžĐŒ у Python Đ·Đ°ĐłĐ°Đ»ĐŸĐŒ. 😌 -Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșлОĐșато ту ŃĐ°ĐŒŃƒ Ń„ŃƒĐœĐșцію ĐČ Ń–ĐœŃˆĐžŃ… ĐŒŃ–ŃŃ†ŃŃ… бДз FastAPI, і ĐČĐŸĐœĐ° працюĐČĐ°Ń‚ĐžĐŒĐ” ĐŸŃ‡Ń–ĐșуĐČĐ°ĐœĐŸ. ĐŻĐșŃ‰ĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ є ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒ (бДз Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ), ĐČаш рДЎаĐșŃ‚ĐŸŃ€ ĐżĐŸĐČŃ–ĐŽĐŸĐŒĐžŃ‚ŃŒ ĐżŃ€ĐŸ ĐżĐŸĐŒĐžĐ»Đșу, а Python таĐșĐŸĐ¶ ĐČоЮасть ĐżĐŸĐŒĐžĐ»Đșу, яĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸĐœĐ°Ń”Ń‚Đ” Ń„ŃƒĐœĐșцію бДз пДрДЎаĐČĐ°ĐœĐœŃ Ń†ŃŒĐŸĐłĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°. +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” **ĐČĐžĐșлОĐșато** ту ŃĐ°ĐŒŃƒ Ń„ŃƒĐœĐșцію ĐČ **Ń–ĐœŃˆĐžŃ… ĐŒŃ–ŃŃ†ŃŃ…** бДз FastAPI, і ĐČĐŸĐœĐ° **працюĐČĐ°Ń‚ĐžĐŒĐ” ĐŸŃ‡Ń–ĐșуĐČĐ°ĐœĐŸ**. ĐŻĐșŃ‰ĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ є **ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒ** (бДз Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ), ĐČаш **рДЎаĐșŃ‚ĐŸŃ€** ĐżĐŸĐČŃ–ĐŽĐŸĐŒĐžŃ‚ŃŒ ĐżŃ€ĐŸ ĐżĐŸĐŒĐžĐ»Đșу, а **Python** таĐșĐŸĐ¶ ĐČоЮасть ĐżĐŸĐŒĐžĐ»Đșу, яĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸĐœĐ°Ń”Ń‚Đ” Ń„ŃƒĐœĐșцію бДз пДрДЎаĐČĐ°ĐœĐœŃ ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐŸĐłĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°. -ĐŻĐșŃ‰ĐŸ ĐČĐž ĐœĐ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” `Annotated`, а ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” (староĐč) ŃŃ‚ĐžĐ»ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ, Ń‚ĐŸ про ĐČĐžĐșлОĐșу цієї Ń„ŃƒĐœĐșції бДз FastAPI ĐČ Ń–ĐœŃˆĐžŃ… ĐŒŃ–ŃŃ†ŃŃ… ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐżĐ°ĐŒâ€™ŃŃ‚Đ°Ń‚Đž пДрДЎатО їĐč Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Đž, Ń‰ĐŸĐ± ĐČĐŸĐœĐ° працюĐČала ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐŸ, Ń–ĐœĐ°ĐșшД Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐČŃ–ĐŽŃ€Ń–Đ·ĐœŃŃ‚ĐžŃŃ ĐČіЮ ĐŸŃ‡Ń–ĐșуĐČĐ°ĐœĐžŃ… (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, ĐČĐž ĐŸŃ‚Ń€ĐžĐŒĐ°Ń”Ń‚Đ” `QueryInfo` Đ°Đ±ĐŸ Ń‰ĐŸŃŃŒ ĐżĐŸĐŽŃ–Đ±ĐœĐ” Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ `str`). І ĐČаш рДЎаĐșŃ‚ĐŸŃ€ ĐœĐ” ĐżĐŸĐČŃ–ĐŽĐŸĐŒĐžŃ‚ŃŒ ĐżŃ€ĐŸ ĐżĐŸĐŒĐžĐ»Đșу, і Python ĐœĐ” сĐșĐ°Ń€Đ¶ĐžŃ‚ĐžĐŒĐ”Ń‚ŃŒŃŃ піЮ час запусĐșу цієї Ń„ŃƒĐœĐșції — лОшД ĐșĐŸĐ»Đž ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– заĐČĐ”Ń€ŃˆĐ°Ń‚ŃŒŃŃ ĐżĐŸĐŒĐžĐ»ĐșĐŸŃŽ. +ĐŻĐșŃ‰ĐŸ ĐČĐž ĐœĐ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” `Annotated`, а ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” **(староĐč) ŃŃ‚ĐžĐ»ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ**, Ń‚ĐŸ про ĐČĐžĐșлОĐșу цієї Ń„ŃƒĐœĐșції бДз FastAPI ĐČ **Ń–ĐœŃˆĐžŃ… ĐŒŃ–ŃŃ†ŃŃ…** ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ **ĐżĐ°ĐŒâ€™ŃŃ‚Đ°Ń‚Đž** пДрДЎатО їĐč Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Đž, Ń‰ĐŸĐ± ĐČĐŸĐœĐ° працюĐČала ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐŸ, Ń–ĐœĐ°ĐșшД Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐČŃ–ĐŽŃ€Ń–Đ·ĐœŃŃ‚ĐžŃŃ ĐČіЮ ĐŸŃ‡Ń–ĐșуĐČĐ°ĐœĐžŃ… (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, ĐČĐž ĐŸŃ‚Ń€ĐžĐŒĐ°Ń”Ń‚Đ” `QueryInfo` Đ°Đ±ĐŸ Ń‰ĐŸŃŃŒ ĐżĐŸĐŽŃ–Đ±ĐœĐ” Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ `str`). І ĐČаш рДЎаĐșŃ‚ĐŸŃ€ ĐœĐ” ĐżĐŸĐČŃ–ĐŽĐŸĐŒĐžŃ‚ŃŒ ĐżŃ€ĐŸ ĐżĐŸĐŒĐžĐ»Đșу, і Python ĐœĐ” сĐșĐ°Ń€Đ¶ĐžŃ‚ĐžĐŒĐ”Ń‚ŃŒŃŃ піЮ час запусĐșу цієї Ń„ŃƒĐœĐșції - лОшД ĐșĐŸĐ»Đž ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– заĐČĐ”Ń€ŃˆĐ°Ń‚ŃŒŃŃ ĐżĐŸĐŒĐžĐ»ĐșĐŸŃŽ. ОсĐșŃ–Đ»ŃŒĐșĐž `Annotated` ĐŒĐŸĐ¶Đ” ĐŒŃ–ŃŃ‚ĐžŃ‚Đž ĐșŃ–Đ»ŃŒĐșа Đ°ĐœĐŸŃ‚Đ°Ń†Ń–Đč ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœĐžŃ…, тДпДр ĐČĐž ĐœĐ°ĐČіть ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ту ŃĐ°ĐŒŃƒ Ń„ŃƒĐœĐșцію Đ· Ń–ĐœŃˆĐžĐŒĐž Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đ°ĐŒĐž, таĐșĐžĐŒĐž яĐș [Typer](https://typer.tiangolo.com/). 🚀 @@ -167,7 +168,7 @@ q: str = Query(default="rick") ## Đ”ĐŸĐŽĐ°ĐČĐ°ĐœĐœŃ Ń€Đ”ĐłŃƒĐ»ŃŃ€ĐœĐžŃ… ĐČОразіĐČ { #add-regular-expressions } -Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚Đž Ń€Đ”ĐłŃƒĐ»ŃŃ€ĐœĐžĐč ĐČОраз `pattern`, яĐșĐŸĐŒŃƒ ĐŒĐ°Ń” ĐČŃ–ĐŽĐżĐŸĐČіЮато ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€: +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚Đž Ń€Đ”ĐłŃƒĐ»ŃŃ€ĐœĐžĐč ĐČОраз `pattern`, яĐșĐŸĐŒŃƒ ĐŒĐ°Ń” ĐČŃ–ĐŽĐżĐŸĐČіЮато ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€: {* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *} @@ -177,7 +178,7 @@ q: str = Query(default="rick") * `fixedquery`: Ń‚ĐŸŃ‡ĐœĐŸ ĐČŃ–ĐŽĐżĐŸĐČіЮає Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃŽ `fixedquery`. * `$`: заĐșŃ–ĐœŃ‡ŃƒŃ”Ń‚ŃŒŃŃ тут, ĐżŃ–ŃĐ»Ń `fixedquery` ĐœĐ”ĐŒĐ°Ń” Đ¶ĐŸĐŽĐœĐžŃ… ŃĐžĐŒĐČĐŸĐ»Ń–ĐČ. -ĐŻĐșŃ‰ĐŸ ĐČĐž ĐżĐŸŃ‡ŃƒĐČĐ°Ń”Ń‚Đ”ŃŃ Ń€ĐŸĐ·ĐłŃƒĐ±Đ»Đ”ĐœĐŸ Ń‰ĐŸĐŽĐŸ **«regular expression»**, ĐœĐ” хĐČОлюĐčŃ‚Đ”ŃŃ. ĐŠĐ” сĐșĐ»Đ°ĐŽĐœĐ° Ń‚Đ”ĐŒĐ° ĐŽĐ»Ń Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… люЎДĐč. Во ĐČсД ĐŸĐŽĐœĐŸ ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń€ĐŸĐ±ĐžŃ‚Đž Đ±Đ°ĐłĐ°Ń‚ĐŸ рДчДĐč бДз ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Ń€Đ”ĐłŃƒĐ»ŃŃ€ĐœĐžŃ… ĐČОразіĐČ. +ĐŻĐșŃ‰ĐŸ ĐČĐž ĐżĐŸŃ‡ŃƒĐČĐ°Ń”Ń‚Đ”ŃŃ Ń€ĐŸĐ·ĐłŃƒĐ±Đ»Đ”ĐœĐŸ Ń‰ĐŸĐŽĐŸ ĐČсіх цох Ń–ĐŽĐ”Đč **Â«Ń€Đ”ĐłŃƒĐ»ŃŃ€ĐœĐŸĐłĐŸ ĐČĐžŃ€Đ°Đ·ŃƒÂ»**, ĐœĐ” хĐČОлюĐčŃ‚Đ”ŃŃ. ĐŠĐ” сĐșĐ»Đ°ĐŽĐœĐ° Ń‚Đ”ĐŒĐ° ĐŽĐ»Ń Đ±Đ°ĐłĐ°Ń‚ŃŒĐŸŃ… люЎДĐč. Во ĐČсД ĐŸĐŽĐœĐŸ ĐŒĐŸĐ¶Đ”Ń‚Đ” Ń€ĐŸĐ±ĐžŃ‚Đž Đ±Đ°ĐłĐ°Ń‚ĐŸ рДчДĐč бДз ĐżĐŸŃ‚Ń€Đ”Đ±Đž ĐČ Ń€Đ”ĐłŃƒĐ»ŃŃ€ĐœĐžŃ… ĐČОразах. йДпДр ĐČĐž Đ·ĐœĐ°Ń”Ń‚Đ”, Ń‰ĐŸ ĐșĐŸĐ»Đž ĐČĐŸĐœĐž Đ·ĐœĐ°ĐŽĐŸĐ±Đ»ŃŃ‚ŃŒŃŃ, їх ĐŒĐŸĐ¶ĐœĐ° Đ·Đ°ŃŃ‚ĐŸŃĐŸĐČуĐČато у **FastAPI**. @@ -185,19 +186,19 @@ q: str = Query(default="rick") Во ĐŒĐŸĐ¶Đ”Ń‚Đ”, Đ·ĐČŃ–ŃĐœĐŸ, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ, ĐČŃ–ĐŽĐŒŃ–ĐœĐœŃ– ĐČіЮ `None`. -ĐŸŃ€ĐžĐżŃƒŃŃ‚Ń–ĐŒĐŸ, Ń‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `q` Đ· `min_length` `3` і Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `"fixedquery"`: +ĐŸŃ€ĐžĐżŃƒŃŃ‚Ń–ĐŒĐŸ, Ń‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżĐžŃ‚Ńƒ `q` Đ· `min_length` `3` і Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `"fixedquery"`: {* ../../docs_src/query_params_str_validations/tutorial005_an_py310.py hl[9] *} /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа -НаяĐČĐœŃ–ŃŃ‚ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ Đ±ŃƒĐŽŃŒ-яĐșĐŸĐłĐŸ топу, ĐČĐșлючаючО `None`, Ń€ĐŸĐ±ĐžŃ‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐœĐ”ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒ (not required). +НаяĐČĐœŃ–ŃŃ‚ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ Đ±ŃƒĐŽŃŒ-яĐșĐŸĐłĐŸ топу, ĐČĐșлючаючО `None`, Ń€ĐŸĐ±ĐžŃ‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐœĐ”ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒ (ĐœĐ” ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒ). /// ## ĐžĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČі ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž { #required-parameters } -ĐŻĐșŃ‰ĐŸ ĐœĐ°ĐŒ ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐČато ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČі ĐČаліЎації Đ°Đ±ĐŸ ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœŃ–, ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ Đ·Ń€ĐŸĐ±ĐžŃ‚Đž query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `q` ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒ, ĐżŃ€ĐŸŃŃ‚ĐŸ ĐœĐ” ĐČĐșĐ°Đ·ŃƒŃŽŃ‡Đž Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ, ĐœĐ°ĐżŃ€ĐžĐșлаЎ: +ĐŻĐșŃ‰ĐŸ ĐœĐ°ĐŒ ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐČато ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČі ĐČаліЎації Đ°Đ±ĐŸ ĐŒĐ”Ń‚Đ°ĐŽĐ°ĐœŃ–, ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ Đ·Ń€ĐŸĐ±ĐžŃ‚Đž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżĐžŃ‚Ńƒ `q` ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒ, ĐżŃ€ĐŸŃŃ‚ĐŸ ĐœĐ” ĐČĐșĐ°Đ·ŃƒŃŽŃ‡Đž Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ, ĐœĐ°ĐżŃ€ĐžĐșлаЎ: ```Python q: str @@ -227,11 +228,11 @@ q: Annotated[str | None, Query(min_length=3)] = None {* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *} -## ĐĄĐżĐžŃĐŸĐș query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ / ĐșŃ–Đ»ŃŒĐșа Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ { #query-parameter-list-multiple-values } +## ĐĄĐżĐžŃĐŸĐș ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ Đ·Đ°ĐżĐžŃ‚Ńƒ / ĐșŃ–Đ»ŃŒĐșа Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ { #query-parameter-list-multiple-values } -ĐšĐŸĐ»Đž ĐČĐž яĐČĐœĐŸ ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń”Ń‚Đ” query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ `Query`, ĐČĐž таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž, Ń‰ĐŸ ĐČŃ–Đœ ĐŒĐ°Ń” проĐčĐŒĐ°Ń‚Đž ŃĐżĐžŃĐŸĐș Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ, Đ°Đ±ĐŸ, Ń–ĐœŃˆĐžĐŒĐž ŃĐ»ĐŸĐČĐ°ĐŒĐž, ĐșŃ–Đ»ŃŒĐșа Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ. +ĐšĐŸĐ»Đž ĐČĐž яĐČĐœĐŸ ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń”Ń‚Đ” ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżĐžŃ‚Ńƒ за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ `Query`, ĐČĐž таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž, Ń‰ĐŸ ĐČŃ–Đœ ĐŒĐ°Ń” проĐčĐŒĐ°Ń‚Đž ŃĐżĐžŃĐŸĐș Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ, Đ°Đ±ĐŸ, Ń–ĐœŃˆĐžĐŒĐž ŃĐ»ĐŸĐČĐ°ĐŒĐž, ĐșŃ–Đ»ŃŒĐșа Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ. -НапроĐșлаЎ, Ń‰ĐŸĐ± ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `q`, яĐșĐžĐč ĐŒĐŸĐ¶Đ” Đ·â€™ŃĐČĐ»ŃŃ‚ĐžŃŃ ĐČ URL ĐșŃ–Đ»ŃŒĐșа разіĐČ, ĐŒĐŸĐ¶ĐœĐ° ĐœĐ°ĐżĐžŃĐ°Ń‚Đž: +НапроĐșлаЎ, Ń‰ĐŸĐ± ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżĐžŃ‚Ńƒ `q`, яĐșĐžĐč ĐŒĐŸĐ¶Đ” Đ·â€™ŃĐČĐ»ŃŃ‚ĐžŃŃ ĐČ URL ĐșŃ–Đ»ŃŒĐșа разіĐČ, ĐŒĐŸĐ¶ĐœĐ° ĐœĐ°ĐżĐžŃĐ°Ń‚Đž: {* ../../docs_src/query_params_str_validations/tutorial011_an_py310.py hl[9] *} @@ -241,7 +242,7 @@ q: Annotated[str | None, Query(min_length=3)] = None http://localhost:8000/items/?q=foo&q=bar ``` -ĐČĐž ĐŸŃ‚Ń€ĐžĐŒĐ°Ń”Ń‚Đ” ĐșŃ–Đ»ŃŒĐșа Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ `q` query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ (`foo` і `bar`) у ĐČĐžĐłĐ»ŃĐŽŃ– Python `list` у ĐČашіĐč Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ, у ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń– Ń„ŃƒĐœĐșції `q`. +ĐČĐž ĐŸŃ‚Ń€ĐžĐŒĐ°Ń”Ń‚Đ” ĐșŃ–Đ»ŃŒĐșа Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ *ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ Đ·Đ°ĐżĐžŃ‚Ńƒ* `q` (`foo` і `bar`) у ĐČĐžĐłĐ»ŃĐŽŃ– Python `list` у ĐČашіĐč *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, у *ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń– Ń„ŃƒĐœĐșції* `q`. ОтжД, ĐČŃ–ĐŽĐżĐŸĐČіЮь ĐœĐ° цДĐč URL буЎД: @@ -256,7 +257,7 @@ http://localhost:8000/items/?q=foo&q=bar /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -Đ©ĐŸĐ± ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ· Ń‚ĐžĐżĐŸĐŒ `list`, яĐș у ĐœĐ°ĐČĐ”ĐŽĐ”ĐœĐŸĐŒŃƒ ĐČОщД проĐșлаЎі, ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ яĐČĐœĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `Query`, Ń–ĐœĐ°ĐșшД ĐČŃ–Đœ буЎД Ń–ĐœŃ‚Đ”Ń€ĐżŃ€Đ”Ń‚ĐŸĐČĐ°ĐœĐžĐč яĐș Ń‚Ń–Đ»ĐŸ Đ·Đ°ĐżĐžŃ‚Ńƒ. +Đ©ĐŸĐ± ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżĐžŃ‚Ńƒ Đ· Ń‚ĐžĐżĐŸĐŒ `list`, яĐș у ĐœĐ°ĐČĐ”ĐŽĐ”ĐœĐŸĐŒŃƒ ĐČОщД проĐșлаЎі, ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ яĐČĐœĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато `Query`, Ń–ĐœĐ°ĐșшД ĐČŃ–Đœ буЎД Ń–ĐœŃ‚Đ”Ń€ĐżŃ€Đ”Ń‚ĐŸĐČĐ°ĐœĐžĐč яĐș Ń‚Ń–Đ»ĐŸ Đ·Đ°ĐżĐžŃ‚Ńƒ. /// @@ -264,7 +265,7 @@ http://localhost:8000/items/?q=foo&q=bar -### ĐĄĐżĐžŃĐŸĐș query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ / ĐșŃ–Đ»ŃŒĐșа Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ { #query-parameter-list-multiple-values-with-defaults } +### ĐĄĐżĐžŃĐŸĐș ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ Đ·Đ°ĐżĐžŃ‚Ńƒ / ĐșŃ–Đ»ŃŒĐșа Đ·ĐœĐ°Ń‡Đ”ĐœŃŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ { #query-parameter-list-multiple-values-with-defaults } Во таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚Đž Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `list`, яĐșŃ‰ĐŸ Đ¶ĐŸĐŽĐœĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ ĐœĐ” Đ±ŃƒĐ»ĐŸ ĐżĐ”Ń€Đ”ĐŽĐ°ĐœĐ”: @@ -297,7 +298,7 @@ http://localhost:8000/items/ МаĐčтД ĐœĐ° уĐČазі, Ń‰ĐŸ ĐČ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу FastAPI ĐœĐ” пДрДĐČŃ–Ń€ŃŃ‚ĐžĐŒĐ” ĐČĐŒŃ–ŃŃ‚ спОсĐșу. -НапроĐșлаЎ, `list[int]` пДрДĐČŃ–Ń€ŃŃ‚ĐžĐŒĐ” (і ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ŃƒĐČĐ°Ń‚ĐžĐŒĐ”), Ń‰ĐŸ ĐČĐŒŃ–ŃŃ‚ спОсĐșу — цілі чОсла. АлД `list` бДз ŃƒŃ‚ĐŸŃ‡ĐœĐ”ĐœĐœŃ Ń†ŃŒĐŸĐłĐŸ ĐœĐ” Ń€ĐŸĐ±ĐžŃ‚ĐžĐŒĐ”. +НапроĐșлаЎ, `list[int]` пДрДĐČŃ–Ń€ŃŃ‚ĐžĐŒĐ” (і ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ŃƒĐČĐ°Ń‚ĐžĐŒĐ”), Ń‰ĐŸ ĐČĐŒŃ–ŃŃ‚ спОсĐșу - цілі чОсла. АлД `list` бДз ŃƒŃ‚ĐŸŃ‡ĐœĐ”ĐœĐœŃ Ń†ŃŒĐŸĐłĐŸ ĐœĐ” Ń€ĐŸĐ±ĐžŃ‚ĐžĐŒĐ”. /// @@ -305,7 +306,7 @@ http://localhost:8000/items/ Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽĐŸĐŽĐ°Ń‚Đž Đ±Ń–Đ»ŃŒŃˆĐ” Ń–ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–Ń— ĐżŃ€ĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€. -Щя Ń–ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–Ń буЎД ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐ° у Đ·ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœĐžĐč OpenAPI та ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐ° Ń–ĐœŃ‚Đ”Ń€Ń„Đ”ĐčŃĐ°ĐŒĐž ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— та Đ·ĐŸĐČĐœŃ–ŃˆĐœŃ–ĐŒĐž Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đ°ĐŒĐž. +Щя Ń–ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–Ń буЎД ĐČĐșĐ»ŃŽŃ‡Đ”ĐœĐ° у Đ·ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœĐžĐč OpenAPI та ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐ° ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČацьĐșĐžĐŒĐž Ń–ĐœŃ‚Đ”Ń€Ń„Đ”ĐčŃĐ°ĐŒĐž ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— та Đ·ĐŸĐČĐœŃ–ŃˆĐœŃ–ĐŒĐž Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đ°ĐŒĐž. /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа @@ -333,9 +334,9 @@ http://localhost:8000/items/ http://127.0.0.1:8000/items/?item-query=foobaritems ``` -АлД `item-query` — цД ĐœĐ”ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐ° ĐœĐ°Đ·ĐČа Đ·ĐŒŃ–ĐœĐœĐŸŃ— ĐČ Python. +АлД `item-query` - цД ĐœĐ”ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐ° ĐœĐ°Đ·ĐČа Đ·ĐŒŃ–ĐœĐœĐŸŃ— ĐČ Python. -НаĐčблОжчОĐč ĐŽĐŸĐżŃƒŃŃ‚ĐžĐŒĐžĐč ĐČĐ°Ń€Ń–Đ°ĐœŃ‚ — `item_query`. +НаĐčблОжчОĐč ĐŽĐŸĐżŃƒŃŃ‚ĐžĐŒĐžĐč ĐČĐ°Ń€Ń–Đ°ĐœŃ‚ - `item_query`. ĐŸŃ€ĐŸŃ‚Đ” ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ, Ń‰ĐŸĐ± ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ залОшаĐČся ŃĐ°ĐŒĐ” `item-query`... @@ -359,17 +360,17 @@ http://127.0.0.1:8000/items/?item-query=foobaritems ## Đ’ĐžĐœŃŃ‚ĐŸĐș ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ Đ· OpenAPI { #exclude-parameters-from-openapi } -Đ©ĐŸĐ± ĐČĐžĐșлючОтО query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Ń– Đ·ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœĐŸŃ— ŃŃ…Đ”ĐŒĐž OpenAPI (і, таĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ, Đ· аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐžŃ… ŃĐžŃŃ‚Đ”ĐŒ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń—), ĐČŃŃ‚Đ°ĐœĐŸĐČіть ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `include_in_schema` ĐŽĐ»Ń `Query` ĐČ `False`: +Đ©ĐŸĐ± ĐČĐžĐșлючОтО ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżĐžŃ‚Ńƒ Đ·Ń– Đ·ĐłĐ”ĐœĐ”Ń€ĐŸĐČĐ°ĐœĐŸŃ— ŃŃ…Đ”ĐŒĐž OpenAPI (і, таĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ, Đ· аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐžŃ… ŃĐžŃŃ‚Đ”ĐŒ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń—), ĐČŃŃ‚Đ°ĐœĐŸĐČіть ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `include_in_schema` ĐŽĐ»Ń `Query` ĐČ `False`: {* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *} ## ĐšĐ°ŃŃ‚ĐŸĐŒĐœĐ° ĐČĐ°Đ»Ń–ĐŽĐ°Ń†Ń–Ń { #custom-validation } -ĐœĐŸĐ¶ŃƒŃ‚ŃŒ Đ±ŃƒŃ‚Đž ĐČОпаЎĐșĐž, ĐșĐŸĐ»Đž ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐżŃ€ĐŸĐČДстО ĐșĐ°ŃŃ‚ĐŸĐŒĐœŃƒ ĐČаліЎацію, яĐșу ĐœĐ” ĐŒĐŸĐ¶ĐœĐ° Ń€Đ”Đ°Đ»Ń–Đ·ŃƒĐČато за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ, ĐżĐŸĐșĐ°Đ·Đ°ĐœĐžŃ… ĐČОщД. +ĐœĐŸĐ¶ŃƒŃ‚ŃŒ Đ±ŃƒŃ‚Đž ĐČОпаЎĐșĐž, ĐșĐŸĐ»Đž ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐżŃ€ĐŸĐČДстО **ĐșĐ°ŃŃ‚ĐŸĐŒĐœŃƒ ĐČаліЎацію**, яĐșу ĐœĐ” ĐŒĐŸĐ¶ĐœĐ° Ń€Đ”Đ°Đ»Ń–Đ·ŃƒĐČато за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ, ĐżĐŸĐșĐ°Đ·Đ°ĐœĐžŃ… ĐČОщД. -ĐŁ таĐșох ĐČОпаЎĐșах ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž ĐșĐ°ŃŃ‚ĐŸĐŒĐœŃƒ Ń„ŃƒĐœĐșцію-ĐČĐ°Đ»Ń–ĐŽĐ°Ń‚ĐŸŃ€, яĐșа буЎД Đ·Đ°ŃŃ‚ĐŸŃĐŸĐČĐ°ĐœĐ° ĐżŃ–ŃĐ»Ń Đ·ĐČочаĐčĐœĐŸŃ— ĐČаліЎації (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, ĐżŃ–ŃĐ»Ń пДрДĐČірĐșĐž, Ń‰ĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ є Ń‚ĐžĐżĐŸĐŒ `str`). +ĐŁ таĐșох ĐČОпаЎĐșах ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž **ĐșĐ°ŃŃ‚ĐŸĐŒĐœŃƒ Ń„ŃƒĐœĐșцію-ĐČĐ°Đ»Ń–ĐŽĐ°Ń‚ĐŸŃ€**, яĐșа буЎД Đ·Đ°ŃŃ‚ĐŸŃĐŸĐČĐ°ĐœĐ° ĐżŃ–ŃĐ»Ń Đ·ĐČочаĐčĐœĐŸŃ— ĐČаліЎації (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, ĐżŃ–ŃĐ»Ń пДрДĐČірĐșĐž, Ń‰ĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ є Ń‚ĐžĐżĐŸĐŒ `str`). -ĐŠĐ” ĐŒĐŸĐ¶ĐœĐ° ĐŽĐŸŃŃĐłŃ‚Đž за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ [Pydantic's `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) ĐČ ŃĐ”Ń€Đ”ĐŽĐžĐœŃ– `Annotated`. +ĐŠĐ” ĐŒĐŸĐ¶ĐœĐ° ĐŽĐŸŃŃĐłŃ‚Đž за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ [Pydantic's `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– `Annotated`. /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° @@ -377,7 +378,7 @@ Pydantic таĐșĐŸĐ¶ ĐŒĐ°Ń” [`BeforeValidator`](https://docs.pydantic.dev/latest/ /// -НапроĐșлаЎ, цДĐč ĐșĐ°ŃŃ‚ĐŸĐŒĐœĐžĐč ĐČĐ°Đ»Ń–ĐŽĐ°Ń‚ĐŸŃ€ пДрДĐČіряє, чо ĐżĐŸŃ‡ĐžĐœĐ°Ń”Ń‚ŃŒŃŃ ID Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚Đ° Đ· `isbn-` ĐŽĐ»Ń ĐœĐŸĐŒĐ”Ń€Đ° ĐșĐœĐžĐłĐž ISBN Đ°Đ±ĐŸ Đ· `imdb-` ĐŽĐ»Ń ID URL Ń„Ń–Đ»ŃŒĐŒŃƒ ĐœĐ° IMDB: +НапроĐșлаЎ, цДĐč ĐșĐ°ŃŃ‚ĐŸĐŒĐœĐžĐč ĐČĐ°Đ»Ń–ĐŽĐ°Ń‚ĐŸŃ€ пДрДĐČіряє, чо ĐżĐŸŃ‡ĐžĐœĐ°Ń”Ń‚ŃŒŃŃ ID ĐżŃ€Đ”ĐŽĐŒĐ”Ń‚Đ° Đ· `isbn-` ĐŽĐ»Ń ĐœĐŸĐŒĐ”Ń€Đ° ĐșĐœĐžĐłĐž ISBN Đ°Đ±ĐŸ Đ· `imdb-` ĐŽĐ»Ń ID URL Ń„Ń–Đ»ŃŒĐŒŃƒ ĐœĐ° IMDB: {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *} @@ -389,39 +390,39 @@ Pydantic таĐșĐŸĐ¶ ĐŒĐ°Ń” [`BeforeValidator`](https://docs.pydantic.dev/latest/ /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐČĐžĐșĐŸĐœĐ°Ń‚Đž Đ±ŃƒĐŽŃŒ-яĐșу ĐČаліЎацію, яĐșа ĐČĐžĐŒĐ°ĐłĐ°Ń” ĐČĐ·Đ°Ń”ĐŒĐŸĐŽŃ–Ń— Đ· Đ±ŃƒĐŽŃŒ-яĐșĐžĐŒ Đ·ĐŸĐČĐœŃ–ŃˆĐœŃ–ĐŒ ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚ĐŸĐŒ, таĐșĐžĐŒ яĐș база ĐŽĐ°ĐœĐžŃ… чо Ń–ĐœŃˆĐžĐč API, Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ Ń†ŃŒĐŸĐłĐŸ сліЎ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато FastAPI Dependencies — ĐČĐž ĐŽŃ–Đ·ĐœĐ°Ń”Ń‚Đ”ŃŃŒ ĐżŃ€ĐŸ ĐœĐžŃ… ĐżŃ–Đ·ĐœŃ–ŃˆĐ”. +ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐČĐžĐșĐŸĐœĐ°Ń‚Đž Đ±ŃƒĐŽŃŒ-яĐșу ĐČаліЎацію, яĐșа ĐČĐžĐŒĐ°ĐłĐ°Ń” ĐČĐ·Đ°Ń”ĐŒĐŸĐŽŃ–Ń— Đ· Đ±ŃƒĐŽŃŒ-яĐșĐžĐŒ **Đ·ĐŸĐČĐœŃ–ŃˆĐœŃ–ĐŒ ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ‚ĐŸĐŒ**, таĐșĐžĐŒ яĐș база ĐŽĐ°ĐœĐžŃ… чо Ń–ĐœŃˆĐžĐč API, Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ Ń†ŃŒĐŸĐłĐŸ сліЎ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато **FastAPI Dependencies** - ĐČĐž ĐŽŃ–Đ·ĐœĐ°Ń”Ń‚Đ”ŃŃŒ ĐżŃ€ĐŸ ĐœĐžŃ… ĐżŃ–Đ·ĐœŃ–ŃˆĐ”. -Щі ĐșĐ°ŃŃ‚ĐŸĐŒĐœŃ– ĐČĐ°Đ»Ń–ĐŽĐ°Ń‚ĐŸŃ€Đž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуються ĐŽĐ»Ń рДчДĐč, яĐșі ĐŒĐŸĐ¶ĐœĐ° пДрДĐČірото лОшД Đ· Ń‚ĐžĐŒĐž ŃĐ°ĐŒĐžĐŒĐž ĐŽĐ°ĐœĐžĐŒĐž, Ń‰ĐŸ ĐœĐ°ĐŽĐ°ĐœŃ– ĐČ Đ·Đ°ĐżĐžŃ‚Ń–. +Щі ĐșĐ°ŃŃ‚ĐŸĐŒĐœŃ– ĐČĐ°Đ»Ń–ĐŽĐ°Ń‚ĐŸŃ€Đž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуються ĐŽĐ»Ń рДчДĐč, яĐșі ĐŒĐŸĐ¶ĐœĐ° пДрДĐČірото **лОшД** Đ· **Ń‚ĐžĐŒĐž ŃĐ°ĐŒĐžĐŒĐž ĐŽĐ°ĐœĐžĐŒĐž**, Ń‰ĐŸ ĐœĐ°ĐŽĐ°ĐœŃ– ĐČ Đ·Đ°ĐżĐžŃ‚Ń–. /// ### Đ—Ń€ĐŸĐ·ŃƒĐŒŃ–ĐčтД цДĐč ĐșĐŸĐŽ { #understand-that-code } -Đ“ĐŸĐ»ĐŸĐČĐœĐžĐč ĐŒĐŸĐŒĐ”ĐœŃ‚ — цД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ `AfterValidator` Đ· Ń„ŃƒĐœĐșцією ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– `Annotated`. ĐœĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸĐżŃƒŃŃ‚ĐžŃ‚Đž цю Ń‡Đ°ŃŃ‚ĐžĐœŃƒ, яĐșŃ‰ĐŸ Ń…ĐŸŃ‡Đ”Ń‚Đ”. đŸ€ž +Đ“ĐŸĐ»ĐŸĐČĐœĐžĐč ĐŒĐŸĐŒĐ”ĐœŃ‚ - цД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ **`AfterValidator` Đ· Ń„ŃƒĐœĐșцією ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– `Annotated`**. ĐœĐŸĐ¶Đ”Ń‚Đ” ĐżŃ€ĐŸĐżŃƒŃŃ‚ĐžŃ‚Đž цю Ń‡Đ°ŃŃ‚ĐžĐœŃƒ, яĐșŃ‰ĐŸ Ń…ĐŸŃ‡Đ”Ń‚Đ”. đŸ€ž --- АлД яĐșŃ‰ĐŸ ĐČĐ°ĐŒ ціĐșаĐČĐŸ Ń€ĐŸĐ·Ń–Đ±Ń€Đ°Ń‚ĐžŃŃ ĐČ Ń†ŃŒĐŸĐŒŃƒ ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐŸĐŒŃƒ проĐșлаЎі ĐșĐŸĐŽŃƒ і ĐČĐ°ĐŒ щД ĐœĐ” ĐœĐ°Đ±Ń€ĐžĐŽĐ»ĐŸ, ĐŸŃŃŒ ĐșŃ–Đ»ŃŒĐșа ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČох ЎДталДĐč. -#### Đ ŃĐŽĐŸĐș Ń–Đ· `value.startswith()` { #string-with-value-startswith } +#### ĐĄŃ‚Ń€ĐŸĐșа Đ· `value.startswith()` { #string-with-value-startswith } -ЗĐČĐ”Ń€ĐœŃƒĐ»Đž уĐČагу? Đ ŃĐŽĐŸĐș Ń–Đ· `value.startswith()` ĐŒĐŸĐ¶Đ” проĐčĐŒĐ°Ń‚Đž ĐșĐŸŃ€Ń‚Đ”Đ¶, і Ń‚ĐŸĐŽŃ– ĐČŃ–Đœ пДрДĐČŃ–Ń€ŃŃ‚ĐžĐŒĐ” ĐșĐŸĐ¶ĐœĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ ĐČ ĐșĐŸŃ€Ń‚Đ”Đ¶Ń–: +ЗĐČĐ”Ń€ĐœŃƒĐ»Đž уĐČагу? ĐĄŃ‚Ń€ĐŸĐșа Đ· `value.startswith()` ĐŒĐŸĐ¶Đ” проĐčĐŒĐ°Ń‚Đž ĐșĐŸŃ€Ń‚Đ”Đ¶, і Ń‚ĐŸĐŽŃ– ĐČŃ–Đœ пДрДĐČŃ–Ń€ŃŃ‚ĐžĐŒĐ” ĐșĐŸĐ¶ĐœĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ ĐČ ĐșĐŸŃ€Ń‚Đ”Đ¶Ń–: {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *} -#### ВопаЮĐșĐŸĐČĐžĐč Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚ { #a-random-item } +#### ВопаЮĐșĐŸĐČĐžĐč ĐżŃ€Đ”ĐŽĐŒĐ”Ń‚ { #a-random-item } -За ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ `data.items()` ĐŒĐž ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”ĐŒĐŸ Ń–Ń‚Đ”Ń€Đ°Đ±Đ”Đ»ŃŒĐœĐžĐč ĐŸĐ±'єĐșт Ń–Đ· ĐșĐŸŃ€Ń‚Đ”Đ¶Đ°ĐŒĐž, Ń‰ĐŸ ĐŒŃ–ŃŃ‚ŃŃ‚ŃŒ Đșлюч і Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ ĐŽĐ»Ń ĐșĐŸĐ¶ĐœĐŸĐłĐŸ Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚Đ° ŃĐ»ĐŸĐČĐœĐžĐșа. +За ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ `data.items()` ĐŒĐž ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”ĐŒĐŸ Ń–Ń‚Đ”Ń€Đ°Đ±Đ”Đ»ŃŒĐœĐžĐč ĐŸĐ±'єĐșт Ń–Đ· ĐșĐŸŃ€Ń‚Đ”Đ¶Đ°ĐŒĐž, Ń‰ĐŸ ĐŒŃ–ŃŃ‚ŃŃ‚ŃŒ Đșлюч і Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ ĐŽĐ»Ń ĐșĐŸĐ¶ĐœĐŸĐłĐŸ ĐżŃ€Đ”ĐŽĐŒĐ”Ń‚Đ° ŃĐ»ĐŸĐČĐœĐžĐșа. Мо пДрДтĐČĐŸŃ€ŃŽŃ”ĐŒĐŸ цДĐč Ń–Ń‚Đ”Ń€Đ°Đ±Đ”Đ»ŃŒĐœĐžĐč ĐŸĐ±'єĐșт у Đ·ĐČочаĐčĐœĐžĐč `list` за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ `list(data.items())`. -ĐŸĐŸŃ‚Ń–ĐŒ, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо `random.choice()`, ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ ĐŸŃ‚Ń€ĐžĐŒĐ°Ń‚Đž ĐČОпаЎĐșĐŸĐČĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ Đ·Ń– спОсĐșу, Ń‚ĐŸĐ±Ń‚ĐŸ ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”ĐŒĐŸ ĐșĐŸŃ€Ń‚Đ”Đ¶ Ń–Đ· `(id, name)`. ĐŠĐ” ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž Ń‰ĐŸŃŃŒ ĐœĐ° Đ·Ń€Đ°Đ·ĐŸĐș `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`. +ĐŸĐŸŃ‚Ń–ĐŒ, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо `random.choice()`, ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ ĐŸŃ‚Ń€ĐžĐŒĐ°Ń‚Đž **ĐČОпаЎĐșĐŸĐČĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ** Đ·Ń– спОсĐșу, Ń‚ĐŸĐ±Ń‚ĐŸ ĐŸŃ‚Ń€ĐžĐŒŃƒŃ”ĐŒĐŸ ĐșĐŸŃ€Ń‚Đ”Đ¶ Ń–Đ· `(id, name)`. ĐŠĐ” ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž Ń‰ĐŸŃŃŒ ĐœĐ° Đ·Ń€Đ°Đ·ĐŸĐș `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`. -Далі ĐŒĐž просĐČĐŸŃŽŃ”ĐŒĐŸ ці ĐŽĐČа Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ ĐșĐŸŃ€Ń‚Đ”Đ¶Ńƒ Đ·ĐŒŃ–ĐœĐœĐžĐŒ `id` і `name`. +Далі ĐŒĐž **просĐČĐŸŃŽŃ”ĐŒĐŸ ці ĐŽĐČа Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ** ĐșĐŸŃ€Ń‚Đ”Đ¶Ńƒ Đ·ĐŒŃ–ĐœĐœĐžĐŒ `id` і `name`. -ĐąĐŸĐ¶, яĐșŃ‰ĐŸ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČач ĐœĐ” ĐČĐșазаĐČ ID Đ”Đ»Đ”ĐŒĐ”ĐœŃ‚Đ°, ĐČŃ–Đœ ĐČсД ĐŸĐŽĐœĐŸ ĐŸŃ‚Ń€ĐžĐŒĐ°Ń” ĐČОпаЎĐșĐŸĐČу рДĐșĐŸĐŒĐ”ĐœĐŽĐ°Ń†Ń–ŃŽ. +ĐąĐŸĐ¶, яĐșŃ‰ĐŸ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČач ĐœĐ” ĐČĐșазаĐČ ID ĐżŃ€Đ”ĐŽĐŒĐ”Ń‚Đ°, ĐČŃ–Đœ ĐČсД ĐŸĐŽĐœĐŸ ĐŸŃ‚Ń€ĐžĐŒĐ°Ń” ĐČОпаЎĐșĐŸĐČу рДĐșĐŸĐŒĐ”ĐœĐŽĐ°Ń†Ń–ŃŽ. -...ĐŒĐž Ń€ĐŸĐ±ĐžĐŒĐŸ ĐČсД цД ĐČ ĐŸĐŽĐœĐŸĐŒŃƒ ĐżŃ€ĐŸŃŃ‚ĐŸĐŒŃƒ ряЮĐșу. đŸ€Ż Єіба ĐČĐž ĐœĐ” любОтД Python? 🐍 +...ĐŒĐž Ń€ĐŸĐ±ĐžĐŒĐŸ ĐČсД цД ĐČ **ĐŸĐŽĐœĐŸĐŒŃƒ ĐżŃ€ĐŸŃŃ‚ĐŸĐŒŃƒ ряЮĐșу**. đŸ€Ż Єіба ĐČĐž ĐœĐ” любОтД Python? 🐍 {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *} @@ -436,7 +437,7 @@ Pydantic таĐșĐŸĐ¶ ĐŒĐ°Ń” [`BeforeValidator`](https://docs.pydantic.dev/latest/ * `description` * `deprecated` -ВаліЎації, ŃĐżĐ”Ń†ĐžŃ„Ń–Ń‡ĐœŃ– ĐŽĐ»Ń ряЮĐșіĐČ: +ВаліЎації, ŃĐżĐ”Ń†ĐžŃ„Ń–Ń‡ĐœŃ– ĐŽĐ»Ń ŃŃ‚Ń€ĐŸĐș: * `min_length` * `max_length` diff --git a/docs/uk/docs/tutorial/query-params.md b/docs/uk/docs/tutorial/query-params.md index 755b9e21a..d70fb1fe3 100644 --- a/docs/uk/docs/tutorial/query-params.md +++ b/docs/uk/docs/tutorial/query-params.md @@ -1,10 +1,10 @@ -# Query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž { #query-parameters } +# ĐŸĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž Đ·Đ°ĐżĐžŃ‚Ńƒ { #query-parameters } -ĐšĐŸĐ»Đž ĐČĐž ĐŸĐłĐŸĐ»ĐŸŃˆŃƒŃ”Ń‚Đ” Ń–ĐœŃˆŃ– ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž Ń„ŃƒĐœĐșції, яĐșі ĐœĐ” є Ń‡Đ°ŃŃ‚ĐžĐœĐŸŃŽ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ ŃˆĐ»ŃŃ…Ńƒ, ĐČĐŸĐœĐž аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ Ń–ĐœŃ‚Đ”Ń€ĐżŃ€Đ”Ń‚ŃƒŃŽŃ‚ŃŒŃŃ яĐș ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž «query». +ĐšĐŸĐ»Đž ĐČĐž ĐŸĐłĐŸĐ»ĐŸŃˆŃƒŃ”Ń‚Đ” Ń–ĐœŃˆŃ– ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž Ń„ŃƒĐœĐșції, яĐșі ĐœĐ” є Ń‡Đ°ŃŃ‚ĐžĐœĐŸŃŽ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ ŃˆĐ»ŃŃ…Ńƒ, ĐČĐŸĐœĐž аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ Ń–ĐœŃ‚Đ”Ń€ĐżŃ€Đ”Ń‚ŃƒŃŽŃ‚ŃŒŃŃ яĐș ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž Â«Đ·Đ°ĐżĐžŃ‚ŃƒÂ». {* ../../docs_src/query_params/tutorial001_py310.py hl[9] *} -Query — цД ĐœĐ°Đ±Ń–Ń€ пар Đșлюч-Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ, Ń‰ĐŸ ĐčЮуть ĐżŃ–ŃĐ»Ń ŃĐžĐŒĐČĐŸĐ»Ńƒ `?` ĐČ URL, Ń€ĐŸĐ·ĐŽŃ–Đ»Đ”ĐœŃ– ŃĐžĐŒĐČĐŸĐ»Đ°ĐŒĐž `&`. +Запот - цД ĐœĐ°Đ±Ń–Ń€ пар Đșлюч-Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ, Ń‰ĐŸ ĐčЮуть ĐżŃ–ŃĐ»Ń ŃĐžĐŒĐČĐŸĐ»Ńƒ `?` ĐČ URL, Ń€ĐŸĐ·ĐŽŃ–Đ»Đ”ĐœŃ– ŃĐžĐŒĐČĐŸĐ»Đ°ĐŒĐž `&`. НапроĐșлаЎ, ĐČ URL: @@ -12,25 +12,25 @@ Query — цД ĐœĐ°Đ±Ń–Ń€ пар Đșлюч-Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ, Ń‰ĐŸ ĐčЮуть пі http://127.0.0.1:8000/items/?skip=0&limit=10 ``` -...ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒĐž query є: +...ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒĐž Đ·Đ°ĐżĐžŃ‚Ńƒ є: * `skip`: Đ·Ń– Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ `0` * `limit`: Đ·Ń– Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ `10` -ОсĐșŃ–Đ»ŃŒĐșĐž ĐČĐŸĐœĐž є Ń‡Đ°ŃŃ‚ĐžĐœĐŸŃŽ URL, ĐČĐŸĐœĐž Â«ĐżŃ€ĐžŃ€ĐŸĐŽĐœĐŸÂ» є ряЮĐșĐ°ĐŒĐž. +ОсĐșŃ–Đ»ŃŒĐșĐž ĐČĐŸĐœĐž є Ń‡Đ°ŃŃ‚ĐžĐœĐŸŃŽ URL, ĐČĐŸĐœĐž Â«ĐżŃ€ĐžŃ€ĐŸĐŽĐœĐŸÂ» є ŃŃ‚Ń€ĐŸĐșĐ°ĐŒĐž. АлД ĐșĐŸĐ»Đž ĐČĐž ĐŸĐłĐŸĐ»ĐŸŃˆŃƒŃ”Ń‚Đ” їх Ń–Đ· Ń‚ĐžĐżĐ°ĐŒĐž Python (у ĐœĐ°ĐČĐ”ĐŽĐ”ĐœĐŸĐŒŃƒ проĐșлаЎі яĐș `int`), ĐČĐŸĐœĐž пДрДтĐČĐŸŃ€ŃŽŃŽŃ‚ŃŒŃŃ ĐœĐ° цДĐč топ і ĐżŃ€ĐŸŃ…ĐŸĐŽŃŃ‚ŃŒ пДрДĐČірĐșу ĐČŃ–ĐŽĐżĐŸĐČŃ–ĐŽĐœĐŸŃŃ‚Ń–. -ĐŁĐČĐ”ŃŃŒ Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč ĐżŃ€ĐŸŃ†Đ”Ń, яĐșĐžĐč Đ·Đ°ŃŃ‚ĐŸŃĐŸĐČується ĐŽĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ ŃˆĐ»ŃŃ…Ńƒ, таĐșĐŸĐ¶ Đ·Đ°ŃŃ‚ĐŸŃĐŸĐČується ĐŽĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ query: +ĐŁĐČĐ”ŃŃŒ Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč ĐżŃ€ĐŸŃ†Đ”Ń, яĐșĐžĐč Đ·Đ°ŃŃ‚ĐŸŃĐŸĐČується ĐŽĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ ŃˆĐ»ŃŃ…Ńƒ, таĐșĐŸĐ¶ Đ·Đ°ŃŃ‚ĐŸŃĐŸĐČується ĐŽĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ Đ·Đ°ĐżĐžŃ‚Ńƒ: * ĐŸŃ–ĐŽŃ‚Ń€ĐžĐŒĐșа ĐČ Ń€Đ”ĐŽĐ°ĐșŃ‚ĐŸŃ€Ń– (ĐŸŃ‡Đ”ĐČĐžĐŽĐœĐŸ) -* Â«ĐżĐ°Ń€ŃĐžĐœĐłÂ» ĐŽĐ°ĐœĐžŃ… +* Â«ĐżĐ°Ń€ŃĐžĐœĐłÂ» ĐŽĐ°ĐœĐžŃ… * Đ’Đ°Đ»Ń–ĐŽĐ°Ń†Ń–Ń ĐŽĐ°ĐœĐžŃ… * АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐ° ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń ## Đ—ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ { #defaults } -ОсĐșŃ–Đ»ŃŒĐșĐž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž query ĐœĐ” є фіĐșŃĐŸĐČĐ°ĐœĐŸŃŽ Ń‡Đ°ŃŃ‚ĐžĐœĐŸŃŽ ŃˆĐ»ŃŃ…Ńƒ, ĐČĐŸĐœĐž ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ Đ±ŃƒŃ‚Đž ĐœĐ”ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒĐž та ĐŒĐ°Ń‚Đž Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ. +ОсĐșŃ–Đ»ŃŒĐșĐž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž Đ·Đ°ĐżĐžŃ‚Ńƒ ĐœĐ” є фіĐșŃĐŸĐČĐ°ĐœĐŸŃŽ Ń‡Đ°ŃŃ‚ĐžĐœĐŸŃŽ ŃˆĐ»ŃŃ…Ńƒ, ĐČĐŸĐœĐž ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ Đ±ŃƒŃ‚Đž ĐœĐ”ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒĐž та ĐŒĐ°Ń‚Đž Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ. ĐŁ ĐœĐ°ĐČĐ”ĐŽĐ”ĐœĐŸĐŒŃƒ ĐČОщД проĐșлаЎі ĐČĐŸĐœĐž ĐŒĐ°ŃŽŃ‚ŃŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ: `skip=0` і `limit=10`. @@ -59,7 +59,7 @@ http://127.0.0.1:8000/items/?skip=20 ## ĐĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČі ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž { #optional-parameters } -йаĐș ŃĐ°ĐŒĐŸ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž ĐœĐ”ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČі ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž query, ĐČŃŃ‚Đ°ĐœĐŸĐČĐžĐČшО ĐŽĐ»Ń ĐœĐžŃ… Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `None`: +йаĐș ŃĐ°ĐŒĐŸ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž ĐœĐ”ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČі ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž Đ·Đ°ĐżĐžŃ‚Ńƒ, ĐČŃŃ‚Đ°ĐœĐŸĐČĐžĐČшО ĐŽĐ»Ń ĐœĐžŃ… Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `None`: {* ../../docs_src/query_params/tutorial002_py310.py hl[7] *} @@ -67,11 +67,11 @@ http://127.0.0.1:8000/items/?skip=20 /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -йаĐșĐŸĐ¶ Đ·ĐČĐ”Ń€ĐœŃ–Ń‚ŃŒ уĐČагу, Ń‰ĐŸ **FastAPI** ĐŽĐŸŃŃ‚Đ°Ń‚ĐœŃŒĐŸ Ń€ĐŸĐ·ŃƒĐŒĐœĐžĐč, Ń‰ĐŸĐ± ĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚Đž, Ń‰ĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ŃˆĐ»ŃŃ…Ńƒ `item_id` є ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐŒ ŃˆĐ»ŃŃ…Ńƒ, а `q` — ĐœŃ–, ĐŸŃ‚Đ¶Đ”, цД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ query. +йаĐșĐŸĐ¶ Đ·ĐČĐ”Ń€ĐœŃ–Ń‚ŃŒ уĐČагу, Ń‰ĐŸ **FastAPI** ĐŽĐŸŃŃ‚Đ°Ń‚ĐœŃŒĐŸ Ń€ĐŸĐ·ŃƒĐŒĐœĐžĐč, Ń‰ĐŸĐ± ĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚Đž, Ń‰ĐŸ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ŃˆĐ»ŃŃ…Ńƒ `item_id` є ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ĐŸĐŒ ŃˆĐ»ŃŃ…Ńƒ, а `q` - ĐœŃ–, ĐŸŃ‚Đ¶Đ”, цД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżĐžŃ‚Ńƒ. /// -## ĐŸĐ”Ń€Đ”Ń‚ĐČĐŸŃ€Đ”ĐœĐœŃ топу ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° query { #query-parameter-type-conversion } +## ĐŸĐ”Ń€Đ”Ń‚ĐČĐŸŃ€Đ”ĐœĐœŃ топу ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° Đ·Đ°ĐżĐžŃ‚Ńƒ { #query-parameter-type-conversion } Во таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐČато ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž топу `bool`, і ĐČĐŸĐœĐž Đ±ŃƒĐŽŃƒŃ‚ŃŒ аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ ĐșĐŸĐœĐČĐ”Ń€Ń‚ĐŸĐČĐ°ĐœŃ–: @@ -107,12 +107,12 @@ http://127.0.0.1:8000/items/foo?short=on http://127.0.0.1:8000/items/foo?short=yes ``` -Đ°Đ±ĐŸ Đ±ŃƒĐŽŃŒ-яĐșĐžĐč Ń–ĐœŃˆĐžĐč ĐČĐ°Ń€Ń–Đ°ĐœŃ‚ ĐœĐ°ĐżĐžŃĐ°ĐœĐœŃ (ĐČДлОĐșі літДрО, ĐżĐ”Ń€ŃˆĐ° літДра ĐČДлОĐșа Ń‚ĐŸŃ‰ĐŸ), ĐČаша Ń„ŃƒĐœĐșція ĐżĐŸĐ±Đ°Ń‡ĐžŃ‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `short` Đ·Ń– Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ `True` топу `bool`. В Ń–ĐœŃˆĐŸĐŒŃƒ ĐČОпаЎĐșу — `False`. +Đ°Đ±ĐŸ Đ±ŃƒĐŽŃŒ-яĐșĐžĐč Ń–ĐœŃˆĐžĐč ĐČĐ°Ń€Ń–Đ°ĐœŃ‚ ĐœĐ°ĐżĐžŃĐ°ĐœĐœŃ (ĐČДлОĐșі літДрО, ĐżĐ”Ń€ŃˆĐ° літДра ĐČДлОĐșа Ń‚ĐŸŃ‰ĐŸ), ĐČаша Ń„ŃƒĐœĐșція ĐżĐŸĐ±Đ°Ń‡ĐžŃ‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `short` Đ·Ń– Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ `True` топу `bool`. В Ń–ĐœŃˆĐŸĐŒŃƒ ĐČОпаЎĐșу - `False`. -## ĐšŃ–Đ»ŃŒĐșа path і query ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ { #multiple-path-and-query-parameters } +## ĐšŃ–Đ»ŃŒĐșа ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ ŃˆĐ»ŃŃ…Ńƒ та Đ·Đ°ĐżĐžŃ‚Ńƒ { #multiple-path-and-query-parameters } -Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐŽĐœĐŸŃ‡Đ°ŃĐœĐŸ ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐČато ĐșŃ–Đ»ŃŒĐșа ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ ŃˆĐ»ŃŃ…Ńƒ та ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ query, **FastAPI** Đ·ĐœĐ°Ń”, яĐșĐžĐč Đ· ĐœĐžŃ… яĐșĐžĐč. +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐŽĐœĐŸŃ‡Đ°ŃĐœĐŸ ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐČато ĐșŃ–Đ»ŃŒĐșа ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ ŃˆĐ»ŃŃ…Ńƒ та ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ Đ·Đ°ĐżĐžŃ‚Ńƒ, **FastAPI** Đ·ĐœĐ°Ń”, яĐșĐžĐč Đ· ĐœĐžŃ… яĐșĐžĐč. І ĐČĐ°ĐŒ ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐČато їх у яĐșĐŸĐŒŃƒŃŃŒ ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐŸĐŒŃƒ ĐżĐŸŃ€ŃĐŽĐșу. @@ -120,17 +120,17 @@ http://127.0.0.1:8000/items/foo?short=yes {* ../../docs_src/query_params/tutorial004_py310.py hl[6,8] *} -## ĐžĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČі ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž query { #required-query-parameters } +## ĐžĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČі ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž Đ·Đ°ĐżĐžŃ‚Ńƒ { #required-query-parameters } -ĐšĐŸĐ»Đž ĐČĐž ĐŸĐłĐŸĐ»ĐŸŃˆŃƒŃ”Ń‚Đ” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ ĐŽĐ»Ń ĐœĐ”-path-ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ (ĐżĐŸĐșĐž Ń‰ĐŸ ĐŒĐž бачОлО лОшД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž query), Ń‚ĐŸĐŽŃ– ĐČĐŸĐœĐž ĐœĐ” є ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒĐž. +ĐšĐŸĐ»Đž ĐČĐž ĐŸĐłĐŸĐ»ĐŸŃˆŃƒŃ”Ń‚Đ” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ ĐŽĐ»Ń ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ, Ń‰ĐŸ ĐœĐ” є ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ°ĐŒĐž ŃˆĐ»ŃŃ…Ńƒ (ĐżĐŸĐșĐž Ń‰ĐŸ ĐŒĐž бачОлО лОшД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž Đ·Đ°ĐżĐžŃ‚Ńƒ), Ń‚ĐŸĐŽŃ– ĐČĐŸĐœĐž ĐœĐ” є ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒĐž. ĐŻĐșŃ‰ĐŸ ĐČĐž ĐœĐ” Ń…ĐŸŃ‡Đ”Ń‚Đ” заЎаĐČато ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐ” Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ, а ĐżŃ€ĐŸŃŃ‚ĐŸ Đ·Ń€ĐŸĐ±ĐžŃ‚Đž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ ĐœĐ”ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒ, заЎаĐčтД `None` яĐș Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ. -АлД яĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” Đ·Ń€ĐŸĐ±ĐžŃ‚Đž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ query ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒ, ĐżŃ€ĐŸŃŃ‚ĐŸ ĐœĐ” ĐČĐșазуĐčтД ĐŽĐ»Ń ĐœŃŒĐŸĐłĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ: +АлД яĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” Đ·Ń€ĐŸĐ±ĐžŃ‚Đž ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżĐžŃ‚Ńƒ ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐŒ, ĐżŃ€ĐŸŃŃ‚ĐŸ ĐœĐ” ĐČĐșазуĐčтД ĐŽĐ»Ń ĐœŃŒĐŸĐłĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ: {* ../../docs_src/query_params/tutorial005_py310.py hl[6:7] *} -бут ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ query `needy` — ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐč ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ query топу `str`. +бут ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżĐžŃ‚Ńƒ `needy` - ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐč ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ Đ·Đ°ĐżĐžŃ‚Ńƒ топу `str`. ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČіЮĐșрОєтД у Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Ń– URL-Đ°ĐŽŃ€Đ”ŃŃƒ: @@ -171,11 +171,11 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy } ``` -І Đ·ĐČŃ–ŃĐœĐŸ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚Đž ĐŽĐ”ŃĐșі ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž яĐș ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČі, ĐŽĐ”ŃĐșі — Đ·Ń– Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ, а ĐŽĐ”ŃĐșі — ĐżĐŸĐČĐœŃ–ŃŃ‚ŃŽ ĐœĐ”ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČі: +І Đ·ĐČŃ–ŃĐœĐŸ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐ·ĐœĐ°Ń‡ĐžŃ‚Đž ĐŽĐ”ŃĐșі ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž яĐș ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČі, ĐŽĐ”ŃĐșі - Đ·Ń– Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ, а ĐŽĐ”ŃĐșі - ĐżĐŸĐČĐœŃ–ŃŃ‚ŃŽ ĐœĐ”ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČі: {* ../../docs_src/query_params/tutorial006_py310.py hl[8] *} -ĐŁ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу є 3 ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž query: +ĐŁ Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу є 3 ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž Đ·Đ°ĐżĐžŃ‚Ńƒ: * `needy`, ĐŸĐ±ĐŸĐČâ€™ŃĐ·ĐșĐŸĐČĐžĐč `str`. * `skip`, `int` Đ·Ń– Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ `0`. diff --git a/docs/uk/docs/tutorial/request-files.md b/docs/uk/docs/tutorial/request-files.md index b7179c393..0785dd206 100644 --- a/docs/uk/docs/tutorial/request-files.md +++ b/docs/uk/docs/tutorial/request-files.md @@ -12,7 +12,7 @@ $ pip install python-multipart ``` -ĐŠĐ” ĐœĐ”ĐŸĐ±Ń…Ń–ĐŽĐœĐŸ, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž заĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœŃ– фаĐčлО ĐżĐ”Ń€Đ”ĐŽĐ°ŃŽŃ‚ŃŒŃŃ у ĐČĐžĐłĐ»ŃĐŽŃ– «form data». +ĐŠĐ” ĐœĐ”ĐŸĐ±Ń…Ń–ĐŽĐœĐŸ, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž заĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœŃ– фаĐčлО ĐżĐ”Ń€Đ”ĐŽĐ°ŃŽŃ‚ŃŒŃŃ яĐș Â«ĐŽĐ°ĐœŃ– Ń„ĐŸŃ€ĐŒĐžÂ». /// @@ -30,7 +30,7 @@ $ pip install python-multipart /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа -`File` — цД Đșлас, яĐșĐžĐč Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ успаЎĐșĐŸĐČує `Form`. +`File` - цД Đșлас, яĐșĐžĐč Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ успаЎĐșĐŸĐČує `Form`. АлД ĐżĐ°ĐŒâ€™ŃŃ‚Đ°ĐčтД, Ń‰ĐŸ ĐșĐŸĐ»Đž ĐČĐž Ń–ĐŒĐżĐŸŃ€Ń‚ŃƒŃ”Ń‚Đ” `Query`, `Path`, `File` та Ń–ĐœŃˆŃ– Đ· `fastapi`, цД ĐœĐ°ŃĐżŃ€Đ°ĐČЮі Ń„ŃƒĐœĐșції, яĐșі ĐżĐŸĐČĐ”Ń€Ń‚Đ°ŃŽŃ‚ŃŒ ŃĐżĐ”Ń†Ń–Đ°Đ»ŃŒĐœŃ– ĐșласО. @@ -42,7 +42,7 @@ $ pip install python-multipart /// -ЀаĐčлО Đ±ŃƒĐŽŃƒŃ‚ŃŒ заĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœŃ– у ĐČĐžĐłĐ»ŃĐŽŃ– «form data». +ЀаĐčлО Đ±ŃƒĐŽŃƒŃ‚ŃŒ заĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœŃ– яĐș Â«ĐŽĐ°ĐœŃ– Ń„ĐŸŃ€ĐŒĐžÂ». ĐŻĐșŃ‰ĐŸ ĐČĐž ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đ” топ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* яĐș `bytes`, **FastAPI** ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Ń” фаĐčĐ» за ĐČас, і ĐČĐž ĐŸŃ‚Ń€ĐžĐŒĐ°Ń”Ń‚Đ” ĐčĐŸĐłĐŸ ĐČĐŒŃ–ŃŃ‚ у ĐČĐžĐłĐ»ŃĐŽŃ– `bytes`. @@ -70,8 +70,8 @@ $ pip install python-multipart `UploadFile` ĐŒĐ°Ń” таĐșі Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚Đž: -* `filename`: Đ ŃĐŽĐŸĐș `str` Đ· ĐŸŃ€ĐžĐłŃ–ĐœĐ°Đ»ŃŒĐœĐŸŃŽ ĐœĐ°Đ·ĐČĐŸŃŽ фаĐčлу, яĐșĐžĐč буĐČ Đ·Đ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐžĐč (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, `myimage.jpg`). -* `content_type`: Đ ŃĐŽĐŸĐș `str` Đ· Ń‚ĐžĐżĐŸĐŒ ĐČĐŒŃ–ŃŃ‚Ńƒ (MIME type / media type) (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, `image/jpeg`). +* `filename`: ĐĄŃ‚Ń€ĐŸĐșа `str` Đ· ĐŸŃ€ĐžĐłŃ–ĐœĐ°Đ»ŃŒĐœĐŸŃŽ ĐœĐ°Đ·ĐČĐŸŃŽ фаĐčлу, яĐșĐžĐč буĐČ Đ·Đ°ĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐžĐč (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, `myimage.jpg`). +* `content_type`: ĐĄŃ‚Ń€ĐŸĐșа `str` Đ· Ń‚ĐžĐżĐŸĐŒ ĐČĐŒŃ–ŃŃ‚Ńƒ (MIME type / media type) (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, `image/jpeg`). * `file`: [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) ([file-like](https://docs.python.org/3/glossary.html#term-file-like-object) ĐŸĐ±'єĐșт). ĐŠĐ” фаĐșŃ‚ĐžŃ‡ĐœĐžĐč фаĐčĐ»ĐŸĐČĐžĐč ĐŸĐ±'єĐșт Python, яĐșĐžĐč ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” пДрДЎаĐČато Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Ń–ĐœŃˆĐžĐŒ Ń„ŃƒĐœĐșŃ†Ń–ŃĐŒ Đ°Đ±ĐŸ Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”ĐșĐ°ĐŒ, Ń‰ĐŸ ĐŸŃ‡Ń–Đșують «file-like» ĐŸĐ±'єĐșт. `UploadFile` ĐŒĐ°Ń” таĐșі Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœŃ– `async` ĐŒĐ”Ń‚ĐŸĐŽĐž. Đ’ĐŸĐœĐž ĐČсі ĐČĐžĐșлОĐșають ĐČŃ–ĐŽĐżĐŸĐČŃ–ĐŽĐœŃ– ĐŒĐ”Ń‚ĐŸĐŽĐž фаĐčлу піЮ ĐșĐ°ĐżĐŸŃ‚ĐŸĐŒ (ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо ĐČĐœŃƒŃ‚Ń€Ń–ŃˆĐœŃ–Đč `SpooledTemporaryFile`). @@ -109,7 +109,7 @@ contents = myfile.file.read() /// -## Đ©ĐŸ таĐșĐ” «Form Data» { #what-is-form-data } +## Đ©ĐŸ таĐșĐ” Â«ĐŽĐ°ĐœŃ– Ń„ĐŸŃ€ĐŒĐžÂ» { #what-is-form-data } ĐĄĐżĐŸŃŃ–Đ±, у яĐșĐžĐč HTML-Ń„ĐŸŃ€ĐŒĐž (`
`) ĐœĐ°ĐŽŃĐžĐ»Đ°ŃŽŃ‚ŃŒ ĐŽĐ°ĐœŃ– ĐœĐ° сДрĐČДр, зазĐČочаĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČує Â«ŃĐżĐ”Ń†Ń–Đ°Đ»ŃŒĐœĐ”Â» ĐșĐŸĐŽŃƒĐČĐ°ĐœĐœŃ ĐŽĐ»Ń цох ĐŽĐ°ĐœĐžŃ…, ĐČŃ–ĐŽĐŒŃ–ĐœĐœĐ” ĐČіЮ JSON. @@ -121,7 +121,7 @@ contents = myfile.file.read() АлД яĐșŃ‰ĐŸ Ń„ĐŸŃ€ĐŒĐ° ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ фаĐčлО, ĐČĐŸĐœĐ° ĐșĐŸĐŽŃƒŃ”Ń‚ŃŒŃŃ яĐș `multipart/form-data`. ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” `File`, **FastAPI** Đ·ĐœĐ°Ń‚ĐžĐŒĐ”, Ń‰ĐŸ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐŸŃ‚Ń€ĐžĐŒĐ°Ń‚Đž фаĐčлО Đ· праĐČĐžĐ»ŃŒĐœĐŸŃ— Ń‡Đ°ŃŃ‚ĐžĐœĐž тіла. -ĐŻĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŽŃ–Đ·ĐœĐ°Ń‚ĐžŃŃ Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ ці топо ĐșĐŸĐŽŃƒĐČĐ°ĐœĐœŃ та Ń„ĐŸŃ€ĐŒĐŸĐČі ĐżĐŸĐ»Ń, ĐŸĐ·ĐœĐ°ĐčĐŸĐŒŃ‚Đ”ŃŃ Đ· [MDN web docs ĐŽĐ»Ń `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). +ĐŻĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐŽŃ–Đ·ĐœĐ°Ń‚ĐžŃŃ Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ ці топо ĐșĐŸĐŽŃƒĐČĐ°ĐœĐœŃ та ĐżĐŸĐ»Ń Ń„ĐŸŃ€ĐŒĐž, ĐŸĐ·ĐœĐ°ĐčĐŸĐŒŃ‚Đ”ŃŃ Đ· [MDN web docs ĐŽĐ»Ń `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// @@ -149,7 +149,7 @@ contents = myfile.file.read() ĐœĐŸĐ¶ĐœĐ° заĐČĐ°ĐœŃ‚Đ°Đ¶ŃƒĐČато ĐșŃ–Đ»ŃŒĐșа фаĐčліĐČ ĐŸĐŽĐœĐŸŃ‡Đ°ŃĐœĐŸ. -Đ’ĐŸĐœĐž Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐżĐŸĐČâ€™ŃĐ·Đ°ĐœŃ– Đ· ĐŸĐŽĐœĐžĐŒ і Ń‚ĐžĐŒ ŃĐ°ĐŒĐžĐŒ «form field», яĐșĐžĐč ĐżĐ”Ń€Đ”ĐŽĐ°Ń”Ń‚ŃŒŃŃ у ĐČĐžĐłĐ»ŃĐŽŃ– «form data». +Đ’ĐŸĐœĐž Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐżĐŸĐČâ€™ŃĐ·Đ°ĐœŃ– Đ· ĐŸĐŽĐœĐžĐŒ і Ń‚ĐžĐŒ ŃĐ°ĐŒĐžĐŒ Â«ĐżĐŸĐ»Đ”ĐŒ Ń„ĐŸŃ€ĐŒĐžÂ», яĐșĐ” ĐżĐ”Ń€Đ”ĐŽĐ°Ń”Ń‚ŃŒŃŃ яĐș Â«ĐŽĐ°ĐœŃ– Ń„ĐŸŃ€ĐŒĐžÂ». Đ©ĐŸĐ± цД Ń€Đ”Đ°Đ»Ń–Đ·ŃƒĐČато, ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž ŃĐżĐžŃĐŸĐș `bytes` Đ°Đ±ĐŸ `UploadFile`: @@ -173,4 +173,4 @@ contents = myfile.file.read() ## ĐŸŃ–ĐŽŃŃƒĐŒĐŸĐș { #recap } -ВоĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД `File`, `bytes` та `UploadFile`, Ń‰ĐŸĐ± ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐČато фаĐčлО ĐŽĐ»Ń заĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ ĐČ Đ·Đ°ĐżĐžŃ‚Ń–, ĐœĐ°ĐŽŃ–ŃĐ»Đ°ĐœŃ– у ĐČĐžĐłĐ»ŃĐŽŃ– form data. +ВоĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД `File`, `bytes` та `UploadFile`, Ń‰ĐŸĐ± ĐŸĐłĐŸĐ»ĐŸŃˆŃƒĐČато фаĐčлО ĐŽĐ»Ń заĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐœŃ ĐČ Đ·Đ°ĐżĐžŃ‚Ń–, ĐœĐ°ĐŽŃ–ŃĐ»Đ°ĐœŃ– яĐș ĐŽĐ°ĐœŃ– Ń„ĐŸŃ€ĐŒĐž. diff --git a/docs/uk/docs/tutorial/request-forms.md b/docs/uk/docs/tutorial/request-forms.md index 382826a40..311377908 100644 --- a/docs/uk/docs/tutorial/request-forms.md +++ b/docs/uk/docs/tutorial/request-forms.md @@ -34,7 +34,7 @@ $ pip install python-multipart /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа -`Form` — цД Đșлас, яĐșĐžĐč Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐœĐ°ŃĐ»Ń–ĐŽŃƒŃ”Ń‚ŃŒŃŃ ĐČіЮ `Body`. +`Form` - цД Đșлас, яĐșĐžĐč Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐœĐ°ŃĐ»Ń–ĐŽŃƒŃ”Ń‚ŃŒŃŃ ĐČіЮ `Body`. /// diff --git a/docs/uk/docs/tutorial/response-status-code.md b/docs/uk/docs/tutorial/response-status-code.md index 3915a53ed..4e49cdc60 100644 --- a/docs/uk/docs/tutorial/response-status-code.md +++ b/docs/uk/docs/tutorial/response-status-code.md @@ -1,5 +1,6 @@ # ĐšĐŸĐŽ статусу ĐČŃ–ĐŽĐżĐŸĐČіЮі { #response-status-code } + йаĐș ŃĐ°ĐŒĐŸ, яĐș ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐșазатО ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐČŃ–ĐŽĐżĐŸĐČіЮі, ĐČĐž таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸĐłĐŸĐ»ĐŸŃĐžŃ‚Đž HTTP ĐșĐŸĐŽ статусу, Ń‰ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ĐŽĐ»Ń ĐČŃ–ĐŽĐżĐŸĐČіЮі, за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ° `status_code` ĐČ Đ±ŃƒĐŽŃŒ-яĐșіĐč Đ· *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…Ńƒ*: * `@app.get()` diff --git a/docs/uk/docs/tutorial/schema-extra-example.md b/docs/uk/docs/tutorial/schema-extra-example.md index b63a2d253..734a06d1a 100644 --- a/docs/uk/docs/tutorial/schema-extra-example.md +++ b/docs/uk/docs/tutorial/schema-extra-example.md @@ -1,4 +1,4 @@ -# ДДĐșĐ»Đ°Ń€ŃƒĐČĐ°ĐœĐœŃ проĐșлаЎіĐČ ĐČŃ…Ń–ĐŽĐœĐžŃ… ĐŽĐ°ĐœĐžŃ… { #declare-request-example-data } +# ДДĐșĐ»Đ°Ń€ŃƒĐČĐ°ĐœĐœŃ проĐșлаЎіĐČ ĐŽĐ°ĐœĐžŃ… Đ·Đ°ĐżĐžŃ‚Ńƒ { #declare-request-example-data } Во ĐŒĐŸĐ¶Đ”Ń‚Đ” заЎатО проĐșлаЎО ĐŽĐ°ĐœĐžŃ…, яĐșі ĐČаш Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș ĐŒĐŸĐ¶Đ” ĐŸŃ‚Ń€ĐžĐŒŃƒĐČато. @@ -42,7 +42,7 @@ OpenAPI 3.1.0 (яĐșĐžĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ĐżĐŸŃ‡ĐžĐœĐ°ŃŽŃ‡Đž Đ· F ## `examples` у ĐĄŃ…Đ”ĐŒŃ– JSON - OpenAPI { #examples-in-json-schema-openapi } -Про ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ– Đ±ŃƒĐŽŃŒ-ĐșĐŸĐłĐŸ Đ· ĐœĐ°ŃŃ‚ŃƒĐżĐœĐŸĐłĐŸ: +ПіЮ час ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Đ±ŃƒĐŽŃŒ-Ń‡ĐŸĐłĐŸ Đ· ĐœĐ°ĐČĐ”ĐŽĐ”ĐœĐŸĐłĐŸ: * `Path()` * `Query()` @@ -109,7 +109,7 @@ OpenAPI 3.1.0 (яĐșĐžĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ĐżĐŸŃ‡ĐžĐœĐ°ŃŽŃ‡Đž Đ· F * `value`: цД ŃĐ°ĐŒ проĐșлаЎ, яĐșĐžĐč буЎД ĐżĐŸĐșĐ°Đ·Đ°ĐœĐŸ, ĐœĐ°ĐżŃ€ĐžĐșлаЎ `dict`. * `externalValue`: Đ°Đ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČа `value`, URL-аЎрДса, Ń‰ĐŸ ĐČĐșĐ°Đ·ŃƒŃ” ĐœĐ° проĐșлаЎ. ĐŸŃ€ĐŸŃ‚Đ” цД ĐŒĐŸĐ¶Đ” ĐœĐ” ĐżŃ–ĐŽŃ‚Ń€ĐžĐŒŃƒĐČатося таĐșĐŸŃŽ ĐșŃ–Đ»ŃŒĐșістю Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ, яĐș `value`. -ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐČĐžĐłĐ»ŃĐŽĐ°Ń” таĐș: +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž цД таĐș: {* ../../docs_src/schema_extra_example/tutorial005_an_py310.py hl[23:49] *} diff --git a/docs/uk/docs/tutorial/security/first-steps.md b/docs/uk/docs/tutorial/security/first-steps.md index aa0d21e2e..7feee1c02 100644 --- a/docs/uk/docs/tutorial/security/first-steps.md +++ b/docs/uk/docs/tutorial/security/first-steps.md @@ -4,7 +4,7 @@ А **frontend** - ĐœĐ° Ń–ĐœŃˆĐŸĐŒŃƒ ĐŽĐŸĐŒĐ”ĐœŃ– Đ°Đ±ĐŸ ĐČ Ń–ĐœŃˆĐŸĐŒŃƒ ŃˆĐ»ŃŃ…Ńƒ Ń‚ĐŸĐłĐŸ ж ĐŽĐŸĐŒĐ”ĐœŃƒ (Đ°Đ±ĐŸ у ĐŒĐŸĐ±Ń–Đ»ŃŒĐœĐŸĐŒŃƒ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу). -І ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ”, Ń‰ĐŸĐ± frontend ĐŒŃ–Đł аĐČŃ‚Đ”ĐœŃ‚ĐžŃ„Ń–ĐșуĐČатося ĐČ backend, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо Ń–ĐŒ'я ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача та ĐżĐ°Ń€ĐŸĐ»ŃŒ. +І ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ”, Ń‰ĐŸĐ± frontend ĐŒŃ–Đł аĐČŃ‚Đ”ĐœŃ‚ĐžŃ„Ń–ĐșуĐČатося ĐČ backend, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо **Ń–ĐŒ'я ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача** та **ĐżĐ°Ń€ĐŸĐ»ŃŒ**. Мо ĐŒĐŸĐ¶Đ”ĐŒĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž **OAuth2**, Ń‰ĐŸĐ± збуЎуĐČато цД Đ· **FastAPI**. @@ -40,7 +40,7 @@ $ pip install python-multipart /// -Запустіть проĐșлаЎ: +Запустіть проĐșлаЎ за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ:
@@ -60,7 +60,7 @@ $ fastapi dev -/// tip | ĐšĐœĐŸĐżĐșа Authorize! +/// tip | ĐšĐœĐŸĐżĐșа «Authorize»! ĐŁ ĐČас ужД є ĐœĐŸĐČа блОсĐșуча ĐșĐœĐŸĐżĐșа «Authorize». @@ -78,7 +78,7 @@ $ fastapi dev /// -ЗĐČŃ–ŃĐœĐŸ, цД ĐœĐ” frontend ĐŽĐ»Ń ĐșŃ–ĐœŃ†Đ”ĐČох ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČачіĐČ, алД цД Ń‡ŃƒĐŽĐŸĐČĐžĐč Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚ ĐŽĐ»Ń Ń–ĐœŃ‚Đ”Ń€Đ°ĐșтоĐČĐœĐŸŃ— ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— ĐČŃŃŒĐŸĐłĐŸ ĐČĐ°ŃˆĐŸĐłĐŸ API. +ЗĐČŃ–ŃĐœĐŸ, цД ĐœĐ” frontend ĐŽĐ»Ń ĐșŃ–ĐœŃ†Đ”ĐČох ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČачіĐČ, алД цД Ń‡ŃƒĐŽĐŸĐČĐžĐč аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐžĐč Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚ ĐŽĐ»Ń Ń–ĐœŃ‚Đ”Ń€Đ°ĐșтоĐČĐœĐŸĐłĐŸ ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚ŃƒĐČĐ°ĐœĐœŃ ĐČŃŃŒĐŸĐłĐŸ ĐČĐ°ŃˆĐŸĐłĐŸ API. ĐĐžĐŒ ĐŒĐŸĐ¶Đ” ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČатося ĐșĐŸĐŒĐ°ĐœĐŽĐ° frontend (яĐșĐŸŃŽ ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ±ŃƒŃ‚Đž і ĐČĐž ŃĐ°ĐŒŃ–). @@ -86,11 +86,11 @@ $ fastapi dev І ĐœĐžĐŒ таĐșĐŸĐ¶ ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČатося ĐČĐž ŃĐ°ĐŒŃ–, Ń‰ĐŸĐ± ĐœĐ°Đ»Đ°ĐłĐŸĐŽĐ¶ŃƒĐČато, пДрДĐČірято та Ń‚Đ”ŃŃ‚ŃƒĐČато Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș. -## ĐŸĐŸŃ‚Ń–Đș ĐżĐ°Ń€ĐŸĐ»ŃŽ { #the-password-flow } +## ĐŸĐŸŃ‚Ń–Đș `password` { #the-password-flow } йДпДр ĐżĐŸĐČĐ”Ń€ĐœŃ–ĐŒĐŸŃŃ Ń‚Ń€ĐŸŃ…Đž ĐœĐ°Đ·Đ°ĐŽ і Ń€ĐŸĐ·Đ±Đ”Ń€Ń–ĐŒĐŸŃŃ, Ń‰ĐŸ цД ĐČсД таĐșĐ”. -`password` «flow» - цД ĐŸĐŽĐžĐœ Đ·Ń– ŃĐżĐŸŃĐŸĐ±Ń–ĐČ («flows»), ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐžŃ… ĐČ OAuth2, ĐŽĐ»Ń ĐŸĐ±Ń€ĐŸĐ±ĐșĐž бДзпДĐșĐž та аĐČŃ‚Đ”ĐœŃ‚ĐžŃ„Ń–Đșації. +`password` Â«ĐżĐŸŃ‚Ń–Đș» - цД ĐŸĐŽĐžĐœ Đ·Ń– ŃĐżĐŸŃĐŸĐ±Ń–ĐČ (Â«ĐżĐŸŃ‚ĐŸĐșіĐČ»), ĐČĐžĐ·ĐœĐ°Ń‡Đ”ĐœĐžŃ… ĐČ OAuth2, ĐŽĐ»Ń ĐŸĐ±Ń€ĐŸĐ±ĐșĐž бДзпДĐșĐž та аĐČŃ‚Đ”ĐœŃ‚ĐžŃ„Ń–Đșації. OAuth2 буĐČ ŃĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐČĐ°ĐœĐžĐč таĐș, Ń‰ĐŸĐ± backend Đ°Đ±ĐŸ API ĐŒĐŸĐłĐ»Đž Đ±ŃƒŃ‚Đž ĐœĐ”Đ·Đ°Đ»Đ”Đ¶ĐœĐžĐŒĐž ĐČіЮ сДрĐČДра, яĐșĐžĐč аĐČŃ‚Đ”ĐœŃ‚ĐžŃ„Ń–Đșує ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача. @@ -100,7 +100,7 @@ OAuth2 буĐČ ŃĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐČĐ°ĐœĐžĐč таĐș, Ń‰ĐŸĐ± backend Đ°Đ±ĐŸ API ĐŒĐŸ - ĐšĐŸŃ€ĐžŃŃ‚ŃƒĐČач ĐČĐČĐŸĐŽĐžŃ‚ŃŒ `username` і `password` у frontend і ĐœĐ°Ń‚ĐžŃĐșає `Enter`. - Frontend (у Đ±Ń€Đ°ŃƒĐ·Đ”Ń€Ń– ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача) ĐœĐ°ĐŽŃĐžĐ»Đ°Ń” ці `username` і `password` ĐœĐ° ŃĐżĐ”Ń†ĐžŃ„Ń–Ń‡ĐœŃƒ URL-Đ°ĐŽŃ€Đ”ŃŃƒ ĐœĐ°ŃˆĐŸĐłĐŸ API (ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœŃƒ яĐș `tokenUrl="token"`). -- API пДрДĐČіряє ці `username` і `password` та ĐżĐŸĐČДртає Â«Ń‚ĐŸĐșĐ”ĐœÂ» (ĐŒĐž щД ĐœŃ–Ń‡ĐŸĐłĐŸ Đ· Ń†ŃŒĐŸĐłĐŸ ĐœĐ” Ń€Đ”Đ°Đ»Ń–Đ·ŃƒĐČалО). +- API пДрДĐČіряє ці `username` і `password` та ĐČŃ–ĐŽĐżĐŸĐČіЮає Â«Ń‚ĐŸĐșĐ”ĐœĐŸĐŒÂ» (ĐŒĐž щД ĐœŃ–Ń‡ĐŸĐłĐŸ Đ· Ń†ŃŒĐŸĐłĐŸ ĐœĐ” Ń€Đ”Đ°Đ»Ń–Đ·ŃƒĐČалО). - Â«ĐąĐŸĐșĐ”ĐœÂ» - цД ĐżŃ€ĐŸŃŃ‚ĐŸ ŃŃ‚Ń€ĐŸĐșа Đ· ĐŽĐ”ŃĐșĐžĐŒ ĐČĐŒŃ–ŃŃ‚ĐŸĐŒ, яĐșĐžĐč ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ ĐżŃ–Đ·ĐœŃ–ŃˆĐ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž, Ń‰ĐŸĐ± пДрДĐČірото Ń†ŃŒĐŸĐłĐŸ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача. - ЗазĐČочаĐč Ń‚ĐŸĐșĐ”Đœ ĐœĐ°Đ»Đ°ŃˆŃ‚ĐŸĐČĐ°ĐœĐžĐč ĐœĐ° заĐČĐ”Ń€ŃˆĐ”ĐœĐœŃ ŃŃ‚Ń€ĐŸĐșу Юії чДрДз пДĐČĐœĐžĐč час. - ĐąĐŸĐ¶ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČачу ĐŽĐŸĐČĐ”ĐŽĐ”Ń‚ŃŒŃŃ Đ·ĐœĐŸĐČу уĐČіĐčто ĐżŃ–Đ·ĐœŃ–ŃˆĐ”. @@ -116,11 +116,11 @@ OAuth2 буĐČ ŃĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐČĐ°ĐœĐžĐč таĐș, Ń‰ĐŸĐ± backend Đ°Đ±ĐŸ API ĐŒĐŸ **FastAPI** ĐœĐ°ĐŽĐ°Ń” ĐșŃ–Đ»ŃŒĐșа Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Ń–ĐČ ĐœĐ° Ń€Ń–Đ·ĐœĐžŃ… ріĐČĐœŃŃ… абстраĐșції, Ń‰ĐŸĐ± Ń€Đ”Đ°Đ»Ń–Đ·ŃƒĐČато ці Ń„ŃƒĐœĐșції бДзпДĐșĐž. -ĐŁ Ń†ŃŒĐŸĐŒŃƒ проĐșлаЎі ĐŒĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń”ĐŒĐŸ **OAuth2** Đ· ĐżĐŸŃ‚ĐŸĐșĐŸĐŒ **Password**, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо Ń‚ĐŸĐșĐ”Đœ **Bearer**. ĐŠĐ” Ń€ĐŸĐ±ĐžŃ‚ŃŒŃŃ за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ Đșласу `OAuth2PasswordBearer`. +ĐŁ Ń†ŃŒĐŸĐŒŃƒ проĐșлаЎі ĐŒĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń”ĐŒĐŸ **OAuth2** Đ· ĐżĐŸŃ‚ĐŸĐșĐŸĐŒ **Password**, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо **Ń‚ĐŸĐșĐ”Đœ ĐœĐŸŃŃ–Ń**. ĐŠĐ” Ń€ĐŸĐ±ĐžŃ‚ŃŒŃŃ за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ Đșласу `OAuth2PasswordBearer`. /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа -«Bearer»-Ń‚ĐŸĐșĐ”Đœ - ĐœĐ” Ń”ĐŽĐžĐœĐžĐč ĐČĐ°Ń€Ń–Đ°ĐœŃ‚. +Â«ĐąĐŸĐșĐ”Đœ ĐœĐŸŃŃ–ŃÂ» - ĐœĐ” Ń”ĐŽĐžĐœĐžĐč ĐČĐ°Ń€Ń–Đ°ĐœŃ‚. АлД цД ĐœĐ°ĐčĐșращоĐč ĐŽĐ»Ń ĐœĐ°ŃˆĐŸĐłĐŸ ŃŃ†Đ”ĐœĐ°Ń€Ń–ŃŽ. @@ -138,7 +138,7 @@ OAuth2 буĐČ ŃĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐČĐ°ĐœĐžĐč таĐș, Ń‰ĐŸĐ± backend Đ°Đ±ĐŸ API ĐŒĐŸ бут `tokenUrl="token"` ĐČŃ–ĐŽĐœĐŸŃĐžŃ‚ŃŒŃŃ ĐŽĐŸ ĐČŃ–ĐŽĐœĐŸŃĐœĐŸŃ— URL-аЎрДсО `token`, яĐșу ĐŒĐž щД ĐœĐ” стĐČĐŸŃ€ĐžĐ»Đž. ОсĐșŃ–Đ»ŃŒĐșĐž цД ĐČŃ–ĐŽĐœĐŸŃĐœĐ° URL-аЎрДса, ĐČĐŸĐœĐ° Đ”ĐșĐČіĐČĐ°Đ»Đ”ĐœŃ‚ĐœĐ° `./token`. -ĐąĐŸĐŒŃƒ, яĐșŃ‰ĐŸ ĐČаш API Ń€ĐŸĐ·ĐŒŃ–Ń‰Đ”ĐœĐžĐč ĐœĐ° `https://example.com/`, цД буЎД `https://example.com/token`. А яĐșŃ‰ĐŸ ĐœĐ° `https://example.com/api/v1/`, Ń‚ĐŸĐŽŃ– цД буЎД `https://example.com/api/v1/token`. +ОсĐșŃ–Đ»ŃŒĐșĐž ĐŒĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”ĐŒĐŸ ĐČŃ–ĐŽĐœĐŸŃĐœŃƒ URL-Đ°ĐŽŃ€Đ”ŃŃƒ, яĐșŃ‰ĐŸ ĐČаш API Ń€ĐŸĐ·ĐŒŃ–Ń‰Đ”ĐœĐžĐč ĐœĐ° `https://example.com/`, цД буЎД `https://example.com/token`. А яĐșŃ‰ĐŸ ĐČаш API Ń€ĐŸĐ·ĐŒŃ–Ń‰Đ”ĐœĐžĐč ĐœĐ° `https://example.com/api/v1/`, Ń‚ĐŸĐŽŃ– цД буЎД `https://example.com/api/v1/token`. ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐČŃ–ĐŽĐœĐŸŃĐœĐŸŃ— URL-аЎрДсО ĐČажлОĐČĐ”, Ń‰ĐŸĐ± ĐČаша ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ° ĐżŃ€ĐŸĐŽĐŸĐČжуĐČала працюĐČато ĐœĐ°ĐČіть у ĐżŃ€ĐŸŃŃƒĐœŃƒŃ‚ĐŸĐŒŃƒ ŃŃ†Đ”ĐœĐ°Ń€Ń–Ń—, яĐș-ĐŸŃ‚ [За прДЎстаĐČĐœĐžĐșĐŸĐŒ](../../advanced/behind-a-proxy.md). @@ -188,7 +188,7 @@ oauth2_scheme(some, parameters) Đ’ĐŸĐœĐ° шуĐșĐ°Ń‚ĐžĐŒĐ” ĐČ Đ·Đ°ĐżĐžŃ‚Ń– Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐŸĐș `Authorization`, пДрДĐČіроть, чо ĐčĐŸĐłĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ - цД `Bearer ` плюс ĐŽĐ”ŃĐșĐžĐč Ń‚ĐŸĐșĐ”Đœ, і ĐżĐŸĐČĐ”Ń€ĐœĐ” Ń‚ĐŸĐșĐ”Đœ яĐș `str`. -ĐŻĐșŃ‰ĐŸ Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșа `Authorization` ĐœĐ”ĐŒĐ°Ń” Đ°Đ±ĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ ĐœĐ” ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ Ń‚ĐŸĐșĐ”ĐœĐ° `Bearer `, ĐČĐŸĐœĐ° ĐŸĐŽŃ€Đ°Đ·Ńƒ ĐČŃ–ĐŽĐżĐŸĐČість ĐżĐŸĐŒĐžĐ»ĐșĐŸŃŽ Đ·Ń– статус-ĐșĐŸĐŽĐŸĐŒ 401 (`UNAUTHORIZED`). +ĐŻĐșŃ‰ĐŸ Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșа `Authorization` ĐœĐ”ĐŒĐ°Ń” Đ°Đ±ĐŸ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ ĐœĐ” ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ Ń‚ĐŸĐșĐ”ĐœĐ° `Bearer `, ĐČĐŸĐœĐ° ĐŸĐŽŃ€Đ°Đ·Ńƒ ĐČŃ–ĐŽĐżĐŸĐČість ĐżĐŸĐŒĐžĐ»ĐșĐŸŃŽ Đ· ĐșĐŸĐŽĐŸĐŒ статусу 401 (`UNAUTHORIZED`). Đ’Đ°ĐŒ ĐœĐ°ĐČіть ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ пДрДĐČірято, чо Ń–ŃĐœŃƒŃ” Ń‚ĐŸĐșĐ”Đœ, Ń‰ĐŸĐ± ĐżĐŸĐČĐ”Ń€ĐœŃƒŃ‚Đž ĐżĐŸĐŒĐžĐ»Đșу. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ±ŃƒŃ‚Đž пДĐČĐœŃ–: яĐșŃ‰ĐŸ ĐČаша Ń„ŃƒĐœĐșція ĐČĐžĐșĐŸĐœŃƒŃ”Ń‚ŃŒŃŃ, у ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń– Ń‚ĐŸĐșĐ”ĐœĐ° буЎД `str`. diff --git a/docs/uk/docs/tutorial/security/get-current-user.md b/docs/uk/docs/tutorial/security/get-current-user.md index b3643a439..1cd308534 100644 --- a/docs/uk/docs/tutorial/security/get-current-user.md +++ b/docs/uk/docs/tutorial/security/get-current-user.md @@ -1,6 +1,6 @@ # ĐžŃ‚Ń€ĐžĐŒĐ°Ń‚Đž ĐżĐŸŃ‚ĐŸŃ‡ĐœĐŸĐłĐŸ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача { #get-current-user } -ĐŁ ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃŒĐŸĐŒŃƒ Ń€ĐŸĐ·ĐŽŃ–Đ»Ń– ŃĐžŃŃ‚Đ”ĐŒĐ° бДзпДĐșĐž (яĐșа Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° ŃĐžŃŃ‚Đ”ĐŒŃ– ĐČĐżŃ€ĐŸĐČĐ°ĐŽĐ¶Đ”ĐœĐœŃ Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč) пДрДЎаĐČала Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ `token` яĐș `str`: +ĐŁ ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃŒĐŸĐŒŃƒ Ń€ĐŸĐ·ĐŽŃ–Đ»Ń– ŃĐžŃŃ‚Đ”ĐŒĐ° бДзпДĐșĐž (яĐșа Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° ŃĐžŃŃ‚Đ”ĐŒŃ– ĐČĐżŃ€ĐŸĐČĐ°ĐŽĐ¶Đ”ĐœĐœŃ Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč) пДрДЎаĐČала *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* `token` яĐș `str`: {* ../../docs_src/security/tutorial001_an_py310.py hl[12] *} @@ -14,7 +14,7 @@ йаĐș ŃĐ°ĐŒĐŸ, яĐș ĐŒĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”ĐŒĐŸ Pydantic ĐŽĐ»Ń ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐœŃ тіл, ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐčĐŸĐłĐŸ Đ±ŃƒĐŽŃŒ-ĐŽĐ”: -{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *} +{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *} ## СтĐČĐŸŃ€ĐžŃ‚Đž Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ `get_current_user` { #create-a-get-current-user-dependency } @@ -24,19 +24,19 @@ `get_current_user` ĐŒĐ°Ń‚ĐžĐŒĐ” Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ Ń–Đ· Ń‚ĐžĐŒ ŃĐ°ĐŒĐžĐŒ `oauth2_scheme`, яĐșĐžĐč ĐŒĐž стĐČĐŸŃ€ĐžĐ»Đž Ń€Đ°ĐœŃ–ŃˆĐ”. -йаĐș ŃĐ°ĐŒĐŸ, яĐș ĐŒĐž Ń€ĐŸĐ±ĐžĐ»Đž Ń€Đ°ĐœŃ–ŃˆĐ” Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐČ ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ, ĐœĐ°ŃˆĐ° ĐœĐŸĐČа Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ `get_current_user` ĐŸŃ‚Ń€ĐžĐŒĐ°Ń” `token` яĐș `str` ĐČіЮ ĐżŃ–ĐŽĐ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– `oauth2_scheme`: +йаĐș ŃĐ°ĐŒĐŸ, яĐș ĐŒĐž Ń€ĐŸĐ±ĐžĐ»Đž Ń€Đ°ĐœŃ–ŃˆĐ” Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐČ *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*, ĐœĐ°ŃˆĐ° ĐœĐŸĐČа Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ `get_current_user` ĐŸŃ‚Ń€ĐžĐŒĐ°Ń” `token` яĐș `str` ĐČіЮ ĐżŃ–ĐŽĐ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń– `oauth2_scheme`: {* ../../docs_src/security/tutorial002_an_py310.py hl[25] *} ## ĐžŃ‚Ń€ĐžĐŒĐ°Ń‚Đž ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача { #get-the-user } -`get_current_user` ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń” (Ń„Đ°Đ»ŃŒŃˆĐžĐČу) ŃƒŃ‚ĐžĐ»Ń–Ń‚ĐœŃƒ Ń„ŃƒĐœĐșцію, яĐșу ĐŒĐž стĐČĐŸŃ€ĐžĐ»Đž, Ń‰ĐŸ проĐčĐŒĐ°Ń” `token` яĐș `str` і ĐżĐŸĐČДртає ĐœĐ°ŃˆŃƒ Pydantic-ĐŒĐŸĐŽĐ”Đ»ŃŒ `User`: +`get_current_user` ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń” (Ń„Đ°Đ»ŃŒŃˆĐžĐČу) ŃƒŃ‚ĐžĐ»Ń–Ń‚ĐœŃƒ Ń„ŃƒĐœĐșцію, яĐșу ĐŒĐž стĐČĐŸŃ€ĐžĐ»Đž, Ń‰ĐŸ проĐčĐŒĐ°Ń” Ń‚ĐŸĐșĐ”Đœ яĐș `str` і ĐżĐŸĐČДртає ĐœĐ°ŃˆŃƒ Pydantic-ĐŒĐŸĐŽĐ”Đ»ŃŒ `User`: {* ../../docs_src/security/tutorial002_an_py310.py hl[19:22,26:27] *} ## Đ’ĐżŃ€ĐŸĐČаЮото ĐżĐŸŃ‚ĐŸŃ‡ĐœĐŸĐłĐŸ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача { #inject-the-current-user } -йДпДр ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč `Depends` Đ· ĐœĐ°ŃˆĐžĐŒ `get_current_user` ĐČ ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ: +йДпДр ĐŒĐž ĐŒĐŸĐ¶Đ”ĐŒĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž Ń‚ĐŸĐč ŃĐ°ĐŒĐžĐč `Depends` Đ· ĐœĐ°ŃˆĐžĐŒ `get_current_user` ĐČ *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*: {* ../../docs_src/security/tutorial002_an_py310.py hl[31] *} @@ -62,13 +62,13 @@ ## Đ†ĐœŃˆŃ– ĐŒĐŸĐŽĐ”Đ»Ń– { #other-models } -йДпДр ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸŃ‚Ń€ĐžĐŒŃƒĐČато ĐżĐŸŃ‚ĐŸŃ‡ĐœĐŸĐłĐŸ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ у Ń„ŃƒĐœĐșціях ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…Ńƒ та працюĐČато Đ· ĐŒĐ”Ń…Đ°ĐœŃ–Đ·ĐŒĐ°ĐŒĐž бДзпДĐșĐž ĐœĐ° ріĐČĐœŃ– **ĐČĐżŃ€ĐŸĐČĐ°ĐŽĐ¶Đ”ĐœĐœŃ Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč**, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо `Depends`. +йДпДр ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸŃ‚Ń€ĐžĐŒŃƒĐČато ĐżĐŸŃ‚ĐŸŃ‡ĐœĐŸĐłĐŸ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ у *Ń„ŃƒĐœĐșціях ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…Ńƒ* та працюĐČато Đ· ĐŒĐ”Ń…Đ°ĐœŃ–Đ·ĐŒĐ°ĐŒĐž бДзпДĐșĐž ĐœĐ° ріĐČĐœŃ– **ĐČĐżŃ€ĐŸĐČĐ°ĐŽĐ¶Đ”ĐœĐœŃ Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč**, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо `Depends`. І ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Đ±ŃƒĐŽŃŒ-яĐșу ĐŒĐŸĐŽĐ”Đ»ŃŒ Đ°Đ±ĐŸ ĐŽĐ°ĐœŃ– ĐŽĐ»Ń ĐČĐžĐŒĐŸĐł бДзпДĐșĐž (у Ń†ŃŒĐŸĐŒŃƒ ĐČОпаЎĐșу Pydantic-ĐŒĐŸĐŽĐ”Đ»ŃŒ `User`). -АлД ĐČĐž ĐœĐ” ĐŸĐ±ĐŒĐ”Đ¶Đ”ĐœŃ– ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃĐŒ яĐșĐŸŃ—ŃŃŒ ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐŸŃ— ĐŒĐŸĐŽĐ”Đ»Đž ĐŽĐ°ĐœĐžŃ…, Đșласу чо топу. +АлД ĐČĐž ĐœĐ” ĐŸĐ±ĐŒĐ”Đ¶Đ”ĐœŃ– ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃĐŒ яĐșĐŸŃ—ŃŃŒ ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐŸŃ— ĐŒĐŸĐŽĐ”Đ»Ń– ĐŽĐ°ĐœĐžŃ…, Đșласу чо топу. -Đ„ĐŸŃ‡Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž id та email і ĐœĐ” ĐŒĐ°Ń‚Đž Đ¶ĐŸĐŽĐœĐŸĐłĐŸ username у ĐČашіĐč ĐŒĐŸĐŽĐ”Đ»Ń–? БДз ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒ. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ті ŃĐ°ĐŒŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž. +Đ„ĐŸŃ‡Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž `id` та `email` і ĐœĐ” ĐŒĐ°Ń‚Đž Đ¶ĐŸĐŽĐœĐŸĐłĐŸ `username` у ĐČашіĐč ĐŒĐŸĐŽĐ”Đ»Ń–? БДз ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒ. Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ті ŃĐ°ĐŒŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž. Đ„ĐŸŃ‡Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž ĐżŃ€ĐŸŃŃ‚ĐŸ `str`? ĐĐ±ĐŸ лОшД `dict`? ĐĐ±ĐŸ Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ Đ”ĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€ Đșласу ĐŒĐŸĐŽĐ”Đ»Ń– базО ĐŽĐ°ĐœĐžŃ…? УсД працює таĐș ŃĐ°ĐŒĐŸ. @@ -78,7 +78,7 @@ ## Đ ĐŸĐ·ĐŒŃ–Ń€ ĐșĐŸĐŽŃƒ { #code-size } -ĐŠĐ”Đč проĐșлаЎ ĐŒĐŸĐ¶Đ” зЎаĐČатося Đ±Đ°ĐłĐ°Ń‚ĐŸŃĐ»Ń–ĐČĐœĐžĐŒ. МаĐčтД ĐœĐ° уĐČазі, Ń‰ĐŸ ĐŒĐž Đ·ĐŒŃ–ŃˆŃƒŃ”ĐŒĐŸ бДзпДĐșу, ĐŒĐŸĐŽĐ”Đ»Ń– ĐŽĐ°ĐœĐžŃ…, ŃƒŃ‚ĐžĐ»Ń–Ń‚ĐœŃ– Ń„ŃƒĐœĐșції та ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ ĐČ ĐŸĐŽĐœĐŸĐŒŃƒ фаĐčлі. +ĐŠĐ”Đč проĐșлаЎ ĐŒĐŸĐ¶Đ” зЎаĐČатося Đ±Đ°ĐłĐ°Ń‚ĐŸŃĐ»Ń–ĐČĐœĐžĐŒ. МаĐčтД ĐœĐ° уĐČазі, Ń‰ĐŸ ĐŒĐž Đ·ĐŒŃ–ŃˆŃƒŃ”ĐŒĐŸ бДзпДĐșу, ĐŒĐŸĐŽĐ”Đ»Ń– ĐŽĐ°ĐœĐžŃ…, ŃƒŃ‚ĐžĐ»Ń–Ń‚ĐœŃ– Ń„ŃƒĐœĐșції та *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ* ĐČ ĐŸĐŽĐœĐŸĐŒŃƒ фаĐčлі. АлД ĐŸŃŃŒ ĐșĐ»ŃŽŃ‡ĐŸĐČĐžĐč ĐŒĐŸĐŒĐ”ĐœŃ‚. @@ -86,20 +86,20 @@ І ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Ń€ĐŸĐ±ĐžŃ‚Đž цД ĐœĐ°ŃŃ‚Ń–Đ»ŃŒĐșĐž сĐșĐ»Đ°ĐŽĐœĐžĐŒ, ĐœĐ°ŃĐșŃ–Đ»ŃŒĐșĐž ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ. І ĐČсД ĐŸĐŽĐœĐŸ ĐŒĐ°Ń‚Đž цД ĐœĐ°ĐżĐžŃĐ°ĐœĐžĐŒ лОшД ĐŸĐŽĐžĐœ раз, ĐČ ĐŸĐŽĐœĐŸĐŒŃƒ ĐŒŃ–ŃŃ†Ń–. З усією ĐłĐœŃƒŃ‡Đșістю. -ЗатД ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž тосячі ĐșŃ–ĐœŃ†Đ”ĐČох Ń‚ĐŸŃ‡ĐŸĐș (ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…Ńƒ), Ń‰ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують ĐŸĐŽĐœŃƒ Đč ту ŃĐ°ĐŒŃƒ ŃĐžŃŃ‚Đ”ĐŒŃƒ бДзпДĐșĐž. +ЗатД ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŒĐ°Ń‚Đž тосячі ĐșŃ–ĐœŃ†Đ”ĐČох Ń‚ĐŸŃ‡ĐŸĐș (*ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…Ńƒ*), Ń‰ĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують ĐŸĐŽĐœŃƒ Đč ту ŃĐ°ĐŒŃƒ ŃĐžŃŃ‚Đ”ĐŒŃƒ бДзпДĐșĐž. І ĐČсі ĐČĐŸĐœĐž (Đ°Đ±ĐŸ Đ±ŃƒĐŽŃŒ-яĐșа Ń—Ń…ĐœŃ Ń‡Đ°ŃŃ‚ĐžĐœĐ°, яĐșу ĐČĐž Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ”) ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ сĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚ĐžŃŃ ĐżĐŸĐČŃ‚ĐŸŃ€ĐœĐžĐŒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃĐŒ цох Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Đ”Đč Đ°Đ±ĐŸ Đ±ŃƒĐŽŃŒ-яĐșох Ń–ĐœŃˆĐžŃ…, яĐșі ĐČĐž стĐČĐŸŃ€ĐžŃ‚Đ”. -І ĐČсі ці тосячі ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…Ńƒ ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ Đ±ŃƒŃ‚Đž ĐČŃŃŒĐŸĐłĐŸ у 3 ряЮĐșĐž: +І ĐČсі ці тосячі *ĐŸĐżĐ”Ń€Đ°Ń†Ń–Đč ŃˆĐ»ŃŃ…Ńƒ* ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ Đ±ŃƒŃ‚Đž ĐČŃŃŒĐŸĐłĐŸ у 3 ряЮĐșĐž: {* ../../docs_src/security/tutorial002_an_py310.py hl[30:32] *} ## ĐŸŃ–ĐŽŃŃƒĐŒĐŸĐș { #recap } -йДпДр ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸŃ‚Ń€ĐžĐŒŃƒĐČато ĐżĐŸŃ‚ĐŸŃ‡ĐœĐŸĐłĐŸ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ у ĐČашіĐč Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ. +йДпДр ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŸŃ‚Ń€ĐžĐŒŃƒĐČато ĐżĐŸŃ‚ĐŸŃ‡ĐœĐŸĐłĐŸ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ у ĐČашіĐč *Ń„ŃƒĐœĐșції ĐŸĐżĐ”Ń€Đ°Ń†Ń–Ń— ŃˆĐ»ŃŃ…Ńƒ*. Мо ĐČжД ĐœĐ° піĐČĐŽĐŸŃ€ĐŸĐ·Ń–. -ĐŸĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ лОшД ĐŽĐŸĐŽĐ°Ń‚Đž ĐŸĐżĐ”Ń€Đ°Ń†Ń–ŃŽ ŃˆĐ»ŃŃ…Ńƒ, Ń‰ĐŸĐ± ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČач/ĐșĐ»Ń–Ń”ĐœŃ‚ ĐŒŃ–Đł фаĐșŃ‚ĐžŃ‡ĐœĐŸ ĐœĐ°ĐŽŃ–ŃĐ»Đ°Ń‚Đž `username` і `password`. +ĐŸĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ лОшД ĐŽĐŸĐŽĐ°Ń‚Đž *ĐŸĐżĐ”Ń€Đ°Ń†Ń–ŃŽ ŃˆĐ»ŃŃ…Ńƒ*, Ń‰ĐŸĐ± ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČач/ĐșĐ»Ń–Ń”ĐœŃ‚ ĐŒŃ–Đł фаĐșŃ‚ĐžŃ‡ĐœĐŸ ĐœĐ°ĐŽŃ–ŃĐ»Đ°Ń‚Đž `username` і `password`. Далі ŃĐ°ĐŒĐ” цД. diff --git a/docs/uk/docs/tutorial/security/oauth2-jwt.md b/docs/uk/docs/tutorial/security/oauth2-jwt.md index 1213afe7b..1fb53ff41 100644 --- a/docs/uk/docs/tutorial/security/oauth2-jwt.md +++ b/docs/uk/docs/tutorial/security/oauth2-jwt.md @@ -10,7 +10,7 @@ JWT ĐŸĐ·ĐœĐ°Ń‡Đ°Ń” «JSON Web Tokens». -ĐŠĐ” ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ ĐșĐŸĐŽŃƒĐČĐ°ĐœĐœŃ ĐŸĐ±'єĐșта JSON у ĐŽĐŸĐČгОĐč Ń‰Ń–Đ»ŃŒĐœĐžĐč Ń€ŃĐŽĐŸĐș бДз ĐżŃ€ĐŸĐ±Ń–Đ»Ń–ĐČ. Đ’Ń–Đœ ĐČĐžĐłĐ»ŃĐŽĐ°Ń” таĐș: +ĐŠĐ” ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚ ĐșĐŸĐŽŃƒĐČĐ°ĐœĐœŃ ĐŸĐ±'єĐșта JSON у ĐŽĐŸĐČгу Ń‰Ń–Đ»ŃŒĐœŃƒ ŃŃ‚Ń€ĐŸĐșу бДз ĐżŃ€ĐŸĐ±Ń–Đ»Ń–ĐČ. Đ’Ń–Đœ ĐČĐžĐłĐ»ŃĐŽĐ°Ń” таĐș: ``` eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c @@ -168,7 +168,7 @@ $ openssl rand -hex 32 {* ../../docs_src/security/tutorial004_an_py310.py hl[93:110] *} -## ĐžĐœĐŸĐČіть ĐŸĐżĐ”Ń€Đ°Ń†Ń–ŃŽ ŃˆĐ»ŃŃ…Ńƒ `/token` { #update-the-token-path-operation } +## ĐžĐœĐŸĐČіть *ĐŸĐżĐ”Ń€Đ°Ń†Ń–ŃŽ ŃˆĐ»ŃŃ…Ńƒ* `/token` { #update-the-token-path-operation } СтĐČĐŸŃ€Ń–Ń‚ŃŒ `timedelta` Đ· Ń‡Đ°ŃĐŸĐŒ Đ¶ĐžŃ‚Ń‚Ń Ń‚ĐŸĐșĐ”ĐœĐ°. diff --git a/docs/uk/docs/tutorial/security/simple-oauth2.md b/docs/uk/docs/tutorial/security/simple-oauth2.md index 686839982..7500792cc 100644 --- a/docs/uk/docs/tutorial/security/simple-oauth2.md +++ b/docs/uk/docs/tutorial/security/simple-oauth2.md @@ -28,9 +28,9 @@ OAuth2 ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ піЮ час ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Â«ĐżĐŸŃ‚ĐŸ Їх зазĐČочаĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують ĐŽĐ»Ń ĐŸĐłĐŸĐ»ĐŸŃˆĐ”ĐœĐœŃ ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐžŃ… праĐČ ĐŽĐŸŃŃ‚ŃƒĐżŃƒ, ĐœĐ°ĐżŃ€ĐžĐșлаЎ: -- `users:read` Đ°Đ±ĐŸ `users:write` — ĐżĐŸŃˆĐžŃ€Đ”ĐœŃ– проĐșлаЎО. -- `instagram_basic` ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується Facebook / Instagram. -- `https://www.googleapis.com/auth/drive` ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується Google. +* `users:read` Đ°Đ±ĐŸ `users:write` — ĐżĐŸŃˆĐžŃ€Đ”ĐœŃ– проĐșлаЎО. +* `instagram_basic` ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується Facebook / Instagram. +* `https://www.googleapis.com/auth/drive` ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується Google. /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа @@ -56,21 +56,21 @@ OAuth2 ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ піЮ час ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Â«ĐżĐŸŃ‚ĐŸ `OAuth2PasswordRequestForm` — цД Đșлас Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń–, Ń‰ĐŸ ĐŸĐłĐŸĐ»ĐŸŃˆŃƒŃ” Ń‚Ń–Đ»ĐŸ Ń„ĐŸŃ€ĐŒĐž Đ·: -- `username`. -- `password`. -- ĐĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ ĐżĐŸĐ»Đ”ĐŒ `scope` яĐș ĐČДлОĐșĐŸŃŽ ŃŃ‚Ń€ĐŸĐșĐŸŃŽ, сĐșĐ»Đ°ĐŽĐ”ĐœĐŸŃŽ Đ·Ń– ŃŃ‚Ń€ĐŸĐș, Ń€ĐŸĐ·ĐŽŃ–Đ»Đ”ĐœĐžŃ… ĐżŃ€ĐŸĐ±Ń–Đ»Đ°ĐŒĐž. -- ĐĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ `grant_type`. +* `username`. +* `password`. +* ĐĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ ĐżĐŸĐ»Đ”ĐŒ `scope` яĐș ĐČДлОĐșĐŸŃŽ ŃŃ‚Ń€ĐŸĐșĐŸŃŽ, сĐșĐ»Đ°ĐŽĐ”ĐœĐŸŃŽ Đ·Ń– ŃŃ‚Ń€ĐŸĐș, Ń€ĐŸĐ·ĐŽŃ–Đ»Đ”ĐœĐžŃ… ĐżŃ€ĐŸĐ±Ń–Đ»Đ°ĐŒĐž. +* ĐĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ `grant_type`. /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -ХпДцОфіĐșація OAuth2 ĐœĐ°ŃĐżŃ€Đ°ĐČЮі ĐČĐžĐŒĐ°ĐłĐ°Ń” ĐżĐŸĐ»Đ” `grant_type` Ń–Đ· фіĐșŃĐŸĐČĐ°ĐœĐžĐŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ `password`, алД `OAuth2PasswordRequestForm` Ń†ŃŒĐŸĐłĐŸ ĐœĐ” ĐżŃ€ĐžĐŒŃƒŃˆŃƒŃ”. +ХпДцОфіĐșація OAuth2 ĐœĐ°ŃĐżŃ€Đ°ĐČЮі *ĐČĐžĐŒĐ°ĐłĐ°Ń”* ĐżĐŸĐ»Đ” `grant_type` Ń–Đ· фіĐșŃĐŸĐČĐ°ĐœĐžĐŒ Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ `password`, алД `OAuth2PasswordRequestForm` Ń†ŃŒĐŸĐłĐŸ ĐœĐ” ĐżŃ€ĐžĐŒŃƒŃˆŃƒŃ”. ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ цД ĐżŃ€ĐžĐŒŃƒŃĐžŃ‚Đž, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД `OAuth2PasswordRequestFormStrict` Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ `OAuth2PasswordRequestForm`. /// -- ĐĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ `client_id` (ĐŽĐ»Ń ĐœĐ°ŃˆĐŸĐłĐŸ проĐșлаЎу ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ). -- ĐĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ `client_secret` (ĐŽĐ»Ń ĐœĐ°ŃˆĐŸĐłĐŸ проĐșлаЎу ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ). +* ĐĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ `client_id` (ĐŽĐ»Ń ĐœĐ°ŃˆĐŸĐłĐŸ проĐșлаЎу ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ). +* ĐĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐžĐŒ `client_secret` (ĐŽĐ»Ń ĐœĐ°ŃˆĐŸĐłĐŸ проĐșлаЎу ĐœĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ). /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа @@ -132,7 +132,7 @@ OAuth2 ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ піЮ час ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ Â«ĐżĐŸŃ‚ĐŸ `UserInDB(**user_dict)` ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”: -ĐŸĐ”Ń€Đ”ĐŽĐ°Ń‚Đž Đșлючі та Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ Đ· `user_dict` Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ яĐș Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Đž Đșлюч-Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ, Đ”ĐșĐČіĐČĐ°Đ»Đ”ĐœŃ‚ĐœĐŸ ĐŽĐŸ: +*ĐŸĐ”Ń€Đ”ĐŽĐ°Ń‚Đž Đșлючі та Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ Đ· `user_dict` Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ яĐș Đ°Ń€ĐłŃƒĐŒĐ”ĐœŃ‚Đž Đșлюч-Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃ, Đ”ĐșĐČіĐČĐ°Đ»Đ”ĐœŃ‚ĐœĐŸ ĐŽĐŸ:* ```Python UserInDB( @@ -146,7 +146,7 @@ UserInDB( /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа -Đ”Đ»Ń ĐżĐŸĐČĐœŃ–ŃˆĐŸĐłĐŸ ĐżĐŸŃŃĐœĐ”ĐœĐœŃ `**user_dict` ĐżĐ”Ń€Đ”ĐłĐ»ŃĐœŃŒŃ‚Đ” [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–ŃŽ ĐŽĐ»Ń **Đ”ĐŸĐŽĐ°Ń‚ĐșĐŸĐČох ĐŒĐŸĐŽĐ”Đ»Đ”Đč**](../extra-models.md#about-user-in-dict). +Đ”Đ»Ń ĐżĐŸĐČĐœŃ–ŃˆĐŸĐłĐŸ ĐżĐŸŃŃĐœĐ”ĐœĐœŃ `**user_dict` ĐżĐ”Ń€Đ”ĐłĐ»ŃĐœŃŒŃ‚Đ” [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–ŃŽ ĐŽĐ»Ń **Đ”ĐŸĐŽĐ°Ń‚ĐșĐŸĐČох ĐŒĐŸĐŽĐ”Đ»Đ”Đč**](../extra-models.md#about-user-in-model-dump). /// @@ -186,7 +186,7 @@ UserInDB( йДпДр ĐŸĐœĐŸĐČĐžĐŒĐŸ ĐœĐ°ŃˆŃ– Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚Ń–. -Мо Ń…ĐŸŃ‡Đ”ĐŒĐŸ ĐŸŃ‚Ń€ĐžĐŒĐ°Ń‚Đž `current_user` лОшД яĐșŃ‰ĐŸ цДĐč ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČач аĐșтоĐČĐœĐžĐč. +Мо Ń…ĐŸŃ‡Đ”ĐŒĐŸ ĐŸŃ‚Ń€ĐžĐŒĐ°Ń‚Đž `current_user` *лОшД* яĐșŃ‰ĐŸ цДĐč ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČач аĐșтоĐČĐœĐžĐč. ĐąĐŸĐŒŃƒ стĐČĐŸŃ€ĐžĐŒĐŸ ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČу Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ `get_current_active_user`, яĐșа сĐČĐŸŃ”ŃŽ Ń‡Đ”Ń€ĐłĐŸŃŽ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČує яĐș Đ·Đ°Đ»Đ”Đ¶ĐœŃ–ŃŃ‚ŃŒ `get_current_user`. @@ -200,7 +200,7 @@ UserInDB( Đ”ĐŸĐŽĐ°Ń‚ĐșĐŸĐČĐžĐč Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐŸĐș `WWW-Authenticate` Đ·Ń– Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ `Bearer`, яĐșĐžĐč ĐŒĐž тут ĐżĐŸĐČĐ”Ń€Ń‚Đ°Ń”ĐŒĐŸ, таĐșĐŸĐ¶ є Ń‡Đ°ŃŃ‚ĐžĐœĐŸŃŽ спДцОфіĐșації. -БуЮь-яĐșĐžĐč HTTP (ĐżĐŸĐŒĐžĐ»Đșа) Đ·Ń– статус-ĐșĐŸĐŽĐŸĐŒ 401 «UNAUTHORIZED» таĐșĐŸĐ¶ ĐŒĐ°Ń” ĐżĐŸĐČДртатО Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐŸĐș `WWW-Authenticate`. +БуЮь-яĐșĐžĐč HTTP (ĐżĐŸĐŒĐžĐ»Đșа) Đ· ĐșĐŸĐŽĐŸĐŒ статусу 401 «UNAUTHORIZED» таĐșĐŸĐ¶ ĐŒĐ°Ń” ĐżĐŸĐČДртатО Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐŸĐș `WWW-Authenticate`. ĐŁ ĐČОпаЎĐșу Ń‚ĐŸĐșĐ”ĐœŃ–ĐČ ĐœĐŸŃŃ–Ń (ĐœĐ°Ńˆ ĐČĐžĐżĐ°ĐŽĐŸĐș) Đ·ĐœĐ°Ń‡Đ”ĐœĐœŃĐŒ Ń†ŃŒĐŸĐłĐŸ Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșа ĐŒĐ°Ń” Đ±ŃƒŃ‚Đž `Bearer`. diff --git a/docs/uk/docs/tutorial/sql-databases.md b/docs/uk/docs/tutorial/sql-databases.md index 57b67226a..ff294052c 100644 --- a/docs/uk/docs/tutorial/sql-databases.md +++ b/docs/uk/docs/tutorial/sql-databases.md @@ -1,6 +1,6 @@ # SQL (Ń€Đ”Đ»ŃŃ†Ń–ĐčĐœŃ–) базО ĐŽĐ°ĐœĐžŃ… { #sql-relational-databases } -**FastAPI** ĐœĐ” ĐČĐžĐŒĐ°ĐłĐ°Ń” ĐČіЮ ĐČас ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато SQL (Ń€Đ”Đ»ŃŃ†Ń–ĐčĐœŃƒ) базу ĐŽĐ°ĐœĐžŃ…. АлД ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” сĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚ĐžŃŃ Đ±ŃƒĐŽŃŒ-яĐșĐŸŃŽ Đ±Đ°Đ·ĐŸŃŽ ĐŽĐ°ĐœĐžŃ…, яĐșу забажаєтД. +**FastAPI** ĐœĐ” ĐČĐžĐŒĐ°ĐłĐ°Ń” ĐČіЮ ĐČас ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато SQL (Ń€Đ”Đ»ŃŃ†Ń–ĐčĐœŃƒ) базу ĐŽĐ°ĐœĐžŃ…. АлД ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” сĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚ĐžŃŃ **Đ±ŃƒĐŽŃŒ-яĐșĐŸŃŽ Đ±Đ°Đ·ĐŸŃŽ ĐŽĐ°ĐœĐžŃ…**, яĐșу забажаєтД. бут ĐŒĐž Ń€ĐŸĐ·ĐłĐ»ŃĐœĐ”ĐŒĐŸ проĐșлаЎ Đ· [SQLModel](https://sqlmodel.tiangolo.com/). @@ -8,7 +8,7 @@ /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Đ±ŃƒĐŽŃŒ-яĐșу Ń–ĐœŃˆŃƒ Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșу ĐŽĐ»Ń SQL Đ°Đ±ĐŸ NoSQL баз (Ń–ĐœĐșĐŸĐ»Đž їх ĐœĐ°Đ·ĐžĐČають "ORMs"), FastAPI ĐœŃ–Ń‡ĐŸĐłĐŸ ĐœĐ” ĐœĐ°ĐČâ€™ŃĐ·ŃƒŃ”. 😎 +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Đ±ŃƒĐŽŃŒ-яĐșу Ń–ĐœŃˆŃƒ Đ±Ń–Đ±Đ»Ń–ĐŸŃ‚Đ”Đșу ĐŽĐ»Ń SQL Đ°Đ±ĐŸ NoSQL баз (Ń–ĐœĐșĐŸĐ»Đž їх ĐœĐ°Đ·ĐžĐČають «ORMs»), FastAPI ĐœŃ–Ń‡ĐŸĐłĐŸ ĐœĐ” ĐœĐ°ĐČâ€™ŃĐ·ŃƒŃ”. 😎 /// @@ -65,7 +65,7 @@ $ pip install sqlmodel * `Field(primary_key=True)` ĐșажД SQLModel, Ń‰ĐŸ `id` - цД **пДрĐČĐžĐœĐœĐžĐč Đșлюч** у SQL базі ĐŽĐ°ĐœĐžŃ… (Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ пДрĐČĐžĐœĐœŃ– Đșлючі ĐČ SQL ĐŽĐžĐČ. у ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— SQLModel). - ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа: Мо ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”ĐŒĐŸ `int | None` ĐŽĐ»Ń ĐżĐŸĐ»Ń пДрĐČĐžĐœĐœĐŸĐłĐŸ Đșлюча, Ń‰ĐŸĐ± у Python-ĐșĐŸĐŽŃ– ĐŒĐŸĐ¶ĐœĐ° Đ±ŃƒĐ»ĐŸ стĐČĐŸŃ€ĐžŃ‚Đž ĐŸĐ±â€™Ń”Đșт бДз `id` (`id=None`), пропусĐșаючо, Ń‰ĐŸ база ĐŽĐ°ĐœĐžŃ… Đ·ĐłĐ”ĐœĐ”Ń€ŃƒŃ” ĐčĐŸĐłĐŸ піЮ час Đ·Đ±Đ”Ń€Đ”Đ¶Đ”ĐœĐœŃ. SQLModel Ń€ĐŸĐ·ŃƒĐŒŃ–Ń”, Ń‰ĐŸ `id` ĐœĐ°ĐŽĐ°ŃŃ‚ŃŒ база ĐŽĐ°ĐœĐžŃ…, і ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń” ŃŃ‚ĐŸĐČĐżĐ”Ń†ŃŒ яĐș ĐœĐ”ĐœŃƒĐ»ŃŒĐŸĐČĐžĐč `INTEGER` у ŃŃ…Đ”ĐŒŃ– базО ĐŽĐ°ĐœĐžŃ…. Đ”ĐŸĐșĐ»Đ°ĐŽĐœŃ–ŃˆĐ” ĐŽĐžĐČ. [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–ŃŽ SQLModel ĐżŃ€ĐŸ пДрĐČĐžĐœĐœŃ– Đșлючі](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id). + **ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа:** Мо ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”ĐŒĐŸ `int | None` ĐŽĐ»Ń ĐżĐŸĐ»Ń пДрĐČĐžĐœĐœĐŸĐłĐŸ Đșлюча, Ń‰ĐŸĐ± у Python-ĐșĐŸĐŽŃ– ĐŒĐŸĐ¶ĐœĐ° Đ±ŃƒĐ»ĐŸ стĐČĐŸŃ€ĐžŃ‚Đž ĐŸĐ±â€™Ń”Đșт бДз `id` (`id=None`), пропусĐșаючо, Ń‰ĐŸ база ĐŽĐ°ĐœĐžŃ… Đ·ĐłĐ”ĐœĐ”Ń€ŃƒŃ” ĐčĐŸĐłĐŸ піЮ час Đ·Đ±Đ”Ń€Đ”Đ¶Đ”ĐœĐœŃ. SQLModel Ń€ĐŸĐ·ŃƒĐŒŃ–Ń”, Ń‰ĐŸ `id` ĐœĐ°ĐŽĐ°ŃŃ‚ŃŒ база ĐŽĐ°ĐœĐžŃ…, і ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń” ŃŃ‚ĐŸĐČĐżĐ”Ń†ŃŒ яĐș ĐœĐ”ĐœŃƒĐ»ŃŒĐŸĐČĐžĐč `INTEGER` у ŃŃ…Đ”ĐŒŃ– базО ĐŽĐ°ĐœĐžŃ…. Đ”ĐŸĐșĐ»Đ°ĐŽĐœŃ–ŃˆĐ” ĐŽĐžĐČ. [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–ŃŽ SQLModel ĐżŃ€ĐŸ пДрĐČĐžĐœĐœŃ– Đșлючі](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id). * `Field(index=True)` ĐșажД SQLModel стĐČĐŸŃ€ĐžŃ‚Đž **SQL-Ń–ĐœĐŽĐ”Đșс** ĐŽĐ»Ń Ń†ŃŒĐŸĐłĐŸ ŃŃ‚ĐŸĐČпця, Ń‰ĐŸ ĐŽĐŸĐ·ĐČĐŸĐ»ĐžŃ‚ŃŒ шĐČОЎшД ĐČĐžĐșĐŸĐœŃƒĐČато ĐżĐŸŃˆŃƒĐș у базі ĐŽĐ°ĐœĐžŃ… піЮ час Ń‡ĐžŃ‚Đ°ĐœĐœŃ ĐŽĐ°ĐœĐžŃ…, ĐČŃ–ĐŽŃ„Ń–Đ»ŃŒŃ‚Ń€ĐŸĐČĐ°ĐœĐžŃ… за Ń†ĐžĐŒ ŃŃ‚ĐŸĐČĐżŃ†Đ”ĐŒ. diff --git a/docs/uk/docs/tutorial/static-files.md b/docs/uk/docs/tutorial/static-files.md index 2141744c3..26c3c592a 100644 --- a/docs/uk/docs/tutorial/static-files.md +++ b/docs/uk/docs/tutorial/static-files.md @@ -2,10 +2,18 @@ Во ĐŒĐŸĐ¶Đ”Ń‚Đ” аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡ĐœĐŸ ĐœĐ°ĐŽĐ°ĐČато ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ– фаĐčлО Đ· ĐșĐ°Ń‚Đ°Đ»ĐŸĐłŃƒ, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо `StaticFiles`. +/// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° + +ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ Ń€ĐŸĐ·ĐŒŃ–ŃŃ‚ĐžŃ‚Đž Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽ, ĐœĐ°Ń‚ĐŸĐŒŃ–ŃŃ‚ŃŒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД `app.frontend()`, ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°ĐčтД ĐżŃ€ĐŸ цД у [Frontend](frontend.md). + +`app.frontend()` ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČує `StaticFiles` ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ–, Đ· ĐșŃ–Đ»ŃŒĐșĐŸĐŒĐ° ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČĐžĐŒĐž пДрДĐČĐ°ĐłĐ°ĐŒĐž ĐŽĐ»Ń Ń„Ń€ĐŸĐœŃ‚Đ”ĐœĐŽŃ–ĐČ, яĐș-ĐŸŃ‚ ĐŸĐ±Ń€ĐŸĐ±Đșа ĐșĐ»Ń–Ń”ĐœŃ‚ŃŃŒĐșĐŸŃ— ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚ĐžĐ·Đ°Ń†Ń–Ń—. + +/// + ## ВоĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ `StaticFiles` { #use-staticfiles } * Đ†ĐŒĐżĐŸŃ€Ń‚ŃƒĐčтД `StaticFiles`. -* Â«ĐŸŃ–ĐŽ'Ń”ĐŽĐœĐ°Ń‚ĐžÂ» Đ”ĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€ `StaticFiles()` Đ· ĐČĐșĐ°Đ·Đ°ĐœĐœŃĐŒ ĐœĐ”ĐŸĐ±Ń…Ń–ĐŽĐœĐŸĐłĐŸ ŃˆĐ»ŃŃ…Ńƒ. +* Â«Đ—ĐŒĐŸĐœŃ‚ŃƒĐčтД» Đ”ĐșĐ·Đ”ĐŒĐżĐ»ŃŃ€ `StaticFiles()` у пДĐČĐœĐŸĐŒŃƒ ŃˆĐ»ŃŃ…Ńƒ. {* ../../docs_src/static_files/tutorial001_py310.py hl[2,6] *} @@ -17,24 +25,24 @@ /// -### Đ©ĐŸ таĐșĐ” Â«ĐŸŃ–ĐŽ'Ń”ĐŽĐœĐ°ĐœĐœŃÂ» { #what-is-mounting } +### Đ©ĐŸ таĐșĐ” Â«ĐœĐŸĐœŃ‚ŃƒĐČĐ°ĐœĐœŃÂ» { #what-is-mounting } -Â«ĐŸŃ–ĐŽ'Ń”ĐŽĐœĐ°ĐœĐœŃÂ» ĐŸĐ·ĐœĐ°Ń‡Đ°Ń” ĐŽĐŸĐŽĐ°ĐČĐ°ĐœĐœŃ ĐżĐŸĐČĐœĐŸŃ†Ń–ĐœĐœĐŸĐłĐŸ Â«ĐœĐ”Đ·Đ°Đ»Đ”Đ¶ĐœĐŸĐłĐŸÂ» Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу за пДĐČĐœĐžĐŒ ŃˆĐ»ŃŃ…ĐŸĐŒ, яĐșĐžĐč ĐżĐŸŃ‚Ń–ĐŒ ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ” ĐČсі піЮ ŃˆĐ»ŃŃ…Đž. +Â«ĐœĐŸĐœŃ‚ŃƒĐČĐ°ĐœĐœŃÂ» ĐŸĐ·ĐœĐ°Ń‡Đ°Ń” ĐŽĐŸĐŽĐ°ĐČĐ°ĐœĐœŃ ĐżĐŸĐČĐœĐŸŃ†Ń–ĐœĐœĐŸĐłĐŸ Â«ĐœĐ”Đ·Đ°Đ»Đ”Đ¶ĐœĐŸĐłĐŸÂ» Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу за пДĐČĐœĐžĐŒ ŃˆĐ»ŃŃ…ĐŸĐŒ, яĐșĐžĐč ĐżĐŸŃ‚Ń–ĐŒ ĐČŃ–ĐŽĐżĐŸĐČіЮає за ĐŸĐ±Ń€ĐŸĐ±Đșу ĐČсіх ĐżŃ–ĐŽŃˆĐ»ŃŃ…Ń–ĐČ. -ĐŠĐ” ĐČŃ–ĐŽŃ€Ń–Đ·ĐœŃŃ”Ń‚ŃŒŃŃ ĐČіЮ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ `APIRouter`, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž піЮ'Ń”ĐŽĐœĐ°ĐœĐžĐč Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș є ĐżĐŸĐČĐœŃ–ŃŃ‚ŃŽ ĐœĐ”Đ·Đ°Đ»Đ”Đ¶ĐœĐžĐŒ. OpenAPI та ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń ĐČĐ°ŃˆĐŸĐłĐŸ ĐŸŃĐœĐŸĐČĐœĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу ĐœĐ” Đ±ŃƒĐŽŃƒŃ‚ŃŒ Đ·ĐœĐ°Ń‚Đž ĐœŃ–Ń‡ĐŸĐłĐŸ ĐżŃ€ĐŸ ĐČаш піЮ'Ń”ĐŽĐœĐ°ĐœĐžĐč Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș Ń‚ĐŸŃ‰ĐŸ. +ĐŠĐ” ĐČŃ–ĐŽŃ€Ń–Đ·ĐœŃŃ”Ń‚ŃŒŃŃ ĐČіЮ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ `APIRouter`, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž Đ·ĐŒĐŸĐœŃ‚ĐŸĐČĐ°ĐœĐžĐč Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș є ĐżĐŸĐČĐœŃ–ŃŃ‚ŃŽ ĐœĐ”Đ·Đ°Đ»Đ”Đ¶ĐœĐžĐŒ. OpenAPI та ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń ĐČĐ°ŃˆĐŸĐłĐŸ ĐŸŃĐœĐŸĐČĐœĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу ĐœĐ” ĐČĐșĐ»ŃŽŃ‡Đ°Ń‚ĐžĐŒŃƒŃ‚ŃŒ ĐœŃ–Ń‡ĐŸĐłĐŸ Đ·Ń– Đ·ĐŒĐŸĐœŃ‚ĐŸĐČĐ°ĐœĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу Ń‚ĐŸŃ‰ĐŸ. -Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽŃ–Đ·ĐœĐ°Ń‚ĐžŃŃ Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ цД ĐČ [ĐŸĐŸŃŃ–Đ±ĐœĐžĐșу ĐŽĐ»Ń ĐżŃ€ĐŸŃŃƒĐœŃƒŃ‚ĐžŃ… ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČачіĐČ](../advanced/index.md). +Во ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐŽŃ–Đ·ĐœĐ°Ń‚ĐžŃŃ Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ цД ĐČ [ĐŸŃ€ĐŸŃŃƒĐœŃƒŃ‚ĐŸĐŒŃƒ ĐżĐŸŃŃ–Đ±ĐœĐžĐșу ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČача](../advanced/index.md). ## ДДталі { #details } -ĐŸĐ”Ń€ŃˆĐ” `"/static"` ĐČĐșĐ°Đ·ŃƒŃ” ĐœĐ° піЮ ŃˆĐ»ŃŃ…, за яĐșĐžĐŒ буЎД «піЎ'Ń”ĐŽĐœĐ°ĐœĐŸÂ» цДĐč ĐœĐŸĐČĐžĐč Â«ĐżŃ–ĐŽĐ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș». ĐąĐŸĐŒŃƒ Đ±ŃƒĐŽŃŒ-яĐșĐžĐč ŃˆĐ»ŃŃ…, яĐșĐžĐč ĐżĐŸŃ‡ĐžĐœĐ°Ń”Ń‚ŃŒŃŃ Đ· `"/static"`, буЎД ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ‚ĐžŃŃ ĐœĐžĐŒ. +ĐŸĐ”Ń€ŃˆĐ” `"/static"` ŃŃ‚ĐŸŃŃƒŃ”Ń‚ŃŒŃŃ ĐżŃ–ĐŽŃˆĐ»ŃŃ…Ńƒ, ĐœĐ° яĐșĐŸĐŒŃƒ буЎД Â«Đ·ĐŒĐŸĐœŃ‚ĐŸĐČĐ°ĐœĐŸÂ» цДĐč Â«ĐżŃ–ĐŽĐ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș». ĐąĐŸĐŒŃƒ Đ±ŃƒĐŽŃŒ-яĐșĐžĐč ŃˆĐ»ŃŃ…, яĐșĐžĐč ĐżĐŸŃ‡ĐžĐœĐ°Ń”Ń‚ŃŒŃŃ Đ· `"/static"`, буЎД ĐŸĐ±Ń€ĐŸĐ±Đ»ŃŃ‚ĐžŃŃ ĐœĐžĐŒ. `directory="static"` ĐČĐžĐ·ĐœĐ°Ń‡Đ°Ń” ĐœĐ°Đ·ĐČу ĐșĐ°Ń‚Đ°Đ»ĐŸĐłŃƒ, Ń‰ĐŸ ĐŒŃ–ŃŃ‚ĐžŃ‚ŃŒ ĐČаші ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ– фаĐčлО. -`name="static"` цД Ń–ĐŒ'я, яĐșĐ” ĐŒĐŸĐ¶ĐœĐ° ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– **FastAPI**. +`name="static"` ĐœĐ°ĐŽĐ°Ń” ĐčĐŸĐŒŃƒ Ń–ĐŒ'я, яĐșĐ” ĐŒĐŸĐ¶ĐœĐ° ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐČŃĐ”Ń€Đ”ĐŽĐžĐœŃ– **FastAPI**. Усі ці ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đž ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ Đ±ŃƒŃ‚Đž Ń–ĐœŃˆĐžĐŒĐž за "`static`", ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐčтД їх ĐČŃ–ĐŽĐżĐŸĐČŃ–ĐŽĐœĐŸ ĐŽĐŸ ĐżĐŸŃ‚Ń€Đ”Đ± і ĐŸŃĐŸĐ±Đ»ĐžĐČĐŸŃŃ‚Đ”Đč ĐČĐ°ŃˆĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу. ## Đ”ĐŸĐŽĐ°Ń‚ĐșĐŸĐČа Ń–ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–Ń { #more-info } -Đ”Đ”Ń‚Đ°Đ»ŃŒĐœŃ–ŃˆĐ” ĐżŃ€ĐŸ ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČĐ°ĐœĐœŃ та ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Ń– ĐŒĐŸĐ¶ĐœĐ° ĐŽŃ–Đ·ĐœĐ°Ń‚ĐžŃŃ ĐČ [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— Starlette ĐżŃ€ĐŸ ŃŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ– фаĐčлО](https://www.starlette.dev/staticfiles/). +Đ”Đ»Ń ĐŸŃ‚Ń€ĐžĐŒĐ°ĐœĐœŃ ĐŽĐŸĐŽĐ°Ń‚ĐșĐŸĐČĐŸŃ— Ń–ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–Ń— та ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń–ĐČ ĐżĐ”Ń€Đ”ĐČіртД [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–ŃŽ Starlette ĐżŃ€ĐŸ Static Files](https://www.starlette.dev/staticfiles/). diff --git a/docs/uk/docs/tutorial/testing.md b/docs/uk/docs/tutorial/testing.md index 059e5cec0..393855a0c 100644 --- a/docs/uk/docs/tutorial/testing.md +++ b/docs/uk/docs/tutorial/testing.md @@ -52,7 +52,7 @@ $ pip install httpx /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -ĐŻĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐČĐžĐșлОĐșато `async`-Ń„ŃƒĐœĐșції у ĐČашох тДстах, ĐŸĐșŃ€Ń–ĐŒ ĐČіЮпраĐČĐ»Đ”ĐœĐœŃ запОтіĐČ ĐŽĐŸ ĐČĐ°ŃˆĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу FastAPI (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœŃ– Ń„ŃƒĐœĐșції Ń€ĐŸĐ±ĐŸŃ‚Đž Đ· Đ±Đ°Đ·ĐŸŃŽ ĐŽĐ°ĐœĐžŃ…), ĐżĐ”Ń€Đ”ĐłĐ»ŃĐœŃŒŃ‚Đ” [Async Tests](../advanced/async-tests.md) у Ń€ĐŸĐ·ŃˆĐžŃ€Đ”ĐœĐŸĐŒŃƒ ĐșДріĐČĐœĐžŃ†Ń‚ĐČі. +ĐŻĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐČĐžĐșлОĐșато `async`-Ń„ŃƒĐœĐșції у ĐČашох тДстах, ĐŸĐșŃ€Ń–ĐŒ ĐČіЮпраĐČĐ»Đ”ĐœĐœŃ запОтіĐČ ĐŽĐŸ ĐČĐ°ŃˆĐŸĐłĐŸ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу FastAPI (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Đ°ŃĐžĐœŃ…Ń€ĐŸĐœĐœŃ– Ń„ŃƒĐœĐșції Ń€ĐŸĐ±ĐŸŃ‚Đž Đ· Đ±Đ°Đ·ĐŸŃŽ ĐŽĐ°ĐœĐžŃ…), ĐżĐ”Ń€Đ”ĐłĐ»ŃĐœŃŒŃ‚Đ” [ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœŃ– тДстО](../advanced/async-tests.md) у ĐżŃ€ĐŸŃŃƒĐœŃƒŃ‚ĐŸĐŒŃƒ ĐœĐ°ĐČŃ‡Đ°Đ»ŃŒĐœĐŸĐŒŃƒ ĐżĐŸŃŃ–Đ±ĐœĐžĐșу. /// @@ -64,7 +64,7 @@ $ pip install httpx ### ЀаĐčĐ» Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșу **FastAPI** { #fastapi-app-file } -ĐŸŃ€ĐžĐżŃƒŃŃ‚ĐžĐŒĐŸ, у ĐČас є струĐșтура фаĐčліĐČ, ĐŸĐżĐžŃĐ°ĐœĐ° ĐČ Ń€ĐŸĐ·ĐŽŃ–Đ»Ń– [Bigger Applications](bigger-applications.md): +ĐŸŃ€ĐžĐżŃƒŃŃ‚ĐžĐŒĐŸ, у ĐČас є струĐșтура фаĐčліĐČ, ĐŸĐżĐžŃĐ°ĐœĐ° ĐČ Ń€ĐŸĐ·ĐŽŃ–Đ»Ń– [Đ‘Ń–Đ»ŃŒŃˆŃ– Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐșĐž](bigger-applications.md): ``` . @@ -130,17 +130,17 @@ $ pip install httpx {* ../../docs_src/app_testing/app_b_an_py310/test_main.py *} -ĐšĐŸĐ»Đž ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ пДрДЎатО ĐșĐ»Ń–Ń”ĐœŃ‚Ńƒ Ń–ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–ŃŽ ĐČ Đ·Đ°ĐżĐžŃ‚Ń–, алД ĐČĐž ĐœĐ” Đ·ĐœĐ°Ń”Ń‚Đ”, яĐș цД Đ·Ń€ĐŸĐ±ĐžŃ‚Đž, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸŃˆŃƒĐșато (Google), яĐș цД Đ·Ń€ĐŸĐ±ĐžŃ‚Đž ĐČ `httpx`, Đ°Đ±ĐŸ ĐœĐ°ĐČіть яĐș цД Đ·Ń€ĐŸĐ±ĐžŃ‚Đž Đ· `requests`, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ЎОзаĐčĐœ HTTPX Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° ЎОзаĐčĐœŃ– Requests. +ĐšĐŸĐ»Đž ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ, Ń‰ĐŸĐ± ĐșĐ»Ń–Ń”ĐœŃ‚ пДрДЎаĐČ Ń–ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†Ń–ŃŽ ĐČ Đ·Đ°ĐżĐžŃ‚Ń–, алД ĐČĐž ĐœĐ” Đ·ĐœĐ°Ń”Ń‚Đ”, яĐș цД Đ·Ń€ĐŸĐ±ĐžŃ‚Đž, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐżĐŸŃˆŃƒĐșато (Google), яĐș цД Đ·Ń€ĐŸĐ±ĐžŃ‚Đž ĐČ `httpx`, Đ°Đ±ĐŸ ĐœĐ°ĐČіть яĐș цД Đ·Ń€ĐŸĐ±ĐžŃ‚Đž Đ· `requests`, ĐŸŃĐșŃ–Đ»ŃŒĐșĐž ЎОзаĐčĐœ HTTPX Đ±Đ°Đ·ŃƒŃ”Ń‚ŃŒŃŃ ĐœĐ° ЎОзаĐčĐœŃ– Requests. Далі ĐČĐž ĐżŃ€ĐŸŃŃ‚ĐŸ ĐżĐŸĐČŃ‚ĐŸŃ€ŃŽŃ”Ń‚Đ” ці ж Юії у ĐČашох тДстах. НапроĐșлаЎ: -* Đ©ĐŸĐ± пДрДЎатО *path* Đ°Đ±ĐŸ *query* ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€, ĐŽĐŸĐŽĐ°ĐčтД ĐčĐŸĐłĐŸ Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐŽĐŸ URL. +* Đ©ĐŸĐ± пДрДЎатО ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ *ŃˆĐ»ŃŃ…Ńƒ* Đ°Đ±ĐŸ *Đ·Đ°ĐżĐžŃ‚Ńƒ*, ĐŽĐŸĐŽĐ°ĐčтД ĐčĐŸĐłĐŸ Đ±Đ”Đ·ĐżĐŸŃĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐŽĐŸ URL. * Đ©ĐŸĐ± пДрДЎатО Ń‚Ń–Đ»ĐŸ JSON, пДрДЎаĐčтД Python-ĐŸĐ±'єĐșт (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, `dict`) у ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `json`. -* ĐŻĐșŃ‰ĐŸ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐœĐ°ĐŽŃ–ŃĐ»Đ°Ń‚Đž *Form Data* Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ JSON, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `data`. -* Đ©ĐŸĐ± пДрДЎатО Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž *headers*, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД `dict` у ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń– `headers`. -* Đ”Đ»Ń *cookies* ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД `dict` у ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń– `cookies`. +* ĐŻĐșŃ‰ĐŸ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐœĐ°ĐŽŃ–ŃĐ»Đ°Ń‚Đž *ĐŽĐ°ĐœŃ– Ń„ĐŸŃ€ĐŒĐž* Đ·Đ°ĐŒŃ–ŃŃ‚ŃŒ JSON, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€ `data`. +* Đ©ĐŸĐ± пДрДЎатО *Đ·Đ°ĐłĐŸĐ»ĐŸĐČĐșĐž*, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД `dict` у ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń– `headers`. +* Đ”Đ»Ń *ĐșуĐșі* ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐčтД `dict` у ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń– `cookies`. Đ”ĐŸĐșĐ»Đ°ĐŽĐœŃ–ŃˆĐ” ĐżŃ€ĐŸ ĐżĐ”Ń€Đ”ĐŽĐ°Ń‡Ńƒ ĐŽĐ°ĐœĐžŃ… у бДĐșĐ”ĐœĐŽ (за ĐŽĐŸĐżĐŸĐŒĐŸĐłĐŸŃŽ `httpx` Đ°Đ±ĐŸ `TestClient`) ĐŒĐŸĐ¶ĐœĐ° Đ·ĐœĐ°Đčто ĐČ [ĐŽĐŸĐșŃƒĐŒĐ”ĐœŃ‚Đ°Ń†Ń–Ń— HTTPX](https://www.python-httpx.org). @@ -148,7 +148,7 @@ $ pip install httpx ЗĐČĐ”Ń€ĐœŃ–Ń‚ŃŒ уĐČагу, Ń‰ĐŸ `TestClient` ĐŸŃ‚Ń€ĐžĐŒŃƒŃ” ĐŽĐ°ĐœŃ–, яĐșі ĐŒĐŸĐ¶ĐœĐ° ĐșĐŸĐœĐČĐ”Ń€Ń‚ŃƒĐČато ĐČ JSON, а ĐœĐ” Pydantic-ĐŒĐŸĐŽĐ”Đ»Ń–. -ĐŻĐșŃ‰ĐŸ у ĐČас є Pydantic-ĐŒĐŸĐŽĐ”Đ»ŃŒ у тДсті, і ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” пДрДЎатО її ĐŽĐ°ĐœŃ– ĐČ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș піЮ час Ń‚Đ”ŃŃ‚ŃƒĐČĐ°ĐœĐœŃ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž `jsonable_encoder`, ĐŸĐżĐžŃĐ°ĐœĐžĐč у Ń€ĐŸĐ·ĐŽŃ–Đ»Ń– [JSON Compatible Encoder](encoder.md). +ĐŻĐșŃ‰ĐŸ у ĐČас є Pydantic-ĐŒĐŸĐŽĐ”Đ»ŃŒ у тДсті, і ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” пДрДЎатО її ĐŽĐ°ĐœŃ– ĐČ Đ·Đ°ŃŃ‚ĐŸŃŃƒĐœĐŸĐș піЮ час Ń‚Đ”ŃŃ‚ŃƒĐČĐ°ĐœĐœŃ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°Ń‚Đž `jsonable_encoder`, ĐŸĐżĐžŃĐ°ĐœĐžĐč у Ń€ĐŸĐ·ĐŽŃ–Đ»Ń– [JSON-ŃŃƒĐŒŃ–ŃĐœĐžĐč ĐșĐŸĐŽŃƒĐČĐ°Đ»ŃŒĐœĐžĐș](encoder.md). /// diff --git a/docs/uk/docs/virtual-environments.md b/docs/uk/docs/virtual-environments.md index 26ad6b0cb..57f3e90df 100644 --- a/docs/uk/docs/virtual-environments.md +++ b/docs/uk/docs/virtual-environments.md @@ -1,6 +1,6 @@ # Đ’Ń–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœŃ– ŃĐ”Ń€Đ”ĐŽĐŸĐČоща { #virtual-environments } -ĐšĐŸĐ»Đž ĐČĐž працюєтД ĐœĐ°ĐŽ ĐżŃ€ĐŸŃ”ĐșŃ‚Đ°ĐŒĐž Python, ĐČĐ°ĐŒ, Ń–ĐŒĐŸĐČŃ–Ń€ĐœĐŸ, сліЎ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД (Đ°Đ±ĐŸ ŃŃ…ĐŸĐ¶ĐžĐč ĐŒĐ”Ń…Đ°ĐœŃ–Đ·ĐŒ), Ń‰ĐŸĐ± Ń–Đ·ĐŸĐ»ŃŽĐČато паĐșДтО, яĐșі ĐČĐž ĐČŃŃ‚Đ°ĐœĐŸĐČлюєтД ĐŽĐ»Ń ĐșĐŸĐ¶ĐœĐŸĐłĐŸ ĐżŃ€ĐŸŃ”Đșту. +ĐšĐŸĐ»Đž ĐČĐž працюєтД ĐœĐ°ĐŽ ĐżŃ€ĐŸŃ”ĐșŃ‚Đ°ĐŒĐž Python, ĐČĐ°ĐŒ, Ń–ĐŒĐŸĐČŃ–Ń€ĐœĐŸ, сліЎ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато **ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД** (Đ°Đ±ĐŸ ŃŃ…ĐŸĐ¶ĐžĐč ĐŒĐ”Ń…Đ°ĐœŃ–Đ·ĐŒ), Ń‰ĐŸĐ± Ń–Đ·ĐŸĐ»ŃŽĐČато паĐșДтО, яĐșі ĐČĐž ĐČŃŃ‚Đ°ĐœĐŸĐČлюєтД ĐŽĐ»Ń ĐșĐŸĐ¶ĐœĐŸĐłĐŸ ĐżŃ€ĐŸŃ”Đșту. /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа @@ -10,19 +10,19 @@ /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -Đ’Ń–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД ĐČŃ–ĐŽŃ€Ń–Đ·ĐœŃŃ”Ń‚ŃŒŃŃ ĐČіЮ Đ·ĐŒŃ–ĐœĐœĐŸŃ— ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ. +**Đ’Ń–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД** ĐČŃ–ĐŽŃ€Ń–Đ·ĐœŃŃ”Ń‚ŃŒŃŃ ĐČіЮ **Đ·ĐŒŃ–ĐœĐœĐŸŃ— ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ**. -Đ—ĐŒŃ–ĐœĐœĐ° ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ - цД Đ·ĐŒŃ–ĐœĐœĐ° ĐČ ŃĐžŃŃ‚Đ”ĐŒŃ–, яĐșу ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž. +**Đ—ĐŒŃ–ĐœĐœĐ° ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ** - цД Đ·ĐŒŃ–ĐœĐœĐ° ĐČ ŃĐžŃŃ‚Đ”ĐŒŃ–, яĐșу ĐŒĐŸĐ¶ŃƒŃ‚ŃŒ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž. -Đ’Ń–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД - цД ĐșĐ°Ń‚Đ°Đ»ĐŸĐł Ń–Đ· фаĐčĐ»Đ°ĐŒĐž ĐČ ĐœŃŒĐŸĐŒŃƒ. +**Đ’Ń–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД** - цД ĐșĐ°Ń‚Đ°Đ»ĐŸĐł Ń–Đ· фаĐčĐ»Đ°ĐŒĐž ĐČ ĐœŃŒĐŸĐŒŃƒ. /// /// note | ĐŸŃ€ĐžĐŒŃ–Ń‚Đșа -На ціĐč ŃŃ‚ĐŸŃ€Ń–ĐœŃ†Ń– ĐČĐž ĐŽŃ–Đ·ĐœĐ°Ń”Ń‚Đ”ŃŃ, яĐș ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœŃ– ŃĐ”Ń€Đ”ĐŽĐŸĐČоща і яĐș ĐČĐŸĐœĐž працюють. +На ціĐč ŃŃ‚ĐŸŃ€Ń–ĐœŃ†Ń– ĐČĐž ĐŽŃ–Đ·ĐœĐ°Ń”Ń‚Đ”ŃŃ, яĐș ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато **ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœŃ– ŃĐ”Ń€Đ”ĐŽĐŸĐČоща** і яĐș ĐČĐŸĐœĐž працюють. -ĐŻĐșŃ‰ĐŸ ĐČĐž ĐłĐŸŃ‚ĐŸĐČі проĐčĐœŃŃ‚Đž Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚, Ń‰ĐŸ ĐșĐ”Ń€ŃƒŃ” ĐČŃŃ–ĐŒ за ĐČас (ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ· ŃƒŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃĐŒ Python), ŃĐżŃ€ĐŸĐ±ŃƒĐčтД [uv](https://github.com/astral-sh/uv). +ĐŻĐșŃ‰ĐŸ ĐČĐž ĐłĐŸŃ‚ĐŸĐČі проĐčĐœŃŃ‚Đž **Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚, Ń‰ĐŸ ĐșĐ”Ń€ŃƒŃ” ĐČŃŃ–ĐŒ** за ĐČас (ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ· ŃƒŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃĐŒ Python), ŃĐżŃ€ĐŸĐ±ŃƒĐčтД [uv](https://github.com/astral-sh/uv). /// @@ -53,11 +53,11 @@ $ cd awesome-project ## СтĐČĐŸŃ€Ń–Ń‚ŃŒ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД { #create-a-virtual-environment } -ĐšĐŸĐ»Đž ĐČĐž ĐżĐŸŃ‡ĐžĐœĐ°Ń”Ń‚Đ” працюĐČато ĐœĐ°ĐŽ ĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐŒ Python ŃƒĐżĐ”Ń€ŃˆĐ”, стĐČĐŸŃ€Ń–Ń‚ŃŒ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД у ĐČĐ°ŃˆĐŸĐŒŃƒ ĐżŃ€ĐŸŃ”Đșті **у ĐČĐ°ŃˆĐŸĐŒŃƒ ĐżŃ€ĐŸŃ”Đșті**. +ĐšĐŸĐ»Đž ĐČĐž ĐżĐŸŃ‡ĐžĐœĐ°Ń”Ń‚Đ” працюĐČато ĐœĐ°ĐŽ ĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐŒ Python **ŃƒĐżĐ”Ń€ŃˆĐ”**, стĐČĐŸŃ€Ń–Ń‚ŃŒ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД **у ĐČĐ°ŃˆĐŸĐŒŃƒ ĐżŃ€ĐŸŃ”Đșті**. /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -ĐŠĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ Ń€ĐŸĐ±ĐžŃ‚Đž лОшД ĐŸĐŽĐžĐœ раз ĐœĐ° ĐżŃ€ĐŸŃ”Đșт, ĐœĐ” Ń‰ĐŸŃ€Đ°Đ·Ńƒ, ĐșĐŸĐ»Đž ĐČĐž працюєтД. +ĐŠĐ” ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ Ń€ĐŸĐ±ĐžŃ‚Đž лОшД **ĐŸĐŽĐžĐœ раз ĐœĐ° ĐżŃ€ĐŸŃ”Đșт**, ĐœĐ” Ń‰ĐŸŃ€Đ°Đ·Ńƒ, ĐșĐŸĐ»Đž ĐČĐž працюєтД. /// @@ -120,7 +120,7 @@ $ uv venv /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -Đ ĐŸĐ±Ń–Ń‚ŃŒ цД Ń‰ĐŸŃ€Đ°Đ·Ńƒ, ĐșĐŸĐ»Đž ĐČĐž ĐżĐŸŃ‡ĐžĐœĐ°Ń”Ń‚Đ” ĐœĐŸĐČу сДсію Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Đ»Đ° ĐŽĐ»Ń Ń€ĐŸĐ±ĐŸŃ‚Đž ĐœĐ°ĐŽ ĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐŒ. +Đ ĐŸĐ±Ń–Ń‚ŃŒ цД **Ń‰ĐŸŃ€Đ°Đ·Ńƒ**, ĐșĐŸĐ»Đž ĐČĐž ĐżĐŸŃ‡ĐžĐœĐ°Ń”Ń‚Đ” **ĐœĐŸĐČу сДсію Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Đ»Đ°** ĐŽĐ»Ń Ń€ĐŸĐ±ĐŸŃ‚Đž ĐœĐ°ĐŽ ĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐŒ. /// @@ -164,9 +164,9 @@ $ source .venv/Scripts/activate /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -ĐšĐŸĐ¶ĐœĐŸĐłĐŸ Ń€Đ°Đ·Ńƒ, ĐșĐŸĐ»Đž ĐČĐž ĐČŃŃ‚Đ°ĐœĐŸĐČлюєтД ĐœĐŸĐČĐžĐč паĐșДт у цД ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД, аĐșтоĐČуĐčтД ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД Đ·ĐœĐŸĐČу. +ĐšĐŸĐ¶ĐœĐŸĐłĐŸ Ń€Đ°Đ·Ńƒ, ĐșĐŸĐ»Đž ĐČĐž ĐČŃŃ‚Đ°ĐœĐŸĐČлюєтД **ĐœĐŸĐČĐžĐč паĐșДт** у цД ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД, **аĐșтоĐČуĐčтД** ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД Đ·ĐœĐŸĐČу. -ĐŠĐ” ĐłĐ°Ń€Đ°ĐœŃ‚ŃƒŃ”, Ń‰ĐŸ яĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Đ»Đ° (CLI), ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœŃƒ Ń†ĐžĐŒ паĐșĐ”Ń‚ĐŸĐŒ, ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ŃĐ°ĐŒĐ” ту Đ· ĐČĐ°ŃˆĐŸĐłĐŸ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща, а ĐœĐ” Đ±ŃƒĐŽŃŒ-яĐșу Ń–ĐœŃˆŃƒ, яĐșа ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐ° ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐŸ, Ń–ĐŒĐŸĐČŃ–Ń€ĐœĐŸ Đ· Ń–ĐœŃˆĐŸŃŽ ĐČДрсією, ĐœŃ–Đ¶ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ. +ĐŠĐ” ĐłĐ°Ń€Đ°ĐœŃ‚ŃƒŃ”, Ń‰ĐŸ яĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” **ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ Ń‚Đ”Ń€ĐŒŃ–ĐœĐ°Đ»Đ° (CLI)**, ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœŃƒ Ń†ĐžĐŒ паĐșĐ”Ń‚ĐŸĐŒ, ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ŃĐ°ĐŒĐ” ту Đ· ĐČĐ°ŃˆĐŸĐłĐŸ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща, а ĐœĐ” Đ±ŃƒĐŽŃŒ-яĐșу Ń–ĐœŃˆŃƒ, яĐșа ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐ° ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐŸ, Ń–ĐŒĐŸĐČŃ–Ń€ĐœĐŸ Đ· Ń–ĐœŃˆĐŸŃŽ ĐČДрсією, ĐœŃ–Đ¶ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ. /// @@ -176,7 +176,7 @@ $ source .venv/Scripts/activate /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -ĐŠĐ” ĐœĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐŸ, алД цД ĐłĐ°Ń€ĐœĐžĐč ŃĐżĐŸŃŃ–Đ± пДрДĐČірото, Ń‰ĐŸ ĐČсД працює яĐș ĐŸŃ‡Ń–Đșується і ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ŃĐ°ĐŒĐ” тД ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД, яĐșĐ” ĐżĐ»Đ°ĐœŃƒĐČалО. +ĐŠĐ” **ĐœĐ”ĐŸĐ±ĐŸĐČ'ŃĐ·ĐșĐŸĐČĐŸ**, алД цД ĐłĐ°Ń€ĐœĐžĐč ŃĐżĐŸŃŃ–Đ± **пДрДĐČірото**, Ń‰ĐŸ ĐČсД працює яĐș ĐŸŃ‡Ń–Đșується і ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ŃĐ°ĐŒĐ” тД ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД, яĐșĐ” ĐżĐ»Đ°ĐœŃƒĐČалО. /// @@ -220,13 +220,13 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python /// -ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” `pip` ĐŽĐ»Ń ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ паĐșДтіĐČ (ĐČŃ–Đœ Ń–ĐŽĐ” за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ Ń–Đ· Python), ĐČĐ°ĐŒ сліЎ ĐŸĐœĐŸĐČото ĐčĐŸĐłĐŸ ĐŽĐŸ ĐœĐ°ĐčĐœĐŸĐČŃ–ŃˆĐŸŃ— ĐČДрсії. +ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” `pip` ĐŽĐ»Ń ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ паĐșДтіĐČ (ĐČŃ–Đœ Ń–ĐŽĐ” за Đ·Đ°ĐŒĐŸĐČчуĐČĐ°ĐœĐœŃĐŒ Ń–Đ· Python), ĐČĐ°ĐŒ сліЎ **ĐŸĐœĐŸĐČото** ĐčĐŸĐłĐŸ ĐŽĐŸ ĐœĐ°ĐčĐœĐŸĐČŃ–ŃˆĐŸŃ— ĐČДрсії. Đ‘Đ°ĐłĐ°Ń‚ĐŸ ĐŽĐžĐČĐœĐžŃ… ĐżĐŸĐŒĐžĐ»ĐŸĐș піЮ час ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ паĐșДта ĐČорішуються Ń‚ĐžĐŒ, Ń‰ĐŸ ŃĐżĐŸŃ‡Đ°Ń‚Đșу ĐŸĐœĐŸĐČĐ»ŃŽŃŽŃ‚ŃŒ `pip`. /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -ЗазĐČочаĐč цД Ń€ĐŸĐ±Đ»ŃŃ‚ŃŒ ĐŸĐŽĐžĐœ раз, ĐČŃ–ĐŽŃ€Đ°Đ·Ńƒ ĐżŃ–ŃĐ»Ń стĐČĐŸŃ€Đ”ĐœĐœŃ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща. +ЗазĐČочаĐč цД Ń€ĐŸĐ±Đ»ŃŃ‚ŃŒ **ĐŸĐŽĐžĐœ раз**, ĐČŃ–ĐŽŃ€Đ°Đ·Ńƒ ĐżŃ–ŃĐ»Ń стĐČĐŸŃ€Đ”ĐœĐœŃ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща. /// @@ -264,7 +264,7 @@ $ python -m ensurepip --upgrade ## Đ”ĐŸĐŽĐ°ĐčтД `.gitignore` { #add-gitignore } -ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” Git (ĐČĐ°Ń€Ń‚ĐŸ цД Ń€ĐŸĐ±ĐžŃ‚Đž), ĐŽĐŸĐŽĐ°ĐčтД фаĐčĐ» `.gitignore`, Ń‰ĐŸĐ± ĐČĐžĐșлючОтО Đ· Git усД у ĐČĐ°ŃˆĐŸĐŒŃƒ `.venv`. +ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” **Git** (ĐČĐ°Ń€Ń‚ĐŸ цД Ń€ĐŸĐ±ĐžŃ‚Đž), ĐŽĐŸĐŽĐ°ĐčтД фаĐčĐ» `.gitignore`, Ń‰ĐŸĐ± ĐČĐžĐșлючОтО Đ· Git усД у ĐČĐ°ŃˆĐŸĐŒŃƒ `.venv`. /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° @@ -274,7 +274,7 @@ $ python -m ensurepip --upgrade /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -Đ—Ń€ĐŸĐ±Ń–Ń‚ŃŒ цД ĐŸĐŽĐžĐœ раз, ĐČŃ–ĐŽŃ€Đ°Đ·Ńƒ ĐżŃ–ŃĐ»Ń стĐČĐŸŃ€Đ”ĐœĐœŃ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща. +Đ—Ń€ĐŸĐ±Ń–Ń‚ŃŒ цД **ĐŸĐŽĐžĐœ раз**, ĐČŃ–ĐŽŃ€Đ°Đ·Ńƒ ĐżŃ–ŃĐ»Ń стĐČĐŸŃ€Đ”ĐœĐœŃ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща. /// @@ -308,9 +308,9 @@ $ echo "*" > .venv/.gitignore /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -Đ ĐŸĐ±Ń–Ń‚ŃŒ цД ĐŸĐŽĐžĐœ раз піЮ час ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ Đ°Đ±ĐŸ ĐŸĐœĐŸĐČĐ»Đ”ĐœĐœŃ паĐșДтіĐČ, ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžŃ… ĐČĐ°ŃˆĐŸĐŒŃƒ ĐżŃ€ĐŸŃ”Đșту. +Đ ĐŸĐ±Ń–Ń‚ŃŒ цД **ĐŸĐŽĐžĐœ раз** піЮ час ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ Đ°Đ±ĐŸ ĐŸĐœĐŸĐČĐ»Đ”ĐœĐœŃ паĐșДтіĐČ, ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžŃ… ĐČĐ°ŃˆĐŸĐŒŃƒ ĐżŃ€ĐŸŃ”Đșту. -ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐŸĐœĐŸĐČото ĐČДрсію Đ°Đ±ĐŸ ĐŽĐŸĐŽĐ°Ń‚Đž ĐœĐŸĐČĐžĐč паĐșДт, ĐČĐž Đ·Ń€ĐŸĐ±ĐžŃ‚Đ” цД Đ·ĐœĐŸĐČу. +ĐŻĐșŃ‰ĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐŸĐœĐŸĐČото ĐČДрсію Đ°Đ±ĐŸ ĐŽĐŸĐŽĐ°Ń‚Đž ĐœĐŸĐČĐžĐč паĐșДт, ĐČĐž **Đ·Ń€ĐŸĐ±ĐžŃ‚Đ” цД Đ·ĐœĐŸĐČу**. /// @@ -421,13 +421,13 @@ Hello World /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -ЗазĐČочаĐč цД ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ Ń€ĐŸĐ±ĐžŃ‚Đž лОшД ĐŸĐŽĐžĐœ раз, ĐșĐŸĐ»Đž ĐČĐž стĐČĐŸŃ€ŃŽŃ”Ń‚Đ” ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД. +ЗазĐČочаĐč цД ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ Ń€ĐŸĐ±ĐžŃ‚Đž лОшД **ĐŸĐŽĐžĐœ раз**, ĐșĐŸĐ»Đž ĐČĐž стĐČĐŸŃ€ŃŽŃ”Ń‚Đ” ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД. /// ## ДДаĐșтоĐČуĐčтД ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД { #deactivate-the-virtual-environment } -ĐšĐŸĐ»Đž ĐČĐž заĐČĐ”Ń€ŃˆĐžĐ»Đž Ń€ĐŸĐ±ĐŸŃ‚Ńƒ ĐœĐ°ĐŽ ĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐŒ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ЎДаĐșтоĐČуĐČато ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД. +ĐšĐŸĐ»Đž ĐČĐž заĐČĐ”Ń€ŃˆĐžĐ»Đž Ń€ĐŸĐ±ĐŸŃ‚Ńƒ ĐœĐ°ĐŽ ĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐŒ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” **ЎДаĐșтоĐČуĐČато** ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД.
@@ -443,6 +443,8 @@ $ deactivate йДпДр ĐČĐž ĐłĐŸŃ‚ĐŸĐČі ĐżĐŸŃ‡Đ°Ń‚Đž працюĐČато ĐœĐ°ĐŽ ĐČĐ°ŃˆĐžĐŒ ĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐŒ. + + /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° Đ„ĐŸŃ‡Đ”Ń‚Đ” Đ·Ń€ĐŸĐ·ŃƒĐŒŃ–Ń‚Đž, Ń‰ĐŸ цД ĐČсД Đ±ŃƒĐ»ĐŸ ĐČОщД? @@ -455,33 +457,33 @@ $ deactivate Đ©ĐŸĐ± працюĐČато Đ· FastAPI, ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐČŃŃ‚Đ°ĐœĐŸĐČото [Python](https://www.python.org/). -ĐŸŃ–ŃĐ»Ń Ń†ŃŒĐŸĐłĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ буЎД ĐČŃŃ‚Đ°ĐœĐŸĐČото FastAPI та Ń–ĐœŃˆŃ– паĐșДтО, яĐșі ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато. +ĐŸŃ–ŃĐ»Ń Ń†ŃŒĐŸĐłĐŸ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ буЎД **ĐČŃŃ‚Đ°ĐœĐŸĐČото** FastAPI та Ń–ĐœŃˆŃ– **паĐșДтО**, яĐșі ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато. Đ”Đ»Ń ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ паĐșДтіĐČ Đ·Đ°Đ·ĐČочаĐč ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують ĐșĐŸĐŒĐ°ĐœĐŽŃƒ `pip`, Ń‰ĐŸ ĐżĐŸŃŃ‚Đ°Ń‡Đ°Ń”Ń‚ŃŒŃŃ Đ· Python (Đ°Đ±ĐŸ ŃŃ…ĐŸĐ¶Ń– Đ°Đ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČĐž). -ĐžĐŽĐœĐ°Đș, яĐșŃ‰ĐŸ ĐČĐž ĐżŃ€ĐŸŃŃ‚ĐŸ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČĐ°Ń‚ĐžĐŒĐ”Ń‚Đ”ŃŃ `pip` ĐœĐ°ĐżŃ€ŃĐŒŃƒ, паĐșДтО ĐČŃŃ‚Đ°ĐœĐŸĐČлюĐČĐ°Ń‚ĐžĐŒŃƒŃ‚ŃŒŃŃ у ĐČашД ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД Python (ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœŃƒ Ń–ĐœŃŃ‚Đ°Đ»ŃŃ†Ń–ŃŽ Python). +ĐžĐŽĐœĐ°Đș, яĐșŃ‰ĐŸ ĐČĐž ĐżŃ€ĐŸŃŃ‚ĐŸ ĐșĐŸŃ€ĐžŃŃ‚ŃƒĐČĐ°Ń‚ĐžĐŒĐ”Ń‚Đ”ŃŃ `pip` ĐœĐ°ĐżŃ€ŃĐŒŃƒ, паĐșДтО ĐČŃŃ‚Đ°ĐœĐŸĐČлюĐČĐ°Ń‚ĐžĐŒŃƒŃ‚ŃŒŃŃ у ĐČашД **ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД Python** (ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœŃƒ Ń–ĐœŃŃ‚Đ°Đ»ŃŃ†Ń–ŃŽ Python). ### ĐŸŃ€ĐŸĐ±Đ»Đ”ĐŒĐ° { #the-problem } ĐąĐŸ ĐČ Ń‡ĐŸĐŒŃƒ ж ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒĐ° ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ паĐșДтіĐČ Ńƒ ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД Python? -З Ń‡Đ°ŃĐŸĐŒ ĐČĐž, ĐČŃ–Ń€ĐŸĐłŃ–ĐŽĐœĐŸ, ĐżĐžŃĐ°Ń‚ĐžĐŒĐ”Ń‚Đ” Đ±Đ°ĐłĐ°Ń‚ĐŸ Ń€Ń–Đ·ĐœĐžŃ… ĐżŃ€ĐŸĐłŃ€Đ°ĐŒ, яĐșі Đ·Đ°Đ»Đ”Đ¶Đ°Ń‚ŃŒ ĐČіЮ Ń€Ń–Đ·ĐœĐžŃ… паĐșДтіĐČ. І ĐŽĐ”ŃĐșі Đ· цох ĐČашох ĐżŃ€ĐŸŃ”ĐșтіĐČ Đ·Đ°Đ»Đ”Đ¶Đ°Ń‚ĐžĐŒŃƒŃ‚ŃŒ ĐČіЮ Ń€Ń–Đ·ĐœĐžŃ… ĐČДрсіĐč ĐŸĐŽĐœĐŸĐłĐŸ Đč Ń‚ĐŸĐłĐŸ ж паĐșДта. đŸ˜± +З Ń‡Đ°ŃĐŸĐŒ ĐČĐž, ĐČŃ–Ń€ĐŸĐłŃ–ĐŽĐœĐŸ, ĐżĐžŃĐ°Ń‚ĐžĐŒĐ”Ń‚Đ” Đ±Đ°ĐłĐ°Ń‚ĐŸ Ń€Ń–Đ·ĐœĐžŃ… ĐżŃ€ĐŸĐłŃ€Đ°ĐŒ, яĐșі Đ·Đ°Đ»Đ”Đ¶Đ°Ń‚ŃŒ ĐČіЮ **Ń€Ń–Đ·ĐœĐžŃ… паĐșДтіĐČ**. І ĐŽĐ”ŃĐșі Đ· цох ĐČашох ĐżŃ€ĐŸŃ”ĐșтіĐČ Đ·Đ°Đ»Đ”Đ¶Đ°Ń‚ĐžĐŒŃƒŃ‚ŃŒ ĐČіЮ **Ń€Ń–Đ·ĐœĐžŃ… ĐČДрсіĐč** ĐŸĐŽĐœĐŸĐłĐŸ Đč Ń‚ĐŸĐłĐŸ ж паĐșДта. đŸ˜± -НапроĐșлаЎ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” стĐČĐŸŃ€ĐžŃ‚Đž ĐżŃ€ĐŸŃ”Đșт Ń–Đ· ĐœĐ°Đ·ĐČĐŸŃŽ `philosophers-stone`, ця ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ° Đ·Đ°Đ»Đ”Đ¶ĐžŃ‚ŃŒ ĐČіЮ Ń–ĐœŃˆĐŸĐłĐŸ паĐșДта Đ· ĐœĐ°Đ·ĐČĐŸŃŽ `harry`, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо ĐČДрсію `1`. ĐąĐŸĐ¶ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐČŃŃ‚Đ°ĐœĐŸĐČото `harry`. +НапроĐșлаЎ, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” стĐČĐŸŃ€ĐžŃ‚Đž ĐżŃ€ĐŸŃ”Đșт Ń–Đ· ĐœĐ°Đ·ĐČĐŸŃŽ `philosophers-stone`, ця ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ° Đ·Đ°Đ»Đ”Đ¶ĐžŃ‚ŃŒ ĐČіЮ Ń–ĐœŃˆĐŸĐłĐŸ паĐșДта Đ· ĐœĐ°Đ·ĐČĐŸŃŽ **`harry`, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуючо ĐČДрсію `1`**. ĐąĐŸĐ¶ ĐČĐ°ĐŒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐČŃŃ‚Đ°ĐœĐŸĐČото `harry`. ```mermaid flowchart LR stone(philosophers-stone) -->|requires| harry-1[harry v1] ``` -ĐŸĐŸŃ‚Ń–ĐŒ, Ń‚Ń€ĐŸŃ…Đž Đ·ĐłĐŸĐŽĐŸĐŒ, ĐČĐž стĐČĐŸŃ€ŃŽŃ”Ń‚Đ” Ń–ĐœŃˆĐžĐč ĐżŃ€ĐŸŃ”Đșт Ń–Đ· ĐœĐ°Đ·ĐČĐŸŃŽ `prisoner-of-azkaban`, і цДĐč ĐżŃ€ĐŸŃ”Đșт таĐșĐŸĐ¶ Đ·Đ°Đ»Đ”Đ¶ĐžŃ‚ŃŒ ĐČіЮ `harry`, алД ĐčĐŸĐŒŃƒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐ° ĐČĐ”Ń€ŃŃ–Ń `harry` `3`. +ĐŸĐŸŃ‚Ń–ĐŒ, Ń‚Ń€ĐŸŃ…Đž Đ·ĐłĐŸĐŽĐŸĐŒ, ĐČĐž стĐČĐŸŃ€ŃŽŃ”Ń‚Đ” Ń–ĐœŃˆĐžĐč ĐżŃ€ĐŸŃ”Đșт Ń–Đ· ĐœĐ°Đ·ĐČĐŸŃŽ `prisoner-of-azkaban`, і цДĐč ĐżŃ€ĐŸŃ”Đșт таĐșĐŸĐ¶ Đ·Đ°Đ»Đ”Đ¶ĐžŃ‚ŃŒ ĐČіЮ `harry`, алД ĐčĐŸĐŒŃƒ ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐ° **ĐČĐ”Ń€ŃŃ–Ń `harry` `3`**. ```mermaid flowchart LR azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3] ``` -АлД тДпДр ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒĐ° ĐČ Ń‚ĐŸĐŒŃƒ, Ń‰ĐŸ яĐșŃ‰ĐŸ ĐČĐž ĐČŃŃ‚Đ°ĐœĐŸĐČлюєтД паĐșДтО ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐŸ (у ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД), а ĐœĐ” у Đ»ĐŸĐșĐ°Đ»ŃŒĐœĐ” ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД, ĐČĐ°ĐŒ ĐŽĐŸĐČĐ”ĐŽĐ”Ń‚ŃŒŃŃ ĐČОбОратО, яĐșу ĐČДрсію `harry` ĐČŃŃ‚Đ°ĐœĐŸĐČото. +АлД тДпДр ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒĐ° ĐČ Ń‚ĐŸĐŒŃƒ, Ń‰ĐŸ яĐșŃ‰ĐŸ ĐČĐž ĐČŃŃ‚Đ°ĐœĐŸĐČлюєтД паĐșДтО ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐŸ (у ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД), а ĐœĐ” у Đ»ĐŸĐșĐ°Đ»ŃŒĐœĐ” **ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД**, ĐČĐ°ĐŒ ĐŽĐŸĐČĐ”ĐŽĐ”Ń‚ŃŒŃŃ ĐČОбОратО, яĐșу ĐČДрсію `harry` ĐČŃŃ‚Đ°ĐœĐŸĐČото. ĐŻĐșŃ‰ĐŸ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž `philosophers-stone`, ĐČĐ°ĐŒ ŃĐżĐŸŃ‡Đ°Ń‚Đșу ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐŸ ĐČŃŃ‚Đ°ĐœĐŸĐČото `harry` ĐČДрсії `1`, ĐœĐ°ĐżŃ€ĐžĐșлаЎ, таĐș: @@ -517,7 +519,7 @@ $ pip install "harry==3" ĐŁ ĐżŃ–ĐŽŃŃƒĐŒĐșу у ĐČас буЎД ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐŸ `harry` ĐČДрсії `3` у ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐŸĐŒŃƒ ŃĐ”Ń€Đ”ĐŽĐŸĐČощі Python. -А яĐșŃ‰ĐŸ ĐČĐž Đ·ĐœĐŸĐČу ŃĐżŃ€ĐŸĐ±ŃƒŃ”Ń‚Đ” Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž `philosophers-stone`, є ŃˆĐ°ĐœŃ, Ń‰ĐŸ ĐČŃ–Đœ ĐœĐ” працюĐČĐ°Ń‚ĐžĐŒĐ”, Ń‚ĐŸĐŒŃƒ Ń‰ĐŸ ĐčĐŸĐŒŃƒ ĐżĐŸŃ‚Ń€Ń–Đ±Đ”Đœ `harry` ĐČДрсії `1`. +А яĐșŃ‰ĐŸ ĐČĐž Đ·ĐœĐŸĐČу ŃĐżŃ€ĐŸĐ±ŃƒŃ”Ń‚Đ” Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž `philosophers-stone`, є ŃˆĐ°ĐœŃ, Ń‰ĐŸ ĐČŃ–Đœ **ĐœĐ” працюĐČĐ°Ń‚ĐžĐŒĐ”**, Ń‚ĐŸĐŒŃƒ Ń‰ĐŸ ĐčĐŸĐŒŃƒ ĐżĐŸŃ‚Ń€Ń–Đ±Đ”Đœ `harry` ĐČДрсії `1`. ```mermaid flowchart LR @@ -536,13 +538,13 @@ flowchart LR /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -ĐŁ паĐșДтах Python ЎужД ĐżĐŸŃˆĐžŃ€Đ”ĐœĐ° праĐșтоĐșа ĐœĐ°ĐŒĐ°ĐłĐ°Ń‚ĐžŃŃ яĐșĐœĐ°ĐčĐșращД ŃƒĐœĐžĐșато ĐœĐ”ŃŃƒĐŒŃ–ŃĐœĐžŃ… Đ·ĐŒŃ–Đœ у ĐœĐŸĐČох ĐČĐ”Ń€ŃŃ–ŃŃ…, алД ĐșращД піЮстрахуĐČатося та ĐČŃŃ‚Đ°ĐœĐŸĐČлюĐČато ĐœĐŸĐČіші ĐČДрсії сĐČŃ–ĐŽĐŸĐŒĐŸ і Ń‚ĐŸĐŽŃ–, ĐșĐŸĐ»Đž ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž тДстО, Ń‰ĐŸĐ± пДрДĐČірото, Ń‰ĐŸ ĐČсД працює ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐŸ. +ĐŁ паĐșДтах Python ЎужД ĐżĐŸŃˆĐžŃ€Đ”ĐœĐ° праĐșтоĐșа ĐœĐ°ĐŒĐ°ĐłĐ°Ń‚ĐžŃŃ яĐșĐœĐ°ĐčĐșращД **ŃƒĐœĐžĐșато ĐœĐ”ŃŃƒĐŒŃ–ŃĐœĐžŃ… Đ·ĐŒŃ–Đœ** у **ĐœĐŸĐČох ĐČĐ”Ń€ŃŃ–ŃŃ…**, алД ĐșращД піЮстрахуĐČатося та ĐČŃŃ‚Đ°ĐœĐŸĐČлюĐČато ĐœĐŸĐČіші ĐČДрсії сĐČŃ–ĐŽĐŸĐŒĐŸ і Ń‚ĐŸĐŽŃ–, ĐșĐŸĐ»Đž ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž тДстО, Ń‰ĐŸĐ± пДрДĐČірото, Ń‰ĐŸ ĐČсД працює ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐŸ. /// -йДпДр уяĐČіть тД ŃĐ°ĐŒĐ” Đ· Đ±Đ°ĐłĐ°Ń‚ŃŒĐŒĐ° Ń–ĐœŃˆĐžĐŒĐž паĐșĐ”Ń‚Đ°ĐŒĐž, ĐČіЮ яĐșох Đ·Đ°Đ»Đ”Đ¶Đ°Ń‚ŃŒ усі ĐČаші ĐżŃ€ĐŸŃ”Đșто. ĐŠĐ” ЎужД сĐșĐ»Đ°ĐŽĐœĐŸ ĐșĐ”Ń€ŃƒĐČато. І ĐČĐž, Ń–ĐŒĐŸĐČŃ–Ń€ĐœĐŸ, запусĐșĐ°Ń‚ĐžĐŒĐ”Ń‚Đ” ĐŽĐ”ŃĐșі ĐżŃ€ĐŸŃ”Đșто Đ· ĐŽĐ”ŃĐșĐžĐŒĐž ĐœĐ”ŃŃƒĐŒŃ–ŃĐœĐžĐŒĐž ĐČĐ”Ń€ŃŃ–ŃĐŒĐž паĐșДтіĐČ Ń– ĐœĐ” Ń€ĐŸĐ·ŃƒĐŒŃ–Ń‚ĐžĐŒĐ”Ń‚Đ”, Ń‡ĐŸĐŒŃƒ Ń‰ĐŸŃŃŒ ĐœĐ” працює. +йДпДр уяĐČіть тД ŃĐ°ĐŒĐ” Đ· **Đ±Đ°ĐłĐ°Ń‚ŃŒĐŒĐ°** Ń–ĐœŃˆĐžĐŒĐž **паĐșĐ”Ń‚Đ°ĐŒĐž**, ĐČіЮ яĐșох Đ·Đ°Đ»Đ”Đ¶Đ°Ń‚ŃŒ усі ĐČаші **ĐżŃ€ĐŸŃ”Đșто**. ĐŠĐ” ЎужД сĐșĐ»Đ°ĐŽĐœĐŸ ĐșĐ”Ń€ŃƒĐČато. І ĐČĐž, Ń–ĐŒĐŸĐČŃ–Ń€ĐœĐŸ, запусĐșĐ°Ń‚ĐžĐŒĐ”Ń‚Đ” ĐŽĐ”ŃĐșі ĐżŃ€ĐŸŃ”Đșто Đ· ĐŽĐ”ŃĐșĐžĐŒĐž **ĐœĐ”ŃŃƒĐŒŃ–ŃĐœĐžĐŒĐž ĐČĐ”Ń€ŃŃ–ŃĐŒĐž** паĐșДтіĐČ Ń– ĐœĐ” Ń€ĐŸĐ·ŃƒĐŒŃ–Ń‚ĐžĐŒĐ”Ń‚Đ”, Ń‡ĐŸĐŒŃƒ Ń‰ĐŸŃŃŒ ĐœĐ” працює. -йаĐșĐŸĐ¶, Đ·Đ°Đ»Đ”Đ¶ĐœĐŸ ĐČіЮ ĐČĐ°ŃˆĐŸŃ— ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœĐŸŃ— ŃĐžŃŃ‚Đ”ĐŒĐž (ĐœĐ°ĐżŃ€., Linux, Windows, macOS), у ĐœŃ–Đč ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐČжД ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐžĐč Python. І ĐČ Ń‚Đ°ĐșĐŸĐŒŃƒ разі, Ń–ĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ужД Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœŃ– ĐŽĐ”ŃĐșі паĐșДтО Đ· пДĐČĐœĐžĐŒĐž ĐČĐ”Ń€ŃŃ–ŃĐŒĐž, ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžĐŒĐž ĐČашіĐč ŃĐžŃŃ‚Đ”ĐŒŃ–. ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČŃŃ‚Đ°ĐœĐŸĐČлюєтД паĐșДтО ĐČ ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД Python, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ»Đ°ĐŒĐ°Ń‚Đž ĐŽĐ”ŃĐșі ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž, Ń‰ĐŸ ĐżĐŸŃŃ‚Đ°Ń‡Đ°ŃŽŃ‚ŃŒŃŃ Đ· ĐČĐ°ŃˆĐŸŃŽ ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœĐŸŃŽ ŃĐžŃŃ‚Đ”ĐŒĐŸŃŽ. +йаĐșĐŸĐ¶, Đ·Đ°Đ»Đ”Đ¶ĐœĐŸ ĐČіЮ ĐČĐ°ŃˆĐŸŃ— ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœĐŸŃ— ŃĐžŃŃ‚Đ”ĐŒĐž (ĐœĐ°ĐżŃ€., Linux, Windows, macOS), у ĐœŃ–Đč ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐČжД ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐžĐč Python. І ĐČ Ń‚Đ°ĐșĐŸĐŒŃƒ разі, Ń–ĐŒĐŸĐČŃ–Ń€ĐœĐŸ, ужД Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐżĐŸĐżĐ”Ń€Đ”ĐŽĐœŃŒĐŸ ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœŃ– ĐŽĐ”ŃĐșі паĐșДтО Đ· пДĐČĐœĐžĐŒĐž ĐČĐ”Ń€ŃŃ–ŃĐŒĐž, **ĐżĐŸŃ‚Ń€Ń–Đ±ĐœĐžĐŒĐž ĐČашіĐč ŃĐžŃŃ‚Đ”ĐŒŃ–**. ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČŃŃ‚Đ°ĐœĐŸĐČлюєтД паĐșДтО ĐČ ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД Python, ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” **Đ·Đ»Đ°ĐŒĐ°Ń‚Đž** ĐŽĐ”ŃĐșі ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž, Ń‰ĐŸ ĐżĐŸŃŃ‚Đ°Ń‡Đ°ŃŽŃ‚ŃŒŃŃ Đ· ĐČĐ°ŃˆĐŸŃŽ ĐŸĐżĐ”Ń€Đ°Ń†Ń–ĐčĐœĐŸŃŽ ŃĐžŃŃ‚Đ”ĐŒĐŸŃŽ. ## ДД ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»ŃŽŃŽŃ‚ŃŒŃŃ паĐșДтО { #where-are-packages-installed } @@ -564,17 +566,17 @@ $ pip install "fastapi[standard]" ĐŠĐ” заĐČĐ°ĐœŃ‚Đ°Đ¶ĐžŃ‚ŃŒ ŃŃ‚ĐžŃĐœĐ”ĐœĐžĐč фаĐčĐ» Đ· ĐșĐŸĐŽĐŸĐŒ FastAPI, зазĐČочаĐč Ń–Đ· [PyPI](https://pypi.org/project/fastapi/). -йаĐșĐŸĐ¶ Đ±ŃƒĐŽŃƒŃ‚ŃŒ заĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœŃ– фаĐčлО ĐŽĐ»Ń Ń–ĐœŃˆĐžŃ… паĐșДтіĐČ, ĐČіЮ яĐșох Đ·Đ°Đ»Đ”Đ¶ĐžŃ‚ŃŒ FastAPI. +йаĐșĐŸĐ¶ Đ±ŃƒĐŽŃƒŃ‚ŃŒ **заĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœŃ–** фаĐčлО ĐŽĐ»Ń Ń–ĐœŃˆĐžŃ… паĐșДтіĐČ, ĐČіЮ яĐșох Đ·Đ°Đ»Đ”Đ¶ĐžŃ‚ŃŒ FastAPI. -ĐŸĐŸŃ‚Ń–ĐŒ усД цД буЎД Ń€ĐŸĐ·ĐżĐ°ĐșĐŸĐČĐ°ĐœĐŸ та ĐżĐŸĐșĐ»Đ°ĐŽĐ”ĐœĐŸ ĐČ ĐșĐ°Ń‚Đ°Đ»ĐŸĐł ĐœĐ° ĐČĐ°ŃˆĐŸĐŒŃƒ ĐșĐŸĐŒĐż'ютДрі. +ĐŸĐŸŃ‚Ń–ĐŒ усД цД буЎД **Ń€ĐŸĐ·ĐżĐ°ĐșĐŸĐČĐ°ĐœĐŸ** та ĐżĐŸĐșĐ»Đ°ĐŽĐ”ĐœĐŸ ĐČ ĐșĐ°Ń‚Đ°Đ»ĐŸĐł ĐœĐ° ĐČĐ°ŃˆĐŸĐŒŃƒ ĐșĐŸĐŒĐż'ютДрі. -ĐąĐžĐżĐŸĐČĐŸ ці заĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœŃ– та Ń€ĐŸĐ·ĐżĐ°ĐșĐŸĐČĐ°ĐœŃ– фаĐčлО Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐżĐŸĐșĐ»Đ°ĐŽĐ”ĐœŃ– ĐČ ĐșĐ°Ń‚Đ°Đ»ĐŸĐł, Ń‰ĐŸ ĐżĐŸŃŃ‚Đ°Ń‡Đ°Ń”Ń‚ŃŒŃŃ Đ· ĐČĐ°ŃˆĐŸŃŽ Ń–ĐœŃŃ‚Đ°Đ»ŃŃ†Ń–Ń”ŃŽ Python, цД ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД. +ĐąĐžĐżĐŸĐČĐŸ ці заĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœŃ– та Ń€ĐŸĐ·ĐżĐ°ĐșĐŸĐČĐ°ĐœŃ– фаĐčлО Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐżĐŸĐșĐ»Đ°ĐŽĐ”ĐœŃ– ĐČ ĐșĐ°Ń‚Đ°Đ»ĐŸĐł, Ń‰ĐŸ ĐżĐŸŃŃ‚Đ°Ń‡Đ°Ń”Ń‚ŃŒŃŃ Đ· ĐČĐ°ŃˆĐŸŃŽ Ń–ĐœŃŃ‚Đ°Đ»ŃŃ†Ń–Ń”ŃŽ Python, цД **ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД**. ## Đ©ĐŸ таĐșĐ” ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœŃ– ŃĐ”Ń€Đ”ĐŽĐŸĐČоща { #what-are-virtual-environments } -Đ Ń–ŃˆĐ”ĐœĐœŃĐŒ ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒĐž Đ· ĐœĐ°ŃĐČĐœŃ–ŃŃ‚ŃŽ ĐČсіх паĐșДтіĐČ Ńƒ ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐŸĐŒŃƒ ŃĐ”Ń€Đ”ĐŽĐŸĐČощі є ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща ĐŽĐ»Ń ĐșĐŸĐ¶ĐœĐŸĐłĐŸ ĐżŃ€ĐŸŃ”Đșту, ĐœĐ°ĐŽ яĐșĐžĐŒ ĐČĐž працюєтД. +Đ Ń–ŃˆĐ”ĐœĐœŃĐŒ ĐżŃ€ĐŸĐ±Đ»Đ”ĐŒĐž Đ· ĐœĐ°ŃĐČĐœŃ–ŃŃ‚ŃŽ ĐČсіх паĐșДтіĐČ Ńƒ ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐŸĐŒŃƒ ŃĐ”Ń€Đ”ĐŽĐŸĐČощі є ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ **ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща ĐŽĐ»Ń ĐșĐŸĐ¶ĐœĐŸĐłĐŸ ĐżŃ€ĐŸŃ”Đșту**, ĐœĐ°ĐŽ яĐșĐžĐŒ ĐČĐž працюєтД. -Đ’Ń–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД - цД ĐșĐ°Ń‚Đ°Đ»ĐŸĐł, ЎужД ŃŃ…ĐŸĐ¶ĐžĐč ĐœĐ° ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐžĐč, у яĐșĐŸĐŒŃƒ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČŃŃ‚Đ°ĐœĐŸĐČлюĐČато паĐșДтО ĐŽĐ»Ń ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐŸĐłĐŸ ĐżŃ€ĐŸŃ”Đșту. +Đ’Ń–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД - цД **ĐșĐ°Ń‚Đ°Đ»ĐŸĐł**, ЎужД ŃŃ…ĐŸĐ¶ĐžĐč ĐœĐ° ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐžĐč, у яĐșĐŸĐŒŃƒ ĐČĐž ĐŒĐŸĐ¶Đ”Ń‚Đ” ĐČŃŃ‚Đ°ĐœĐŸĐČлюĐČато паĐșДтО ĐŽĐ»Ń ĐșĐŸĐœĐșŃ€Đ”Ń‚ĐœĐŸĐłĐŸ ĐżŃ€ĐŸŃ”Đșту. йаĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ ĐșĐŸĐ¶Đ”Đœ ĐżŃ€ĐŸŃ”Đșт ĐŒĐ°Ń‚ĐžĐŒĐ” ĐČĐ»Đ°ŃĐœĐ” ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД (ĐșĐ°Ń‚Đ°Đ»ĐŸĐł `.venv`) Ń–Đ· ĐČĐ»Đ°ŃĐœĐžĐŒĐž паĐșĐ”Ń‚Đ°ĐŒĐž. @@ -637,7 +639,7 @@ $ source .venv/Scripts/activate //// -Щя ĐșĐŸĐŒĐ°ĐœĐŽĐ° стĐČĐŸŃ€ĐžŃ‚ŃŒ Đ°Đ±ĐŸ Đ·ĐŒŃ–ĐœĐžŃ‚ŃŒ ĐŽĐ”ŃĐșі [Đ—ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ](environment-variables.md), яĐșі Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐŽĐŸŃŃ‚ŃƒĐżĐœŃ– ĐŽĐ»Ń ĐœĐ°ŃŃ‚ŃƒĐżĐœĐžŃ… ĐșĐŸĐŒĐ°ĐœĐŽ. +Щя ĐșĐŸĐŒĐ°ĐœĐŽĐ° стĐČĐŸŃ€ĐžŃ‚ŃŒ Đ°Đ±ĐŸ Đ·ĐŒŃ–ĐœĐžŃ‚ŃŒ ĐŽĐ”ŃĐșі [Đ·ĐŒŃ–ĐœĐœŃ– ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ](environment-variables.md), яĐșі Đ±ŃƒĐŽŃƒŃ‚ŃŒ ĐŽĐŸŃŃ‚ŃƒĐżĐœŃ– ĐŽĐ»Ń ĐœĐ°ŃŃ‚ŃƒĐżĐœĐžŃ… ĐșĐŸĐŒĐ°ĐœĐŽ. ĐžĐŽĐœŃ–Ń”ŃŽ Đ· цох Đ·ĐŒŃ–ĐœĐœĐžŃ… є Đ·ĐŒŃ–ĐœĐœĐ° `PATH`. @@ -728,7 +730,7 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python //// -ВажлОĐČа ĐŽĐ”Ń‚Đ°Đ»ŃŒ: ŃˆĐ»ŃŃ… ĐŽĐŸ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща буЎД ĐŽĐŸĐŽĐ°ĐœĐŸ ĐœĐ° ĐżĐŸŃ‡Đ°Ń‚ĐŸĐș Đ·ĐŒŃ–ĐœĐœĐŸŃ— `PATH`. ĐĄĐžŃŃ‚Đ”ĐŒĐ° Đ·ĐœĐ°ĐčĐŽĐ” ĐčĐŸĐłĐŸ Ń€Đ°ĐœŃ–ŃˆĐ” за Đ±ŃƒĐŽŃŒ-яĐșĐžĐč Ń–ĐœŃˆĐžĐč ĐŽĐŸŃŃ‚ŃƒĐżĐœĐžĐč Python. йаĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ, ĐșĐŸĐ»Đž ĐČĐž запусĐșаєтД `python`, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ŃĐ°ĐŒĐ” Python Ń–Đ· ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща, а ĐœĐ” Đ±ŃƒĐŽŃŒ-яĐșĐžĐč Ń–ĐœŃˆĐžĐč `python` (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Đ· ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща). +ВажлОĐČа ĐŽĐ”Ń‚Đ°Đ»ŃŒ: ŃˆĐ»ŃŃ… ĐŽĐŸ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща буЎД ĐŽĐŸĐŽĐ°ĐœĐŸ ĐœĐ° **ĐżĐŸŃ‡Đ°Ń‚ĐŸĐș** Đ·ĐŒŃ–ĐœĐœĐŸŃ— `PATH`. ĐĄĐžŃŃ‚Đ”ĐŒĐ° Đ·ĐœĐ°ĐčĐŽĐ” ĐčĐŸĐłĐŸ **Ń€Đ°ĐœŃ–ŃˆĐ”** за Đ±ŃƒĐŽŃŒ-яĐșĐžĐč Ń–ĐœŃˆĐžĐč ĐŽĐŸŃŃ‚ŃƒĐżĐœĐžĐč Python. йаĐșĐžĐŒ Ń‡ĐžĐœĐŸĐŒ, ĐșĐŸĐ»Đž ĐČĐž запусĐșаєтД `python`, ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується ŃĐ°ĐŒĐ” Python **Ń–Đ· ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща**, а ĐœĐ” Đ±ŃƒĐŽŃŒ-яĐșĐžĐč Ń–ĐœŃˆĐžĐč `python` (ĐœĐ°ĐżŃ€ĐžĐșлаЎ, Đ· ĐłĐ»ĐŸĐ±Đ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща). АĐșтоĐČація ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща таĐșĐŸĐ¶ Đ·ĐŒŃ–ĐœŃŽŃ” щД ĐșŃ–Đ»ŃŒĐșа рДчДĐč, алД цД ĐŸĐŽĐœĐ° Đ· ĐœĐ°ĐčĐČажлОĐČішох. @@ -764,11 +766,11 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python //// -ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ° `python`, яĐșа буЎД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐ°, Đ·ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŒŃŃ у ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐŒŃƒ ŃĐ”Ń€Đ”ĐŽĐŸĐČощі. +ĐŠĐ” ĐŸĐ·ĐœĐ°Ń‡Đ°Ń”, Ń‰ĐŸ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐ° `python`, яĐșа буЎД ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐ°, Đ·ĐœĐ°Ń…ĐŸĐŽĐžŃ‚ŃŒŃŃ **у ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐŒŃƒ ŃĐ”Ń€Đ”ĐŽĐŸĐČощі**. На Linux і macOS ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČують `which`, а ĐČ Windows PowerShell - `Get-Command`. -ĐŸŃ€ĐžĐœŃ†ĐžĐż Ń€ĐŸĐ±ĐŸŃ‚Đž цієї ĐșĐŸĐŒĐ°ĐœĐŽĐž ĐČ Ń‚ĐŸĐŒŃƒ, Ń‰ĐŸ ĐČĐŸĐœĐ° пДрДĐČіряє Đ·ĐŒŃ–ĐœĐœŃƒ ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ `PATH`, ĐżŃ€ĐŸŃ…ĐŸĐŽŃŃ‡Đž ĐżĐŸ ĐșĐŸĐ¶ĐœĐŸĐŒŃƒ ŃˆĐ»ŃŃ…Ńƒ ĐżĐŸ ĐżĐŸŃ€ŃĐŽĐșу, шуĐșаючо ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ Đ· ĐœĐ°Đ·ĐČĐŸŃŽ `python`. Đ©ĐŸĐčĐœĐŸ ĐČĐŸĐœĐ° її Đ·ĐœĐ°ĐčĐŽĐ”, ĐČĐŸĐœĐ° ĐżĐŸĐșажД ĐČĐ°ĐŒ ŃˆĐ»ŃŃ… ĐŽĐŸ цієї ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž. +ĐŸŃ€ĐžĐœŃ†ĐžĐż Ń€ĐŸĐ±ĐŸŃ‚Đž цієї ĐșĐŸĐŒĐ°ĐœĐŽĐž ĐČ Ń‚ĐŸĐŒŃƒ, Ń‰ĐŸ ĐČĐŸĐœĐ° пДрДĐČіряє Đ·ĐŒŃ–ĐœĐœŃƒ ĐŸŃ‚ĐŸŃ‡Đ”ĐœĐœŃ `PATH`, ĐżŃ€ĐŸŃ…ĐŸĐŽŃŃ‡Đž ĐżĐŸ **ĐșĐŸĐ¶ĐœĐŸĐŒŃƒ ŃˆĐ»ŃŃ…Ńƒ ĐżĐŸ ĐżĐŸŃ€ŃĐŽĐșу**, шуĐșаючо ĐżŃ€ĐŸĐłŃ€Đ°ĐŒŃƒ Đ· ĐœĐ°Đ·ĐČĐŸŃŽ `python`. Đ©ĐŸĐčĐœĐŸ ĐČĐŸĐœĐ° її Đ·ĐœĐ°ĐčĐŽĐ”, ĐČĐŸĐœĐ° **ĐżĐŸĐșажД ĐČĐ°ĐŒ ŃˆĐ»ŃŃ…** ĐŽĐŸ цієї ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐž. НаĐčĐČажлОĐČŃ–ŃˆĐ”, Ń‰ĐŸ ĐșĐŸĐ»Đž ĐČĐž ĐČĐžĐșлОĐșаєтД `python`, цД ріĐČĐœĐŸ Ń‚ĐŸĐč «`python`», яĐșĐžĐč буЎД ĐČĐžĐșĐŸĐœĐ°ĐœĐžĐč. @@ -776,9 +778,9 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python /// tip | ĐŸĐŸŃ€Đ°ĐŽĐ° -ЛДгĐșĐŸ аĐșтоĐČуĐČато ĐŸĐŽĐœĐ” ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД, ĐŸŃ‚Ń€ĐžĐŒĐ°Ń‚Đž ĐŸĐŽĐžĐœ Python, а ĐżĐŸŃ‚Ń–ĐŒ пДрДĐčто ĐŽĐŸ Ń–ĐœŃˆĐŸĐłĐŸ ĐżŃ€ĐŸŃ”Đșту. +ЛДгĐșĐŸ аĐșтоĐČуĐČато ĐŸĐŽĐœĐ” ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД, ĐŸŃ‚Ń€ĐžĐŒĐ°Ń‚Đž ĐŸĐŽĐžĐœ Python, а ĐżĐŸŃ‚Ń–ĐŒ **пДрДĐčто ĐŽĐŸ Ń–ĐœŃˆĐŸĐłĐŸ ĐżŃ€ĐŸŃ”Đșту**. -І ЮругоĐč ĐżŃ€ĐŸŃ”Đșт ĐœĐ” працюĐČĐ°Ń‚ĐžĐŒĐ”, Đ±ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” ĐœĐ”ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐžĐč Python Đ· ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща Ń–ĐœŃˆĐŸĐłĐŸ ĐżŃ€ĐŸŃ”Đșту. +І ЮругоĐč ĐżŃ€ĐŸŃ”Đșт **ĐœĐ” працюĐČĐ°Ń‚ĐžĐŒĐ”**, Đ±ĐŸ ĐČĐž ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČŃƒŃ”Ń‚Đ” **ĐœĐ”ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐžĐč Python** Đ· ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐŸĐłĐŸ ŃĐ”Ń€Đ”ĐŽĐŸĐČоща Ń–ĐœŃˆĐŸĐłĐŸ ĐżŃ€ĐŸŃ”Đșту. ĐšĐŸŃ€ĐžŃĐœĐŸ ĐČĐŒŃ–Ń‚Đž пДрДĐČірято, яĐșĐžĐč ŃĐ°ĐŒĐ” `python` ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČується. đŸ€“ @@ -786,9 +788,9 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python ## НаĐČŃ–Ń‰ĐŸ ЎДаĐșтоĐČуĐČато ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД { #why-deactivate-a-virtual-environment } -НапроĐșлаЎ, ĐČĐž працюєтД ĐœĐ°ĐŽ ĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐŒ `philosophers-stone`, аĐșтоĐČуĐČалО ĐčĐŸĐłĐŸ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД, ĐČŃŃ‚Đ°ĐœĐŸĐČОлО паĐșДтО та працюєтД Đ· Ń†ĐžĐŒ ŃĐ”Ń€Đ”ĐŽĐŸĐČĐžŃ‰Đ”ĐŒ. +НапроĐșлаЎ, ĐČĐž працюєтД ĐœĐ°ĐŽ ĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐŒ `philosophers-stone`, **аĐșтоĐČуĐČалО ĐčĐŸĐłĐŸ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐ” ŃĐ”Ń€Đ”ĐŽĐŸĐČОщД**, ĐČŃŃ‚Đ°ĐœĐŸĐČОлО паĐșДтО та працюєтД Đ· Ń†ĐžĐŒ ŃĐ”Ń€Đ”ĐŽĐŸĐČĐžŃ‰Đ”ĐŒ. -А ĐżĐŸŃ‚Ń–ĐŒ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” працюĐČато ĐœĐ°ĐŽ Ń–ĐœŃˆĐžĐŒ ĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐŒ `prisoner-of-azkaban`. +А ĐżĐŸŃ‚Ń–ĐŒ ĐČĐž Ń…ĐŸŃ‡Đ”Ń‚Đ” працюĐČато ĐœĐ°ĐŽ **Ń–ĐœŃˆĐžĐŒ ĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐŒ** `prisoner-of-azkaban`. Во ĐżĐ”Ń€Đ”Ń…ĐŸĐŽĐžŃ‚Đ” ĐŽĐŸ Ń†ŃŒĐŸĐłĐŸ ĐżŃ€ĐŸŃ”Đșту: @@ -840,23 +842,23 @@ I solemnly swear đŸș ## ĐĐ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČĐž { #alternatives } -ĐŠĐ” ĐżŃ€ĐŸŃŃ‚ĐžĐč ĐżĐŸŃŃ–Đ±ĐœĐžĐș, Ń‰ĐŸĐ± ĐČĐž шĐČОЎĐșĐŸ стартуĐČалО та Đ·Ń€ĐŸĐ·ŃƒĐŒŃ–Đ»Đž, яĐș усД працює «піЎ ĐșĐ°ĐżĐŸŃ‚ĐŸĐŒÂ». +ĐŠĐ” ĐżŃ€ĐŸŃŃ‚ĐžĐč ĐżĐŸŃŃ–Đ±ĐœĐžĐș, Ń‰ĐŸĐ± ĐČĐž шĐČОЎĐșĐŸ стартуĐČалО та Đ·Ń€ĐŸĐ·ŃƒĐŒŃ–Đ»Đž, яĐș усД працює **«піЎ ĐșĐ°ĐżĐŸŃ‚ĐŸĐŒÂ»**. -Đ†ŃĐœŃƒŃ” Đ±Đ°ĐłĐ°Ń‚ĐŸ Đ°Đ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČ ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐžĐŒĐž ŃĐ”Ń€Đ”ĐŽĐŸĐČĐžŃ‰Đ°ĐŒĐž, Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃĐŒĐž паĐșДтіĐČ (ĐČĐžĐŒĐŸĐłĐ°ĐŒĐž), ĐżŃ€ĐŸŃ”ĐșŃ‚Đ°ĐŒĐž. +Đ†ŃĐœŃƒŃ” Đ±Đ°ĐłĐ°Ń‚ĐŸ **Đ°Đ»ŃŒŃ‚Đ”Ń€ĐœĐ°Ń‚ĐžĐČ** ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐžĐŒĐž ŃĐ”Ń€Đ”ĐŽĐŸĐČĐžŃ‰Đ°ĐŒĐž, Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃĐŒĐž паĐșДтіĐČ (ĐČĐžĐŒĐŸĐłĐ°ĐŒĐž), ĐżŃ€ĐŸŃ”ĐșŃ‚Đ°ĐŒĐž. -ĐšĐŸĐ»Đž Đ±ŃƒĐŽĐ”Ń‚Đ” ĐłĐŸŃ‚ĐŸĐČі Đč Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚ ĐŽĐ»Ń ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐČŃŃ–ĐŒ ĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐŒ, Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃĐŒĐž паĐșДтіĐČ, ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐžĐŒĐž ŃĐ”Ń€Đ”ĐŽĐŸĐČĐžŃ‰Đ°ĐŒĐž Ń‚ĐŸŃ‰ĐŸ, я Ń€Đ°ĐŽĐ¶Ńƒ ŃĐżŃ€ĐŸĐ±ŃƒĐČато [uv](https://github.com/astral-sh/uv). +ĐšĐŸĐ»Đž Đ±ŃƒĐŽĐ”Ń‚Đ” ĐłĐŸŃ‚ĐŸĐČі Đč Đ·Đ°Ń…ĐŸŃ‡Đ”Ń‚Đ” ĐČĐžĐșĐŸŃ€ĐžŃŃ‚ĐŸĐČуĐČато Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚ ĐŽĐ»Ń **ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ ĐČŃŃ–ĐŒ ĐżŃ€ĐŸŃ”ĐșŃ‚ĐŸĐŒ**, Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃĐŒĐž паĐșДтіĐČ, ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐžĐŒĐž ŃĐ”Ń€Đ”ĐŽĐŸĐČĐžŃ‰Đ°ĐŒĐž Ń‚ĐŸŃ‰ĐŸ, я Ń€Đ°ĐŽĐ¶Ńƒ ŃĐżŃ€ĐŸĐ±ŃƒĐČато [uv](https://github.com/astral-sh/uv). `uv` ŃƒĐŒŃ–Ń” Đ±Đ°ĐłĐ°Ń‚ĐŸ Ń‡ĐŸĐłĐŸ, Đ·ĐŸĐșŃ€Đ”ĐŒĐ°: -* Đ’ŃŃ‚Đ°ĐœĐŸĐČлюĐČато Python ĐŽĐ»Ń ĐČас, ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ· Ń€Ń–Đ·ĐœĐžĐŒĐž ĐČĐ”Ń€ŃŃ–ŃĐŒĐž -* ĐšĐ”Ń€ŃƒĐČато ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐžĐŒ ŃĐ”Ń€Đ”ĐŽĐŸĐČĐžŃ‰Đ”ĐŒ ĐČашох ĐżŃ€ĐŸŃ”ĐșтіĐČ -* Đ’ŃŃ‚Đ°ĐœĐŸĐČлюĐČато паĐșДтО -* ĐšĐ”Ń€ŃƒĐČато Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃĐŒĐž паĐșДтіĐČ Ń– ĐČĐ”Ń€ŃŃ–ŃĐŒĐž у ĐČĐ°ŃˆĐŸĐŒŃƒ ĐżŃ€ĐŸŃ”Đșті -* Đ“Đ°Ń€Đ°ĐœŃ‚ŃƒĐČато, Ń‰ĐŸ у ĐČас є Ń‚ĐŸŃ‡ĐœĐžĐč ĐœĐ°Đ±Ń–Ń€ паĐșДтіĐČ Ń– ĐČДрсіĐč ĐŽĐ»Ń ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ, ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ· Ń—Ń…ĐœŃ–ĐŒĐž Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃĐŒĐž, Ń‰ĐŸĐ± ĐČĐž булО пДĐČĐœŃ–, Ń‰ĐŸ Đ·ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž ĐČаш ĐżŃ€ĐŸŃ”Đșт у ĐżŃ€ĐŸĐŽĐ°ĐșŃˆĐ”ĐœŃ– Ń‚ĐŸŃ‡ĐœĐŸ таĐș ŃĐ°ĐŒĐŸ, яĐș і ĐœĐ° ĐČĐ°ŃˆĐŸĐŒŃƒ ĐșĐŸĐŒĐż'ютДрі піЮ час Ń€ĐŸĐ·Ń€ĐŸĐ±ĐșĐž - цД ĐœĐ°Đ·ĐžĐČається Đ±Đ»ĐŸĐșуĐČĐ°ĐœĐœŃĐŒ +* **Đ’ŃŃ‚Đ°ĐœĐŸĐČлюĐČато Python** ĐŽĐ»Ń ĐČас, ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ· Ń€Ń–Đ·ĐœĐžĐŒĐž ĐČĐ”Ń€ŃŃ–ŃĐŒĐž +* ĐšĐ”Ń€ŃƒĐČато **ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœĐžĐŒ ŃĐ”Ń€Đ”ĐŽĐŸĐČĐžŃ‰Đ”ĐŒ** ĐČашох ĐżŃ€ĐŸŃ”ĐșтіĐČ +* Đ’ŃŃ‚Đ°ĐœĐŸĐČлюĐČато **паĐșДтО** +* ĐšĐ”Ń€ŃƒĐČато **Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃĐŒĐž і ĐČĐ”Ń€ŃŃ–ŃĐŒĐž** паĐșДтіĐČ Ńƒ ĐČĐ°ŃˆĐŸĐŒŃƒ ĐżŃ€ĐŸŃ”Đșті +* Đ“Đ°Ń€Đ°ĐœŃ‚ŃƒĐČато, Ń‰ĐŸ у ĐČас є **Ń‚ĐŸŃ‡ĐœĐžĐč** ĐœĐ°Đ±Ń–Ń€ паĐșДтіĐČ Ń– ĐČДрсіĐč ĐŽĐ»Ń ĐČŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœŃ, ĐČĐșĐ»ŃŽŃ‡ĐœĐŸ Đ· Ń—Ń…ĐœŃ–ĐŒĐž Đ·Đ°Đ»Đ”Đ¶ĐœĐŸŃŃ‚ŃĐŒĐž, Ń‰ĐŸĐ± ĐČĐž булО пДĐČĐœŃ–, Ń‰ĐŸ Đ·ĐŒĐŸĐ¶Đ”Ń‚Đ” Đ·Đ°ĐżŃƒŃŃ‚ĐžŃ‚Đž ĐČаш ĐżŃ€ĐŸŃ”Đșт у ĐżŃ€ĐŸĐŽĐ°ĐșŃˆĐ”ĐœŃ– Ń‚ĐŸŃ‡ĐœĐŸ таĐș ŃĐ°ĐŒĐŸ, яĐș і ĐœĐ° ĐČĐ°ŃˆĐŸĐŒŃƒ ĐșĐŸĐŒĐż'ютДрі піЮ час Ń€ĐŸĐ·Ń€ĐŸĐ±ĐșĐž - цД ĐœĐ°Đ·ĐžĐČається **Đ±Đ»ĐŸĐșуĐČĐ°ĐœĐœŃĐŒ** * І Đ±Đ°ĐłĐ°Ń‚ĐŸ Ń–ĐœŃˆĐŸĐłĐŸ ## Đ’ĐžŃĐœĐŸĐČĐŸĐș { #conclusion } -ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČсД цД ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Đ»Đž Đč Đ·Ń€ĐŸĐ·ŃƒĐŒŃ–Đ»Đž, тДпДр ĐČĐž Đ·ĐœĐ°Ń”Ń‚Đ” Đ·ĐœĐ°Ń‡ĐœĐŸ Đ±Ń–Đ»ŃŒŃˆĐ” ĐżŃ€ĐŸ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœŃ– ŃĐ”Ń€Đ”ĐŽĐŸĐČоща, ĐœŃ–Đ¶ Đ±Đ°ĐłĐ°Ń‚ĐŸ Ń€ĐŸĐ·Ń€ĐŸĐ±ĐœĐžĐșіĐČ. đŸ€“ +ĐŻĐșŃ‰ĐŸ ĐČĐž ĐČсД цД ĐżŃ€ĐŸŃ‡ĐžŃ‚Đ°Đ»Đž Đč Đ·Ń€ĐŸĐ·ŃƒĐŒŃ–Đ»Đž, тДпДр **ĐČĐž Đ·ĐœĐ°Ń”Ń‚Đ” Đ·ĐœĐ°Ń‡ĐœĐŸ Đ±Ń–Đ»ŃŒŃˆĐ”** ĐżŃ€ĐŸ ĐČŃ–Ń€Ń‚ŃƒĐ°Đ»ŃŒĐœŃ– ŃĐ”Ń€Đ”ĐŽĐŸĐČоща, ĐœŃ–Đ¶ Đ±Đ°ĐłĐ°Ń‚ĐŸ Ń€ĐŸĐ·Ń€ĐŸĐ±ĐœĐžĐșіĐČ. đŸ€“ -Đ—ĐœĐ°ĐœĐœŃ цох ЎДталДĐč, ĐœĐ°ĐčŃ–ĐŒĐŸĐČŃ–Ń€ĐœŃ–ŃˆĐ”, ŃŃ‚Đ°ĐœĐ” ĐČ ĐżŃ€ĐžĐłĐŸĐŽŃ– ĐČ ĐŒĐ°ĐčĐ±ŃƒŃ‚ĐœŃŒĐŸĐŒŃƒ, ĐșĐŸĐ»Đž ĐČĐž ĐœĐ°Đ»Đ°ĐłĐŸĐŽĐ¶ŃƒĐČĐ°Ń‚ĐžĐŒĐ”Ń‚Đ” Ń‰ĐŸŃŃŒ, Ń‰ĐŸ ĐČĐžĐłĐ»ŃĐŽĐ°Ń” сĐșĐ»Đ°ĐŽĐœĐžĐŒ, алД ĐČĐž Đ·ĐœĐ°Ń‚ĐžĐŒĐ”Ń‚Đ”, яĐș усД працює «піЎ ĐșĐ°ĐżĐŸŃ‚ĐŸĐŒÂ». 😎 +Đ—ĐœĐ°ĐœĐœŃ цох ЎДталДĐč, ĐœĐ°ĐčŃ–ĐŒĐŸĐČŃ–Ń€ĐœŃ–ŃˆĐ”, ŃŃ‚Đ°ĐœĐ” ĐČ ĐżŃ€ĐžĐłĐŸĐŽŃ– ĐČ ĐŒĐ°ĐčĐ±ŃƒŃ‚ĐœŃŒĐŸĐŒŃƒ, ĐșĐŸĐ»Đž ĐČĐž ĐœĐ°Đ»Đ°ĐłĐŸĐŽĐ¶ŃƒĐČĐ°Ń‚ĐžĐŒĐ”Ń‚Đ” Ń‰ĐŸŃŃŒ, Ń‰ĐŸ ĐČĐžĐłĐ»ŃĐŽĐ°Ń” сĐșĐ»Đ°ĐŽĐœĐžĐŒ, алД ĐČĐž Đ·ĐœĐ°Ń‚ĐžĐŒĐ”Ń‚Đ”, **яĐș усД працює «піЎ ĐșĐ°ĐżĐŸŃ‚ĐŸĐŒÂ»**. 😎 From 2b5cf661cab461072b910f26bdc8d2e6512abe13 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 13:27:56 +0000 Subject: [PATCH 272/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 4f71bbb5a..7aafc7f50 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for uk (update-outdated). PR [#15900](https://github.com/fastapi/fastapi/pull/15900) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ko (update-outdated). PR [#15890](https://github.com/fastapi/fastapi/pull/15890) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ru (update-outdated). PR [#15894](https://github.com/fastapi/fastapi/pull/15894) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ko (add-missing). PR [#15888](https://github.com/fastapi/fastapi/pull/15888) by [@tiangolo](https://github.com/tiangolo). From 6119d875861a1ff1d4f4352fe6c87c42a8d820dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 15:35:53 +0200 Subject: [PATCH 273/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20zh=20(update-outdated)=20(#15898)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] Co-authored-by: Yurii Motov --- docs/zh/docs/_llm-test.md | 488 +++++++++--------- .../docs/advanced/additional-status-codes.md | 4 +- .../zh/docs/advanced/advanced-dependencies.md | 1 + docs/zh/docs/advanced/dataclasses.md | 1 + docs/zh/docs/advanced/events.md | 1 + docs/zh/docs/advanced/generate-clients.md | 26 +- docs/zh/docs/advanced/json-base64-bytes.md | 8 +- docs/zh/docs/advanced/openapi-callbacks.md | 106 ++-- .../advanced/response-change-status-code.md | 2 +- docs/zh/docs/advanced/response-cookies.md | 34 +- docs/zh/docs/advanced/response-headers.md | 1 + .../docs/advanced/security/oauth2-scopes.md | 4 +- docs/zh/docs/advanced/settings.md | 6 +- docs/zh/docs/advanced/stream-data.md | 10 +- docs/zh/docs/advanced/wsgi.md | 1 + docs/zh/docs/alternatives.md | 11 +- docs/zh/docs/async.md | 14 +- docs/zh/docs/deployment/cloud.md | 2 +- docs/zh/docs/deployment/concepts.md | 166 +++--- docs/zh/docs/deployment/docker.md | 1 + docs/zh/docs/deployment/https.md | 9 +- docs/zh/docs/deployment/manually.md | 26 +- docs/zh/docs/editor-support.md | 2 +- docs/zh/docs/environment-variables.md | 1 + docs/zh/docs/features.md | 28 +- docs/zh/docs/help-fastapi.md | 4 +- docs/zh/docs/how-to/configure-swagger-ui.md | 6 +- .../docs/how-to/custom-request-and-route.md | 4 +- docs/zh/docs/how-to/graphql.md | 2 +- ...migrate-from-pydantic-v1-to-pydantic-v2.md | 22 +- .../docs/how-to/separate-openapi-schemas.md | 1 + docs/zh/docs/index.md | 32 +- docs/zh/docs/project-generation.md | 1 + docs/zh/docs/python-types.md | 44 +- docs/zh/docs/tutorial/bigger-applications.md | 20 +- docs/zh/docs/tutorial/body-nested-models.md | 4 +- docs/zh/docs/tutorial/body.md | 12 +- docs/zh/docs/tutorial/debugging.md | 6 +- .../dependencies/dependencies-with-yield.md | 3 +- docs/zh/docs/tutorial/extra-data-types.md | 8 +- docs/zh/docs/tutorial/extra-models.md | 1 + docs/zh/docs/tutorial/first-steps.md | 1 + docs/zh/docs/tutorial/handling-errors.md | 18 +- docs/zh/docs/tutorial/index.md | 24 +- docs/zh/docs/tutorial/metadata.md | 26 +- .../tutorial/path-operation-configuration.md | 1 + .../tutorial/query-params-str-validations.md | 1 + docs/zh/docs/tutorial/query-params.md | 1 + docs/zh/docs/tutorial/request-files.md | 2 +- docs/zh/docs/tutorial/request-forms.md | 10 +- docs/zh/docs/tutorial/response-status-code.md | 8 +- docs/zh/docs/tutorial/schema-extra-example.md | 44 +- docs/zh/docs/tutorial/security/first-steps.md | 1 + .../tutorial/security/get-current-user.md | 6 +- docs/zh/docs/tutorial/security/oauth2-jwt.md | 4 +- .../docs/tutorial/security/simple-oauth2.md | 8 +- docs/zh/docs/tutorial/sql-databases.md | 8 +- docs/zh/docs/tutorial/static-files.md | 8 + docs/zh/docs/tutorial/testing.md | 20 +- docs/zh/docs/virtual-environments.md | 2 +- 60 files changed, 675 insertions(+), 641 deletions(-) diff --git a/docs/zh/docs/_llm-test.md b/docs/zh/docs/_llm-test.md index 0da76d43c..5748c0900 100644 --- a/docs/zh/docs/_llm-test.md +++ b/docs/zh/docs/_llm-test.md @@ -37,7 +37,7 @@ æ˜šć€©ïŒŒæˆ‘çš„æœ‹ć‹ć†™é“ïŒš"ćŠ‚æžœäœ æŠŠ incorrectly 拌ćŻčäș†ïŒŒäœ ć°±æŠŠćꃿ‹Œé”™äș†"ă€‚æˆ‘ć›žç­”ïŒš"æČĄé”™ïŒŒäœ† 'incorrectly' é”™çš„äžæ˜Ż '"incorrectly"'"。 -/// note +/// note | æłšæ„ LLM ćŸˆćŻèƒœäŒšæŠŠèż™æź”çż»é”™ă€‚æˆ‘ä»ŹćȘć…łćżƒćœšé‡æ–°çż»èŻ‘æ—¶ćźƒæ˜ŻćŠèƒœäżæŒäżźæ­ŁćŽçš„èŻ‘æ–‡ă€‚ @@ -124,24 +124,24 @@ works(foo="bar") # èż™ćŻèĄŒ 🎉 //// tab | æ”‹èŻ• -/// note -Some text +/// note | æłšæ„ +侀äș›æ–‡æœŹ /// /// note | æŠ€æœŻç»†èŠ‚ -Some text +侀äș›æ–‡æœŹ /// -/// tip -Some text +/// tip | 提ç€ș +侀äș›æ–‡æœŹ /// -/// warning -Some text +/// warning | è­Šć‘Š +侀äș›æ–‡æœŹ /// -/// danger -Some text +/// danger | ć±é™© +侀äș›æ–‡æœŹ /// //// @@ -213,7 +213,7 @@ Some text ## HTML "dfn" 慃箠 { #html-dfn-elements } -* 集矀 +* 集矀 * æ·±ćșŠć­Šäč  ## æ ‡éą˜ { #headings } @@ -222,15 +222,15 @@ Some text ### ćŒ€ć‘ Web ćș”甚——教皋 { #develop-a-webapp-a-tutorial } -Hello. +äœ ć„œă€‚ ### ç±»ćž‹æç€șäžŽæłšè§Ł { #type-hints-and-annotations } -Hello again. +ć†æŹĄäœ ć„œă€‚ ### è¶…ç±»äžŽć­ç±» { #super-and-subclasses } -Hello again. +ć†æŹĄäœ ć„œă€‚ //// @@ -248,241 +248,241 @@ Hello again. //// tab | æ”‹èŻ• -* you -* your +* 䜠 +* 䜠的 -* e.g. -* etc. +* äŸ‹ćŠ‚ +* 等 -* `foo` as an `int` -* `bar` as a `str` -* `baz` as a `list` +* 䜜äžș `int` 的 `foo` +* 䜜äžș `str` 的 `bar` +* 䜜äžș `list` 的 `baz` -* the Tutorial - User guide -* the Advanced User Guide -* the SQLModel docs -* the API docs -* the automatic docs +* 教皋 - ç”šæˆ·æŒ‡ć— +* 高çș§ç”šæˆ·æŒ‡ć— +* SQLModel æ–‡æĄŁ +* API æ–‡æĄŁ +* è‡ȘćŠšæ–‡æĄŁ -* Data Science -* Deep Learning -* Machine Learning -* Dependency Injection -* HTTP Basic authentication +* æ•°æźç§‘ć­Š +* æ·±ćșŠć­Šäč  +* æœș晹歩äč  +* äŸè”–æłšć…„ +* HTTP Basic èź€èŻ * HTTP Digest -* ISO format -* the JSON Schema standard -* the JSON schema -* the schema definition -* Password Flow -* Mobile - -* deprecated -* designed -* invalid -* on the fly -* standard -* default -* case-sensitive -* case-insensitive - -* to serve the application -* to serve the page - -* the app -* the application - -* the request -* the response -* the error response - -* the path operation -* the path operation decorator -* the path operation function - -* the body -* the request body -* the response body -* the JSON body -* the form body -* the file body -* the function body - -* the parameter -* the body parameter -* the path parameter -* the query parameter -* the cookie parameter -* the header parameter -* the form parameter -* the function parameter - -* the event -* the startup event -* the startup of the server -* the shutdown event -* the lifespan event - -* the handler -* the event handler -* the exception handler -* to handle - -* the model -* the Pydantic model -* the data model -* the database model -* the form model -* the model object - -* the class -* the base class -* the parent class -* the subclass -* the child class -* the sibling class -* the class method - -* the header -* the headers -* the authorization header -* the `Authorization` header -* the forwarded header - -* the dependency injection system -* the dependency -* the dependable -* the dependant - -* I/O bound -* CPU bound -* concurrency -* parallelism -* multiprocessing - -* the env var -* the environment variable -* the `PATH` -* the `PATH` variable - -* the authentication -* the authentication provider -* the authorization -* the authorization form -* the authorization provider -* the user authenticates -* the system authenticates the user - -* the CLI -* the command line interface - -* the server -* the client - -* the cloud provider -* the cloud service - -* the development -* the development stages - -* the dict -* the dictionary -* the enumeration -* the enum -* the enum member - -* the encoder -* the decoder -* to encode -* to decode - -* the exception -* to raise - -* the expression -* the statement - -* the frontend -* the backend - -* the GitHub discussion -* the GitHub issue - -* the performance -* the performance optimization - -* the return type -* the return value - -* the security -* the security scheme - -* the task -* the background task -* the task function - -* the template -* the template engine - -* the type annotation -* the type hint - -* the server worker -* the Uvicorn worker -* the Gunicorn Worker -* the worker process -* the worker class -* the workload - -* the deployment -* to deploy - -* the SDK -* the software development kit - -* the `APIRouter` -* the `requirements.txt` -* the Bearer Token -* the breaking change -* the bug -* the button -* the callable -* the code -* the commit -* the context manager -* the coroutine -* the database session -* the disk -* the domain -* the engine -* the fake X -* the HTTP GET method -* the item -* the library -* the lifespan -* the lock -* the middleware -* the mobile application -* the module -* the mounting -* the network -* the origin -* the override -* the payload -* the processor -* the property -* the proxy -* the pull request -* the query -* the RAM -* the remote machine -* the status code -* the string -* the tag -* the web framework -* the wildcard -* to return -* to validate +* ISO æ ŒćŒ +* JSON Schema æ ‡ć‡† +* JSON schema +* schema 漚äč‰ +* ćŻ†ç æ” +* 移抚端 + +* ć·ČćŒƒç”š +* èźŸèźĄçš„ +* 无效 +* ćŠšæ€ćœ° +* æ ‡ć‡† +* é»˜èź€ +* ćŒșćˆ†ć€§ć°ć†™ +* 䞍ćŒșćˆ†ć€§ć°ć†™ + +* äžșćș”ç”šæäŸ›æœćŠĄ +* äžșéĄ”éąæäŸ›æœćŠĄ + +* ćș”甚 +* ćș”甚皋ćș + +* èŻ·æ±‚ +* 操ćș” +* é”™èŻŻć“ćș” + +* è·ŻćŸ„æ“äœœ +* è·ŻćŸ„æ“äœœèŁ…é„°ć™š +* è·ŻćŸ„æ“äœœć‡œæ•° + +* èŻ·æ±‚äœ“ +* èŻ·æ±‚äœ“ +* 操ćș”䜓 +* JSON èŻ·æ±‚äœ“ +* èĄšć•äœ“ +* 文件䜓 +* ć‡œæ•°äœ“ + +* ć‚æ•° +* èŻ·æ±‚äœ“ć‚æ•° +* è·ŻćŸ„ć‚æ•° +* æŸ„èŻąć‚æ•° +* Cookie ć‚æ•° +* Header ć‚æ•° +* èĄšć•ć‚æ•° +* ć‡œæ•°ć‚æ•° + +* äș‹ä»¶ +* 搯抹äș‹ä»¶ +* æœćŠĄć™šćŻćŠš +* 慳闭äș‹ä»¶ +* lifespan äș‹ä»¶ + +* 怄理晚 +* äș‹ä»¶ć€„理晚 +* ćŒ‚ćžžć€„ç†ć™š +* 怄理 + +* æšĄćž‹ +* Pydantic æšĄćž‹ +* æ•°æźæšĄćž‹ +* æ•°æźćș“æšĄćž‹ +* èĄšć•æšĄćž‹ +* æšĄćž‹ćŻčè±Ą + +* ç±» +* ćŸșç±» +* 父类 +* 歐类 +* 歐类 +* ć…„ćŒŸç±» +* ç±»æ–čæł• + +* Header +* Headers +* 授权 Header +* `Authorization` header +* èœŹć‘ Header + +* äŸè”–æłšć…„çł»ç»Ÿ +* 䟝蔖éĄč +* ćŻäŸè”–éĄč +* 䟝蔖æ–č + +* I/O 毆集枋 +* CPU 毆集枋 +* ćč¶ć‘ +* ćč¶èĄŒ +* ć€šèż›çš‹ + +* 环汃揘量 +* 环汃揘量 +* `PATH` +* `PATH` 揘量 + +* èź€èŻ +* èź€èŻæäŸ›æ–č +* 授权 +* æŽˆæƒèĄšć• +* 授权提䟛æ–č +* ç”šæˆ·èż›èĄŒèź€èŻ +* çł»ç»ŸćŻčç”šæˆ·èż›èĄŒèź€èŻ + +* CLI +* ć‘œä»€èĄŒç•Œéą + +* æœćŠĄć™š +* ćźąæˆ·ç«Ż + +* äș‘æœćŠĄæäŸ›ć•† +* äș‘æœćŠĄ + +* ćŒ€ć‘ +* ćŒ€ć‘é˜¶æź” + +* dict +* 歗慾 +* 枚䞟 +* 枚䞟 +* æžšäžŸæˆć‘˜ + +* çŒ–ç ć™š +* è§Łç ć™š +* 猖码 +* è§Łç  + +* ćŒ‚ćžž +* 抛ć‡ș + +* èĄšèŸŸćŒ +* èŻ­ć„ + +* ć‰ç«Ż +* 搎端 + +* GitHub èźšèźș +* GitHub issue + +* 性胜 +* æ€§èƒœäŒ˜ćŒ– + +* èż”ć›žç±»ćž‹ +* èż”ć›žć€Œ + +* 漉慹 +* 漉慹æ–čæĄˆ + +* 任报 +* ćŽć°ä»»ćŠĄ +* ä»»ćŠĄć‡œæ•° + +* æšĄæż +* æšĄæżćŒ•æ“Ž + +* ç±»ćž‹æłšè§Ł +* ç±»ćž‹æç€ș + +* æœćŠĄć™š worker +* Uvicorn worker +* Gunicorn Worker +* worker èż›çš‹ +* worker ç±» +* ć·„äœœèŽŸèœœ + +* 郚çœČ +* 郚çœČ + +* SDK +* èœŻä»¶ćŒ€ć‘ć·„ć…·ćŒ… + +* `APIRouter` +* `requirements.txt` +* Bearer Token +* ç Žćæ€§ć˜æ›Ž +* bug +* æŒ‰é’ź +* ćŻè°ƒç”šćŻčè±Ą +* 代码 +* 提äș€ +* äžŠäž‹æ–‡çźĄç†ć™š +* 捏繋 +* æ•°æźćș“äŒšèŻ +* 磁盘 +* 柟損 +* ćŒ•æ“Ž +* è™šć‡ X +* HTTP GET æ–čæł• +* éĄč +* ćș“ +* ç”Ÿć‘œć‘šæœŸ +* 锁 +* äž­é—Žä»¶ +* 移抚ćș”甚 +* æšĄć— +* 挂蜜 +* 眑络 +* æș +* 芆盖 +* 蜜荷 +* 怄理晚 +* ć±žæ€§ +* 代理 +* Pull Request +* æŸ„èŻą +* RAM +* èżœçš‹æœș晹 +* 状态码 +* 歗笩äžČ +* 标筟 +* Web æĄ†æž¶ +* 通配笩 +* èż”ć›ž +* æ ĄéȘŒ //// diff --git a/docs/zh/docs/advanced/additional-status-codes.md b/docs/zh/docs/advanced/additional-status-codes.md index af212ad8b..0f2e3d2ee 100644 --- a/docs/zh/docs/advanced/additional-status-codes.md +++ b/docs/zh/docs/advanced/additional-status-codes.md @@ -16,7 +16,7 @@ {* ../../docs_src/additional_status_codes/tutorial001_an_py310.py hl[4,25] *} -/// warning +/// warning | è­Šć‘Š ćœ“äœ ç›ŽæŽ„èż”ć›žäž€äžȘćƒäžŠéąäŸ‹ć­äž­çš„ `Response` ćŻčè±Ąæ—¶ïŒŒćźƒäŒšç›ŽæŽ„èż”ć›žă€‚ @@ -38,4 +38,4 @@ ćŠ‚æžœäœ ç›ŽæŽ„èż”ć›žéąć€–çš„çŠ¶æ€ç ć’Œć“ćș”ïŒŒćźƒä»ŹäžäŒšćŒ…ć«ćœš OpenAPI æ–čæĄˆïŒˆAPI æ–‡æĄŁïŒ‰äž­ïŒŒć› äžș FastAPI æČĄćŠžæł•éą„ć…ˆçŸ„é“äœ èŠèż”ć›žä»€äčˆă€‚ -äœ†æ˜Żäœ ćŻä»„äœżç”š [éąć€–çš„ć“ćș”](additional-responses.md) ćœšä»Łç äž­èź°ćœ•èż™äș›ć†…ćźč。 +äœ†æ˜Żäœ ćŻä»„äœżç”šïŒš[éąć€–çš„ć“ćș”](additional-responses.md)ïŒŒćœšä»Łç äž­èź°ćœ•èż™äș›ć†…ćźč。 diff --git a/docs/zh/docs/advanced/advanced-dependencies.md b/docs/zh/docs/advanced/advanced-dependencies.md index da299a6bf..12f2616c0 100644 --- a/docs/zh/docs/advanced/advanced-dependencies.md +++ b/docs/zh/docs/advanced/advanced-dependencies.md @@ -1,5 +1,6 @@ # 高çș§äŸè”–éĄč { #advanced-dependencies } + ## ć‚æ•°ćŒ–çš„äŸè”–éĄč { #parameterized-dependencies } ç›źć‰æˆ‘ä»Źçœ‹ćˆ°çš„äŸè”–éĄčéƒœæ˜Żć›șćźšçš„ć‡œæ•°æˆ–ç±»ă€‚ diff --git a/docs/zh/docs/advanced/dataclasses.md b/docs/zh/docs/advanced/dataclasses.md index a46615286..df94a7de7 100644 --- a/docs/zh/docs/advanced/dataclasses.md +++ b/docs/zh/docs/advanced/dataclasses.md @@ -1,5 +1,6 @@ # äœżç”šæ•°æźç±» { #using-dataclasses } + FastAPI ćŸșäșŽ **Pydantic** 构ć»ș我ć·Čç»ć‘äœ ć±•ç€șèż‡ćŠ‚äœ•äœżç”š Pydantic æšĄćž‹ćŁ°æ˜ŽèŻ·æ±‚äžŽć“ćș”。 䜆 FastAPI ä蟿”ŻæŒä»„盾搌æ–čćŒäœżç”š [`dataclasses`](https://docs.python.org/3/library/dataclasses.html) diff --git a/docs/zh/docs/advanced/events.md b/docs/zh/docs/advanced/events.md index e1bb2ed60..49d497d3d 100644 --- a/docs/zh/docs/advanced/events.md +++ b/docs/zh/docs/advanced/events.md @@ -1,5 +1,6 @@ # ç”Ÿć‘œć‘šæœŸäș‹ä»¶ { #lifespan-events } + äœ ćŻä»„ćźšäč‰ćœšćș”甚**搯抹**ć‰æ‰§èĄŒçš„é€»èŸ‘ïŒˆä»Łç ïŒ‰ă€‚èż™æ„ć‘łç€ćœšćș”甚**ćŒ€ć§‹æŽ„æ”¶èŻ·æ±‚**äč‹ć‰ïŒŒèż™äș›ä»Łç ćȘäŒšèą«æ‰§èĄŒ**äž€æŹĄ**。 ćŒæ ·ćœ°ïŒŒäœ ćŻä»„ćźšäč‰ćœšćș”甚**慳闭**时ćș”æ‰§èĄŒçš„é€»èŸ‘ă€‚ćœšèż™ç§æƒ…ć†”äž‹ïŒŒèż™æź”ä»Łç ć°†ćœš**ć€„ç†ćŻèƒœçš„ć€šæŹĄèŻ·æ±‚ćŽ**æ‰§èĄŒ**äž€æŹĄ**。 diff --git a/docs/zh/docs/advanced/generate-clients.md b/docs/zh/docs/advanced/generate-clients.md index 9feaf6cf5..dd15f0e9c 100644 --- a/docs/zh/docs/advanced/generate-clients.md +++ b/docs/zh/docs/advanced/generate-clients.md @@ -20,20 +20,6 @@ FastAPI 䌚è‡ȘćŠšç”Ÿæˆ **OpenAPI 3.1** è§„èŒƒïŒŒć› æ­€äœ äœżç”šçš„ä»»äœ•ć·„ć…· /// -## 杄è‡Ș FastAPI è”žćŠ©ć•†çš„ SDK ç”Ÿæˆć™š { #sdk-generators-from-fastapi-sponsors } - -æœŹèŠ‚ä»‹ç»çš„æ˜Żç”±è”žćŠ© FastAPI çš„ć…ŹćžæäŸ›çš„ă€ć…·ć€‡**éŁŽé™©æŠ•è”„èƒŒæ™Ż**或**ć…Źćžæ”ŻæŒ**的æ–čæĄˆă€‚èż™äș›äș§ć“ćœšé«˜èŽšé‡ç”Ÿæˆçš„ SDK äč‹äžŠïŒŒæäŸ›äș†**æ›Žć€šç‰č性**撌**集成**。 - -é€šèż‡ ✹ [**è”žćŠ© FastAPI**](../help-fastapi.md#sponsor-the-author) âœšïŒŒèż™äș›ć…ŹćžćžźćŠ©çĄźäżæĄ†æž¶ćŠć…¶**生态**äżæŒć„ćș·ćč¶äž”**ćŻæŒç»­**。 - -ä»–ä»Źçš„è”žćŠ©äčŸäœ“现äș†ćŻč FastAPI **瀟ćŒș**äčŸć°±æ˜Żäœ ïŒ‰çš„高ćșŠæ‰żèŻșïŒŒäžä»…ć…łæłšæäŸ›**äŒ˜ç§€çš„æœćŠĄ**ä蟿”ŻæŒäž€äžȘ**恄棟䞔çčèŁçš„æĄ†æž¶**——FastAPI。🙇 - -äŸ‹ćŠ‚ïŒŒäœ ćŻä»„ć°èŻ•ïŒš - -* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) - -慶䞭䞀äș›æ–čæĄˆäčŸćŻèƒœæ˜ŻćŒ€æșçš„æˆ–æäŸ›ć…èŽč求çș§ïŒŒäœ ćŻä»„äžèŠ±é’±ć°±ć…ˆèŻ•ç”šă€‚ć…¶ä»–ć•†äžš SDK ç”Ÿæˆć™šäčŸćŻćœšçœ‘äžŠæ‰Ÿćˆ°ă€‚đŸ€“ - ## 戛ć»ș侀äžȘ TypeScript SDK { #create-a-typescript-sdk } ć…ˆä»Žäž€äžȘ缀捕的 FastAPI ćș”ç”šćŒ€ć§‹ïŒš @@ -56,7 +42,7 @@ OpenAPI äž­ćŒ…ć«çš„èż™äș›æšĄćž‹äżĄæŻć°±æ˜Żç”šäșŽ**ç”Ÿæˆćźąæˆ·ç«Żä»Łç **的 ### Hey API { #hey-api } -ćœ“æˆ‘ä»Źæœ‰äș†ćžŠæšĄćž‹çš„ FastAPI ćș”ç”šćŽïŒŒćŻä»„äœżç”š Hey API 杄生成 TypeScript ćźąæˆ·ç«Żă€‚æœ€ćż«çš„æ–čćŒæ˜Żé€šèż‡ npx +ćœ“æˆ‘ä»Źæœ‰äș†ćžŠæšĄćž‹çš„ FastAPI ćș”ç”šćŽïŒŒćŻä»„äœżç”š Hey API 杄生成 TypeScript ćźąæˆ·ç«Żă€‚æœ€ćż«çš„æ–čćŒæ˜Żé€šèż‡ npx。 ```sh npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client @@ -119,9 +105,9 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client ItemsService.createItemItemsPost({name: "Plumbus", price: 5}) ``` -...èż™æ˜Żć› äžșćźąæˆ·ç«Żç”Ÿæˆć™šäŒšæŠŠæŻäžȘ*è·ŻćŸ„æ“äœœ*的 OpenAPI 憅郹**操䜜 IDoperation ID**甚䜜æ–čæł•ćçš„äž€éƒšćˆ†ă€‚ +...èż™æ˜Żć› äžșćźąæˆ·ç«Żç”Ÿæˆć™šäŒšäœżç”šæŻäžȘ*è·ŻćŸ„æ“äœœ*的 OpenAPI 憅郹**操䜜 IDoperation ID**。 -OpenAPI èŠæ±‚æŻäžȘ操䜜 ID ćœšæ‰€æœ‰*è·ŻćŸ„æ“äœœ*äž­éƒœæ˜Żć”Żäž€çš„ïŒŒć› æ­€ FastAPI äŒšäœżç”š**ć‡œæ•°ć**、**è·ŻćŸ„**撌**HTTP æ–čæł•/操䜜**杄生成操䜜 IDïŒŒä»„çĄźäżć…¶ć”Żäž€æ€§ă€‚ +OpenAPI èŠæ±‚æŻäžȘ操䜜 ID ćœšæ‰€æœ‰*è·ŻćŸ„æ“äœœ*äž­éƒœæ˜Żć”Żäž€çš„ïŒŒć› æ­€ FastAPI äŒšäœżç”š**ć‡œæ•°ć**、**è·ŻćŸ„**撌**HTTP æ–čæł•/操䜜**杄生成操䜜 IDïŒŒć› äžșèż™æ ·ćŻä»„çĄźäżæ“äœœ ID æ˜Żć”Żäž€çš„ă€‚ æŽ„äž‹æ„æˆ‘äŒšć‘ŠèŻ‰äœ ćŠ‚äœ•æ”čèż›ă€‚đŸ€“ @@ -193,9 +179,9 @@ npx @hey-api/openapi-ts -i ./openapi.json -o src/client äœżç”šè‡ȘćŠšç”Ÿæˆçš„ćźąæˆ·ç«Żæ—¶ïŒŒäœ äŒšèŽ·ćŸ—ä»„äž‹ć†…ćźč的**è‡ȘćŠšèĄ„ć…š** -* æ–čæł• -* èŻ·æ±‚äœ“äž­çš„æ•°æźă€æŸ„èŻąć‚æ•°ç­‰ -* 操ćș”æ•°æź +* æ–čæł•。 +* èŻ·æ±‚äœ“äž­çš„æ•°æźă€æŸ„èŻąć‚æ•°ç­‰ă€‚ +* 操ćș”æ•°æźă€‚ äœ èż˜äŒšäžșæ‰€æœ‰ć†…ćźčèŽ·ćŸ—**ć†…è”é”™èŻŻ**。 diff --git a/docs/zh/docs/advanced/json-base64-bytes.md b/docs/zh/docs/advanced/json-base64-bytes.md index 7792282c7..040957c69 100644 --- a/docs/zh/docs/advanced/json-base64-bytes.md +++ b/docs/zh/docs/advanced/json-base64-bytes.md @@ -4,7 +4,7 @@ ## Base64 䞎文件 { #base64-vs-files } -èŻ·ć…ˆè€ƒè™‘æ˜ŻćŠćŻä»„äœżç”š [èŻ·æ±‚æ–‡ä»¶](../tutorial/request-files.md) 杄䞊䌠äșŒèż›ćˆ¶æ•°æźïŒŒćč¶äœżç”š [è‡Ș漚äč‰ć“ćș” - FileResponse](./custom-response.md#fileresponse--fileresponse-) æ„ć‘é€äșŒèż›ćˆ¶æ•°æźïŒŒè€Œäžæ˜ŻæŠŠćźƒçŒ–ç èż› JSON。 +èŻ·ć…ˆè€ƒè™‘æ˜ŻćŠćŻä»„äœżç”š [èŻ·æ±‚æ–‡ä»¶](../tutorial/request-files.md) 杄䞊䌠äșŒèż›ćˆ¶æ•°æźïŒŒćč¶äœżç”š [è‡Ș漚äč‰ć“ćș” - FileResponse](./custom-response.md#fileresponse) æ„ć‘é€äșŒèż›ćˆ¶æ•°æźïŒŒè€Œäžæ˜ŻæŠŠćźƒçŒ–ç èż› JSON。 JSON ćȘèƒœćŒ…ć« UTF-8 çŒ–ç çš„ć­—çŹŠäžČïŒŒć› æ­€æ— æł•ç›ŽæŽ„ćŒ…ć«ćŽŸć§‹ć­—èŠ‚ă€‚ @@ -14,7 +14,7 @@ Base64 ćŻä»„æŠŠäșŒèż›ćˆ¶æ•°æźçŒ–码äžș歗笩äžČ䜆äžșæ­€äŒšäœżç”šæŻ”ćŽŸć§‹ ## Pydantic `bytes` { #pydantic-bytes } -äœ ćŻä»„ćŁ°æ˜ŽćžŠæœ‰ `bytes` ć­—æź”çš„ Pydantic æšĄćž‹ïŒŒç„¶ćŽćœšæšĄćž‹é…çœźäž­äœżç”š `val_json_bytes` æŒ‡ćźšç”š base64 杄éȘŒèŻèŸ“ć…„çš„ JSON æ•°æźïŒ›äœœäžșéȘŒèŻçš„äž€éƒšćˆ†ïŒŒćźƒäŒšć°†èŻ„ base64 歗笩äžČè§Łç äžșć­—èŠ‚ă€‚ +äœ ćŻä»„ćŁ°æ˜ŽćžŠæœ‰ `bytes` ć­—æź”çš„ Pydantic æšĄćž‹ïŒŒç„¶ćŽćœšæšĄćž‹é…çœźäž­äœżç”š `val_json_bytes` æŒ‡ćźšç”š base64 杄*éȘŒè݁*èŸ“ć…„çš„ JSON æ•°æźïŒ›äœœäžșéȘŒèŻçš„äž€éƒšćˆ†ïŒŒćźƒäŒšć°†èŻ„ base64 歗笩äžČè§Łç äžșć­—èŠ‚ă€‚ {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} @@ -52,12 +52,12 @@ Base64 ćŻä»„æŠŠäșŒèż›ćˆ¶æ•°æźçŒ–码äžș歗笩äžČ䜆äžșæ­€äŒšäœżç”šæŻ”ćŽŸć§‹ ## 甹äșŽèŸ“ć‡șæ•°æźçš„ Pydantic `bytes` { #pydantic-bytes-for-output-data } -ćŻčäșŽèŸ“ć‡șæ•°æźïŒŒäœ äčŸćŻä»„ćœšæšĄćž‹é…çœźäž­äžș `bytes` ć­—æź”äœżç”š `ser_json_bytes`Pydantic äŒšćœšç”Ÿæˆ JSON 操ćș”æ—¶ć°†ć­—èŠ‚ä»„ base64 èż›èĄŒćșćˆ—ćŒ–ă€‚ +ćŻčäșŽèŸ“ć‡șæ•°æźïŒŒäœ äčŸćŻä»„ćœšæšĄćž‹é…çœźäž­äžș `bytes` ć­—æź”äœżç”š `ser_json_bytes`Pydantic äŒšćœšç”Ÿæˆ JSON 操ćș”æ—¶ć°†ć­—èŠ‚ä»„ base64 èż›èĄŒ*ćșćˆ—ćŒ–*。 {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *} ## 甹äșŽèŸ“ć…„ć’ŒèŸ“ć‡șæ•°æźçš„ Pydantic `bytes` { #pydantic-bytes-for-input-and-output-data } -ćœ“ç„¶ïŒŒäœ äčŸćŻä»„äœżç”šćŒäž€äžȘé…çœźäș† base64 çš„æšĄćž‹ïŒŒćœšæŽ„æ”¶ć’Œć‘é€ JSON æ•°æźæ—¶ïŒŒćŒæ—¶ć€„ç†èŸ“ć…„ïŒˆäœżç”š `val_json_bytes` èż›èĄŒéȘŒèŻïŒ‰ć’ŒèŸ“ć‡șïŒˆäœżç”š `ser_json_bytes` èż›èĄŒćșćˆ—ćŒ–ïŒ‰ă€‚ +ćœ“ç„¶ïŒŒäœ äčŸćŻä»„äœżç”šćŒäž€äžȘé…çœźäș† base64 çš„æšĄćž‹ïŒŒćœšæŽ„æ”¶ć’Œć‘é€ JSON æ•°æźæ—¶ïŒŒćŒæ—¶ć€„ç†èŸ“ć…„ïŒˆäœżç”š `val_json_bytes` èż›èĄŒ*éȘŒè݁*ïŒ‰ć’ŒèŸ“ć‡șïŒˆäœżç”š `ser_json_bytes` èż›èĄŒ*ćșćˆ—ćŒ–*ïŒ‰ă€‚ {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/zh/docs/advanced/openapi-callbacks.md b/docs/zh/docs/advanced/openapi-callbacks.md index f4f2e7b81..3ca99b980 100644 --- a/docs/zh/docs/advanced/openapi-callbacks.md +++ b/docs/zh/docs/advanced/openapi-callbacks.md @@ -1,35 +1,35 @@ # OpenAPI ć›žè°ƒ { #openapi-callbacks } -æ‚šćŻä»„ćˆ›ć»ș侀äžȘćŒ…ć«*è·ŻćŸ„æ“äœœ*的 APIïŒŒćźƒäŒšè§Šć‘ćŻč戫äșș戛ć»ș的*ć€–éƒš API*çš„èŻ·æ±‚ïŒˆćŸˆćŻèƒœć°±æ˜Żé‚ŁäžȘäŒšâ€œäœżç”šâ€æ‚š API 的搌侀äžȘćŒ€ć‘è€…ïŒ‰ă€‚ +äœ ćŻä»„ćˆ›ć»ș侀äžȘćŒ…ć«*è·ŻćŸ„æ“äœœ*的 APIïŒŒèŻ„*è·ŻćŸ„æ“äœœ*ćŻä»„è§Šć‘ćŻčć…¶ä»–äșș戛ć»ș的*ć€–éƒš API*çš„èŻ·æ±‚ïŒˆćŸˆćŻèƒœć°±æ˜Żé‚ŁäžȘ䌚*äœżç”š*䜠的 API 的搌侀äžȘćŒ€ć‘è€…ïŒ‰ă€‚ -ćœ“æ‚šçš„ API ćș”甚调甚*ć€–éƒš API*æ—¶ïŒŒèż™äžȘèż‡çš‹èą«ç§°äžșâ€œć›žè°ƒâ€ă€‚ć› äžșć€–éƒšćŒ€ć‘è€…çŒ–ć†™çš„èœŻä»¶äŒšć…ˆć‘æ‚šçš„ API ć‘é€èŻ·æ±‚ïŒŒç„¶ćŽæ‚šçš„ API ć†èż›èĄŒ*ć›žè°ƒ*ïŒŒć‘*ć€–éƒš API*ć‘é€èŻ·æ±‚ïŒˆćŸˆćŻèƒœä蟿˜ŻèŻ„ćŒ€ć‘è€…ćˆ›ć»șçš„ïŒ‰ă€‚ +ćœ“äœ çš„ API ćș”甚调甚*ć€–éƒš API*æ—¶ïŒŒèż™äžȘèż‡çš‹èą«ç§°äžșâ€œć›žè°ƒâ€ă€‚ć› äžșć€–éƒšćŒ€ć‘è€…çŒ–ć†™çš„èœŻä»¶äŒšć…ˆć‘äœ çš„ API ć‘é€èŻ·æ±‚ïŒŒç„¶ćŽäœ çš„ API 憍*ć›žè°ƒ*ïŒŒć‘*ć€–éƒš API*ć‘é€èŻ·æ±‚ïŒˆćŸˆćŻèƒœä蟿˜ŻèŻ„ćŒ€ć‘è€…ćˆ›ć»șçš„ïŒ‰ă€‚ -æ­€æ—¶ïŒŒæˆ‘ä»Źéœ€èŠć­˜æĄŁć€–éƒš API 的*äżĄæŻ*ïŒŒæŻ”ćŠ‚ćș”èŻ„æœ‰ć“Șäș›*è·ŻćŸ„æ“äœœ*ïŒŒèŻ·æ±‚äœ“ćș”èŻ„æ˜Żä»€äčˆïŒŒćș”èŻ„èż”ć›žä»€äčˆć“ćș”等。 +ćœšèż™ç§æƒ…ć†”äž‹ïŒŒäœ ćŻèƒœćžŒæœ›èź°ćœ•èŻ„ć€–éƒš API *ćș”èŻ„*æ˜Żä»€ä舿 ·ć­ă€‚ćźƒćș”èŻ„æœ‰ć“Șäș›*è·ŻćŸ„æ“äœœ*ćș”èŻ„æŽ„æ”¶ä»€äčˆèŻ·æ±‚äœ“ïŒŒćș”èŻ„èż”ć›žä»€äčˆć“ćș”等。 ## äœżç”šć›žè°ƒçš„ćș”甚 { #an-app-with-callbacks } -ç€șäŸ‹ćŠ‚äž‹ă€‚ +èź©æˆ‘ä»Źé€šèż‡äž€äžȘäŸ‹ć­æ„çœ‹èż™äž€ćˆ‡ă€‚ -ć‡èźŸèŠćŒ€ć‘äž€äžȘ戛ć»șć‘ç„šçš„ćș”甚。 +ć‡èźŸäœ ćŒ€ć‘äž€äžȘćŻä»„ćˆ›ć»șć‘ç„šçš„ćș”甚。 -ć‘ç„šćŒ…æ‹Ź `id`、`title`ïŒˆćŻé€‰ïŒ‰ă€`customer`、`total` ç­‰ć±žæ€§ă€‚ +èż™äș›ć‘焚䌚有 `id`、`title`ïŒˆćŻé€‰ïŒ‰ă€`customer` 撌 `total`。 -API çš„ç”šæˆ·ïŒˆć€–éƒšćŒ€ć‘è€…ïŒ‰èŠćœšæ‚šçš„ API ć†…äœżç”š POST èŻ·æ±‚ćˆ›ć»șäž€æĄć‘ç„šèź°ćœ•ă€‚ +䜠的 API ç”šæˆ·ïŒˆć€–éƒšćŒ€ć‘è€…ïŒ‰äŒšé€šèż‡ POST èŻ·æ±‚ćœšäœ çš„ API 侭戛ć»șäž€ćŒ ć‘ç„šă€‚ -ïŒˆć‡èźŸïŒ‰æ‚šçš„ API ć°†ïŒš +ç„¶ćŽäœ çš„ API äŒšïŒˆć‡èźŸïŒ‰ïŒš -* æŠŠć‘ç„šć‘é€è‡łć€–éƒšćŒ€ć‘è€…çš„æ¶ˆèŽč者 -* ćœ’é›†çŽ°é‡‘ -* æŠŠé€šçŸ„ć‘é€è‡ł API çš„ç”šæˆ·ïŒˆć€–éƒšćŒ€ć‘è€…ïŒ‰ - * é€šèż‡ïŒˆä»Žæ‚šçš„ APIïŒ‰ć‘é€ POST èŻ·æ±‚è‡łć€–éƒš APIïŒˆćł**ć›žè°ƒ**ïŒ‰æ„ćźŒæˆ +* ć°†ć‘ç„šć‘é€ç»™ć€–éƒšćŒ€ć‘è€…çš„æŸäžȘćźąæˆ·ă€‚ +* æ”¶æŹŸă€‚ +* 搑 API ç”šæˆ·ïŒˆć€–éƒšćŒ€ć‘è€…ïŒ‰ć‘ć›žé€šçŸ„ă€‚ + * èż™äŒšé€šèż‡ïŒˆä»Ž*䜠的 API*ïŒ‰ć‘èŻ„ć€–éƒšćŒ€ć‘è€…æäŸ›çš„æŸäžȘ*ć€–éƒš API*揑送 POST èŻ·æ±‚æ„ćźŒæˆïŒˆèż™ć°±æ˜Żâ€œć›žè°ƒâ€ïŒ‰ă€‚ ## ćžžè§„ **FastAPI** ćș”甚 { #the-normal-fastapi-app } -æ·»ćŠ ć›žè°ƒć‰ïŒŒéŠ–ć…ˆçœ‹äž‹ćžžè§„ API ćș”ç”šæ˜Żä»€ä舿 ·ć­ă€‚ +æˆ‘ä»Źć…ˆçœ‹çœ‹ćœšæ·»ćŠ ć›žè°ƒäč‹ć‰ïŒŒćžžè§„ API ćș”ç”šäŒšæ˜Żä»€ä舿 ·ć­ă€‚ -ćžžè§„ API ćș”ç”šćŒ…ć«æŽ„收 `Invoice` èŻ·æ±‚äœ“çš„*è·ŻćŸ„æ“äœœ*ïŒŒèż˜æœ‰ćŒ…ć«ć›žè°ƒ URL çš„æŸ„èŻąć‚æ•° `callback_url`。 +ćźƒäŒšæœ‰äž€äžȘ掄收 `Invoice` èŻ·æ±‚äœ“çš„*è·ŻćŸ„æ“äœœ*ïŒŒä»„ćŠäž€äžȘćŒ…ć«ć›žè°ƒ URL çš„æŸ„èŻąć‚æ•° `callback_url`。 -èż™éƒšćˆ†ä»Łç ćŸˆćžžè§„ïŒŒæ‚šćŻčç»ć€§ć€šæ•°ä»Łç ćș”èŻ„éƒœæŻ”èŸƒç†Ÿæ‚‰äș†ïŒš +èż™éƒšćˆ†ćŸˆćžžè§„ïŒŒć€§éƒšćˆ†ä»Łç äœ ćș”èŻ„ć·Čç»ćŸˆç†Ÿæ‚‰äș†ïŒš {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[7:11,34:51] *} @@ -39,92 +39,92 @@ API çš„ç”šæˆ·ïŒˆć€–éƒšćŒ€ć‘è€…ïŒ‰èŠćœšæ‚šçš„ API ć†…äœżç”š POST èŻ·æ±‚ćˆ›ć»ș /// -æ­€ć€„ć”Żäž€æŻ”èŸƒæ–°çš„ć†…ćźčæ˜Ż*è·ŻćŸ„æ“äœœèŁ…é„°ć™š*侭的 `callbacks=invoices_callback_router.routes` ć‚æ•°ïŒŒäž‹æ–‡ä»‹ç»ă€‚ +ć”Żäž€çš„æ–°ć†…ćźčæ˜Ż*è·ŻćŸ„æ“äœœèŁ…é„°ć™š*äž­çš„ć‚æ•° `callbacks=invoices_callback_router.routes`ă€‚æŽ„äž‹æ„æˆ‘ä»ŹäŒšçœ‹çœ‹ćźƒæ˜Żä»€äčˆă€‚ -## ć­˜æĄŁć›žè°ƒ { #documenting-the-callback } +## äžșć›žè°ƒçŒ–ć†™æ–‡æĄŁ { #documenting-the-callback } -ćźžé™…çš„ć›žè°ƒä»Łç é«˜ćșŠäŸè”–äșŽæ‚šè‡Ș深的 API ćș”甚。 +ćźžé™…çš„ć›žè°ƒä»Łç äŒšé«˜ćșŠäŸè”–䜠è‡Ș深的 API ćș”甚。 -ćč¶äž”ćŻèƒœæŻäžȘćș”ç”šéƒœć„äžç›žćŒă€‚ +è€Œäž”ćŸˆćŻèƒœćœšäžćŒćș”甚äč‹é—Žć·źćŒ‚ćŸˆć€§ă€‚ -ć›žè°ƒä»Łç ćŻèƒœćȘæœ‰äž€äž€èĄŒïŒŒæŻ”ćŠ‚ïŒš +ćźƒćŻèƒœćȘæœ‰äž€äž€èĄŒä»Łç ïŒŒäŸ‹ćŠ‚ïŒš ```Python callback_url = "https://example.com/api/v1/invoices/events/" httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) ``` -äœ†ć›žè°ƒæœ€é‡èŠçš„éƒšćˆ†ćŻèƒœæ˜ŻïŒŒæ čæź API èŠć‘é€ç»™ć›žè°ƒèŻ·æ±‚äœ“çš„æ•°æźç­‰ć†…ćźčïŒŒçĄźäżæ‚šçš„ API ç”šæˆ·ïŒˆć€–éƒšćŒ€ć‘è€…ïŒ‰æ­ŁçĄźćœ°ćźžçŽ°*ć€–éƒš API*。 +äœ†ć›žè°ƒæœ€é‡èŠçš„éƒšćˆ†ćŻèƒœæ˜ŻçĄźäżäœ çš„ API ç”šæˆ·ïŒˆć€–éƒšćŒ€ć‘è€…ïŒ‰æ­ŁçĄźćźžçŽ°*ć€–éƒš API*䞎*䜠的 API*ć°†ćœšć›žè°ƒèŻ·æ±‚äœ“äž­ć‘é€çš„æ•°æźç­‰ç›žćŒč配。 -ć› æ­€ïŒŒæˆ‘ä»Źäž‹äž€æ­„èŠćšçš„ć°±æ˜Żæ·»ćŠ ä»Łç ïŒŒäžș从 API æŽ„æ”¶ć›žè°ƒçš„*ć€–éƒš API*ć­˜æĄŁă€‚ +ć› æ­€ïŒŒæŽ„äž‹æ„æˆ‘ä»ŹèŠćšçš„æ˜Żæ·»ćŠ ä»Łç ïŒŒç”šæ„èź°ćœ•èŻ„*ć€–éƒš API*ćș”èŻ„æ˜Żä»€ä舿 ·ć­ïŒŒæ‰èƒœæŽ„收杄è‡Ș*䜠的 API*çš„ć›žè°ƒă€‚ -èż™éƒšćˆ†æ–‡æĄŁćœš `/docs` 例的 Swagger UI 䞭星ç€șćč¶äž”äŒšć‘ŠèŻ‰ć€–éƒšćŒ€ć‘è€…ćŠ‚äœ•æž„ć»ș*ć€–éƒš API*。 +èż™ä»œæ–‡æĄŁäŒšæ˜Ÿç€șćœšäœ çš„ API 的 `/docs` 例的 Swagger UI 䞭ćč¶äž”äŒšèź©ć€–éƒšćŒ€ć‘è€…çŸ„é“ćŠ‚äœ•æž„ć»ș*ć€–éƒš API*。 -æœŹäŸ‹æČĄæœ‰ćźžçŽ°ć›žè°ƒæœŹèș«ïŒˆćȘæ˜Żäž€èĄŒä»Łç ïŒ‰ïŒŒćȘæœ‰æ–‡æĄŁéƒšćˆ†ă€‚ +æœŹäŸ‹äžćźžçŽ°ć›žè°ƒæœŹèș«ïŒˆé‚ŁćŻèƒœćȘæ˜Żäž€èĄŒä»Łç ïŒ‰ïŒŒćȘćźžçŽ°æ–‡æĄŁéƒšćˆ†ă€‚ /// tip | 提ç€ș -ćźžé™…çš„ć›žè°ƒćȘæ˜Ż HTTP èŻ·æ±‚ă€‚ +ćźžé™…çš„ć›žè°ƒćȘæ˜Żäž€äžȘ HTTP èŻ·æ±‚ă€‚ -ćźžçŽ°ć›žè°ƒæ—¶ïŒŒèŠäœżç”š [HTTPX](https://www.python-httpx.org) 或 [Requests](https://requests.readthedocs.io/)。 +è‡Șć·±ćźžçŽ°ć›žè°ƒæ—¶ïŒŒäœ ćŻä»„äœżç”šç±»äŒŒ [HTTPX](https://www.python-httpx.org) 或 [Requests](https://requests.readthedocs.io/) 的淄慷。 /// ## çŒ–ć†™ć›žè°ƒæ–‡æĄŁä»Łç  { #write-the-callback-documentation-code } -ćș”ç”šäžæ‰§èĄŒèż™éƒšćˆ†ä»Łç ïŒŒćȘæ˜Żç”šćźƒæ„*èź°ćœ• ć€–éƒš API* 。 +èż™æź”ä»Łç äžäŒšćœšäœ çš„ćș”ç”šäž­æ‰§èĄŒïŒŒæˆ‘ä»ŹćȘéœ€èŠç”šćźƒæ„*èź°ćœ•*èŻ„*ć€–éƒš API*ćș”èŻ„æ˜Żä»€ä舿 ·ć­ă€‚ -䜆悚ć·Č经矄道甚 **FastAPI** 戛ć»șè‡Ș抹 API æ–‡æĄŁæœ‰ć€šçź€ć•äș†ă€‚ +äžèż‡ïŒŒäœ ć·Čç»çŸ„é“ćŠ‚äœ•äœżç”š **FastAPI** 蜻束äžș API 戛ć»șè‡ȘćŠšæ–‡æĄŁäș†ă€‚ -æˆ‘ä»ŹèŠäœżç”šäžŽć­˜æĄŁ*ć€–éƒš API* ç›žćŒçš„çŸ„èŻ†...é€šèż‡ćˆ›ć»șć€–éƒš API èŠćźžçŽ°çš„*è·ŻćŸ„æ“äœœ*悚的 API èŠè°ƒç”šçš„ïŒ‰ă€‚ +ć› æ­€ïŒŒæˆ‘ä»ŹäŒšäœżç”šç›žćŒçš„çŸ„èŻ†æ„èź°ćœ•èŻ„*ć€–éƒš API*ćș”èŻ„æ˜Żä»€ä舿 ·ć­...é€šèż‡ćˆ›ć»șć€–éƒš API ćș”èŻ„ćźžçŽ°çš„*è·ŻćŸ„æ“äœœ*äčŸć°±æ˜Żäœ çš„ API ć°†è°ƒç”šçš„é‚Łäș›ïŒ‰ă€‚ /// tip | 提ç€ș -çŒ–ć†™ć­˜æĄŁć›žè°ƒçš„ä»Łç æ—¶ïŒŒć‡èźŸæ‚šæ˜Ż*ć€–éƒšćŒ€ć‘è€…*ćŻèƒœäŒšç”šçš„äžŠă€‚ćč¶äž”æ‚šćœ“ć‰æ­ŁćœšćźžçŽ°çš„æ˜Ż*ć€–éƒš API*ïŒŒäžæ˜Ż*悚è‡Ș深的 API*。 +ćœšçŒ–ć†™ç”šäșŽèź°ćœ•ć›žè°ƒçš„ä»Łç æ—¶ïŒŒćŻä»„æƒłè±Ąäœ ć°±æ˜Żé‚ŁäžȘ*ć€–éƒšćŒ€ć‘è€…*ă€‚è€Œäž”äœ çŽ°ćœšæ­ŁćœšćźžçŽ°çš„æ˜Ż*ć€–éƒš API*ïŒŒäžæ˜Ż*䜠的 API*。 -䞎时æ”čć˜ïŒˆäžșć€–éƒšćŒ€ć‘è€…çš„ïŒ‰è§†è§’èƒœèź©æ‚šæ›Žæž…æ„šèŻ„ćŠ‚äœ•æ”Ÿçœź*ć€–éƒš API* 操ćș”ć’ŒèŻ·æ±‚äœ“çš„ć‚æ•°äžŽ Pydantic æšĄćž‹ç­‰ă€‚ +äžŽæ—¶é‡‡ç”šèż™äžȘ*ć€–éƒšćŒ€ć‘è€…*çš„ïŒ‰è§†è§’ïŒŒćŻä»„ćžźćŠ©äœ æ›Žæž…æ„šćœ°ćˆ€æ–­èŻ„æŠŠć‚æ•°ă€èŻ·æ±‚äœ“çš„ Pydantic æšĄćž‹ă€ć“ćș”ç­‰æ”ŸćœšèŻ„*ć€–éƒš API*的什äčˆäœçœźă€‚ /// -### 戛ć»șć›žè°ƒçš„ `APIRouter` { #create-a-callback-apirouter } +### 戛ć»șć›žè°ƒ `APIRouter` { #create-a-callback-apirouter } -éŠ–ć…ˆïŒŒæ–°ć»șćŒ…ć«äž€äș›ç”šäșŽć›žè°ƒçš„ `APIRouter`。 +驖慈戛ć»ș侀äžȘ新的 `APIRouter`ïŒŒćźƒć°†ćŒ…ć«äž€äžȘæˆ–ć€šäžȘć›žè°ƒă€‚ {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[1,23] *} ### 戛ć»șć›žè°ƒ*è·ŻćŸ„æ“äœœ* { #create-the-callback-path-operation } -戛ć»șć›žè°ƒ*è·ŻćŸ„æ“äœœ*äčŸäœżç”šäč‹ć‰ćˆ›ć»ș的 `APIRouter`。 +èŠćˆ›ć»șć›žè°ƒ*è·ŻćŸ„æ“äœœ*ïŒŒèŻ·äœżç”šäœ ćœšäžŠéąćˆ›ć»ș的搌侀äžȘ `APIRouter`。 -ćźƒçœ‹è”·æ„ć’Œćžžè§„ FastAPI *è·ŻćŸ„æ“äœœ*ć·źäžć€šïŒš +ćźƒçœ‹è”·æ„ćș”èŻ„ć°±ćƒæ™źé€šçš„ FastAPI *è·ŻćŸ„æ“äœœ* -* ćŁ°æ˜ŽèŠæŽ„æ”¶çš„èŻ·æ±‚äœ“ïŒŒäŸ‹ćŠ‚ïŒŒ`body: InvoiceEvent` -* èż˜èŠćŁ°æ˜ŽèŠèż”ć›žçš„ć“ćș”ïŒŒäŸ‹ćŠ‚ïŒŒ`response_model=InvoiceEventReceived` +* ćźƒćŻèƒœćș”èŻ„ćŁ°æ˜ŽèŠæŽ„æ”¶çš„èŻ·æ±‚äœ“ïŒŒäŸ‹ćŠ‚ `body: InvoiceEvent`。 +* 柃äčŸćŻä»„ćŁ°æ˜ŽèŠèż”ć›žçš„ć“ćș”ïŒŒäŸ‹ćŠ‚ `response_model=InvoiceEventReceived`。 {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *} -ć›žè°ƒ*è·ŻćŸ„æ“äœœ*äžŽćžžè§„*è·ŻćŸ„æ“äœœ*有䞀ç‚č䞻芁ćŒșćˆ«ïŒš +ćźƒäžŽæ™źé€š*è·ŻćŸ„æ“äœœ*有 2 äžȘ䞻芁ćŒșćˆ«ïŒš -* ćźƒäžéœ€èŠä»»äœ•ćźžé™…çš„ä»Łç ïŒŒć› äžșćș”ç”šäžäŒšè°ƒç”šèż™æź”ä»Łç ă€‚ćźƒćȘæ˜Żç”šäșŽć­˜æĄŁ*ć€–éƒš API*ă€‚ć› æ­€ïŒŒć‡œæ•°çš„ć†…ćźčćȘ需芁 `pass` ć°±ćŻä»„äș† -* *è·ŻćŸ„*ćŻä»„ćŒ…ć« [OpenAPI 3 èĄšèŸŸćŒ](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression)ïŒˆèŻŠè§äž‹æ–‡ïŒ‰ïŒŒćŻä»„äœżç”šćžŠć‚æ•°çš„ć˜é‡ïŒŒä»„ćŠć‘é€è‡łæ‚šçš„ API çš„ćŽŸć§‹èŻ·æ±‚çš„éƒšćˆ† +* ćźƒäžéœ€èŠä»»äœ•ćźžé™…ä»Łç ïŒŒć› äžș䜠的ćș”ç”šæ°žèżœäžäŒšè°ƒç”šèż™æź”ä»Łç ă€‚ćźƒćȘ甹äșŽèź°ćœ•*ć€–éƒš API*ă€‚ć› æ­€ïŒŒć‡œæ•°ćŻä»„ćȘ有 `pass`。 +* *è·ŻćŸ„*ćŻä»„ćŒ…ć« [OpenAPI 3 èĄšèŸŸćŒ](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression)ïŒˆè§äž‹æ–‡ïŒ‰ïŒŒć…¶äž­ćŻä»„äœżç”šćžŠć‚æ•°çš„ć˜é‡ïŒŒä»„ćŠć‘é€ćˆ°*䜠的 API*çš„ćŽŸć§‹èŻ·æ±‚çš„éƒšćˆ†ć†…ćźč。 ### ć›žè°ƒè·ŻćŸ„èĄšèŸŸćŒ { #the-callback-path-expression } -ć›žè°ƒ*è·ŻćŸ„*æ”ŻæŒćŒ…ć«ć‘é€ç»™æ‚šçš„ API çš„ćŽŸć§‹èŻ·æ±‚çš„éƒšćˆ†çš„ [OpenAPI 3 èĄšèŸŸćŒ](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression)。 +ć›žè°ƒ*è·ŻćŸ„*ćŻä»„æœ‰äž€äžȘ [OpenAPI 3 èĄšèŸŸćŒ](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression)ïŒŒć…¶äž­ćŻä»„ćŒ…ć«ć‘é€ćˆ°*䜠的 API*çš„ćŽŸć§‹èŻ·æ±‚çš„éƒšćˆ†ć†…ćźč。 -æœŹäŸ‹äž­æ˜Ż `str` +ćœšèż™äžȘäŸ‹ć­äž­ïŒŒćźƒæ˜Żèż™äžȘ `str` ```Python "{$callback_url}/invoices/{$request.body.id}" ``` -ć› æ­€ïŒŒćŠ‚æžœæ‚šçš„ API ç”šæˆ·ïŒˆć€–éƒšćŒ€ć‘è€…ïŒ‰ć‘é€èŻ·æ±‚ćˆ°æ‚šçš„ API +æ‰€ä»„ïŒŒćŠ‚æžœäœ çš„ API ç”šæˆ·ïŒˆć€–éƒšćŒ€ć‘è€…ïŒ‰ć‘*䜠的 API*ć‘é€èŻ·æ±‚ćˆ°ïŒš ``` https://yourapi.com/invoices/?callback_url=https://www.external.org/events ``` -äœżç”šćŠ‚äž‹ JSON èŻ·æ±‚äœ“ïŒš +ćč¶ćžŠæœ‰ćŠ‚äž‹ JSON èŻ·æ±‚äœ“ïŒš ```JSON { @@ -134,13 +134,13 @@ https://yourapi.com/invoices/?callback_url=https://www.external.org/events } ``` -ç„¶ćŽïŒŒæ‚šçš„ API ć°±äŒšć€„ç†ć‘ç„šïŒŒćč¶ćœšæŸäžȘç‚čäč‹ćŽïŒŒć‘é€ć›žè°ƒèŻ·æ±‚è‡ł `callback_url`ïŒˆć€–éƒš API +那äčˆ*䜠的 API*äŒšć€„ç†èŻ„ć‘ç„šïŒŒćč¶ćœšçšćŽçš„æŸäžȘæ—¶é—Žç‚čïŒŒć‘ `callback_url`*ć€–éƒš API*ïŒ‰ć‘é€ć›žè°ƒèŻ·æ±‚ïŒš ``` https://www.external.org/events/invoices/2expen51ve ``` -JSON èŻ·æ±‚äœ“ćŒ…ć«ćŠ‚äž‹ć†…ćźč +ćč¶ćžŠæœ‰ç±»äŒŒćŠ‚äž‹ć†…ćźč的 JSON èŻ·æ±‚äœ“ïŒš ```JSON { @@ -149,7 +149,7 @@ JSON èŻ·æ±‚äœ“ćŒ…ć«ćŠ‚äž‹ć†…ćźč } ``` -ćźƒäŒšéą„æœŸ*ć€–éƒš API* 的操ćș”ćŒ…ć«ćŠ‚äž‹ JSON èŻ·æ±‚äœ“ïŒš +ćźƒäŒšéą„æœŸèŻ„*ć€–éƒš API*èż”ć›žç±»äŒŒćŠ‚äž‹ JSON èŻ·æ±‚äœ“çš„ć“ćș” ```JSON { @@ -159,28 +159,28 @@ JSON èŻ·æ±‚äœ“ćŒ…ć«ćŠ‚äž‹ć†…ćźč /// tip | 提ç€ș -æłšæ„ïŒŒć›žè°ƒ URL ćŒ…ć« `callback_url``https://www.external.org/events`ïŒ‰äž­çš„æŸ„èŻąć‚æ•°ïŒŒèż˜æœ‰ JSON èŻ·æ±‚äœ“ć†…éƒšçš„ć‘ç„š ID`2expen51ve`ïŒ‰ă€‚ +èŻ·æłšæ„ïŒŒäœżç”šçš„ć›žè°ƒ URL ćŒ…ć«ćœš `callback_url` 䞭䜜äžșæŸ„èŻąć‚æ•°æŽ„æ”¶ćˆ°çš„ URL`https://www.external.org/events`äčŸćŒ…搫 JSON èŻ·æ±‚äœ“ć†…éƒšçš„ć‘ç„š `id``2expen51ve`ïŒ‰ă€‚ /// ### æ·»ćŠ ć›žè°ƒè·Żç”± { #add-the-callback-router } -è‡łæ­€ïŒŒćœšäžŠæ–‡ćˆ›ć»șçš„ć›žè°ƒè·Żç”±é‡Œć°±ćŒ…ć«äș†*ć›žè°ƒè·ŻćŸ„æ“äœœ*ïŒˆć€–éƒšćŒ€ć‘è€…èŠćœšć€–éƒš API äž­ćźžçŽ°ïŒ‰ă€‚ +歀时䜠ć·Čç»ćœšäžŠéąćˆ›ć»șçš„ć›žè°ƒè·Żç”±äž­æ‹„æœ‰äș†æ‰€éœ€çš„*ć›žè°ƒè·ŻćŸ„æ“äœœ*ïŒˆćł*ć€–éƒšćŒ€ć‘è€…*ćș”èŻ„ćœš*ć€–éƒš API*侭漞现的那äș›ïŒ‰ă€‚ -çŽ°ćœšäœżç”š API *è·ŻćŸ„æ“äœœèŁ…é„°ć™š*çš„ć‚æ•° `callbacks`ïŒŒä»Žć›žè°ƒè·Żç”±äŒ é€’ć±žæ€§ `.routes`ïŒˆćźžé™…äžŠćȘæ˜Żè·Żç”±/è·ŻćŸ„æ“äœœçš„**ćˆ—èĄš** +çŽ°ćœšïŒŒćœš*䜠的 API çš„è·ŻćŸ„æ“äœœèŁ…é„°ć™š*äž­äœżç”šć‚æ•° `callbacks`ïŒŒäŒ ć…„èŻ„ć›žè°ƒè·Żç”±çš„ `.routes` ć±žæ€§ïŒš {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *} /// tip | 提ç€ș -æłšæ„ïŒŒäžèƒœæŠŠè·Żç”±æœŹèș«ïŒˆ`invoices_callback_router`䌠递给 `callbacks=`芁䌠递 `invoices_callback_router.routes` 侭的 `.routes` ć±žæ€§ă€‚FastAPI äŒšäœżç”šèż™äș›è·Żç”±æ„ç”Ÿæˆć›žè°ƒçš„ OpenAPI æ–‡æĄŁă€‚ +èŻ·æłšæ„ïŒŒäœ äžæ˜ŻæŠŠè·Żç”±æœŹèș«ïŒˆ`invoices_callback_router`䌠给 `callbacks=`ïŒŒè€Œæ˜ŻäŒ ćźƒçš„ `.routes`äčŸć°±æ˜Ż `invoices_callback_router.routes`。FastAPI äŒšäœżç”šèż™äș›è·Żç”±æ„ç”Ÿæˆć›žè°ƒçš„ OpenAPI æ–‡æĄŁă€‚ /// ### æŸ„çœ‹æ–‡æĄŁ { #check-the-docs } -çŽ°ćœšïŒŒćŻćŠšćș”甚ćč¶æ‰“ćŒ€ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)。 +çŽ°ćœšäœ ćŻä»„ćŻćŠšćș”甚ćč¶èźżé—ź [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)。 -ć°±èƒœçœ‹ćˆ°æ–‡æĄŁçš„*è·ŻćŸ„æ“äœœ*ć·Čç»ćŒ…ć«äș†**ć›žè°ƒ**的憅ćźčä»„ćŠ*ć€–éƒš API* +äœ äŒšçœ‹ćˆ°æ–‡æĄŁäž­äžș䜠的*è·ŻćŸ„æ“äœœ*ćŒ…ć«äș†äž€äžȘ "Callbacks" éƒšćˆ†ïŒŒć±•ç€șäș†*ć€–éƒš API*ćș”èŻ„æ˜Żä»€ä舿 ·ć­ïŒš diff --git a/docs/zh/docs/advanced/response-change-status-code.md b/docs/zh/docs/advanced/response-change-status-code.md index 379afd4eb..4339875e4 100644 --- a/docs/zh/docs/advanced/response-change-status-code.md +++ b/docs/zh/docs/advanced/response-change-status-code.md @@ -22,7 +22,7 @@ {* ../../docs_src/response_change_status_code/tutorial001_py310.py hl[1,9,12] *} -ç„¶ćŽäœ ćŻä»„ćƒćčłćžžäž€æ ·èż”ć›žä»»äœ•äœ éœ€èŠçš„ćŻčè±ĄïŒˆäŸ‹ćŠ‚äž€äžȘ`dict`或者䞀äžȘæ•°æźćș“æšĄćž‹ïŒ‰ă€‚ +ç„¶ćŽäœ ćŻä»„ćƒćčłćžžäž€æ ·èż”ć›žä»»äœ•äœ éœ€èŠçš„ćŻčè±ĄïŒˆäž€äžȘ`dict`、侀äžȘæ•°æźćș“æšĄćž‹ç­‰ïŒ‰ă€‚ ćŠ‚æžœäœ ćŁ°æ˜Žäș†äž€äžȘ`response_model`ïŒŒćźƒä»ç„¶äŒšèą«ç”šæ„èż‡æ»€ć’ŒèœŹæąäœ èż”ć›žçš„ćŻčè±Ąă€‚ diff --git a/docs/zh/docs/advanced/response-cookies.md b/docs/zh/docs/advanced/response-cookies.md index 7fad89e5c..9a41b95e4 100644 --- a/docs/zh/docs/advanced/response-cookies.md +++ b/docs/zh/docs/advanced/response-cookies.md @@ -1,36 +1,38 @@ -# 操ćș”Cookies { #response-cookies } +# 操ćș” Cookies { #response-cookies } ## äœżç”š `Response` ć‚æ•° { #use-a-response-parameter } -äœ ćŻä»„ćœš *è·ŻćŸ„æ“äœœć‡œæ•°* 侭漚äč‰äž€äžȘ类枋äžș `Response` çš„ć‚æ•°ïŒŒèż™æ ·äœ ć°±ćŻä»„ćœšèż™äžȘäžŽæ—¶ć“ćș”ćŻčè±Ąäž­èźŸçœźcookieäș†ă€‚ +äœ ćŻä»„ćœš*è·ŻćŸ„æ“äœœć‡œæ•°*äž­ćŁ°æ˜Žäž€äžȘ类枋äžș `Response` çš„ć‚æ•°ă€‚ + +ç„¶ćŽäœ ćŻä»„ćœšèż™äžȘ*䞎时*操ćș”ćŻčè±Ąäž­èźŸçœź Cookie。 {* ../../docs_src/response_cookies/tutorial002_py310.py hl[1, 8:9] *} -è€Œäž”äœ èż˜ćŻä»„æ čæźäœ çš„éœ€èŠć“ćș”äžćŒçš„ćŻčè±ĄïŒŒæŻ”ćŠ‚ćžžç”šçš„ `dict`ïŒŒæ•°æźćș“model等。 +ç„¶ćŽäœ ćŻä»„ćƒćčłćžžäž€æ ·èż”ć›žæ‰€éœ€çš„ä»»äœ•ćŻčè±ĄïŒˆ`dict`ă€æ•°æźćș“æšĄćž‹ç­‰ïŒ‰ă€‚ -ćŠ‚æžœäœ ćźšäč‰äș† `response_model`皋ćșäŒšè‡Ș抹æ čæź`response_model`æ„èż‡æ»€ć’ŒèœŹæąäœ ć“ćș”çš„ćŻčè±Ąă€‚ +ćŠ‚æžœäœ ćŁ°æ˜Žäș† `response_model`ïŒŒćźƒä»äŒšç”šäșŽèż‡æ»€ć’ŒèœŹæąäœ èż”曞的ćŻčè±Ąă€‚ -**FastAPI** äŒšäœżç”šèż™äžȘ *䞎时* 操ćș”ćŻčè±ĄćŽ»èŁ…ćœšèż™äș›cookiesäżĄæŻ (ćŒæ ·èż˜æœ‰headersć’ŒçŠ¶æ€ç ç­‰äżĄæŻ), æœ€ç»ˆäŒšć°†èż™äș›äżĄæŻć’Œé€šèż‡`response_model`èœŹćŒ–èż‡çš„æ•°æźćˆćč¶ćˆ°æœ€ç»ˆçš„ć“ćș”é‡Œă€‚ +**FastAPI** äŒšäœżç”šèż™äžȘ*䞎时*操ćș”æ„æć– CookieïŒˆèż˜æœ‰ header ć’ŒçŠ¶æ€ç ïŒ‰ïŒŒćč¶ć°†ćźƒä»Źæ”Ÿć…„æœ€ç»ˆć“ćș”äž­ïŒ›æœ€ç»ˆć“ćș”ćŒ…ć«äœ èż”ć›žçš„ć€ŒïŒŒćč¶ç»èż‡ä»»äœ• `response_model` èż‡æ»€ă€‚ -䜠äčŸćŻä»„ćœšäŸè”–äž­ćźšäč‰`Response`ć‚æ•°ïŒŒćč¶èźŸçœźcookie撌header。 +䜠äčŸćŻä»„ćœšäŸè”–éĄčäž­ćŁ°æ˜Ž `Response` ć‚æ•°ïŒŒćč¶ćœšć…¶äž­èźŸçœź CookieïŒˆć’Œ headerïŒ‰ă€‚ -## ç›ŽæŽ„ć“ćș” `Response` { #return-a-response-directly } +## ç›ŽæŽ„èż”ć›ž `Response` { #return-a-response-directly } -äœ èż˜ćŻä»„ćœšç›ŽæŽ„ć“ćș”`Response`æ—¶ç›ŽæŽ„ćˆ›ć»școokies。 +ćœšä»Łç äž­ç›ŽæŽ„èż”ć›ž `Response` 时䜠äčŸćŻä»„戛ć»ș Cookie。 äžșæ­€ïŒŒäœ ćŻä»„æŒ‰ç…§[ç›ŽæŽ„èż”ć›ž Response](response-directly.md)äž­çš„èŻŽæ˜Žćˆ›ć»ș侀äžȘ操ćș”。 -ç„¶ćŽèźŸçœźCookiesćč¶èż”ć›žïŒš +ç„¶ćŽćœšć…¶äž­èźŸçœź Cookiećč¶èż”ć›žćźƒïŒš {* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *} /// tip | 提ç€ș -éœ€èŠæłšæ„ïŒŒćŠ‚æžœäœ ç›ŽæŽ„ćéŠˆäž€äžȘresponsećŻčè±ĄïŒŒè€Œäžæ˜Żäœżç”š`Response`ć…„ć‚ïŒŒFastAPIćˆ™äŒšç›ŽæŽ„ćéŠˆäœ ć°èŁ…çš„responsećŻčè±Ąă€‚ +èŻ·èź°äœïŒŒćŠ‚æžœäœ ç›ŽæŽ„èż”ć›žć“ćș”ïŒŒè€Œäžæ˜Żäœżç”š `Response` ć‚æ•°ïŒŒFastAPI äŒšç›ŽæŽ„èż”ć›žćźƒă€‚ -æ‰€ä»„äœ éœ€èŠçĄźäżäœ ć“ćș”æ•°æźç±»ćž‹çš„æ­ŁçĄźæ€§ïŒŒćŠ‚ïŒšäœ ćŻä»„äœżç”š`JSONResponse`æ„ć…ŒćźčJSON的ćœșæ™Żă€‚ +ć› æ­€ïŒŒäœ ćż…éĄ»çĄźäżäœ çš„æ•°æźç±»ćž‹æ­ŁçĄźă€‚äŸ‹ćŠ‚ïŒŒćŠ‚æžœäœ èż”ć›žçš„æ˜Ż `JSONResponse`ïŒŒæ•°æźć°±éœ€èŠć…Œćźč JSON。 -ćŒæ—¶ïŒŒäœ äčŸćș”ćœ“ä»…ćéŠˆé€šèż‡`response_model`èż‡æ»€èż‡çš„æ•°æźă€‚ +ćč¶äž”èż˜èŠçĄźäżäœ æČĄæœ‰ć‘é€æœŹćș”ç”± `response_model` èż‡æ»€çš„æ•°æźă€‚ /// @@ -38,12 +40,12 @@ /// note | æŠ€æœŻç»†èŠ‚ -䜠äčŸćŻä»„äœżç”š`from starlette.responses import Response` 或者 `from starlette.responses import JSONResponse`。 +䜠äčŸćŻä»„äœżç”š `from starlette.responses import Response` 或者 `from starlette.responses import JSONResponse`。 -äžșäș†æ–čäŸżćŒ€ć‘è€…ïŒŒ**FastAPI** ć°èŁ…äș†ç›žćŒæ•°æźç±»ćž‹ïŒŒćŠ‚`starlette.responses` 撌 `fastapi.responses`ă€‚äžèż‡ć€§éƒšćˆ†responsećŻčè±Ąéƒœæ˜Żç›ŽæŽ„ćŒ•ç”šè‡ȘStarlette。 +**FastAPI** äžșäș†æ–čäŸżćŒ€ć‘è€…ïŒŒæäŸ›äș†äžŽ `starlette.responses` 盾搌的 `fastapi.responses`ă€‚äœ†ć€§ć€šæ•°ćŻç”šçš„ć“ćș”郜盎掄杄è‡Ș Starlette。 -曠äžș`Response`ćŻčè±ĄćŻä»„éžćžžäŸżæ·çš„èźŸçœźheaders撌cookies所仄 **FastAPI** ćŒæ—¶äčŸć°èŁ…äș†`fastapi.Response`。 +由äșŽ `Response` ç»ćžžç”šäșŽèźŸçœź header 撌 Cookie**FastAPI** äčŸćœš `fastapi.Response` 䞭提䟛äș†ćźƒă€‚ /// -ćŠ‚æžœäœ æƒłæŸ„çœ‹æ‰€æœ‰ćŻç”šçš„ć‚æ•°ć’Œé€‰éĄčïŒŒćŻä»„ć‚è€ƒ [Starlette æ–‡æĄŁ](https://www.starlette.dev/responses/#set-cookie)。 +èŠæŸ„çœ‹æ‰€æœ‰ćŻç”šć‚æ•°ć’Œé€‰éĄčïŒŒèŻ·æŸ„çœ‹ [Starlette æ–‡æĄŁ](https://www.starlette.dev/responses/#set-cookie)。 diff --git a/docs/zh/docs/advanced/response-headers.md b/docs/zh/docs/advanced/response-headers.md index ab99a4ece..89357058d 100644 --- a/docs/zh/docs/advanced/response-headers.md +++ b/docs/zh/docs/advanced/response-headers.md @@ -1,5 +1,6 @@ # 操ćș”怎 { #response-headers } + ## äœżç”š `Response` ć‚æ•° { #use-a-response-parameter } äœ ćŻä»„ćœšäœ çš„*è·ŻćŸ„æ“äœœć‡œæ•°*äž­ćŁ°æ˜Žäž€äžȘ `Response` ç±»ćž‹çš„ć‚æ•°ïŒˆć°±ćƒäœ ćŻä»„äžș cookies ćšçš„é‚Łæ ·ïŒ‰ă€‚ diff --git a/docs/zh/docs/advanced/security/oauth2-scopes.md b/docs/zh/docs/advanced/security/oauth2-scopes.md index db29e4916..fa0dd8eff 100644 --- a/docs/zh/docs/advanced/security/oauth2-scopes.md +++ b/docs/zh/docs/advanced/security/oauth2-scopes.md @@ -86,7 +86,7 @@ OAuth2 è§„èŒƒć°†â€œäœœç”šćŸŸâ€ćźšäč‰äžș由ç©șæ Œćˆ†éš”çš„ć­—çŹŠäžČćˆ—èĄšă€‚ çŽ°ćœšïŒŒäżźæ”č什牌的*è·ŻćŸ„æ“äœœ*ä»„èż”ć›žèŻ·æ±‚çš„äœœç”šćŸŸă€‚ -æˆ‘ä»Źä»ç„¶äœżç”š `OAuth2PasswordRequestForm`ă€‚ćźƒćŒ…ć« `scopes` ć±žæ€§ïŒŒć…¶ć€Œæ˜Ż `list[str]`ïŒŒćŒ…ć«èŻ·æ±‚äž­æŽ„æ”¶ćˆ°çš„æŻäžȘäœœç”šćŸŸă€‚ +æˆ‘ä»Źä»ç„¶äœżç”š `OAuth2PasswordRequestForm`ă€‚ćźƒćŒ…ć« `scopes` ć±žæ€§ïŒŒć…¶ć€Œæ˜Ż `list` of `str`ïŒŒćŒ…ć«èŻ·æ±‚äž­æŽ„æ”¶ćˆ°çš„æŻäžȘäœœç”šćŸŸă€‚ æˆ‘ä»ŹæŠŠèż™äș›äœœç”šćŸŸäœœäžș JWT ä»€ç‰Œçš„äž€éƒšćˆ†èż”ć›žă€‚ @@ -174,7 +174,7 @@ OAuth2 è§„èŒƒć°†â€œäœœç”šćŸŸâ€ćźšäč‰äžș由ç©șæ Œćˆ†éš”çš„ć­—çŹŠäžČćˆ—èĄšă€‚ äžșæ­€ïŒŒæˆ‘ä»Źç»™ Pydantic æšĄćž‹ `TokenData` æ·»ćŠ äș†äž€äžȘæ–°ć±žæ€§ `scopes`。 -é€šèż‡ç”š Pydantic éȘŒèŻæ•°æźïŒŒæˆ‘ä»ŹćŻä»„çĄźäżçĄźćźžćŸ—ćˆ°äș†äŸ‹ćŠ‚äž€äžȘç”±äœœç”šćŸŸç»„æˆçš„ `list[str]`ïŒŒä»„ćŠäž€äžȘ `str` 类枋的 `username`。 +é€šèż‡ç”š Pydantic éȘŒèŻæ•°æźïŒŒæˆ‘ä»ŹćŻä»„çĄźäżçĄźćźžćŸ—ćˆ°äș†äŸ‹ćŠ‚äž€äžȘç”±äœœç”šćŸŸç»„æˆçš„ `list` of `str`ïŒŒä»„ćŠäž€äžȘ `str` 类枋的 `username`。 è€Œäžæ˜ŻïŒŒäŸ‹ćŠ‚ćŸ—ćˆ°äž€äžȘ `dict` æˆ–ć…¶ćźƒä»€äčˆïŒŒèż™ćŻèƒœäŒšćœšćŽç»­æŸäžȘæ—¶ćˆ»ç Žććș”ç”šïŒŒćœąæˆćź‰ć…šéŁŽé™©ă€‚ diff --git a/docs/zh/docs/advanced/settings.md b/docs/zh/docs/advanced/settings.md index 31a7cc82d..2159ccb25 100644 --- a/docs/zh/docs/advanced/settings.md +++ b/docs/zh/docs/advanced/settings.md @@ -297,6 +297,6 @@ participant execute as Execute function äœ ćŻä»„äœżç”š Pydantic Settings æ„ć€„ç†ćș”ç”šçš„èźŸçœźæˆ–é…çœźïŒŒäș«ć— Pydantic æšĄćž‹çš„ć…šéƒšèƒœćŠ›ă€‚ -- é€šèż‡äœżç”šäŸè”–éĄčïŒŒäœ ćŻä»„çź€ćŒ–æ”‹èŻ•ă€‚ -- äœ ćŻä»„äžŽćźƒäž€è”·äœżç”š `.env` æ–‡ä»¶ă€‚ -- äœżç”š `@lru_cache` ćŻä»„éżć…äžșæŻäžȘèŻ·æ±‚ćć€èŻ»ć– dotenv æ–‡ä»¶ïŒŒćŒæ—¶ć…èźžäœ ćœšæ”‹èŻ•æ—¶èż›èĄŒèŠ†ç›–ă€‚ +* é€šèż‡äœżç”šäŸè”–éĄčïŒŒäœ ćŻä»„çź€ćŒ–æ”‹èŻ•ă€‚ +* äœ ćŻä»„äžŽćźƒäž€è”·äœżç”š `.env` æ–‡ä»¶ă€‚ +* äœżç”š `@lru_cache` ćŻä»„éżć…äžșæŻäžȘèŻ·æ±‚ćć€èŻ»ć– dotenv æ–‡ä»¶ïŒŒćŒæ—¶ć…èźžäœ ćœšæ”‹èŻ•æ—¶èż›èĄŒèŠ†ç›–ă€‚ diff --git a/docs/zh/docs/advanced/stream-data.md b/docs/zh/docs/advanced/stream-data.md index 366ab203b..44e005ace 100644 --- a/docs/zh/docs/advanced/stream-data.md +++ b/docs/zh/docs/advanced/stream-data.md @@ -2,7 +2,7 @@ ćŠ‚æžœäœ èŠæ”ćŒäŒ èŸ“ćŻä»„ç»“æž„ćŒ–äžș JSON çš„æ•°æźïŒŒäœ ćș”èŻ„[æ”ćŒäŒ èŸ“ JSON Lines](../tutorial/stream-json-lines.md)。 -äœ†ćŠ‚æžœäœ æƒłæ”ćŒäŒ èŸ“çșŻäșŒèż›ćˆ¶æ•°æźæˆ–歗珊äžČïŒŒćŻä»„æŒ‰äž‹éąçš„æ–čæł•æ“äœœă€‚ +äœ†ćŠ‚æžœäœ æƒł**æ”ćŒäŒ èŸ“çșŻäșŒèż›ćˆ¶æ•°æź**æˆ–ć­—çŹŠäžČïŒŒćŻä»„æŒ‰äž‹éąçš„æ–čæł•æ“äœœă€‚ /// note | æłšæ„ @@ -12,11 +12,11 @@ ## äœżç”šćœșæ™Ż { #use-cases } -ćŠ‚æžœäœ æƒłæ”ćŒäŒ èŸ“çșŻć­—珊äžČïŒŒäŸ‹ćŠ‚ç›ŽæŽ„æ„è‡Ș某äžȘ AI LLM æœćŠĄçš„èŸ“ć‡șïŒŒćŻä»„äœżç”šćźƒă€‚ +ćŠ‚æžœäœ æƒłæ”ćŒäŒ èŸ“çșŻć­—珊äžČïŒŒäŸ‹ćŠ‚ç›ŽæŽ„æ„è‡Ș某äžȘ **AI LLM** æœćŠĄçš„èŸ“ć‡șïŒŒćŻä»„äœżç”šćźƒă€‚ -䜠äčŸćŻä»„ç”šćźƒæ„æ”ćŒäŒ èŸ“ć€§ćž‹äșŒèż›ćˆ¶æ–‡ä»¶ïŒŒćœšèŻ»ć–çš„ćŒæ—¶æŒ‰ć—ć‘é€ïŒŒæ— éœ€äž€æŹĄæ€§æŠŠæ‰€æœ‰ć†…ćźčèŻ»ć…„ć†…ć­˜ă€‚ +䜠äčŸćŻä»„ç”šćźƒæ„æ”ćŒäŒ èŸ“**性枋äșŒèż›ćˆ¶æ–‡ä»¶**ïŒŒćœšèŻ»ć–çš„ćŒæ—¶æŒ‰ć—ć‘é€ïŒŒæ— éœ€äž€æŹĄæ€§æŠŠæ‰€æœ‰ć†…ćźčèŻ»ć…„ć†…ć­˜ă€‚ -äœ èż˜ćŻä»„ç”šèż™ç§æ–čćŒæ”ćŒäŒ èŸ“è§†éą‘æˆ–éŸłéą‘ïŒŒç”šè‡łćŻä»„ćœšć€„ç†çš„ćŒæ—¶ç”Ÿæˆćč¶ć‘送。 +äœ èż˜ćŻä»„ç”šèż™ç§æ–čćŒæ”ćŒäŒ èŸ“**è§†éą‘**或**音鱑**ïŒŒç”šè‡łćŻä»„ćœšć€„ç†çš„ćŒæ—¶ç”Ÿæˆćč¶ć‘送。 ## äœżç”š `yield` 的 `StreamingResponse` { #a-streamingresponse-with-yield } @@ -40,7 +40,7 @@ FastAPI äŒšć°†æŻäžȘæ•°æźć—ćŽŸæ ·äș€ç»™ `StreamingResponse`ïŒŒäžäŒšć°èŻ•ć°† {* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} -èż™ä蟿„ć‘łç€ïŒŒäœżç”š `StreamingResponse` 时䜠拄有按需çČŸçĄźç”ŸæˆäžŽçŒ–ç ć­—èŠ‚æ•°æźçš„è‡Șç”±ïŒŒćŒæ—¶ä蟿‰żæ‹…盞ćș”çš„èŽŁä»»ïŒŒćźƒäžŽç±»ćž‹æłšè§Łæ— ć…łă€‚đŸ€“ +èż™ä蟿„ć‘łç€ïŒŒäœżç”š `StreamingResponse` 时䜠拄有按需çČŸçĄźç”ŸæˆäžŽçŒ–ç ć­—èŠ‚æ•°æźçš„**è‡Ș由**ïŒŒćŒæ—¶ä蟿‰żæ‹…盞ćș”çš„**èŽŁä»»**ïŒŒćźƒäžŽç±»ćž‹æłšè§Łæ— ć…łă€‚đŸ€“ ### æ”ćŒäŒ èŸ“ć­—èŠ‚ { #stream-bytes } diff --git a/docs/zh/docs/advanced/wsgi.md b/docs/zh/docs/advanced/wsgi.md index f665c371f..eb83a09b2 100644 --- a/docs/zh/docs/advanced/wsgi.md +++ b/docs/zh/docs/advanced/wsgi.md @@ -1,5 +1,6 @@ # ćŒ…ć« WSGI - FlaskDjangoïŒŒć…¶ćźƒ { #including-wsgi-flask-django-others } + æ‚šćŻä»„æŒ‚èœœ WSGI ćș”ç”šïŒŒæ­ŁćŠ‚æ‚šćœš [歐ćș”甚 - 挂蜜](sub-applications.md)、[ćœšä»Łç†äč‹ćŽ](behind-a-proxy.md) äž­æ‰€çœ‹ćˆ°çš„é‚Łæ ·ă€‚ äžșæ­€, æ‚šćŻä»„äœżç”š `WSGIMiddleware` æ„ćŒ…èŁ…äœ çš„ WSGI ćș”ç”šïŒŒćŠ‚ïŒšFlaskDjangoïŒŒç­‰ç­‰ă€‚ diff --git a/docs/zh/docs/alternatives.md b/docs/zh/docs/alternatives.md index 08893fca7..20de25cbd 100644 --- a/docs/zh/docs/alternatives.md +++ b/docs/zh/docs/alternatives.md @@ -28,7 +28,7 @@ Django REST framework 䜜äžș侀äžȘç”æŽ»ć·„ć…·çź±è€Œćˆ›ć»ș甚äșŽćœšćș•ć±‚äœż ćźƒèą«ćŒ…æ‹Ź Mozilla、Red Hat、Eventbrite ćœšć†…çš„èźžć€šć…Źćžäœżç”šă€‚ -ćźƒæ˜Żæœ€æ—©çš„â€œè‡Ș抹 API æ–‡æĄŁâ€çš„èŒƒäŸ‹äč‹äž€ïŒŒèż™æ­Łæ˜ŻćŻć‘â€œćŻ»æ‰Ÿâ€ **FastAPI** çš„æœ€ćˆæƒłæł•äč‹äž€ă€‚ +ćźƒæ˜Żæœ€æ—©çš„**è‡Ș抹 API æ–‡æĄŁ**的范䟋äč‹äž€ïŒŒèż™æ­Łæ˜ŻćŻć‘â€œćŻ»æ‰Ÿâ€ **FastAPI** çš„æœ€ćˆæƒłæł•äč‹äž€ă€‚ /// note | æłšæ„ @@ -58,8 +58,9 @@ Flask æ˜Żäž€äžȘâ€œćŸźæĄ†æž¶â€ïŒŒćźƒäžćŒ…ć«æ•°æźćș“集成äčŸæČĄæœ‰ćƒ Djan /// tip | 搯揑 **FastAPI** -- 成äžșćŸźæĄ†æž¶ïŒŒäŸżäșŽæŒ‰éœ€ç»„ćˆæ‰€éœ€çš„ć·„慷䞎组件。 -- æäŸ›çź€ć•æ˜“ç”šçš„è·Żç”±çł»ç»Ÿă€‚ +成äžșćŸźæĄ†æž¶ă€‚èź©æŒ‰éœ€ç»„ćˆæ‰€éœ€çš„ć·„ć…·äžŽç»„ä»¶ć˜ćŸ—ćźčæ˜“ă€‚ + +æäŸ›çź€ć•æ˜“ç”šçš„è·Żç”±çł»ç»Ÿă€‚ /// @@ -87,7 +88,7 @@ Requests èźŸèźĄéžćžžçź€ć•ç›Žè§‚ïŒŒæ˜“äșŽäœżç”šïŒŒäž”æœ‰ćˆç†çš„é»˜èź€ć€Œă€‚ response = requests.get("http://example.com/some/url") ``` -ćŻčćș”ćœ°ïŒŒFastAPI 的 API è·ŻćŸ„æ“äœœćŻèƒœçœ‹è”·æ„æ˜Żèż™æ ·çš„ïŒš +ćŻčćș”ćœ°ïŒŒFastAPI 的 API *è·ŻćŸ„æ“äœœ*ćŻèƒœçœ‹è”·æ„æ˜Żèż™æ ·çš„ïŒš ```Python hl_lines="1" @app.get("/some/url") @@ -282,7 +283,7 @@ Flask-apispec 由䞎 Marshmallow ç›žćŒçš„ćŒ€ć‘è€…ćˆ›ć»ș。 Falcon æ˜ŻćŠäž€äžȘ高性胜 Python æĄ†æž¶ïŒŒćźƒèą«èźŸèźĄäžșçČŸçź€äž”ćŻäœœäžș Hug ç­‰ć…¶ä»–æĄ†æž¶çš„ćŸș础。 -ćźƒèźŸèźĄäžș掄收䞀äžȘć‚æ•°çš„ć‡œæ•°ïŒšäž€äžȘ“request”撌侀äžȘ“responseâ€ă€‚ç„¶ćŽä»Ž request äž­â€œèŻ»ć–â€ïŒŒć‘ response äž­â€œć†™ć…„â€ă€‚ç”±äșŽèż™ç§èźŸèźĄïŒŒæ— æł•ç”šæ ‡ć‡†çš„ Python ç±»ćž‹æç€șć°†èŻ·æ±‚ć‚æ•°ć’ŒèŻ·æ±‚äœ“ćŁ°æ˜Žäžșć‡œæ•°ćœąć‚ă€‚ +ćźƒèźŸèźĄäžș掄收䞀äžȘć‚æ•°çš„ć‡œæ•°ïŒšäž€äžȘâ€œèŻ·æ±‚â€ć’Œäž€äžȘ“操ćș”â€ă€‚ç„¶ćŽä»ŽèŻ·æ±‚äž­â€œèŻ»ć–â€ïŒŒć‘ć“ćș”äž­â€œć†™ć…„â€ă€‚ç”±äșŽèż™ç§èźŸèźĄïŒŒæ— æł•ç”šæ ‡ć‡†çš„ Python ç±»ćž‹æç€șć°†èŻ·æ±‚ć‚æ•°ć’ŒèŻ·æ±‚äœ“ćŁ°æ˜Žäžșć‡œæ•°ćœąć‚ă€‚ ć› æ­€ïŒŒæ•°æźæ ĄéȘŒă€ćșćˆ—ćŒ–äžŽæ–‡æĄŁèЁäčˆéœ€èŠæ‰‹ć†™ćźŒæˆïŒŒæ— æł•è‡ȘćŠšćŒ–ïŒ›èŠäčˆéœ€èŠćœš Falcon äč‹äžŠćźžçŽ°äž€äžȘæĄ†æž¶ïŒŒäŸ‹ćŠ‚ Hugă€‚ć…¶ä»–ć— Falcon èźŸèźĄćŻć‘ă€é‡‡ç”šâ€œäž€äžȘ request ćŻčè±Ą + 侀äžȘ response ćŻčè±Ąäœœäžșć‚æ•°â€çš„æĄ†æž¶ä蟿œ‰ćŒæ ·çš„ćŒșćˆ«ă€‚ diff --git a/docs/zh/docs/async.md b/docs/zh/docs/async.md index bee98fc8b..8645fd634 100644 --- a/docs/zh/docs/async.md +++ b/docs/zh/docs/async.md @@ -95,11 +95,11 @@ Python çš„çŽ°ä»Łç‰ˆæœŹæ”ŻæŒé€šèż‡äž€ç§ć«**“捏繋”**â€”â€”äœżç”š `async` ### ćč¶ć‘äžŽæ±‰ć Ą { #concurrency-and-burgers } -äžŠèż°ćŒ‚æ­„ä»Łç çš„æ€æƒłæœ‰æ—¶äčŸèą«ç§°äžș“ćč¶ć‘â€ïŒŒćźƒäžćŒäșŽâ€œćč¶èĄŒâ€ă€‚ +äžŠèż°**ćŒ‚æ­„**ä»Łç çš„æ€æƒłæœ‰æ—¶äčŸèą«ç§°äžș**“ćč¶ć‘”**ïŒŒćźƒäžćŒäșŽ**“ćč¶èĄŒâ€**。 -ćč¶ć‘ć’Œćč¶èĄŒéƒœäžŽâ€œäžćŒçš„äș‹æƒ…æˆ–ć€šæˆ–ć°‘ćŒæ—¶ć‘ç”Ÿâ€æœ‰ć…łă€‚ +**ćč¶ć‘**撌**ćč¶èĄŒ**éƒœäžŽâ€œäžćŒçš„äș‹æƒ…æˆ–ć€šæˆ–ć°‘ćŒæ—¶ć‘ç”Ÿâ€æœ‰ć…łă€‚ -äœ†æ˜Żćč¶ć‘ć’Œćč¶èĄŒäč‹é—Žçš„ç»†èŠ‚æ˜ŻćźŒć…šäžćŒçš„ă€‚ +äœ†æ˜Ż*ćč¶ć‘*撌*ćč¶èĄŒ*äč‹é—Žçš„ç»†èŠ‚æ˜ŻćźŒć…šäžćŒçš„ă€‚ 芁äș†è§Łć·źćŒ‚ïŒŒèŻ·æƒłè±Ąä»„äž‹ć…łäșŽæ±‰ć Ąçš„æ•…äș‹ïŒš @@ -367,7 +367,7 @@ StarletteïŒˆć’Œ **FastAPI**ïŒ‰æ˜ŻćŸșäșŽ [AnyIO](https://anyio.readthedocs.io/en/ ç‰čćˆ«æ˜ŻïŒŒäœ ćŻä»„ç›ŽæŽ„äœżç”š [AnyIO](https://anyio.readthedocs.io/en/stable/) æ„ć€„ç†é«˜çș§çš„ćč¶ć‘ç”šäŸ‹ïŒŒèż™äș›ç”šäŸ‹éœ€èŠćœšè‡Șć·±çš„ä»Łç äž­äœżç”šæ›Žé«˜çș§çš„æšĄćŒă€‚ -ćłäœżäœ æČĄæœ‰äœżç”š **FastAPI**䜠äčŸćŻä»„äœżç”š [AnyIO](https://anyio.readthedocs.io/en/stable/) çŒ–ć†™è‡Șć·±çš„ćŒ‚æ­„çš‹ćșïŒŒäœżć…¶æ‹„æœ‰èŸƒé«˜çš„ć…Œćźč性ćč¶èŽ·ćŸ—äž€äș›ć„œć€„ïŒˆäŸ‹ćŠ‚ïŒŒç»“æž„ćŒ–ćč¶ć‘ïŒ‰ă€‚ +ćłäœżäœ æČĄæœ‰äœżç”š FastAPI䜠äčŸćŻä»„äœżç”š [AnyIO](https://anyio.readthedocs.io/en/stable/) çŒ–ć†™è‡Șć·±çš„ćŒ‚æ­„çš‹ćșïŒŒäœżć…¶æ‹„æœ‰èŸƒé«˜çš„ć…Œćźč性ćč¶èŽ·ćŸ—äž€äș›ć„œć€„ïŒˆäŸ‹ćŠ‚ïŒŒç»“æž„ćŒ–ćč¶ć‘ïŒ‰ă€‚ 我ćŸșäșŽ AnyIO 新ć»șäș†äž€äžȘćș“䜜äžș侀äžȘ蜻量çș§çš„ć°èŁ…ć±‚ïŒŒç”šæ„äŒ˜ćŒ–ç±»ćž‹æłšè§ŁïŒŒćŒæ—¶æäŸ›äș†æ›Žć„œçš„**è‡ȘćŠšèĄ„ć…š**、**ć†…è”é”™èŻŻæç€ș**ç­‰ćŠŸèƒœă€‚èż™äžȘćș“èż˜é™„ćžŠäș†äž€äžȘć‹ć„œçš„ć…„é—šæŒ‡ć—ć’Œæ•™çš‹ïŒŒèƒœćžźćŠ©äœ **ç†è§Ł**ćč¶çŒ–憙**è‡Șć·±çš„ćŒ‚æ­„ä»Łç **[Asyncer](https://asyncer.tiangolo.com/)ă€‚ćŠ‚æžœäœ æœ‰**ç»“ćˆäœżç”šćŒ‚æ­„ä»Łç ć’Œćžžè§„**ïŒˆé˜»ćĄž/ćŒæ­„ïŒ‰ä»Łç çš„éœ€æ±‚ïŒŒèż™äžȘćș“䌚ç‰čćˆ«æœ‰ç”šă€‚ @@ -429,13 +429,13 @@ StarletteïŒˆć’Œ **FastAPI**ïŒ‰æ˜ŻćŸșäșŽ [AnyIO](https://anyio.readthedocs.io/en/ äœ ćŻä»„æ‹„æœ‰ć€šäžȘ盾äș’䟝蔖的䟝蔖仄揊[ć­äŸè”–](tutorial/dependencies/sub-dependencies.md)䜜äžșć‡œæ•°çš„ć‚æ•°ïŒ‰ïŒŒćźƒä»Źäž­çš„äž€äș›ćŻèƒœæ˜Żé€šèż‡ `async def` ćŁ°æ˜ŽïŒŒäčŸćŻèƒœæ˜Żé€šèż‡ `def` ćŁ°æ˜Žă€‚ćźƒä»Źä»ç„¶ćŻä»„æ­Łćžžć·„äœœïŒŒèż™äș›é€šèż‡ `def` ćŁ°æ˜Žçš„ć‡œæ•°ć°†äŒšćœšć€–éƒšçșżçš‹äž­è°ƒç”šïŒˆæ„è‡Șçșżçš‹æ± ïŒ‰ïŒŒè€Œäžæ˜Żâ€œèą«ç­‰ćŸ…â€ă€‚ -### ć…¶ä»–ć‡œæ•° { #other-utility-functions } +### ć…¶ä»–ć·„ć…·ć‡œæ•° { #other-utility-functions } -äœ ćŻç›ŽæŽ„è°ƒç”šé€šèż‡ `def` 或 `async def` 戛ć»șçš„ä»»äœ•ć…¶ä»–ć‡œæ•°ïŒŒFastAPI äžäŒšćœ±ć“äœ è°ƒç”šćźƒä»Źçš„æ–čćŒă€‚ +äœ ćŻç›ŽæŽ„è°ƒç”šé€šèż‡ `def` 或 `async def` 戛ć»șçš„ä»»äœ•ć…¶ä»–ć·„ć…·ć‡œæ•°ïŒŒFastAPI äžäŒšćœ±ć“äœ è°ƒç”šćźƒä»Źçš„æ–čćŒă€‚ èż™äžŽ FastAPI äžș䜠调甚*è·ŻćŸ„æ“äœœć‡œæ•°*ć’ŒäŸè”–éĄčçš„é€»èŸ‘ç›žćă€‚ -ćŠ‚æžœäœ çš„ć‡œæ•°æ˜Żé€šèż‡ `def` ćŁ°æ˜Žçš„ïŒŒćźƒć°†èą«ç›ŽæŽ„è°ƒç”šïŒˆćœšä»Łç äž­çŒ–ć†™çš„ćœ°æ–čïŒ‰ïŒŒè€ŒäžäŒšćœšçșżçš‹æ± äž­ïŒ›ćŠ‚æžœèż™äžȘć‡œæ•°é€šèż‡ `async def` ćŁ°æ˜ŽïŒŒćœ“ćœšä»Łç äž­è°ƒç”šæ—¶ïŒŒäœ ć°±ćș”èŻ„äœżç”š `await` ç­‰ćŸ…ć‡œæ•°çš„ç»“æžœă€‚ +ćŠ‚æžœäœ çš„ć·„ć…·ć‡œæ•°æ˜Żé€šèż‡ `def` ćŁ°æ˜Žçš„ïŒŒćźƒć°†èą«ç›ŽæŽ„è°ƒç”šïŒˆćœšä»Łç äž­çŒ–ć†™çš„ćœ°æ–čïŒ‰ïŒŒè€ŒäžäŒšćœšçșżçš‹æ± äž­ïŒ›ćŠ‚æžœèż™äžȘć‡œæ•°é€šèż‡ `async def` ćŁ°æ˜ŽïŒŒćœ“ćœšä»Łç äž­è°ƒç”šæ—¶ïŒŒäœ ć°±ćș”èŻ„äœżç”š `await` ç­‰ćŸ…ć‡œæ•°çš„ç»“æžœă€‚ --- diff --git a/docs/zh/docs/deployment/cloud.md b/docs/zh/docs/deployment/cloud.md index 025715f52..d20cc3ce1 100644 --- a/docs/zh/docs/deployment/cloud.md +++ b/docs/zh/docs/deployment/cloud.md @@ -16,7 +16,7 @@ FastAPI Cloud æ˜Ż *FastAPI and friends* ćŒ€æșéĄčç›źçš„äž»èŠè”žćŠ©æ–čć’Œè”„é‡‘ ## äș‘æœćŠĄć•† - è”žćŠ©ć•† { #cloud-providers-sponsors } -èż˜æœ‰äž€äș›äș‘æœćŠĄć•†äčŸäŒš ✹ [**è”žćŠ© FastAPI**](../help-fastapi.md#sponsor-the-author) ✹。🙇 +èż˜æœ‰äž€äș›äș‘æœćŠĄć•†äčŸäŒš ✹ [**è”žćŠ© FastAPI**](https://github.com/sponsors/tiangolo) ✹。🙇 䜠äčŸćŻä»„è€ƒè™‘æŒ‰ç…§ä»–ä»Źçš„æŒ‡ć—ć°èŻ•ä»–ä»Źçš„æœćŠĄïŒš diff --git a/docs/zh/docs/deployment/concepts.md b/docs/zh/docs/deployment/concepts.md index dd5ba2ba8..4e7d69b41 100644 --- a/docs/zh/docs/deployment/concepts.md +++ b/docs/zh/docs/deployment/concepts.md @@ -1,6 +1,6 @@ # 郚çœČæŠ‚ćż” { #deployments-concepts } -朹郹çœČ **FastAPI** ćș”甚皋ćșæˆ–ä»»äœ•ç±»ćž‹çš„ Web API æ—¶ïŒŒæœ‰ć‡ äžȘæŠ‚ćż”ć€ŒćŸ—äș†è§ŁïŒŒé€šèż‡æŽŒæĄèż™äș›æŠ‚ćż”æ‚šćŻä»„æ‰Ÿćˆ°**æœ€ćˆé€‚çš„**æ–čæł•杄**郚çœČ悚的ćș”甚皋ćș**。 +朹郹çœČ **FastAPI** ćș”甚皋ćșïŒŒæˆ–è€…ćźžé™…äžŠïŒŒä»»äœ•ç±»ćž‹çš„ Web API æ—¶ïŒŒæœ‰ć‡ äžȘäœ ćŻèƒœäŒšć…łćżƒçš„æŠ‚ćż”ïŒŒé€šèż‡æŽŒæĄèż™äș›æŠ‚ćż”äœ ćŻä»„æ‰Ÿćˆ°**æœ€ćˆé€‚çš„**æ–čæł•杄**郚çœČ䜠的ćș”甚皋ćș**。 侀äș›é‡èŠçš„æŠ‚ćż”æ˜ŻïŒš @@ -9,23 +9,23 @@ * é‡æ–°ćŻćŠš * ć€ćˆ¶ïŒˆèżèĄŒçš„èż›çš‹æ•°ïŒ‰ * 憅歘 -* ćŒ€ć§‹ć‰çš„ć…ˆć‰æ­„éȘ€ +* ćŻćŠšć‰çš„ć…ˆć‰æ­„éȘ€ æˆ‘ä»ŹæŽ„äž‹æ„äș†è§Łćźƒä»Źć°†ćŠ‚äœ•ćœ±ć“**郚çœČ**。 -æˆ‘ä»Źçš„æœ€ç»ˆç›źæ ‡æ˜Żèƒœć€Ÿä»„**漉慹**的æ–čćŒ**äžș悚的 API ćźąæˆ·ç«Ż**æäŸ›æœćŠĄïŒŒćŒæ—¶èŠ**éżć…äž­æ–­**ćč¶äž”ć°œćŻèƒœé«˜æ•ˆćœ°ćˆ©ç”š**èźĄçź—è”„æș**ïŒˆäŸ‹ćŠ‚èżœçš‹æœćŠĄć™š/虚拟æœșïŒ‰ă€‚ 🚀 +æœ€ç»ˆç›źæ ‡æ˜Żèƒœć€Ÿä»„**漉慹**的æ–čćŒ**äžș䜠的 API ćźąæˆ·ç«Ż**æäŸ›æœćŠĄïŒŒćŒæ—¶**éżć…äž­æ–­**ćč¶äž”ć°œćŻèƒœé«˜æ•ˆćœ°ćˆ©ç”š**èźĄçź—è”„æș**ïŒˆäŸ‹ćŠ‚èżœçš‹æœćŠĄć™š/虚拟æœșïŒ‰ă€‚ 🚀 -æˆ‘ć°†ćœšèż™é‡Œć‘ŠèŻ‰æ‚šæ›Žć€šć…łäșŽèż™äș›**æŠ‚ćż”**çš„äżĄæŻïŒŒćžŒæœ›èƒœç»™æ‚šæäŸ›**盎觉**æ„ć†łćźšćŠ‚äœ•ćœšéžćžžäžćŒçš„çŽŻćąƒäž­éƒšçœČ APIïŒŒç”šè‡łćœšæ˜Żć°šäžć­˜ćœšçš„**æœȘ杄**的环汃里。 +æˆ‘ć°†ćœšèż™é‡Œć‘ŠèŻ‰äœ æ›Žć€šć…łäșŽèż™äș›**æŠ‚ćż”**çš„äżĄæŻïŒŒćžŒæœ›èƒœç»™äœ æäŸ›**盎觉**æ„ć†łćźšćŠ‚äœ•ćœšéžćžžäžćŒçš„çŽŻćąƒäž­éƒšçœČ䜠的 APIïŒŒç”šè‡łæ˜Żćœšć°šäžć­˜ćœšçš„**æœȘ杄**环汃里。 -é€šèż‡è€ƒè™‘èż™äș›æŠ‚ćż”ïŒŒæ‚šć°†èƒœć€Ÿ**èŻ„äŒ°ć’ŒèźŸèźĄ**郚çœČ**悚è‡Ș深的 API**çš„æœ€äœłæ–čćŒă€‚ +é€šèż‡è€ƒè™‘èż™äș›æŠ‚ćż”ïŒŒäœ ć°†èƒœć€Ÿ**èŻ„äŒ°ć’ŒèźŸèźĄ**郚çœČ**䜠è‡Ș深的 API** çš„æœ€äœłæ–čćŒă€‚ -ćœšæŽ„äž‹æ„çš„ç« èŠ‚äž­ïŒŒæˆ‘ć°†äžșæ‚šæäŸ›æ›Žć€šéƒšçœČ FastAPI ćș”甚皋ćșçš„**ć…·äœ“æ–čæł•**。 +ćœšæŽ„äž‹æ„çš„ç« èŠ‚äž­ïŒŒæˆ‘ć°†äžșäœ æäŸ›æ›Žć€šéƒšçœČ FastAPI ćș”甚皋ćșçš„**ć…·äœ“æ–čæĄˆ**。 -äœ†çŽ°ćœšïŒŒèź©æˆ‘ä»Źä»”ç»†çœ‹äž€äž‹èż™äș›é‡èŠçš„**æŠ‚ćż”**。 èż™äș›æŠ‚ćż”äčŸé€‚甚äșŽä»»äœ•慶他类枋的 Web API。 💡 +äœ†çŽ°ćœšïŒŒèź©æˆ‘ä»Źä»”ç»†çœ‹äž€äž‹èż™äș›é‡èŠçš„**æŠ‚ćż”æ€§æƒłæł•**ă€‚èż™äș›æŠ‚ćż”äčŸé€‚甚äșŽä»»äœ•慶他类枋的 Web API。 💡 ## ćź‰ć…šæ€§ - HTTPS { #security-https } -朹[äžŠäž€ç« æœ‰ć…ł HTTPS](https.md) äž­ïŒŒæˆ‘ä»Źäș†è§Łäș† HTTPS ćŠ‚äœ•äžș悚的 API æäŸ›ćŠ ćŻ†ă€‚ +朹[äžŠäž€ç« æœ‰ć…ł HTTPS](https.md) äž­ïŒŒæˆ‘ä»Źäș†è§Łäș† HTTPS ćŠ‚äœ•äžș䜠的 API æäŸ›ćŠ ćŻ†ă€‚ æˆ‘ä»Źèż˜çœ‹ćˆ°ïŒŒHTTPS 通枞由ćș”甚皋ćșæœćŠĄć™šçš„**ć€–éƒš**组件**TLS ç»ˆæ­ąä»Łç†**ïŒ‰æäŸ›ă€‚ @@ -33,7 +33,7 @@ ### HTTPS ç€șäŸ‹ć·„ć…· { #example-tools-for-https } -æ‚šćŻä»„ç”šäœœ TLS ç»ˆæ­ąä»Łç†çš„äž€äș›ć·„ć…·ćŒ…æ‹ŹïŒš +äœ ćŻä»„ç”šäœœ TLS ç»ˆæ­ąä»Łç†çš„äž€äș›ć·„ć…·ćŒ…æ‹ŹïŒš * Traefik * è‡ȘćŠšć€„ç†èŻäčŠæ›Žæ–° ✹ @@ -43,13 +43,13 @@ * äœżç”š Certbot ç­‰ć€–éƒšç»„ä»¶èż›èĄŒèŻäčŠæ›Žæ–° * HAProxy * äœżç”š Certbot ç­‰ć€–éƒšç»„ä»¶èż›èĄŒèŻäčŠæ›Žæ–° -* ćžŠæœ‰ Ingress ControllerïŒˆćŠ‚ Nginx 的 Kubernetes +* ćžŠæœ‰ Ingress ControllerïŒˆćŠ‚ Nginx的 Kubernetes * äœżç”šèŻžćŠ‚ cert-manager äč‹ç±»çš„ć€–éƒšç»„ä»¶æ„èż›èĄŒèŻäčŠæ›Žæ–° * 由äș‘æœćŠĄć•†ć†…éƒšć€„ç†ïŒŒäœœäžșć…¶æœćŠĄçš„äž€éƒšćˆ†ïŒˆèŻ·é˜…èŻ»äž‹æ–‡đŸ‘‡ïŒ‰ -ćŠäž€ç§é€‰æ‹©æ˜Żæ‚šćŻä»„äœżç”š**äș‘æœćŠĄ**æ„ćźŒæˆæ›Žć€šć·„äœœïŒŒćŒ…æ‹ŹèźŸçœź HTTPS。 ćźƒćŻèƒœæœ‰äž€äș›é™ćˆ¶æˆ–ć‘æ‚šæ”¶ć–æ›Žć€šèŽčç”šç­‰ă€‚äœ†ćœšèż™ç§æƒ…ć†”äž‹ïŒŒæ‚šäžćż…è‡Șć·±èźŸçœź TLS ç»ˆæ­ąä»Łç†ă€‚ +ćŠäž€ç§é€‰æ‹©æ˜Żäœ ćŻä»„äœżç”š**äș‘æœćŠĄ**æ„ćźŒæˆæ›Žć€šć·„äœœïŒŒćŒ…æ‹ŹèźŸçœź HTTPSă€‚ćźƒćŻèƒœæœ‰äž€äș›é™ćˆ¶æˆ–ć‘äœ æ”¶ć–æ›Žć€šèŽčç”šç­‰ă€‚äœ†ćœšèż™ç§æƒ…ć†”äž‹ïŒŒäœ äžćż…è‡Șć·±èźŸçœź TLS ç»ˆæ­ąä»Łç†ă€‚ -æˆ‘ć°†ćœšæŽ„äž‹æ„çš„ç« èŠ‚äž­ć‘æ‚šć±•ç€ș侀äș›ć…·äœ“ç€șäŸ‹ă€‚ +æˆ‘ć°†ćœšæŽ„äž‹æ„çš„ç« èŠ‚äž­ć‘äœ ć±•ç€ș侀äș›ć…·äœ“ç€șäŸ‹ă€‚ --- @@ -63,52 +63,52 @@ **繋ćș**èż™äžȘèŻé€šćžžç”šæ„æèż°ćŸˆć€šäžœè„żïŒš -* æ‚šçŒ–ć†™çš„ **代码****Python 文件**。 -* æ“äœœçł»ç»ŸćŻä»„**æ‰§èĄŒ**的**文件**ïŒŒäŸ‹ćŠ‚ïŒš`python`、`python.exe`或`uvicorn`。 -* ćœšæ“äœœçł»ç»ŸäžŠ**èżèĄŒ**ă€äœżç”šCPU ćč¶ć°†ć†…ćźč歘悹朹憅歘侊的ç‰č漚繋ćșă€‚ èż™äčŸèą«ç§°äžș**èż›çš‹**。 +* äœ çŒ–ć†™çš„ **代码****Python 文件**。 +* æ“äœœçł»ç»ŸćŻä»„**æ‰§èĄŒ**的**文件**ïŒŒäŸ‹ćŠ‚ïŒš`python`、`python.exe` 或 `uvicorn`。 +* ćœšæ“äœœçł»ç»ŸäžŠ**èżèĄŒ**ă€äœżç”š CPU ćč¶ć°†ć†…ćźč歘悹朹憅歘侊的ç‰č漚繋ćșă€‚èż™äčŸèą«ç§°äžș**èż›çš‹**。 ### 什ä舿˜Żèż›çš‹ { #what-is-a-process } -**èż›çš‹** èż™äžȘèŻé€šćžžä»„æ›Žć…·äœ“çš„æ–čćŒäœżç”šïŒŒä»…æŒ‡ćœšæ“äœœçł»ç»Ÿäž­èżèĄŒçš„äžœè„żïŒˆćŠ‚äžŠéąçš„æœ€ćŽäž€ç‚č +**èż›çš‹**èż™äžȘèŻé€šćžžä»„æ›Žć…·äœ“çš„æ–čćŒäœżç”šïŒŒä»…æŒ‡ćœšæ“äœœçł»ç»Ÿäž­èżèĄŒçš„äžœè„żïŒˆćŠ‚äžŠéąçš„æœ€ćŽäž€ç‚č * ćœšæ“äœœçł»ç»ŸäžŠ**èżèĄŒ**的ç‰č漚繋ćșă€‚ * èż™äžæ˜ŻæŒ‡æ–‡ä»¶ïŒŒäčŸäžæ˜ŻæŒ‡ä»Łç ïŒŒćźƒ**ć…·äœ“**æŒ‡çš„æ˜Żæ“äœœçł»ç»Ÿæ­Łćœš**æ‰§èĄŒ**ć’ŒçźĄç†çš„äžœè„żă€‚ -* 任䜕皋ćșïŒŒä»»äœ•ä»Łç ïŒŒ**ćȘæœ‰ćœšæ‰§èĄŒæ—¶æ‰èƒœćšäș‹**。 ć› æ­€ïŒŒæ˜Żćœ“æœ‰**èż›çš‹æ­ŁćœšèżèĄŒ**æ—¶ă€‚ -* èŻ„èż›çš‹ćŻä»„ç”±æ‚šæˆ–æ“äœœçł»ç»Ÿ**ç»ˆæ­ą**ïŒˆæˆ–â€œæ€æ­»â€ïŒ‰ă€‚ é‚Łæ—¶ïŒŒćźƒćœæ­ąèżèĄŒ/èą«æ‰§èĄŒïŒŒćč¶äž”ćźƒćŻä»„**侍憍恚äș‹æƒ…**。 -* æ‚šèźĄçź—æœșäžŠèżèĄŒçš„æŻäžȘćș”甚皋ćșèƒŒćŽéƒœæœ‰äž€äș›èż›çš‹ïŒŒæŻäžȘæ­ŁćœšèżèĄŒçš„çš‹ćșïŒŒæŻäžȘçȘ—ćŁç­‰ă€‚ćč¶äž”é€šćžžćœšèźĄçź—æœșæ‰“ćŒ€æ—¶**ćŒæ—¶**èżèĄŒèźžć€šèż›çš‹ă€‚ +* 任䜕皋ćșïŒŒä»»äœ•ä»Łç ïŒŒ**ćȘæœ‰ćœšæ‰§èĄŒæ—¶æ‰èƒœćšäș‹**ă€‚ć› æ­€ïŒŒæ˜Żćœ“æœ‰**èż›çš‹æ­ŁćœšèżèĄŒ**æ—¶ă€‚ +* èŻ„èż›çš‹ćŻä»„ç”±äœ æˆ–æ“äœœçł»ç»Ÿ**ç»ˆæ­ą**ïŒˆæˆ–â€œæ€æ­»â€ïŒ‰ă€‚é‚Łæ—¶ïŒŒćźƒćœæ­ąèżèĄŒ/èą«æ‰§èĄŒïŒŒćč¶äž”ćźƒ**äžć†èƒœćšäș‹æƒ…**。 +* äœ èźĄçź—æœșäžŠèżèĄŒçš„æŻäžȘćș”甚皋ćșèƒŒćŽéƒœæœ‰äž€äș›èż›çš‹ïŒŒæŻäžȘæ­ŁćœšèżèĄŒçš„çš‹ćșïŒŒæŻäžȘçȘ—ćŁç­‰ă€‚ćč¶äž”é€šćžžćœšèźĄçź—æœșæ‰“ćŒ€æ—¶**ćŒæ—¶**èżèĄŒèźžć€šèż›çš‹ă€‚ * **搌侀繋ćș**ćŻä»„æœ‰**〚äžȘèż›çš‹**ćŒæ—¶èżèĄŒă€‚ -ćŠ‚æžœæ‚šæŁ€æŸ„æ“äœœçł»ç»Ÿäž­çš„â€œä»»ćŠĄçźĄç†ć™šâ€æˆ–â€œçł»ç»Ÿç›‘è§†ć™šâ€ïŒˆæˆ–ç±»äŒŒć·„ć…·ïŒ‰ïŒŒæ‚šć°†èƒœć€Ÿçœ‹ćˆ°èźžć€šæ­ŁćœšèżèĄŒçš„èż›çš‹ă€‚ +ćŠ‚æžœäœ æŁ€æŸ„æ“äœœçł»ç»Ÿäž­çš„â€œä»»ćŠĄçźĄç†ć™šâ€æˆ–â€œçł»ç»Ÿç›‘è§†ć™šâ€ïŒˆæˆ–ç±»äŒŒć·„ć…·ïŒ‰ïŒŒäœ ć°†èƒœć€Ÿçœ‹ćˆ°èźžć€šæ­ŁćœšèżèĄŒçš„èż›çš‹ă€‚ -äŸ‹ćŠ‚ïŒŒæ‚šćŻèƒœäŒšçœ‹ćˆ°æœ‰ć€šäžȘèż›çš‹èżèĄŒćŒäž€äžȘæ”è§ˆć™šçš‹ćșïŒˆFirefox、Chrome、Edge ç­‰ïŒ‰ă€‚ ä»–ä»Źé€šćžžæŻäžȘtabèżèĄŒäž€äžȘèż›çš‹ïŒŒć†ćŠ äžŠäž€äș›ć…¶ä»–éąć€–çš„èż›çš‹ă€‚ +äŸ‹ćŠ‚ïŒŒäœ ćŻèƒœäŒšçœ‹ćˆ°æœ‰ć€šäžȘèż›çš‹èżèĄŒćŒäž€äžȘæ”è§ˆć™šçš‹ćșïŒˆFirefox、Chrome、Edge ç­‰ïŒ‰ă€‚ćźƒä»Źé€šćžžæŻäžȘ tab èżèĄŒäž€äžȘèż›çš‹ïŒŒć†ćŠ äžŠäž€äș›ć…¶ä»–éąć€–çš„èż›çš‹ă€‚ --- -çŽ°ćœšæˆ‘ä»ŹçŸ„é“äș†æœŻèŻ­â€œèż›çš‹â€ć’Œâ€œçš‹ćșâ€äč‹é—Žçš„ćŒșćˆ«ïŒŒèź©æˆ‘ä»Źç»§ç»­èźšèźș郚çœČ。 +çŽ°ćœšæˆ‘ä»ŹçŸ„é“äș†æœŻèŻ­ **èż›çš‹** 撌 **繋ćș** äč‹é—Žçš„ćŒșćˆ«ïŒŒèź©æˆ‘ä»Źç»§ç»­èźšèźș郚çœČ。 ## ćŻćŠšæ—¶èżèĄŒ { #running-on-startup } -ćœšć€§ć€šæ•°æƒ…ć†”äž‹ïŒŒćœ“æ‚šćˆ›ć»ș Web API æ—¶ïŒŒæ‚šćžŒæœ›ćźƒ**ć§‹ç»ˆèżèĄŒ**ă€äžé—Žæ–­ïŒŒä»„äŸżæ‚šçš„ćźąæˆ·ç«Żć§‹ç»ˆćŻä»„èźżé—źćźƒă€‚ èż™æ˜Żćœ“ç„¶çš„ïŒŒé™€éžæ‚šæœ‰ç‰čćźšćŽŸć› ćžŒæœ›ćźƒä»…ćœšæŸäș›æƒ…ć†”äž‹èżèĄŒïŒŒäœ†ć€§ć€šæ•°æ—¶ć€™æ‚šćžŒæœ›ćźƒäžæ–­èżèĄŒćč¶äž”**揯甹**。 +ćœšć€§ć€šæ•°æƒ…ć†”äž‹ïŒŒćœ“äœ ćˆ›ć»ș Web API æ—¶ïŒŒäœ ćžŒæœ›ćźƒ**ć§‹ç»ˆèżèĄŒ**ă€äžé—Žæ–­ïŒŒä»„äŸżäœ çš„ćźąæˆ·ç«Żć§‹ç»ˆćŻä»„èźżé—źćźƒă€‚ćœ“ç„¶ïŒŒé™€éžäœ æœ‰ç‰čćźšćŽŸć› ćžŒæœ›ćźƒä»…ćœšæŸäș›æƒ…ć†”äž‹èżèĄŒïŒŒäœ†ć€§ć€šæ•°æ—¶ć€™äœ ćžŒæœ›ćźƒäžæ–­èżèĄŒćč¶äž”**揯甹**。 ### ćœšèżœçš‹æœćŠĄć™šäž­ { #in-a-remote-server } -ćœ“æ‚šèźŸçœźèżœçš‹æœćŠĄć™šïŒˆäș‘æœćŠĄć™šă€è™šæ‹Ÿæœșç­‰ïŒ‰æ—¶ïŒŒæ‚šćŻä»„ćšçš„æœ€çź€ć•çš„äș‹æƒ…ć°±æ˜Żäœżç”š `fastapi run`ïŒˆćźƒäœżç”š Uvicorn或类䌌æ–čćŒïŒŒæ‰‹ćŠšèżèĄŒïŒŒć°±ćƒæœŹćœ°ćŒ€ć‘æ—¶äž€æ ·ă€‚ +ćœ“äœ èźŸçœźèżœçš‹æœćŠĄć™šïŒˆäș‘æœćŠĄć™šă€è™šæ‹Ÿæœșç­‰ïŒ‰æ—¶ïŒŒäœ ćŻä»„ćšçš„æœ€çź€ć•çš„äș‹æƒ…ć°±æ˜Żäœżç”š `fastapi run`ïŒˆćźƒäœżç”š Uvicorn或类䌌æ–čćŒïŒŒæ‰‹ćŠšèżèĄŒïŒŒć°±ćƒæœŹćœ°ćŒ€ć‘æ—¶äž€æ ·ă€‚ -ćźƒć°†äŒšćœš**ćŒ€ć‘èż‡çš‹äž­**ć‘æŒ„äœœç”šćč¶ć‘æŒ„äœœç”šă€‚ +ćźƒć°†äŒš**ćœšćŒ€ć‘èż‡çš‹äž­**ć‘æŒ„äœœç”šćč¶äž”ćŸˆæœ‰ç”šă€‚ -äœ†æ˜ŻïŒŒćŠ‚æžœæ‚šäžŽæœćŠĄć™šçš„èżžæŽ„äžąć€±ïŒŒ**æ­ŁćœšèżèĄŒçš„èż›çš‹**ćŻèƒœäŒšç»ˆæ­ąă€‚ +äœ†æ˜ŻïŒŒćŠ‚æžœäœ äžŽæœćŠĄć™šçš„èżžæŽ„äžąć€±ïŒŒ**æ­ŁćœšèżèĄŒçš„èż›çš‹**ćŻèƒœäŒšç»ˆæ­ąă€‚ -ćŠ‚æžœæœćŠĄć™šé‡æ–°ćŻćŠšïŒˆäŸ‹ćŠ‚æ›Žæ–°ćŽæˆ–ä»Žäș‘æäŸ›ć•†èżç§»ćŽïŒ‰ïŒŒæ‚šćŻèƒœ**äžäŒšæłšæ„ćˆ°ćźƒ**。 ć› æ­€ïŒŒæ‚šç”šè‡łäžçŸ„é“ćż…éĄ»æ‰‹ćŠšé‡æ–°ćŻćŠšèŻ„èż›çš‹ă€‚ 所仄䜠的 API 氆䞀盎怄äșŽæŒ‚æŽ‰çš„çŠ¶æ€ă€‚ đŸ˜± +ćŠ‚æžœæœćŠĄć™šé‡æ–°ćŻćŠšïŒˆäŸ‹ćŠ‚æ›Žæ–°ćŽæˆ–ä»Žäș‘æäŸ›ć•†èżç§»ćŽïŒ‰ïŒŒäœ ćŻèƒœ**äžäŒšæłšæ„ćˆ°ćźƒ**ă€‚ć› æ­€ïŒŒäœ ç”šè‡łäžçŸ„é“ćż…éĄ»æ‰‹ćŠšé‡æ–°ćŻćŠšèŻ„èż›çš‹ă€‚æ‰€ä»„ïŒŒäœ çš„ API 氆䞀盎怄äșŽæŒ‚æŽ‰çš„çŠ¶æ€ă€‚ đŸ˜± ### ćŻćŠšæ—¶è‡ȘćŠšèżèĄŒ { #run-automatically-on-startup } -äž€èˆŹæ„èŻŽïŒŒæ‚šćŻèƒœćžŒæœ›æœćŠĄć™šçš‹ćșïŒˆäŸ‹ćŠ‚ UvicornïŒ‰ćœšæœćŠĄć™šćŻćŠšæ—¶è‡ȘćŠšćŻćŠšïŒŒćč¶äž”䞍需芁任䜕**äșșäžșćčČ鱄**ïŒŒèź©èż›çš‹ć§‹ç»ˆäžŽæ‚šçš„ API äž€è”·èżèĄŒïŒˆäŸ‹ćŠ‚ Uvicorn èżèĄŒæ‚šçš„ FastAPI ćș”甚皋ćșïŒ‰ 。 +äž€èˆŹæ„èŻŽïŒŒäœ ćŻèƒœćžŒæœ›æœćŠĄć™šçš‹ćșïŒˆäŸ‹ćŠ‚ UvicornïŒ‰ćœšæœćŠĄć™šćŻćŠšæ—¶è‡ȘćŠšćŻćŠšïŒŒćč¶äž”䞍需芁任䜕**äșșäžșćčČ鱄**ïŒŒèź©èż›çš‹ć§‹ç»ˆäžŽäœ çš„ API äž€è”·èżèĄŒïŒˆäŸ‹ćŠ‚ Uvicorn èżèĄŒäœ çš„ FastAPI ćș”甚皋ćșïŒ‰ă€‚ ### 捕独的繋ćș { #separate-program } -äžșäș†ćźžçŽ°èż™äž€ç‚čïŒŒæ‚šé€šćžžäŒšæœ‰äž€äžȘ**捕独的繋ćș**æ„çĄźäżæ‚šçš„ćș”甚皋ćșćœšćŻćŠšæ—¶èżèĄŒă€‚ ćœšèźžć€šæƒ…ć†”äž‹ïŒŒćźƒèż˜ćŻä»„çĄźäżć…¶ä»–ç»„ä»¶æˆ–ćș”甚皋ćșäčŸèżèĄŒïŒŒäŸ‹ćŠ‚æ•°æźćș“。 +äžșäș†ćźžçŽ°èż™äž€ç‚čïŒŒäœ é€šćžžäŒšæœ‰äž€äžȘ**捕独的繋ćș**æ„çĄźäżäœ çš„ćș”甚皋ćșćœšćŻćŠšæ—¶èżèĄŒă€‚ćœšèźžć€šæƒ…ć†”äž‹ïŒŒćźƒèż˜ćŻä»„çĄźäżć…¶ä»–ç»„ä»¶æˆ–ćș”甚皋ćșäčŸèżèĄŒïŒŒäŸ‹ćŠ‚æ•°æźćș“。 ### ćŻćŠšæ—¶èżèĄŒçš„ç€șäŸ‹ć·„ć…· { #example-tools-to-run-at-startup } @@ -123,43 +123,43 @@ * 䜜äžșć…¶æœćŠĄçš„äž€éƒšćˆ†ç”±äș‘æäŸ›ć•†ć†…éƒšć€„ç† * ć…¶ä»–çš„... -æˆ‘ć°†ćœšæŽ„äž‹æ„çš„ç« èŠ‚äž­äžșæ‚šæäŸ›æ›Žć…·äœ“çš„ç€șäŸ‹ă€‚ +æˆ‘ć°†ćœšæŽ„äž‹æ„çš„ç« èŠ‚äž­äžșäœ æäŸ›æ›Žć…·äœ“çš„ç€șäŸ‹ă€‚ ## é‡æ–°ćŻćŠš { #restarts } -侎硼保ćș”甚皋ćșćœšćŻćŠšæ—¶èżèĄŒç±»äŒŒïŒŒæ‚šćŻèƒœèż˜æƒłçĄźäżćźƒćœšæŒ‚æŽ‰ćŽ**é‡æ–°ćŻćŠš**。 +侎硼保ćș”甚皋ćșćœšćŻćŠšæ—¶èżèĄŒç±»äŒŒïŒŒäœ ćŻèƒœèż˜æƒłçĄźäżćźƒćœšć€±èŽ„ćŽ**é‡æ–°ćŻćŠš**。 ### æˆ‘ä»ŹäŒšçŠŻé”™èŻŻ { #we-make-mistakes } -䜜äžșäșșç±»ïŒŒæˆ‘ä»Źæ€»æ˜ŻäŒšçŠŻ**é”™èŻŻ**。 èœŻä»¶ć‡ äčŽ*æ€»æ˜Ż*朹侍搌的朰æ–č隐藏着**bug**。 🐛 +䜜äžșäșșç±»ïŒŒæˆ‘ä»Źæ€»æ˜ŻäŒšçŠŻ**é”™èŻŻ**ă€‚èœŻä»¶ć‡ äčŽ*æ€»æ˜Ż*朹侍搌的朰æ–č隐藏着 **bug**。 🐛 -䜜äžșćŒ€ć‘äșșć‘˜ïŒŒćœ“æˆ‘ä»Źć‘çŽ°èż™äș›bugćč¶ćźžçŽ°æ–°ćŠŸèƒœïŒˆäčŸćŻèƒœæ·»ćŠ æ–°bugđŸ˜…ïŒ‰æ—¶ïŒŒæˆ‘ä»ŹäŒšäžæ–­æ”čèż›ä»Łç ă€‚ +䜜äžșćŒ€ć‘äșșć‘˜ïŒŒćœ“æˆ‘ä»Źć‘çŽ°èż™äș› bug ćč¶ćźžçŽ°æ–°ćŠŸèƒœïŒˆäčŸćŻèƒœæ·»ćŠ æ–° bug đŸ˜…ïŒ‰æ—¶ïŒŒæˆ‘ä»ŹäŒšäžæ–­æ”čèż›ä»Łç ă€‚ ### è‡ȘćŠšć€„ç†ć°é”™èŻŻ { #small-errors-automatically-handled } -äœżç”š FastAPI 构ć»ș Web API æ—¶ïŒŒćŠ‚æžœæˆ‘ä»Źçš„ä»Łç äž­ć­˜ćœšé”™èŻŻïŒŒFastAPI é€šćžžäŒšć°†ć…¶ćŒ…ć«ćˆ°è§Šć‘é”™èŻŻçš„ć•äžȘèŻ·æ±‚äž­ă€‚ 🛡 +äœżç”š FastAPI 构ć»ș Web API æ—¶ïŒŒćŠ‚æžœæˆ‘ä»Źçš„ä»Łç äž­ć­˜ćœšé”™èŻŻïŒŒFastAPI é€šćžžäŒšć°†ć…¶é™ćˆ¶ćœšè§Šć‘é”™èŻŻçš„ć•äžȘèŻ·æ±‚äž­ă€‚ 🛡 ćŻčäșŽèŻ„èŻ·æ±‚ïŒŒćźąæˆ·ç«Żć°†æ”¶ćˆ° **500 ć†…éƒšæœćŠĄć™šé”™èŻŻ**䜆ćș”甚皋ćșć°†ç»§ç»­ć€„理䞋䞀äžȘèŻ·æ±‚ïŒŒè€Œäžæ˜ŻćźŒć…šćŽ©æșƒă€‚ ### æ›Žć€§çš„é”™èŻŻ - 掩æșƒ { #bigger-errors-crashes } -ć°œçźĄćŠ‚æ­€ïŒŒćœšæŸäș›æƒ…ć†”äž‹ïŒŒæˆ‘ä»ŹçŒ–ć†™çš„äž€äș›ä»Łç ćŻèƒœäŒšćŻŒè‡Žæ•ŽäžȘćș”甚皋ćșćŽ©æșƒïŒŒä»Žè€ŒćŻŒè‡Ž Uvicorn 撌 Python 掩æșƒă€‚ đŸ’„ +ć°œçźĄćŠ‚æ­€ïŒŒćœšæŸäș›æƒ…ć†”äž‹ïŒŒæˆ‘ä»ŹçŒ–ć†™çš„äž€äș›ä»Łç ćŻèƒœäŒš**ćŻŒè‡Žæ•ŽäžȘćș”甚皋ćșćŽ©æșƒ**ïŒŒä»Žè€ŒćŻŒè‡Ž Uvicorn 撌 Python 掩æșƒă€‚ đŸ’„ -ć°œçźĄćŠ‚æ­€ïŒŒæ‚šćŻèƒœäžćžŒæœ›ćș”甚皋ćșć› äžș某äžȘ㜰æ–čć‡șçŽ°é”™èŻŻè€ŒäżæŒæ­»æœșçŠ¶æ€ïŒŒæ‚šćŻèƒœćžŒæœ›ćźƒ**ç»§ç»­èżèĄŒ**ïŒŒè‡łć°‘ćŻčäșŽæœȘ砮杏的*è·ŻćŸ„æ“äœœ*。 +ć°œçźĄćŠ‚æ­€ïŒŒäœ ćŻèƒœäžćžŒæœ›ćș”甚皋ćșć› äžș某äžȘ㜰æ–čć‡șçŽ°é”™èŻŻè€ŒäżæŒæ­»æœșçŠ¶æ€ïŒŒäœ ćŻèƒœćžŒæœ›ćźƒ**ç»§ç»­èżèĄŒ**ïŒŒè‡łć°‘ćŻčäșŽæœȘæŸćçš„*è·ŻćŸ„æ“äœœ*。 ### 掩æșƒćŽé‡æ–°ćŻćŠš { #restart-after-crash } -äœ†ćœšé‚Łäș›äž„é‡é”™èŻŻćŻŒè‡Žæ­ŁćœšèżèĄŒçš„**èż›çš‹**掩æșƒçš„æƒ…憔䞋悚需芁䞀äžȘć€–éƒšç»„ä»¶æ„èŽŸèŽŁ**é‡æ–°ćŻćŠš**èż›çš‹ïŒŒè‡łć°‘ć°èŻ•ć‡ æŹĄ... +äœ†ćœšé‚Łäș›äž„é‡é”™èŻŻćŻŒè‡Žæ­ŁćœšèżèĄŒçš„**èż›çš‹**掩æșƒçš„æƒ…憔䞋䜠需芁䞀äžȘć€–éƒšç»„ä»¶æ„èŽŸèŽŁ**é‡æ–°ćŻćŠš**èż›çš‹ïŒŒè‡łć°‘ć°èŻ•ć‡ æŹĄ... /// tip | 提ç€ș -...ć°œçźĄćŠ‚æžœæ•ŽäžȘćș”甚皋ćșćȘæ˜Ż**ç«‹ćłćŽ©æșƒ**ïŒŒé‚Łä舿°žèżœé‡æ–°ćŻćŠšćźƒćŻèƒœæČĄæœ‰æ„äč‰ă€‚ äœ†ćœšèż™äș›æƒ…ć†”äž‹ïŒŒæ‚šćŻèƒœäŒšćœšćŒ€ć‘èż‡çš‹äž­æłšæ„ćˆ°ćźƒïŒŒæˆ–è€…è‡łć°‘ćœšéƒšçœČćŽç«‹ćłæłšæ„ćˆ°ćźƒă€‚ +...ć°œçźĄćŠ‚æžœæ•ŽäžȘćș”甚皋ćșćȘæ˜Ż**ç«‹ćłćŽ©æșƒ**ïŒŒé‚Łä舿°žèżœé‡æ–°ćŻćŠšćźƒćŻèƒœæČĄæœ‰æ„äč‰ă€‚äœ†ćœšèż™äș›æƒ…ć†”äž‹ïŒŒäœ ćŻèƒœäŒšćœšćŒ€ć‘èż‡çš‹äž­æłšæ„ćˆ°ćźƒïŒŒæˆ–è€…è‡łć°‘ćœšéƒšçœČćŽç«‹ćłæłšæ„ćˆ°ćźƒă€‚ ć› æ­€ïŒŒèź©æˆ‘ä»Źć…łæłšäž»èŠæƒ…ć†”ïŒŒćœš**æœȘ杄**的某äș›ç‰čćźšæƒ…ć†”äž‹ïŒŒćźƒćŻèƒœäŒšćźŒć…šćŽ©æșƒïŒŒäœ†é‡æ–°ćŻćŠšćźƒä»ç„¶æœ‰æ„äč‰ă€‚ /// -æ‚šćŻèƒœćžŒæœ›èź©èż™äžȘäžœè„żäœœäžș **ć€–éƒšç»„ä»¶** èŽŸèŽŁé‡æ–°ćŻćŠšæ‚šçš„ćș”甚皋ćșïŒŒć› äžșćˆ°é‚Łæ—¶ïŒŒäœżç”š Uvicorn 撌 Python 的搌侀ćș”甚皋ćșć·Čç»ćŽ©æșƒäș†ïŒŒć› æ­€ćŒäž€ćș”甚皋ćșçš„ç›žćŒä»Łç äž­æČĄæœ‰äžœè„żćŻä»„ćŻčæ­€ćšć‡ș什äčˆă€‚ +äœ ćŻèƒœćžŒæœ›èź©èż™äžȘèŽŸèŽŁé‡æ–°ćŻćŠšäœ çš„ćș”甚皋ćșçš„äžœè„żäœœäžș侀äžȘ**ć€–éƒšç»„ä»¶**ïŒŒć› äžșćˆ°é‚Łæ—¶ïŒŒäœżç”š Uvicorn 撌 Python 的搌侀ćș”甚皋ćșć·Čç»ćŽ©æșƒäș†ïŒŒć› æ­€ćŒäž€ćș”甚皋ćșçš„ç›žćŒä»Łç äž­æČĄæœ‰ä»»äœ•äžœè„żćŻä»„ćŻčæ­€ćšä»€äčˆă€‚ ### è‡ȘćŠšé‡æ–°ćŻćŠšçš„ç€șäŸ‹ć·„ć…· { #example-tools-to-restart-automatically } @@ -178,19 +178,19 @@ ## ć€ćˆ¶ - èż›çš‹ć’Œć†…ć­˜ { #replication-processes-and-memory } -ćŻčäșŽ FastAPI ćș”甚皋ćșïŒŒäœżç”šćƒ `fastapi` ć‘œä»€ïŒˆèżèĄŒ UvicornïŒ‰èż™æ ·çš„æœćŠĄć™šçš‹ćșïŒŒćœš**侀äžȘèż›çš‹**äž­èżèĄŒäž€æŹĄć°±ćŻä»„ćŒæ—¶äžș〚äžȘćźąæˆ·ç«ŻæäŸ›æœćŠĄă€‚ +ćŻčäșŽ FastAPI ćș”甚皋ćșïŒŒäœżç”šćƒèżèĄŒ Uvicorn 的 `fastapi` ć‘œä»€èż™æ ·çš„æœćŠĄć™šçš‹ćșïŒŒćœš**侀äžȘèż›çš‹**äž­èżèĄŒäž€æŹĄć°±ćŻä»„ćŒæ—¶äžș〚äžȘćźąæˆ·ç«ŻæäŸ›æœćŠĄă€‚ -äœ†ćœšèźžć€šæƒ…ć†”äž‹ïŒŒæ‚šäŒšćžŒæœ›ćŒæ—¶èżèĄŒć€šäžȘć·„äœœèż›çš‹ă€‚ +äœ†ćœšèźžć€šæƒ…ć†”äž‹ïŒŒäœ äŒšćžŒæœ›ćŒæ—¶èżèĄŒć€šäžȘć·„äœœèż›çš‹ă€‚ ### ć€šèż›çš‹ - Workers { #multiple-processes-workers } -ćŠ‚æžœæ‚šçš„ćźąæˆ·ç«Żæ•°é‡ć€šäșŽć•äžȘèż›çš‹ćŻä»„ć€„ç†çš„æ•°é‡ïŒˆäŸ‹ćŠ‚ïŒŒćŠ‚æžœè™šæ‹Ÿæœșäžæ˜Żć€Șć€§ïŒ‰ïŒŒćč¶äž”æœćŠĄć™šçš„ CPU 䞭有 **〚äžȘæ žćżƒ**ïŒŒé‚Łä舿‚šćŻä»„èź© **〚äžȘèż›çš‹** ćŒæ—¶èżèĄŒćŒäž€äžȘćș”甚皋ćșïŒŒćč¶ćœšćźƒä»Źäč‹é—Žćˆ†ć‘æ‰€æœ‰èŻ·æ±‚ă€‚ +ćŠ‚æžœäœ çš„ćźąæˆ·ç«Żæ•°é‡ć€šäșŽć•äžȘèż›çš‹ćŻä»„ć€„ç†çš„æ•°é‡ïŒˆäŸ‹ćŠ‚ïŒŒćŠ‚æžœè™šæ‹Ÿæœșäžæ˜Żć€Șć€§ïŒ‰ïŒŒćč¶äž”æœćŠĄć™šçš„ CPU 䞭有**〚äžȘæ žćżƒ**ïŒŒé‚Łäčˆäœ ćŻä»„èź©**〚äžȘèż›çš‹**ćŒæ—¶èżèĄŒćŒäž€äžȘćș”甚皋ćșïŒŒćč¶ćœšćźƒä»Źäč‹é—Žćˆ†ć‘æ‰€æœ‰èŻ·æ±‚ă€‚ -ćœ“æ‚šèżèĄŒćŒäž€ API 繋ćșçš„**〚äžȘèż›çš‹**æ—¶ïŒŒćźƒä»Źé€šćžžç§°äžș **workers**。 +ćœ“äœ èżèĄŒćŒäž€ API 繋ćșçš„**〚äžȘèż›çš‹**æ—¶ïŒŒćźƒä»Źé€šćžžç§°äžș **workers**。 ### ć·„äœœèż›çš‹ć’Œç«ŻćŁ { #worker-processes-and-ports } -èż˜èź°ćŸ—æ–‡æĄŁ [慳äșŽ HTTPS](https.md) äž­ćȘ有䞀äžȘèż›çš‹ćŻä»„äŸŠćŹæœćŠĄć™šäž­çš„ç«ŻćŁć’Œ IP ćœ°ć€çš„äž€ç§ç»„ćˆć—ïŒŸ +èż˜èź°ćŸ—æ–‡æĄŁ[慳äșŽ HTTPS](https.md) äž­èŻŽçš„ïŒŒćœšæœćŠĄć™šäž­ćȘ有䞀äžȘèż›çš‹ćŻä»„äŸŠćŹç«ŻćŁć’Œ IP ćœ°ć€çš„äž€ç§ç»„ćˆć—ïŒŸ çŽ°ćœšä»ç„¶æ˜ŻćŻč的。 @@ -198,124 +198,124 @@ ### æŻäžȘèż›çš‹çš„ć†…ć­˜ { #memory-per-process } -çŽ°ćœšïŒŒćœ“çš‹ćșć°†ć†…ćźčćŠ èœœćˆ°ć†…ć­˜äž­æ—¶ïŒŒäŸ‹ćŠ‚ïŒŒć°†æœș晹歩äč æšĄćž‹ćŠ èœœćˆ°ć˜é‡äž­ïŒŒæˆ–è€…ć°†ć€§æ–‡ä»¶çš„ć†…ćźčćŠ èœœćˆ°ć˜é‡äž­ïŒŒæ‰€æœ‰èż™äș›éƒœäŒšæ¶ˆè€—æœćŠĄć™šçš„äž€ç‚č憅歘 (RAM) 。 +çŽ°ćœšïŒŒćœ“çš‹ćșć°†ć†…ćźčćŠ èœœćˆ°ć†…ć­˜äž­æ—¶ïŒŒäŸ‹ćŠ‚ïŒŒć°†æœș晹歩äč æšĄćž‹ćŠ èœœćˆ°ć˜é‡äž­ïŒŒæˆ–è€…ć°†ć€§æ–‡ä»¶çš„ć†…ćźčćŠ èœœćˆ°ć˜é‡äž­ïŒŒæ‰€æœ‰èż™äș›éƒœäŒš**æ¶ˆè€—æœćŠĄć™šçš„äž€äș›ć†…ć­˜ (RAM)**。 -〚äžȘèż›çš‹é€šćžž**äžć…±äș«ä»»äœ•ć†…ć­˜**。 èż™æ„ć‘łç€æŻäžȘæ­ŁćœšèżèĄŒçš„èż›çš‹éƒœæœ‰è‡Șć·±çš„äžœè„żă€ć˜é‡ć’Œć†…ć­˜ă€‚ ćŠ‚æžœæ‚šçš„ä»Łç æ¶ˆè€—äș†ć€§é‡ć†…ć­˜ïŒŒ**æŻäžȘèż›çš‹**ć°†æ¶ˆè€—ç­‰é‡çš„ć†…ć­˜ă€‚ +〚äžȘèż›çš‹é€šćžž**äžć…±äș«ä»»äœ•ć†…ć­˜**ă€‚èż™æ„ć‘łç€æŻäžȘæ­ŁćœšèżèĄŒçš„èż›çš‹éƒœæœ‰è‡Șć·±çš„äžœè„żă€ć˜é‡ć’Œć†…ć­˜ă€‚ćŠ‚æžœäœ çš„ä»Łç æ¶ˆè€—äș†ć€§é‡ć†…ć­˜ïŒŒ**æŻäžȘèż›çš‹**ć°†æ¶ˆè€—ç­‰é‡çš„ć†…ć­˜ă€‚ ### æœćŠĄć™šć†…ć­˜ { #server-memory } -äŸ‹ćŠ‚ïŒŒćŠ‚æžœæ‚šçš„ä»Łç ćŠ èœœ **1 GB ć€§ć°**的æœș晹歩äč æšĄćž‹ïŒŒćˆ™ćœ“æ‚šäœżç”š API èżèĄŒäž€äžȘèż›çš‹æ—¶ïŒŒćźƒć°†è‡łć°‘æ¶ˆè€— 1 GB RAM。 ćŠ‚æžœæ‚šćŻćŠš **4 äžȘèż›çš‹**4 äžȘć·„äœœèż›çš‹ïŒ‰ïŒŒæŻäžȘèż›çš‹ć°†æ¶ˆè€— 1 GB RAM。 ć› æ­€ïŒŒæ‚šçš„ API æ€»ć…±ć°†æ¶ˆè€— **4 GB RAM**。 +äŸ‹ćŠ‚ïŒŒćŠ‚æžœäœ çš„ä»Łç ćŠ èœœ**ć€§ć°äžș 1 GB** 的æœș晹歩äč æšĄćž‹ïŒŒćˆ™ćœ“äœ äœżç”š API èżèĄŒäž€äžȘèż›çš‹æ—¶ïŒŒćźƒć°†è‡łć°‘æ¶ˆè€— 1 GB RAMă€‚ćŠ‚æžœäœ ćŻćŠš **4 äžȘèż›çš‹**4 äžȘć·„äœœèż›çš‹ïŒ‰ïŒŒæŻäžȘèż›çš‹ć°†æ¶ˆè€— 1 GB RAMă€‚ć› æ­€ïŒŒäœ çš„ API æ€»ć…±ć°†æ¶ˆè€— **4 GB RAM**。 -ćŠ‚æžœæ‚šçš„èżœçš‹æœćŠĄć™šæˆ–è™šæ‹ŸæœșćȘ有 3 GB RAMïŒŒć°èŻ•ćŠ èœœè¶…èż‡ 4 GB RAM ć°†ćŻŒè‡Žé—źéą˜ă€‚ 🚹 +ćŠ‚æžœäœ çš„èżœçš‹æœćŠĄć™šæˆ–è™šæ‹ŸæœșćȘ有 3 GB RAMïŒŒć°èŻ•ćŠ èœœè¶…èż‡ 4 GB RAM ć°†ćŻŒè‡Žé—źéą˜ă€‚ 🚹 ### ć€šèż›çš‹ - 侀äžȘäŸ‹ć­ { #multiple-processes-an-example } ćœšæ­€ç€ș䟋䞭有䞀äžȘ **Manager Process** 搯抹ćč¶æŽ§ćˆ¶äž€äžȘ **Worker Processes**。 -èŻ„çźĄç†ć™šèż›çš‹ćŻèƒœæ˜Żç›‘ćŹ IP 侭的 **ç«ŻćŁ** çš„èż›çš‹ă€‚ ćźƒć°†æ‰€æœ‰é€šäżĄäŒ èŸ“ćˆ°ć·„äœœèż›çš‹ă€‚ +èŻ„çźĄç†ć™šèż›çš‹ćŻèƒœæ˜Żç›‘ćŹ IP 侭的**ç«ŻćŁ**çš„èż›çš‹ă€‚ćźƒć°†æ‰€æœ‰é€šäżĄäŒ èŸ“ćˆ°ć·„äœœèż›çš‹ă€‚ -èż™äș›ć·„äœœèż›çš‹ć°†æ˜ŻèżèĄŒæ‚šçš„ćș”甚皋ćșçš„èż›çš‹ïŒŒćźƒä»Źć°†æ‰§èĄŒäž»èŠèźĄçź—ä»„æŽ„æ”¶ **èŻ·æ±‚** ćč¶èż”曞 **操ćș”**ćč¶äž”ćźƒä»Źć°†ćŠ èœœæ‚šæ”Ÿć…„ RAM äž­çš„ć˜é‡äž­çš„ä»»äœ•ć†…ćźč。 +èż™äș›ć·„äœœèż›çš‹ć°†æ˜ŻèżèĄŒäœ çš„ćș”甚皋ćșçš„èż›çš‹ïŒŒćźƒä»Źć°†æ‰§èĄŒäž»èŠèźĄçź—ä»„æŽ„æ”¶**èŻ·æ±‚**ćč¶èż”曞**操ćș”**ćč¶äž”ćźƒä»Źć°†ćŠ èœœäœ æ”Ÿć…„ RAM äž­çš„ć˜é‡äž­çš„ä»»äœ•ć†…ćźč。 -ćœ“ç„¶ïŒŒé™€äș†æ‚šçš„ćș”甚皋ćșäč‹ć€–ïŒŒćŒäž€ć°æœșć™šćŻèƒœèż˜èżèĄŒ**ć…¶ä»–èż›çš‹**。 +ćœ“ç„¶ïŒŒé™€äș†äœ çš„ćș”甚皋ćșäč‹ć€–ïŒŒćŒäž€ć°æœșć™šćŻèƒœèż˜èżèĄŒ**ć…¶ä»–èż›çš‹**。 侀äžȘæœ‰è¶Łçš„ç»†èŠ‚æ˜ŻïŒŒéšç€æ—¶é—Žçš„æŽšç§»ïŒŒæŻäžȘèż›çš‹äœżç”šçš„ **CPU ç™Ÿćˆ†æŻ”**ćŻèƒœäŒšć‘ç”ŸćŸˆć€§ć˜ćŒ–ïŒŒäœ†**憅歘 (RAM)** é€šćžžäŒšæˆ–ć€šæˆ–ć°‘äżæŒ**繳漚**。 -ćŠ‚æžœæ‚šæœ‰äž€äžȘæŻæŹĄæ‰§èĄŒç›žćœ“æ•°é‡çš„èźĄçź—çš„ APIćč¶äž”æ‚šæœ‰ćŸˆć€šćźąæˆ·ç«ŻïŒŒé‚Łäčˆ **CPU ćˆ©ç”šçŽ‡** ćŻèƒœäčŸäŒšäżæŒçšłćźšïŒˆè€Œäžæ˜Żäžæ–­ćż«é€ŸäžŠć‡ć’Œäž‹é™ïŒ‰ă€‚ +ćŠ‚æžœäœ æœ‰äž€äžȘæŻæŹĄæ‰§èĄŒç›žćœ“æ•°é‡çš„èźĄçź—çš„ APIćč¶äž”äœ æœ‰ćŸˆć€šćźąæˆ·ç«ŻïŒŒé‚Łäčˆ **CPU ćˆ©ç”šçŽ‡** ćŻèƒœ*äčŸäŒšäżæŒçšłćźš*ïŒˆè€Œäžæ˜Żäžæ–­ćż«é€ŸäžŠć‡ć’Œäž‹é™ïŒ‰ă€‚ ### ć€ćˆ¶ć·„ć…·ć’Œç­–ç•„ç€ș䟋 { #examples-of-replication-tools-and-strategies } -ćŻä»„é€šèż‡ć€šç§æ–čæł•æ„ćźžçŽ°èż™äž€ç›źæ ‡ïŒŒæˆ‘ć°†ćœšæŽ„äž‹æ„çš„ç« èŠ‚äž­ć‘æ‚šèŻŠç»†ä»‹ç»ć…·äœ“ç­–ç•„ïŒŒäŸ‹ćŠ‚ćœšè°ˆèźș Docker 撌ćźčć™šæ—¶ă€‚ +ćŻä»„é€šèż‡ć€šç§æ–čæł•æ„ćźžçŽ°èż™äž€ç›źæ ‡ïŒŒæˆ‘ć°†ćœšæŽ„äž‹æ„çš„ç« èŠ‚äž­ć‘äœ èŻŠç»†ä»‹ç»ć…·äœ“ç­–ç•„ïŒŒäŸ‹ćŠ‚ćœšè°ˆèźș Docker 撌ćźčć™šæ—¶ă€‚ -èŠè€ƒè™‘çš„äž»èŠé™ćˆ¶æ˜Żćż…éĄ»æœ‰äž€äžȘ**捕äžȘ**ç»„ä»¶æ„ć€„ç†**ć…Źć…±IP**侭的**ç«ŻćŁ**。 ç„¶ćŽćźƒćż…éĄ»æœ‰äž€ç§æ–čæł•氆通俥**䌠蟓**ćˆ°ć€ćˆ¶çš„**èż›çš‹/worker**。 +èŠè€ƒè™‘çš„äž»èŠé™ćˆ¶æ˜Żćż…éĄ»æœ‰äž€äžȘ**捕äžȘ**ç»„ä»¶æ„ć€„ç†**ć…Źć…± IP** 侭的**ç«ŻćŁ**ă€‚ç„¶ćŽćźƒćż…éĄ»æœ‰äž€ç§æ–čæł•氆通俥**䌠蟓**ćˆ°ć€ćˆ¶çš„**èż›çš‹/worker**。 ä»„äž‹æ˜Żäž€äș›ćŻèƒœçš„ç»„ćˆć’Œç­–ç•„ * ćžŠæœ‰ `--workers` 的 **Uvicorn** - * 侀äžȘ Uvicorn **èż›çš‹çźĄç†ć™š** 氆监搬 **IP** 撌 **ç«ŻćŁ**ćč¶äž”ćźƒć°†ćŻćŠš **〚äžȘ Uvicorn ć·„äœœèż›çš‹**。 -* **Kubernetes** ć’Œć…¶ä»–ćˆ†ćžƒćŒ **ćźčć™šçł»ç»Ÿ** - * **Kubernetes** ć±‚äž­çš„æŸäș›äžœè„żć°†äŸŠćŹ **IP** 撌 **ç«ŻćŁ**。 ć€ćˆ¶ć°†é€šèż‡æ‹„æœ‰**〚äžȘćźč晹**ïŒŒæŻäžȘćźčć™šèżèĄŒ**侀äžȘ Uvicorn èż›çš‹**。 -* **äș‘æœćŠĄ** äžșæ‚šć€„ç†æ­€é—źéą˜ - * äș‘æœćŠĄćŻèƒœ**äžșæ‚šć€„ç†ć€ćˆ¶**。 ćźƒćŻèƒœäŒšèź©æ‚šćźšäč‰ **èŠèżèĄŒçš„èż›çš‹**ïŒŒæˆ–èŠäœżç”šçš„ **ćźčć™šæ˜ ćƒ**ïŒŒćœšä»»äœ•æƒ…ć†”äž‹ïŒŒćźƒćŸˆćŻèƒœæ˜Ż **捕äžȘ Uvicorn èż›çš‹**ćč¶äž”äș‘æœćŠĄć°†èŽŸèŽŁć€ćˆ¶ćźƒă€‚ + * 侀äžȘ Uvicorn **èż›çš‹çźĄç†ć™š**氆监搬 **IP** 撌**ç«ŻćŁ**ćč¶äž”ćźƒć°†ćŻćŠš**〚äžȘ Uvicorn ć·„äœœèż›çš‹**。 +* **Kubernetes** ć’Œć…¶ä»–ćˆ†ćžƒćŒ**ćźčć™šçł»ç»Ÿ** + * **Kubernetes** ć±‚äž­çš„æŸäș›äžœè„żć°†äŸŠćŹ **IP** 撌**ç«ŻćŁ**ă€‚ć€ćˆ¶ć°†é€šèż‡æ‹„æœ‰**〚äžȘćźč晹**æ„ćźŒæˆïŒŒæŻäžȘćźčć™šèżèĄŒ**侀äžȘ Uvicorn èż›çš‹**。 +* **äș‘æœćŠĄ** äžșäœ ć€„ç†æ­€é—źéą˜ + * äș‘æœćŠĄćŻèƒœ**äžșäœ ć€„ç†ć€ćˆ¶**ă€‚ćźƒćŻèƒœäŒšèź©äœ ćźšäč‰**èŠèżèĄŒçš„èż›çš‹**ïŒŒæˆ–èŠäœżç”šçš„**ćźč晹镜惏**ïŒŒćœšä»»äœ•æƒ…ć†”äž‹ïŒŒćźƒćŸˆćŻèƒœæ˜Ż**捕äžȘ Uvicorn èż›çš‹**ćč¶äž”äș‘æœćŠĄć°†èŽŸèŽŁć€ćˆ¶ćźƒă€‚ /// tip | 提ç€ș -ćŠ‚æžœèż™äș›ć…łäșŽ **ćźč晹**、Docker 或 Kubernetes 的憅ćźčèż˜æČĄæœ‰ć€šć€§æ„äč‰ïŒŒèŻ·äžèŠæ‹…ćżƒă€‚ +ćŠ‚æžœèż™äș›ć…łäșŽ**ćźč晹**、Docker 或 Kubernetes 的憅ćźčèż˜æČĄæœ‰ć€šć€§æ„äč‰ïŒŒèŻ·äžèŠæ‹…ćżƒă€‚ -æˆ‘ć°†ćœšä»„ćŽçš„ç« èŠ‚äž­ć‘æ‚šèŻŠç»†ä»‹ç»ćźč晹镜惏、Docker、Kubernetes 等[ćźč晹侭的 FastAPI - Docker](docker.md)。 +æˆ‘ć°†ćœšä»„ćŽçš„ç« èŠ‚äž­ć‘äœ èŻŠç»†ä»‹ç»ćźč晹镜惏、Docker、Kubernetes 等[ćźč晹侭的 FastAPI - Docker](docker.md)。 /// ## 搯抹äč‹ć‰çš„æ­„éȘ€ { #previous-steps-before-starting } -ćœšćŸˆć€šæƒ…ć†”äž‹ïŒŒæ‚šćžŒæœ›ćœš**搯抹**ćș”甚皋ćșäč‹ć‰æ‰§èĄŒäž€äș›æ­„éȘ€ă€‚ +ćœšćŸˆć€šæƒ…ć†”äž‹ïŒŒäœ ćžŒæœ›ćœš**搯抹**ćș”甚皋ćșäč‹ć‰æ‰§èĄŒäž€äș›æ­„éȘ€ă€‚ -äŸ‹ćŠ‚ïŒŒæ‚šćŻèƒœæƒłèŠèżèĄŒ**æ•°æźćș“èżç§»**。 +äŸ‹ćŠ‚ïŒŒäœ ćŻèƒœæƒłèŠèżèĄŒ**æ•°æźćș“èżç§»**。 -äœ†ćœšć€§ć€šæ•°æƒ…ć†”äž‹ïŒŒæ‚šćȘæƒłæ‰§èĄŒèż™äș›æ­„éȘ€**äž€æŹĄ**。 +äœ†ćœšć€§ć€šæ•°æƒ…ć†”äž‹ïŒŒäœ ćȘæƒłæ‰§èĄŒèż™äș›æ­„éȘ€**äž€æŹĄ**。 -ć› æ­€ïŒŒćœšćŻćŠšćș”甚皋ćșäč‹ć‰ïŒŒæ‚šć°†éœ€èŠäž€äžȘ**捕äžȘèż›çš‹**æ„æ‰§èĄŒèż™äș›**ć‰éąçš„æ­„éȘ€**。 +ć› æ­€ïŒŒćœšćŻćŠšćș”甚皋ćșäč‹ć‰ïŒŒäœ ć°†éœ€èŠäž€äžȘ**捕äžȘèż›çš‹**æ„æ‰§èĄŒèż™äș›**ć‰éąçš„æ­„éȘ€**。 -è€Œäž”æ‚šćż…éĄ»çĄźäżćźƒæ˜ŻèżèĄŒć‰éąæ­„éȘ€çš„ć•äžȘèż›çš‹, *ćłäœż*äč‹ćŽæ‚šäžșćș”甚皋ćșæœŹèș«ćŻćŠš**〚äžȘèż›çš‹**ïŒˆć€šäžȘworkerïŒ‰ă€‚ ćŠ‚æžœèż™äș›æ­„éȘ€ç”±**〚äžȘèż›çš‹**èżèĄŒïŒŒćźƒä»ŹäŒšé€šèż‡ćœš**ćč¶èĄŒ**èżèĄŒæ„**é‡ć€**ć·„äœœïŒŒćč¶äž”ćŠ‚æžœèż™äș›æ­„éȘ€ćƒæ•°æźćș“èżç§»äž€æ ·éœ€èŠć°ćżƒć€„ç†ïŒŒćźƒä»ŹćŻèƒœäŒšćŻŒè‡ŽæŻäžȘèż›çš‹ć’Œć…¶ä»–èż›çš‹ć‘ç”Ÿć†ČçȘă€‚ +è€Œäž”äœ ćż…éĄ»çĄźäżćźƒæ˜ŻèżèĄŒć‰éąæ­„éȘ€çš„ć•äžȘèż›çš‹ïŒŒ*ćłäœż*äč‹ćŽäœ äžșćș”甚皋ćșæœŹèș«ćŻćŠš**〚äžȘèż›çš‹**ïŒˆć€šäžȘ workerïŒ‰ă€‚ćŠ‚æžœèż™äș›æ­„éȘ€ç”±**〚äžȘèż›çš‹**èżèĄŒïŒŒćźƒä»ŹäŒšé€šèż‡**ćč¶èĄŒ**èżèĄŒæ„**é‡ć€**ć·„äœœïŒŒćč¶äž”ćŠ‚æžœèż™äș›æ­„éȘ€ćƒæ•°æźćș“èżç§»äž€æ ·éœ€èŠć°ćżƒć€„ç†ïŒŒćźƒä»ŹćŻèƒœäŒšćŻŒè‡ŽćœŒæ­€äč‹é—Žć‘生ć†ČçȘă€‚ ćœ“ç„¶ïŒŒä蟿œ‰äž€äș›æƒ…ć†”ïŒŒć€šæŹĄèżèĄŒć‰éąçš„æ­„éȘ€äčŸæČĄæœ‰é—źéą˜ïŒŒèż™æ ·çš„èŻć°±ć„œćŠžć€šäș†ă€‚ /// tip | 提ç€ș -ćŠć€–ïŒŒèŻ·èź°äœïŒŒæ čæźæ‚šçš„èźŸçœźïŒŒćœšæŸäș›æƒ…ć†”äž‹ïŒŒæ‚šćœšćŒ€ć§‹ćș”甚皋ćșäč‹ć‰**ćŻèƒœç”šè‡łäžéœ€èŠä»»äœ•ć…ˆć‰çš„æ­„éȘ€**。 +ćŠć€–ïŒŒèŻ·èź°äœïŒŒæ čæźäœ çš„èźŸçœźïŒŒćœšæŸäș›æƒ…ć†”äž‹ïŒŒäœ ćœšćŻćŠšćș”甚皋ćșäč‹ć‰**ćŻèƒœç”šè‡łäžéœ€èŠä»»äœ•ć…ˆć‰çš„æ­„éȘ€**。 -ćœšèż™ç§æƒ…ć†”äž‹ïŒŒæ‚šć°±äžćż…æ‹…ćżƒèż™äș›ă€‚ đŸ€· +ćœšèż™ç§æƒ…ć†”äž‹ïŒŒäœ ć°±äžćż…æ‹…ćżƒèż™äș›ă€‚ đŸ€· /// ### ć‰éąæ­„éȘ€ç­–ç•„的ç€ș䟋 { #examples-of-previous-steps-strategies } -èż™ć°†ćœš**ćŸˆć€§çš‹ćșŠäžŠć–憳äșŽæ‚šéƒšçœČçł»ç»Ÿçš„æ–čćŒ**ćč¶äž”ćŻèƒœäžŽæ‚šćŻćŠšçš‹ćșă€ć€„ç†é‡ćŻç­‰çš„æ–čćŒæœ‰ć…łă€‚ +èż™ć°†ćœš**ćŸˆć€§çš‹ćșŠäžŠć–憳äșŽäœ éƒšçœČçł»ç»Ÿçš„æ–čćŒ**ćč¶äž”ćŻèƒœäžŽäœ ćŻćŠšçš‹ćșă€ć€„ç†é‡ćŻç­‰çš„æ–čćŒæœ‰ć…łă€‚ ä»„äž‹æ˜Żäž€äș›ćŻèƒœçš„æƒłæł• * Kubernetes 侭的“Init Container”朹ćș”甚皋ćșćźč晹äč‹ć‰èżèĄŒ -* 侀äžȘ bash è„šæœŹïŒŒèżèĄŒć‰éąçš„æ­„éȘ€ïŒŒç„¶ćŽćŻćŠšæ‚šçš„ćș”甚皋ćș - * 悚仍然需芁䞀种æ–čæł•æ„ćŻćŠš/é‡æ–°ćŻćŠš bash è„šæœŹă€æŁ€æ”‹é”™èŻŻç­‰ă€‚ +* 侀äžȘ bash è„šæœŹïŒŒèżèĄŒć‰éąçš„æ­„éȘ€ïŒŒç„¶ćŽćŻćŠšäœ çš„ćș”甚皋ćș + * 䜠仍然需芁䞀种æ–čæł•æ„ćŻćŠš/é‡æ–°ćŻćŠš*那äžȘ* bash è„šæœŹă€æŁ€æ”‹é”™èŻŻç­‰ă€‚ /// tip | 提ç€ș -æˆ‘ć°†ćœšä»„ćŽçš„ç« èŠ‚äž­äžșæ‚šæäŸ›äœżç”šćźčć™šæ‰§èĄŒæ­€æ“äœœçš„æ›Žć…·äœ“ç€ș䟋[ćźč晹侭的 FastAPI - Docker](docker.md)。 +æˆ‘ć°†ćœšä»„ćŽçš„ç« èŠ‚äž­äžșäœ æäŸ›äœżç”šćźčć™šæ‰§èĄŒæ­€æ“äœœçš„æ›Žć…·äœ“ç€ș䟋[ćźč晹侭的 FastAPI - Docker](docker.md)。 /// ## 蔄æșćˆ©ç”šçއ { #resource-utilization } -æ‚šçš„æœćŠĄć™šæ˜Żäž€äžȘ**蔄æș**ïŒŒæ‚šćŻä»„é€šèż‡æ‚šçš„çš‹ćșæ¶ˆè€—或**ćˆ©ç”š**CPU äžŠçš„èźĄçź—æ—¶é—Žä»„ćŠćŻç”šçš„ RAM 憅歘。 +äœ çš„æœćŠĄć™šæ˜Żäž€äžȘ**蔄æș**ïŒŒäœ ćŻä»„é€šèż‡äœ çš„çš‹ćșæ¶ˆè€—或**ćˆ©ç”š** CPU äžŠçš„èźĄçź—æ—¶é—Žä»„ćŠćŻç”šçš„ RAM 憅歘。 -æ‚šæƒłèŠæ¶ˆè€—/ćˆ©ç”šć€šć°‘çł»ç»Ÿè”„æșïŒŸ æ‚šćŻèƒœćŸˆćźčæ˜“èź€äžșâ€œäžć€šâ€ïŒŒäœ†ćźžé™…äžŠïŒŒæ‚šćŻèƒœćžŒæœ›ćœšäžćŽ©æșƒçš„æƒ…憔例**ć°œćŻèƒœć€šćœ°æ¶ˆè€—**。 +äœ æƒłèŠæ¶ˆè€—/ćˆ©ç”šć€šć°‘çł»ç»Ÿè”„æșïŒŸäœ ćŻèƒœćŸˆćźčæ˜“èź€äžșâ€œäžć€šâ€ïŒŒäœ†ćźžé™…äžŠïŒŒäœ ćŻèƒœćžŒæœ›ćœšäžćŽ©æșƒçš„æƒ…憔例**ć°œćŻèƒœć€šćœ°æ¶ˆè€—**。 -ćŠ‚æžœæ‚šæ”Żä»˜äș† 3 ć°æœćŠĄć™šçš„èŽč甚䜆ćȘäœżç”šäș†ćźƒä»Źçš„䞀ç‚čç‚č RAM 撌 CPUïŒŒé‚Łä舿‚šćŻèƒœ**æ”ȘèŽč金钱** đŸ’žïŒŒćč¶äž”ćŻèƒœ **æ”ȘèŽčæœćŠĄć™šç””ćŠ›** đŸŒŽïŒŒç­‰ç­‰ă€‚ +ćŠ‚æžœäœ æ”Żä»˜äș† 3 ć°æœćŠĄć™šçš„èŽč甚䜆ćȘäœżç”šäș†ćźƒä»Źçš„䞀ç‚čç‚č RAM 撌 CPUïŒŒé‚Łäčˆäœ ćŻèƒœ**æ”ȘèŽč金钱** đŸ’žïŒŒćč¶äž”ćŻèƒœ**æ”ȘèŽčæœćŠĄć™šç””ćŠ›** đŸŒŽïŒŒç­‰ç­‰ă€‚ ćœšèż™ç§æƒ…ć†”äž‹ïŒŒæœ€ć„œćȘ拄有 2 ć°æœćŠĄć™šćč¶äœżç”šæ›Žé«˜æŻ”äŸ‹çš„è”„æșïŒˆCPUă€ć†…ć­˜ă€çŁç›˜ă€çœ‘ç»œćžŠćźœç­‰ïŒ‰ă€‚ -揩侀æ–čéąïŒŒćŠ‚æžœæ‚šæœ‰ 2 ć°æœćŠĄć™šïŒŒćč¶äž”æ­Łćœšäœżç”š **100% 的 CPU 撌 RAM**ïŒŒćˆ™ćœšæŸäș›æ—¶ć€™ïŒŒäž€äžȘèż›çš‹äŒšèŠæ±‚æ›Žć€šć†…ć­˜ïŒŒćč¶äž”æœćŠĄć™šć°†äžćŸ—äžäœżç”šçŁç›˜äœœäžș“憅歘” ïŒˆèż™ćŻèƒœäŒšæ…ąæ•°ćƒć€ïŒ‰ïŒŒç”šè‡ł**掩æșƒ**。 或者䞀äžȘèż›çš‹ćŻèƒœéœ€èŠæ‰§èĄŒäž€äș›èźĄçź—ćč¶äž”ćż…éĄ»ç­‰ćˆ° CPU ć†æŹĄç©șé—Č。 +揩侀æ–čéąïŒŒćŠ‚æžœäœ æœ‰ 2 ć°æœćŠĄć™šïŒŒćč¶äž”æ­Łćœšäœżç”š**柃仏 100% 的 CPU 撌 RAM**ïŒŒćˆ™ćœšæŸäș›æ—¶ć€™ïŒŒäž€äžȘèż›çš‹äŒšèŠæ±‚æ›Žć€šć†…ć­˜ïŒŒćč¶äž”æœćŠĄć™šć°†äžćŸ—äžäœżç”šçŁç›˜äœœäžșâ€œć†…ć­˜â€ïŒˆèż™ćŻèƒœäŒšæ…ąæ•°ćƒć€ïŒ‰ïŒŒç”šè‡ł**掩æșƒ**ă€‚æˆ–è€…äž€äžȘèż›çš‹ćŻèƒœéœ€èŠæ‰§èĄŒäž€äș›èźĄçź—ćč¶äž”ćż…éĄ»ç­‰ćˆ° CPU ć†æŹĄç©șé—Č。 ćœšèż™ç§æƒ…ć†”äž‹ïŒŒæœ€ć„œèŽ­äč°**äž€ć°éąć€–çš„æœćŠĄć™š**ćč¶ćœšć…¶äžŠèżèĄŒäž€äș›èż›çš‹ïŒŒä»„äŸżćźƒä»Źéƒœæœ‰**è¶łć€Ÿçš„ RAM 撌 CPU æ—¶é—Ž**。 -由äșŽæŸç§ćŽŸć› ïŒŒæ‚šçš„ API çš„äœżç”šé‡ä蟿œ‰ćŻèƒœć‡ș现**æż€ćąž**。 äčŸèźžćźƒćƒç—…æŻ’äž€æ ·äŒ æ’­ćŒ€æ„或者äčŸèźžć…¶ä»–䞀äș›æœćŠĄæˆ–æœș晹äșșćŒ€ć§‹äœżç”šćźƒă€‚ ćœšèż™äș›æƒ…ć†”äž‹ïŒŒæ‚šćŻèƒœéœ€èŠéąć€–çš„è”„æșæ„äżèŻćź‰ć…šă€‚ +由äșŽæŸç§ćŽŸć› ïŒŒäœ çš„ API çš„äœżç”šé‡ä蟿œ‰ćŻèƒœć‡ș现**æż€ćąž**。äčŸèźžćźƒćƒç—…æŻ’äž€æ ·äŒ æ’­ćŒ€æ„或者äčŸèźžć…¶ä»–䞀äș›æœćŠĄæˆ–æœș晹äșșćŒ€ć§‹äœżç”šćźƒă€‚ćœšèż™äș›æƒ…ć†”äž‹ïŒŒäœ ćŻèƒœéœ€èŠéąć€–çš„è”„æșæ„äżèŻćź‰ć…šă€‚ -æ‚šćŻä»„ć°†äž€äžȘ**ä»»æ„æ•°ć­—**èźŸçœźäžșç›źæ ‡ïŒŒäŸ‹ćŠ‚ïŒŒè”„æșćˆ©ç”šçއ**朹 50% 戰 90%** äč‹é—Žă€‚ 重ç‚čæ˜ŻïŒŒèż™äș›ćŻèƒœæ˜Żæ‚šæƒłèŠèĄĄé‡ć’Œç”šæ„è°ƒæ•ŽéƒšçœČçš„äž»èŠć†…ćźč。 +äœ ćŻä»„ć°†äž€äžȘ**ä»»æ„æ•°ć­—**èźŸçœźäžșç›źæ ‡ïŒŒäŸ‹ćŠ‚ïŒŒè”„æșćˆ©ç”šçއ**朹 50% 戰 90%** äč‹é—Žă€‚重ç‚čæ˜ŻïŒŒèż™äș›ćŻèƒœæ˜Żäœ æƒłèŠèĄĄé‡ć’Œç”šæ„è°ƒæ•ŽéƒšçœČçš„äž»èŠć†…ćźč。 -æ‚šćŻä»„äœżç”šâ€œhtopâ€ç­‰çź€ć•ć·„ć…·æ„æŸ„çœ‹æœćŠĄć™šäž­äœżç”šçš„ CPU 撌 RAM æˆ–æŻäžȘèż›çš‹äœżç”šçš„æ•°é‡ă€‚ æˆ–è€…æ‚šćŻä»„äœżç”šæ›Žć€æ‚çš„ç›‘æŽ§ć·„ć…·ïŒŒèż™äș›ć·„ć…·ćŻèƒœćˆ†ćžƒćœšæœćŠĄć™šç­‰äžŠă€‚ +äœ ćŻä»„äœżç”š `htop` ç­‰çź€ć•ć·„ć…·æ„æŸ„çœ‹æœćŠĄć™šäž­äœżç”šçš„ CPU 撌 RAM æˆ–æŻäžȘèż›çš‹äœżç”šçš„æ•°é‡ă€‚æˆ–è€…äœ ćŻä»„äœżç”šæ›Žć€æ‚çš„ç›‘æŽ§ć·„ć…·ïŒŒèż™äș›ć·„ć…·ćŻèƒœćˆ†ćžƒćœšæœćŠĄć™šç­‰äžŠă€‚ ## ć›žéĄŸ { #recap } -æ‚šćœšèż™é‡Œé˜…èŻ»äș†äž€äș›ćœšć†łćźšćŠ‚äœ•éƒšçœČćș”甚皋ćșæ—¶ćŻèƒœéœ€èŠç‰ąèź°çš„äž»èŠæŠ‚ćż”ïŒš +äœ ćœšèż™é‡Œé˜…èŻ»äș†äž€äș›ćœšć†łćźšćŠ‚äœ•éƒšçœČćș”甚皋ćșæ—¶ćŻèƒœéœ€èŠç‰ąèź°çš„äž»èŠæŠ‚ćż”ïŒš * ćź‰ć…šæ€§ - HTTPS * ćŻćŠšæ—¶èżèĄŒ * é‡æ–°ćŻćŠš * ć€ćˆ¶ïŒˆèżèĄŒçš„èż›çš‹æ•°ïŒ‰ * 憅歘 -* ćŒ€ć§‹ć‰çš„ć…ˆć‰æ­„éȘ€ +* ćŻćŠšć‰çš„ć…ˆć‰æ­„éȘ€ -äș†è§Łèż™äș›æƒłæł•ä»„ćŠćŠ‚äœ•ćș”ç”šćźƒä»Źćș”èŻ„äŒšç»™æ‚šè¶łć€Ÿçš„ç›Žè§‰ćœšé…çœźć’Œè°ƒæ•ŽéƒšçœČæ—¶ćšć‡șä»»äœ•ć†łćźšă€‚ đŸ€“ +äș†è§Łèż™äș›æƒłæł•ä»„ćŠćŠ‚äœ•ćș”ç”šćźƒä»Źćș”èŻ„äŒšç»™äœ è¶łć€Ÿçš„ç›Žè§‰ïŒŒä»„äŸżćœšé…çœźć’Œè°ƒæ•ŽéƒšçœČæ—¶ćšć‡șä»»äœ•ć†łćźšă€‚ đŸ€“ -ćœšæŽ„äž‹æ„çš„éƒšćˆ†äž­ïŒŒæˆ‘ć°†äžșæ‚šæäŸ›æ›Žć…·äœ“çš„ç€șäŸ‹ïŒŒèŻŽæ˜Žæ‚šćŻä»„é”ćŸȘçš„ćŻèƒœç­–ç•„ă€‚ 🚀 +ćœšæŽ„äž‹æ„çš„éƒšćˆ†äž­ïŒŒæˆ‘ć°†äžșäœ æäŸ›æ›Žć…·äœ“çš„ç€șäŸ‹ïŒŒèŻŽæ˜Žäœ ćŻä»„é”ćŸȘçš„ćŻèƒœç­–ç•„ă€‚ 🚀 diff --git a/docs/zh/docs/deployment/docker.md b/docs/zh/docs/deployment/docker.md index c1b216953..5e3919bd2 100644 --- a/docs/zh/docs/deployment/docker.md +++ b/docs/zh/docs/deployment/docker.md @@ -1,5 +1,6 @@ # ćźč晹侭的 FastAPI - Docker { #fastapi-in-containers-docker } + 郚çœČ FastAPI ćș”ç”šæ—¶ïŒŒćžžè§ćšæł•æ˜Żæž„ć»ș侀äžȘ**Linux ćźč晹镜惏**ă€‚é€šćžžäœżç”š [**Docker**](https://www.docker.com/) ćźžçŽ°ă€‚ç„¶ćŽäœ ćŻä»„ç”šć‡ ç§æ–čćŒäč‹äž€éƒšçœČèŻ„é•œćƒă€‚ äœżç”š Linux ćźčć™šæœ‰ć€šç§äŒ˜ćŠżïŒŒćŒ…æ‹Ź**ćź‰ć…šæ€§**、**ćŻć€ćˆ¶æ€§**、**çź€ć•æ€§**等。 diff --git a/docs/zh/docs/deployment/https.md b/docs/zh/docs/deployment/https.md index 916fb46da..090c4ba59 100644 --- a/docs/zh/docs/deployment/https.md +++ b/docs/zh/docs/deployment/https.md @@ -67,7 +67,7 @@ äœ ćŻèƒœæ‹„æœ‰äž€äžȘäș‘æœćŠĄć™šïŒˆè™šæ‹ŸæœșïŒ‰æˆ–ç±»äŒŒçš„äžœè„żïŒŒćč¶äž”ćźƒäŒšæœ‰äž€äžȘć›ș漚 **ć…Źć…±IP朰杀**。 -朹 DNS æœćŠĄć™šäž­ïŒŒäœ ćŻä»„é…çœźäž€æĄèź°ćœ•ïŒˆâ€œA èź°ćœ•â€ïŒ‰ä»„ć°† **äœ çš„ćŸŸć** æŒ‡ć‘äœ æœćŠĄć™šçš„ć…Źć…± **IP 朰杀**。 +朹 DNS æœćŠĄć™šäž­ïŒŒäœ ćŻä»„é…çœźäž€æĄèź°ćœ•ïŒˆäž€äžȘ `A record`ïŒ‰ä»„ć°† **äœ çš„ćŸŸć** æŒ‡ć‘äœ æœćŠĄć™šçš„ć…Źć…± **IP 朰杀**。 èż™äžȘæ“äœœäž€èˆŹćȘéœ€èŠćœšæœ€ćŒ€ć§‹æ‰§èĄŒäž€æŹĄă€‚ @@ -179,7 +179,7 @@ TLS ç»ˆæ­ąä»Łç†ć°†äœżç”šćć•†ć„œçš„ćŠ ćŻ†çź—æł•**è§ŁćŻ†èŻ·æ±‚**ćč¶ć°†** ć› æ­€ïŒŒèŠæ›Žæ–°èŻäčŠïŒŒæ›Žæ–°çš‹ćșéœ€èŠć‘æƒćšæœș构Let's Encrypt**èŻæ˜Ž**漃硼漞**“拄有”ćč¶æŽ§ćˆ¶èŻ„ćŸŸć**。 -æœ‰ć€šç§æ–čæł•ćŻä»„ćšćˆ°èż™äž€ç‚č。 侀äș›æ”èĄŒçš„æ–čćŒæ˜ŻïŒš +æœ‰ć€šç§æ–čæł•ćŻä»„ćšćˆ°èż™äž€ç‚čćč¶é€‚ćș”äžćŒçš„ćș”ç”šéœ€æ±‚ă€‚ 侀äș›æ”èĄŒçš„æ–čćŒæ˜ŻïŒš * **äżźæ”č侀äș›DNSèź°ćœ•**。 * äžșæ­€ïŒŒç»­èźąçš‹ćșéœ€èŠæ”ŻæŒ DNS æäŸ›ć•†çš„ APIïŒŒć› æ­€ïŒŒèŠçœ‹äœ äœżç”šçš„ DNS æäŸ›ć•†æ˜ŻćŠæäŸ›èż™äž€ćŠŸèƒœă€‚ @@ -188,8 +188,7 @@ TLS ç»ˆæ­ąä»Łç†ć°†äœżç”šćć•†ć„œçš„ćŠ ćŻ†çź—æł•**è§ŁćŻ†èŻ·æ±‚**ćč¶ć°†** * èż™ć°±æ˜Żćœ“ćŒäž€äžȘ TLS ç»ˆæ­ąä»Łç†èż˜èŽŸèŽŁèŻäčŠç»­èźąèż‡çš‹æ—¶ćźƒéžćžžæœ‰ç”šçš„ćŽŸć› äč‹äž€ă€‚ * ćŠćˆ™ïŒŒäœ ćŻèƒœéœ€èŠæš‚æ—¶ćœæ­ą TLS ç»ˆæ­ąä»Łç†ïŒŒćŻćŠšç»­èźąçš‹ćșä»„èŽ·ć–èŻäčŠïŒŒç„¶ćŽäœżç”š TLS ç»ˆæ­ąä»Łç†é…çœźćźƒä»ŹïŒŒç„¶ćŽé‡æ–°ćŻćŠš TLS ç»ˆæ­ąä»Łç†ă€‚ èż™ćč¶äžç†æƒłïŒŒć› äžș䜠的ćș”甚皋ćșćœš TLS ç»ˆæ­ąä»Łç†ć…łé—­æœŸé—Žć°†äžćŻç”šă€‚ -é€šèż‡æ‹„æœ‰äž€äžȘ**ć•ç‹Źçš„çł»ç»Ÿæ„äœżç”š TLS ç»ˆæ­ąä»Łç†æ„ć€„ç† HTTPS**, è€Œäžæ˜Żç›ŽæŽ„ć°† TLS èŻäčŠäžŽćș”甚皋ćșæœćŠĄć™šäž€è”·äœżç”š ïŒˆäŸ‹ćŠ‚ Uvicorn,äœ ćŻä»„ćœš -æ›Žæ–°èŻäčŠçš„èż‡çš‹äž­ćŒæ—¶äżæŒæäŸ›æœćŠĄă€‚ +ćœšä»ç„¶äžșćș”ç”šæäŸ›æœćŠĄçš„ćŒæ—¶ćꌿˆæ•ŽäžȘæ›Žæ–°æ”çš‹ïŒŒæ˜Żäœ æƒłèŠç”š TLS ç»ˆæ­ąä»Łç†æ‹„æœ‰äž€äžȘ**ć•ç‹Źçł»ç»Ÿæ„ć€„ç† HTTPS**ïŒŒè€Œäžæ˜Żç›ŽæŽ„ćœšćș”ç”šæœćŠĄć™šïŒˆäŸ‹ćŠ‚ UvicornïŒ‰äžŠäœżç”š TLS èŻäčŠçš„äž»èŠćŽŸć› äč‹äž€ă€‚ ## ä»Łç†èœŹć‘èŻ·æ±‚ć€Ž { #proxy-forwarded-headers } @@ -209,7 +208,7 @@ TLS ç»ˆæ­ąä»Łç†ć°†äœżç”šćć•†ć„œçš„ćŠ ćŻ†çź—æł•**è§ŁćŻ†èŻ·æ±‚**ćč¶ć°†** äžèż‡ïŒŒç”±äșŽ**ćș”ç”šæœćŠĄć™š**ćč¶äžçŸ„道è‡Șć·±äœäșŽć—俥任的**代理**äč‹ćŽïŒŒé»˜èꀿƒ…ć†”äž‹ïŒŒćźƒäžäŒšäżĄä»»èż™äș›èŻ·æ±‚ć€Žă€‚ -äœ†äœ ćŻä»„é…çœź**ćș”ç”šæœćŠĄć™š**掻俥任由**代理**ć‘é€çš„èż™äș›â€œèœŹć‘â€èŻ·æ±‚ć€Žă€‚ćŠ‚æžœäœ ćœšäœżç”š FastAPI CLIïŒŒćŻä»„äœżç”šć‘œä»€èĄŒé€‰éĄč `--forwarded-allow-ips` æŒ‡ćźšćźƒćș”èŻ„äżĄä»»ć“Șäș› IP ć‘æ„çš„èż™äș›â€œèœŹć‘â€èŻ·æ±‚ć€Žă€‚ +äœ†äœ ćŻä»„é…çœź**ćș”ç”šæœćŠĄć™š**掻俥任由**代理**ć‘é€çš„èż™äș›*èœŹć‘*èŻ·æ±‚ć€Žă€‚ćŠ‚æžœäœ ćœšäœżç”š FastAPI CLIïŒŒćŻä»„äœżç”š *CLI 选éĄč* `--forwarded-allow-ips` æŒ‡ćźšćźƒćș”èŻ„äżĄä»»ć“Șäș› IP ć‘æ„çš„èż™äș›*èœŹć‘*èŻ·æ±‚ć€Žă€‚ äŸ‹ćŠ‚ïŒŒćŠ‚æžœ**ćș”ç”šæœćŠĄć™š**ćȘ掄收杄è‡Șć—äżĄä»»**代理**çš„é€šäżĄïŒŒäœ ćŻä»„èźŸçœź `--forwarded-allow-ips="*"`ïŒŒèź©ćźƒäżĄä»»æ‰€æœ‰äŒ ć…„çš„ IPïŒŒć› äžș柃ćȘ䌚掄收杄è‡Ș**代理**æ‰€äœżç”š IP çš„èŻ·æ±‚ă€‚ diff --git a/docs/zh/docs/deployment/manually.md b/docs/zh/docs/deployment/manually.md index a395f96da..ee468f4e4 100644 --- a/docs/zh/docs/deployment/manually.md +++ b/docs/zh/docs/deployment/manually.md @@ -2,7 +2,7 @@ ## äœżç”š `fastapi run` ć‘œä»€ { #use-the-fastapi-run-command } -çź€è€Œèš€äč‹ïŒŒäœżç”š `fastapi run` æ„èżèĄŒæ‚šçš„ FastAPI ćș”甚皋ćșïŒš +çź€è€Œèš€äč‹ïŒŒäœżç”š `fastapi run` æ„èżèĄŒäœ çš„ FastAPI ćș”甚皋ćșïŒš
@@ -40,7 +40,7 @@ $ fastapi run fastapi run ASGI。FastAPI æœŹèŽšäžŠæ˜Żäž€äžȘ ASGI Web æĄ†æž¶ă€‚ -èŠćœšèżœçš‹æœćŠĄć™šäžŠèżèĄŒ **FastAPI** ćș”ç”šïŒˆæˆ–ä»»äœ•ć…¶ä»– ASGI ćș”甚悚需芁䞀äžȘ ASGI æœćŠĄć™šçš‹ćșïŒŒäŸ‹ćŠ‚ **Uvicorn**ă€‚ćźƒæ˜Ż `fastapi` ć‘œä»€é»˜èź€äœżç”šçš„ ASGI æœćŠĄć™šă€‚ +èŠćœšèżœçš‹æœćŠĄć™šäžŠèżèĄŒ **FastAPI** ćș”ç”šïŒˆæˆ–ä»»äœ•ć…¶ä»– ASGI ćș”甚䜠需芁䞀äžȘ ASGI æœćŠĄć™šçš‹ćșïŒŒäŸ‹ćŠ‚ **Uvicorn**ă€‚ćźƒæ˜Ż `fastapi` ć‘œä»€é»˜èź€äœżç”šçš„ ASGI æœćŠĄć™šă€‚ 陀歀äč‹ć€–ïŒŒèż˜æœ‰ć…¶ä»–äž€äș›ćŻé€‰çš„ ASGI æœćŠĄć™šïŒŒäŸ‹ćŠ‚ïŒš @@ -63,17 +63,17 @@ FastAPI äœżç”šäș†äž€ç§ç”šäșŽæž„ć»ș Python Web æĄ†æž¶ć’ŒæœćŠĄć™šçš„æ ‡ć‡†ïŒŒç§° “**æœćŠĄć™š**â€äž€èŻé€šćžžç”šäșŽæŒ‡èżœçš‹/äș‘èźĄçź—æœș物理æœș或虚拟æœșïŒ‰ä»„ćŠćœšèŻ„èźĄçź—æœșäžŠèżèĄŒçš„çš‹ćșïŒˆäŸ‹ćŠ‚ UvicornïŒ‰ă€‚ -èŻ·èź°äœïŒŒćœ“æ‚šäž€èˆŹèŻ»ćˆ°â€œæœćŠĄć™šâ€èż™äžȘćèŻæ—¶ïŒŒćźƒćŻèƒœæŒ‡çš„æ˜Żèż™äž€è€…äč‹äž€ă€‚ +èŻ·èź°äœïŒŒćœ“äœ äž€èˆŹèŻ»ćˆ°â€œæœćŠĄć™šâ€èż™äžȘćèŻæ—¶ïŒŒćźƒćŻèƒœæŒ‡çš„æ˜Żèż™äž€è€…äč‹äž€ă€‚ -ćœ“æćˆ°èżœçš‹äž»æœșæ—¶ïŒŒé€šćžžć°†ć…¶ç§°äžș**æœćŠĄć™š**䜆äčŸç§°äžș**æœș晹**(machine)、**VM**虚拟æœșïŒ‰ă€**节ç‚č**。 èż™äș›éƒœæ˜ŻæŒ‡æŸç§ç±»ćž‹çš„èżœçš‹èźĄçź—æœșïŒŒé€šćžžèżèĄŒ LinuxïŒŒæ‚šćŻä»„ćœšć…¶äž­èżèĄŒçš‹ćșă€‚ +ćœ“æćˆ°èżœçš‹äž»æœșæ—¶ïŒŒé€šćžžć°†ć…¶ç§°äžș**æœćŠĄć™š**䜆äčŸç§°äžș**æœș晹**(machine)、**VM**虚拟æœșïŒ‰ă€**节ç‚č**。 èż™äș›éƒœæ˜ŻæŒ‡æŸç§ç±»ćž‹çš„èżœçš‹èźĄçź—æœșïŒŒé€šćžžèżèĄŒ LinuxïŒŒäœ ćŻä»„ćœšć…¶äž­èżèĄŒçš‹ćșă€‚ ## ćź‰èŁ…æœćŠĄć™šçš‹ćș { #install-the-server-program } -ćœ“æ‚šćź‰èŁ… FastAPI æ—¶ïŒŒćźƒè‡Ș澩侀äžȘ生äș§çŽŻćąƒæœćŠĄć™šâ€”â€”Uvicornćč¶äž”æ‚šćŻä»„äœżç”š `fastapi run` ć‘œä»€æ„ćŻćŠšćźƒă€‚ +ćœ“äœ ćź‰èŁ… FastAPI æ—¶ïŒŒćźƒè‡Ș澩侀äžȘ生äș§çŽŻćąƒæœćŠĄć™šâ€”â€”Uvicornćč¶äž”äœ ćŻä»„äœżç”š `fastapi run` ć‘œä»€æ„ćŻćŠšćźƒă€‚ -äžèż‡ïŒŒæ‚šäčŸćŻä»„æ‰‹ćŠšćź‰èŁ… ASGI æœćŠĄć™šă€‚ +äžèż‡ïŒŒäœ äčŸćŻä»„æ‰‹ćŠšćź‰èŁ… ASGI æœćŠĄć™šă€‚ -èŻ·çĄźäżæ‚šćˆ›ć»șćč¶æż€æŽ»äž€äžȘ[è™šæ‹ŸçŽŻćąƒ](../virtual-environments.md)ïŒŒç„¶ćŽć†ćź‰èŁ…æœćŠĄć™šćș”甚皋ćșă€‚ +èŻ·çĄźäżäœ ćˆ›ć»șćč¶æż€æŽ»äž€äžȘ[è™šæ‹ŸçŽŻćąƒ](../virtual-environments.md)ïŒŒç„¶ćŽć†ćź‰èŁ…æœćŠĄć™šćș”甚皋ćșă€‚ äŸ‹ćŠ‚ïŒŒèŠćź‰èŁ… UvicornïŒŒćŻä»„èżèĄŒä»„äž‹ć‘œä»€ïŒš @@ -95,13 +95,13 @@ $ pip install "uvicorn[standard]" ć…¶äž­ćŒ…æ‹Ź `uvloop`ïŒŒèż™æ˜Ż `asyncio` çš„é«˜æ€§èƒœæ›żä»Łæ–čæĄˆïŒŒèƒœć€Ÿæ˜Ÿè‘—æć‡ćč¶ć‘æ€§èƒœă€‚ -ćœ“æ‚šäœżç”š `pip install "fastapi[standard]"` ćź‰èŁ… FastAPI æ—¶ïŒŒćźžé™…äžŠäčŸäŒšćź‰èŁ… `uvicorn[standard]`。 +ćœ“äœ äœżç”š `pip install "fastapi[standard]"` ćź‰èŁ… FastAPI æ—¶ïŒŒćźžé™…äžŠäčŸäŒšćź‰èŁ… `uvicorn[standard]`。 /// ## èżèĄŒæœćŠĄć™šçš‹ćș { #run-the-server-program } -ćŠ‚æžœæ‚šæ‰‹ćŠšćź‰èŁ…äș† ASGI æœćŠĄć™šïŒŒé€šćžžéœ€èŠä»„ç‰čćźšæ ŒćŒäŒ é€’äž€äžȘćŻŒć…„ć­—çŹŠäžČïŒŒä»„äŸżæœćŠĄć™šèƒœć€Ÿæ­ŁçĄźćŻŒć…„æ‚šçš„ FastAPI ćș”甚 +ćŠ‚æžœäœ æ‰‹ćŠšćź‰èŁ…äș† ASGI æœćŠĄć™šïŒŒé€šćžžéœ€èŠä»„ç‰čćźšæ ŒćŒäŒ é€’äž€äžȘćŻŒć…„ć­—çŹŠäžČïŒŒä»„äŸżæœćŠĄć™šèƒœć€Ÿæ­ŁçĄźćŻŒć…„äœ çš„ FastAPI ćș”甚
@@ -128,7 +128,7 @@ from main import app /// -æŻç§ ASGI æœćŠĄć™šçš‹ćșé€šćžžéƒœäŒšæœ‰ç±»äŒŒçš„ć‘œä»€ïŒŒæ‚šćŻä»„ćœšćźƒä»Źçš„ćź˜æ–čæ–‡æĄŁäž­æ‰Ÿćˆ°æ›Žć€šäżĄæŻă€‚ +æŻç§ ASGI æœćŠĄć™šçš‹ćșé€šćžžéƒœäŒšæœ‰ç±»äŒŒçš„ć‘œä»€ïŒŒäœ ćŻä»„ćœšćźƒä»Źçš„ćź˜æ–čæ–‡æĄŁäž­æ‰Ÿćˆ°æ›Žć€šäżĄæŻă€‚ /// warning | è­Šć‘Š @@ -144,7 +144,7 @@ Uvicorn ć’Œć…¶ä»–æœćŠĄć™šæ”ŻæŒ `--reload` 选éĄčïŒŒèŻ„é€‰éĄčćœšćŒ€ć‘èż‡çš‹äž­ èż™äș›ç€șäŸ‹èżèĄŒæœćŠĄć™šçš‹ćșïŒˆäŸ‹ćŠ‚ UvicornïŒ‰ïŒŒćŻćŠš**捕äžȘèż›çš‹**ïŒŒćœšæ‰€æœ‰ IP`0.0.0.0`ïŒ‰äžŠç›‘ćŹéą„ćźšäč‰ç«ŻćŁïŒˆäŸ‹ćŠ‚`80`ïŒ‰ă€‚ -èż™æ˜ŻćŸșæœŹæ€è·Żă€‚ äœ†æ‚šćŻèƒœéœ€èŠć€„ç†äž€äș›ć…¶ä»–äș‹æƒ…ïŒŒäŸ‹ćŠ‚ïŒš +èż™æ˜ŻćŸșæœŹæ€è·Żă€‚ äœ†äœ ćŻèƒœéœ€èŠć€„ç†äž€äș›ć…¶ä»–äș‹æƒ…ïŒŒäŸ‹ćŠ‚ïŒš * ćź‰ć…šæ€§ - HTTPS * ćŻćŠšæ—¶èżèĄŒ @@ -153,4 +153,4 @@ Uvicorn ć’Œć…¶ä»–æœćŠĄć™šæ”ŻæŒ `--reload` 选éĄčïŒŒèŻ„é€‰éĄčćœšćŒ€ć‘èż‡çš‹äž­ * 憅歘 * ćŒ€ć§‹ć‰çš„æ­„éȘ€ -ćœšæŽ„äž‹æ„çš„ç« èŠ‚äž­ïŒŒæˆ‘ć°†ć‘æ‚šèŻŠç»†ä»‹ç»æŻäžȘæŠ‚ćż”ă€ćŠ‚äœ•æ€è€ƒćźƒä»ŹïŒŒä»„ćŠäž€äș›ć…·äœ“ç€șäŸ‹ä»„ćŠć€„ç†ćźƒä»Źçš„ç­–ç•„ă€‚ 🚀 +ćœšæŽ„äž‹æ„çš„ç« èŠ‚äž­ïŒŒæˆ‘ć°†ć‘äœ èŻŠç»†ä»‹ç»æŻäžȘæŠ‚ćż”ă€ćŠ‚äœ•æ€è€ƒćźƒä»ŹïŒŒä»„ćŠäž€äș›ć…·äœ“ç€șäŸ‹ä»„ćŠć€„ç†ćźƒä»Źçš„ç­–ç•„ă€‚ 🚀 diff --git a/docs/zh/docs/editor-support.md b/docs/zh/docs/editor-support.md index 5028c6c95..7caff801e 100644 --- a/docs/zh/docs/editor-support.md +++ b/docs/zh/docs/editor-support.md @@ -14,7 +14,7 @@ ## ćŠŸèƒœ { #features } -- **Path Operation 蔄æșçźĄç†ć™š** - 䟧èŸčæ æ ‘çŠ¶è§†ć›Ÿć±•ç€șćș”甚䞭的所有 *è·ŻćŸ„æ“äœœ*。ç‚čć‡»ćŻè·łèœŹè‡łä»»äž€è·Żç”±æˆ– APIRouter 的漚äč‰ă€‚ +- **Path Operation 蔄æșçźĄç†ć™š** - 䟧èŸčæ æ ‘çŠ¶è§†ć›Ÿć±•ç€șćș”甚䞭的所有 *è·ŻćŸ„æ“äœœ*。ç‚čć‡»ćŻè·łèœŹè‡łä»»äž€è·Żç”±æˆ– router 的漚äč‰ă€‚ - **è·Żç”±æœçŽą** - äœżç”š Ctrl + Shift + EmacOS 侊äžș Cmd + Shift + EïŒ‰æŒ‰è·ŻćŸ„ă€æ–čæł•æˆ–ćç§°èż›èĄŒæœçŽąă€‚ - **CodeLens ćŻŒèˆȘ** - æ”‹èŻ•ćźąæˆ·ç«Żè°ƒç”šïŒˆäŸ‹ćŠ‚ `client.get('/items')`䞊æ–č的揯ç‚čć‡»é“ŸæŽ„ïŒŒćŻè·łèœŹćˆ°ćŒč配的*è·ŻćŸ„æ“äœœ*ïŒŒćœšæ”‹èŻ•äžŽćźžçŽ°äč‹é—Žćż«é€ŸćŸ€èż”。 - **郚çœČ戰 FastAPI Cloud** - äž€é”źć°†äœ çš„ćș”甚郚çœČ戰 [FastAPI Cloud](https://fastapicloud.com/)。 diff --git a/docs/zh/docs/environment-variables.md b/docs/zh/docs/environment-variables.md index 3a90ecde6..be6869e44 100644 --- a/docs/zh/docs/environment-variables.md +++ b/docs/zh/docs/environment-variables.md @@ -1,5 +1,6 @@ # 环汃揘量 { #environment-variables } + /// tip | 提ç€ș ćŠ‚æžœäœ ć·Č经矄道什ä舿˜Żâ€œçŽŻćąƒć˜é‡â€ćč¶äž”çŸ„é“ćŠ‚äœ•äœżç”šćźƒä»ŹïŒŒäœ ćŻä»„æ”Ÿćżƒè·łèż‡èż™äž€éƒšćˆ†ă€‚ diff --git a/docs/zh/docs/features.md b/docs/zh/docs/features.md index 5fd9d48c4..1405bee46 100644 --- a/docs/zh/docs/features.md +++ b/docs/zh/docs/features.md @@ -19,11 +19,11 @@ ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) -* ćŠć€–çš„ API æ–‡æĄŁïŒš[**ReDoc**](https://github.com/Rebilly/ReDoc) +* ćŠć€–çš„ API æ–‡æĄŁïŒš[**ReDoc**](https://github.com/Rebilly/ReDoc)。 ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) -### 曎䞻攁的 Python { #just-modern-python } +### ć°±æ˜ŻçŽ°ä»Ł Python { #just-modern-python } ć…šéƒšéƒœćŸșäșŽæ ‡ć‡†çš„ **Python 类枋** ćŁ°æ˜ŽïŒˆæ„Ÿè°ą PydanticïŒ‰ă€‚æČĄæœ‰æ–°çš„èŻ­æł•éœ€èŠć­Šäč ă€‚ćȘéœ€èŠæ ‡ć‡†çš„çŽ°ä»Ł Python。 @@ -98,7 +98,7 @@ my_second_user: User = User(**second_user_data) ### çź€æŽ { #short } -ä»»äœ•ç±»ćž‹éƒœæœ‰ćˆç†çš„**é»˜èź€ć€Œ**ïŒŒä»»äœ•ć’Œćœ°æ–čéƒœæœ‰ćŻé€‰é…çœźă€‚æ‰€æœ‰çš„ć‚æ•°èą«ćŸźè°ƒïŒŒæ„æ»Ąè¶łäœ çš„éœ€æ±‚ïŒŒćźšä艿ˆäœ éœ€èŠçš„ API。 +ä»»äœ•ç±»ćž‹éƒœæœ‰ćˆç†çš„**é»˜èź€ć€Œ**ïŒŒä»»äœ•ćœ°æ–čéƒœæœ‰ćŻé€‰é…çœźă€‚æ‰€æœ‰çš„ć‚æ•°èą«ćŸźè°ƒïŒŒæ„æ»Ąè¶łäœ çš„éœ€æ±‚ïŒŒćźšä艿ˆäœ éœ€èŠçš„ API。 äœ†æ˜Żé»˜èź€æƒ…ć†”äž‹ïŒŒäž€ćˆ‡éƒœèƒœ**“éĄșćˆ©ć·„äœœâ€**。 @@ -110,7 +110,7 @@ my_second_user: User = User(**second_user_data) * 歗笩äžČ (`str`) ć­—æź”ïŒŒćźšä艿œ€ć°æˆ–æœ€ć€§é•żćșŠă€‚ * æ•°ć­— (`int`, `float`) æœ‰æœ€ć€§ć€Œć’Œæœ€ć°ć€ŒïŒŒç­‰ç­‰ă€‚ -* æ ĄéȘŒć€–æ„ç±»ćž‹ïŒŒæŻ”ćŠ‚ïŒš +* æ ĄéȘŒæ›Žç‰čæźŠçš„ç±»ćž‹ïŒŒæŻ”ćŠ‚ïŒš * URL。 * Email。 * UUID。 @@ -120,9 +120,9 @@ my_second_user: User = User(**second_user_data) ### ćź‰ć…šæ€§ćŠèș«ä»œéȘŒè݁ { #security-and-authentication } -集成äș†ćź‰ć…šæ€§ć’Œèș«ä»œèź€èŻă€‚æœç»æ•°æźćș“æˆ–è€…æ•°æźæšĄćž‹çš„æž—é€éŁŽé™©ă€‚ +集成äș†ćź‰ć…šæ€§ć’Œèș«ä»œéȘŒèŻă€‚äžéœ€èŠćœšæ•°æźćș“æˆ–æ•°æźæšĄćž‹äžŠäœœć‡șä»»äœ•ćŠ„ćă€‚ -OpenAPI 侭漚äč‰çš„ćź‰ć…šæšĄćŒïŒŒćŒ…æ‹ŹïŒš +OpenAPI 侭漚äč‰çš„æ‰€æœ‰ćź‰ć…šæšĄćŒïŒŒćŒ…æ‹ŹïŒš * HTTP ćŸșæœŹèź€èŻă€‚ * **OAuth2**äčŸäœżç”š **JWT tokens**ïŒ‰ă€‚ćœš [äœżç”š JWT 的 OAuth2](tutorial/security/oauth2-jwt.md) æŸ„çœ‹æ•™çš‹ă€‚ @@ -131,7 +131,7 @@ OpenAPI 侭漚äč‰çš„ćź‰ć…šæšĄćŒïŒŒćŒ…æ‹ŹïŒš * æŸ„èŻąć‚æ•°ă€‚ * CookiesïŒŒç­‰ç­‰ă€‚ -ćŠ äžŠæ„è‡Ș StarletteïŒˆćŒ…æ‹Ź **session cookie**ïŒ‰çš„æ‰€æœ‰ćź‰ć…šç‰čæ€§ă€‚ +ćŠ äžŠæ„è‡Ș StarletteïŒˆćŒ…æ‹Ź **session cookies**ïŒ‰çš„æ‰€æœ‰ćź‰ć…šç‰čæ€§ă€‚ æ‰€æœ‰çš„èż™äș›éƒœæ˜ŻćŻć€ç”šçš„ć·„ć…·ć’Œç»„ä»¶ïŒŒćŻä»„èœ»æŸäžŽäœ çš„çł»ç»ŸïŒŒæ•°æźä»“ćș“ïŒŒć…łçł»ćž‹ä»„揊 NoSQL æ•°æźćș“ç­‰ç­‰é›†æˆă€‚ @@ -142,7 +142,7 @@ FastAPI 有䞀äžȘäœżç”šéžćžžçź€ć•ïŒŒäœ†æ˜ŻéžćžžćŒșć€§çš„æ”‹èŻ•èŠ†ç›–ă€‚ -* 代码ćș“100% ç±»ćž‹æłšé‡Šă€‚ +* 代码ćș“100% ç±»ćž‹æ ‡æłšă€‚ * 甹äșŽç”Ÿäș§ćș”甚。 ## Starlette ç‰č性 { #starlette-features } -**FastAPI** 撌 [**Starlette**](https://www.starlette.dev/) ćźŒć…šć…Œćźčćč¶ćŸșäșŽïŒ‰ă€‚æ‰€ä»„ïŒŒäœ æœ‰çš„ć…¶ä»–çš„ Starlette 代码äčŸèƒœæ­Łćžžć·„äœœă€‚`FastAPI` ćźžé™…äžŠæ˜Ż `Starlette` 的侀äžȘć­ç±»ă€‚æ‰€ä»„ïŒŒćŠ‚æžœäœ ć·Čç»çŸ„é“æˆ–è€…äœżç”š StarletteïŒŒć€§éƒšćˆ†çš„ćŠŸèƒœäŒšä»„ç›žćŒçš„æ–čćŒć·„äœœă€‚ +**FastAPI** 侎 [**Starlette**](https://www.starlette.dev/) ćźŒć…šć…Œćźčćč¶ćŸșäșŽćꃿž„ć»șïŒ‰ă€‚æ‰€ä»„ïŒŒäœ æœ‰çš„ć…¶ä»–çš„ Starlette 代码äčŸèƒœæ­Łćžžć·„äœœă€‚ + +`FastAPI` ćźžé™…äžŠæ˜Ż `Starlette` 的侀äžȘć­ç±»ă€‚æ‰€ä»„ïŒŒćŠ‚æžœäœ ć·Čç»çŸ„é“æˆ–è€…äœżç”š StarletteïŒŒć€§éƒšćˆ†çš„ćŠŸèƒœäŒšä»„ç›žćŒçš„æ–čćŒć·„äœœă€‚ é€šèż‡ **FastAPI** äœ ćŻä»„èŽ·ćŸ—æ‰€æœ‰ **Starlette** 的ç‰č性FastAPI ć°±ćƒćŠ ćŒș版的 Starlette @@ -172,11 +174,11 @@ FastAPI 有䞀äžȘäœżç”šéžćžžçź€ć•ïŒŒäœ†æ˜ŻéžćžžćŒș性的IDE/linter/brain** 适配: * 曠äžș pydantic æ•°æźç»“æž„ä»…ä»…æ˜Żäœ ćźšäč‰çš„ç±»çš„ćźžäŸ‹ïŒ›è‡ȘćŠšèĄ„ć…šïŒŒlintingmypy ä»„ćŠäœ çš„ç›Žè§‰ćș”èŻ„ćŻä»„ć’Œäœ éȘŒèŻçš„æ•°æźäž€è”·æ­Łćžžć·„äœœă€‚ * éȘŒè݁**ć€æ‚ç»“æž„**: diff --git a/docs/zh/docs/help-fastapi.md b/docs/zh/docs/help-fastapi.md index 2ff9752eb..1692d07ec 100644 --- a/docs/zh/docs/help-fastapi.md +++ b/docs/zh/docs/help-fastapi.md @@ -26,7 +26,7 @@ äœ ćŻä»„ćœš GitHub 侊äžș FastAPI ç‚čäșźă€Œæ˜Ÿæ ‡ă€ïŒˆç‚čć‡»ćłäžŠè§’çš„æ˜ŸćœąæŒ‰é’źïŒ‰ïŒš[https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi)ă€‚â­ïž -ćŠ æ˜ŸćŽïŒŒć…¶ä»–ç”šæˆ·æ›Žćźčæ˜“ć‘çŽ°ćźƒïŒŒćč¶çœ‹ćˆ°ćźƒć·Č经ćŻčèźžć€šäșșæœ‰ćžźćŠ©ă€‚ +ćŠ æ˜ŸćŽïŒŒć…¶ä»–ç”šæˆ·æ›Žćźčæ˜“ć‘çŽ°ćźƒïŒŒćč¶çœ‹ćˆ°ćźƒć·Č经ćŻčć…¶ä»–äșșæœ‰ćžźćŠ©ă€‚ ## ć…łæłš GitHub 蔄æșćș“çš„ç‰ˆæœŹć‘ćžƒ { #watch-the-github-repository-for-releases } @@ -34,7 +34,7 @@ ćœšé‚Łé‡Œäœ ćŻä»„é€‰æ‹©ă€ŒReleases only」。 -èż™æ ·ćšäč‹ćŽïŒŒæŻćœ“ **FastAPI** ć‘ćžƒæ–°ç‰ˆæœŹïŒˆćŒ…ć«äżźć€ć’Œæ–°ćŠŸèƒœïŒ‰ïŒŒäœ éƒœäŒšæ”¶ćˆ°é€šçŸ„ïŒˆé‚źä»¶ïŒ‰ă€‚ +èż™æ ·ćšäč‹ćŽïŒŒæŻćœ“ **FastAPI** ć‘ćžƒćŒ…ć« Bug äżźć€ć’Œæ–°ćŠŸèƒœçš„æ–°ç‰ˆæœŹæ—¶ïŒŒäœ éƒœäŒšæ”¶ćˆ°é€šçŸ„ïŒˆé‚źä»¶ïŒ‰ă€‚ ## ć…łæłšäœœè€… { #follow-the-author } diff --git a/docs/zh/docs/how-to/configure-swagger-ui.md b/docs/zh/docs/how-to/configure-swagger-ui.md index 3dbc54911..d1909488a 100644 --- a/docs/zh/docs/how-to/configure-swagger-ui.md +++ b/docs/zh/docs/how-to/configure-swagger-ui.md @@ -16,11 +16,11 @@ FastAPIäŒšć°†èż™äș›é…çœźèœŹæąäžș **JSON**ïŒŒäœżć…¶äžŽ JavaScript ć…ŒćźčïŒŒć›  -äœ†æ˜Żäœ ćŻä»„é€šèż‡èźŸçœź `syntaxHighlight` äžș `False` 杄犁甚 Swagger UI äž­çš„èŻ­æł•é«˜äșźïŒš +äœ†æ˜Żäœ ćŻä»„é€šèż‡èźŸçœź `syntaxHighlight` äžș `False` æ„çŠç”šćźƒïŒš {* ../../docs_src/configure_swagger_ui/tutorial001_py310.py hl[3] *} -...ćœšæ­€äč‹ćŽïŒŒSwagger UI ć°†äžäŒšé«˜äșźä»Łç : +...ćœšæ­€äč‹ćŽïŒŒSwagger UI ć°†äžć†æ˜Ÿç€șèŻ­æł•é«˜äșźïŒš @@ -30,7 +30,7 @@ FastAPIäŒšć°†èż™äș›é…çœźèœŹæąäžș **JSON**ïŒŒäœżć…¶äžŽ JavaScript ć…ŒćźčïŒŒć›  {* ../../docs_src/configure_swagger_ui/tutorial002_py310.py hl[3] *} -èż™äžȘé…çœźäŒšæ”čć˜èŻ­æł•é«˜äșźäž»éą˜ïŒš +èż™äžȘé…çœźäŒšæ”čć˜èŻ­æł•é«˜äșźéąœè‰Čäž»éą˜ïŒš diff --git a/docs/zh/docs/how-to/custom-request-and-route.md b/docs/zh/docs/how-to/custom-request-and-route.md index 79860a562..4065818ea 100644 --- a/docs/zh/docs/how-to/custom-request-and-route.md +++ b/docs/zh/docs/how-to/custom-request-and-route.md @@ -72,7 +72,7 @@ 由 `GzipRequest.get_route_handler` èż”ć›žçš„ć‡œæ•°ć”Żäž€äžćŒäč‹ć€„æ˜ŻæŠŠ `Request` èœŹæąäžș `GzipRequest`。 -èż™æ ·ïŒŒćœšäŒ ç»™æˆ‘ä»Źçš„è·ŻćŸ„æ“äœœäč‹ć‰ïŒŒ`GzipRequest` äŒšïŒˆćœšéœ€èŠæ—¶ïŒ‰èŽŸèŽŁè§ŁćŽ‹æ•°æźă€‚ +èż™æ ·ïŒŒćœšäŒ ç»™æˆ‘ä»Źçš„*è·ŻćŸ„æ“äœœ*äč‹ć‰ïŒŒ`GzipRequest` äŒšïŒˆćœšéœ€èŠæ—¶ïŒ‰èŽŸèŽŁè§ŁćŽ‹æ•°æźă€‚ äč‹ćŽïŒŒć…¶äœ™ć€„ç†é€»èŸ‘ćźŒć…šç›žćŒă€‚ @@ -104,6 +104,6 @@ {* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[26] *} -ćœšæ­€ç€ș䟋䞭`router` äž‹çš„è·ŻćŸ„æ“äœœć°†äœżç”šè‡Ș漚äč‰çš„ `TimedRoute` ç±»ïŒŒć“ćș”äž­äŒšć€šäž€äžȘ `X-Response-Time` ć€ŽïŒŒćŒ…ć«ç”Ÿæˆć“ćș”所甚的时闎 +ćœšæ­€ç€ș䟋䞭`router` 例的*è·ŻćŸ„æ“äœœ*ć°†äœżç”šè‡Ș漚äč‰çš„ `TimedRoute` ç±»ïŒŒć“ćș”äž­äŒšć€šäž€äžȘ `X-Response-Time` ć€ŽïŒŒćŒ…ć«ç”Ÿæˆć“ćș”所甚的时闎 {* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[13:20] *} diff --git a/docs/zh/docs/how-to/graphql.md b/docs/zh/docs/how-to/graphql.md index b33d6759f..31d15d3b4 100644 --- a/docs/zh/docs/how-to/graphql.md +++ b/docs/zh/docs/how-to/graphql.md @@ -2,7 +2,7 @@ 由äșŽ **FastAPI** ćŸșäșŽ **ASGI** æ ‡ć‡†ïŒŒć› æ­€ćŸˆćźč易集成任䜕äčŸć…Œćźč ASGI 的 **GraphQL** ćș“。 -äœ ćŻä»„ćœšćŒäž€äžȘćș”ç”šäž­ć°†ćžžè§„çš„ FastAPI è·ŻćŸ„æ“äœœäžŽ GraphQL ç»“ćˆäœżç”šă€‚ +äœ ćŻä»„ćœšćŒäž€äžȘćș”ç”šäž­ć°†ćžžè§„çš„ FastAPI *è·ŻćŸ„æ“äœœ* 侎 GraphQL ç»“ćˆäœżç”šă€‚ /// tip | 提ç€ș diff --git a/docs/zh/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/zh/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md index 3723eb032..ecfdd0278 100644 --- a/docs/zh/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md +++ b/docs/zh/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -8,9 +8,11 @@ FastAPI 0.119.0 ćŒ•ć…„äș†ćœš Pydantic v2 ć†…éƒšä»„ `pydantic.v1` ćœąćŒćŻč Pydan FastAPI 0.126.0 移陀äș†ćŻč Pydantic v1 çš„æ”ŻæŒïŒŒäœ†ćœšäž€æź”æ—¶é—Žć†…ä»æ”ŻæŒ `pydantic.v1`。 +FastAPI 0.128.0 äčŸç§»é™€äș†ćŻč `pydantic.v1` çš„æ”ŻæŒïŒŒć› æ­€æœ€æ–°ç‰ˆæœŹçš„ FastAPI 需芁 Pydantic v2。 + /// warning | è­Šć‘Š -从 Python 3.14 ćŒ€ć§‹ïŒŒPydantic 曱队侍憍äžș最新的 Python ç‰ˆæœŹæäŸ› Pydantic v1 çš„æ”ŻæŒă€‚ +从 **Python 3.14** ćŒ€ć§‹ïŒŒPydantic 曱队侍憍äžș最新的 Python ç‰ˆæœŹæäŸ› Pydantic v1 çš„æ”ŻæŒă€‚ èż™äčŸćŒ…æ‹Ź `pydantic.v1`ïŒŒćœš Python 3.14 ćŠæ›Žé«˜ç‰ˆæœŹäž­äžć†ć—æ”ŻæŒă€‚ @@ -18,7 +20,7 @@ FastAPI 0.126.0 移陀äș†ćŻč Pydantic v1 çš„æ”ŻæŒïŒŒäœ†ćœšäž€æź”æ—¶é—Žć†…ä»æ”Ż /// -ćŠ‚æžœäœ çš„æ—§ FastAPI ćș”ç”šćœšç”š Pydantic v1ïŒŒèż™é‡Œć°†ć‘äœ ć±•ç€șćŠ‚äœ•èżç§»ćˆ° Pydantic v2ïŒŒä»„ćŠ FastAPI 0.119.0 äž­ćŻćžźćŠ©äœ æžèż›ćŒèżç§»çš„ćŠŸèƒœă€‚ +ćŠ‚æžœäœ çš„æ—§ FastAPI ćș”ç”šćœšç”š Pydantic v1ïŒŒèż™é‡Œć°†ć‘äœ ć±•ç€șćŠ‚äœ•èżç§»ćˆ° Pydantic v2ïŒŒä»„ćŠ **FastAPI 0.119.0 äž­çš„ćŠŸèƒœ** ćŻćžźćŠ©äœ æžèż›ćŒèżç§»ă€‚ ## 柘æ–čæŒ‡ć— { #official-guide } @@ -54,6 +56,16 @@ Pydantic v2 ä»„ć­æšĄć— `pydantic.v1` çš„ćœąćŒćŒ…ć«äș† Pydantic v1 的慹郹 ### FastAPI ćŻč v2 äž­ Pydantic v1 çš„æ”ŻæŒ { #fastapi-support-for-pydantic-v1-in-v2 } +/// warning | è­Šć‘Š + +æ­€ FastAPI ćŻč `pydantic.v1` æšĄćž‹çš„æ”ŻæŒæ˜Żćœš **FastAPI 0.119.0** äž­æ·»ćŠ çš„ïŒŒćč¶ćœš **FastAPI 0.128.0** äž­ç§»é™€ă€‚ćźƒćŽŸæœŹæ˜Żäžșäș†èżç§»ćˆ° Pydantic v2 è€ŒæäŸ›çš„äžŽæ—¶èŸ…ćŠ©ă€‚ + +ćœšćœ“ć‰ç‰ˆæœŹçš„ FastAPI äž­ïŒŒćœšäœ çš„ćș”ç”šé‡Œäœżç”š `pydantic.v1` æšĄćž‹äŒšćŒ•ć‘é”™èŻŻă€‚ + +æœŹèŠ‚ć…¶äœ™éƒšćˆ†æèż°çš„äžŽæ—¶æ”ŻæŒä»…ćœšé‚Łäș›èŸƒæ—§ç‰ˆæœŹäž­ćŻç”šă€‚ + +/// + è‡Ș FastAPI 0.119.0 蔷FastAPI äčŸćŻč Pydantic v2 憅的 Pydantic v1 提䟛äș†éƒšćˆ†æ”ŻæŒïŒŒä»„äŸżèżç§»ćˆ° v2。 ć› æ­€ïŒŒäœ ćŻä»„ć°† Pydantic 捇çș§ćˆ°æœ€æ–°çš„ v2ćč¶ć°†ćŻŒć…„æ”čäžșäœżç”š `pydantic.v1` ć­æšĄć—ïŒŒćœšćŸˆć€šæƒ…ć†”äž‹ć°±èƒœç›ŽæŽ„ć·„äœœă€‚ @@ -122,6 +134,12 @@ graph TB ### ćˆ†æ­„èżç§» { #migrate-in-steps } +/// warning | è­Šć‘Š + +äž‹éąæèż°çš„ćœšćŒäž€ćș”ç”šäž­ćŒæ—¶äœżç”š Pydantic v1 撌 v2 æšĄćž‹èż›èĄŒæžèż›ćŒèżç§»ïŒŒćȘ适甹äșŽ **FastAPI 0.119.0 戰 0.127.x**。漃ć·Č朹 **FastAPI 0.128.0** äž­ç§»é™€ïŒŒæœ€æ–°ç‰ˆæœŹéœ€èŠ **Pydantic v2** æšĄćž‹ă€‚ + +/// + /// tip | 提ç€ș äŒ˜ć…ˆć°èŻ• `bump-pydantic`ïŒŒćŠ‚æžœæ”‹èŻ•é€šèż‡äž”ćŻèĄŒïŒŒé‚Łäčˆäœ ć°±ç”šäž€äžȘć‘œä»€ćźŒæˆäș†ă€‚✚ diff --git a/docs/zh/docs/how-to/separate-openapi-schemas.md b/docs/zh/docs/how-to/separate-openapi-schemas.md index 19d372b46..a7335143a 100644 --- a/docs/zh/docs/how-to/separate-openapi-schemas.md +++ b/docs/zh/docs/how-to/separate-openapi-schemas.md @@ -1,5 +1,6 @@ # æ˜ŻćŠäžșèŸ“ć…„ć’ŒèŸ“ć‡șćˆ†ćˆ«ç”Ÿæˆ OpenAPI JSON Schema { #separate-openapi-schemas-for-input-and-output-or-not } + è‡Șä»Žć‘ćžƒäș† **Pydantic v2**生成的 OpenAPI æŻ”äč‹ć‰æ›ŽçČŸçĄźă€æ›Ž**æ­ŁçĄź**äș†ă€‚đŸ˜Ž äș‹ćźžäžŠïŒŒćœšæŸäș›æƒ…憔䞋ćŻčäșŽćŒäž€äžȘ Pydantic æšĄćž‹ïŒŒOpenAPI 䞭䌚æ čæźæ˜ŻćŠćžŠæœ‰**é»˜èź€ć€Œ**äžșèŸ“ć…„ć’ŒèŸ“ć‡șćˆ†ćˆ«ç”Ÿæˆ**䞀äžȘ JSON Schema**。 diff --git a/docs/zh/docs/index.md b/docs/zh/docs/index.md index 74b799e5c..6b75291fe 100644 --- a/docs/zh/docs/index.md +++ b/docs/zh/docs/index.md @@ -106,19 +106,19 @@ FastAPI æ˜Żäž€äžȘ甹äșŽæž„ć»ș API çš„çŽ°ä»Łă€ćż«é€ŸïŒˆé«˜æ€§èƒœïŒ‰çš„ Web æĄ†
â€œæˆ‘æœ€èż‘ć€§é‡äœżç”š FastAPIă€‚æˆ‘ćźžé™…äžŠèźĄćˆ’æŠŠćźƒç”šäșŽæˆ‘ć›ąé˜Ÿćœš ćŸźèœŻçš„æœș晹歩äč ïŒˆMLïŒ‰æœćŠĄă€‚ć…¶äž­äž€äș›æ­Łćœšé›†æˆèż›æ žćżƒ Windows äș§ć“ä»„揊侀äș› Office äș§ć“ă€‚”
-
— Kabir KhanMicrosoft (ref)
+
— Kabir KhanMicrosoft (ć‚è€ƒ)
@@ -127,25 +127,25 @@ FastAPI æ˜Żäž€äžȘ甹äșŽæž„ć»ș API çš„çŽ°ä»Łă€ćż«é€ŸïŒˆé«˜æ€§èƒœïŒ‰çš„ Web æĄ† 「_[...] æˆ‘æœ€èż‘ć€§é‡äœżç”š **FastAPI**。[...] æˆ‘ćźžé™…äžŠèźĄćˆ’æŠŠćźƒç”šäșŽæˆ‘ć›ąé˜Ÿćœš **ćŸźèœŻçš„æœș晹歩äč ïŒˆMLïŒ‰æœćŠĄ**。慶䞭䞀äș›æ­Łćœšé›†æˆèż›æ žćżƒ **Windows** äș§ć“ä»„揊侀äș› **Office** äș§ć“ă€‚_」 -
Kabir Khan - Microsoft (ref)
+
Kabir Khan - Microsoft (ć‚è€ƒ)
--- 「_æˆ‘ä»Źé‡‡ç”š **FastAPI** ćș“杄搯抹侀äžȘćŻæŸ„èŻąä»„èŽ·ć–**éą„æ”‹ç»“æžœ**的 **REST** æœćŠĄć™šă€‚[甹äșŽ Ludwig]_」 -
Piero MolinoYaroslav DudinSai Sumanth Miryala - Uber (ref)
+
Piero MolinoYaroslav DudinSai Sumanth Miryala - Uber (ć‚è€ƒ)
--- 「_**Netflix** ćŸˆé«˜ć…ŽćźŁćžƒćŒ€æșæˆ‘仏的**ć±æœș缡理**çŒ–æŽ’æĄ†æž¶ïŒš**Dispatch**[äœżç”š **FastAPI** 构ć»ș]_」 -
Kevin GlissonMarc VilanovaForest Monsen - Netflix (ref)
+
Kevin GlissonMarc VilanovaForest Monsen - Netflix (ć‚è€ƒ)
--- 「_ćŠ‚æžœæœ‰äșșæ­Łćœšæž„ć»ș生äș§çș§çš„ Python API我ćŒș烈掚荐 **FastAPI**。漃**èźŸèźĄäŒ˜é›…**、**äœżç”šçź€ć•**侔**高ćșŠćŻæ‰©ć±•**ïŒŒćźƒć·Č经成äžșæˆ‘ä»Ź API äŒ˜ć…ˆćŒ€ć‘æˆ˜ç•„äž­çš„**慳锟组件**ćč¶é©±ćŠšäș†èźžć€šè‡ȘćŠšćŒ–ć’ŒæœćŠĄïŒŒæŻ”ćŠ‚æˆ‘ä»Źçš„ Virtual TAC Engineer。_」 -
Deon Pillsbury - Cisco (ref)
+
Deon Pillsbury - Cisco (ć‚è€ƒ)
--- @@ -192,7 +192,7 @@ $ pip install "fastapi[standard]"
-**Note**: èŻ·çĄźäżæŠŠ `"fastapi[standard]"` ç”šćŒ•ć·ćŒ…è”·æ„ïŒŒä»„äżèŻćœšæ‰€æœ‰ç»ˆç«Żäž­éƒœèƒœæ­Łćžžć·„äœœă€‚ +**æłšæ„**: èŻ·çĄźäżæŠŠ `"fastapi[standard]"` ç”šćŒ•ć·ćŒ…è”·æ„ïŒŒä»„äżèŻćœšæ‰€æœ‰ç»ˆç«Żäž­éƒœèƒœæ­Łćžžć·„äœœă€‚ ## ç€ș䟋 { #example } @@ -237,7 +237,7 @@ async def read_item(item_id: int, q: str | None = None): return {"item_id": item_id, "q": q} ``` -**Note**: +**æłšæ„**: ćŠ‚æžœäœ äžçĄźćźšïŒŒèŻ·æŸ„çœ‹æ–‡æĄŁäž­ _"In a hurry?"_ 章节的 [`async` 撌 `await`](https://fastapi.tiangolo.com/zh/async/#in-a-hurry) 郹戆。 @@ -400,7 +400,7 @@ item_id: int item: Item ``` -â€Šâ€Šé€šèż‡äž€æŹĄćŁ°æ˜ŽïŒŒäœ ć°†èŽ·ćŸ—ïŒš +...é€šèż‡äž€æŹĄćŁ°æ˜ŽïŒŒäœ ć°†èŽ·ćŸ—ïŒš * çŒ–èŸ‘ć™šæ”ŻæŒïŒŒćŒ…æ‹ŹïŒš * è‡ȘćŠšèĄ„ć…šă€‚ @@ -421,7 +421,7 @@ item: Item * `datetime` ćŻčè±Ąă€‚ * `UUID` ćŻčè±Ąă€‚ * æ•°æźćș“æšĄćž‹ă€‚ - * â€Šâ€Šä»„ćŠæ›Žć€šă€‚ + * ...ä»„ćŠæ›Žć€šă€‚ * è‡ȘćŠšç”Ÿæˆçš„äș€äș’ćŒ API æ–‡æĄŁïŒŒćŒ…æ‹Źäž€ç§ćŻé€‰çš„ç”šæˆ·ç•ŒéąïŒš * Swagger UI。 * ReDoc。 @@ -457,19 +457,19 @@ item: Item return {"item_name": item.name, "item_id": item_id} ``` -  从 +...从 ```Python ... "item_name": item.name ... ``` -

æ”čäžș +...æ”čäžș ```Python ... "item_price": item.price ... ``` -â€Šâ€Šçœ‹çœ‹äœ çš„çŒ–èŸ‘ć™šćŠ‚äœ•è‡ȘćŠšèĄ„ć…šć±žæ€§ćč¶çŸ„é“ćźƒä»Źçš„ç±»ćž‹ïŒš +...çœ‹çœ‹äœ çš„çŒ–èŸ‘ć™šćŠ‚äœ•è‡ȘćŠšèĄ„ć…šć±žæ€§ćč¶çŸ„é“ćźƒä»Źçš„ç±»ćž‹ïŒš ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) @@ -488,7 +488,7 @@ item: Item * ćŸșäșŽ HTTPX 撌 `pytest` çš„æžć…¶çź€ć•çš„æ”‹èŻ• * **CORS** * **Cookie Sessions** - * â€Šâ€Šä»„ćŠæ›Žć€šă€‚ + * ...ä»„ćŠæ›Žć€šă€‚ ### 郚çœČ䜠的ćș”ç”šïŒˆćŻé€‰ïŒ‰ { #deploy-your-app-optional } diff --git a/docs/zh/docs/project-generation.md b/docs/zh/docs/project-generation.md index 8cc50c096..371eb7319 100644 --- a/docs/zh/docs/project-generation.md +++ b/docs/zh/docs/project-generation.md @@ -1,5 +1,6 @@ # FastAPIć…šæ ˆæšĄæż { #full-stack-fastapi-template } + æšĄæżé€šćžžćžŠæœ‰ç‰čćźšçš„èźŸçœźïŒŒäœ†ćźƒä»Źèą«èźŸèźĄäžșç”æŽ»äž”ćŻćźšćˆ¶ă€‚èż™æ ·äœ ćŻä»„æ čæźéĄčç›źéœ€æ±‚èż›èĄŒäżźæ”čć’Œè°ƒæ•ŽïŒŒäœżć…¶æˆäžșćŸˆć„œçš„è”·ç‚č。🏁 äœ ćŻä»„äœżç”šæ­€æšĄæżćŒ€ć§‹ïŒŒćźƒć·Č经äžșäœ ćźŒæˆäș†ć€§é‡çš„ćˆć§‹èźŸçœźă€ćź‰ć…šæ€§ă€æ•°æźćș“仄揊侀äș› API 端ç‚č。 diff --git a/docs/zh/docs/python-types.md b/docs/zh/docs/python-types.md index 7901f9702..4d2c2749a 100644 --- a/docs/zh/docs/python-types.md +++ b/docs/zh/docs/python-types.md @@ -2,11 +2,11 @@ Python æ”ŻæŒćŻé€‰çš„â€œç±»ćž‹æç€ș”äčŸć«â€œç±»ćž‹æłšè§Łâ€ïŒ‰ă€‚ -èż™äș›â€œç±»ćž‹æç€șâ€æˆ–æłšè§Łæ˜Żäž€ç§ç‰čæźŠèŻ­æł•ïŒŒç”šæ„ćŁ°æ˜Žć˜é‡çš„ç±»ćž‹ă€‚ +èż™äș› **â€œç±»ćž‹æç€ș”** æˆ–æłšè§Łæ˜Żäž€ç§ç‰čæźŠèŻ­æł•ïŒŒç”šæ„ćŁ°æ˜Žć˜é‡çš„ç±»ćž‹ă€‚ é€šèż‡äžșć˜é‡ćŁ°æ˜Žç±»ćž‹ïŒŒçŒ–èŸ‘ć™šć’Œć·„ć…·ćŻä»„äžșäœ æäŸ›æ›Žć„œçš„æ”ŻæŒă€‚ -èż™ćȘæ˜Żäž€äžȘ慳äșŽ Python ç±»ćž‹æç€șçš„ćż«é€Ÿć…„é—š/ć€äč ă€‚ćźƒćȘ涔盖䞎 **FastAPI** äž€è”·äœżç”šæ‰€éœ€çš„æœ€ć°‘éƒšćˆ†...漞际侊非澾民。 +èż™ćȘæ˜Żäž€äžȘ慳äșŽ Python ç±»ćž‹æç€ș的**ćż«é€Ÿć…„é—š/ć€äč **。漃ćȘ涔盖䞎 **FastAPI** äž€è”·äœżç”šæ‰€éœ€çš„æœ€ć°‘éƒšćˆ†...漞际侊非澾民。 **FastAPI** 漌慹ćŸșäșŽèż™äș›ç±»ćž‹æç€ș构ć»șïŒŒćźƒä»ŹćžŠæ„äș†èźžć€šäŒ˜ćŠżć’Œć„œć€„ă€‚ @@ -44,7 +44,7 @@ John Doe äœ†çŽ°ćœšæƒłè±Ąäœ èŠä»Žé›¶ćŒ€ć§‹ć†™ćźƒă€‚ -ćœšæŸäžȘæ—¶ćˆ»äœ ćŒ€ć§‹ćźšäč‰ć‡œæ•°ïŒŒćč¶äž”ć‡†ć€‡ć„œäș†ć‚数   +ćœšæŸäžȘæ—¶ćˆ»äœ ćŒ€ć§‹ćźšäč‰ć‡œæ•°ïŒŒćč¶äž”ć‡†ć€‡ć„œäș†ć‚æ•°... æŽ„äž‹æ„äœ éœ€èŠè°ƒç”šâ€œé‚ŁäžȘæŠŠéŠ–ć­—æŻć˜ć€§ć†™çš„æ–čæł•â€ă€‚ @@ -62,7 +62,7 @@ John Doe æˆ‘ä»Źæ„æ”č才侀äžȘç‰ˆæœŹçš„äž€èĄŒä»Łç ă€‚ -æŠŠć‡œæ•°ć‚æ•°ä»ŽïŒš +æˆ‘ä»ŹäŒšæŠŠèż™äžȘç‰‡æź”ïŒŒäčŸć°±æ˜Żć‡œæ•°ć‚数从 ```Python first_name, last_name @@ -151,7 +151,7 @@ def some_function(data: Any): 有äș›ç±»ćž‹ćŻä»„朹æ–čæ‹Źć·äž­æŽ„æ”¶â€œç±»ćž‹ć‚æ•°â€ïŒˆtype parameters甚äșŽćŁ°æ˜Žć…¶ć†…éƒšć€Œçš„ç±»ćž‹ă€‚æŻ”ćŠ‚â€œć­—çŹŠäžČćˆ—èĄšâ€ćŻä»„ć†™äžș `list[str]`。 -èż™äș›èƒœæŽ„æ”¶ç±»ćž‹ć‚æ•°çš„ç±»ćž‹ç§°äžșâ€œæł›ćž‹ç±»ćž‹â€ïŒˆGeneric typesïŒ‰æˆ–â€œæł›ćž‹â€ïŒˆGenericsïŒ‰ă€‚ +èż™äș›èƒœæŽ„æ”¶ç±»ćž‹ć‚æ•°çš„ç±»ćž‹ç§°äžș**æł›ćž‹ç±»ćž‹**Generic types或**æł›ćž‹**GenericsïŒ‰ă€‚ äœ ćŻä»„æŠŠç›žćŒçš„ć†…ć»șç±»ćž‹äœœäžșæł›ćž‹äœżç”šïŒˆćžŠæ–čæ‹Źć·ć’Œć†…éƒšç±»ćž‹ïŒ‰ïŒš @@ -221,7 +221,7 @@ def some_function(data: Any): #### Union { #union } -äœ ćŻä»„ćŁ°æ˜Žäž€äžȘć˜é‡ćŻä»„æ˜Żè‹„ćčČç§ç±»ćž‹äž­çš„ä»»æ„äž€ç§ïŒŒæŻ”ćŠ‚æ—ąćŻä»„æ˜Ż `int` äčŸćŻä»„æ˜Ż `str`。 +äœ ćŻä»„ćŁ°æ˜Žäž€äžȘć˜é‡ćŻä»„æ˜Ż**è‹„ćčČç§ç±»ćž‹**äž­çš„ä»»æ„äž€ç§ïŒŒæŻ”ćŠ‚æ—ąćŻä»„æ˜Ż `int` äčŸćŻä»„æ˜Ż `str`。 漚ä艿—¶äœżç”šç«–çșżïŒˆ`|`ïŒ‰æŠŠäž€ç§ç±»ćž‹ćˆ†ćŒ€ă€‚ @@ -263,9 +263,9 @@ def some_function(data: Any): -æłšæ„ïŒŒèż™èĄšç€ș“`one_person` æ˜Żç±» `Person` 的侀äžȘćźžäŸ‹ïŒˆinstanceïŒ‰â€ă€‚ +æłšæ„ïŒŒèż™èĄšç€ș“`one_person` æ˜Żç±» `Person` 的侀äžȘ**ćźžäŸ‹**instanceïŒ‰â€ă€‚ -柃ćč¶äžèĄšç€ș“`one_person` æ˜Żćäžș `Person` çš„ç±»æœŹèș«ïŒˆclassïŒ‰â€ă€‚ +柃ćč¶äžèĄšç€ș“`one_person` æ˜Żćäžș `Person` 的**ç±»**classïŒ‰â€ă€‚ ## Pydantic æšĄćž‹ { #pydantic-models } @@ -285,7 +285,7 @@ def some_function(data: Any): /// note | æłšæ„ -æƒłäș†è§Łæ›Žć€šć…łäșŽ [Pydantic](https://docs.pydantic.dev/) çš„äżĄæŻïŒŒèŻ·æŸ„çœ‹ć…¶æ–‡æĄŁă€‚ +芁äș†è§Łæ›Žć€šć…łäșŽ [Pydantic çš„äżĄæŻïŒŒèŻ·æŸ„çœ‹ć…¶æ–‡æĄŁ](https://docs.pydantic.dev/)。 /// @@ -295,7 +295,7 @@ def some_function(data: Any): ## ćžŠć…ƒæ•°æźæłšè§Łçš„ç±»ćž‹æç€ș { #type-hints-with-metadata-annotations } -Python èż˜æäŸ›äș†äž€äžȘç‰čæ€§ïŒŒćŻä»„äœżç”š `Annotated` ćœšèż™äș›ç±»ćž‹æç€șäž­æ”Ÿć…„éąć€–çš„ć…ƒæ•°æźă€‚ +Python èż˜æäŸ›äș†äž€äžȘç‰čæ€§ïŒŒćŻä»„äœżç”š `Annotated` ćœšèż™äș›ç±»ćž‹æç€șäž­æ”Ÿć…„**éąć€–çš„ć…ƒæ•°æź**。 äœ ćŻä»„ä»Ž `typing` ćŻŒć…„ `Annotated`。 @@ -305,15 +305,15 @@ Python æœŹèș«äžäŒšćŻčèż™äžȘ `Annotated` ćšä»»äœ•ć€„ç†ă€‚ćŻčäșŽçŒ–èŸ‘ć™šć’Œć…¶ äœ†äœ ćŻä»„ćœš `Annotated` äž­äžș **FastAPI** æäŸ›éąć€–çš„ć…ƒæ•°æźïŒŒæ„æèż°äœ ćžŒæœ›ćș”ç”šćŠ‚äœ•èĄŒäžș。 -é‡èŠçš„æ˜ŻèŠèź°äœïŒšäŒ ç»™ `Annotated` 的第侀äžȘç±»ćž‹ć‚æ•°æ‰æ˜Żćźžé™…ç±»ćž‹ă€‚ć…¶äœ™çš„ćȘæ˜Żç»™ć…¶ä»–ć·„ć…·ç”šçš„ć…ƒæ•°æźă€‚ +é‡èŠçš„æ˜ŻèŠèź°äœïŒšäŒ ç»™ `Annotated` 的**第侀äžȘ*ç±»ćž‹ć‚æ•°***æ‰æ˜Ż**柞际类枋**ă€‚ć…¶äœ™çš„ćȘæ˜Żç»™ć…¶ä»–ć·„ć…·ç”šçš„ć…ƒæ•°æźă€‚ çŽ°ćœšäœ ćȘ需芁矄道 `Annotated` çš„ć­˜ćœšïŒŒćč¶äž”ćꃿ˜Żæ ‡ć‡† Python。😎 -çšćŽäœ äŒšçœ‹ćˆ°ćźƒæœ‰ć€šäčˆćŒș性。 +çšćŽäœ äŒšçœ‹ćˆ°ćźƒæœ‰ć€šäčˆ**ćŒș性**。 /// tip | 提ç€ș -èż™æ˜Żæ ‡ć‡† PythonïŒŒèż™æ„ć‘łç€äœ ä»ç„¶ćŻä»„ćœšçŒ–èŸ‘ć™šé‡ŒèŽ·ćŸ—ć°œćŻèƒœć„œçš„ćŒ€ć‘äœ“éȘŒïŒŒćč¶èƒœć’Œäœ ç”šæ„ćˆ†æžă€é‡æž„ä»Łç çš„ć·„ć…·è‰Żć„œćäœœç­‰ă€‚âœš +èż™æ˜Ż**æ ‡ć‡† Python**ïŒŒèż™æ„ć‘łç€äœ ä»ç„¶ćŻä»„ćœšçŒ–èŸ‘ć™šé‡ŒèŽ·ćŸ—**ć°œćŻèƒœć„œçš„ćŒ€ć‘äœ“éȘŒ**ćč¶èƒœć’Œäœ ç”šæ„ćˆ†æžă€é‡æž„ä»Łç çš„ć·„ć…·è‰Żć„œćäœœç­‰ă€‚âœš ćŒæ—¶äœ çš„ä»Łç äčŸèƒœäžŽèźžć€šć…¶ä»– Python ć·„ć…·ć’Œćș“高ćșŠć…Œćźč。🚀 @@ -325,16 +325,16 @@ Python æœŹèș«äžäŒšćŻčèż™äžȘ `Annotated` ćšä»»äœ•ć€„ç†ă€‚ćŻčäșŽçŒ–èŸ‘ć™šć’Œć…¶ 朹 **FastAPI** äž­ïŒŒç”šç±»ćž‹æç€șæ„ćŁ°æ˜Žć‚æ•°ïŒŒäœ ć°†èŽ·ćŸ—ïŒš -* çŒ–èŸ‘ć™šæ”ŻæŒă€‚ -* ç±»ćž‹æŁ€æŸ„ă€‚ +* **çŒ–èŸ‘ć™šæ”ŻæŒ**。 +* **ç±»ćž‹æŁ€æŸ„**。 -

ćč¶äž” **FastAPI** äŒšäœżç”šç›žćŒçš„ćŁ°æ˜Žæ„ïŒš +...ćč¶äž” **FastAPI** äŒšäœżç”šç›žćŒçš„ćŁ°æ˜Žæ„ïŒš -* 漚äč‰èŠæ±‚ïŒšä»ŽèŻ·æ±‚è·ŻćŸ„ć‚æ•°ă€æŸ„èŻąć‚æ•°ă€èŻ·æ±‚ć€Žă€èŻ·æ±‚äœ“ă€äŸè”–ç­‰ă€‚ -* èœŹæąæ•°æźïŒšæŠŠèŻ·æ±‚äž­çš„æ•°æźèœŹæąäžșæ‰€éœ€ç±»ćž‹ă€‚ -* æ ĄéȘŒæ•°æźïŒšćŻčäșŽæŻäžȘèŻ·æ±‚ïŒš - * ćœ“æ•°æźæ— æ•ˆæ—¶ïŒŒè‡ȘćŠšç”Ÿæˆé”™èŻŻäżĄæŻèż”ć›žç»™ćźąæˆ·ç«Żă€‚ -* äœżç”š OpenAPI èź°ćœ• API +* **漚äč‰èŠæ±‚**ïŒšä»ŽèŻ·æ±‚è·ŻćŸ„ć‚æ•°ă€æŸ„èŻąć‚æ•°ă€èŻ·æ±‚ć€Žă€èŻ·æ±‚äœ“ă€äŸè”–ç­‰ă€‚ +* **èœŹæąæ•°æź**ïŒšæŠŠèŻ·æ±‚äž­çš„æ•°æźèœŹæąäžșæ‰€éœ€ç±»ćž‹ă€‚ +* **æ ĄéȘŒæ•°æź**ćŻčäșŽæŻäžȘèŻ·æ±‚ïŒš + * ćœ“æ•°æźæ— æ•ˆæ—¶ïŒŒè‡ȘćŠšç”Ÿæˆèż”ć›žç»™ćźąæˆ·ç«Żçš„**é”™èŻŻ**。 +* äœżç”š OpenAPI **èź°ćœ•** API * 然搎甚äșŽè‡ȘćŠšç”Ÿæˆäș€äș’ćŒæ–‡æĄŁç•Œéąă€‚ èż™äș›ćŹè”·æ„ćŻèƒœæœ‰ç‚čæŠœè±Ąă€‚ćˆ«æ‹…ćżƒă€‚äœ äŒšćœš[教皋 - ç”šæˆ·æŒ‡ć—](tutorial/index.md)äž­çœ‹ćˆ°æ‰€æœ‰èż™äș›çš„ćźžé™…æ•ˆæžœă€‚ @@ -343,6 +343,6 @@ Python æœŹèș«äžäŒšćŻčèż™äžȘ `Annotated` ćšä»»äœ•ć€„ç†ă€‚ćŻčäșŽçŒ–èŸ‘ć™šć’Œć…¶ /// note | æłšæ„ -ćŠ‚æžœäœ ć·Čç»èŻ»ćźŒæ‰€æœ‰æ•™çš‹ïŒŒćˆć›žæ„æƒłèż›äž€æ­„äș†è§Łç±»ćž‹ïŒŒäž€äžȘ䞍错的蔄æșæ˜Ż [`mypy` çš„â€œé€ŸæŸ„èĄšâ€](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)。 +ćŠ‚æžœäœ ć·Čç»èŻ»ćźŒæ•ŽäžȘæ•™çš‹ïŒŒćˆć›žæ„æƒłèż›äž€æ­„äș†è§Łç±»ćž‹ïŒŒäž€äžȘ䞍错的蔄æșæ˜Ż [`mypy` çš„â€œé€ŸæŸ„èĄšâ€](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)。 /// diff --git a/docs/zh/docs/tutorial/bigger-applications.md b/docs/zh/docs/tutorial/bigger-applications.md index 1be1be628..9bb4bea99 100644 --- a/docs/zh/docs/tutorial/bigger-applications.md +++ b/docs/zh/docs/tutorial/bigger-applications.md @@ -17,16 +17,16 @@ ``` . ├── app -│   ├── __init__.py -│   ├── main.py -│   ├── dependencies.py -│   └── routers -│   │ ├── __init__.py -│   │ ├── items.py -│   │ └── users.py -│   └── internal -│   ├── __init__.py -│   └── admin.py +│ ├── __init__.py +│ ├── main.py +│ ├── dependencies.py +│ └── routers +│ │ ├── __init__.py +│ │ ├── items.py +│ │ └── users.py +│ └── internal +│ ├── __init__.py +│ └── admin.py ``` /// tip | 提ç€ș diff --git a/docs/zh/docs/tutorial/body-nested-models.md b/docs/zh/docs/tutorial/body-nested-models.md index 98e5168aa..ce10b74a9 100644 --- a/docs/zh/docs/tutorial/body-nested-models.md +++ b/docs/zh/docs/tutorial/body-nested-models.md @@ -137,7 +137,7 @@ Pydantic æšĄćž‹çš„æŻäžȘć±žæ€§éƒœć…·æœ‰ç±»ćž‹ă€‚ /// note | æłšæ„ -èŻ·æłšæ„ `images` é”źçŽ°ćœšć…·æœ‰äž€ç»„ image ćŻčè±Ąæ˜ŻćŠ‚äœ•ć‘ç”Ÿçš„ă€‚ +èŻ·æłšæ„ `images` é”źçŽ°ćœšć…·æœ‰äž€äžȘ image ćŻčè±Ąćˆ—èĄšæ˜ŻćŠ‚äœ•ć‘ç”Ÿçš„ă€‚ /// @@ -149,7 +149,7 @@ Pydantic æšĄćž‹çš„æŻäžȘć±žæ€§éƒœć…·æœ‰ç±»ćž‹ă€‚ /// note | æłšæ„ -èŻ·æłšæ„ `Offer` 拄有䞀组 `Item` è€Œćèż‡æ„ `Item` ćˆæœ‰äž€äžȘ揯选的 `Image` ćˆ—èĄšæ˜ŻćŠ‚äœ•ć‘ç”Ÿçš„ă€‚ +èŻ·æłšæ„ `Offer` 拄有䞀äžȘ `Item` ćˆ—èĄšïŒŒè€Œćèż‡æ„ `Item` ćˆæœ‰äž€äžȘ揯选的 `Image` ćˆ—èĄšæ˜ŻćŠ‚äœ•ć‘ç”Ÿçš„ă€‚ /// diff --git a/docs/zh/docs/tutorial/body.md b/docs/zh/docs/tutorial/body.md index ee4124e94..b32a5ac60 100644 --- a/docs/zh/docs/tutorial/body.md +++ b/docs/zh/docs/tutorial/body.md @@ -20,21 +20,22 @@ ## ćŻŒć…„ Pydantic 的 `BaseModel` { #import-pydantics-basemodel } -从 `pydantic` äž­ćŻŒć…„ `BaseModel` +éŠ–ć…ˆïŒŒäœ éœ€èŠä»Ž `pydantic` äž­ćŻŒć…„ `BaseModel` {* ../../docs_src/body/tutorial001_py310.py hl[2] *} ## 戛ć»șæ•°æźæšĄćž‹ { #create-your-data-model } -æŠŠæ•°æźæšĄćž‹ćŁ°æ˜Žäžșç»§æ‰ż `BaseModel` 的类。 +ç„¶ćŽïŒŒæŠŠæ•°æźæšĄćž‹ćŁ°æ˜Žäžșç»§æ‰ż `BaseModel` 的类。 äœżç”š Python æ ‡ć‡†ç±»ćž‹ćŁ°æ˜Žæ‰€æœ‰ć±žæ€§ïŒš {* ../../docs_src/body/tutorial001_py310.py hl[5:9] *} + äžŽćŁ°æ˜ŽæŸ„èŻąć‚æ•°äž€æ ·ïŒŒćŒ…ć«é»˜èź€ć€Œçš„æšĄćž‹ć±žæ€§æ˜ŻćŻé€‰çš„ïŒŒćŠćˆ™ć°±æ˜Żćż…é€‰çš„ă€‚æŠŠé»˜èź€ć€ŒèźŸäžș `None` ćŻäœżć…¶ć˜äžș揯选。 -äŸ‹ćŠ‚ïŒŒäžŠèż°æšĄćž‹ćŁ°æ˜ŽćŠ‚äž‹ JSON "object"ïŒˆćł Python `dict` +äŸ‹ćŠ‚ïŒŒäžŠèż°æšĄćž‹ćŁ°æ˜ŽćŠ‚äž‹ JSON "`object`"ïŒˆćł Python `dict` ```JSON { @@ -45,7 +46,7 @@ } ``` -...由äșŽ `description` 撌 `tax` æ˜ŻćŻé€‰çš„ïŒˆé»˜èź€ć€Œäžș `None`ïŒ‰ïŒŒäž‹éąçš„ JSON "object" ä蟿œ‰æ•ˆïŒš +...由äșŽ `description` 撌 `tax` æ˜ŻćŻé€‰çš„ïŒˆé»˜èź€ć€Œäžș `None`ïŒ‰ïŒŒäž‹éąçš„ JSON "`object`" ä蟿œ‰æ•ˆïŒš ```JSON { @@ -123,7 +124,7 @@ ## äœżç”šæšĄćž‹ { #use-the-model } -朹*è·ŻćŸ„æ“äœœ*ć‡œæ•°ć†…éƒšç›ŽæŽ„èźżé—źæšĄćž‹ćŻčè±Ąçš„æ‰€æœ‰ć±žæ€§ïŒš +ćœšć‡œæ•°ć†…éƒšç›ŽæŽ„èźżé—źæšĄćž‹ćŻčè±Ąçš„æ‰€æœ‰ć±žæ€§ïŒš {* ../../docs_src/body/tutorial002_py310.py *} @@ -135,6 +136,7 @@ {* ../../docs_src/body/tutorial003_py310.py hl[15:16] *} + ## èŻ·æ±‚äœ“ + è·ŻćŸ„ + æŸ„èŻąć‚æ•° { #request-body-path-query-parameters } äčŸćŻä»„ćŒæ—¶ćŁ°æ˜Ž**èŻ·æ±‚äœ“**、**è·ŻćŸ„**撌**æŸ„èŻą**ć‚æ•°ă€‚ diff --git a/docs/zh/docs/tutorial/debugging.md b/docs/zh/docs/tutorial/debugging.md index 4f4503eef..0b1ada2de 100644 --- a/docs/zh/docs/tutorial/debugging.md +++ b/docs/zh/docs/tutorial/debugging.md @@ -62,7 +62,7 @@ from myapp import app # 慶他䞀äș›ä»Łç  ``` -ćœšèż™ç§æƒ…ć†”äž‹ïŒŒ`myapp.py` 憅郹的è‡ȘćŠšć˜é‡äžäŒšæœ‰ć€Œäžș `"__main__"` 的揘量 `__name__`。 +ćœšèż™ç§æƒ…ć†”äž‹ïŒŒ`myapp.py` 憅郹è‡Ș抹戛ć»ș的揘量 `__name__` äžäŒšæœ‰ć€Œ `"__main__"`。 æ‰€ä»„ïŒŒèż™äž€èĄŒïŒš @@ -89,7 +89,7 @@ from myapp import app * èż›ć…„ćˆ°ă€Œè°ƒèŻ•ă€éąæżă€‚ * ă€Œæ·»ćŠ é…çœź...」。 * 选侭「Python」 -* èżèĄŒă€ŒPythonïŒšćœ“ć‰æ–‡ä»¶ïŒˆé›†æˆç»ˆç«ŻïŒ‰ă€é€‰éĄčçš„è°ƒèŻ•ć™šă€‚ +* äœżç”šé€‰éĄč "`Python: Current File (Integrated Terminal)`" èżèĄŒè°ƒèŻ•ć™šă€‚ ç„¶ćŽćźƒäŒšäœżç”šäœ çš„ **FastAPI** ä»Łç ćŒ€ćŻæœćŠĄć™šïŒŒćœćœšæ–­ç‚čć€„ïŒŒç­‰ç­‰ă€‚ @@ -99,7 +99,7 @@ from myapp import app --- -ćŠ‚æžœäœżç”š PycharmïŒŒäœ ćŻä»„ïŒš +ćŠ‚æžœäœżç”š PyCharmïŒŒäœ ćŻä»„ïŒš * æ‰“ćŒ€ă€ŒèżèĄŒă€èœć•ă€‚ * é€‰äž­ă€Œè°ƒèŻ•...」。 diff --git a/docs/zh/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/zh/docs/tutorial/dependencies/dependencies-with-yield.md index 5beda5709..85510bbf4 100644 --- a/docs/zh/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/zh/docs/tutorial/dependencies/dependencies-with-yield.md @@ -267,7 +267,8 @@ with open("./somefile.txt") as f: 朹 Python äž­ïŒŒäœ ćŻä»„é€šèż‡[戛ć»ș侀äžȘćžŠæœ‰ `__enter__()` 撌 `__exit__()` æ–čæł•的类](https://docs.python.org/3/reference/datamodel.html#context-managers)æ„ćˆ›ć»șäžŠäž‹æ–‡çźĄç†ć™šă€‚ -䜠äčŸćŻä»„朹 **FastAPI** çš„ćžŠæœ‰ `yield` çš„äŸè”–äž­ïŒŒäœżç”šäŸè”–ć‡œæ•°ć†…éƒšçš„ `with` 或 `async with` èŻ­ć„æ„äœżç”šćźƒä»ŹïŒš +䜠äčŸćŻä»„朹 **FastAPI** çš„ćžŠæœ‰ `yield` çš„äŸè”–äž­é€šèż‡ćœšäŸè”–ć‡œæ•°ć†…éƒšäœżç”š +`with` 或 `async with` èŻ­ć„æ„äœżç”šćźƒä»ŹïŒš {* ../../docs_src/dependencies/tutorial010_py310.py hl[1:9,13] *} diff --git a/docs/zh/docs/tutorial/extra-data-types.md b/docs/zh/docs/tutorial/extra-data-types.md index 76748a7a3..441558285 100644 --- a/docs/zh/docs/tutorial/extra-data-types.md +++ b/docs/zh/docs/tutorial/extra-data-types.md @@ -1,15 +1,15 @@ # éąć€–æ•°æźç±»ćž‹ { #extra-data-types } -戰盼才äžșæ­ąïŒŒæ‚šäž€ç›Žćœšäœżç”šćžžè§çš„æ•°æźç±»ćž‹ïŒŒćŠ‚: +戰盼才äžșæ­ąïŒŒäœ äž€ç›Žćœšäœżç”šćžžè§çš„æ•°æźç±»ćž‹ïŒŒćŠ‚: * `int` * `float` * `str` * `bool` -äœ†æ˜Żæ‚šäčŸćŻä»„äœżç”šæ›Žć€æ‚çš„æ•°æźç±»ćž‹ă€‚ +äœ†æ˜Żäœ äčŸćŻä»„äœżç”šæ›Žć€æ‚çš„æ•°æźç±»ćž‹ă€‚ -æ‚šä»ç„¶äŒšæ‹„æœ‰çŽ°ćœšć·Čç»çœ‹ćˆ°çš„ç›žćŒçš„ç‰č性: +äœ ä»ç„¶äŒšæ‹„æœ‰çŽ°ćœšć·Čç»çœ‹ćˆ°çš„ç›žćŒçš„ç‰č性: * ćŸˆæŁ’çš„çŒ–èŸ‘ć™šæ”ŻæŒă€‚ * äŒ ć…„èŻ·æ±‚çš„æ•°æźèœŹæąă€‚ @@ -49,7 +49,7 @@ * `Decimal`: * æ ‡ć‡†çš„ Python `Decimal`。 * ćœšèŻ·æ±‚ć’Œć“ćș”äž­èą«ćœ“ćš `float` äž€æ ·ć€„ç†ă€‚ -* æ‚šćŻä»„ćœšèż™é‡ŒæŁ€æŸ„æ‰€æœ‰æœ‰æ•ˆçš„ Pydantic æ•°æźç±»ćž‹: [Pydantic data types](https://docs.pydantic.dev/latest/usage/types/types/)。 +* äœ ćŻä»„ćœšèż™é‡ŒæŁ€æŸ„æ‰€æœ‰æœ‰æ•ˆçš„ Pydantic æ•°æźç±»ćž‹: [Pydantic data types](https://docs.pydantic.dev/latest/usage/types/types/)。 ## äŸ‹ć­ { #example } diff --git a/docs/zh/docs/tutorial/extra-models.md b/docs/zh/docs/tutorial/extra-models.md index 0ad35cc4f..60f66c5f1 100644 --- a/docs/zh/docs/tutorial/extra-models.md +++ b/docs/zh/docs/tutorial/extra-models.md @@ -1,5 +1,6 @@ # æ›Žć€šæšĄćž‹ { #extra-models } + äčŠæŽ„äžŠæ–‡ïŒŒć€šäžȘć…łè”æšĄćž‹èż™ç§æƒ…ć†”ćŸˆćžžè§ă€‚ ç‰čćˆ«æ˜Żç”šæˆ·æšĄćž‹ïŒŒć› äžș diff --git a/docs/zh/docs/tutorial/first-steps.md b/docs/zh/docs/tutorial/first-steps.md index 3eee0d44f..cadcac3e2 100644 --- a/docs/zh/docs/tutorial/first-steps.md +++ b/docs/zh/docs/tutorial/first-steps.md @@ -1,5 +1,6 @@ # çŹŹäž€æ­„ { #first-steps } + æœ€çź€ć•çš„ FastAPI æ–‡ä»¶ćŻèƒœćƒäž‹éąèż™æ ·ïŒš {* ../../docs_src/first_steps/tutorial001_py310.py *} diff --git a/docs/zh/docs/tutorial/handling-errors.md b/docs/zh/docs/tutorial/handling-errors.md index f3a23fab0..b77ca7a6c 100644 --- a/docs/zh/docs/tutorial/handling-errors.md +++ b/docs/zh/docs/tutorial/handling-errors.md @@ -6,16 +6,16 @@ äœ ćŻèƒœéœ€èŠć‘ŠèŻ‰ćźąæˆ·ç«ŻïŒš -- ćźąæˆ·ç«ŻæČĄæœ‰æ‰§èĄŒèŻ„æ“äœœçš„æƒé™ -- ćźąæˆ·ç«ŻæČĄæœ‰èźżé—źèŻ„è”„æșçš„æƒé™ -- ćźąæˆ·ç«ŻèŠèźżé—źçš„éĄč盼侍歘朹 -- 等等 +* ćźąæˆ·ç«ŻæČĄæœ‰æ‰§èĄŒèŻ„æ“äœœçš„æƒé™ +* ćźąæˆ·ç«ŻæČĄæœ‰èźżé—źèŻ„è”„æșçš„æƒé™ +* ćźąæˆ·ç«ŻèŠèźżé—źçš„éĄč盼侍歘朹 +* 等等 -é‡ćˆ°èż™äș›æƒ…ć†”æ—¶ïŒŒé€šćžžèŠèż”ć›ž **4XX**400 è‡ł 499**HTTP 状态码**。 +é‡ćˆ°èż™äș›æƒ…ć†”æ—¶ïŒŒé€šćžžèŠèż”ć›ž **400** èŒƒć›Žć†…ïŒˆ400 è‡ł 499的 **HTTP 状态码**。 -èż™äžŽèĄšç€șèŻ·æ±‚æˆćŠŸçš„ **2XX**200 è‡ł 299HTTP çŠ¶æ€ç ç±»äŒŒă€‚é‚Łäș›â€œ200â€çŠ¶æ€ç èĄšç€ș某种皋ćșŠäžŠçš„â€œæˆćŠŸâ€ă€‚ +èż™äžŽ 200 HTTP 状态码200 è‡ł 299ïŒ‰ç±»äŒŒă€‚é‚Łäș›â€œ200â€çŠ¶æ€ç èĄšç€șèŻ·æ±‚ćœšæŸç§çš‹ćșŠäžŠâ€œæˆćŠŸâ€ă€‚ -而 **4XX** çŠ¶æ€ç èĄšç€șćźąæˆ·ç«Żć‘ç”Ÿäș†é”™èŻŻă€‚ +而 400 èŒƒć›Žć†…çš„çŠ¶æ€ç èĄšç€șćźąæˆ·ç«Żć‘ç”Ÿäș†é”™èŻŻă€‚ ć€§ćź¶éƒœçŸ„é“**「404 Not Found」**é”™èŻŻïŒŒèż˜æœ‰è°ƒäŸƒèż™äžȘé”™èŻŻçš„çŹ‘èŻć§ïŒŸ @@ -237,8 +237,8 @@ from starlette.exceptions import HTTPException as StarletteHTTPException ### ć€ç”š **FastAPI** çš„ćŒ‚ćžžć€„ç†ć™š { #reuse-fastapis-exception-handlers } -ćŠ‚æžœäœ æƒłćœšè‡Ș漚äč‰ć€„ç†ćŽä»ć€ç”š **FastAPI** çš„é»˜èź€ćŒ‚ćžžć€„ç†ć™šïŒŒćŻä»„ä»Ž `fastapi.exception_handlers` ćŻŒć…„ćč¶ć€ç”šèż™äș›é»˜èź€ć€„ç†ć™šïŒš +ćŠ‚æžœäœ æƒłćœšäœżç”šèŻ„ćŒ‚ćžžçš„ćŒæ—¶äœżç”š **FastAPI** çš„ç›žćŒé»˜èź€ćŒ‚ćžžć€„ç†ć™šïŒŒćŻä»„ä»Ž `fastapi.exception_handlers` ćŻŒć…„ćč¶ć€ç”šèż™äș›é»˜èź€ć€„ç†ć™šïŒš {* ../../docs_src/handling_errors/tutorial006_py310.py hl[2:5,15,21] *} -è™œç„¶æœŹäŸ‹ćȘæ˜Żç”šéžćžžć€žćŒ çš„äżĄæŻæ‰“ć°äș†é”™èŻŻïŒŒäœ†è¶łä»„èŻŽæ˜ŽïŒšäœ ćŻä»„ć…ˆć€„ç†ćŒ‚ćžžïŒŒç„¶ćŽć†ć€ç”šé»˜èź€çš„ćŒ‚ćžžć€„ç†ć™šă€‚ +è™œç„¶æœŹäŸ‹ćȘæ˜Żç”šéžćžžć€žćŒ çš„äżĄæŻæ‰“ć°äș†é”™èŻŻïŒŒäœ†è¶łä»„èŻŽæ˜ŽïŒšäœ ćŻä»„äœżç”šèŻ„ćŒ‚ćžžïŒŒç„¶ćŽç›ŽæŽ„ć€ç”šé»˜èź€çš„ćŒ‚ćžžć€„ç†ć™šă€‚ diff --git a/docs/zh/docs/tutorial/index.md b/docs/zh/docs/tutorial/index.md index 8d6cbc7a6..fde264d2c 100644 --- a/docs/zh/docs/tutorial/index.md +++ b/docs/zh/docs/tutorial/index.md @@ -1,10 +1,10 @@ # 教皋 - ç”šæˆ·æŒ‡ć— { #tutorial-user-guide } -æœŹæ•™çš‹ć°†äž€æ­„æ­„ć‘æ‚šć±•ç€șćŠ‚äœ•äœżç”š **FastAPI** çš„ç»ć€§éƒšćˆ†ç‰čæ€§ă€‚ +æœŹæ•™çš‹ć°†äž€æ­„æ­„ć‘äœ ć±•ç€șćŠ‚äœ•äœżç”š **FastAPI** çš„ç»ć€§éƒšćˆ†ç‰čæ€§ă€‚ -搄äžȘç« èŠ‚çš„ć†…ćźčćŸȘćșæžèż›ïŒŒäœ†æ˜Żćˆć›Žç»•ç€ć•ç‹Źçš„äž»éą˜ïŒŒæ‰€ä»„æ‚šćŻä»„ç›ŽæŽ„è·łèœŹćˆ°æŸäžȘç« èŠ‚ä»„è§Łć†łæ‚šçš„ç‰č漚 API éœ€æ±‚ă€‚ +搄äžȘç« èŠ‚çš„ć†…ćźčćŸȘćșæžèż›ïŒŒäœ†æ˜Żćˆć›Žç»•ç€ć•ç‹Źçš„äž»éą˜ïŒŒæ‰€ä»„äœ ćŻä»„ç›ŽæŽ„è·łèœŹćˆ°æŸäžȘç« èŠ‚ä»„è§Łć†łäœ çš„ç‰č漚 API éœ€æ±‚ă€‚ -æœŹæ•™çš‹ćŒæ ·ćŻä»„äœœäžșć°†æ„çš„ć‚è€ƒæ‰‹ć†ŒïŒŒæ‰€ä»„æ‚šćŻä»„éšæ—¶ć›žćˆ°æœŹæ•™çš‹ćč¶æŸ„é˜…æ‚šéœ€èŠçš„ć†…ćźč。 +æœŹæ•™çš‹ćŒæ ·ćŻä»„äœœäžșć°†æ„çš„ć‚è€ƒæ‰‹ć†ŒïŒŒæ‰€ä»„äœ ćŻä»„éšæ—¶ć›žćˆ°æœŹæ•™çš‹ćč¶æŸ„é˜…äœ éœ€èŠçš„ć†…ćźč。 ## èżèĄŒä»Łç  { #run-the-code } @@ -52,7 +52,7 @@ $ fastapi dev
-**ćŒș烈ć»șèźź**æ‚šćœšæœŹćœ°çŒ–ć†™æˆ–ć€ćˆ¶ä»Łç ïŒŒćŻčć…¶èż›èĄŒçŒ–èŸ‘ćč¶èżèĄŒă€‚ +**ćŒș烈ć»șèźź**äœ ćœšæœŹćœ°çŒ–ć†™æˆ–ć€ćˆ¶ä»Łç ïŒŒćŻčć…¶èż›èĄŒçŒ–èŸ‘ćč¶èżèĄŒă€‚ ćœšçŒ–èŸ‘ć™šäž­äœżç”š FastAPI äŒšçœŸæ­Łćœ°ć±•çŽ°ć‡șćźƒçš„äŒ˜ćŠżïŒšćȘéœ€èŠçŒ–ć†™ćŸˆć°‘çš„ä»Łç ïŒŒæ‰€æœ‰çš„ç±»ćž‹æŁ€æŸ„ïŒŒä»Łç èĄ„ć…šç­‰ç­‰ă€‚ @@ -60,9 +60,9 @@ $ fastapi dev ## ćź‰èŁ… FastAPI { #install-fastapi } -第侀äžȘæ­„éȘ€æ˜Żćź‰èŁ… FastAPI. +第侀äžȘæ­„éȘ€æ˜Żćź‰èŁ… FastAPI。 -èŻ·çĄźäżæ‚šćˆ›ć»șćč¶æż€æŽ»äž€äžȘ[è™šæ‹ŸçŽŻćąƒ](../virtual-environments.md)ïŒŒç„¶ćŽ**ćź‰èŁ… FastAPI** +èŻ·çĄźäżäœ ćˆ›ć»șćč¶æż€æŽ»äž€äžȘ[è™šæ‹ŸçŽŻćąƒ](../virtual-environments.md)ïŒŒç„¶ćŽ**ćź‰èŁ… FastAPI**
@@ -76,11 +76,11 @@ $ pip install "fastapi[standard]" /// note | æłšæ„ -ćœ“æ‚šäœżç”š `pip install "fastapi[standard]"` ćź‰èŁ…æ—¶ïŒŒćźƒäŒšé™„ćžŠäž€äș›é»˜èź€çš„ćŻé€‰æ ‡ć‡†äŸè”–éĄčïŒŒć…¶äž­ćŒ…æ‹Ź `fastapi-cloud-cli`ïŒŒćźƒćŻä»„èź©æ‚šéƒšçœČ戰 [FastAPI Cloud](https://fastapicloud.com)。 +ćœ“äœ äœżç”š `pip install "fastapi[standard]"` ćź‰èŁ…æ—¶ïŒŒćźƒäŒšé™„ćžŠäž€äș›é»˜èź€çš„ćŻé€‰æ ‡ć‡†äŸè”–éĄčïŒŒć…¶äž­ćŒ…æ‹Ź `fastapi-cloud-cli`ïŒŒćźƒćŻä»„èź©äœ éƒšçœČ戰 [FastAPI Cloud](https://fastapicloud.com)。 -ćŠ‚æžœæ‚šäžæƒłćź‰èŁ…èż™äș›ćŻé€‰äŸè”–ïŒŒćŻä»„é€‰æ‹©ćź‰èŁ… `pip install fastapi`。 +ćŠ‚æžœäœ äžæƒłćź‰èŁ…èż™äș›ćŻé€‰äŸè”–ïŒŒćŻä»„é€‰æ‹©ćź‰èŁ… `pip install fastapi`。 -ćŠ‚æžœæ‚šæƒłćź‰èŁ…æ ‡ć‡†äŸè”–äœ†äžćŒ…ć« `fastapi-cloud-cli`ïŒŒćŻä»„äœżç”š `pip install "fastapi[standard-no-fastapi-cloud-cli]"` ćź‰èŁ…ă€‚ +ćŠ‚æžœäœ æƒłćź‰èŁ…æ ‡ć‡†äŸè”–äœ†äžćŒ…ć« `fastapi-cloud-cli`ïŒŒćŻä»„äœżç”š `pip install "fastapi[standard-no-fastapi-cloud-cli]"` ćź‰èŁ…ă€‚ /// @@ -92,10 +92,10 @@ FastAPI 提䟛äș†äž€äžȘ[VS Code 柘æ–迉©ć±•](https://marketplace.visualstudio.c ## èż›é˜¶ç”šæˆ·æŒ‡ć— { #advanced-user-guide } -ćœšæœŹ**教皋-ç”šæˆ·æŒ‡ć—**äč‹ćŽïŒŒæ‚šćŻä»„é˜…èŻ»**èż›é˜¶ç”šæˆ·æŒ‡ć—**。 +ćœšæœŹ**教皋-ç”šæˆ·æŒ‡ć—**äč‹ćŽïŒŒäœ ćŻä»„é˜…èŻ»**èż›é˜¶ç”šæˆ·æŒ‡ć—**。 **èż›é˜¶ç”šæˆ·æŒ‡ć—**ä»„æœŹæ•™çš‹äžșćŸșçĄ€ïŒŒäœżç”šç›žćŒçš„æŠ‚ćż”ïŒŒćč¶æ•™æŽˆäž€äș›éąć€–çš„ç‰čæ€§ă€‚ -äœ†æ˜Żæ‚šćș”èŻ„ć…ˆé˜…èŻ»**教皋-ç”šæˆ·æŒ‡ć—**ïŒˆćłæ‚šçŽ°ćœšæ­Łćœšé˜…èŻ»çš„ć†…ćźčïŒ‰ă€‚ +äœ†æ˜Żäœ ćș”èŻ„ć…ˆé˜…èŻ»**教皋-ç”šæˆ·æŒ‡ć—**ïŒˆćłäœ çŽ°ćœšæ­Łćœšé˜…èŻ»çš„ć†…ćźčïŒ‰ă€‚ -æ•™çš‹ç»èż‡çČŸćżƒèźŸèźĄïŒŒäœżæ‚šćŻä»„ä»…é€šèż‡**教皋-ç”šæˆ·æŒ‡ć—**æ„ćŒ€ć‘äž€äžȘćźŒæ•Žçš„ćș”甚皋ćșïŒŒç„¶ćŽæ čæźæ‚šçš„éœ€èŠïŒŒäœżç”š**èż›é˜¶ç”šæˆ·æŒ‡ć—**侭的侀äș›ć…¶ä»–æŠ‚ćż”ïŒŒä»„äžćŒçš„æ–čćŒæ„æ‰©ć±•ćźƒă€‚ +æ•™çš‹ç»èż‡çČŸćżƒèźŸèźĄïŒŒäœżäœ ćŻä»„ä»…é€šèż‡**教皋-ç”šæˆ·æŒ‡ć—**æ„ćŒ€ć‘äž€äžȘćźŒæ•Žçš„ćș”甚皋ćșïŒŒç„¶ćŽæ čæźäœ çš„éœ€èŠïŒŒäœżç”š**èż›é˜¶ç”šæˆ·æŒ‡ć—**侭的侀äș›ć…¶ä»–æŠ‚ćż”ïŒŒä»„äžćŒçš„æ–čćŒæ„æ‰©ć±•ćźƒă€‚ diff --git a/docs/zh/docs/tutorial/metadata.md b/docs/zh/docs/tutorial/metadata.md index ba480637b..6518d096c 100644 --- a/docs/zh/docs/tutorial/metadata.md +++ b/docs/zh/docs/tutorial/metadata.md @@ -1,6 +1,6 @@ # ć…ƒæ•°æźć’Œæ–‡æĄŁ URL { #metadata-and-docs-urls } -äœ ćŻä»„ćœš FastAPI ćș”甚皋ćșäž­è‡Ș漚äč‰ć€šäžȘć…ƒæ•°æźé…çœźă€‚ +äœ ćŻä»„ćœš **FastAPI** ćș”甚皋ćșäž­è‡Ș漚äč‰ć€šäžȘć…ƒæ•°æźé…çœźă€‚ ## API ć…ƒæ•°æź { #metadata-for-api } @@ -11,7 +11,7 @@ | `title` | `str` | API çš„æ ‡éą˜ă€‚ | | `summary` | `str` | API çš„çź€çŸ­æ‘˜èŠă€‚ è‡Ș OpenAPI 3.1.0、FastAPI 0.99.0 è”·ćŻç”šă€‚ | | `description` | `str` | API çš„çź€çŸ­æèż°ă€‚ćŻä»„äœżç”š Markdown。 | -| `version` | `string` | API çš„ç‰ˆæœŹă€‚èż™æ˜Żæ‚šè‡Ș深的ćș”甚皋ćșçš„ç‰ˆæœŹïŒŒè€Œäžæ˜Ż OpenAPI çš„ç‰ˆæœŹă€‚äŸ‹ćŠ‚ `2.5.0`。 | +| `version` | `str` | API çš„ç‰ˆæœŹă€‚èż™æ˜Żäœ è‡Ș深的ćș”甚皋ćșçš„ç‰ˆæœŹïŒŒè€Œäžæ˜Ż OpenAPI çš„ç‰ˆæœŹă€‚äŸ‹ćŠ‚ `2.5.0`。 | | `terms_of_service` | `str` | API æœćŠĄæĄæŹŸçš„ URLă€‚ćŠ‚æžœæäŸ›ïŒŒćˆ™ćż…éĄ»æ˜Ż URL。 | | `contact` | `dict` | ć…ŹćŒ€çš„ API çš„è”çł»äżĄæŻă€‚ćźƒćŻä»„ćŒ…ć«ć€šäžȘć­—æź”ă€‚
contact ć­—æź”
ć‚æ•°ç±»ćž‹æèż°
namestrè”çł»äșș/ç»„ç»‡çš„èŻ†ćˆ«ćç§°ă€‚
urlstræŒ‡ć‘è”çł»äżĄæŻçš„ URL。濅饻采甚 URL æ ŒćŒă€‚
emailstrè”çł»äșș/ç»„ç»‡çš„ç””ć­é‚źä»¶ćœ°ć€ă€‚ćż…éĄ»é‡‡ç”šç””ć­é‚źä»¶ćœ°ć€çš„æ ŒćŒă€‚
| | `license_info` | `dict` | ć…ŹćŒ€çš„ API çš„èźžćŻèŻäżĄæŻă€‚ćźƒćŻä»„ćŒ…ć«ć€šäžȘć­—æź”ă€‚
license_info ć­—æź”
ć‚æ•°ç±»ćž‹æèż°
namestrćż…éĄ»ïŒˆćŠ‚æžœèźŸçœźäș† license_infoïŒ‰ă€‚ç”šäșŽ API çš„èźžćŻèŻćç§°ă€‚
identifierstrAPI 的 [SPDX](https://spdx.org/licenses/) èźžćŻèŻèĄšèŸŸćŒă€‚ć­—æź” identifier äžŽć­—æź” url äș’æ–„。è‡Ș OpenAPI 3.1.0、FastAPI 0.99.0 è”·ćŻç”šă€‚
urlstr甹äșŽ API çš„èźžćŻèŻçš„ URL。濅饻采甚 URL æ ŒćŒă€‚
| @@ -46,11 +46,11 @@ æŻäžȘć­—ć…žćŻä»„ćŒ…ć«ïŒš -- `name`ïŒˆćż…ćĄ«ïŒ‰ïŒšäž€äžȘ `str`ïŒŒäžŽćœšäœ çš„*è·ŻćŸ„æ“äœœ*撌 `APIRouter` 的 `tags` ć‚æ•°äž­äœżç”šçš„æ ‡ç­Ÿćç›žćŒă€‚ -- `description`䞀äžȘ `str`ïŒŒèŻ„æ ‡ç­Ÿçš„çź€çŸ­æèż°ă€‚ćŻä»„äœżç”š Markdownćč¶äŒšæ˜Ÿç€șćœšæ–‡æĄŁ UI 侭。 -- `externalDocs`䞀äžȘ `dict`ïŒŒæèż°ć€–éƒšæ–‡æĄŁïŒŒćŒ…ć«ïŒš - - `description`䞀äžȘ `str`ïŒŒèŻ„ć€–éƒšæ–‡æĄŁçš„çź€çŸ­æèż°ă€‚ - - `url`ïŒˆćż…ćĄ«ïŒ‰ïŒšäž€äžȘ `str`ïŒŒèŻ„ć€–éƒšæ–‡æĄŁçš„ URL。 +* `name`**濅楫**䞀äžȘ `str`ïŒŒäžŽćœšäœ çš„*è·ŻćŸ„æ“äœœ*撌 `APIRouter` 的 `tags` ć‚æ•°äž­äœżç”šçš„æ ‡ç­Ÿćç›žćŒă€‚ +* `description`䞀äžȘ `str`ïŒŒèŻ„æ ‡ç­Ÿçš„çź€çŸ­æèż°ă€‚ćŻä»„äœżç”š Markdownćč¶äŒšæ˜Ÿç€șćœšæ–‡æĄŁ UI 侭。 +* `externalDocs`䞀äžȘ `dict`ïŒŒæèż°ć€–éƒšæ–‡æĄŁïŒŒćŒ…ć«ïŒš + * `description`䞀äžȘ `str`ïŒŒèŻ„ć€–éƒšæ–‡æĄŁçš„çź€çŸ­æèż°ă€‚ + * `url`**濅楫**䞀äžȘ `str`ïŒŒèŻ„ć€–éƒšæ–‡æĄŁçš„ URL。 ### 戛ć»șæ ‡ç­Ÿć…ƒæ•°æź { #create-metadata-for-tags } @@ -108,12 +108,12 @@ äœ ćŻä»„é…çœźäž€äžȘæ–‡æĄŁç”šæˆ·ç•ŒéąïŒŒćŒ…æ‹ŹïŒš -- **Swagger UI**ïŒšæœćŠĄäșŽ `/docs`。 - - ćŻä»„äœżç”šć‚æ•° `docs_url` èźŸçœźćźƒçš„ URL。 - - ćŻä»„é€šèż‡èźŸçœź `docs_url=None` 穁甹漃。 -- **ReDoc**ïŒšæœćŠĄäșŽ `/redoc`。 - - ćŻä»„äœżç”šć‚æ•° `redoc_url` èźŸçœźćźƒçš„ URL。 - - ćŻä»„é€šèż‡èźŸçœź `redoc_url=None` 穁甹漃。 +* **Swagger UI**ïŒšæœćŠĄäșŽ `/docs`。 + * ćŻä»„äœżç”šć‚æ•° `docs_url` èźŸçœźćźƒçš„ URL。 + * ćŻä»„é€šèż‡èźŸçœź `docs_url=None` 穁甹漃。 +* **ReDoc**ïŒšæœćŠĄäșŽ `/redoc`。 + * ćŻä»„äœżç”šć‚æ•° `redoc_url` èźŸçœźćźƒçš„ URL。 + * ćŻä»„é€šèż‡èźŸçœź `redoc_url=None` 穁甹漃。 äŸ‹ćŠ‚ïŒŒèźŸçœź Swagger UI æœćŠĄäșŽ `/documentation` ćč¶çŠç”š ReDoc diff --git a/docs/zh/docs/tutorial/path-operation-configuration.md b/docs/zh/docs/tutorial/path-operation-configuration.md index b813e38f8..f1aae0bc2 100644 --- a/docs/zh/docs/tutorial/path-operation-configuration.md +++ b/docs/zh/docs/tutorial/path-operation-configuration.md @@ -1,5 +1,6 @@ # è·ŻćŸ„æ“äœœé…çœź { #path-operation-configuration } + *è·ŻćŸ„æ“äœœèŁ…é„°ć™š*æ”ŻæŒć€šç§é…çœźć‚æ•°ă€‚ /// warning | è­Šć‘Š diff --git a/docs/zh/docs/tutorial/query-params-str-validations.md b/docs/zh/docs/tutorial/query-params-str-validations.md index 05cefc6e2..0164c27e6 100644 --- a/docs/zh/docs/tutorial/query-params-str-validations.md +++ b/docs/zh/docs/tutorial/query-params-str-validations.md @@ -1,5 +1,6 @@ # æŸ„èŻąć‚æ•°ć’Œć­—çŹŠäžČæ ĄéȘŒ { #query-parameters-and-string-validations } + **FastAPI** ć…èźžäœ äžșć‚æ•°ćŁ°æ˜Žéąć€–çš„äżĄæŻć’Œæ ĄéȘŒă€‚ èź©æˆ‘ä»Źä»„äž‹éąçš„ćș”甚äžș䟋 diff --git a/docs/zh/docs/tutorial/query-params.md b/docs/zh/docs/tutorial/query-params.md index c9cb2d26e..971dbb0ed 100644 --- a/docs/zh/docs/tutorial/query-params.md +++ b/docs/zh/docs/tutorial/query-params.md @@ -1,5 +1,6 @@ # æŸ„èŻąć‚æ•° { #query-parameters } + ćŁ°æ˜Žçš„ć‚æ•°äžæ˜Żè·ŻćŸ„ć‚æ•°æ—¶ïŒŒè·ŻćŸ„æ“äœœć‡œæ•°äŒšæŠŠèŻ„ć‚æ•°è‡ȘćŠšè§Łé‡Šäžșâ€œæŸ„èŻąâ€ć‚æ•°ă€‚ {* ../../docs_src/query_params/tutorial001_py310.py hl[9] *} diff --git a/docs/zh/docs/tutorial/request-files.md b/docs/zh/docs/tutorial/request-files.md index 102d42215..38c089ff3 100644 --- a/docs/zh/docs/tutorial/request-files.md +++ b/docs/zh/docs/tutorial/request-files.md @@ -147,7 +147,7 @@ HTML èĄšć•ïŒˆ`
`ïŒ‰ć‘æœćŠĄć™šć‘é€æ•°æźçš„æ–čćŒé€šćžžäŒšćŻč数 ## ć€šæ–‡ä»¶äžŠäŒ  { #multiple-file-uploads } -FastAPI æ”ŻæŒćŒæ—¶äžŠäŒ ć€šäžȘæ–‡ä»¶ă€‚ +ćŻä»„ćŒæ—¶äžŠäŒ ć€šäžȘæ–‡ä»¶ă€‚ ćźƒä»ŹäŒšèą«ć…łè”ćˆ°ćŒäž€äžȘé€šèż‡ă€ŒèĄšć•æ•°æźă€ć‘é€çš„ă€ŒèĄšć•ć­—æź”ă€ă€‚ diff --git a/docs/zh/docs/tutorial/request-forms.md b/docs/zh/docs/tutorial/request-forms.md index 3d305779f..0e7f19c70 100644 --- a/docs/zh/docs/tutorial/request-forms.md +++ b/docs/zh/docs/tutorial/request-forms.md @@ -2,7 +2,7 @@ ćœ“äœ éœ€èŠæŽ„æ”¶èĄšć•ć­—æź”è€Œäžæ˜Ż JSON æ—¶ïŒŒćŻä»„äœżç”š `Form`。 -/// note +/// note | æłšæ„ èŠäœżç”šèĄšć•ïŒŒéŠ–ć…ˆćź‰èŁ… [`python-multipart`](https://github.com/Kludex/python-multipart)。 @@ -32,13 +32,13 @@ $ pip install python-multipart äœżç”š `Form` ćŻä»„ćƒäœżç”š `Body`ïŒˆä»„ćŠ `Query`、`Path`、`Cookie`ïŒ‰äž€æ ·ćŁ°æ˜Žç›žćŒçš„é…çœźïŒŒćŒ…æ‹Źæ ĄéȘŒă€ç€șäŸ‹ă€ćˆ«ćïŒˆäŸ‹ćŠ‚ć°† `username` ć†™æˆ `user-name`ïŒ‰ç­‰ă€‚ -/// note +/// note | æłšæ„ `Form` æ˜Żç›ŽæŽ„ç»§æ‰żè‡Ș `Body` 的类。 /// -/// tip +/// tip | 提ç€ș èŠćŁ°æ˜ŽèĄšć•èŻ·æ±‚äœ“ïŒŒćż…éĄ»æ˜ŸćŒäœżç”š `Form`ïŒŒćŠćˆ™èż™äș›ć‚æ•°äŒšèą«ćœ“äœœæŸ„èŻąć‚æ•°æˆ–èŻ·æ±‚äœ“ïŒˆJSONïŒ‰ć‚æ•°ă€‚ @@ -60,9 +60,9 @@ HTML èĄšć•ïŒˆ`
`ïŒ‰ć‘æœćŠĄć™šć‘é€æ•°æźæ—¶é€šćžžäŒšćŻčæ•°æźäœż /// -/// warning +/// warning | è­Šć‘Š -äœ ćŻä»„ćœšäž€äžȘè·ŻćŸ„æ“äœœäž­ćŁ°æ˜Žć€šäžȘ `Form` ć‚æ•°ïŒŒäœ†äžèƒœćŒæ—¶ć†ćŁ°æ˜ŽèŠæŽ„æ”¶äžș JSON 的 `Body` ć­—æź”ïŒŒć› äžșæ­€æ—¶èŻ·æ±‚äœ“äŒšäœżç”š `application/x-www-form-urlencoded` è€Œäžæ˜Ż `application/json` èż›èĄŒçŒ–ç ă€‚ +äœ ćŻä»„ćœšäž€äžȘ*è·ŻćŸ„æ“äœœ*äž­ćŁ°æ˜Žć€šäžȘ `Form` ć‚æ•°ïŒŒäœ†äžèƒœćŒæ—¶ć†ćŁ°æ˜ŽèŠæŽ„æ”¶äžș JSON 的 `Body` ć­—æź”ïŒŒć› äžșæ­€æ—¶èŻ·æ±‚äœ“äŒšäœżç”š `application/x-www-form-urlencoded` è€Œäžæ˜Ż `application/json` èż›èĄŒçŒ–ç ă€‚ èż™äžæ˜Ż **FastAPI** çš„é™ćˆ¶ïŒŒè€Œæ˜Ż HTTP ćèźźçš„äž€éƒšćˆ†ă€‚ diff --git a/docs/zh/docs/tutorial/response-status-code.md b/docs/zh/docs/tutorial/response-status-code.md index 411ece71c..c06e67e6f 100644 --- a/docs/zh/docs/tutorial/response-status-code.md +++ b/docs/zh/docs/tutorial/response-status-code.md @@ -6,7 +6,7 @@ * `@app.post()` * `@app.put()` * `@app.delete()` -* 等... +* 等。 {* ../../docs_src/response_status_code/tutorial001_py310.py hl[6] *} @@ -27,13 +27,13 @@ ćźƒćŻä»„ïŒš * 朹操ćș”äž­èż”ć›žçŠ¶æ€ç  -* 朹 OpenAPI æŠ‚ć›ŸïŒˆćŠç”šæˆ·ç•ŒéąïŒ‰äž­ć­˜æĄŁïŒš +* 朹 OpenAPI schemaïŒˆä»„ćŠç”šæˆ·ç•ŒéąïŒ‰äž­ć°†ć…¶èź°ćœ•äžșèŻ„çŠ¶æ€ç ïŒš /// note | æłšæ„ -某äș›ć“ćș”çŠ¶æ€ç èĄšç€ș操ćș”æČĄæœ‰ć“ćș”äœ“ïŒˆć‚é˜…äž‹äž€ç« ïŒ‰ă€‚ +某äș›ć“ćș”çŠ¶æ€ç èĄšç€ș操ćș”æČĄæœ‰ć“ćș”äœ“ïŒˆć‚é˜…äž‹äž€èŠ‚ïŒ‰ă€‚ FastAPI ćŻä»„èż›èĄŒèŻ†ćˆ«ïŒŒćč¶ç”ŸæˆèĄšæ˜Žæ— ć“ćș”䜓的 OpenAPI æ–‡æĄŁă€‚ @@ -43,7 +43,7 @@ FastAPI ćŻä»„èż›èĄŒèŻ†ćˆ«ïŒŒćč¶ç”ŸæˆèĄšæ˜Žæ— ć“ćș”䜓的 OpenAPI æ–‡æĄŁă€‚ /// note | æłšæ„ -ćŠ‚æžœć·Č经äș†è§Ł HTTP çŠ¶æ€ç ïŒŒèŻ·è·łćˆ°äž‹äž€ç« ă€‚ +ćŠ‚æžœć·Č经äș†è§Ł HTTP çŠ¶æ€ç ïŒŒèŻ·è·łćˆ°äž‹äž€èŠ‚ă€‚ /// diff --git a/docs/zh/docs/tutorial/schema-extra-example.md b/docs/zh/docs/tutorial/schema-extra-example.md index 2ea590c86..b18e69641 100644 --- a/docs/zh/docs/tutorial/schema-extra-example.md +++ b/docs/zh/docs/tutorial/schema-extra-example.md @@ -10,7 +10,7 @@ {* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *} -èż™äș›éąć€–äżĄæŻäŒšćŽŸæ ·æ·»ćŠ ćˆ°èŻ„æšĄćž‹èŸ“ć‡ș的 JSON Schema 䞭ćč¶äŒšćœš API æ–‡æĄŁäž­äœżç”šă€‚ +èż™äș›éąć€–äżĄæŻäŒšćŽŸæ ·æ·»ćŠ ćˆ°èŻ„æšĄćž‹èŸ“ć‡ș的 **JSON Schema** 䞭ćč¶äŒšćœš API æ–‡æĄŁäž­äœżç”šă€‚ äœ ćŻä»„äœżç”šć±žæ€§ `model_config`ïŒŒćźƒæŽ„æ”¶äž€äžȘ `dict`ïŒŒèŻŠè§ [Pydantic æ–‡æĄŁïŒšé…çœź](https://docs.pydantic.dev/latest/api/config/)。 @@ -26,7 +26,7 @@ /// note | æłšæ„ -OpenAPI 3.1.0è‡Ș FastAPI 0.99.0 è”·äœżç”šïŒ‰ćąžćŠ äș†ćŻč `examples` çš„æ”ŻæŒïŒŒćźƒæ˜Ż JSON Schema æ ‡ć‡†çš„äž€éƒšćˆ†ă€‚ +OpenAPI 3.1.0è‡Ș FastAPI 0.99.0 è”·äœżç”šïŒ‰ćąžćŠ äș†ćŻč `examples` çš„æ”ŻæŒïŒŒćźƒæ˜Ż **JSON Schema** æ ‡ć‡†çš„äž€éƒšćˆ†ă€‚ ćœšæ­€äč‹ć‰ïŒŒćȘæ”ŻæŒäœżç”šć•äžȘç€șäŸ‹çš„ć…łé”źć­— `example`。OpenAPI 3.1.0 ä»ç„¶æ”ŻæŒćźƒïŒŒäœ†ćźƒć·Čèą«ćŒƒç”šïŒŒćč¶äžć±žäșŽ JSON Schema æ ‡ć‡†ă€‚ć› æ­€ïŒŒć»șèźźäœ æŠŠ `example` èżç§»ćˆ° `examples`ă€‚đŸ€“ @@ -52,7 +52,7 @@ OpenAPI 3.1.0è‡Ș FastAPI 0.99.0 è”·äœżç”šïŒ‰ćąžćŠ äș†ćŻč `examples` çš„æ”ŻæŒ - `Form()` - `File()` -䜠äčŸćŻä»„ćŁ°æ˜Žäž€ç»„ `examples`ïŒŒèż™äș›ćžŠæœ‰é™„ćŠ äżĄæŻçš„ç€șäŸ‹ć°†èą«æ·»ćŠ ćˆ°ćźƒä»Źćœš OpenAPI 侭的 JSON Schema 里。 +䜠äčŸćŻä»„ćŁ°æ˜Žäž€ç»„ `examples`ïŒŒèż™äș›ćžŠæœ‰é™„ćŠ äżĄæŻçš„ç€șäŸ‹ć°†èą«æ·»ćŠ ćˆ°ćźƒä»Źćœš **OpenAPI** 侭的 **JSON Schema** 里。 ### ćžŠæœ‰ `examples` 的 `Body` { #body-with-examples } @@ -72,21 +72,21 @@ OpenAPI 3.1.0è‡Ș FastAPI 0.99.0 è”·äœżç”šïŒ‰ćąžćŠ äș†ćŻč `examples` çš„æ”ŻæŒ {* ../../docs_src/schema_extra_example/tutorial004_an_py310.py hl[23:38] *} -èż™æ ·ćšæ—¶ïŒŒèż™äș›ç€ș䟋䌚成äžșèŻ„èŻ·æ±‚äœ“æ•°æźć†…éƒš JSON Schema 的侀郹戆。 +èż™æ ·ćšæ—¶ïŒŒèż™äș›ç€ș䟋䌚成äžșèŻ„èŻ·æ±‚äœ“æ•°æźć†…éƒš **JSON Schema** 的侀郹戆。 -äžèż‡ïŒŒćœšæ’°ć†™æœŹæ–‡æ—¶ïŒŒç”šäșŽć±•ç€șæ–‡æĄŁ UI 的 Swagger UI ćč¶äžæ”ŻæŒæ˜Ÿç€ș JSON Schema äž­æ•°æźçš„ć€šäžȘç€șäŸ‹ă€‚äœ†èŻ·ç»§ç»­é˜…èŻ»ïŒŒäž‹éąæœ‰äž€ç§ć˜é€šæ–čæł•。 +äžèż‡ïŒŒćœšæ’°ć†™æœŹæ–‡æ—¶ïŒŒç”šäșŽć±•ç€șæ–‡æĄŁ UI 的 Swagger UI ćč¶äžæ”ŻæŒæ˜Ÿç€ș **JSON Schema** äž­æ•°æźçš„ć€šäžȘç€șäŸ‹ă€‚äœ†èŻ·ç»§ç»­é˜…èŻ»ïŒŒäž‹éąæœ‰äž€ç§ć˜é€šæ–čæł•。 ### OpenAPI ç‰č漚的 `examples` { #openapi-specific-examples } -朹 JSON Schema æ”ŻæŒ `examples` äč‹ć‰ïŒŒOpenAPI ć°±ć·Čæ”ŻæŒäž€äžȘćŒćäœ†äžćŒçš„ć­—æź” `examples`。 +朹 **JSON Schema** æ”ŻæŒ `examples` äč‹ć‰ïŒŒOpenAPI ć°±ć·Čæ”ŻæŒäž€äžȘćŒćäœ†äžćŒçš„ć­—æź” `examples`。 -èż™äžȘ靱搑 OpenAPI 的 `examples` 䜍äșŽ OpenAPI è§„èŒƒçš„ćŠäž€ć€„ă€‚ćźƒæ”ŸćœšæŻäžȘè·ŻćŸ„æ“äœœçš„èŻŠç»†äżĄæŻäž­ïŒŒè€Œäžæ˜ŻæŻäžȘ JSON Schema 里。 +èż™äžȘ **OpenAPI ç‰č漚的** `examples` 䜍äșŽ OpenAPI è§„èŒƒçš„ćŠäž€ć€„ă€‚ćźƒæ”Ÿćœš**æŻäžȘ*è·ŻćŸ„æ“äœœ*çš„èŻŠç»†äżĄæŻ**äž­ïŒŒè€Œäžæ˜ŻæŻäžȘ JSON Schema 里。 -而 Swagger UI æ—©ć°±æ”ŻæŒèż™äžȘç‰č漚的 `examples` ć­—æź”ă€‚ć› æ­€ïŒŒäœ ćŻä»„ç”šćźƒćœšæ–‡æĄŁ UI 䞭汕ç€ș侍搌的ç€șäŸ‹ă€‚ +而 Swagger UI æ—©ć°±æ”ŻæŒèż™äžȘç‰č漚的 `examples` ć­—æź”ă€‚ć› æ­€ïŒŒäœ ćŻä»„ç”šćźƒćœšæ–‡æĄŁ UI äž­**汕ç€ș**侍搌的**ç€ș䟋**。 -èż™äžȘ OpenAPI ç‰čćźšć­—æź” `examples` çš„ç»“æž„æ˜Żäž€äžȘćŒ…ć«ć€šäžȘç€ș䟋的 `dict`ïŒˆè€Œäžæ˜Żäž€äžȘ `list`ïŒ‰ïŒŒæŻäžȘç€șäŸ‹éƒœćŒ…ć«äŒšèą«æ·»ćŠ ćˆ° OpenAPI çš„éąć€–äżĄæŻă€‚ +èż™äžȘ OpenAPI ç‰čćźšć­—æź” `examples` çš„ç»“æž„æ˜Żäž€äžȘćŒ…ć«**〚äžȘç€ș䟋**的 `dict`ïŒˆè€Œäžæ˜Żäž€äžȘ `list`ïŒ‰ïŒŒæŻäžȘç€șäŸ‹éƒœćŒ…ć«äŒšèą«æ·»ćŠ ćˆ° **OpenAPI** çš„éąć€–äżĄæŻă€‚ -èż™äžæ”Ÿćœš OpenAPI ć†…éƒšćŒ…ć«çš„ć„äžȘ JSON Schema é‡ŒïŒŒè€Œæ˜Żç›ŽæŽ„æ”Ÿćœšè·ŻćŸ„æ“äœœäžŠă€‚ +èż™äžæ”Ÿćœš OpenAPI ć†…éƒšćŒ…ć«çš„ć„äžȘ JSON Schema é‡ŒïŒŒè€Œæ˜Żç›ŽæŽ„æ”Ÿćœš*è·ŻćŸ„æ“äœœ*侊。 ### äœżç”š `openapi_examples` ć‚æ•° { #using-the-openapi-examples-parameter } @@ -123,23 +123,23 @@ OpenAPI 3.1.0è‡Ș FastAPI 0.99.0 è”·äœżç”šïŒ‰ćąžćŠ äș†ćŻč `examples` çš„æ”ŻæŒ /// tip | 提ç€ș -ćŠ‚æžœäœ ć·Čç»ćœšäœżç”š FastAPI ç‰ˆæœŹ 0.99.0 æˆ–æ›Žé«˜ç‰ˆæœŹïŒŒäœ ć€§æŠ‚çŽ‡ćŻä»„è·łèż‡èż™äș›ç»†èŠ‚ă€‚ +ćŠ‚æžœäœ ć·Čç»ćœšäœżç”š **FastAPI** ç‰ˆæœŹ **0.99.0 æˆ–æ›Žé«˜ç‰ˆæœŹ**ïŒŒäœ ć€§æŠ‚çŽ‡ćŻä»„**è·łèż‡**èż™äș›ç»†èŠ‚ă€‚ 柃仏ćŻčæ›Žæ—©ç‰ˆæœŹïŒˆOpenAPI 3.1.0 氚侍揯甹äč‹ć‰ïŒ‰æ›Žç›žć…łă€‚ -äœ ćŻä»„æŠŠèż™ćœ“äœœäž€ć ‚çź€çŸ­çš„ OpenAPI 撌 JSON Schema 掆ćČèŻŸă€‚đŸ€“ +äœ ćŻä»„æŠŠèż™ćœ“äœœäž€ć ‚çź€çŸ­çš„ OpenAPI 撌 JSON Schema **掆ćČèŻŸ**ă€‚đŸ€“ /// /// warning | è­Šć‘Š -ä»„äž‹æ˜Żć…łäșŽ JSON Schema 撌 OpenAPI æ ‡ć‡†çš„éžćžžæŠ€æœŻæ€§çš„ç»†èŠ‚ă€‚ +ä»„äž‹æ˜Żć…łäșŽ **JSON Schema** 撌 **OpenAPI** æ ‡ć‡†çš„éžćžžæŠ€æœŻæ€§çš„ç»†èŠ‚ă€‚ ćŠ‚æžœäžŠéąçš„æ€è·ŻćŻč䜠ć·Čç»è¶łć€ŸćŻç”šïŒŒäœ ćŻèƒœäžéœ€èŠèż™äș›ç»†èŠ‚ïŒŒćŻä»„ç›ŽæŽ„è·łèż‡ă€‚ /// -朹 OpenAPI 3.1.0 äč‹ć‰ïŒŒOpenAPI äœżç”šçš„æ˜Żäž€äžȘæ›Žæ—§äž”ç»èż‡äżźæ”č的 JSON Schema ç‰ˆæœŹă€‚ +朹 OpenAPI 3.1.0 äč‹ć‰ïŒŒOpenAPI äœżç”šçš„æ˜Żäž€äžȘæ›Žæ—§äž”ç»èż‡äżźæ”č的 **JSON Schema** ç‰ˆæœŹă€‚ ćœ“æ—¶ JSON Schema æČĄæœ‰ `examples`所仄 OpenAPI 朹漃俼æ”čèż‡çš„ç‰ˆæœŹäž­æ·»ćŠ äș†è‡Ș深的 `example` ć­—æź”ă€‚ @@ -169,7 +169,7 @@ OpenAPI èż˜ćœšè§„èŒƒçš„ć…¶ä»–éƒšćˆ†æ·»ćŠ äș† `example` 撌 `examples` ć­—æź”ïŒš çŽ°ćœšïŒŒèż™äžȘ新的 `examples` ć­—æź”äŒ˜ć…ˆäșŽæ—§çš„ć•äžȘ䞔è‡Ș漚äč‰çš„`example` ć­—æź”ïŒŒćŽè€…ć·Čèą«ćŒƒç”šă€‚ -JSON Schema äž­èż™äžȘ新的 `examples` ć­—æź”ćȘæ˜Żäž€äžȘ由ç€ș䟋组成的 `list`ïŒŒè€Œäžæ˜ŻćƒäžŠéąæćˆ°çš„ OpenAPI ć…¶ä»–äœçœźé‚Łæ ·ćžŠæœ‰éąć€–ć…ƒæ•°æźçš„ `dict`。 +朹 JSON Schema äž­ïŒŒèż™äžȘ新的 `examples` ć­—æź”**ćȘæ˜Żäž€äžȘ由ç€ș䟋组成的 `list`**ïŒŒè€Œäžæ˜ŻćƒäžŠéąæćˆ°çš„ OpenAPI ć…¶ä»–äœçœźé‚Łæ ·ćžŠæœ‰éąć€–ć…ƒæ•°æźçš„ `dict`。 /// note | æłšæ„ @@ -181,22 +181,22 @@ JSON Schema äž­èż™äžȘ新的 `examples` ć­—æź”ćȘæ˜Żäž€äžȘ由ç€ș䟋组成的 `lis ### Pydantic 侎 FastAPI 的 `examples` { #pydantic-and-fastapi-examples } -ćœ“äœ ćœš Pydantic æšĄćž‹äž­æ·»ćŠ  `examples`ïŒŒé€šèż‡ `schema_extra` 或 `Field(examples=["something"])`ïŒŒèż™äș›ç€șäŸ‹äŒšèą«æ·»ćŠ ćˆ°èŻ„ Pydantic æšĄćž‹çš„ JSON Schema 侭。 +ćœ“äœ ćœš Pydantic æšĄćž‹äž­æ·»ćŠ  `examples`ïŒŒé€šèż‡ `schema_extra` 或 `Field(examples=["something"])`ïŒŒèż™äș›ç€șäŸ‹äŒšèą«æ·»ćŠ ćˆ°èŻ„ Pydantic æšĄćž‹çš„ **JSON Schema** 侭。 -èż™äžȘ Pydantic æšĄćž‹çš„ JSON Schema äŒšèą«ćŒ…ć«ćˆ°äœ çš„ API 的 OpenAPI äž­ïŒŒç„¶ćŽćœšæ–‡æĄŁ UI äž­äœżç”šă€‚ +èż™äžȘ Pydantic æšĄćž‹çš„ **JSON Schema** äŒšèą«ćŒ…ć«ćˆ°äœ çš„ API 的 **OpenAPI** äž­ïŒŒç„¶ćŽćœšæ–‡æĄŁ UI äž­äœżç”šă€‚ -朹 FastAPI 0.99.0 äč‹ć‰çš„ç‰ˆæœŹïŒˆ0.99.0 ćŠä»„äžŠäœżç”šæ›Žæ–°çš„ OpenAPI 3.1.0ïŒ‰ïŒŒćœ“äœ ćœšć…¶ä»–ć·„ć…·ïŒˆ`Query()`、`Body()` ç­‰ïŒ‰äž­äœżç”š `example` 或 `examples` æ—¶ïŒŒèż™äș›ç€șäŸ‹äžäŒšèą«æ·»ćŠ ćˆ°æèż°èŻ„æ•°æźçš„ JSON Schema äž­ïŒˆç”šè‡łäžäŒšæ·»ćŠ ćˆ° OpenAPI è‡Ș深的 JSON Schema ç‰ˆæœŹäž­ïŒ‰ïŒŒè€Œæ˜ŻäŒšç›ŽæŽ„æ·»ćŠ ćˆ° OpenAPI çš„è·ŻćŸ„æ“äœœćŁ°æ˜Žäž­ïŒˆćœš OpenAPI äœżç”š JSON Schema 的郹戆äč‹ć€–ïŒ‰ă€‚ +朹 FastAPI 0.99.0 äč‹ć‰çš„ç‰ˆæœŹïŒˆ0.99.0 ćŠä»„äžŠäœżç”šæ›Žæ–°çš„ OpenAPI 3.1.0ïŒ‰ïŒŒćœ“äœ ćœšć…¶ä»–ć·„ć…·ïŒˆ`Query()`、`Body()` ç­‰ïŒ‰äž­äœżç”š `example` 或 `examples` æ—¶ïŒŒèż™äș›ç€șäŸ‹äžäŒšèą«æ·»ćŠ ćˆ°æèż°èŻ„æ•°æźçš„ JSON Schema äž­ïŒˆç”šè‡łäžäŒšæ·»ćŠ ćˆ° OpenAPI è‡Ș深的 JSON Schema ç‰ˆæœŹäž­ïŒ‰ïŒŒè€Œæ˜ŻäŒšç›ŽæŽ„æ·»ćŠ ćˆ° OpenAPI 的*è·ŻćŸ„æ“äœœ*ćŁ°æ˜Žäž­ïŒˆćœš OpenAPI äœżç”š JSON Schema 的郹戆äč‹ć€–ïŒ‰ă€‚ äœ†çŽ°ćœš FastAPI 0.99.0 ćŠä»„äžŠäœżç”š OpenAPI 3.1.0ïŒˆć…¶äœżç”š JSON Schema 2020-12ïŒ‰ä»„ćŠ Swagger UI 5.0.0 ćŠä»„äžŠćŽïŒŒäž€ćˆ‡æ›ŽćŠ äž€è‡ŽïŒŒç€șäŸ‹äŒšćŒ…ć«ćœš JSON Schema 侭。 ### Swagger UI 侎 OpenAPI ç‰č漚的 `examples` { #swagger-ui-and-openapi-specific-examples } -æ­€ć‰ïŒŒç”±äșŽ Swagger UI äžæ”ŻæŒć€šäžȘ JSON Schema ç€ș䟋æˆȘè‡ł 2023-08-26ïŒ‰ïŒŒç”šæˆ·æ— æł•ćœšæ–‡æĄŁäž­ć±•ç€ș〚äžȘç€șäŸ‹ă€‚ +由äșŽæˆȘè‡ł 2023-08-26Swagger UI äžæ”ŻæŒć€šäžȘ JSON Schema ç€șäŸ‹ïŒŒç”šæˆ·æ— æł•ćœšæ–‡æĄŁäž­ć±•ç€ș〚äžȘç€șäŸ‹ă€‚ -äžșäș†è§Łć†łèż™äžȘé—źéą˜ïŒŒFastAPI `0.103.0` é€šèż‡æ–°ćąžć‚æ•° `openapi_examples`äžșćŁ°æ˜ŽćŒæ ·çš„æ—§ćŒ OpenAPI ç‰č漚 `examples` ć­—æź”æäŸ›äș†æ”ŻæŒă€‚đŸ€“ +äžșäș†è§Łć†łèż™äžȘé—źéą˜ïŒŒFastAPI `0.103.0` **汞抠äș†æ”ŻæŒ**ïŒŒćŻä»„é€šèż‡æ–°ć‚æ•° `openapi_examples` ćŁ°æ˜ŽćŒæ ·çš„æ—§ćŒ **OpenAPI ç‰č漚的** `examples` ć­—æź”ă€‚đŸ€“ ### 总结 { #summary } -æˆ‘æ›Ÿç»èŻŽæˆ‘äžć€Șć–œæŹąćŽ†ćČâ€Šâ€Šç»“æžœçŽ°ćœšćœšèż™ć„żäžŠâ€œæŠ€æœŻćČâ€èŻŸă€‚đŸ˜… +æˆ‘æ›Ÿç»èŻŽæˆ‘äžć€Șć–œæŹąćŽ†ćČ... ç»“æžœçŽ°ćœšćœšèż™ć„żäžŠâ€œæŠ€æœŻćČâ€èŻŸă€‚đŸ˜… -çź€è€Œèš€äč‹ïŒŒć‡çș§ćˆ° FastAPI 0.99.0 æˆ–æ›Žé«˜ç‰ˆæœŹïŒŒäž€ćˆ‡äŒšæ›Žçź€ć•ă€äž€è‡Žă€ç›Žè§‚ïŒŒäœ äčŸäžćż…äș†è§Łèż™äș›ćކćČç»†èŠ‚ă€‚đŸ˜Ž +çź€è€Œèš€äč‹ïŒŒ**捇çș§ćˆ° FastAPI 0.99.0 æˆ–æ›Žé«˜ç‰ˆæœŹ**ïŒŒäž€ćˆ‡äŒšæ›Ž**çź€ć•ă€äž€è‡Žă€ç›Žè§‚**䜠äčŸäžćż…äș†è§Łèż™äș›ćކćČç»†èŠ‚ă€‚đŸ˜Ž diff --git a/docs/zh/docs/tutorial/security/first-steps.md b/docs/zh/docs/tutorial/security/first-steps.md index e274d513a..ca3ef8352 100644 --- a/docs/zh/docs/tutorial/security/first-steps.md +++ b/docs/zh/docs/tutorial/security/first-steps.md @@ -1,5 +1,6 @@ # 漉慹 - çŹŹäž€æ­„ { #security-first-steps } + ć‡èźŸäœ çš„**搎端** API 䜍äșŽæŸäžȘ柟損例。 而**ć‰ç«Ż**朹揩侀äžȘćŸŸćïŒŒæˆ–ćŒäž€ćŸŸćçš„äžćŒè·ŻćŸ„ïŒˆæˆ–ćœšç§»ćŠšćș”ç”šäž­ïŒ‰ă€‚ diff --git a/docs/zh/docs/tutorial/security/get-current-user.md b/docs/zh/docs/tutorial/security/get-current-user.md index e8a1de9d5..dc8c70014 100644 --- a/docs/zh/docs/tutorial/security/get-current-user.md +++ b/docs/zh/docs/tutorial/security/get-current-user.md @@ -8,14 +8,13 @@ æŽ„äž‹æ„ïŒŒæˆ‘ä»Źć­Šäč ćŠ‚äœ•èż”ć›žćœ“ć‰ç”šæˆ·ă€‚ - ## 戛ć»șç”šæˆ·æšĄćž‹ { #create-a-user-model } éŠ–ć…ˆïŒŒćˆ›ć»ș Pydantic ç”šæˆ·æšĄćž‹ă€‚ äžŽäœżç”š Pydantic ćŁ°æ˜ŽèŻ·æ±‚äœ“ç›žćŒïŒŒćč¶äž”ćŻćœšä»»äœ•äœçœźäœżç”šïŒš -{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *} +{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *} ## 戛ć»ș `get_current_user` 䟝蔖éĄč { #create-a-get-current-user-dependency } @@ -55,7 +54,7 @@ /// tip | 提ç€ș -äŸè”–çł»ç»Ÿçš„èż™ç§èźŸèźĄæ–čćŒćŻä»„æ”ŻæŒäžćŒçš„äŸè”–éĄčèż”ć›žćŒäž€äžȘ `User` æšĄćž‹ă€‚ +äŸè”–çł»ç»Ÿçš„èż™ç§èźŸèźĄæ–čćŒćŻä»„æ”ŻæŒäžćŒçš„äŸè”–éĄčïŒˆäžćŒçš„â€œćŻäŸè”–éĄčâ€ïŒ‰èż”ć›žćŒäž€äžȘ `User` æšĄćž‹ă€‚ è€Œäžæ˜Żć±€é™äșŽćȘ胜有䞀äžȘèż”ć›žèŻ„ç±»ćž‹æ•°æźçš„äŸè”–éĄč。 @@ -77,7 +76,6 @@ ć°œçźĄäœżç”šćș”ç”šæ‰€éœ€çš„ä»»äœ•æšĄćž‹ă€ç±»ă€æ•°æźćș“。**FastAPI** é€šèż‡äŸè”–æłšć…„çł»ç»Ÿéƒœèƒœćžźæ‚šæžćźšă€‚ - ## ä»Łç ć€§ć° { #code-size } èż™äžȘç€ș䟋看蔷杄有äș›ć†—é•żă€‚æŻ•ç«Ÿèż™äžȘæ–‡ä»¶ćŒæ—¶ćŒ…ć«äș†ćź‰ć…šă€æ•°æźæšĄćž‹çš„ć·„ć…·ć‡œæ•°ïŒŒä»„ćŠè·ŻćŸ„æ“äœœç­‰ä»Łç ă€‚ diff --git a/docs/zh/docs/tutorial/security/oauth2-jwt.md b/docs/zh/docs/tutorial/security/oauth2-jwt.md index e0cbdf685..418b3b97d 100644 --- a/docs/zh/docs/tutorial/security/oauth2-jwt.md +++ b/docs/zh/docs/tutorial/security/oauth2-jwt.md @@ -120,7 +120,7 @@ pwdlib ä蟿”ŻæŒ bcrypt ć“ˆćžŒçź—æł•ïŒŒäœ†äžćŒ…ć«é—ç•™çź—æł•â€”â€”ćŠ‚æžœéœ€ ćœ“äœżç”šäž€äžȘćœšæ•°æźćș“äž­äžć­˜ćœšçš„ç”šæˆ·ćè°ƒç”š `authenticate_user` æ—¶ïŒŒæˆ‘ä»Źä»ç„¶äŒšé’ˆćŻč侀äžȘè™šæ‹Ÿć“ˆćžŒèżèĄŒ `verify_password`。 -èż™ćŻä»„çĄźäżæ— èźșç”šæˆ·ćæ˜ŻćŠæœ‰æ•ˆïŒŒç«Żç‚č的操ćș”æ—¶é—Žć€§è‡Žç›žćŒïŒŒä»Žè€Œé˜Čæ­ąćŻç”šäșŽæžšäžŸć·Čć­˜ćœšç”šæˆ·ćçš„â€œæ—¶é—Žæ”»ć‡»â€ïŒˆtiming attacksïŒ‰ă€‚ +èż™ćŻä»„çĄźäżæ— èźșç”šæˆ·ćæ˜ŻćŠæœ‰æ•ˆïŒŒç«Żç‚č的操ćș”æ—¶é—Žć€§è‡Žç›žćŒïŒŒä»Žè€Œé˜Čæ­ąćŻç”šäșŽæžšäžŸć·Čć­˜ćœšç”šæˆ·ćçš„**时ćșæ”»ć‡»**。 /// note | æłšæ„ @@ -168,7 +168,7 @@ $ openssl rand -hex 32 {* ../../docs_src/security/tutorial004_an_py310.py hl[93:110] *} -## 曎新 `/token` è·ŻćŸ„æ“äœœ { #update-the-token-path-operation } +## 曎新 `/token` *è·ŻćŸ„æ“äœœ* { #update-the-token-path-operation } ç”šä»€ç‰Œçš„èż‡æœŸæ—¶é—Žćˆ›ć»ș侀äžȘ `timedelta`。 diff --git a/docs/zh/docs/tutorial/security/simple-oauth2.md b/docs/zh/docs/tutorial/security/simple-oauth2.md index 6ebf77e36..92cf02dd2 100644 --- a/docs/zh/docs/tutorial/security/simple-oauth2.md +++ b/docs/zh/docs/tutorial/security/simple-oauth2.md @@ -6,7 +6,7 @@ éŠ–ć…ˆïŒŒäœżç”š **FastAPI** ćź‰ć…šć·„ć…·èŽ·ć– `username` 撌 `password`。 -OAuth2 è§„èŒƒèŠæ±‚äœżç”šâ€œćŻ†ç æ”â€æ—¶ïŒŒćźąæˆ·ç«Żæˆ–ç”šæˆ·ćż…éĄ»ä»„èĄšć•æ•°æźćœąćŒć‘é€ `username` 撌 `password` ć­—æź”ă€‚ +OAuth2 è§„èŒƒèŠæ±‚äœżç”šâ€œćŻ†ç æ”â€ïŒˆäčŸć°±æ˜Żæˆ‘ä»Źæ­Łćœšäœżç”šçš„æ”çš‹ïŒ‰æ—¶ïŒŒćźąæˆ·ç«Żæˆ–ç”šæˆ·ćż…éĄ»ä»„èĄšć•æ•°æźćœąćŒć‘é€ `username` 撌 `password` ć­—æź”ă€‚ ćč¶äž”ïŒŒèż™äž€äžȘć­—æź”ćż…éĄ»ć‘œćäžș `username` 撌 `password`ïŒŒäžèƒœäœżç”š `user-name` 或 `email` ç­‰ć…¶ćźƒćç§°ă€‚ @@ -80,7 +80,7 @@ OAuth2 䞭**äœœç”šćŸŸ**ćȘæ˜ŻćŁ°æ˜ŽæŒ‡ćźšæƒé™çš„ć­—çŹŠäžČ。 䜆 `OAuth2PasswordRequestForm` ćȘæ˜ŻćŻä»„è‡ȘèĄŒçŒ–ć†™çš„ç±»äŸè”–éĄčäčŸćŻä»„ç›ŽæŽ„ćŁ°æ˜Ž `Form` ć‚æ•°ă€‚ -䜆由äșŽèż™ç§ç”šäŸ‹ćŸˆćžžè§ïŒŒFastAPI äžșäș†çź€äŸżïŒŒć°±ç›ŽæŽ„提䟛äș†ćŻčćźƒçš„æ”ŻæŒă€‚ +䜆由äșŽèż™ç§ç”šäŸ‹ćŸˆćžžè§ïŒŒ**FastAPI** äžșäș†çź€äŸżïŒŒć°±ç›ŽæŽ„提䟛äș†ćŻčćźƒçš„æ”ŻæŒă€‚ /// @@ -146,7 +146,7 @@ UserInDB( /// note | æłšæ„ -`user_dict` çš„èŻŽæ˜ŽïŒŒèŻŠè§[**æ›Žć€šæšĄćž‹**䞀章](../extra-models.md#about-user-in-dict)。 +慳äșŽ `**user_dict` çš„æ›ŽćźŒæ•ŽèŻŽæ˜ŽïŒŒèŻŠè§[**æ›Žć€šæšĄćž‹**æ–‡æĄŁ](../extra-models.md#about-user-in-model-dump)。 /// @@ -208,7 +208,7 @@ UserInDB( ä苿‰€ä»„ćœšæ­€æäŸ›èż™äžȘ附抠操ćș”ć€ŽïŒŒæ˜Żäžșäș†çŹŠćˆè§„èŒƒçš„èŠæ±‚ă€‚ -èŻŽäžćźšä»€ä舿—¶ć€™ïŒŒć°±æœ‰ć·„ć…·ç”šćŸ—äžŠćźƒïŒŒè€Œäž”ïŒŒćŒ€ć‘è€…æˆ–ç”šæˆ·äčŸćŻèƒœç”šćŸ—䞊。 +æ­€ć€–ïŒŒçŽ°ćœšæˆ–ć°†æ„ïŒŒćŻèƒœäŒšæœ‰ć·„ć…·æœŸæœ›ćč¶äœżç”šćźƒïŒŒè€Œäž”çŽ°ćœšæˆ–ć°†æ„èż™äčŸćŻèƒœćŻčäœ æˆ–äœ çš„ç”šæˆ·æœ‰ç”šă€‚ èż™ć°±æ˜Żé”ćŸȘæ ‡ć‡†çš„ć„œć€„... diff --git a/docs/zh/docs/tutorial/sql-databases.md b/docs/zh/docs/tutorial/sql-databases.md index 9004983b1..1d6a3cd34 100644 --- a/docs/zh/docs/tutorial/sql-databases.md +++ b/docs/zh/docs/tutorial/sql-databases.md @@ -8,7 +8,7 @@ /// tip | 提ç€ș -äœ ćŻä»„äœżç”šä»»æ„ć…¶ä»–äœ æƒłèŠçš„ SQL 或 NoSQL æ•°æźćș“ćș“ïŒˆćœšæŸäș›æƒ…憔例称äžș "ORMs"FastAPI 䞍䌚ćŒșèż«äœ äœżç”šä»»äœ•äžœè„żă€‚đŸ˜Ž +äœ ćŻä»„äœżç”šä»»æ„ć…¶ä»–äœ æƒłèŠçš„ SQL 或 NoSQL æ•°æźćș“ç±»ćș“ïŒˆćœšæŸäș›æƒ…憔例称äžș "ORMs"FastAPI 䞍䌚ćŒșèż«äœ äœżç”šä»»äœ•äžœè„żă€‚đŸ˜Ž /// @@ -57,7 +57,7 @@ $ pip install sqlmodel {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[1:11] hl[7:11] *} -`Hero` 类䞎 Pydantic æšĄćž‹éžćžžç›žäŒŒïŒˆćźžé™…äžŠïŒŒä»Žćș•ć±‚æ„çœ‹ïŒŒćźƒçĄźćźžć°±æ˜Żäž€äžȘ Pydantic æšĄćž‹ïŒ‰ă€‚ +`Hero` 类䞎 Pydantic æšĄćž‹éžćžžç›žäŒŒïŒˆćźžé™…äžŠïŒŒä»Žćș•ć±‚æ„çœ‹ïŒŒćźƒ*çĄźćźžć°±æ˜Żäž€äžȘ Pydantic æšĄćž‹*ïŒ‰ă€‚ 有䞀äș›ćŒșćˆ«ïŒš @@ -65,7 +65,7 @@ $ pip install sqlmodel * `Field(primary_key=True)` äŒšć‘ŠèŻ‰ SQLModel `id` æ˜Ż SQL æ•°æźćș“äž­çš„**䞻锟**ïŒˆäœ ćŻä»„ćœš SQLModel æ–‡æĄŁäž­äș†è§Łæ›Žć€šć…łäșŽ SQL äž»é”źçš„äżĄæŻïŒ‰ă€‚ - **æłšæ„ïŒš** æˆ‘ä»Źäžșäž»é”źć­—æź”äœżç”š `int | None`ïŒŒèż™æ ·ćœš Python ä»Łç äž­æˆ‘ä»ŹćŻä»„ćœšæČĄæœ‰ `id``id=None`ïŒ‰çš„æƒ…ć†”äž‹ćˆ›ć»șćŻčè±ĄïŒŒćč¶ć‡ćꚿ•°æźćș“ćœšäżć­˜æ—¶äŒšç”Ÿæˆćźƒă€‚SQLModel äŒšç†è§Łæ•°æźćș“䌚提䟛 `id`ćč¶ćœšæ•°æźćș“æšĄćŒäž­ć°†èŻ„ćˆ—ćźšäč‰äžș非ç©ș的 `INTEGER`ă€‚èŻŠè§ [SQLModel 慳äșŽäž»é”źçš„æ–‡æĄŁ](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id)。 + **æłšæ„ïŒš** æˆ‘ä»Źäžșäž»é”źć­—æź”äœżç”š `int | None`ïŒŒèż™æ ·ćœš Python ä»Łç äž­æˆ‘ä»ŹćŻä»„*朹æČĄæœ‰ `id` çš„æƒ…ć†”äž‹ćˆ›ć»șćŻčè±Ą*`id=None`ćč¶ć‡ćꚿ•°æźćș“䌚*ćœšäżć­˜æ—¶ç”Ÿæˆćźƒ*。SQLModel äŒšç†è§Łæ•°æźćș“䌚提䟛 `id`ćč¶ćœšæ•°æźćș“æšĄćŒäž­*ć°†èŻ„ćˆ—ćźšäč‰äžș非ç©ș的 `INTEGER`*ă€‚èŻŠè§ [SQLModel 慳äșŽäž»é”źçš„æ–‡æĄŁ](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id)。 * `Field(index=True)` äŒšć‘ŠèŻ‰ SQLModel ćș”èŻ„äžșæ­€ćˆ—ćˆ›ć»ș侀äžȘ **SQL çŽąćŒ•**ïŒŒèż™æ ·ćœšèŻ»ć–æŒ‰æ­€ćˆ—èż‡æ»€çš„æ•°æźæ—¶ïŒŒçš‹ćșèƒœćœšæ•°æźćș“äž­èż›èĄŒæ›Žćż«çš„æŸ„æ‰Ÿă€‚ @@ -292,7 +292,7 @@ $ fastapi dev /// tip | 提ç€ș -çŽ°ćœšæˆ‘ä»Źäœżç”š `response_model=HeroPublic` æ„ä»Łæ›ż**èż”ć›žç±»ćž‹æłšè§Ł** `-> HeroPublic`ïŒŒć› äžșæˆ‘ä»Źèż”ć›žçš„ć€Œćźžé™…äžŠćč¶äžæ˜Ż `HeroPublic`。 +çŽ°ćœšæˆ‘ä»Źäœżç”š `response_model=HeroPublic` æ„ä»Łæ›ż**èż”ć›žç±»ćž‹æłšè§Ł** `-> HeroPublic`ïŒŒć› äžșæˆ‘ä»Źèż”ć›žçš„ć€Œćźžé™…äžŠ*ćč¶äžæ˜Ż* `HeroPublic`。 ćŠ‚æžœæˆ‘ä»ŹćŁ°æ˜Žäș† `-> HeroPublic`ïŒŒäœ çš„çŒ–èŸ‘ć™šć’Œä»Łç æŁ€æŸ„ć·„ć…·äŒšïŒˆç†æ‰€ćș”ćœ“ćœ°ïŒ‰æŠ±æ€šäœ èż”ć›žäș†äž€äžȘ `Hero` è€Œäžæ˜Żäž€äžȘ `HeroPublic`。 diff --git a/docs/zh/docs/tutorial/static-files.md b/docs/zh/docs/tutorial/static-files.md index 65262bdb4..b700f46d6 100644 --- a/docs/zh/docs/tutorial/static-files.md +++ b/docs/zh/docs/tutorial/static-files.md @@ -2,6 +2,14 @@ äœ ćŻä»„äœżç”š `StaticFiles` ä»Žç›źćœ•äž­è‡ȘćŠšæäŸ›é™æ€æ–‡ä»¶ă€‚ +/// tip | 提ç€ș + +ćŠ‚æžœäœ éœ€èŠæ‰˜çźĄć‰ç«ŻïŒŒèŻ·æ”č甹 `app.frontend()`ïŒŒćŻćœš[ć‰ç«Ż](frontend.md)äž­é˜…èŻ»ç›žć…łć†…ćźč。 + +`app.frontend()` ćș•ć±‚äœżç”š `StaticFiles`ćč¶äžșć‰ç«ŻæäŸ›äș†ć‡ äžȘéąć€–äŒ˜ćŠżïŒŒäŸ‹ćŠ‚ć€„ç†ćźąæˆ·ç«Żè·Żç”±ă€‚ + +/// + ## äœżç”š `StaticFiles` { #use-staticfiles } * ćŻŒć…„ `StaticFiles`。 diff --git a/docs/zh/docs/tutorial/testing.md b/docs/zh/docs/tutorial/testing.md index 50e1d8f2d..79e5044c9 100644 --- a/docs/zh/docs/tutorial/testing.md +++ b/docs/zh/docs/tutorial/testing.md @@ -52,7 +52,7 @@ $ pip install httpx /// tip | 提ç€ș -陀äș†ć‘é€èŻ·æ±‚äč‹ć€–ïŒŒćŠ‚æžœäœ èż˜æƒłæ”‹èŻ•æ—¶ćœšFastAPIćș”甚䞭调甚 `async` ć‡œæ•°ïŒˆäŸ‹ćŠ‚ćŒ‚æ­„æ•°æźćș“ć‡œæ•°ïŒ‰ïŒŒ ćŻä»„ćœšé«˜çș§æ•™çš‹äž­çœ‹äž‹ [Async Tests](../advanced/async-tests.md) 。 +陀äș†ć‘é€èŻ·æ±‚äč‹ć€–ïŒŒćŠ‚æžœäœ èż˜æƒłæ”‹èŻ•æ—¶ćœšFastAPIćș”甚䞭调甚 `async` ć‡œæ•°ïŒˆäŸ‹ćŠ‚ćŒ‚æ­„æ•°æźćș“ć‡œæ•°ïŒ‰ïŒŒ ćŻä»„ćœšé«˜çș§æ•™çš‹äž­çœ‹äž‹[ćŒ‚æ­„æ”‹èŻ•](../advanced/async-tests.md)。 /// @@ -60,7 +60,7 @@ $ pip install httpx 朹漞际ćș”ç”šäž­ïŒŒäœ ćŻèƒœäŒšæŠŠäœ çš„æ”‹èŻ•æ”ŸćœšćŠäž€äžȘæ–‡ä»¶é‡Œă€‚ -悚的**FastAPI**ćș”甚皋ćșäčŸćŻèƒœç”±äž€äș›æ–‡ä»¶/æšĄć—ç»„æˆç­‰ç­‰ă€‚ +䜠的**FastAPI**ćș”甚皋ćșäčŸćŻèƒœç”±äž€äș›æ–‡ä»¶/æšĄć—ç»„æˆç­‰ç­‰ă€‚ ### **FastAPI** app 文件 { #fastapi-app-file } @@ -80,7 +80,7 @@ $ pip install httpx ### æ”‹èŻ•æ–‡ä»¶ { #testing-file } -ç„¶ćŽäœ äŒšæœ‰äž€äžȘćŒ…ć«æ”‹èŻ•çš„æ–‡ä»¶ `test_main.py` 。appćŻä»„ćƒPythonćŒ…é‚Łæ ·ć­˜ćœšïŒˆäž€æ ·æ˜Żç›źćœ•ïŒŒäœ†æœ‰äžȘ `__init__.py` 文件 +ç„¶ćŽäœ äŒšæœ‰äž€äžȘćŒ…ć«æ”‹èŻ•çš„æ–‡ä»¶ `test_main.py` ă€‚ćźƒćŻä»„äœäșŽćŒäž€äžȘ Python ćŒ…äž­ïŒˆäž€æ ·æ˜Żç›źćœ•ïŒŒäœ†æœ‰äžȘ `__init__.py` 文件 ``` hl_lines="5" . @@ -94,6 +94,7 @@ $ pip install httpx {* ../../docs_src/app_testing/app_a_py310/test_main.py hl[3] *} + ...ç„¶ćŽæ”‹èŻ•ä»Łç ć’Œäč‹ć‰äž€æ ·çš„。 ## æ”‹èŻ•ïŒšæ‰©ć±•ç€ș䟋 { #testing-extended-example } @@ -114,20 +115,21 @@ $ pip install httpx ć‡èźŸçŽ°ćœšćŒ…ć«**FastAPI** app的文件 `main.py` 有äș›ć…¶ä»–**è·ŻćŸ„æ“äœœ**。 -有äžȘ `GET` æ“äœœäŒšèż”ć›žé”™èŻŻă€‚ +有äžȘ `GET` æ“äœœćŻèƒœèż”ć›žäž€äžȘé”™èŻŻă€‚ -有äžȘ `POST` æ“äœœäŒšèż”ć›žäž€äș›é”™èŻŻă€‚ +有äžȘ `POST` æ“äœœćŻèƒœèż”ć›žć€šäžȘé”™èŻŻă€‚ -所有*è·ŻćŸ„æ“äœœ* 郜需芁䞀äžȘ`X-Token` 怎。 +䞀äžȘ*è·ŻćŸ„æ“äœœ* 郜需芁䞀äžȘ`X-Token` 怎。 {* ../../docs_src/app_testing/app_b_an_py310/main.py *} ### æ‰©ć±•ćŽçš„æ”‹èŻ•æ–‡ä»¶ { #extended-testing-file } -ç„¶ćŽæ‚šćŻä»„äœżç”šæ‰©ć±•ćŽçš„æ”‹èŻ•æ›Žæ–°`test_main.py` +ç„¶ćŽäœ ćŻä»„äœżç”šæ‰©ć±•ćŽçš„æ”‹èŻ•æ›Žæ–°`test_main.py` {* ../../docs_src/app_testing/app_b_an_py310/test_main.py *} + æŻćœ“äœ éœ€èŠćźąæˆ·ç«ŻćœšèŻ·æ±‚äž­äŒ é€’äżĄæŻïŒŒäœ†äœ äžçŸ„é“ćŠ‚äœ•äŒ é€’æ—¶ïŒŒäœ ćŻä»„é€šèż‡æœçŽąïŒˆè°·æ­ŒïŒ‰ćŠ‚äœ•ç”š `httpx` ćšïŒŒæˆ–è€…æ˜Żç”š `requests` ćšïŒŒæŻ•ç«ŸHTTPXçš„èźŸèźĄæ˜ŻćŸșäșŽRequestsçš„èźŸèźĄçš„ă€‚ 掄着ćȘéœ€ćœšæ”‹èŻ•äž­ćŒæ ·æ“äœœă€‚ @@ -146,7 +148,7 @@ $ pip install httpx æłšæ„ `TestClient` æŽ„æ”¶ćŻä»„èą«èœŹćŒ–äžșJSONçš„æ•°æźïŒŒè€Œäžæ˜ŻPydanticæšĄćž‹ă€‚ -ćŠ‚æžœäœ ćœšæ”‹èŻ•äž­æœ‰äž€äžȘPydanticæšĄćž‹ïŒŒćč¶äž”äœ æƒłćœšæ”‹èŻ•æ—¶ć‘é€ćźƒçš„æ•°æźç»™ćș”ç”šïŒŒäœ ćŻä»„äœżç”šćœš[JSON Compatible Encoder](encoder.md)介绍的`jsonable_encoder` 。 +ćŠ‚æžœäœ ćœšæ”‹èŻ•äž­æœ‰äž€äžȘPydanticæšĄćž‹ïŒŒćč¶äž”äœ æƒłćœšæ”‹èŻ•æ—¶ć‘é€ćźƒçš„æ•°æźç»™ćș”ç”šïŒŒäœ ćŻä»„äœżç”šćœš[JSON ć…ŒćźčçŒ–ç ć™š](encoder.md)介绍的`jsonable_encoder` 。 /// @@ -166,7 +168,7 @@ $ pip install pytest
-他䌚è‡ȘćŠšæŁ€æ”‹æ–‡ä»¶ć’Œæ”‹èŻ•ïŒŒæ‰§èĄŒæ”‹èŻ•ïŒŒç„¶ćŽć‘äœ æŠ„ć‘Šç»“æžœă€‚ +ćźƒäŒšè‡ȘćŠšæŁ€æ”‹æ–‡ä»¶ć’Œæ”‹èŻ•ïŒŒæ‰§èĄŒæ”‹èŻ•ïŒŒç„¶ćŽć‘äœ æŠ„ć‘Šç»“æžœă€‚ æ‰§èĄŒæ”‹èŻ•ïŒš diff --git a/docs/zh/docs/virtual-environments.md b/docs/zh/docs/virtual-environments.md index d10251dbe..a31240d9f 100644 --- a/docs/zh/docs/virtual-environments.md +++ b/docs/zh/docs/virtual-environments.md @@ -861,4 +861,4 @@ I solemnly swear đŸș ćŠ‚æžœäœ èŻ»èż‡ćč¶ç†è§Łäș†æ‰€æœ‰èż™äș›ïŒŒçŽ°ćœš**䜠ćŻčè™šæ‹ŸçŽŻćąƒçš„äș†è§ŁæŻ”ćŸˆć€šćŒ€ć‘è€…éƒœèЁ〚**ă€‚đŸ€“ -朹æœȘæ„ćœ“äœ è°ƒçœ‹çœ‹è”·æ„ć€æ‚çš„äžœè„żæ—¶ïŒŒäș†è§Łèż™äș›ç»†èŠ‚ćŸˆćŻèƒœäŒšæœ‰ç”šïŒŒäœ äŒšçŸ„道**ćźƒæ˜ŻćŠ‚äœ•ćœšćș•求淄䜜的**。😎 +朹æœȘæ„ćœ“äœ è°ƒèŻ•çœ‹è”·æ„ć€æ‚çš„äžœè„żæ—¶ïŒŒäș†è§Łèż™äș›ç»†èŠ‚ćŸˆćŻèƒœäŒšæœ‰ç”šïŒŒäœ äŒšçŸ„道**ćźƒæ˜ŻćŠ‚äœ•ćœšćș•求淄䜜的**。😎 From 59d335d200a9d39256b521038f7ae58535eb75b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 13:36:20 +0000 Subject: [PATCH 274/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7aafc7f50..d00065b7d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for zh (update-outdated). PR [#15898](https://github.com/fastapi/fastapi/pull/15898) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for uk (update-outdated). PR [#15900](https://github.com/fastapi/fastapi/pull/15900) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ko (update-outdated). PR [#15890](https://github.com/fastapi/fastapi/pull/15890) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ru (update-outdated). PR [#15894](https://github.com/fastapi/fastapi/pull/15894) by [@tiangolo](https://github.com/tiangolo). From 48dd913e5648cda943bc28cccfbbc4c93f2a5859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 15:45:25 +0200 Subject: [PATCH 275/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20pt=20(update-outdated)=20(#15893)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] Co-authored-by: Yurii Motov --- docs/pt/docs/_llm-test.md | 14 +- .../docs/advanced/additional-status-codes.md | 6 +- .../pt/docs/advanced/advanced-dependencies.md | 1 + docs/pt/docs/advanced/dataclasses.md | 2 +- docs/pt/docs/advanced/events.md | 1 + docs/pt/docs/advanced/generate-clients.md | 24 +--- docs/pt/docs/advanced/json-base64-bytes.md | 2 +- docs/pt/docs/advanced/openapi-callbacks.md | 28 ++-- .../advanced/response-change-status-code.md | 4 +- docs/pt/docs/advanced/response-cookies.md | 2 +- docs/pt/docs/advanced/response-headers.md | 1 + .../docs/advanced/security/oauth2-scopes.md | 22 +-- docs/pt/docs/advanced/settings.md | 1 + docs/pt/docs/advanced/stream-data.md | 20 +-- docs/pt/docs/advanced/wsgi.md | 1 + docs/pt/docs/alternatives.md | 8 +- docs/pt/docs/async.md | 54 +++---- docs/pt/docs/deployment/cloud.md | 2 +- docs/pt/docs/deployment/concepts.md | 44 +++--- docs/pt/docs/deployment/docker.md | 36 ++--- docs/pt/docs/deployment/https.md | 136 +++++++++--------- docs/pt/docs/deployment/manually.md | 4 +- docs/pt/docs/editor-support.md | 2 +- docs/pt/docs/environment-variables.md | 2 +- docs/pt/docs/features.md | 40 +++--- docs/pt/docs/help-fastapi.md | 2 +- docs/pt/docs/how-to/configure-swagger-ui.md | 1 + .../docs/how-to/custom-request-and-route.md | 6 +- docs/pt/docs/how-to/graphql.md | 1 + ...migrate-from-pydantic-v1-to-pydantic-v2.md | 18 +++ .../docs/how-to/separate-openapi-schemas.md | 1 + docs/pt/docs/index.md | 6 +- docs/pt/docs/project-generation.md | 22 +-- docs/pt/docs/python-types.md | 70 ++++----- docs/pt/docs/tutorial/bigger-applications.md | 34 +++-- docs/pt/docs/tutorial/body-nested-models.md | 20 +-- docs/pt/docs/tutorial/body.md | 1 + docs/pt/docs/tutorial/debugging.md | 2 +- .../dependencies/dependencies-with-yield.md | 7 +- docs/pt/docs/tutorial/extra-data-types.md | 8 +- docs/pt/docs/tutorial/extra-models.md | 2 +- docs/pt/docs/tutorial/first-steps.md | 32 ++--- docs/pt/docs/tutorial/handling-errors.md | 110 +++++++------- docs/pt/docs/tutorial/index.md | 12 +- docs/pt/docs/tutorial/metadata.md | 4 +- .../tutorial/path-operation-configuration.md | 2 +- .../tutorial/query-params-str-validations.md | 48 +++---- docs/pt/docs/tutorial/query-params.md | 9 +- docs/pt/docs/tutorial/request-files.md | 22 +-- docs/pt/docs/tutorial/request-forms.md | 2 +- docs/pt/docs/tutorial/response-status-code.md | 6 +- docs/pt/docs/tutorial/schema-extra-example.md | 1 + docs/pt/docs/tutorial/security/first-steps.md | 10 +- .../tutorial/security/get-current-user.md | 2 +- docs/pt/docs/tutorial/security/oauth2-jwt.md | 8 +- .../docs/tutorial/security/simple-oauth2.md | 12 +- docs/pt/docs/tutorial/sql-databases.md | 47 +++--- docs/pt/docs/tutorial/static-files.md | 8 ++ docs/pt/docs/tutorial/testing.md | 10 +- docs/pt/docs/virtual-environments.md | 20 +-- 60 files changed, 530 insertions(+), 493 deletions(-) diff --git a/docs/pt/docs/_llm-test.md b/docs/pt/docs/_llm-test.md index 714c121b4..2e20e5b58 100644 --- a/docs/pt/docs/_llm-test.md +++ b/docs/pt/docs/_llm-test.md @@ -11,7 +11,7 @@ Use da seguinte forma: * Verifique se estĂĄ tudo certo na tradução. * Se necessĂĄrio, melhore seu prompt especĂ­fico do idioma, o prompt geral ou o documento em inglĂȘs. * Em seguida, corrija manualmente os problemas restantes na tradução, para que fique uma boa tradução. -* Retraduzir, tendo a boa tradução no lugar. O resultado ideal seria que o LLM nĂŁo fizesse mais mudanças na tradução. Isso significa que o prompt geral e o seu prompt especĂ­fico do idioma estĂŁo tĂŁo bons quanto possĂ­vel (Ă s vezes farĂĄ algumas mudanças aparentemente aleatĂłrias, a razĂŁo Ă© que [LLMs nĂŁo sĂŁo algoritmos determinĂ­sticos](https://doublespeak.chat/#/handbook#deterministic-output)). +* Retraduza, tendo a boa tradução no lugar. O resultado ideal seria que o LLM nĂŁo fizesse mais mudanças na tradução. Isso significa que o prompt geral e o seu prompt especĂ­fico do idioma estĂŁo tĂŁo bons quanto possĂ­vel (Ă s vezes farĂĄ algumas mudanças aparentemente aleatĂłrias, a razĂŁo Ă© que [LLMs nĂŁo sĂŁo algoritmos determinĂ­sticos](https://doublespeak.chat/#/handbook#deterministic-output)). Os testes: @@ -189,15 +189,15 @@ Aqui estĂŁo algumas coisas envolvidas em elementos HTML "abbr" (algumas sĂŁo inv ### O abbr fornece uma frase completa { #the-abbr-gives-a-full-phrase } -* GTD -* lt -* XWT -* PSGI +* GTD +* lt +* XWT +* PSGI ### O abbr fornece uma frase completa e uma explicação { #the-abbr-gives-a-full-phrase-and-an-explanation } -* MDN -* I/O. +* MDN +* I/O. //// diff --git a/docs/pt/docs/advanced/additional-status-codes.md b/docs/pt/docs/advanced/additional-status-codes.md index af1cefaf2..b702b8b41 100644 --- a/docs/pt/docs/advanced/additional-status-codes.md +++ b/docs/pt/docs/advanced/additional-status-codes.md @@ -30,12 +30,12 @@ Garanta que ele tenha toda informação que vocĂȘ deseja, e que os valores sejam VocĂȘ tambĂ©m pode utilizar `from starlette.responses import JSONResponse`. -O **FastAPI** disponibiliza o `starlette.responses` como `fastapi.responses` apenas por conveniĂȘncia para vocĂȘ, o programador. PorĂ©m a maioria dos retornos disponĂ­veis vem diretamente do Starlette. O mesmo com `status`. +O **FastAPI** disponibiliza o `starlette.responses` como `fastapi.responses` apenas por conveniĂȘncia para vocĂȘ, o programador. PorĂ©m a maioria das respostas disponĂ­veis vem diretamente do Starlette. O mesmo com `status`. /// ## OpenAPI e documentação da API { #openapi-and-api-docs } -Se vocĂȘ retorna cĂłdigos de status adicionais e retornos diretamente, eles nĂŁo serĂŁo incluĂ­dos no esquema do OpenAPI (a documentação da API), porque o FastAPI nĂŁo tem como saber de antemĂŁo o que serĂĄ retornado. +Se vocĂȘ retorna cĂłdigos de status adicionais e respostas diretamente, eles nĂŁo serĂŁo incluĂ­dos no esquema do OpenAPI (a documentação da API), porque o FastAPI nĂŁo tem como saber de antemĂŁo o que serĂĄ retornado. -Mas vocĂȘ pode documentar isso no seu cĂłdigo, utilizando: [Retornos Adicionais](additional-responses.md). +Mas vocĂȘ pode documentar isso no seu cĂłdigo, utilizando: [Respostas Adicionais](additional-responses.md). diff --git a/docs/pt/docs/advanced/advanced-dependencies.md b/docs/pt/docs/advanced/advanced-dependencies.md index 15a78afec..21c1490ff 100644 --- a/docs/pt/docs/advanced/advanced-dependencies.md +++ b/docs/pt/docs/advanced/advanced-dependencies.md @@ -1,5 +1,6 @@ # DependĂȘncias avançadas { #advanced-dependencies } + ## DependĂȘncias parametrizadas { #parameterized-dependencies } Todas as dependĂȘncias que vimos atĂ© agora sĂŁo funçÔes ou classes fixas. diff --git a/docs/pt/docs/advanced/dataclasses.md b/docs/pt/docs/advanced/dataclasses.md index 7956196c7..f1cc5a070 100644 --- a/docs/pt/docs/advanced/dataclasses.md +++ b/docs/pt/docs/advanced/dataclasses.md @@ -8,7 +8,7 @@ Mas o FastAPI tambĂ©m suporta o uso de [`dataclasses`](https://docs.python.org/3 Isso ainda Ă© suportado graças ao **Pydantic**, pois ele tem [suporte interno para `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel). -EntĂŁo, mesmo com o cĂłdigo acima que nĂŁo usa Pydantic explicitamente, o FastAPI estĂĄ usando Pydantic para converter essas dataclasses padrĂŁo para a versĂŁo do Pydantic. +EntĂŁo, mesmo com o cĂłdigo acima que nĂŁo usa Pydantic explicitamente, o FastAPI estĂĄ usando Pydantic para converter essas dataclasses padrĂŁo para a prĂłpria versĂŁo de dataclasses do Pydantic. E claro, ele suporta o mesmo: diff --git a/docs/pt/docs/advanced/events.md b/docs/pt/docs/advanced/events.md index a6262d8da..eee4dc880 100644 --- a/docs/pt/docs/advanced/events.md +++ b/docs/pt/docs/advanced/events.md @@ -1,5 +1,6 @@ # Eventos de lifespan { #lifespan-events } + VocĂȘ pode definir a lĂłgica (cĂłdigo) que deve ser executada antes da aplicação **inicializar**. Isso significa que esse cĂłdigo serĂĄ executado **uma vez**, **antes** de a aplicação **começar a receber requisiçÔes**. Da mesma forma, vocĂȘ pode definir a lĂłgica (cĂłdigo) que deve ser executada quando a aplicação estiver **encerrando**. Nesse caso, esse cĂłdigo serĂĄ executado **uma vez**, **depois** de possivelmente ter tratado **vĂĄrias requisiçÔes**. diff --git a/docs/pt/docs/advanced/generate-clients.md b/docs/pt/docs/advanced/generate-clients.md index 89f2a89f4..975fb902d 100644 --- a/docs/pt/docs/advanced/generate-clients.md +++ b/docs/pt/docs/advanced/generate-clients.md @@ -20,27 +20,13 @@ O FastAPI gera automaticamente especificaçÔes **OpenAPI 3.1**, entĂŁo qualquer /// -## Geradores de SDK dos patrocinadores do FastAPI { #sdk-generators-from-fastapi-sponsors } - -Esta seção destaca soluçÔes **financiadas por investimento** e **com suporte de empresas** que patrocinam o FastAPI. Esses produtos fornecem **funcionalidades adicionais** e **integraçÔes** alĂ©m de SDKs gerados com alta qualidade. - -Ao ✹ [**patrocinar o FastAPI**](../help-fastapi.md#sponsor-the-author) ✹, essas empresas ajudam a garantir que o framework e seu **ecossistema** continuem saudĂĄveis e **sustentĂĄveis**. - -O patrocĂ­nio tambĂ©m demonstra um forte compromisso com a **comunidade** FastAPI (vocĂȘ), mostrando que elas se importam nĂŁo apenas em oferecer um **Ăłtimo serviço**, mas tambĂ©m em apoiar um **framework robusto e prĂłspero**, o FastAPI. 🙇 - -Por exemplo, vocĂȘ pode querer experimentar: - -* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) - -Algumas dessas soluçÔes tambĂ©m podem ser open source ou oferecer planos gratuitos, para que vocĂȘ possa testĂĄ-las sem compromisso financeiro. Outros geradores comerciais de SDK estĂŁo disponĂ­veis e podem ser encontrados online. đŸ€“ - ## Crie um SDK em TypeScript { #create-a-typescript-sdk } Vamos começar com uma aplicação FastAPI simples: {* ../../docs_src/generate_clients/tutorial001_py310.py hl[7:9,12:13,16:17,21] *} -Observe que as *operaçÔes de rota* definem os modelos que usam para o corpo da requisição e o corpo da resposta, usando os modelos `Item` e `ResponseMessage`. +Observe que as *operaçÔes de rota* definem os modelos que usam para o payload da requisição e o payload da resposta, usando os modelos `Item` e `ResponseMessage`. ### Documentação da API { #api-docs } @@ -72,7 +58,7 @@ Agora vocĂȘ pode importar e usar o cĂłdigo do cliente. Poderia ser assim, observ -VocĂȘ tambĂ©m obterĂĄ preenchimento automĂĄtico para o corpo a ser enviado: +VocĂȘ tambĂ©m obterĂĄ preenchimento automĂĄtico para o payload a enviar: @@ -121,7 +107,7 @@ ItemsService.createItemItemsPost({name: "Plumbus", price: 5}) ...isso ocorre porque o gerador de clientes usa o **ID de operação interno do OpenAPI** para cada *operação de rota*. -O OpenAPI exige que cada ID de operação seja Ășnico em todas as *operaçÔes de rota*, entĂŁo o FastAPI usa o **nome da função**, o **path** e o **mĂ©todo HTTP** para gerar esse ID de operação, porque dessa forma ele pode garantir que os IDs de operação sejam Ășnicos. +O OpenAPI exige que cada ID de operação seja Ășnico em todas as *operaçÔes de rota*, entĂŁo o FastAPI usa o **nome da função**, o **path** e o **mĂ©todo/operação HTTP** para gerar esse ID de operação, porque dessa forma ele pode garantir que os IDs de operação sejam Ășnicos. Mas eu vou te mostrar como melhorar isso a seguir. đŸ€“ @@ -194,8 +180,8 @@ Depois de gerar o novo cliente, vocĂȘ terĂĄ agora **nomes de mĂ©todos “limpos Ao usar os clientes gerados automaticamente, vocĂȘ terĂĄ **preenchimento automĂĄtico** para: * MĂ©todos. -* Corpos de requisiçÔes, parĂąmetros de query, etc. -* Corpos de respostas. +* Payloads de requisiçÔes no body, parĂąmetros de query, etc. +* Payloads de respostas. VocĂȘ tambĂ©m terĂĄ **erros em linha** para tudo. diff --git a/docs/pt/docs/advanced/json-base64-bytes.md b/docs/pt/docs/advanced/json-base64-bytes.md index cc956da4f..8034430ab 100644 --- a/docs/pt/docs/advanced/json-base64-bytes.md +++ b/docs/pt/docs/advanced/json-base64-bytes.md @@ -4,7 +4,7 @@ Se sua aplicação precisa receber e enviar dados JSON, mas vocĂȘ precisa inclui ## Base64 vs Arquivos { #base64-vs-files } -Primeiro, considere se vocĂȘ pode usar [Arquivos na request](../tutorial/request-files.md) para fazer upload de dados binĂĄrios e [Response personalizada - FileResponse](./custom-response.md#fileresponse--fileresponse-) para enviar dados binĂĄrios, em vez de codificĂĄ-los em JSON. +Primeiro, considere se vocĂȘ pode usar [Arquivos na request](../tutorial/request-files.md) para fazer upload de dados binĂĄrios e [Response personalizada - FileResponse](./custom-response.md#fileresponse) para enviar dados binĂĄrios, em vez de codificĂĄ-los em JSON. JSON sĂł pode conter strings codificadas em UTF-8, portanto nĂŁo pode conter bytes puros. diff --git a/docs/pt/docs/advanced/openapi-callbacks.md b/docs/pt/docs/advanced/openapi-callbacks.md index 1403425a9..08877e4f7 100644 --- a/docs/pt/docs/advanced/openapi-callbacks.md +++ b/docs/pt/docs/advanced/openapi-callbacks.md @@ -1,16 +1,16 @@ # Callbacks na OpenAPI { #openapi-callbacks } -VocĂȘ poderia criar uma API com uma *operação de rota* que poderia acionar um request a uma *API externa* criada por outra pessoa (provavelmente o mesmo desenvolvedor que estaria *usando* sua API). +VocĂȘ poderia criar uma API com uma *operação de rota* que poderia acionar um request para uma *API externa* criada por outra pessoa (provavelmente o mesmo desenvolvedor que estaria *usando* sua API). O processo que acontece quando sua aplicação de API chama a *API externa* Ă© chamado de "callback". Porque o software que o desenvolvedor externo escreveu envia um request para sua API e entĂŁo sua API *chama de volta*, enviando um request para uma *API externa* (que provavelmente foi criada pelo mesmo desenvolvedor). Nesse caso, vocĂȘ poderia querer documentar como essa API externa *deveria* ser. Que *operação de rota* ela deveria ter, que corpo ela deveria esperar, que resposta ela deveria retornar, etc. -## Um aplicativo com callbacks { #an-app-with-callbacks } +## Uma aplicação com callbacks { #an-app-with-callbacks } Vamos ver tudo isso com um exemplo. -Imagine que vocĂȘ desenvolve um aplicativo que permite criar faturas. +Imagine que vocĂȘ desenvolve uma aplicação que permite criar faturas. Essas faturas terĂŁo um `id`, `title` (opcional), `customer` e `total`. @@ -23,11 +23,11 @@ EntĂŁo sua API irĂĄ (vamos imaginar): * Enviar a notificação de volta para o usuĂĄrio da API (o desenvolvedor externo). * Isso serĂĄ feito enviando um request POST (de *sua API*) para alguma *API externa* fornecida por esse desenvolvedor externo (este Ă© o "callback"). -## O aplicativo **FastAPI** normal { #the-normal-fastapi-app } +## A aplicação **FastAPI** normal { #the-normal-fastapi-app } -Vamos primeiro ver como o aplicativo da API normal se pareceria antes de adicionar o callback. +Vamos primeiro ver como a aplicação da API normal se pareceria antes de adicionar o callback. -Ele terĂĄ uma *operação de rota* que receberĂĄ um corpo `Invoice`, e um parĂąmetro de consulta `callback_url` que conterĂĄ a URL para o callback. +Ela terĂĄ uma *operação de rota* que receberĂĄ um corpo `Invoice`, e um parĂąmetro de consulta `callback_url` que conterĂĄ a URL para o callback. Essa parte Ă© bastante normal, a maior parte do cĂłdigo provavelmente jĂĄ Ă© familiar para vocĂȘ: @@ -45,7 +45,7 @@ A Ășnica novidade Ă© o `callbacks=invoices_callback_router.routes` como argument O cĂłdigo real do callback dependerĂĄ muito da sua prĂłpria aplicação de API. -E provavelmente variarĂĄ muito de um aplicativo para o outro. +E provavelmente variarĂĄ muito de uma aplicação para outra. Poderia ser apenas uma ou duas linhas de cĂłdigo, como: @@ -72,7 +72,7 @@ Ao implementar o callback por conta prĂłpria, vocĂȘ pode usar algo como [HTTPX]( ## Escreva o cĂłdigo de documentação do callback { #write-the-callback-documentation-code } -Esse cĂłdigo nĂŁo serĂĄ executado em seu aplicativo, nĂłs sĂł precisamos dele para *documentar* como essa *API externa* deveria ser. +Esse cĂłdigo nĂŁo serĂĄ executado em sua aplicação, nĂłs sĂł precisamos dele para *documentar* como essa *API externa* deveria ser. Mas, vocĂȘ jĂĄ sabe como criar facilmente documentação automĂĄtica para uma API com o **FastAPI**. @@ -105,7 +105,7 @@ Ela deve parecer exatamente como uma *operação de rota* normal do FastAPI: HĂĄ 2 diferenças principais de uma *operação de rota* normal: -* Ela nĂŁo necessita ter nenhum cĂłdigo real, porque seu aplicativo nunca chamarĂĄ esse cĂłdigo. Ele Ă© usado apenas para documentar a *API externa*. EntĂŁo, a função poderia ter apenas `pass`. +* Ela nĂŁo necessita ter nenhum cĂłdigo real, porque sua aplicação nunca chamarĂĄ esse cĂłdigo. Ele Ă© usado apenas para documentar a *API externa*. EntĂŁo, a função poderia ter apenas `pass`. * O *path* pode conter uma [expressĂŁo OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (veja mais abaixo) em que pode usar variĂĄveis com parĂąmetros e partes do request original enviado para *sua API*. ### A expressĂŁo do path do callback { #the-callback-path-expression } @@ -163,23 +163,23 @@ Perceba como a URL de callback usada contĂ©m a URL recebida como um parĂąmetro d /// -### Adicione o roteador de callback { #add-the-callback-router } +### Adicione o router de callback { #add-the-callback-router } -Nesse ponto vocĂȘ tem a(s) *operação(Ă”es) de rota de callback* necessĂĄria(s) (a(s) que o *desenvolvedor externo* deveria implementar na *API externa*) no roteador de callback que vocĂȘ criou acima. +Nesse ponto vocĂȘ tem a(s) *operação(Ă”es) de rota de callback* necessĂĄria(s) (a(s) que o *desenvolvedor externo* deveria implementar na *API externa*) no router de callback que vocĂȘ criou acima. -Agora use o parĂąmetro `callbacks` no decorador da *operação de rota da sua API* para passar o atributo `.routes` do roteador de callback: +Agora use o parĂąmetro `callbacks` no decorador da *operação de rota da sua API* para passar o atributo `.routes` desse router de callback: {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *} /// tip | Dica -Perceba que vocĂȘ nĂŁo estĂĄ passando o roteador em si (`invoices_callback_router`) para `callbacks=`, mas o atributo `.routes`, como em `invoices_callback_router.routes`. O FastAPI usarĂĄ essas rotas para gerar a documentação OpenAPI do callback. +Perceba que vocĂȘ nĂŁo estĂĄ passando o router em si (`invoices_callback_router`) para `callbacks=`, mas seu `.routes`, como em `invoices_callback_router.routes`. FastAPI usarĂĄ essas rotas para gerar a documentação OpenAPI do callback. /// ### Verifique a documentação { #check-the-docs } -Agora vocĂȘ pode iniciar seu aplicativo e ir para [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). +Agora vocĂȘ pode iniciar sua aplicação e ir para [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). VocĂȘ verĂĄ sua documentação incluindo uma seção "Callbacks" para sua *operação de rota* que mostra como a *API externa* deveria ser: diff --git a/docs/pt/docs/advanced/response-change-status-code.md b/docs/pt/docs/advanced/response-change-status-code.md index 44ca6062a..1e902338b 100644 --- a/docs/pt/docs/advanced/response-change-status-code.md +++ b/docs/pt/docs/advanced/response-change-status-code.md @@ -18,7 +18,7 @@ Para estes casos, vocĂȘ pode utilizar um parĂąmetro `Response`. VocĂȘ pode declarar um parĂąmetro do tipo `Response` em sua *função de operação de rota* (assim como vocĂȘ pode fazer para cookies e headers). -E entĂŁo vocĂȘ pode definir o `status_code` neste objeto de retorno *temporal*. +E entĂŁo vocĂȘ pode definir o `status_code` neste objeto de retorno *temporĂĄrio*. {* ../../docs_src/response_change_status_code/tutorial001_py310.py hl[1,9,12] *} @@ -26,6 +26,6 @@ E entĂŁo vocĂȘ pode retornar qualquer objeto que vocĂȘ precise, como vocĂȘ faria E se vocĂȘ declarar um `response_model`, ele ainda serĂĄ utilizado para filtrar e converter o objeto que vocĂȘ retornou. -O **FastAPI** utilizarĂĄ este retorno *temporal* para extrair o cĂłdigo de status (e tambĂ©m cookies e headers), e irĂĄ colocĂĄ-los no retorno final que contĂ©m o valor que vocĂȘ retornou, filtrado por qualquer `response_model`. +O **FastAPI** utilizarĂĄ este retorno *temporĂĄrio* para extrair o cĂłdigo de status (e tambĂ©m cookies e headers), e irĂĄ colocĂĄ-los no retorno final que contĂ©m o valor que vocĂȘ retornou, filtrado por qualquer `response_model`. VocĂȘ tambĂ©m pode declarar o parĂąmetro `Response` nas dependĂȘncias, e definir o cĂłdigo de status nelas. Mas lembre-se que o Ășltimo que for definido Ă© o que prevalecerĂĄ. diff --git a/docs/pt/docs/advanced/response-cookies.md b/docs/pt/docs/advanced/response-cookies.md index 691bd1b9c..e77502750 100644 --- a/docs/pt/docs/advanced/response-cookies.md +++ b/docs/pt/docs/advanced/response-cookies.md @@ -30,7 +30,7 @@ EntĂŁo, defina os cookies nela e a retorne: Lembre-se de que se vocĂȘ retornar uma resposta diretamente em vez de usar o parĂąmetro `Response`, FastAPI a retornarĂĄ diretamente. -Portanto, vocĂȘ terĂĄ que garantir que seus dados sejam do tipo correto. E.g. serĂĄ compatĂ­vel com JSON se vocĂȘ estiver retornando um `JSONResponse`. +Portanto, vocĂȘ terĂĄ que garantir que seus dados sejam do tipo correto. Por exemplo, serĂĄ compatĂ­vel com JSON se vocĂȘ estiver retornando um `JSONResponse`. E tambĂ©m que vocĂȘ nĂŁo esteja enviando nenhum dado que deveria ter sido filtrado por um `response_model`. diff --git a/docs/pt/docs/advanced/response-headers.md b/docs/pt/docs/advanced/response-headers.md index 7235b5eb8..08a1b6708 100644 --- a/docs/pt/docs/advanced/response-headers.md +++ b/docs/pt/docs/advanced/response-headers.md @@ -1,5 +1,6 @@ # Cabeçalhos de resposta { #response-headers } + ## Use um parĂąmetro `Response` { #use-a-response-parameter } VocĂȘ pode declarar um parĂąmetro do tipo `Response` na sua *função de operação de rota* (assim como vocĂȘ pode fazer para cookies). diff --git a/docs/pt/docs/advanced/security/oauth2-scopes.md b/docs/pt/docs/advanced/security/oauth2-scopes.md index 9dfa6aaf6..b0b9e8348 100644 --- a/docs/pt/docs/advanced/security/oauth2-scopes.md +++ b/docs/pt/docs/advanced/security/oauth2-scopes.md @@ -2,9 +2,9 @@ VocĂȘ pode utilizar escopos do OAuth2 diretamente com o **FastAPI**, eles sĂŁo integrados para funcionar perfeitamente. -Isso permitiria que vocĂȘ tivesse um sistema de permissionamento mais refinado, seguindo o padrĂŁo do OAuth2 integrado na sua aplicação OpenAPI (e as documentaçÔes da API). +Isso permitiria que vocĂȘ tivesse um sistema de permissionamento mais refinado, seguindo o padrĂŁo OAuth2, integrado na sua aplicação OpenAPI (e a documentação da API). -OAuth2 com escopos Ă© o mecanismo utilizado por muitos provedores de autenticação, como o Facebook, Google, GitHub, Microsoft, X (Twitter), etc. Eles utilizam isso para prover permissĂ”es especĂ­ficas para os usuĂĄrios e aplicaçÔes. +OAuth2 com escopos Ă© o mecanismo utilizado por muitos grandes provedores de autenticação, como o Facebook, Google, GitHub, Microsoft, X (Twitter), etc. Eles utilizam isso para prover permissĂ”es especĂ­ficas para os usuĂĄrios e aplicaçÔes. Toda vez que vocĂȘ "se autentica com" Facebook, Google, GitHub, Microsoft, X (Twitter), aquela aplicação estĂĄ utilizando o OAuth2 com escopos. @@ -34,7 +34,7 @@ O conteĂșdo de cada uma dessas strings pode ter qualquer formato, mas nĂŁo devem Estes escopos representam "permissĂ”es". -No OpenAPI (e.g. os documentos da API), vocĂȘ pode definir "esquemas de segurança". +No OpenAPI (por exemplo, a documentação da API), vocĂȘ pode definir "esquemas de segurança". Quando um desses esquemas de segurança utiliza OAuth2, vocĂȘ pode tambĂ©m declarar e utilizar escopos. @@ -42,7 +42,7 @@ Cada "escopo" Ă© apenas uma string (sem espaços). Eles sĂŁo normalmente utilizados para declarar permissĂ”es de segurança especĂ­ficas, como por exemplo: -* `users:read` or `users:write` sĂŁo exemplos comuns. +* `users:read` ou `users:write` sĂŁo exemplos comuns. * `instagram_basic` Ă© utilizado pelo Facebook / Instagram. * `https://www.googleapis.com/auth/drive` Ă© utilizado pelo Google. @@ -60,7 +60,7 @@ Para o OAuth2, eles sĂŁo apenas strings. ## VisĂŁo global { #global-view } -Primeiro, vamos olhar rapidamente as partes que mudam dos exemplos do **Tutorial - Guia de UsuĂĄrio** para [OAuth2 com Senha (e hash), Bearer com tokens JWT](../../tutorial/security/oauth2-jwt.md). Agora utilizando escopos OAuth2: +Primeiro, vamos olhar rapidamente as partes que mudam dos exemplos no **Tutorial - Guia de UsuĂĄrio** principal para [OAuth2 com Senha (e hash), Bearer com tokens JWT](../../tutorial/security/oauth2-jwt.md). Agora utilizando escopos OAuth2: {* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *} @@ -74,7 +74,7 @@ O parĂąmetro `scopes` recebe um `dict` contendo cada escopo como chave e a descr {* ../../docs_src/security/tutorial005_an_py310.py hl[63:66] *} -Pelo motivo de estarmos declarando estes escopos, eles aparecerĂŁo nos documentos da API quando vocĂȘ se autenticar/autorizar. +Pelo motivo de estarmos declarando estes escopos, eles aparecerĂŁo na documentação da API quando vocĂȘ se autenticar/autorizar. E vocĂȘ poderĂĄ selecionar quais escopos vocĂȘ deseja dar acesso: `me` e `items`. @@ -108,7 +108,7 @@ Para isso, nĂłs importamos e utilizamos `Security` de `fastapi`. VocĂȘ pode utilizar `Security` para declarar dependĂȘncias (assim como `Depends`), porĂ©m o `Security` tambĂ©m recebe o parĂąmetro `scopes` com uma lista de escopos (strings). -Neste caso, nĂłs passamos a função `get_current_active_user` como dependĂȘncia para `Security` (da mesma forma que nĂłs farĂ­amos com `Depends`). +Neste caso, nĂłs passamos a função de dependĂȘncia `get_current_active_user` para `Security` (da mesma forma que nĂłs farĂ­amos com `Depends`). Mas nĂłs tambĂ©m passamos uma `list` de escopos, neste caso com apenas um escopo: `items` (poderia ter mais). @@ -142,7 +142,7 @@ Agora atualize a dependĂȘncia `get_current_user`. Este Ă© o usado pelas dependĂȘncias acima. -Aqui Ă© onde estamos utilizando o mesmo esquema OAuth2 que nĂłs declaramos antes, declarando-o como uma dependĂȘncia: `oauth2_scheme`. +Aqui Ă© onde estamos utilizando o mesmo esquema OAuth2 que nĂłs criamos antes, declarando-o como uma dependĂȘncia: `oauth2_scheme`. Porque esta função de dependĂȘncia nĂŁo possui nenhum requerimento de escopo, nĂłs podemos utilizar `Depends` com o `oauth2_scheme`. NĂłs nĂŁo precisamos utilizar `Security` quando nĂłs nĂŁo precisamos especificar escopos de segurança. @@ -235,7 +235,7 @@ Todos eles serĂŁo validados independentemente para cada *operação de rota*. ## Verifique { #check-it } -Se vocĂȘ abrir os documentos da API, vocĂȘ pode autenticar e especificar quais escopos vocĂȘ quer autorizar. +Se vocĂȘ abrir a documentação da API, vocĂȘ pode autenticar e especificar quais escopos vocĂȘ quer autorizar. @@ -249,11 +249,11 @@ Isso Ă© o que aconteceria se uma aplicação terceira que tentou acessar uma des Neste exemplo nĂłs estamos utilizando o fluxo de senha do OAuth2. -Isso Ă© apropriado quando nĂłs estamos autenticando em nossa prĂłpria aplicação, provavelmente com o nosso prĂłprio "*frontend*". +Isso Ă© apropriado quando nĂłs estamos autenticando em nossa prĂłpria aplicação, provavelmente com o nosso prĂłprio frontend. Porque nĂłs podemos confiar nele para receber o `username` e o `password`, pois nĂłs controlamos isso. -Mas se nĂłs estamos construindo uma aplicação OAuth2 que outros poderiam conectar (i.e., se vocĂȘ estĂĄ construindo um provedor de autenticação equivalente ao Facebook, Google, GitHub, etc.) vocĂȘ deveria utilizar um dos outros fluxos. +Mas se nĂłs estamos construindo uma aplicação OAuth2 que outros poderiam conectar (ou seja, se vocĂȘ estĂĄ construindo um provedor de autenticação equivalente ao Facebook, Google, GitHub, etc.) vocĂȘ deveria utilizar um dos outros fluxos. O mais comum Ă© o fluxo implĂ­cito. diff --git a/docs/pt/docs/advanced/settings.md b/docs/pt/docs/advanced/settings.md index 371d5711b..029290aed 100644 --- a/docs/pt/docs/advanced/settings.md +++ b/docs/pt/docs/advanced/settings.md @@ -1,5 +1,6 @@ # ConfiguraçÔes e VariĂĄveis de Ambiente { #settings-and-environment-variables } + Em muitos casos, sua aplicação pode precisar de configuraçÔes externas, por exemplo chaves secretas, credenciais de banco de dados, credenciais para serviços de e-mail, etc. A maioria dessas configuraçÔes Ă© variĂĄvel (pode mudar), como URLs de banco de dados. E muitas podem ser sensĂ­veis, como segredos. diff --git a/docs/pt/docs/advanced/stream-data.md b/docs/pt/docs/advanced/stream-data.md index c71d2ca42..1a9284a91 100644 --- a/docs/pt/docs/advanced/stream-data.md +++ b/docs/pt/docs/advanced/stream-data.md @@ -2,7 +2,7 @@ Se vocĂȘ quer transmitir dados que podem ser estruturados como JSON, vocĂȘ deveria [Transmitir JSON Lines](../tutorial/stream-json-lines.md). -Mas se vocĂȘ quer transmitir dados binĂĄrios puros ou strings, veja como fazer. +Mas se vocĂȘ quer **transmitir dados binĂĄrios puros** ou strings, veja como fazer. /// note | Nota @@ -12,15 +12,15 @@ Adicionado no FastAPI 0.134.0. ## Casos de uso { #use-cases } -VocĂȘ pode usar isto para transmitir strings puras, por exemplo diretamente da saĂ­da de um serviço de AI LLM. +VocĂȘ pode usar isto para transmitir strings puras, por exemplo diretamente da saĂ­da de um serviço de **AI LLM**. -VocĂȘ tambĂ©m pode usĂĄ-lo para transmitir arquivos binĂĄrios grandes, enviando cada bloco de dados Ă  medida que o lĂȘ, sem precisar carregar tudo na memĂłria de uma vez. +VocĂȘ tambĂ©m pode usĂĄ-lo para transmitir **arquivos binĂĄrios grandes**, enviando cada bloco de dados Ă  medida que o lĂȘ, sem precisar carregar tudo na memĂłria de uma vez. -VocĂȘ tambĂ©m pode transmitir vĂ­deo ou ĂĄudio desta forma; pode atĂ© ser gerado enquanto vocĂȘ processa e envia. +VocĂȘ tambĂ©m pode transmitir **vĂ­deo** ou **ĂĄudio** desta forma; pode atĂ© ser gerado enquanto vocĂȘ processa e envia. ## Um `StreamingResponse` com `yield` { #a-streamingresponse-with-yield } -Se vocĂȘ declarar `response_class=StreamingResponse` na sua função de operação de rota, vocĂȘ pode usar `yield` para enviar cada bloco de dados em sequĂȘncia. +Se vocĂȘ declarar `response_class=StreamingResponse` na sua *função de operação de rota*, vocĂȘ pode usar `yield` para enviar cada bloco de dados em sequĂȘncia. {* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *} @@ -40,7 +40,7 @@ Como o FastAPI nĂŁo tentarĂĄ converter os dados para JSON com Pydantic nem seria {* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} -Isso tambĂ©m significa que, com `StreamingResponse`, vocĂȘ tem a liberdade e a responsabilidade de produzir e codificar os bytes exatamente como precisam ser enviados, independentemente das anotaçÔes de tipo. đŸ€“ +Isso tambĂ©m significa que, com `StreamingResponse`, vocĂȘ tem a **liberdade** e a **responsabilidade** de produzir e codificar os bytes exatamente como precisam ser enviados, independentemente das anotaçÔes de tipo. đŸ€“ ### Transmitir bytes { #stream-bytes } @@ -50,7 +50,7 @@ Um dos principais casos de uso Ă© transmitir `bytes` em vez de strings; vocĂȘ po ## Um `PNGStreamingResponse` personalizado { #a-custom-pngstreamingresponse } -Nos exemplos acima, os bytes eram transmitidos, mas a resposta nĂŁo tinha um cabeçalho `Content-Type`, entĂŁo o cliente nĂŁo sabia que tipo de dado estava recebendo. +Nos exemplos acima, os bytes eram transmitidos, mas a response nĂŁo tinha um cabeçalho `Content-Type`, entĂŁo o cliente nĂŁo sabia que tipo de dado estava recebendo. VocĂȘ pode criar uma subclasse personalizada de `StreamingResponse` que define o cabeçalho `Content-Type` para o tipo de dado que vocĂȘ estĂĄ transmitindo. @@ -58,7 +58,7 @@ Por exemplo, vocĂȘ pode criar um `PNGStreamingResponse` que define o cabeçalho {* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} -Em seguida, vocĂȘ pode usar essa nova classe em `response_class=PNGStreamingResponse` na sua função de operação de rota: +Em seguida, vocĂȘ pode usar essa nova classe em `response_class=PNGStreamingResponse` na sua *função de operação de rota*: {* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} @@ -78,7 +78,7 @@ Apenas para que possa viver no mesmo arquivo deste exemplo e vocĂȘ possa copiar /// -Ao usar um bloco `with`, garantimos que o objeto semelhante a arquivo seja fechado apĂłs a função geradora (a função com `yield`) terminar. Ou seja, apĂłs terminar de enviar a resposta. +Ao usar um bloco `with`, garantimos que o objeto semelhante a arquivo seja fechado apĂłs a função geradora (a função com `yield`) terminar. Ou seja, apĂłs terminar de enviar a response. Isso nĂŁo seria tĂŁo importante neste exemplo especĂ­fico porque Ă© um arquivo falso em memĂłria (com `io.BytesIO`), mas com um arquivo real, seria importante garantir que o arquivo fosse fechado ao final do trabalho. @@ -98,7 +98,7 @@ Mas, em muitos casos, ler um arquivo ou um objeto semelhante a arquivo bloqueari /// -Para evitar bloquear o loop de eventos, vocĂȘ pode simplesmente declarar a função de operação de rota com `def` normal em vez de `async def`. Assim, o FastAPI a executarĂĄ em um worker de threadpool, evitando bloquear o loop principal. +Para evitar bloquear o loop de eventos, vocĂȘ pode simplesmente declarar a *função de operação de rota* com `def` normal em vez de `async def`. Assim, o FastAPI a executarĂĄ em um worker de threadpool, evitando bloquear o loop principal. {* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} diff --git a/docs/pt/docs/advanced/wsgi.md b/docs/pt/docs/advanced/wsgi.md index 30e8a3b2c..fafa147fa 100644 --- a/docs/pt/docs/advanced/wsgi.md +++ b/docs/pt/docs/advanced/wsgi.md @@ -1,5 +1,6 @@ # Adicionando WSGI - Flask, Django, entre outros { #including-wsgi-flask-django-others } + Como vocĂȘ viu em [SubaplicaçÔes - Montagens](sub-applications.md) e [AtrĂĄs de um Proxy](behind-a-proxy.md), vocĂȘ pode montar aplicaçÔes WSGI. Para isso, vocĂȘ pode utilizar o `WSGIMiddleware` para encapsular a sua aplicação WSGI, como por exemplo Flask, Django, etc. diff --git a/docs/pt/docs/alternatives.md b/docs/pt/docs/alternatives.md index b32b260c3..8a63a3073 100644 --- a/docs/pt/docs/alternatives.md +++ b/docs/pt/docs/alternatives.md @@ -18,13 +18,13 @@ Mas em algum momento, nĂŁo havia outra opção senĂŁo criar algo que fornecesse É o framework Python mais popular e amplamente confiĂĄvel. É utilizado para construir sistemas como o Instagram. -É relativamente bem acoplado com bancos de dados relacionais (como MySQL ou PostgreSQL), entĂŁo, ter um banco de dados NoSQL (como Couchbase, MongoDB, Cassandra, etc.) como mecanismo principal de armazenamento nĂŁo Ă© muito fĂĄcil. +É relativamente fortemente acoplado com bancos de dados relacionais (como MySQL ou PostgreSQL), entĂŁo, ter um banco de dados NoSQL (como Couchbase, MongoDB, Cassandra, etc.) como mecanismo principal de armazenamento nĂŁo Ă© muito fĂĄcil. Foi criado para gerar o HTML no backend, nĂŁo para criar APIs usadas por um frontend moderno (como React, Vue.js e Angular) ou por outros sistemas (como dispositivos IoT) comunicando com ele. ### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework } -Django REST framework foi criado para ser uma caixa de ferramentas flexĂ­vel para construção de APIs Web utilizando Django por baixo, para melhorar suas capacidades de API. +Django REST Framework foi criado para ser uma caixa de ferramentas flexĂ­vel para construção de APIs Web utilizando Django por baixo, para melhorar suas capacidades de API. Ele Ă© utilizado por muitas empresas incluindo Mozilla, Red Hat e Eventbrite. @@ -88,7 +88,7 @@ O jeito de usar Ă© muito simples. Por exemplo, para fazer uma requisição `GET` response = requests.get("http://example.com/some/url") ``` -A contra-parte na aplicação FastAPI, a operação de rota, poderia ficar assim: +A *operação de rota* da API equivalente no FastAPI poderia ficar assim: ```Python hl_lines="1" @app.get("/some/url") @@ -377,7 +377,7 @@ Agora APIStar Ă© um conjunto de ferramentas para validar especificaçÔes OpenAP /// note | Nota -APIStar foi criado por Tom Christie. O mesmo cara que criou: +APIStar foi criado por Tom Christie. A mesma pessoa que criou: * Django REST Framework * Starlette (no qual **FastAPI** Ă© baseado) diff --git a/docs/pt/docs/async.md b/docs/pt/docs/async.md index 8c497d451..3fa92b085 100644 --- a/docs/pt/docs/async.md +++ b/docs/pt/docs/async.md @@ -44,11 +44,11 @@ Se sua aplicação (de alguma forma) nĂŁo tem que se comunicar com nada mais e e --- -Se vocĂȘ simplesmente nĂŁo sabe, use apenas `def`. +Se vocĂȘ simplesmente nĂŁo sabe, use `def` normal. --- -**Note**: VocĂȘ pode misturar `def` e `async def` nas suas *funçÔes de operação de rota* tanto quanto necessĂĄrio e definir cada função usando a melhor opção para vocĂȘ. FastAPI irĂĄ fazer a coisa certa com elas. +**Nota**: VocĂȘ pode misturar `def` e `async def` nas suas *funçÔes de operação de rota* tanto quanto necessĂĄrio e definir cada função usando a melhor opção para vocĂȘ. FastAPI irĂĄ fazer a coisa certa com elas. De qualquer forma, em ambos os casos acima, FastAPI irĂĄ trabalhar assincronamente e ser extremamente rĂĄpido. @@ -82,10 +82,10 @@ Esse "esperar por algo" normalmente se refere a operaçÔes I/O, essas operaçÔes sĂŁo chamadas operaçÔes "limitadas por I/O". +Como o tempo de execução Ă© consumido majoritariamente pela espera de operaçÔes I/O, essas operaçÔes sĂŁo chamadas operaçÔes "limitadas por I/O". Isso Ă© chamado de "assĂ­ncrono" porque o computador / programa nĂŁo tem que ser "sincronizado" com a tarefa lenta, esperando pelo momento exato em que a tarefa finaliza, enquanto nĂŁo faz nada, para ser capaz de pegar o resultado da tarefa e dar continuidade ao trabalho. @@ -109,7 +109,7 @@ VocĂȘ vai com seu _crush_ na lanchonete, e fica na fila enquanto o caixa pega os -EntĂŁo chega a sua vez, vocĂȘ pede dois saborosos hambĂșrgueres para vocĂȘ e seu _crush_. 🍔🍔 +EntĂŁo chega a sua vez, vocĂȘ pede dois saborosos hambĂșrgueres para vocĂȘ e seu _crush_. 🍔🍔 @@ -189,17 +189,17 @@ VocĂȘ espera, na frente do balcĂŁo 🕙, para que ninguĂ©m pegue seus hambĂșrgue Como vocĂȘ e seu _crush_ estĂŁo ocupados nĂŁo permitindo que ninguĂ©m passe na frente e pegue seus hambĂșrgueres assim que estiverem prontos, vocĂȘ nĂŁo pode dar atenção ao seu _crush_. 😞 -Isso Ă© trabalho "sĂ­ncrono", vocĂȘ estĂĄ "sincronizado" com o caixa / cozinheiro 👹‍🍳. VocĂȘ tem que esperar 🕙 e estar lĂĄ no exato momento que o caixa / cozinheiro 👹‍🍳 terminar os hambĂșrgueres e os der a vocĂȘ, ou entĂŁo, outro alguĂ©m pode pegĂĄ-los. +Isso Ă© trabalho "sĂ­ncrono", vocĂȘ estĂĄ "sincronizado" com o caixa/cozinheiro 👹‍🍳. VocĂȘ tem que esperar 🕙 e estar lĂĄ no exato momento que o caixa/cozinheiro 👹‍🍳 terminar os hambĂșrgueres e os der a vocĂȘ, ou entĂŁo, outro alguĂ©m pode pegĂĄ-los. -EntĂŁo seu caixa / cozinheiro 👹‍🍳 finalmente volta com seus hambĂșrgueres, depois de um longo tempo esperando 🕙 por eles em frente ao balcĂŁo. +EntĂŁo seu caixa/cozinheiro 👹‍🍳 finalmente volta com seus hambĂșrgueres, depois de um longo tempo esperando 🕙 por eles em frente ao balcĂŁo. VocĂȘ pega seus hambĂșrgueres e vai para a mesa com seu _crush_. -VocĂȘs comem os hambĂșrgueres, e o trabalho estĂĄ terminado. âč +VocĂȘs apenas os comem, e o trabalho estĂĄ terminado. âč @@ -213,15 +213,15 @@ Belas ilustraçÔes de [Ketrina Thompson](https://www.instagram.com/ketrinadraws --- -Nesse cenĂĄrio dos hambĂșrgueres paralelos, vocĂȘ Ă© um computador / programa đŸ€– com dois processadores (vocĂȘ e seu _crush_), ambos esperando 🕙 e dedicando sua atenção ⏯ "esperando no balcĂŁo" 🕙 por um bom tempo. +Nesse cenĂĄrio dos hambĂșrgueres paralelos, vocĂȘ Ă© um computador / programa đŸ€– com dois processadores (vocĂȘ e seu _crush_), ambos esperando 🕙 e dedicando sua atenção ⏯ a "esperar no balcĂŁo" 🕙 por um bom tempo. -A lanchonete paralela tem 8 processadores (caixas / cozinheiros), enquanto a lanchonete dos hambĂșrgueres concorrentes tinha apenas 2 (um caixa e um cozinheiro). +A lanchonete tem 8 processadores (caixas/cozinheiros). Enquanto a lanchonete dos hambĂșrgueres concorrentes poderia ter apenas 2 (um caixa e um cozinheiro). Ainda assim, a experiĂȘncia final nĂŁo foi a melhor. 😞 --- -Essa seria o equivalente paralelo Ă  histĂłria dos hambĂșrgueres. 🍔 +Essa seria a histĂłria equivalente paralela para hambĂșrgueres. 🍔 Para um exemplo "mais real", imagine um banco. @@ -231,15 +231,15 @@ Todos os caixas fazendo todo o trabalho, um cliente apĂłs o outro đŸ‘šâ€đŸ’ŒâŻ E vocĂȘ tinha que esperar 🕙 na fila por um longo tempo ou poderia perder a vez. -VocĂȘ provavelmente nĂŁo gostaria de levar seu _crush_ 😍 com vocĂȘ para um rolezinho no banco 🏩. +VocĂȘ provavelmente nĂŁo gostaria de levar seu _crush_ 😍 com vocĂȘ para resolver assuntos no banco 🏩. ### ConclusĂŁo dos hambĂșrgueres { #burger-conclusion } -Nesse cenĂĄrio dos "hambĂșrgueres com seu _crush_", como tem muita espera, faz mais sentido ter um sistema concorrente ⏾🔀⏯. +Nesse cenĂĄrio dos "hambĂșrgueres de fast food com seu _crush_", como tem muita espera 🕙, faz mais sentido ter um sistema concorrente ⏾🔀⏯. Esse Ă© o caso da maioria das aplicaçÔes web. -Muitos, muitos usuĂĄrios, mas seu servidor estĂĄ esperando 🕙 pela sua conexĂŁo nĂŁo tĂŁo boa enviar suas requisiçÔes. +Muitos, muitos usuĂĄrios, mas seu servidor estĂĄ esperando 🕙 pela conexĂŁo nĂŁo tĂŁo boa deles enviar suas requisiçÔes. E entĂŁo esperando 🕙 novamente as respostas voltarem. @@ -269,11 +269,11 @@ EntĂŁo, para equilibrar tudo, imagine a seguinte historinha: NĂŁo hĂĄ espera 🕙 em lugar algum, apenas um monte de trabalho para ser feito, em mĂșltiplos cĂŽmodos da casa. -VocĂȘ poderia ter turnos como no exemplo dos hambĂșrgueres, primeiro a sala de estar, entĂŁo a cozinha, mas como vocĂȘ nĂŁo estĂĄ esperando por nada, apenas limpando e limpando, as chamadas nĂŁo afetariam em nada. +VocĂȘ poderia ter turnos como no exemplo dos hambĂșrgueres, primeiro a sala de estar, entĂŁo a cozinha, mas como vocĂȘ nĂŁo estĂĄ esperando 🕙 por nada, apenas limpando e limpando, as chamadas nĂŁo afetariam em nada. Levaria o mesmo tempo para finalizar com ou sem turnos (concorrĂȘncia) e vocĂȘ teria feito o mesmo tanto de trabalho. -Mas nesse caso, se vocĂȘ trouxesse os 8 ex-caixas / cozinheiros / agora-faxineiros, e cada um deles (mais vocĂȘ) pudessem dividir a casa para limpĂĄ-la, vocĂȘs fariam toda a limpeza em **paralelo**, com a ajuda extra, e terminariam muito mais cedo. +Mas nesse caso, se vocĂȘ trouxesse os 8 ex-caixas/cozinheiros/agora-faxineiros, e cada um deles (mais vocĂȘ) pudessem dividir a casa para limpĂĄ-la, vocĂȘs fariam toda a limpeza em **paralelo**, com a ajuda extra, e terminariam muito mais cedo. Nesse cenĂĄrio, cada um dos faxineiros (incluindo vocĂȘ) poderia ser um processador, fazendo a sua parte do trabalho. @@ -285,18 +285,18 @@ Exemplos comuns de operaçÔes limitadas por CPU sĂŁo coisas que exigem processa Por exemplo: -* **Processamento de ĂĄudio** ou **imagem** -* **VisĂŁo Computacional**: uma imagem Ă© composta por milhĂ”es de pixels, cada pixel tem 3 valores / cores, processar isso normalmente exige alguma computação em todos esses pixels ao mesmo tempo -* **Aprendizado de MĂĄquina**: Normalmente exige muita multiplicação de matrizes e vetores. Pense numa grande planilha com nĂșmeros e em multiplicar todos eles juntos e ao mesmo tempo. -* **Deep Learning**: Esse Ă© um subcampo do Aprendizado de MĂĄquina, entĂŁo, o mesmo se aplica. A diferença Ă© que nĂŁo hĂĄ apenas uma grande planilha com nĂșmeros para multiplicar, mas um grande conjunto delas, e em muitos casos, vocĂȘ utiliza um processador especial para construir e/ou usar esses modelos. +* **Processamento de ĂĄudio** ou **imagem**. +* **VisĂŁo Computacional**: uma imagem Ă© composta por milhĂ”es de pixels, cada pixel tem 3 valores / cores, processar isso normalmente exige alguma computação nesses pixels, todos ao mesmo tempo. +* **Aprendizado de MĂĄquina**: normalmente exige muita multiplicação de "matrizes" e "vetores". Pense numa grande planilha com nĂșmeros e em multiplicar todos eles juntos e ao mesmo tempo. +* **Deep Learning**: esse Ă© um subcampo do Aprendizado de MĂĄquina, entĂŁo, o mesmo se aplica. A diferença Ă© que nĂŁo hĂĄ apenas uma planilha com nĂșmeros para multiplicar, mas um grande conjunto delas, e em muitos casos, vocĂȘ utiliza um processador especial para construir e / ou usar esses modelos. ### ConcorrĂȘncia + Paralelismo: Web + Aprendizado de MĂĄquina { #concurrency-parallelism-web-machine-learning } Com **FastAPI** vocĂȘ pode levar a vantagem da concorrĂȘncia que Ă© muito comum para desenvolvimento web (o mesmo atrativo de NodeJS). -Mas vocĂȘ tambĂ©m pode explorar os benefĂ­cios do paralelismo e multiprocessamento (tendo mĂșltiplos processadores rodando em paralelo) para trabalhos **limitados por CPU** como aqueles em sistemas de Aprendizado de MĂĄquina. +Mas vocĂȘ tambĂ©m pode explorar os benefĂ­cios do paralelismo e multiprocessamento (tendo mĂșltiplos processos rodando em paralelo) para trabalhos **limitados por CPU** como aqueles em sistemas de Aprendizado de MĂĄquina. -Isso, somado ao simples fato que Python Ă© a principal linguagem para **Data Science**, Aprendizado de MĂĄquina e especialmente Deep Learning, faz do FastAPI uma Ăłtima escolha para APIs web e aplicaçÔes com Data Science / Aprendizado de MĂĄquina (entre muitas outras). +Isso, somado ao simples fato que Python Ă© a principal linguagem para **Data Science**, Aprendizado de MĂĄquina e especialmente Deep Learning, faz do FastAPI uma Ăłtima escolha para APIs web e aplicaçÔes de Data Science / Aprendizado de MĂĄquina (entre muitas outras). Para ver como alcançar esse paralelismo em produção veja a seção sobre [Implantação](deployment/index.md). @@ -340,7 +340,7 @@ burgers = get_burgers(2) --- -EntĂŁo, se vocĂȘ estĂĄ usando uma biblioteca que diz que vocĂȘ pode chamĂĄ-la com `await`, vocĂȘ precisa criar as *funçÔes de operação de rota* com `async def`, como em: +EntĂŁo, se vocĂȘ estĂĄ usando uma biblioteca que diz que vocĂȘ pode chamĂĄ-la com `await`, vocĂȘ precisa criar as *funçÔes de operação de rota* que a utilizam com `async def`, como em: ```Python hl_lines="2-3" @app.get('/burgers') @@ -355,9 +355,9 @@ VocĂȘ deve ter observado que `await` pode ser usado somente dentro de funçÔes Mas ao mesmo tempo, funçÔes definidas com `async def` tĂȘm que ser "aguardadas". EntĂŁo, funçÔes com `async def` podem ser chamadas somente dentro de funçÔes definidas com `async def` tambĂ©m. -EntĂŁo, sobre o ovo e a galinha, como vocĂȘ chama a primeira função async? +EntĂŁo, sobre o ovo e a galinha, como vocĂȘ chama a primeira função `async`? -Se vocĂȘ estivar trabalhando com **FastAPI** nĂŁo terĂĄ que se preocupar com isso, porquĂȘ essa "primeira" função serĂĄ a sua *função de operação de rota*, e o FastAPI saberĂĄ como fazer a coisa certa. +Se vocĂȘ estiver trabalhando com **FastAPI** nĂŁo terĂĄ que se preocupar com isso, porquĂȘ essa "primeira" função serĂĄ a sua *função de operação de rota*, e o FastAPI saberĂĄ como fazer a coisa certa. Mas se vocĂȘ quiser usar `async` / `await` sem FastAPI, vocĂȘ tambĂ©m pode fazĂȘ-lo. @@ -423,7 +423,7 @@ Ainda, em ambas as situaçÔes, as chances sĂŁo que o **FastAPI** [ainda serĂĄ m ### DependĂȘncias { #dependencies } -O mesmo se aplica para as [dependĂȘncias](tutorial/dependencies/index.md). Se uma dependĂȘncia tem as funçÔes com padrĂŁo `def` ao invĂ©s de `async def`, ela Ă© rodada no threadpool externo. +O mesmo se aplica para as [dependĂȘncias](tutorial/dependencies/index.md). Se uma dependĂȘncia Ă© uma função `def` padrĂŁo ao invĂ©s de `async def`, ela Ă© rodada no threadpool externo. ### Sub-dependĂȘncias { #sub-dependencies } @@ -435,7 +435,7 @@ Qualquer outra função de utilidade que vocĂȘ chame diretamente pode ser criada Isso estĂĄ em contraste Ă s funçÔes que o FastAPI chama para vocĂȘ: *funçÔes de operação de rota* e dependĂȘncias. -Se sua função de utilidade Ă© uma função normal com `def`, ela serĂĄ chamada diretamente (como vocĂȘ a escreve no cĂłdigo), nĂŁo em uma threadpool, se a função Ă© criada com `async def` entĂŁo vocĂȘ deve esperar por essa função quando vocĂȘ chamĂĄ-la no seu cĂłdigo. +Se sua função de utilidade Ă© uma função normal com `def`, ela serĂĄ chamada diretamente (como vocĂȘ a escreve no cĂłdigo), nĂŁo em uma threadpool, se a função Ă© criada com `async def` entĂŁo vocĂȘ deveria usar `await` nessa função quando vocĂȘ chamĂĄ-la no seu cĂłdigo. --- diff --git a/docs/pt/docs/deployment/cloud.md b/docs/pt/docs/deployment/cloud.md index 4b0eb9553..68a2fd003 100644 --- a/docs/pt/docs/deployment/cloud.md +++ b/docs/pt/docs/deployment/cloud.md @@ -16,7 +16,7 @@ FastAPI Cloud Ă© o patrocinador principal e provedor de financiamento dos projet ## Provedores de Nuvem - Patrocinadores { #cloud-providers-sponsors } -Alguns outros provedores de nuvem ✹ [**patrocinam o FastAPI**](../help-fastapi.md#sponsor-the-author) ✹ tambĂ©m. 🙇 +Alguns outros provedores de nuvem ✹ [**patrocinam o FastAPI**](https://github.com/sponsors/tiangolo) ✹ tambĂ©m. 🙇 VocĂȘ tambĂ©m pode considerĂĄ-los para seguir seus tutoriais e experimentar seus serviços: diff --git a/docs/pt/docs/deployment/concepts.md b/docs/pt/docs/deployment/concepts.md index e6338d5ea..0625c6d64 100644 --- a/docs/pt/docs/deployment/concepts.md +++ b/docs/pt/docs/deployment/concepts.md @@ -1,6 +1,6 @@ # Conceitos de ImplantaçÔes { #deployments-concepts } -Ao implantar um aplicativo **FastAPI**, ou na verdade, qualquer tipo de API da web, hĂĄ vĂĄrios conceitos com os quais vocĂȘ provavelmente se importa e, usando-os, vocĂȘ pode encontrar a maneira **mais apropriada** de **implantar seu aplicativo**. +Ao implantar uma aplicação **FastAPI**, ou na verdade, qualquer tipo de API da web, hĂĄ vĂĄrios conceitos com os quais vocĂȘ provavelmente se importa e, usando-os, vocĂȘ pode encontrar a maneira **mais apropriada** de **implantar sua aplicação**. Alguns dos conceitos importantes sĂŁo: @@ -19,7 +19,7 @@ Vou lhe contar um pouco mais sobre esses **conceitos** aqui, e espero que isso l Ao considerar esses conceitos, vocĂȘ serĂĄ capaz de **avaliar e projetar** a melhor maneira de implantar **suas prĂłprias APIs**. -Nos prĂłximos capĂ­tulos, darei a vocĂȘ mais **receitas concretas** para implantar aplicativos FastAPI. +Nos prĂłximos capĂ­tulos, darei a vocĂȘ mais **receitas concretas** para implantar aplicaçÔes FastAPI. Mas por enquanto, vamos verificar essas importantes **ideias conceituais**. Esses conceitos tambĂ©m se aplicam a qualquer outro tipo de API da web. 💡 @@ -27,7 +27,7 @@ Mas por enquanto, vamos verificar essas importantes **ideias conceituais**. Esse No [capĂ­tulo anterior sobre HTTPS](https.md) aprendemos como o HTTPS fornece criptografia para sua API. -TambĂ©m vimos que o HTTPS normalmente Ă© fornecido por um componente **externo** ao seu servidor de aplicativos, um **Proxy de terminação TLS**. +TambĂ©m vimos que o HTTPS normalmente Ă© fornecido por um componente **externo** ao seu servidor de aplicaçÔes, um **Proxy de terminação TLS**. E tem que haver algo responsĂĄvel por **renovar os certificados HTTPS**, pode ser o mesmo componente ou pode ser algo diferente. @@ -75,7 +75,7 @@ A palavra **processo** normalmente Ă© usada de forma mais especĂ­fica, referindo * Isso nĂŁo se refere ao arquivo, nem ao cĂłdigo, refere-se **especificamente** Ă  coisa que estĂĄ sendo **executada** e gerenciada pelo sistema operacional. * Qualquer programa, qualquer cĂłdigo, **sĂł pode fazer coisas** quando estĂĄ sendo **executado**. EntĂŁo, quando hĂĄ um **processo em execução**. * O processo pode ser **terminado** (ou "morto") por vocĂȘ, ou pelo sistema operacional. Nesse ponto, ele para de rodar/ser executado, e ele **nĂŁo pode mais fazer coisas**. -* Cada aplicativo que vocĂȘ tem em execução no seu computador tem algum processo por trĂĄs dele, cada programa em execução, cada janela, etc. E normalmente hĂĄ muitos processos em execução **ao mesmo tempo** enquanto um computador estĂĄ ligado. +* Cada aplicação que vocĂȘ tem em execução no seu computador tem algum processo por trĂĄs dela, cada programa em execução, cada janela, etc. E normalmente hĂĄ muitos processos em execução **ao mesmo tempo** enquanto um computador estĂĄ ligado. * Pode haver **vĂĄrios processos** do **mesmo programa** em execução ao mesmo tempo. Se vocĂȘ verificar o "gerenciador de tarefas" ou o "monitor do sistema" (ou ferramentas semelhantes) no seu sistema operacional, poderĂĄ ver muitos desses processos em execução. @@ -104,11 +104,11 @@ E se o servidor for reiniciado (por exemplo, apĂłs atualizaçÔes ou migraçÔes ### Executar automaticamente na inicialização { #run-automatically-on-startup } -Em geral, vocĂȘ provavelmente desejarĂĄ que o programa do servidor (por exemplo, Uvicorn) seja iniciado automaticamente na inicialização do servidor e, sem precisar de nenhuma **intervenção humana**, tenha um processo sempre em execução com sua API (por exemplo, Uvicorn executando seu aplicativo FastAPI). +Em geral, vocĂȘ provavelmente desejarĂĄ que o programa do servidor (por exemplo, Uvicorn) seja iniciado automaticamente na inicialização do servidor e, sem precisar de nenhuma **intervenção humana**, tenha um processo sempre em execução com sua API (por exemplo, Uvicorn executando sua aplicação FastAPI). ### Programa separado { #separate-program } -Para conseguir isso, vocĂȘ normalmente terĂĄ um **programa separado** que garantiria que seu aplicativo fosse executado na inicialização. E em muitos casos, ele tambĂ©m garantiria que outros componentes ou aplicativos tambĂ©m fossem executados, por exemplo, um banco de dados. +Para conseguir isso, vocĂȘ normalmente terĂĄ um **programa separado** que garantiria que sua aplicação fosse executada na inicialização. E em muitos casos, ele tambĂ©m garantiria que outros componentes ou aplicaçÔes tambĂ©m fossem executados, por exemplo, um banco de dados. ### Ferramentas de exemplo para executar na inicialização { #example-tools-to-run-at-startup } @@ -127,7 +127,7 @@ Darei exemplos mais concretos nos prĂłximos capĂ­tulos. ## ReinicializaçÔes { #restarts } -Semelhante a garantir que seu aplicativo seja executado na inicialização, vocĂȘ provavelmente tambĂ©m deseja garantir que ele seja **reiniciado** apĂłs falhas. +Semelhante a garantir que sua aplicação seja executada na inicialização, vocĂȘ provavelmente tambĂ©m deseja garantir que ela seja **reiniciada** apĂłs falhas. ### NĂłs cometemos erros { #we-make-mistakes } @@ -137,15 +137,15 @@ E nĂłs, como desenvolvedores, continuamos aprimorando o cĂłdigo Ă  medida que en ### Pequenos erros sĂŁo tratados automaticamente { #small-errors-automatically-handled } -Ao criar APIs da web com FastAPI, se houver um erro em nosso cĂłdigo, o FastAPI normalmente o conterĂĄ na Ășnica solicitação que acionou o erro. 🛡 +Ao criar APIs da web com FastAPI, se houver um erro em nosso cĂłdigo, o FastAPI normalmente o conterĂĄ na Ășnica request que acionou o erro. 🛡 -O cliente receberĂĄ um **Erro Interno do Servidor 500** para essa solicitação, mas o aplicativo continuarĂĄ funcionando para as prĂłximas solicitaçÔes em vez de travar completamente. +O cliente receberĂĄ um **Erro Interno do Servidor 500** para essa request, mas a aplicação continuarĂĄ funcionando para as prĂłximas requests em vez de travar completamente. ### Erros maiores - Travamentos { #bigger-errors-crashes } -No entanto, pode haver casos em que escrevemos algum cĂłdigo que **trava todo o aplicativo**, fazendo com que o Uvicorn e o Python travem. đŸ’„ +No entanto, pode haver casos em que escrevemos algum cĂłdigo que **trava toda a aplicação**, fazendo com que o Uvicorn e o Python travem. đŸ’„ -E ainda assim, vocĂȘ provavelmente nĂŁo gostaria que o aplicativo permanecesse inativo porque houve um erro em um lugar, vocĂȘ provavelmente quer que ele **continue em execução** pelo menos para as *operaçÔes de rota* que nĂŁo estĂŁo quebradas. +E ainda assim, vocĂȘ provavelmente nĂŁo gostaria que a aplicação permanecesse inativa porque houve um erro em um lugar, vocĂȘ provavelmente quer que ela **continue em execução** pelo menos para as *operaçÔes de rota* que nĂŁo estĂŁo quebradas. ### Reiniciar apĂłs falha { #restart-after-crash } @@ -153,13 +153,13 @@ Mas nos casos com erros realmente graves que travam o **processo** em execução /// tip | Dica -...Embora se o aplicativo inteiro estiver **travando imediatamente**, provavelmente nĂŁo faça sentido reiniciĂĄ-lo para sempre. Mas nesses casos, vocĂȘ provavelmente notarĂĄ isso durante o desenvolvimento, ou pelo menos logo apĂłs a implantação. +...Embora se a aplicação inteira estiver **travando imediatamente**, provavelmente nĂŁo faça sentido reiniciĂĄ-la para sempre. Mas nesses casos, vocĂȘ provavelmente notarĂĄ isso durante o desenvolvimento, ou pelo menos logo apĂłs a implantação. -EntĂŁo, vamos nos concentrar nos casos principais, onde ele pode travar completamente em alguns casos especĂ­ficos **no futuro**, e ainda faz sentido reiniciĂĄ-lo. +EntĂŁo, vamos nos concentrar nos casos principais, onde ela pode travar completamente em alguns casos especĂ­ficos **no futuro**, e ainda faz sentido reiniciĂĄ-la. /// -VocĂȘ provavelmente gostaria de ter a coisa responsĂĄvel por reiniciar seu aplicativo como um **componente externo**, porque a essa altura, o mesmo aplicativo com Uvicorn e Python jĂĄ havia travado, entĂŁo nĂŁo hĂĄ nada no mesmo cĂłdigo do mesmo aplicativo que possa fazer algo a respeito. +VocĂȘ provavelmente gostaria de ter a coisa responsĂĄvel por reiniciar sua aplicação como um **componente externo**, porque a essa altura, a mesma aplicação com Uvicorn e Python jĂĄ havia travado, entĂŁo nĂŁo hĂĄ nada no mesmo cĂłdigo da mesma aplicação que possa fazer algo a respeito. ### Ferramentas de exemplo para reiniciar automaticamente { #example-tools-to-restart-automatically } @@ -178,13 +178,13 @@ Por exemplo, isso poderia ser resolvido por: ## Replicação - Processos e MemĂłria { #replication-processes-and-memory } -Com um aplicativo FastAPI, usando um programa de servidor como o comando `fastapi` que executa o Uvicorn, executĂĄ-lo uma vez em **um processo** pode atender a vĂĄrios clientes simultaneamente. +Com uma aplicação FastAPI, usando um programa de servidor como o comando `fastapi` que executa o Uvicorn, executĂĄ-lo uma vez em **um processo** pode atender a vĂĄrios clientes simultaneamente. Mas em muitos casos, vocĂȘ desejarĂĄ executar vĂĄrios processos de trabalho ao mesmo tempo. ### Processos MĂșltiplos - Trabalhadores { #multiple-processes-workers } -Se vocĂȘ tiver mais clientes do que um Ășnico processo pode manipular (por exemplo, se a mĂĄquina virtual nĂŁo for muito grande) e tiver **vĂĄrios nĂșcleos** na CPU do servidor, vocĂȘ poderĂĄ ter **vĂĄrios processos** em execução com o mesmo aplicativo ao mesmo tempo e distribuir todas as solicitaçÔes entre eles. +Se vocĂȘ tiver mais clientes do que um Ășnico processo pode manipular (por exemplo, se a mĂĄquina virtual nĂŁo for muito grande) e tiver **vĂĄrios nĂșcleos** na CPU do servidor, vocĂȘ poderĂĄ ter **vĂĄrios processos** em execução com a mesma aplicação ao mesmo tempo e distribuir todas as requests entre eles. Quando vocĂȘ executa **vĂĄrios processos** do mesmo programa de API, eles sĂŁo comumente chamados de **trabalhadores**. @@ -214,11 +214,11 @@ Neste exemplo, hĂĄ um **Processo Gerenciador** que inicia e controla dois **Proc Este Processo de Gerenciador provavelmente seria o que escutaria na **porta** no IP. E ele transmitiria toda a comunicação para os processos de trabalho. -Esses processos de trabalho seriam aqueles que executariam seu aplicativo, eles executariam os cĂĄlculos principais para receber uma **solicitação** e retornar uma **resposta**, e carregariam qualquer coisa que vocĂȘ colocasse em variĂĄveis ​​na RAM. +Esses processos de trabalho seriam aqueles que executariam sua aplicação, eles executariam os cĂĄlculos principais para receber uma **request** e retornar uma **resposta**, e carregariam qualquer coisa que vocĂȘ colocasse em variĂĄveis ​​na RAM. -E, claro, a mesma mĂĄquina provavelmente teria **outros processos** em execução, alĂ©m do seu aplicativo. +E, claro, a mesma mĂĄquina provavelmente teria **outros processos** em execução, alĂ©m da sua aplicação. Um detalhe interessante Ă© que a porcentagem da **CPU usada** por cada processo pode **variar** muito ao longo do tempo, mas a **memĂłria (RAM)** normalmente fica mais ou menos **estĂĄvel**. @@ -255,9 +255,9 @@ Por exemplo, vocĂȘ pode querer executar **migraçÔes de banco de dados**. Mas na maioria dos casos, vocĂȘ precisarĂĄ executar essas etapas apenas **uma vez**. -Portanto, vocĂȘ vai querer ter um **processo Ășnico** para executar essas **etapas anteriores** antes de iniciar o aplicativo. +Portanto, vocĂȘ vai querer ter um **processo Ășnico** para executar essas **etapas anteriores** antes de iniciar a aplicação. -E vocĂȘ terĂĄ que se certificar de que Ă© um Ășnico processo executando essas etapas anteriores *mesmo* se depois, vocĂȘ iniciar **vĂĄrios processos** (vĂĄrios trabalhadores) para o prĂłprio aplicativo. Se essas etapas fossem executadas por **vĂĄrios processos**, eles **duplicariam** o trabalho executando-o em **paralelo**, e se as etapas fossem algo delicado como uma migração de banco de dados, elas poderiam causar conflitos entre si. +E vocĂȘ terĂĄ que se certificar de que Ă© um Ășnico processo executando essas etapas anteriores *mesmo* se depois, vocĂȘ iniciar **vĂĄrios processos** (vĂĄrios trabalhadores) para a prĂłpria aplicação. Se essas etapas fossem executadas por **vĂĄrios processos**, eles **duplicariam** o trabalho executando-o em **paralelo**, e se as etapas fossem algo delicado como uma migração de banco de dados, elas poderiam causar conflitos entre si. Claro, hĂĄ alguns casos em que nĂŁo hĂĄ problema em executar as etapas anteriores vĂĄrias vezes; nesse caso, Ă© muito mais fĂĄcil de lidar. @@ -276,7 +276,7 @@ Isso **dependerĂĄ muito** da maneira como vocĂȘ **implanta seu sistema** e prova Aqui estĂŁo algumas ideias possĂ­veis: * Um "Init Container" no Kubernetes que roda antes do seu app container -* Um script bash que roda os passos anteriores e entĂŁo inicia seu aplicativo +* Um script bash que roda os passos anteriores e entĂŁo inicia sua aplicação * VocĂȘ ainda precisaria de uma maneira de iniciar/reiniciar *aquele* script bash, detectar erros, etc. /// tip | Dica @@ -307,7 +307,7 @@ VocĂȘ pode usar ferramentas simples como `htop` para ver a CPU e a RAM usadas no ## Recapitular { #recap } -VocĂȘ leu aqui alguns dos principais conceitos que provavelmente precisa ter em mente ao decidir como implantar seu aplicativo: +VocĂȘ leu aqui alguns dos principais conceitos que provavelmente precisa ter em mente ao decidir como implantar sua aplicação: * Segurança - HTTPS * Executando na inicialização diff --git a/docs/pt/docs/deployment/docker.md b/docs/pt/docs/deployment/docker.md index e14870d7c..f68784855 100644 --- a/docs/pt/docs/deployment/docker.md +++ b/docs/pt/docs/deployment/docker.md @@ -50,7 +50,7 @@ Uma imagem de contĂȘiner Ă© uma versĂŁo **estĂĄtica** de todos os arquivos, vari Em contraste com a "**imagem de contĂȘiner**" que contĂ©m os conteĂșdos estĂĄticos armazenados, um "**contĂȘiner**" normalmente se refere Ă  instĂąncia rodando, a coisa que estĂĄ sendo **executada**. -Quando o **contĂȘiner** Ă© iniciado e estĂĄ rodando (iniciado a partir de uma **imagem de contĂȘiner**), ele pode criar ou modificar arquivos, variĂĄveis de ambiente, etc. Essas mudanças vĂŁo existir somente nesse contĂȘiner, mas nĂŁo persistirĂŁo na imagem subjacente do container (nĂŁo serĂŁo salvas no disco). +Quando o **contĂȘiner** Ă© iniciado e estĂĄ rodando (iniciado a partir de uma **imagem de contĂȘiner**), ele pode criar ou modificar arquivos, variĂĄveis de ambiente, etc. Essas mudanças vĂŁo existir somente nesse contĂȘiner, mas nĂŁo persistirĂŁo na imagem subjacente do contĂȘiner (nĂŁo serĂŁo salvas no disco). Uma imagem de contĂȘiner Ă© comparĂĄvel ao arquivo de **programa** e seus conteĂșdos, ex.: `python` e algum arquivo `main.py`. @@ -64,7 +64,7 @@ E existe um [Docker Hub](https://hub.docker.com/) pĂșblico com **imagens de cont Por exemplo, hĂĄ uma [Imagem Python](https://hub.docker.com/_/python) oficial. -E existe muitas outras imagens para diferentes coisas, como bancos de dados, por exemplo: +E existem muitas outras imagens para diferentes coisas, como bancos de dados, por exemplo: * [PostgreSQL](https://hub.docker.com/_/postgres) * [MySQL](https://hub.docker.com/_/mysql) @@ -87,11 +87,11 @@ Quando um **contĂȘiner** Ă© iniciado, ele irĂĄ rodar esse comando/programa (embo Um contĂȘiner estĂĄ rodando enquanto o **processo principal** (comando ou programa) estiver rodando. -Um contĂȘiner normalmente tem um **Ășnico processo**, mas tambĂ©m Ă© possĂ­vel iniciar sub-processos a partir do processo principal, e dessa forma vocĂȘ terĂĄ **vĂĄrios processos** no mesmo contĂȘiner. +Um contĂȘiner normalmente tem um **Ășnico processo**, mas tambĂ©m Ă© possĂ­vel iniciar subprocessos a partir do processo principal, e dessa forma vocĂȘ terĂĄ **vĂĄrios processos** no mesmo contĂȘiner. Mas nĂŁo Ă© possĂ­vel ter um contĂȘiner rodando sem **pelo menos um processo rodando**. Se o processo principal parar, o contĂȘiner tambĂ©m para. -## Construir uma Imagem Docker para FastAPI { #build-a-docker-image-for-fastapi } +## Construa uma Imagem Docker para FastAPI { #build-a-docker-image-for-fastapi } Okay, vamos construir algo agora! 🚀 @@ -262,7 +262,7 @@ Isso pode ser bem perceptĂ­vel ao usar `docker compose`. Veja esta seção de FA #### Estrutura de diretĂłrios { #directory-structure } -Agora vocĂȘ deve haver uma estrutura de diretĂłrio como: +Agora vocĂȘ deveria ter uma estrutura de diretĂłrio como: ``` . @@ -275,7 +275,7 @@ Agora vocĂȘ deve haver uma estrutura de diretĂłrio como: #### Por trĂĄs de um Proxy de Terminação TLS { #behind-a-tls-termination-proxy } -Se vocĂȘ estĂĄ executando seu contĂȘiner atrĂĄs de um Proxy de Terminação TLS (load balancer) como Nginx ou Traefik, adicione a opção `--proxy-headers`, isso farĂĄ com que o Uvicorn (pela CLI do FastAPI) confie nos cabeçalhos enviados por esse proxy, informando que o aplicativo estĂĄ sendo executado atrĂĄs do HTTPS, etc. +Se vocĂȘ estĂĄ executando seu contĂȘiner atrĂĄs de um Proxy de Terminação TLS (balanceador de carga) como Nginx ou Traefik, adicione a opção `--proxy-headers`, isso farĂĄ com que o Uvicorn (pela CLI do FastAPI) confie nos cabeçalhos enviados por esse proxy, informando que o aplicativo estĂĄ sendo executado atrĂĄs do HTTPS, etc. ```Dockerfile CMD ["fastapi", "run", "app/main.py", "--proxy-headers", "--port", "80"] @@ -289,7 +289,7 @@ Existe um truque importante nesse `Dockerfile`, primeiro copiamos o **arquivo co COPY ./requirements.txt /code/requirements.txt ``` -Docker e outras ferramentas **constrĂłem** essas imagens de contĂȘiner **incrementalmente**, adicionando **uma camada em cima da outra**, começando do topo do `Dockerfile` e adicionando qualquer arquivo criado por cada uma das instruçÔes do `Dockerfile`. +Docker e outras ferramentas **constroem** essas imagens de contĂȘiner **incrementalmente**, adicionando **uma camada em cima da outra**, começando do topo do `Dockerfile` e adicionando qualquer arquivo criado por cada uma das instruçÔes do `Dockerfile`. Docker e ferramentas similares tambĂ©m usam um **cache interno** ao construir a imagem, se um arquivo nĂŁo mudou desde a Ășltima vez que a imagem do contĂȘiner foi construĂ­da, entĂŁo ele irĂĄ **reutilizar a mesma camada** criada na Ășltima vez, ao invĂ©s de copiar o arquivo novamente e criar uma nova camada do zero. @@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage ## Verifique { #check-it } -VocĂȘ deve ser capaz de verificar isso no URL do seu contĂȘiner Docker, por exemplo: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) ou [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (ou equivalente, usando seu host Docker). +VocĂȘ deveria conseguir verificar isso no URL do seu contĂȘiner Docker, por exemplo: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) ou [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (ou equivalente, usando seu host Docker). VocĂȘ verĂĄ algo como: @@ -376,9 +376,9 @@ VocĂȘ verĂĄ a documentação alternativa automĂĄtica (fornecida pelo [ReDoc](htt ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) -## Construa uma Imagem Docker com um FastAPI de Arquivo Único { #build-a-docker-image-with-a-single-file-fastapi } +## Construa uma Imagem Docker com uma aplicação FastAPI de Arquivo Único { #build-a-docker-image-with-a-single-file-fastapi } -Se seu FastAPI for um Ășnico arquivo, por exemplo, `main.py` sem um diretĂłrio `./app`, sua estrutura de arquivos poderia ser assim: +Se sua aplicação FastAPI for um Ășnico arquivo, por exemplo, `main.py` sem um diretĂłrio `./app`, sua estrutura de arquivos poderia ser assim: ``` . @@ -456,7 +456,7 @@ Sem usar contĂȘineres, fazer aplicativos executarem na inicialização e com rei Se vocĂȘ tiver um cluster de mĂĄquinas com **Kubernetes**, Docker Swarm Mode, Nomad ou outro sistema complexo semelhante para gerenciar contĂȘineres distribuĂ­dos em vĂĄrias mĂĄquinas, entĂŁo provavelmente desejarĂĄ **lidar com a replicação** no **nĂ­vel do cluster** em vez de usar um **gerenciador de processos** (como Uvicorn com workers) em cada contĂȘiner. -Um desses sistemas de gerenciamento de contĂȘineres distribuĂ­dos como o Kubernetes normalmente tem alguma maneira integrada de lidar com a **replicação de contĂȘineres** enquanto ainda oferece **balanceamento de carga** para as solicitaçÔes recebidas. Tudo no **nĂ­vel do cluster**. +Um desses sistemas de gerenciamento de contĂȘineres distribuĂ­dos como o Kubernetes normalmente tem alguma maneira integrada de lidar com a **replicação de contĂȘineres** enquanto ainda oferece **balanceamento de carga** para os requests recebidos. Tudo no **nĂ­vel do cluster**. Nesses casos, vocĂȘ provavelmente desejarĂĄ criar uma **imagem Docker do zero** como [explicado acima](#dockerfile), instalando suas dependĂȘncias e executando **um Ășnico processo Uvicorn** em vez de usar mĂșltiplos workers do Uvicorn. @@ -464,7 +464,7 @@ Nesses casos, vocĂȘ provavelmente desejarĂĄ criar uma **imagem Docker do zero** Quando usando contĂȘineres, normalmente vocĂȘ terĂĄ algum componente **escutando na porta principal**. Poderia ser outro contĂȘiner que tambĂ©m Ă© um **Proxy de Terminação TLS** para lidar com **HTTPS** ou alguma ferramenta semelhante. -Como esse componente assumiria a **carga** de solicitaçÔes e distribuiria isso entre os workers de uma maneira (esperançosamente) **balanceada**, ele tambĂ©m Ă© comumente chamado de **Balanceador de Carga**. +Como esse componente assumiria a **carga** de requests e distribuiria isso entre os workers de uma maneira (esperançosamente) **balanceada**, ele tambĂ©m Ă© comumente chamado de **Balanceador de Carga**. /// tip | Dica @@ -472,17 +472,17 @@ O mesmo componente **Proxy de Terminação TLS** usado para HTTPS provavelmente /// -E quando trabalhar com contĂȘineres, o mesmo sistema que vocĂȘ usa para iniciar e gerenciĂĄ-los jĂĄ terĂĄ ferramentas internas para transmitir a **comunicação de rede** (por exemplo, solicitaçÔes HTTP) do **balanceador de carga** (que tambĂ©m pode ser um **Proxy de Terminação TLS**) para o(s) contĂȘiner(es) com seu aplicativo. +E quando trabalhar com contĂȘineres, o mesmo sistema que vocĂȘ usa para iniciar e gerenciĂĄ-los jĂĄ terĂĄ ferramentas internas para transmitir a **comunicação de rede** (por exemplo, requests HTTP) do **balanceador de carga** (que tambĂ©m pode ser um **Proxy de Terminação TLS**) para o(s) contĂȘiner(es) com seu aplicativo. ### Um Balanceador de Carga - MĂșltiplos ContĂȘineres de Workers { #one-load-balancer-multiple-worker-containers } -Quando trabalhando com **Kubernetes** ou sistemas similares de gerenciamento de contĂȘiner distribuĂ­do, usar seus mecanismos de rede internos permite que o Ășnico **balanceador de carga** que estĂĄ escutando na **porta principal** transmita a comunicação (solicitaçÔes) para possivelmente **mĂșltiplos contĂȘineres** executando seu aplicativo. +Quando trabalhando com **Kubernetes** ou sistemas similares de gerenciamento de contĂȘiner distribuĂ­do, usar seus mecanismos de rede internos permite que o Ășnico **balanceador de carga** que estĂĄ escutando na **porta principal** transmita a comunicação (requests) para possivelmente **mĂșltiplos contĂȘineres** executando seu aplicativo. Cada um desses contĂȘineres executando seu aplicativo normalmente teria **apenas um processo** (ex.: um processo Uvicorn executando seu aplicativo FastAPI). Todos seriam **contĂȘineres idĂȘnticos**, executando a mesma coisa, mas cada um com seu prĂłprio processo, memĂłria, etc. Dessa forma, vocĂȘ aproveitaria a **paralelização** em **nĂșcleos diferentes** da CPU, ou atĂ© mesmo em **mĂĄquinas diferentes**. -E o sistema de contĂȘiner com o **balanceador de carga** iria **distribuir as solicitaçÔes** para cada um dos contĂȘineres com seu aplicativo **em turnos**. Portanto, cada solicitação poderia ser tratada por um dos mĂșltiplos **contĂȘineres replicados** executando seu aplicativo. +E o sistema de contĂȘiner com o **balanceador de carga** iria **distribuir os requests** para cada um dos contĂȘineres com seu aplicativo **em turnos**. Portanto, cada request poderia ser tratado por um dos mĂșltiplos **contĂȘineres replicados** executando seu aplicativo. -E normalmente esse **balanceador de carga** seria capaz de lidar com solicitaçÔes que vĂŁo para *outros* aplicativos em seu cluster (por exemplo, para um domĂ­nio diferente, ou sob um prefixo de URL diferente), e transmitiria essa comunicação para os contĂȘineres certos para *esse outro* aplicativo em execução em seu cluster. +E normalmente esse **balanceador de carga** seria capaz de lidar com requests que vĂŁo para *outros* aplicativos em seu cluster (por exemplo, para um domĂ­nio diferente, ou sob um prefixo de path de URL diferente), e transmitiria essa comunicação para os contĂȘineres certos para *esse outro* aplicativo em execução em seu cluster. ### Um Processo por ContĂȘiner { #one-process-per-container } @@ -544,7 +544,7 @@ Se vocĂȘ executar **um Ășnico processo por contĂȘiner**, terĂĄ uma quantidade ma E entĂŁo vocĂȘ pode definir esses mesmos limites e requisitos de memĂłria em suas configuraçÔes para seu sistema de gerenciamento de contĂȘineres (por exemplo, no **Kubernetes**). Dessa forma, ele poderĂĄ **replicar os contĂȘineres** nas **mĂĄquinas disponĂ­veis** levando em consideração a quantidade de memĂłria necessĂĄria por eles e a quantidade disponĂ­vel nas mĂĄquinas no cluster. -Se sua aplicação for **simples**, isso provavelmente **nĂŁo serĂĄ um problema**, e vocĂȘ pode nĂŁo precisar especificar limites de memĂłria rĂ­gidos. Mas se vocĂȘ estiver **usando muita memĂłria** (por exemplo, com **modelos de aprendizado de mĂĄquina**), deve verificar quanta memĂłria estĂĄ consumindo e ajustar o **nĂșmero de contĂȘineres** que executa em **cada mĂĄquina** (e talvez adicionar mais mĂĄquinas ao seu cluster). +Se sua aplicação for **simples**, isso provavelmente **nĂŁo serĂĄ um problema**, e vocĂȘ pode nĂŁo precisar especificar limites de memĂłria rĂ­gidos. Mas se vocĂȘ estiver **usando muita memĂłria** (por exemplo, com modelos de **Aprendizado de MĂĄquina**), vocĂȘ deveria verificar quanta memĂłria estĂĄ consumindo e ajustar o **nĂșmero de contĂȘineres** que executa em **cada mĂĄquina** (e talvez adicionar mais mĂĄquinas ao seu cluster). Se vocĂȘ executar **mĂșltiplos processos por contĂȘiner**, deve garantir que o nĂșmero de processos iniciados nĂŁo **consuma mais memĂłria** do que o disponĂ­vel. @@ -572,7 +572,7 @@ Se vocĂȘ tiver uma configuração simples, com um **Ășnico contĂȘiner** que ent Antes havia uma imagem oficial do FastAPI para Docker: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker). Mas agora ela estĂĄ descontinuada. ⛔ -VocĂȘ provavelmente **nĂŁo** deve usar essa imagem base do Docker (ou qualquer outra semelhante). +VocĂȘ provavelmente **nĂŁo** deveria usar essa imagem base do Docker (ou qualquer outra semelhante). Se vocĂȘ estĂĄ usando **Kubernetes** (ou outros) e jĂĄ estĂĄ definindo a **replicação** no nĂ­vel do cluster, com vĂĄrios **contĂȘineres**. Nesses casos, Ă© melhor **construir uma imagem do zero** como descrito acima: [Construir uma Imagem Docker para FastAPI](#build-a-docker-image-for-fastapi). diff --git a/docs/pt/docs/deployment/https.md b/docs/pt/docs/deployment/https.md index 0e8ae2ba6..d89e0bbff 100644 --- a/docs/pt/docs/deployment/https.md +++ b/docs/pt/docs/deployment/https.md @@ -10,31 +10,31 @@ Se vocĂȘ estĂĄ com pressa ou nĂŁo se importa, continue com as seçÔes seguintes /// -Para aprender o bĂĄsico de HTTPS do ponto de vista do consumidor, verifique [https://howhttps.works/](https://howhttps.works/). - -Agora, a partir de uma perspectiva do desenvolvedor, aqui estĂŁo algumas coisas para ter em mente ao pensar em HTTPS: - -* Para HTTPS, o servidor precisa ter "certificados" gerados por um terceiro. - * Esses certificados sĂŁo na verdade adquiridos de um terceiro, eles nĂŁo sĂŁo simplesmente "gerados". -* Certificados tĂȘm um tempo de vida. - * Eles expiram. - * E entĂŁo eles precisam ser renovados, adquirindo-os novamente de um terceiro. -* A criptografia da conexĂŁo acontece no nĂ­vel TCP. - * Essa Ă© uma camada abaixo do HTTP. - * Portanto, o manuseio do certificado e da criptografia Ă© feito antes do HTTP. -* O TCP nĂŁo sabe sobre "domĂ­nios". Apenas sobre endereços IP. - * As informaçÔes sobre o domĂ­nio especĂ­fico solicitado vĂŁo nos dados HTTP. -* Os certificados HTTPS “certificam” um determinado domĂ­nio, mas o protocolo e a encriptação acontecem ao nĂ­vel do TCP, antes de sabermos de que domĂ­nio se trata. -* Por padrĂŁo, isso significa que vocĂȘ sĂł pode ter um certificado HTTPS por endereço IP. +Para **aprender o bĂĄsico de HTTPS**, do ponto de vista do consumidor, verifique [https://howhttps.works/](https://howhttps.works/). + +Agora, a partir de uma **perspectiva do desenvolvedor**, aqui estĂŁo algumas coisas para ter em mente ao pensar em HTTPS: + +* Para HTTPS, **o servidor** precisa **ter "certificados"** gerados por um **terceiro**. + * Esses certificados sĂŁo na verdade **adquiridos** de um terceiro, eles nĂŁo sĂŁo simplesmente "gerados". +* Certificados tĂȘm um **tempo de vida**. + * Eles **expiram**. + * E entĂŁo eles precisam ser **renovados**, **adquiridos novamente** de um terceiro. +* A criptografia da conexĂŁo acontece no **nĂ­vel TCP**. + * Essa Ă© uma camada **abaixo do HTTP**. + * Portanto, o manuseio do **certificado e da criptografia** Ă© feito **antes do HTTP**. +* **O TCP nĂŁo sabe sobre "domĂ­nios"**. Apenas sobre endereços IP. + * As informaçÔes sobre o **domĂ­nio especĂ­fico** solicitado vĂŁo nos **dados HTTP**. +* Os **certificados HTTPS** “certificam” um **determinado domĂ­nio**, mas o protocolo e a encriptação acontecem ao nĂ­vel do TCP, **antes de sabermos** de que domĂ­nio se trata. +* **Por padrĂŁo**, isso significa que vocĂȘ sĂł pode ter **um certificado HTTPS por endereço IP**. * NĂŁo importa o tamanho do seu servidor ou quĂŁo pequeno cada aplicativo que vocĂȘ tem nele possa ser. - * No entanto, existe uma solução para isso. -* HĂĄ uma extensĂŁo para o protocolo TLS (aquele que lida com a criptografia no nĂ­vel TCP, antes do HTTP) chamada [SNI](https://en.wikipedia.org/wiki/Server_Name_Indication). - * Esta extensĂŁo SNI permite que um Ășnico servidor (com um Ășnico endereço IP) tenha vĂĄrios certificados HTTPS e atenda a vĂĄrios domĂ­nios / aplicativos HTTPS. - * Para que isso funcione, um Ășnico componente (programa) em execução no servidor, ouvindo no endereço IP pĂșblico, deve ter todos os certificados HTTPS no servidor. -* Depois de obter uma conexĂŁo segura, o protocolo de comunicação ainda Ă© HTTP. - * Os conteĂșdos sĂŁo criptografados, embora sejam enviados com o protocolo HTTP. + * No entanto, existe uma **solução** para isso. +* HĂĄ uma **extensĂŁo** para o protocolo **TLS** (aquele que lida com a criptografia no nĂ­vel TCP, antes do HTTP) chamada **[SNI](https://en.wikipedia.org/wiki/Server_Name_Indication)**. + * Esta extensĂŁo SNI permite que um Ășnico servidor (com um **Ășnico endereço IP**) tenha **vĂĄrios certificados HTTPS** e atenda a **vĂĄrios domĂ­nios / aplicativos HTTPS**. + * Para que isso funcione, um **Ășnico** componente (programa) em execução no servidor, ouvindo no **endereço IP pĂșblico**, deve ter **todos os certificados HTTPS** no servidor. +* **Depois** de obter uma conexĂŁo segura, o protocolo de comunicação ainda Ă© **HTTP**. + * Os conteĂșdos sĂŁo **criptografados**, embora sejam enviados com o **protocolo HTTP**. -É uma prĂĄtica comum ter um programa/servidor HTTP em execução no servidor (mĂĄquina, host, etc.) e gerenciar todas as partes HTTPS: recebendo as requisiçÔes HTTPS encriptadas, enviando as solicitaçÔes HTTP descriptografadas para o aplicativo HTTP real em execução no mesmo servidor (a aplicação FastAPI, neste caso), pegar a resposta HTTP do aplicativo, criptografĂĄ-la usando o certificado HTTPS apropriado e enviĂĄ-la de volta ao cliente usando HTTPS. Este servidor Ă© frequentemente chamado de [Proxy de Terminação TLS](https://en.wikipedia.org/wiki/TLS_termination_proxy). +É uma prĂĄtica comum ter **um programa/servidor HTTP** em execução no servidor (mĂĄquina, host, etc.) e **gerenciar todas as partes HTTPS**: recebendo as **requisiçÔes HTTPS encriptadas**, enviando as **solicitaçÔes HTTP descriptografadas** para o aplicativo HTTP real em execução no mesmo servidor (a aplicação **FastAPI**, neste caso), pegar a **resposta HTTP** do aplicativo, **criptografĂĄ-la** usando o **certificado HTTPS** apropriado e enviĂĄ-la de volta ao cliente usando **HTTPS**. Este servidor Ă© frequentemente chamado de **[Proxy de Terminação TLS](https://en.wikipedia.org/wiki/TLS_termination_proxy)**. Algumas das opçÔes que vocĂȘ pode usar como Proxy de Terminação TLS sĂŁo: @@ -45,17 +45,17 @@ Algumas das opçÔes que vocĂȘ pode usar como Proxy de Terminação TLS sĂŁo: ## Let's Encrypt { #lets-encrypt } -Antes de Let's Encrypt, esses certificados HTTPS eram vendidos por terceiros confiĂĄveis. +Antes de Let's Encrypt, esses **certificados HTTPS** eram vendidos por terceiros confiĂĄveis. O processo de aquisição de um desses certificados costumava ser complicado, exigia bastante papelada e os certificados eram bastante caros. -Mas entĂŁo o [Let's Encrypt](https://letsencrypt.org/) foi criado. +Mas entĂŁo o **[Let's Encrypt](https://letsencrypt.org/)** foi criado. -Ele Ă© um projeto da Linux Foundation que fornece certificados HTTPS gratuitamente. De forma automatizada. Esses certificados usam toda a segurança criptogrĂĄfica padrĂŁo e tĂȘm vida curta (cerca de 3 meses), entĂŁo a segurança Ă©, na verdade, melhor por causa do seu lifespan reduzido. +Ele Ă© um projeto da Linux Foundation. Ele fornece **certificados HTTPS gratuitamente**, de forma automatizada. Esses certificados usam toda a segurança criptogrĂĄfica padrĂŁo e tĂȘm vida curta (cerca de 3 meses), entĂŁo a **segurança Ă©, na verdade, melhor** por causa do seu lifespan reduzido. Os domĂ­nios sĂŁo verificados com segurança e os certificados sĂŁo gerados automaticamente. Isso tambĂ©m permite automatizar a renovação desses certificados. -A ideia Ă© automatizar a aquisição e renovação desses certificados, para que vocĂȘ tenha HTTPS seguro, de graça e para sempre. +A ideia Ă© automatizar a aquisição e renovação desses certificados, para que vocĂȘ tenha **HTTPS seguro, de graça e para sempre**. ## HTTPS para Desenvolvedores { #https-for-developers } @@ -63,11 +63,11 @@ Aqui estĂĄ um exemplo de como uma API HTTPS poderia ser estruturada, passo a pas ### Nome do domĂ­nio { #domain-name } -A etapa inicial provavelmente seria adquirir algum nome de domĂ­nio. EntĂŁo, vocĂȘ iria configurĂĄ-lo em um servidor DNS (possivelmente no mesmo provedor em nuvem). +A etapa inicial provavelmente seria **adquirir** algum **nome de domĂ­nio**. EntĂŁo, vocĂȘ iria configurĂĄ-lo em um servidor DNS (possivelmente no mesmo provedor em nuvem). -VocĂȘ provavelmente usaria um servidor em nuvem (mĂĄquina virtual) ou algo parecido, e ele teria um fixo Endereço IP pĂșblico. +VocĂȘ provavelmente usaria um servidor em nuvem (mĂĄquina virtual) ou algo parecido, e ele teria um **endereço IP pĂșblico** fixo. -No(s) servidor(es) DNS, vocĂȘ configuraria um registro (um `A record`) para apontar seu domĂ­nio para o endereço IP pĂșblico do seu servidor. +No(s) servidor(es) DNS, vocĂȘ configuraria um registro (um "`A record`") para apontar **seu domĂ­nio** para o **endereço IP pĂșblico do seu servidor**. VocĂȘ provavelmente farĂĄ isso apenas uma vez, na primeira vez em que tudo estiver sendo configurado. @@ -81,120 +81,120 @@ Essa parte do Nome do DomĂ­nio se dĂĄ muito antes do HTTPS, mas como tudo depend Agora vamos focar em todas as partes que realmente fazem parte do HTTPS. -Primeiro, o navegador iria verificar com os servidores DNS qual o IP do domĂ­nio, nesse caso, `someapp.example.com`. +Primeiro, o navegador iria verificar com os **servidores DNS** qual o **IP do domĂ­nio**, nesse caso, `someapp.example.com`. -Os servidores DNS iriam informar o navegador para utilizar algum endereço IP especĂ­fico. Esse seria o endereço IP pĂșblico em uso no seu servidor, que vocĂȘ configurou nos servidores DNS. +Os servidores DNS iriam informar o navegador para utilizar algum **endereço IP** especĂ­fico. Esse seria o endereço IP pĂșblico em uso no seu servidor, que vocĂȘ configurou nos servidores DNS. ### InĂ­cio do Handshake TLS { #tls-handshake-start } -O navegador entĂŁo irĂĄ comunicar-se com esse endereço IP na porta 443 (a porta HTTPS). +O navegador entĂŁo irĂĄ comunicar-se com esse endereço IP na **porta 443** (a porta HTTPS). A primeira parte dessa comunicação Ă© apenas para estabelecer a conexĂŁo entre o cliente e o servidor e para decidir as chaves criptogrĂĄficas a serem utilizadas, etc. -Esse interação entre o cliente e o servidor para estabelecer uma conexĂŁo TLS Ă© chamada de Handshake TLS. +Esse interação entre o cliente e o servidor para estabelecer uma conexĂŁo TLS Ă© chamada de **Handshake TLS**. ### TLS com a ExtensĂŁo SNI { #tls-with-sni-extension } -Apenas um processo no servidor pode se conectar a uma porta em um endereço IP. Poderiam existir outros processos conectados em outras portas desse mesmo endereço IP, mas apenas um para cada combinação de endereço IP e porta. +**Apenas um processo** no servidor pode se conectar a uma **porta** em um **endereço IP**. Poderiam existir outros processos conectados em outras portas desse mesmo endereço IP, mas apenas um para cada combinação de endereço IP e porta. TLS (HTTPS) usa a porta `443` por padrĂŁo. EntĂŁo essa Ă© a porta que precisamos. -Como apenas um Ășnico processo pode se comunicar com essa porta, o processo que faria isso seria o Proxy de Terminação TLS. +Como apenas um Ășnico processo pode se comunicar com essa porta, o processo que faria isso seria o **Proxy de Terminação TLS**. -O Proxy de Terminação TLS teria acesso a um ou mais certificados TLS (certificados HTTPS). +O Proxy de Terminação TLS teria acesso a um ou mais **certificados TLS** (certificados HTTPS). -Utilizando a extensĂŁo SNI discutida acima, o Proxy de Terminação TLS iria checar qual dos certificados TLS (HTTPS) disponĂ­veis deve ser usado para essa conexĂŁo, utilizando o que corresponda ao domĂ­nio esperado pelo cliente. +Utilizando a **extensĂŁo SNI** discutida acima, o Proxy de Terminação TLS iria checar qual dos certificados TLS (HTTPS) disponĂ­veis deve ser usado para essa conexĂŁo, utilizando o que corresponda ao domĂ­nio esperado pelo cliente. Nesse caso, ele usaria o certificado para `someapp.example.com`. -O cliente jĂĄ confia na entidade que gerou o certificado TLS (nesse caso, o Let's Encrypt, mas veremos sobre isso mais tarde), entĂŁo ele pode verificar que o certificado Ă© vĂĄlido. +O cliente jĂĄ **confia** na entidade que gerou o certificado TLS (nesse caso, o Let's Encrypt, mas veremos sobre isso mais tarde), entĂŁo ele pode **verificar** que o certificado Ă© vĂĄlido. -EntĂŁo, utilizando o certificado, o cliente e o Proxy de Terminação TLS decidem como encriptar o resto da comunicação TCP. Isso completa a parte do Handshake TLS. +EntĂŁo, utilizando o certificado, o cliente e o Proxy de Terminação TLS **decidem como encriptar** o resto da **comunicação TCP**. Isso completa a parte do **Handshake TLS**. -ApĂłs isso, o cliente e o servidor possuem uma conexĂŁo TCP encriptada, que Ă© provida pelo TLS. E entĂŁo eles podem usar essa conexĂŁo para começar a comunicação HTTP propriamente dita. +ApĂłs isso, o cliente e o servidor possuem uma **conexĂŁo TCP encriptada**, que Ă© provida pelo TLS. E entĂŁo eles podem usar essa conexĂŁo para começar a **comunicação HTTP** propriamente dita. -E isso resume o que Ă© HTTPS, apenas HTTP simples dentro de uma conexĂŁo TLS segura em vez de uma conexĂŁo TCP pura (nĂŁo encriptada). +E isso resume o que Ă© **HTTPS**, apenas **HTTP** simples dentro de uma **conexĂŁo TLS segura** em vez de uma conexĂŁo TCP pura (nĂŁo encriptada). /// tip | Dica -Percebe que a encriptação da comunicação acontece no nĂ­vel do TCP, nĂŁo no nĂ­vel do HTTP. +Perceba que a encriptação da comunicação acontece no **nĂ­vel do TCP**, nĂŁo no nĂ­vel do HTTP. /// ### Solicitação HTTPS { #https-request } -Agora que o cliente e servidor (especialmente o navegador e o Proxy de Terminação TLS) possuem uma conexĂŁo TCP encriptada, eles podem iniciar a comunicação HTTP. +Agora que o cliente e servidor (especialmente o navegador e o Proxy de Terminação TLS) possuem uma **conexĂŁo TCP encriptada**, eles podem iniciar a **comunicação HTTP**. -EntĂŁo, o cliente envia uma solicitação HTTPS. Que Ă© apenas uma solicitação HTTP sobre uma conexĂŁo TLS encriptada. +EntĂŁo, o cliente envia uma **solicitação HTTPS**. Que Ă© apenas uma solicitação HTTP sobre uma conexĂŁo TLS encriptada. ### Desencripte a Solicitação { #decrypt-the-request } -O Proxy de Terminação TLS entĂŁo usaria a encriptação combinada para desencriptar a solicitação, e transmitiria a solicitação bĂĄsica (desencriptada) para o processo executando a aplicação (por exemplo, um processo com Uvicorn executando a aplicação FastAPI). +O Proxy de Terminação TLS entĂŁo usaria a encriptação combinada para **desencriptar a solicitação**, e transmitiria a **solicitação HTTP bĂĄsica (desencriptada)** para o processo executando a aplicação (por exemplo, um processo com Uvicorn executando a aplicação FastAPI). ### Resposta HTTP { #http-response } -A aplicação processaria a solicitação e retornaria uma resposta HTTP bĂĄsica (nĂŁo encriptada) para o Proxy de Terminação TLS. +A aplicação processaria a solicitação e retornaria uma **resposta HTTP bĂĄsica (nĂŁo encriptada)** para o Proxy de Terminação TLS. ### Resposta HTTPS { #https-response } -O Proxy de Terminação TLS iria encriptar a resposta utilizando a criptografia combinada anteriormente (que foi definida com o certificado para `someapp.example.com`), e devolveria para o navegador. +O Proxy de Terminação TLS iria **encriptar a resposta** utilizando a criptografia combinada anteriormente (que foi definida com o certificado para `someapp.example.com`), e devolveria para o navegador. -No prĂłximo passo, o navegador verifica que a resposta Ă© vĂĄlida e encriptada com a chave criptogrĂĄfica correta, etc. E depois desencripta a resposta e a processa. +No prĂłximo passo, o navegador verifica que a resposta Ă© vĂĄlida e encriptada com a chave criptogrĂĄfica correta, etc. E depois **desencripta a resposta** e a processa. -O cliente (navegador) saberĂĄ que a resposta vem do servidor correto por que ela usa a criptografia que foi combinada entre eles usando o certificado HTTPS anterior. +O cliente (navegador) saberĂĄ que a resposta vem do servidor correto por que ela usa a criptografia que foi combinada entre eles usando o **certificado HTTPS** anterior. ### MĂșltiplas AplicaçÔes { #multiple-applications } -Podem existir mĂșltiplas aplicaçÔes em execução no mesmo servidor (ou servidores), por exemplo: outras APIs ou um banco de dados. +Podem existir **mĂșltiplas aplicaçÔes** em execução no mesmo servidor (ou servidores), por exemplo: outras APIs ou um banco de dados. -Apenas um processo pode estar vinculado a um IP e porta (o Proxy de Terminação TLS, por exemplo), mas outras aplicaçÔes/processos tambĂ©m podem estar em execução no(s) servidor(es), desde que nĂŁo tentem usar a mesma combinação de IP pĂșblico e porta. +Apenas um processo pode estar vinculado a um IP e porta (o Proxy de Terminação TLS, por exemplo), mas outras aplicaçÔes/processos tambĂ©m podem estar em execução no(s) servidor(es), desde que nĂŁo tentem usar a mesma **combinação de IP pĂșblico e porta**. -Dessa forma, o Proxy de Terminação TLS pode gerenciar o HTTPS e os certificados de mĂșltiplos domĂ­nios, para mĂșltiplas aplicaçÔes, e entĂŁo transmitir as requisiçÔes para a aplicação correta em cada caso. +Dessa forma, o Proxy de Terminação TLS pode gerenciar o HTTPS e os certificados de **mĂșltiplos domĂ­nios**, para mĂșltiplas aplicaçÔes, e entĂŁo transmitir as requisiçÔes para a aplicação correta em cada caso. ### Renovação de Certificados { #certificate-renewal } -Em algum momento futuro, cada certificado irĂĄ expirar (aproximadamente 3 meses apĂłs a aquisição). +Em algum momento futuro, cada certificado irĂĄ **expirar** (aproximadamente 3 meses apĂłs a aquisição). -E entĂŁo, haverĂĄ outro programa (em alguns casos pode ser o prĂłprio Proxy de Terminação TLS) que irĂĄ interagir com o Let's Encrypt e renovar o(s) certificado(s). +E entĂŁo, haverĂĄ outro programa (em alguns casos Ă© outro programa, em alguns casos pode ser o prĂłprio Proxy de Terminação TLS) que irĂĄ interagir com o Let's Encrypt e renovar o(s) certificado(s). -Os certificados TLS sĂŁo associados com um nome de domĂ­nio, e nĂŁo a um endereço IP. +Os **certificados TLS** sĂŁo **associados com um nome de domĂ­nio**, e nĂŁo a um endereço IP. -EntĂŁo para renovar os certificados, o programa de renovação precisa provar para a autoridade (Let's Encrypt) que ele realmente "possui" e controla esse domĂ­nio. +EntĂŁo para renovar os certificados, o programa de renovação precisa **provar** para a autoridade (Let's Encrypt) que ele realmente **"possui" e controla esse domĂ­nio**. Para fazer isso, e acomodar as necessidades de diferentes aplicaçÔes, existem diferentes opçÔes para esse programa. Algumas escolhas populares sĂŁo: -* Modificar alguns registros DNS +* **Modificar alguns registros DNS**. * Para isso, o programa de renovação precisa ter suporte Ă s APIs do provedor DNS, entĂŁo, dependendo do provedor DNS que vocĂȘ utilize, isso pode ou nĂŁo ser uma opção viĂĄvel. -* Executar como um servidor (ao menos durante o processo de aquisição do certificado) no endereço IP pĂșblico associado com o domĂ­nio. +* **Executar como um servidor** (ao menos durante o processo de aquisição do certificado) no endereço IP pĂșblico associado com o domĂ­nio. * Como dito anteriormente, apenas um processo pode estar ligado a uma porta e IP especĂ­ficos. * Essa Ă© uma dos motivos que fazem utilizar o mesmo Proxy de Terminação TLS para gerenciar a renovação de certificados ser tĂŁo Ăștil. * Caso contrĂĄrio, vocĂȘ pode ter que parar a execução do Proxy de Terminação TLS momentaneamente, inicializar o programa de renovação para adquirir os certificados, depois configurĂĄ-los com o Proxy de Terminação TLS, e entĂŁo reiniciar o Proxy de Terminação TLS. Isso nĂŁo Ă© o ideal, jĂĄ que sua(s) aplicação(Ă”es) nĂŁo vĂŁo estar disponĂ­veis enquanto o Proxy de Terminação TLS estiver desligado. -Todo esse processo de renovação, enquanto o aplicativo ainda funciona, Ă© uma das principais razĂ”es para preferir um sistema separado para gerenciar HTTPS com um Proxy de Terminação TLS em vez de usar os certificados TLS no servidor da aplicação diretamente (e.g. com o Uvicorn). +Todo esse processo de renovação, enquanto o aplicativo ainda funciona, Ă© uma das principais razĂ”es para preferir um **sistema separado para gerenciar HTTPS** com um Proxy de Terminação TLS em vez de usar os certificados TLS no servidor da aplicação diretamente (e.g. com o Uvicorn). ## Cabeçalhos encaminhados por Proxy { #proxy-forwarded-headers } -Ao usar um proxy para lidar com HTTPS, seu servidor de aplicação (por exemplo, Uvicorn via FastAPI CLI) nĂŁo sabe nada sobre o processo de HTTPS; ele se comunica com HTTP simples com o Proxy de Terminação TLS. +Ao usar um proxy para lidar com HTTPS, seu **servidor de aplicação** (por exemplo, Uvicorn via FastAPI CLI) nĂŁo sabe nada sobre o processo de HTTPS; ele se comunica com HTTP simples com o **Proxy de Terminação TLS**. -Esse proxy normalmente define alguns cabeçalhos HTTP dinamicamente antes de transmitir a requisição para o servidor de aplicação, para informar ao servidor de aplicação que a requisição estĂĄ sendo encaminhada pelo proxy. +Esse **proxy** normalmente define alguns cabeçalhos HTTP dinamicamente antes de transmitir a requisição para o **servidor de aplicação**, para informar ao servidor de aplicação que a requisição estĂĄ sendo **encaminhada** pelo proxy. /// note | Detalhes TĂ©cnicos @@ -206,11 +206,11 @@ Os cabeçalhos do proxy sĂŁo: /// -No entanto, como o servidor de aplicação nĂŁo sabe que estĂĄ atrĂĄs de um proxy confiĂĄvel, por padrĂŁo ele nĂŁo confiaria nesses cabeçalhos. +No entanto, como o **servidor de aplicação** nĂŁo sabe que estĂĄ atrĂĄs de um **proxy** confiĂĄvel, por padrĂŁo ele nĂŁo confiaria nesses cabeçalhos. -Mas vocĂȘ pode configurar o servidor de aplicação para confiar nos cabeçalhos encaminhados enviados pelo proxy. Se vocĂȘ estiver usando o FastAPI CLI, pode usar a opção de CLI `--forwarded-allow-ips` para dizer de quais IPs ele deve confiar nesses cabeçalhos encaminhados. +Mas vocĂȘ pode configurar o **servidor de aplicação** para confiar nos cabeçalhos *encaminhados* enviados pelo **proxy**. Se vocĂȘ estiver usando o FastAPI CLI, pode usar a *Opção de CLI* `--forwarded-allow-ips` para dizer de quais IPs ele deve confiar nesses cabeçalhos *encaminhados*. -Por exemplo, se o servidor de aplicação sĂł estiver recebendo comunicação do proxy confiĂĄvel, vocĂȘ pode defini-lo como `--forwarded-allow-ips="*"` para fazĂȘ-lo confiar em todos os IPs de entrada, jĂĄ que ele sĂł receberĂĄ requisiçÔes de seja lĂĄ qual for o IP usado pelo proxy. +Por exemplo, se o **servidor de aplicação** sĂł estiver recebendo comunicação do **proxy** confiĂĄvel, vocĂȘ pode defini-lo como `--forwarded-allow-ips="*"` para fazĂȘ-lo confiar em todos os IPs de entrada, jĂĄ que ele sĂł receberĂĄ requisiçÔes de seja lĂĄ qual for o IP usado pelo **proxy**. Dessa forma, a aplicação seria capaz de saber qual Ă© sua prĂłpria URL pĂșblica, se estĂĄ usando HTTPS, o domĂ­nio, etc. @@ -224,8 +224,8 @@ VocĂȘ pode saber mais sobre isso na documentação em [AtrĂĄs de um Proxy - Habi ## Recapitulando { #recap } -Possuir HTTPS habilitado na sua aplicação Ă© bastante importante, e atĂ© crĂ­tico na maioria dos casos. A maior parte do esforço que vocĂȘ tem que colocar sobre o HTTPS como desenvolvedor estĂĄ em entender esses conceitos e como eles funcionam. +Possuir **HTTPS** habilitado na sua aplicação Ă© bastante importante, e atĂ© **crĂ­tico** na maioria dos casos. A maior parte do esforço que vocĂȘ tem que colocar sobre o HTTPS como desenvolvedor estĂĄ em **entender esses conceitos** e como eles funcionam. -Mas uma vez que vocĂȘ saiba o bĂĄsico de HTTPS para desenvolvedores, vocĂȘ pode combinar e configurar diferentes ferramentas facilmente para gerenciar tudo de uma forma simples. +Mas uma vez que vocĂȘ saiba o bĂĄsico de **HTTPS para desenvolvedores**, vocĂȘ pode combinar e configurar diferentes ferramentas facilmente para gerenciar tudo de uma forma simples. -Em alguns dos prĂłximos capĂ­tulos, eu mostrarei para vocĂȘ vĂĄrios exemplos concretos de como configurar o HTTPS para aplicaçÔes FastAPI. 🔒 +Em alguns dos prĂłximos capĂ­tulos, eu mostrarei para vocĂȘ vĂĄrios exemplos concretos de como configurar o **HTTPS** para aplicaçÔes **FastAPI**. 🔒 diff --git a/docs/pt/docs/deployment/manually.md b/docs/pt/docs/deployment/manually.md index 8f34e37d0..0c8db162e 100644 --- a/docs/pt/docs/deployment/manually.md +++ b/docs/pt/docs/deployment/manually.md @@ -53,7 +53,7 @@ A principal coisa que vocĂȘ precisa para executar uma aplicação **FastAPI** (o Existem diversas alternativas, incluindo: * [Uvicorn](https://www.uvicorn.dev/): um servidor ASGI de alta performance. -* [Hypercorn](https://hypercorn.readthedocs.io/): um servidor ASGI compatĂ­vel com HTTP/2, Trio e outros recursos. +* [Hypercorn](https://hypercorn.readthedocs.io/): um servidor ASGI compatĂ­vel com HTTP/2, Trio e outras funcionalidades. * [Daphne](https://github.com/django/daphne): servidor ASGI construĂ­do para Django Channels. * [Granian](https://github.com/emmett-framework/granian): um servidor HTTP Rust para aplicaçÔes Python. @@ -136,7 +136,7 @@ Uvicorn e outros servidores suportam a opção `--reload` que Ă© Ăștil durante o A opção `--reload` consome muito mais recursos, Ă© mais instĂĄvel, etc. -Ela ajuda muito durante o **desenvolvimento**, mas vocĂȘ **nĂŁo deve** usĂĄ-la em **produção**. +Ela ajuda muito durante o **desenvolvimento**, mas vocĂȘ **nĂŁo deveria** usĂĄ-la em **produção**. /// diff --git a/docs/pt/docs/editor-support.md b/docs/pt/docs/editor-support.md index 7eedd3908..de02c5d7c 100644 --- a/docs/pt/docs/editor-support.md +++ b/docs/pt/docs/editor-support.md @@ -1,6 +1,6 @@ # Suporte a Editores { #editor-support } -A [FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) oficial melhora seu fluxo de trabalho de desenvolvimento com descoberta e navegação de *operação de rota*, alĂ©m de implantação no FastAPI Cloud e transmissĂŁo ao vivo de logs. +A [FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) oficial melhora seu fluxo de trabalho de desenvolvimento FastAPI com descoberta e navegação de *operação de rota*, alĂ©m de implantação no FastAPI Cloud e transmissĂŁo ao vivo de logs. Para mais detalhes sobre a extensĂŁo, consulte o README no [repositĂłrio do GitHub](https://github.com/fastapi/fastapi-vscode). diff --git a/docs/pt/docs/environment-variables.md b/docs/pt/docs/environment-variables.md index a464becee..ebf037faa 100644 --- a/docs/pt/docs/environment-variables.md +++ b/docs/pt/docs/environment-variables.md @@ -289,7 +289,7 @@ Essas informaçÔes serĂŁo Ășteis ao aprender sobre [Ambientes Virtuais](virtual ## ConclusĂŁo { #conclusion } -Com isso, vocĂȘ deve ter uma compreensĂŁo bĂĄsica do que sĂŁo **variĂĄveis ​​de ambiente** e como usĂĄ-las em Python. +Com isso, vocĂȘ deveria ter uma compreensĂŁo bĂĄsica do que sĂŁo **variĂĄveis ​​de ambiente** e como usĂĄ-las em Python. VocĂȘ tambĂ©m pode ler mais sobre elas na [Wikipedia para VariĂĄveis ​​de Ambiente](https://en.wikipedia.org/wiki/Environment_variable). diff --git a/docs/pt/docs/features.md b/docs/pt/docs/features.md index 8b14c5fea..846bc7f94 100644 --- a/docs/pt/docs/features.md +++ b/docs/pt/docs/features.md @@ -1,15 +1,15 @@ -# Recursos { #features } +# Funcionalidades { #features } -## Recursos do FastAPI { #fastapi-features } +## Funcionalidades do FastAPI { #fastapi-features } **FastAPI** te oferece o seguinte: ### Baseado em padrĂ”es abertos { #based-on-open-standards } -* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) para criação de APIs, incluindo declaraçÔes de caminho operaçÔes, parĂąmetros, requisiçÔes de corpo, segurança etc. +* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) para criação de APIs, incluindo declaraçÔes de path operaçÔes, parĂąmetros, corpos de requisição, segurança etc. * Documentação automĂĄtica de modelos de dados com [**JSON Schema**](https://json-schema.org/) (jĂĄ que o OpenAPI em si Ă© baseado no JSON Schema). * Projetado em torno desses padrĂ”es, apĂłs um estudo meticuloso. Em vez de uma camada improvisada por cima. -* Isso tambĂ©m permite o uso de **geração de cĂłdigo do cliente** automaticamente em muitas linguagens. +* Isso tambĂ©m permite o uso de **geração de cĂłdigo de cliente** automaticamente em muitas linguagens. ### Documentação automĂĄtica { #automatic-docs } @@ -75,7 +75,7 @@ Passe as chaves e valores do dicionĂĄrio `second_user_data` diretamente como arg Todo o framework foi projetado para ser fĂĄcil e intuitivo de usar, todas as decisĂ”es foram testadas em vĂĄrios editores antes do inĂ­cio do desenvolvimento, para garantir a melhor experiĂȘncia de desenvolvimento. -Na pesquisa de desenvolvedores Python, ficou claro [que um dos recursos mais utilizados Ă© o "preenchimento automĂĄtico"](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features). +Nas pesquisas de desenvolvedores Python, ficou claro [que uma das funcionalidades mais utilizadas Ă© o "preenchimento automĂĄtico"](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features). Todo o framework **FastAPI** Ă© feito para satisfazer isso. O preenchimento automĂĄtico funciona em todos os lugares. @@ -97,9 +97,9 @@ Sem a necessidade de digitar nomes de chaves erroneamente, ir e voltar entre doc ### Breve { #short } -HĂĄ **padrĂ”es** sensĂ­veis para tudo, com configuraçÔes adicionais em todos os lugares. Todos os parĂąmetros podem ser regulados para fazer o que vocĂȘ precisa e para definir a API que vocĂȘ necessita. +HĂĄ **valores padrĂŁo** sensĂ­veis para tudo, com configuraçÔes adicionais em todos os lugares. Todos os parĂąmetros podem ser regulados para fazer o que vocĂȘ precisa e para definir a API que vocĂȘ necessita. -Por padrĂŁo, tudo **"simplesmente funciona"**. +Mas, por padrĂŁo, tudo **"simplesmente funciona"**. ### Validação { #validation } @@ -121,7 +121,7 @@ Toda a validação Ă© controlada pelo robusto e bem estabelecido **Pydantic**. Segurança e autenticação integradas. Sem nenhum compromisso com bancos de dados ou modelos de dados. -Todos os esquemas de seguranças definidos no OpenAPI, incluindo: +Todos os esquemas de segurança definidos no OpenAPI, incluindo: * HTTP Basic. * **OAuth2** (tambĂ©m com **tokens JWT**). Confira o tutorial em [OAuth2 com JWT](tutorial/security/oauth2-jwt.md). @@ -130,9 +130,9 @@ Todos os esquemas de seguranças definidos no OpenAPI, incluindo: * parĂąmetros da Query. * Cookies etc. -AlĂ©m disso, todos os recursos de segurança do Starlette (incluindo **cookies de sessĂŁo**). +AlĂ©m disso, todas as funcionalidades de segurança do Starlette (incluindo **cookies de sessĂŁo**). -Tudo construĂ­do como ferramentas e componentes reutilizĂĄveis que sĂŁo fĂĄceis de integrar com seus sistemas, armazenamento de dados, banco de dados relacionais e nĂŁo-relacionais etc. +Tudo construĂ­do como ferramentas e componentes reutilizĂĄveis que sĂŁo fĂĄceis de integrar com seus sistemas, armazenamentos de dados, bancos de dados relacionais e NoSQL etc. ### Injeção de dependĂȘncia { #dependency-injection } @@ -142,40 +142,40 @@ FastAPI inclui um sistema de @@ -52,9 +52,9 @@ $ fastapi dev
-É **ALTAMENTE recomendado** que vocĂȘ escreva ou copie o cĂłdigo, edite-o e rode-o localmente. +É **ALTAMENTE recomendado** que vocĂȘ escreva ou copie o cĂłdigo, edite-o e execute-o localmente. -UsĂĄ-lo em seu editor Ă© o que realmente te mostra os benefĂ­cios do FastAPI, ver quĂŁo pouco cĂłdigo vocĂȘ tem que escrever, todas as conferĂȘncias de tipo, preenchimento automĂĄtico, etc. +UsĂĄ-lo em seu editor Ă© o que realmente mostra os benefĂ­cios do FastAPI, vendo quĂŁo pouco cĂłdigo vocĂȘ tem que escrever, todas as verificaçÔes de tipo, preenchimento automĂĄtico, etc. --- @@ -94,7 +94,7 @@ O FastAPI tem uma [extensĂŁo oficial para o VS Code](https://marketplace.visuals HĂĄ tambĂ©m um **Guia Avançado de UsuĂĄrio** que vocĂȘ pode ler apĂłs esse **Tutorial - Guia de UsuĂĄrio**. -O **Guia Avançado de UsuĂĄrio** constrĂłi sobre esse, usa os mesmos conceitos e te ensina algumas funcionalidades extras. +O **Guia Avançado de UsuĂĄrio** constrĂłi sobre esse, usa os mesmos conceitos e ensina algumas funcionalidades extras. Mas vocĂȘ deveria ler primeiro o **Tutorial - Guia de UsuĂĄrio** (que vocĂȘ estĂĄ lendo agora). diff --git a/docs/pt/docs/tutorial/metadata.md b/docs/pt/docs/tutorial/metadata.md index 022e622ca..c6f76d215 100644 --- a/docs/pt/docs/tutorial/metadata.md +++ b/docs/pt/docs/tutorial/metadata.md @@ -11,7 +11,7 @@ VocĂȘ pode definir os seguintes campos que sĂŁo usados na especificação OpenAP | `title` | `str` | O tĂ­tulo da API. | | `summary` | `str` | Um breve resumo da API. DisponĂ­vel desde OpenAPI 3.1.0, FastAPI 0.99.0. | | `description` | `str` | Uma breve descrição da API. Pode usar Markdown. | -| `version` | `string` | A versĂŁo da API. Esta Ă© a versĂŁo da sua aplicação, nĂŁo do OpenAPI. Por exemplo, `2.5.0`. | +| `version` | `str` | A versĂŁo da API. Esta Ă© a versĂŁo da sua aplicação, nĂŁo do OpenAPI. Por exemplo, `2.5.0`. | | `terms_of_service` | `str` | Uma URL para os Termos de Serviço da API. Se fornecido, deve ser uma URL. | | `contact` | `dict` | As informaçÔes de contato da API exposta. Pode conter vĂĄrios campos.
Campos de contact
ParùmetroTipoDescrição
namestrO nome identificador da pessoa/organização de contato.
urlstrA URL que aponta para as informaçÔes de contato. DEVE estar no formato de uma URL.
emailstrO endereço de e-mail da pessoa/organização de contato. DEVE estar no formato de um endereço de e-mail.
| | `license_info` | `dict` | As informaçÔes de licença para a API exposta. Ela pode conter vårios campos.
Campos de license_info
ParùmetroTipoDescrição
namestrOBRIGATÓRIO (se um license_info for definido). O nome da licença usada para a API.
identifierstrUma expressão de licença [SPDX](https://spdx.org/licenses/) para a API. O campo identifier é mutuamente exclusivo do campo url. Disponível desde OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrUma URL para a licença usada para a API. DEVE estar no formato de uma URL.
| @@ -80,7 +80,7 @@ Leia mais sobre tags em [Configuração de operação de rota](path-operation-co /// -### Cheque os documentos { #check-the-docs } +### Verifique a documentação { #check-the-docs } Agora, se vocĂȘ verificar a documentação, ela exibirĂĄ todos os metadados adicionais: diff --git a/docs/pt/docs/tutorial/path-operation-configuration.md b/docs/pt/docs/tutorial/path-operation-configuration.md index 3559667bd..cce159fa6 100644 --- a/docs/pt/docs/tutorial/path-operation-configuration.md +++ b/docs/pt/docs/tutorial/path-operation-configuration.md @@ -40,7 +40,7 @@ Eles serĂŁo adicionados ao esquema OpenAPI e usados pelas interfaces de document ### Tags com Enums { #tags-with-enums } -Se vocĂȘ tem uma grande aplicação, vocĂȘ pode acabar acumulando **vĂĄrias tags**, e vocĂȘ gostaria de ter certeza de que vocĂȘ sempre usa a ** mesma tag** para *operaçÔes de rota* relacionadas. +Se vocĂȘ tem uma grande aplicação, vocĂȘ pode acabar acumulando **vĂĄrias tags**, e vocĂȘ gostaria de ter certeza de que vocĂȘ sempre usa a **mesma tag** para *operaçÔes de rota* relacionadas. Nestes casos, pode fazer sentido armazenar as tags em um `Enum`. diff --git a/docs/pt/docs/tutorial/query-params-str-validations.md b/docs/pt/docs/tutorial/query-params-str-validations.md index fe703c624..d37db2875 100644 --- a/docs/pt/docs/tutorial/query-params-str-validations.md +++ b/docs/pt/docs/tutorial/query-params-str-validations.md @@ -18,7 +18,7 @@ Ter `str | None` permitirĂĄ que seu editor lhe ofereça melhor suporte e detecte ## Validação adicional { #additional-validation } -Vamos impor que, embora `q` seja opcional, sempre que for fornecido, seu comprimento nĂŁo exceda 50 caracteres. +Vamos impor que, embora `q` seja opcional, sempre que for fornecido, **seu comprimento nĂŁo exceda 50 caracteres**. ### Importe `Query` e `Annotated` { #import-query-and-annotated } @@ -69,19 +69,19 @@ Agora que temos esse `Annotated` onde podemos colocar mais informaçÔes (neste Perceba que o valor padrĂŁo continua sendo `None`, entĂŁo o parĂąmetro ainda Ă© opcional. -Mas agora, com `Query(max_length=50)` dentro de `Annotated`, estamos dizendo ao FastAPI que queremos validação adicional para este valor, queremos que tenha no mĂĄximo 50 caracteres. 😎 +Mas agora, com `Query(max_length=50)` dentro de `Annotated`, estamos dizendo ao FastAPI que queremos **validação adicional** para este valor, queremos que tenha no mĂĄximo 50 caracteres. 😎 /// tip | Dica -Aqui estamos usando `Query()` porque este Ă© um parĂąmetro de consulta. Mais adiante veremos outros como `Path()`, `Body()`, `Header()` e `Cookie()`, que tambĂ©m aceitam os mesmos argumentos que `Query()`. +Aqui estamos usando `Query()` porque este Ă© um **parĂąmetro de consulta**. Mais adiante veremos outros como `Path()`, `Body()`, `Header()` e `Cookie()`, que tambĂ©m aceitam os mesmos argumentos que `Query()`. /// Agora o FastAPI vai: -* Validar os dados garantindo que o comprimento mĂĄximo seja de 50 caracteres -* Mostrar um erro claro para o cliente quando os dados nĂŁo forem vĂĄlidos -* Documentar o parĂąmetro na operação de rota do esquema OpenAPI (entĂŁo ele aparecerĂĄ na UI de docs automĂĄtica) +* **Validar** os dados garantindo que o comprimento mĂĄximo seja de 50 caracteres +* Mostrar um **erro claro** para o cliente quando os dados nĂŁo forem vĂĄlidos +* **Documentar** o parĂąmetro na *operação de rota* do esquema OpenAPI (entĂŁo ele aparecerĂĄ na **UI de documentação automĂĄtica**) ## Alternativa (antiga): `Query` como valor padrĂŁo { #alternative-old-query-as-the-default-value } @@ -120,7 +120,7 @@ EntĂŁo, podemos passar mais parĂąmetros para `Query`. Neste caso, o parĂąmetro ` q: str | None = Query(default=None, max_length=50) ``` -Isso validarĂĄ os dados, mostrarĂĄ um erro claro quando os dados nĂŁo forem vĂĄlidos e documentarĂĄ o parĂąmetro na operação de rota do esquema OpenAPI. +Isso validarĂĄ os dados, mostrarĂĄ um erro claro quando os dados nĂŁo forem vĂĄlidos e documentarĂĄ o parĂąmetro na *operação de rota* do esquema OpenAPI. ### `Query` como valor padrĂŁo ou em `Annotated` { #query-as-the-default-value-or-in-annotated } @@ -150,13 +150,13 @@ q: str = Query(default="rick") ### Vantagens de `Annotated` { #advantages-of-annotated } -Usar `Annotated` Ă© recomendado em vez do valor padrĂŁo nos parĂąmetros da função, Ă© melhor por vĂĄrios motivos. đŸ€“ +**Usar `Annotated` Ă© recomendado** em vez do valor padrĂŁo nos parĂąmetros da função, Ă© **melhor** por vĂĄrios motivos. đŸ€“ -O valor padrĂŁo do parĂąmetro da função Ă© o valor padrĂŁo real, isso Ă© mais intuitivo com Python em geral. 😌 +O valor **padrĂŁo** do **parĂąmetro da função** Ă© o valor **padrĂŁo real**, isso Ă© mais intuitivo com Python em geral. 😌 -VocĂȘ poderia chamar essa mesma função em outros lugares sem FastAPI, e ela funcionaria como esperado. Se houver um parĂąmetro obrigatĂłrio (sem valor padrĂŁo), seu editor vai avisar com um erro, e o Python tambĂ©m reclamarĂĄ se vocĂȘ executĂĄ-la sem passar o parĂąmetro obrigatĂłrio. +VocĂȘ poderia **chamar** essa mesma função em **outros lugares** sem FastAPI, e ela **funcionaria como esperado**. Se houver um parĂąmetro **obrigatĂłrio** (sem valor padrĂŁo), seu **editor** vai avisar com um erro, e o **Python** tambĂ©m reclamarĂĄ se vocĂȘ executĂĄ-la sem passar o parĂąmetro obrigatĂłrio. -Quando vocĂȘ nĂŁo usa `Annotated` e em vez disso usa o estilo de valor padrĂŁo (antigo), se vocĂȘ chamar essa função sem FastAPI em outros lugares, terĂĄ que lembrar de passar os argumentos para a função para que funcione corretamente, caso contrĂĄrio os valores serĂŁo diferentes do esperado (por exemplo, `QueryInfo` ou algo parecido em vez de `str`). E seu editor nĂŁo vai avisar, e o Python tambĂ©m nĂŁo vai reclamar ao executar a função, apenas quando as operaçÔes internas falharem. +Quando vocĂȘ nĂŁo usa `Annotated` e em vez disso usa o **estilo de valor padrĂŁo (antigo)**, se vocĂȘ chamar essa função sem FastAPI em **outros lugares**, terĂĄ que **lembrar** de passar os argumentos para a função para que funcione corretamente, caso contrĂĄrio os valores serĂŁo diferentes do esperado (por exemplo, `QueryInfo` ou algo parecido em vez de `str`). E seu editor nĂŁo vai avisar, e o Python tambĂ©m nĂŁo vai reclamar ao executar a função, apenas quando as operaçÔes internas falharem. Como `Annotated` pode ter mais de uma anotação de metadados, vocĂȘ agora pode atĂ© usar a mesma função com outras ferramentas, como o [Typer](https://typer.tiangolo.com/). 🚀 @@ -168,7 +168,7 @@ VocĂȘ tambĂ©m pode adicionar um parĂąmetro `min_length`: ## Adicione expressĂ”es regulares { #add-regular-expressions } -VocĂȘ pode definir um `pattern` de expressĂŁo regular que o parĂąmetro deve corresponder: +VocĂȘ pode definir um `pattern` de expressĂŁo regular que o parĂąmetro deve corresponder: {* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *} @@ -178,9 +178,9 @@ Esse padrĂŁo especĂ­fico de expressĂŁo regular verifica se o valor recebido no p * `fixedquery`: tem exatamente o valor `fixedquery`. * `$`: termina ali, nĂŁo tem mais caracteres depois de `fixedquery`. -Se vocĂȘ se sentir perdido com essas ideias de "expressĂŁo regular", nĂŁo se preocupe. Esse Ă© um assunto difĂ­cil para muitas pessoas. VocĂȘ ainda pode fazer muitas coisas sem precisar de expressĂ”es regulares por enquanto. +Se vocĂȘ se sentir perdido com essas ideias de **"expressĂŁo regular"**, nĂŁo se preocupe. Esse Ă© um assunto difĂ­cil para muitas pessoas. VocĂȘ ainda pode fazer muitas coisas sem precisar de expressĂ”es regulares por enquanto. -Agora vocĂȘ sabe que, sempre que precisar delas, pode usĂĄ-las no FastAPI. +Agora vocĂȘ sabe que, sempre que precisar delas, pode usĂĄ-las no **FastAPI**. ## Valores padrĂŁo { #default-values } @@ -242,7 +242,7 @@ EntĂŁo, com uma URL como: http://localhost:8000/items/?q=foo&q=bar ``` -vocĂȘ receberia os mĂșltiplos valores dos parĂąmetros de consulta `q` (`foo` e `bar`) em uma `list` Python dentro da sua função de operação de rota, no parĂąmetro da função `q`. +vocĂȘ receberia os mĂșltiplos valores dos *parĂąmetros de consulta* `q` (`foo` e `bar`) em uma `list` Python dentro da sua *função de operação de rota*, no *parĂąmetro da função* `q`. Assim, a resposta para essa URL seria: @@ -360,15 +360,15 @@ A documentação vai mostrar assim: ## Excluir parĂąmetros do OpenAPI { #exclude-parameters-from-openapi } -Para excluir um parĂąmetro de consulta do OpenAPI gerado (e portanto, dos sistemas de documentação automĂĄticos), defina o parĂąmetro `include_in_schema` de `Query` como `False`: +Para excluir um parĂąmetro de consulta do esquema OpenAPI gerado (e portanto, dos sistemas de documentação automĂĄticos), defina o parĂąmetro `include_in_schema` de `Query` como `False`: {* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *} ## Validação personalizada { #custom-validation } -Podem existir casos em que vocĂȘ precise fazer alguma validação personalizada que nĂŁo pode ser feita com os parĂąmetros mostrados acima. +Podem existir casos em que vocĂȘ precise fazer alguma **validação personalizada** que nĂŁo pode ser feita com os parĂąmetros mostrados acima. -Nesses casos, vocĂȘ pode usar uma função validadora personalizada que Ă© aplicada apĂłs a validação normal (por exemplo, depois de validar que o valor Ă© uma `str`). +Nesses casos, vocĂȘ pode usar uma **função validadora personalizada** que Ă© aplicada apĂłs a validação normal (por exemplo, depois de validar que o valor Ă© uma `str`). VocĂȘ pode fazer isso usando o [`AfterValidator` do Pydantic](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) dentro de `Annotated`. @@ -390,15 +390,15 @@ Isso estĂĄ disponĂ­vel com a versĂŁo 2 do Pydantic ou superior. 😎 /// tip | Dica -Se vocĂȘ precisar fazer qualquer tipo de validação que exija comunicação com algum componente externo, como um banco de dados ou outra API, vocĂȘ deveria usar DependĂȘncias do FastAPI em vez disso; vocĂȘ aprenderĂĄ sobre elas mais adiante. +Se vocĂȘ precisar fazer qualquer tipo de validação que exija comunicação com algum **componente externo**, como um banco de dados ou outra API, vocĂȘ deveria usar **DependĂȘncias do FastAPI** em vez disso; vocĂȘ aprenderĂĄ sobre elas mais adiante. -Esses validadores personalizados sĂŁo para coisas que podem ser verificadas apenas com os mesmos dados fornecidos na requisição. +Esses validadores personalizados sĂŁo para coisas que podem ser verificadas **apenas** com os **mesmos dados** fornecidos na requisição. /// ### Entenda esse cĂłdigo { #understand-that-code } -O ponto importante Ă© apenas usar `AfterValidator` com uma função dentro de `Annotated`. Sinta-se Ă  vontade para pular esta parte. đŸ€ž +O ponto importante Ă© apenas usar **`AfterValidator` com uma função dentro de `Annotated`**. Sinta-se Ă  vontade para pular esta parte. đŸ€ž --- @@ -416,13 +416,13 @@ Com `data.items()` obtemos um `) enviam os dados para o servidor normalmente usa uma codificação "especial" para esses dados, a qual Ă© diferente do JSON. @@ -119,9 +119,9 @@ O jeito que os formulĂĄrios HTML (`
`) enviam os dados para o servid Dados de formulĂĄrios normalmente sĂŁo codificados usando o "media type" `application/x-www-form-urlencoded` quando nĂŁo incluem arquivos. -Mas quando o formulĂĄrio inclui arquivos, ele Ă© codificado como `multipart/form-data`. Se vocĂȘ usar `File`, o **FastAPI** saberĂĄ que tem que pegar os arquivos da parte correta do corpo da requisição. +Mas quando o formulĂĄrio inclui arquivos, ele Ă© codificado como `multipart/form-data`. Se vocĂȘ usar `File`, o **FastAPI** saberĂĄ que tem que pegar os arquivos da parte correta do corpo. -Se vocĂȘ quiser ler mais sobre essas codificaçÔes e campos de formulĂĄrio, vĂĄ para a [MDN web docs para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). +Se vocĂȘ quiser ler mais sobre essas codificaçÔes e campos de formulĂĄrio, vĂĄ para a [documentação web da MDN para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// diff --git a/docs/pt/docs/tutorial/request-forms.md b/docs/pt/docs/tutorial/request-forms.md index d99c51650..bfca3562a 100644 --- a/docs/pt/docs/tutorial/request-forms.md +++ b/docs/pt/docs/tutorial/request-forms.md @@ -56,7 +56,7 @@ Os dados dos formulĂĄrios sĂŁo normalmente codificados usando o "media type" `ap Mas quando o formulĂĄrio inclui arquivos, ele Ă© codificado como `multipart/form-data`. VocĂȘ lerĂĄ sobre como lidar com arquivos no prĂłximo capĂ­tulo. -Se vocĂȘ quiser ler mais sobre essas codificaçÔes e campos de formulĂĄrio, vĂĄ para o [MDN web docs para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). +Se vocĂȘ quiser ler mais sobre essas codificaçÔes e campos de formulĂĄrio, vĂĄ para a [documentação web da MDN para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// diff --git a/docs/pt/docs/tutorial/response-status-code.md b/docs/pt/docs/tutorial/response-status-code.md index f02aeb0b4..aeeaf225d 100644 --- a/docs/pt/docs/tutorial/response-status-code.md +++ b/docs/pt/docs/tutorial/response-status-code.md @@ -12,7 +12,7 @@ Da mesma forma que vocĂȘ pode especificar um modelo de resposta, vocĂȘ tambĂ©m p /// note | Nota -Observe que `status_code` Ă© um parĂąmetro do mĂ©todo "decorador" (`get`, `post`, etc). NĂŁo da sua função de *operação de rota*, como todos os parĂąmetros e corpo. +Observe que `status_code` Ă© um parĂąmetro do mĂ©todo "decorador" (`get`, `post`, etc). NĂŁo da sua *função de operação de rota*, como todos os parĂąmetros e corpo. /// @@ -35,7 +35,7 @@ Dessa forma: Alguns cĂłdigos de resposta (consulte a prĂłxima seção) indicam que a resposta nĂŁo possui um corpo. -O FastAPI sabe disso e produzirĂĄ documentos OpenAPI informando que nĂŁo hĂĄ corpo de resposta. +O FastAPI sabe disso e produzirĂĄ documentação OpenAPI informando que nĂŁo hĂĄ corpo de resposta. /// @@ -84,7 +84,7 @@ VocĂȘ pode usar as variĂĄveis de conveniĂȘncia de `fastapi.status`. {* ../../docs_src/response_status_code/tutorial002_py310.py hl[1,6] *} -Eles sĂŁo apenas uma conveniĂȘncia, eles possuem o mesmo nĂșmero, mas dessa forma vocĂȘ pode usar o preenchimento automĂĄtico do editor para encontrĂĄ-los: +Eles sĂŁo apenas uma conveniĂȘncia, eles possuem o mesmo nĂșmero, mas dessa forma vocĂȘ pode usar o autocompletar do editor para encontrĂĄ-los: diff --git a/docs/pt/docs/tutorial/schema-extra-example.md b/docs/pt/docs/tutorial/schema-extra-example.md index 2feeb5438..6e10c5857 100644 --- a/docs/pt/docs/tutorial/schema-extra-example.md +++ b/docs/pt/docs/tutorial/schema-extra-example.md @@ -1,5 +1,6 @@ # Declare dados de exemplo da requisição { #declare-request-example-data } + VocĂȘ pode declarar exemplos dos dados que sua aplicação pode receber. Aqui estĂŁo vĂĄrias maneiras de fazer isso. diff --git a/docs/pt/docs/tutorial/security/first-steps.md b/docs/pt/docs/tutorial/security/first-steps.md index fe5b4e704..9780f8a69 100644 --- a/docs/pt/docs/tutorial/security/first-steps.md +++ b/docs/pt/docs/tutorial/security/first-steps.md @@ -62,9 +62,9 @@ VocĂȘ verĂĄ algo deste tipo: /// tip | BotĂŁo Autorizar! -VocĂȘ jĂĄ tem um novo botĂŁo 'Authorize'. +VocĂȘ jĂĄ tem um novo e brilhante botĂŁo "Authorize". -E sua operação de rota tem um pequeno cadeado no canto superior direito em que vocĂȘ pode clicar. +E sua *operação de rota* tem um pequeno cadeado no canto superior direito em que vocĂȘ pode clicar. /// @@ -80,7 +80,7 @@ NĂŁo importa o que vocĂȘ digite no formulĂĄrio, ainda nĂŁo vai funcionar. Mas n Claro que este nĂŁo Ă© o frontend para os usuĂĄrios finais, mas Ă© uma Ăłtima ferramenta automĂĄtica para documentar interativamente toda a sua API. -Pode ser usada pelo time de frontend (que pode ser vocĂȘ mesmo). +Pode ser usada pela equipe de frontend (que pode ser vocĂȘ mesmo). Pode ser usada por aplicaçÔes e sistemas de terceiros. @@ -106,7 +106,7 @@ EntĂŁo, vamos rever de um ponto de vista simplificado: * EntĂŁo, o usuĂĄrio terĂĄ que fazer login novamente em algum momento. * E se o token for roubado, o risco Ă© menor. NĂŁo Ă© como uma chave permanente que funcionarĂĄ para sempre (na maioria dos casos). * O frontend armazena esse token temporariamente em algum lugar. -* O usuĂĄrio clica no frontend para ir para outra seção do aplicativo web. +* O usuĂĄrio clica no frontend para ir para outra seção da aplicação web do frontend. * O frontend precisa buscar mais dados da API. * Mas precisa de autenticação para aquele endpoint especĂ­fico. * EntĂŁo, para autenticar com nossa API, ele envia um header `Authorization` com o valor `Bearer ` mais o token. @@ -144,7 +144,7 @@ Usar uma URL relativa Ă© importante para garantir que sua aplicação continue f /// -Esse parĂąmetro nĂŁo cria aquele endpoint/operação de rota, mas declara que a URL `/token` serĂĄ aquela que o client deve usar para obter o token. Essa informação Ă© usada no OpenAPI e depois nos sistemas de documentação interativa da API. +Esse parĂąmetro nĂŁo cria aquele endpoint / *operação de rota*, mas declara que a URL `/token` serĂĄ aquela que o client deve usar para obter o token. Essa informação Ă© usada no OpenAPI e depois nos sistemas de documentação interativa da API. Em breve tambĂ©m criaremos a operação de rota real. diff --git a/docs/pt/docs/tutorial/security/get-current-user.md b/docs/pt/docs/tutorial/security/get-current-user.md index 2c505f148..d56de4f8f 100644 --- a/docs/pt/docs/tutorial/security/get-current-user.md +++ b/docs/pt/docs/tutorial/security/get-current-user.md @@ -14,7 +14,7 @@ Primeiro, vamos criar um modelo de usuĂĄrio com Pydantic. Da mesma forma que usamos o Pydantic para declarar corpos, podemos usĂĄ-lo em qualquer outro lugar: -{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *} +{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *} ## Criar uma dependĂȘncia `get_current_user` { #create-a-get-current-user-dependency } diff --git a/docs/pt/docs/tutorial/security/oauth2-jwt.md b/docs/pt/docs/tutorial/security/oauth2-jwt.md index a571b799d..dbbbdc79d 100644 --- a/docs/pt/docs/tutorial/security/oauth2-jwt.md +++ b/docs/pt/docs/tutorial/security/oauth2-jwt.md @@ -1,6 +1,6 @@ # OAuth2 com Senha (e hashing), Bearer com tokens JWT { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens } -Agora que temos todo o fluxo de segurança, vamos tornar a aplicação realmente segura, usando tokens JWT e hashing de senhas seguras. +Agora que temos todo o fluxo de segurança, vamos tornar a aplicação realmente segura, usando tokens JWT e hashing seguro de senhas. Este cĂłdigo Ă© algo que vocĂȘ pode realmente usar na sua aplicação, salvar os hashes das senhas no seu banco de dados, etc. @@ -44,7 +44,7 @@ $ pip install pyjwt /// note | Nota -Se vocĂȘ pretende utilizar algoritmos de assinatura digital como o RSA ou o ECDSA, vocĂȘ deve instalar a dependĂȘncia da biblioteca de criptografia `pyjwt[crypto]`. +Se vocĂȘ pretende utilizar algoritmos de assinatura digital como o RSA ou o ECDSA, vocĂȘ deveria instalar a dependĂȘncia da biblioteca de criptografia `pyjwt[crypto]`. VocĂȘ pode ler mais sobre isso na [documentação de instalação do PyJWT](https://pyjwt.readthedocs.io/en/latest/installation.html). @@ -88,7 +88,7 @@ $ pip install "pwdlib[argon2]" Com o `pwdlib`, vocĂȘ poderia atĂ© configurĂĄ-lo para ser capaz de ler senhas criadas pelo **Django**, um plug-in de segurança do **Flask** ou muitos outros. -Assim, vocĂȘ poderia, por exemplo, compartilhar os mesmos dados de um aplicativo Django em um banco de dados com um aplicativo FastAPI. Ou migrar gradualmente uma aplicação Django usando o mesmo banco de dados. +Assim, vocĂȘ poderia, por exemplo, compartilhar os mesmos dados de uma aplicação Django em um banco de dados com uma aplicação FastAPI. Ou migrar gradualmente uma aplicação Django usando o mesmo banco de dados. E seus usuĂĄrios poderiam fazer login tanto pela sua aplicação Django quanto pela sua aplicação **FastAPI**, ao mesmo tempo. @@ -260,7 +260,7 @@ Com o que vocĂȘ viu atĂ© agora, vocĂȘ pode configurar uma aplicação **FastAPI* Em quase qualquer framework, lidar com a segurança se torna rapidamente um assunto bastante complexo. -Muitos pacotes que simplificam bastante isso precisam fazer muitas concessĂ”es com o modelo de dados, o banco de dados e os recursos disponĂ­veis. E alguns desses pacotes que simplificam demais na verdade tĂȘm falhas de segurança subjacentes. +Muitos pacotes que simplificam bastante isso precisam fazer muitas concessĂ”es com o modelo de dados, o banco de dados e as funcionalidades disponĂ­veis. E alguns desses pacotes que simplificam demais na verdade tĂȘm falhas de segurança subjacentes. --- diff --git a/docs/pt/docs/tutorial/security/simple-oauth2.md b/docs/pt/docs/tutorial/security/simple-oauth2.md index fdfe21a26..802879a53 100644 --- a/docs/pt/docs/tutorial/security/simple-oauth2.md +++ b/docs/pt/docs/tutorial/security/simple-oauth2.md @@ -6,7 +6,7 @@ Agora vamos construir a partir do capĂ­tulo anterior e adicionar as partes que f Vamos usar os utilitĂĄrios de segurança da **FastAPI** para obter o `username` e a `password`. -OAuth2 especifica que ao usar o "password flow" (fluxo de senha), que estamos usando, o cliente/usuĂĄrio deve enviar os campos `username` e `password` como dados do formulĂĄrio. +OAuth2 especifica que, ao usar o "fluxo de senha" (que estamos usando), o cliente/usuĂĄrio deve enviar os campos `username` e `password` como dados do formulĂĄrio. E a especificação diz que os campos devem ser nomeados assim. Portanto, `user-name` ou `email` nĂŁo funcionariam. @@ -29,7 +29,7 @@ Cada “scope” Ă© apenas uma string (sem espaços). Normalmente sĂŁo usados para declarar permissĂ”es de segurança especĂ­ficas, por exemplo: * `users:read` ou `users:write` sĂŁo exemplos comuns. -* `instagram_basic` Ă© usado pelo Facebook e Instagram. +* `instagram_basic` Ă© usado pelo Facebook / Instagram. * `https://www.googleapis.com/auth/drive` Ă© usado pelo Google. /// note | Nota @@ -78,7 +78,7 @@ O `OAuth2PasswordRequestForm` nĂŁo Ă© uma classe especial para **FastAPI** como `OAuth2PasswordBearer` faz com que **FastAPI** saiba que Ă© um esquema de segurança. Portanto, Ă© adicionado dessa forma ao OpenAPI. -Mas `OAuth2PasswordRequestForm` Ă© apenas uma dependĂȘncia de classe que vocĂȘ mesmo poderia ter escrito ou poderia ter declarado os parĂąmetros do `Form` (formulĂĄrio) diretamente. +Mas `OAuth2PasswordRequestForm` Ă© apenas uma dependĂȘncia de classe que vocĂȘ mesmo poderia ter escrito ou poderia ter declarado os parĂąmetros de `Form` diretamente. Mas como Ă© um caso de uso comum, ele Ă© fornecido diretamente pelo **FastAPI**, apenas para facilitar. @@ -108,7 +108,7 @@ Neste ponto temos os dados do usuĂĄrio do nosso banco de dados, mas nĂŁo verific Vamos colocar esses dados primeiro no modelo `UserInDB` do Pydantic. -VocĂȘ nunca deve salvar senhas em texto simples, portanto, usaremos o sistema de hashing de senhas (falsas). +VocĂȘ nunca deveria salvar senhas em texto simples, portanto, usaremos o sistema (falso) de hashing de senhas. Se as senhas nĂŁo corresponderem, retornaremos o mesmo erro. @@ -120,7 +120,7 @@ Sempre que vocĂȘ passa exatamente o mesmo conteĂșdo (exatamente a mesma senha), Mas vocĂȘ nĂŁo pode converter a sequĂȘncia aleatĂłria de caracteres de volta para a senha. -##### Porque usar hashing de senha { #why-use-password-hashing } +##### Por que usar hashing de senha { #why-use-password-hashing } Se o seu banco de dados for roubado, o ladrĂŁo nĂŁo terĂĄ as senhas em texto simples dos seus usuĂĄrios, apenas os hashes. @@ -146,7 +146,7 @@ UserInDB( /// note | Nota -Para uma explicação mais completa de `**user_dict`, verifique [a documentação para **Extra Models**](../extra-models.md#about-user-in-dict). +Para uma explicação mais completa de `**user_dict`, verifique [a documentação para **Extra Models**](../extra-models.md#about-user-in-model-dump). /// diff --git a/docs/pt/docs/tutorial/sql-databases.md b/docs/pt/docs/tutorial/sql-databases.md index 10be4c865..e715007eb 100644 --- a/docs/pt/docs/tutorial/sql-databases.md +++ b/docs/pt/docs/tutorial/sql-databases.md @@ -4,7 +4,7 @@ Aqui veremos um exemplo usando [SQLModel](https://sqlmodel.tiangolo.com/). -**SQLModel** Ă© construĂ­do sobre [SQLAlchemy](https://www.sqlalchemy.org/) e Pydantic. Ele foi criado pelo mesmo autor do **FastAPI** para ser o par perfeito para aplicaçÔes **FastAPI** que precisam usar **bancos de dados SQL**. +**SQLModel** Ă© construĂ­do sobre [SQLAlchemy](https://www.sqlalchemy.org/) e Pydantic. Ele foi criado pelo mesmo autor do **FastAPI** para ser o par perfeito para aplicaçÔes FastAPI que precisam usar **bancos de dados SQL**. /// tip | Dica @@ -32,7 +32,7 @@ Existe um gerador de projetos oficial com **FastAPI** e **PostgreSQL** incluindo Este Ă© um tutorial muito simples e curto, se vocĂȘ quiser aprender sobre bancos de dados em geral, sobre SQL ou recursos mais avançados, acesse a [documentação do SQLModel](https://sqlmodel.tiangolo.com/). -## Instalar o `SQLModel` { #install-sqlmodel } +## Instale o `SQLModel` { #install-sqlmodel } Primeiro, certifique-se de criar seu [ambiente virtual](../virtual-environments.md), ativĂĄ-lo e, em seguida, instalar o `sqlmodel`: @@ -45,13 +45,13 @@ $ pip install sqlmodel
-## Crear o App com um Único Modelo { #create-the-app-with-a-single-model } +## Crie o App com um Único Modelo { #create-the-app-with-a-single-model } Vamos criar a primeira versĂŁo mais simples do app com um Ășnico modelo **SQLModel**. Depois, vamos melhorĂĄ-lo aumentando a segurança e versatilidade com **mĂșltiplos modelos** abaixo. đŸ€“ -### Criar Modelos { #create-models } +### Crie Modelos { #create-models } Importe o `SQLModel` e crie um modelo de banco de dados: @@ -71,7 +71,8 @@ Existem algumas diferenças: O SQLModel saberĂĄ que algo declarado como `str` serĂĄ uma coluna SQL do tipo `TEXT` (ou `VARCHAR`, dependendo do banco de dados). -### Criar um Engine { #create-an-engine } +### Crie um Engine { #create-an-engine } + Um `engine` SQLModel (por baixo dos panos, ele Ă© na verdade um `engine` do SQLAlchemy) Ă© o que **mantĂ©m as conexĂ”es** com o banco de dados. VocĂȘ teria **um Ășnico objeto `engine`** para todo o seu cĂłdigo se conectar ao mesmo banco de dados. @@ -82,13 +83,13 @@ Usar `check_same_thread=False` permite que o FastAPI use o mesmo banco de dados NĂŁo se preocupe, com a forma como o cĂłdigo estĂĄ estruturado, garantiremos que usamos **uma Ășnica *sessĂŁo* SQLModel por requisição** mais tarde, isso Ă© realmente o que o `check_same_thread` estĂĄ tentando conseguir. -### Criar as Tabelas { #create-the-tables } +### Crie as Tabelas { #create-the-tables } Em seguida, adicionamos uma função que usa `SQLModel.metadata.create_all(engine)` para **criar as tabelas** para todos os *modelos de tabela*. {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[21:22] hl[21:22] *} -### Criar uma DependĂȘncia de SessĂŁo { #create-a-session-dependency } +### Crie uma DependĂȘncia de SessĂŁo { #create-a-session-dependency } Uma **`Session`** Ă© o que armazena os **objetos na memĂłria** e acompanha as alteraçÔes necessĂĄrias nos dados, para entĂŁo **usar o `engine`** para se comunicar com o banco de dados. @@ -98,7 +99,7 @@ EntĂŁo, criamos uma dependĂȘncia `Annotated` chamada `SessionDep` para simplific {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[25:30] hl[25:27,30] *} -### Criar Tabelas de Banco de Dados na Inicialização { #create-database-tables-on-startup } +### Crie Tabelas de Banco de Dados na Inicialização { #create-database-tables-on-startup } Vamos criar as tabelas do banco de dados quando o aplicativo for iniciado. @@ -114,7 +115,7 @@ O SQLModel terĂĄ utilitĂĄrios de migração envolvendo o Alembic, mas por enquan /// -### Criar um Hero { #create-a-hero } +### Crie um Hero { #create-a-hero } Como cada modelo SQLModel tambĂ©m Ă© um modelo Pydantic, vocĂȘ pode usĂĄ-lo nas mesmas **anotaçÔes de tipo** que usaria para modelos Pydantic. @@ -126,25 +127,25 @@ Da mesma forma, vocĂȘ pode declarĂĄ-lo como o **tipo de retorno** da função, e Aqui, usamos a dependĂȘncia `SessionDep` (uma `Session`) para adicionar o novo `Hero` Ă  instĂąncia `Session`, fazer commit das alteraçÔes no banco de dados, atualizar os dados no `hero` e entĂŁo retornĂĄ-lo. -### Ler Heroes { #read-heroes } +### Leia Heroes { #read-heroes } Podemos **ler** `Hero`s do banco de dados usando um `select()`. Podemos incluir um `limit` e `offset` para paginar os resultados. {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[48:55] hl[51:52,54] *} -### Ler um Único Hero { #read-one-hero } +### Leia um Único Hero { #read-one-hero } Podemos **ler** um Ășnico `Hero`. {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[58:63] hl[60] *} -### Deletar um Hero { #delete-a-hero } +### Delete um Hero { #delete-a-hero } TambĂ©m podemos **deletar** um `Hero`. {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[66:73] hl[71] *} -### Executar o App { #run-the-app } +### Execute o App { #run-the-app } VocĂȘ pode executar o app: @@ -164,19 +165,19 @@ EntĂŁo, vĂĄ para a interface `/docs`, vocĂȘ verĂĄ que o **FastAPI** estĂĄ usando -## Atualizar o App com MĂșltiplos Modelos { #update-the-app-with-multiple-models } +## Atualize o App com MĂșltiplos Modelos { #update-the-app-with-multiple-models } Agora vamos **refatorar** este app um pouco para aumentar a **segurança** e **versatilidade**. -Se vocĂȘ verificar o app anterior, na interface vocĂȘ pode ser que, atĂ© agora, ele permite que o cliente decida o `id` do `Hero` a ser criado. đŸ˜± +Se vocĂȘ verificar o app anterior, na interface vocĂȘ pode ver que, atĂ© agora, ele permite que o cliente decida o `id` do `Hero` a ser criado. đŸ˜± -NĂŁo deverĂ­amos deixar isso acontecer, eles poderiam sobrescrever um `id` que jĂĄ atribuimos na base de dados. Decidir o `id` deve ser feito pelo **backend** ou pelo **banco de dados**, **nĂŁo pelo cliente**. +NĂŁo deverĂ­amos deixar isso acontecer, eles poderiam sobrescrever um `id` que jĂĄ atribuĂ­mos no banco de dados. Decidir o `id` deve ser feito pelo **backend** ou pelo **banco de dados**, **nĂŁo pelo cliente**. AlĂ©m disso, criamos um `secret_name` para o hero, mas atĂ© agora estamos retornando ele em todos os lugares, isso nĂŁo Ă© muito **secreto**... 😅 Vamos corrigir essas coisas adicionando alguns **modelos extras**. Aqui Ă© onde o SQLModel vai brilhar. ✹ -### Criar MĂșltiplos Modelos { #create-multiple-models } +### Crie MĂșltiplos Modelos { #create-multiple-models } No **SQLModel**, qualquer classe de modelo que tenha `table=True` Ă© um **modelo de tabela**. @@ -277,7 +278,7 @@ Os campos de `HeroUpdate` sĂŁo: {* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:28] hl[25:28] *} -### Criar com `HeroCreate` e retornar um `HeroPublic` { #create-with-herocreate-and-return-a-heropublic } +### Crie com `HeroCreate` e retorne um `HeroPublic` { #create-with-herocreate-and-return-a-heropublic } Agora que temos **mĂșltiplos modelos**, podemos atualizar as partes do app que os utilizam. @@ -299,19 +300,19 @@ Ao declarĂĄ-lo no `response_model`, estamos dizendo ao **FastAPI** para fazer o /// -### Ler Heroes com `HeroPublic` { #read-heroes-with-heropublic } +### Leia Heroes com `HeroPublic` { #read-heroes-with-heropublic } Podemos fazer o mesmo que antes para **ler** `Hero`s, novamente, usamos `response_model=list[HeroPublic]` para garantir que os dados sejam validados e serializados corretamente. {* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[65:72] hl[65] *} -### Ler Um Hero com `HeroPublic` { #read-one-hero-with-heropublic } +### Leia Um Hero com `HeroPublic` { #read-one-hero-with-heropublic } Podemos **ler** um Ășnico herĂłi: {* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[75:80] hl[77] *} -### Atualizar um Hero com `HeroUpdate` { #update-a-hero-with-heroupdate } +### Atualize um Hero com `HeroUpdate` { #update-a-hero-with-heroupdate } Podemos **atualizar um hero**. Para isso, usamos uma operação HTTP `PATCH`. @@ -321,7 +322,7 @@ Em seguida, usamos `hero_db.sqlmodel_update(hero_data)` para atualizar o `hero_d {* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[83:93] hl[83:84,88:89] *} -### Deletar um Hero Novamente { #delete-a-hero-again } +### Delete um Hero Novamente { #delete-a-hero-again } **Deletar** um hero permanece praticamente o mesmo. @@ -329,7 +330,7 @@ NĂŁo vamos satisfazer o desejo de refatorar tudo neste aqui. 😅 {* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[96:103] hl[101] *} -### Executar o App Novamente { #run-the-app-again } +### Execute o App Novamente { #run-the-app-again } VocĂȘ pode executar o app novamente: diff --git a/docs/pt/docs/tutorial/static-files.md b/docs/pt/docs/tutorial/static-files.md index e9150facd..4e8d4319a 100644 --- a/docs/pt/docs/tutorial/static-files.md +++ b/docs/pt/docs/tutorial/static-files.md @@ -2,6 +2,14 @@ VocĂȘ pode servir arquivos estĂĄticos automaticamente a partir de um diretĂłrio usando `StaticFiles`. +/// tip | Dica + +Se vocĂȘ precisar hospedar um frontend, use `app.frontend()` em vez disso, leia sobre isso em [Frontend](frontend.md). + +`app.frontend()` usa `StaticFiles` por baixo, com vĂĄrias vantagens adicionais para frontends, como lidar com roteamento do lado do cliente. + +/// + ## Use `StaticFiles` { #use-staticfiles } * Importe `StaticFiles`. diff --git a/docs/pt/docs/tutorial/testing.md b/docs/pt/docs/tutorial/testing.md index e185102ae..9d94cddcd 100644 --- a/docs/pt/docs/tutorial/testing.md +++ b/docs/pt/docs/tutorial/testing.md @@ -52,7 +52,7 @@ VocĂȘ tambĂ©m pode usar `from starlette.testclient import TestClient`. /// tip | Dica -Se vocĂȘ quiser chamar funçÔes `async` em seus testes alĂ©m de enviar solicitaçÔes Ă  sua aplicação FastAPI (por exemplo, funçÔes de banco de dados assĂ­ncronas), dĂȘ uma olhada em [Testes assĂ­ncronos](../advanced/async-tests.md) no tutorial avançado. +Se vocĂȘ quiser chamar funçÔes `async` em seus testes alĂ©m de enviar requests Ă  sua aplicação FastAPI (por exemplo, funçÔes de banco de dados assĂ­ncronas), dĂȘ uma olhada em [Testes assĂ­ncronos](../advanced/async-tests.md) no tutorial avançado. /// @@ -94,6 +94,7 @@ Como esse arquivo estĂĄ no mesmo pacote, vocĂȘ pode usar importaçÔes relativas {* ../../docs_src/app_testing/app_a_py310/test_main.py hl[3] *} + ...e ter o cĂłdigo para os testes como antes. ## Testando: exemplo estendido { #testing-extended-example } @@ -112,13 +113,13 @@ Vamos continuar com a mesma estrutura de arquivo de antes: │   └── test_main.py ``` -Digamos que agora o arquivo `main.py` com sua aplicação **FastAPI** tenha algumas outras **operaçÔes de rotas**. +Digamos que agora o arquivo `main.py` com sua aplicação **FastAPI** tenha algumas outras **operaçÔes de rota**. Ele tem uma operação `GET` que pode retornar um erro. Ele tem uma operação `POST` que pode retornar vĂĄrios erros. -Ambas as *operaçÔes de rotas* requerem um cabeçalho `X-Token`. +Ambas as *operaçÔes de rota* requerem um cabeçalho `X-Token`. {* ../../docs_src/app_testing/app_b_an_py310/main.py *} @@ -128,6 +129,7 @@ VocĂȘ pode entĂŁo atualizar `test_main.py` com os testes estendidos: {* ../../docs_src/app_testing/app_b_an_py310/test_main.py *} + Sempre que vocĂȘ precisar que o cliente passe informaçÔes na requisição e nĂŁo souber como, vocĂȘ pode pesquisar (no Google) como fazer isso no `httpx`, ou atĂ© mesmo como fazer isso com `requests`, jĂĄ que o design do HTTPX Ă© baseado no design do Requests. Depois Ă© sĂł fazer o mesmo nos seus testes. @@ -146,7 +148,7 @@ Para mais informaçÔes sobre como passar dados para o backend (usando `httpx` o Observe que o `TestClient` recebe dados que podem ser convertidos para JSON, nĂŁo para modelos Pydantic. -Se vocĂȘ tiver um modelo Pydantic em seu teste e quiser enviar seus dados para o aplicativo durante o teste, poderĂĄ usar o `jsonable_encoder` descrito em [Codificador compatĂ­vel com JSON](encoder.md). +Se vocĂȘ tiver um modelo Pydantic em seu teste e quiser enviar seus dados para a aplicação durante o teste, poderĂĄ usar o `jsonable_encoder` descrito em [Codificador compatĂ­vel com JSON](encoder.md). /// diff --git a/docs/pt/docs/virtual-environments.md b/docs/pt/docs/virtual-environments.md index 245919608..121032d6c 100644 --- a/docs/pt/docs/virtual-environments.md +++ b/docs/pt/docs/virtual-environments.md @@ -26,7 +26,7 @@ Se vocĂȘ estiver pronto para adotar uma **ferramenta que gerencia tudo** para vo /// -## Criar um Projeto { #create-a-project } +## Crie um Projeto { #create-a-project } Primeiro, crie um diretĂłrio para seu projeto. @@ -212,7 +212,7 @@ Se ele mostrar o binĂĄrio `python` em `.venv\Scripts\python`, dentro do seu proj //// -## Atualizar `pip` { #upgrade-pip } +## Atualize `pip` { #upgrade-pip } /// tip | Dica @@ -262,7 +262,7 @@ Esse comando instalarĂĄ o pip caso ele ainda nĂŁo esteja instalado e tambĂ©m gar /// -## Adicionar `.gitignore` { #add-gitignore } +## Adicione `.gitignore` { #add-gitignore } Se vocĂȘ estiver usando **Git** (vocĂȘ deveria), adicione um arquivo `.gitignore` para excluir tudo em seu `.venv` do Git. @@ -302,7 +302,7 @@ Esse comando criarĂĄ um arquivo `.gitignore` com o conteĂșdo: /// -## Instalar Pacotes { #install-packages } +## Instale Pacotes { #install-packages } ApĂłs ativar o ambiente, vocĂȘ pode instalar pacotes nele. @@ -314,7 +314,7 @@ Se precisar atualizar uma versĂŁo ou adicionar um novo pacote, vocĂȘ **farĂĄ iss /// -### Instalar pacotes diretamente { #install-packages-directly } +### Instale pacotes diretamente { #install-packages-directly } Se estiver com pressa e nĂŁo quiser usar um arquivo para declarar os requisitos de pacote do seu projeto, vocĂȘ pode instalĂĄ-los diretamente. @@ -353,7 +353,7 @@ $ uv pip install "fastapi[standard]" //// -### Instalar a partir de `requirements.txt` { #install-from-requirements-txt } +### Instale a partir de `requirements.txt` { #install-from-requirements-txt } Se vocĂȘ tiver um `requirements.txt`, agora poderĂĄ usĂĄ-lo para instalar seus pacotes. @@ -425,7 +425,7 @@ Normalmente, vocĂȘ sĂł precisa fazer isso **uma vez**, ao criar o ambiente virtu /// -## Desativar o ambiente virtual { #deactivate-the-virtual-environment } +## Desative o ambiente virtual { #deactivate-the-virtual-environment } Quando terminar de trabalhar no seu projeto, vocĂȘ pode **desativar** o ambiente virtual. @@ -768,7 +768,7 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python Isso significa que o programa `python` que serĂĄ usado Ă© aquele **no ambiente virtual**. -vocĂȘ usa `which` no Linux e macOS e `Get-Command` no Windows PowerShell. +VocĂȘ usa `which` no Linux e macOS e `Get-Command` no Windows PowerShell. A maneira como esse comando funciona Ă© que ele vai e verifica na variĂĄvel de ambiente `PATH`, passando por **cada caminho em ordem**, procurando pelo programa chamado `python`. Uma vez que ele o encontre, ele **mostrarĂĄ o caminho** para esse programa. @@ -811,7 +811,7 @@ $ cd ~/code/prisoner-of-azkaban $ python main.py -// Erro ao importar o Sirius, ele nĂŁo estĂĄ instalado đŸ˜± +// Erro ao importar sirius, ele nĂŁo estĂĄ instalado đŸ˜± Traceback (most recent call last): File "main.py", line 1, in import sirius @@ -861,4 +861,4 @@ Quando estiver pronto e quiser usar uma ferramenta para **gerenciar todo o proje Se vocĂȘ leu e entendeu tudo isso, agora **vocĂȘ sabe muito mais** sobre ambientes virtuais do que muitos desenvolvedores por aĂ­. đŸ€“ -Saber esses detalhes provavelmente serĂĄ Ăștil no futuro, quando vocĂȘ estiver depurando algo que parece complexo, mas vocĂȘ saberĂĄ **como tudo funciona**. 😎 +Saber esses detalhes provavelmente serĂĄ Ăștil no futuro, quando vocĂȘ estiver depurando algo que parece complexo, mas vocĂȘ saberĂĄ **como tudo funciona por baixo**. 😎 From 50ab217bc6f2fc2d2ecd05af8329591c55e9d5fe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 13:45:51 +0000 Subject: [PATCH 276/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index d00065b7d..1f1c25b0a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for pt (update-outdated). PR [#15893](https://github.com/fastapi/fastapi/pull/15893) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for zh (update-outdated). PR [#15898](https://github.com/fastapi/fastapi/pull/15898) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for uk (update-outdated). PR [#15900](https://github.com/fastapi/fastapi/pull/15900) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ko (update-outdated). PR [#15890](https://github.com/fastapi/fastapi/pull/15890) by [@tiangolo](https://github.com/tiangolo). From e7324a77db4a9f4d38e4673850ed10ab1de0cb96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 15:46:01 +0200 Subject: [PATCH 277/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20tr=20(update-outdated)=20(#15891)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] Co-authored-by: Yurii Motov --- docs/tr/docs/_llm-test.md | 10 +-- .../docs/advanced/additional-status-codes.md | 1 + .../tr/docs/advanced/advanced-dependencies.md | 2 +- docs/tr/docs/advanced/dataclasses.md | 1 + docs/tr/docs/advanced/events.md | 2 +- docs/tr/docs/advanced/generate-clients.md | 14 ---- docs/tr/docs/advanced/json-base64-bytes.md | 2 +- docs/tr/docs/advanced/openapi-callbacks.md | 4 +- .../advanced/response-change-status-code.md | 4 +- docs/tr/docs/advanced/response-cookies.md | 2 +- docs/tr/docs/advanced/response-headers.md | 1 + .../docs/advanced/security/oauth2-scopes.md | 1 + docs/tr/docs/advanced/settings.md | 1 + docs/tr/docs/advanced/stream-data.md | 4 +- docs/tr/docs/advanced/wsgi.md | 1 + docs/tr/docs/alternatives.md | 66 ++++++++++--------- docs/tr/docs/async.md | 12 ++-- docs/tr/docs/deployment/cloud.md | 2 +- docs/tr/docs/deployment/concepts.md | 1 + docs/tr/docs/deployment/docker.md | 6 +- docs/tr/docs/deployment/https.md | 4 +- docs/tr/docs/deployment/manually.md | 1 + docs/tr/docs/editor-support.md | 2 +- docs/tr/docs/environment-variables.md | 34 +++++----- docs/tr/docs/features.md | 4 +- docs/tr/docs/help-fastapi.md | 4 +- docs/tr/docs/how-to/configure-swagger-ui.md | 4 +- .../docs/how-to/custom-request-and-route.md | 1 + docs/tr/docs/how-to/graphql.md | 1 + ...migrate-from-pydantic-v1-to-pydantic-v2.md | 18 +++++ .../docs/how-to/separate-openapi-schemas.md | 2 +- docs/tr/docs/index.md | 6 +- docs/tr/docs/project-generation.md | 1 + docs/tr/docs/python-types.md | 1 + docs/tr/docs/tutorial/bigger-applications.md | 32 ++++----- docs/tr/docs/tutorial/body-nested-models.md | 1 + docs/tr/docs/tutorial/body.md | 1 + docs/tr/docs/tutorial/debugging.md | 2 +- .../dependencies/dependencies-with-yield.md | 5 +- docs/tr/docs/tutorial/extra-data-types.md | 2 +- docs/tr/docs/tutorial/extra-models.md | 1 + docs/tr/docs/tutorial/first-steps.md | 1 + docs/tr/docs/tutorial/handling-errors.md | 2 +- docs/tr/docs/tutorial/index.md | 4 +- docs/tr/docs/tutorial/metadata.md | 2 +- .../tutorial/path-operation-configuration.md | 1 + .../tutorial/query-params-str-validations.md | 1 + docs/tr/docs/tutorial/query-params.md | 4 +- docs/tr/docs/tutorial/request-files.md | 2 +- docs/tr/docs/tutorial/request-forms.md | 1 + docs/tr/docs/tutorial/response-status-code.md | 4 +- docs/tr/docs/tutorial/schema-extra-example.md | 8 +-- docs/tr/docs/tutorial/security/first-steps.md | 2 +- .../tutorial/security/get-current-user.md | 2 +- docs/tr/docs/tutorial/security/oauth2-jwt.md | 4 +- .../docs/tutorial/security/simple-oauth2.md | 2 +- docs/tr/docs/tutorial/sql-databases.md | 2 +- docs/tr/docs/tutorial/static-files.md | 8 +++ docs/tr/docs/tutorial/testing.md | 3 + docs/tr/docs/virtual-environments.md | 6 +- 60 files changed, 181 insertions(+), 142 deletions(-) diff --git a/docs/tr/docs/_llm-test.md b/docs/tr/docs/_llm-test.md index bc3dc8977..049aa2676 100644 --- a/docs/tr/docs/_llm-test.md +++ b/docs/tr/docs/_llm-test.md @@ -37,7 +37,7 @@ Code snippet'lerin içeriği olduğu gibi bırakılmalıdır. DĂŒn bir arkadaßım ßunu yazdı: "If you spell incorrectly correctly, you have spelled it incorrectly". Ben de ßunu yanıtladım: "Correct, but 'incorrectly' is incorrectly not '"incorrectly"'". -/// note +/// note | Not LLM muhtemelen bunu yanlıß çevirecektir. Yeniden çeviri yapıldığında dĂŒzeltilmiß çeviriyi koruyup korumadığı önemlidir. @@ -124,7 +124,7 @@ Code block'ların içindeki code değißtirilmemelidir; tek istisna yorumlardır //// tab | Test -/// note +/// note | Not Bazı metin /// @@ -132,15 +132,15 @@ Bazı metin Bazı metin /// -/// tip +/// tip | İpucu Bazı metin /// -/// warning +/// warning | Uyarı Bazı metin /// -/// danger +/// danger | Tehlike Bazı metin /// diff --git a/docs/tr/docs/advanced/additional-status-codes.md b/docs/tr/docs/advanced/additional-status-codes.md index 6db570aef..21d113ffe 100644 --- a/docs/tr/docs/advanced/additional-status-codes.md +++ b/docs/tr/docs/advanced/additional-status-codes.md @@ -1,5 +1,6 @@ # Ek Status Code'ları { #additional-status-codes } + Varsayılan olarak **FastAPI**, response'ları bir `JSONResponse` kullanarak döndĂŒrĂŒr; *path operation*'ınızdan döndĂŒrdĂŒÄŸĂŒnĂŒz içeriği bu `JSONResponse`'un içine yerleßtirir. Varsayılan status code'u veya *path operation* içinde sizin belirlediğiniz status code'u kullanır. diff --git a/docs/tr/docs/advanced/advanced-dependencies.md b/docs/tr/docs/advanced/advanced-dependencies.md index 5a75042e6..86a15a6c1 100644 --- a/docs/tr/docs/advanced/advanced-dependencies.md +++ b/docs/tr/docs/advanced/advanced-dependencies.md @@ -78,7 +78,7 @@ Bu detaylar, özellikle 0.121.0'dan eski bir FastAPI uygulamanız varsa ve `yiel ### `yield` ve `scope` ile dependency'ler { #dependencies-with-yield-and-scope } -0.121.0 sĂŒrĂŒmĂŒnde FastAPI, `Depends(scope="function")` desteğini ekledi. +0.121.0 sĂŒrĂŒmĂŒnde FastAPI, `yield` kullanan dependency'ler için `Depends(scope="function")` desteğini ekledi. `Depends(scope="function")` kullanıldığında, `yield` sonrasındaki çıkıß kodu, *path operation function* biter bitmez, response client'a geri gönderilmeden önce çalıßtırılır. diff --git a/docs/tr/docs/advanced/dataclasses.md b/docs/tr/docs/advanced/dataclasses.md index 150d0080a..9f79a6cbe 100644 --- a/docs/tr/docs/advanced/dataclasses.md +++ b/docs/tr/docs/advanced/dataclasses.md @@ -1,5 +1,6 @@ # Dataclass Kullanımı { #using-dataclasses } + FastAPI, **Pydantic** ĂŒzerine inßa edilmißtir ve request/response tanımlamak için Pydantic model'lerini nasıl kullanacağınızı gösteriyordum. Ancak FastAPI, [`dataclasses`](https://docs.python.org/3/library/dataclasses.html) kullanmayı da aynı ßekilde destekler: diff --git a/docs/tr/docs/advanced/events.md b/docs/tr/docs/advanced/events.md index bc3b0ef58..4c96b2296 100644 --- a/docs/tr/docs/advanced/events.md +++ b/docs/tr/docs/advanced/events.md @@ -2,7 +2,7 @@ Uygulama **baßlamadan** önce çalıßtırılması gereken mantığı (kodu) tanımlayabilirsiniz. Bu, bu kodun **bir kez**, uygulama **request almaya baßlamadan önce** çalıßtırılacağı anlamına gelir. -Benzer ßekilde, uygulama **kapanırken** çalıßtırılması gereken mantığı (kodu) da tanımlayabilirsiniz. Bu durumda bu kod, muhtemelen **çok sayıda request** ißlendi **sonra**, **bir kez** çalıßtırılır. +Benzer ßekilde, uygulama **kapanırken** çalıßtırılması gereken mantığı (kodu) da tanımlayabilirsiniz. Bu durumda bu kod, muhtemelen **çok sayıda request** ißlendikten **sonra**, **bir kez** çalıßtırılır. Bu kod, uygulama request almaya **baßlamadan** önce ve request’leri ißlemeyi **bitirdikten** hemen sonra çalıßtığı için, uygulamanın tĂŒm **lifespan**’ını (birazdan "lifespan" kelimesi önemli olacak 😉) kapsar. diff --git a/docs/tr/docs/advanced/generate-clients.md b/docs/tr/docs/advanced/generate-clients.md index 68cb4ab0d..6e12efe3c 100644 --- a/docs/tr/docs/advanced/generate-clients.md +++ b/docs/tr/docs/advanced/generate-clients.md @@ -20,20 +20,6 @@ FastAPI otomatik olarak **OpenAPI 3.1** spesifikasyonları ĂŒretir; bu yĂŒzden k /// -## FastAPI Sponsorlarından SDK Üreteçleri { #sdk-generators-from-fastapi-sponsors } - -Bu bölĂŒm, FastAPI'yi sponsorlayan ßirketlerin sunduğu **yatırım destekli** ve **ßirket destekli** çözĂŒmleri öne çıkarır. Bu ĂŒrĂŒnler, yĂŒksek kaliteli ĂŒretilen SDK'ların ĂŒzerine **ek özellikler** ve **entegrasyonlar** sağlar. - -✹ [**FastAPI'ye sponsor olarak**](../help-fastapi.md#sponsor-the-author) ✹ bu ßirketler, framework'ĂŒn ve **ekosisteminin** sağlıklı ve **sĂŒrdĂŒrĂŒlebilir** kalmasına yardımcı olur. - -Sponsor olmaları aynı zamanda FastAPI **topluluğuna** (size) gĂŒĂ§lĂŒ bir bağlılığı da gösterir; yalnızca **iyi bir hizmet** sunmayı değil, aynı zamanda **gĂŒĂ§lĂŒ ve gelißen bir framework** olan FastAPI'yi desteklemeyi de önemsediklerini gösterir. 🙇 - -Örneğin ßunları deneyebilirsiniz: - -* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) - -Bu çözĂŒmlerin bazıları açık kaynak olabilir veya ĂŒcretsiz katman sunabilir; yani finansal bir taahhĂŒt olmadan deneyebilirsiniz. Baßka ticari SDK ĂŒreteçleri de vardır ve internette bulunabilir. đŸ€“ - ## TypeScript SDK Olußturma { #create-a-typescript-sdk } Basit bir FastAPI uygulamasıyla baßlayalım: diff --git a/docs/tr/docs/advanced/json-base64-bytes.md b/docs/tr/docs/advanced/json-base64-bytes.md index 68e1cba7a..b7712194c 100644 --- a/docs/tr/docs/advanced/json-base64-bytes.md +++ b/docs/tr/docs/advanced/json-base64-bytes.md @@ -4,7 +4,7 @@ Uygulamanız JSON veri alıp gönderiyorsa ve bunun içine ikili (binary) veri e ## Base64 ve Dosyalar { #base64-vs-files } -İkili veriyi JSON içinde encode etmek yerine, yĂŒkleme için [Request Files](../tutorial/request-files.md) ve gönderim için [Custom Response - FileResponse](./custom-response.md#fileresponse--fileresponse-) kullanıp kullanamayacağınıza önce bir bakın. +İkili veriyi JSON içinde encode etmek yerine, yĂŒkleme için [Request Files](../tutorial/request-files.md) ve gönderim için [Custom Response - FileResponse](./custom-response.md#fileresponse) kullanıp kullanamayacağınıza önce bir bakın. JSON sadece UTF-8 ile encode edilmiß string'ler içerebilir, dolayısıyla ham bytes içeremez. diff --git a/docs/tr/docs/advanced/openapi-callbacks.md b/docs/tr/docs/advanced/openapi-callbacks.md index 023d97587..91ff84411 100644 --- a/docs/tr/docs/advanced/openapi-callbacks.md +++ b/docs/tr/docs/advanced/openapi-callbacks.md @@ -167,13 +167,13 @@ Callback URL'sinin, `callback_url` içindeki query parametresi olarak alınan UR Bu noktada, yukarıda olußturduğunuz callback router'ında gerekli callback *path operation*'ları (external gelißtiricinin *external API*'de implemente etmesi gerekenler) hazır. -ƞimdi sizin API'nizin *path operation decorator*'ında `callbacks` parametresini kullanarak, callback router'ının `.routes` attribute'unu (bu aslında route/*path operation*'lardan olußan bir `list`) geçin: +ƞimdi sizin API'nizin *path operation decorator*'ında `callbacks` parametresini kullanarak, callback router'ının `.routes` attribute'unu geçin: {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *} /// tip | İpucu -`callback=` içine router'ın kendisini (`invoices_callback_router`) değil, `invoices_callback_router.routes` ßeklinde `.routes` attribute'unu verdiğinize dikkat edin. FastAPI bu route'ları callback OpenAPI dokĂŒmantasyonunu ĂŒretmek için kullanacaktır. +`callbacks=` içine router'ın kendisini (`invoices_callback_router`) değil, `invoices_callback_router.routes` ßeklinde `.routes` attribute'unu verdiğinize dikkat edin. FastAPI bu route'ları callback OpenAPI dokĂŒmantasyonunu ĂŒretmek için kullanacaktır. /// diff --git a/docs/tr/docs/advanced/response-change-status-code.md b/docs/tr/docs/advanced/response-change-status-code.md index f15ed77f5..552daa0b2 100644 --- a/docs/tr/docs/advanced/response-change-status-code.md +++ b/docs/tr/docs/advanced/response-change-status-code.md @@ -18,7 +18,7 @@ Bu tĂŒr durumlarda bir `Response` parametresi kullanabilirsiniz. *Path operation function* içinde `Response` tipinde bir parametre tanımlayabilirsiniz (cookie ve header'lar için yapabildiğiniz gibi). -Ardından bu *geçici (temporal)* `Response` nesnesi ĂŒzerinde `status_code` değerini ayarlayabilirsiniz. +Ardından bu *geçici* `Response` nesnesi ĂŒzerinde `status_code` değerini ayarlayabilirsiniz. {* ../../docs_src/response_change_status_code/tutorial001_py310.py hl[1,9,12] *} @@ -26,6 +26,6 @@ Sonrasında, normalde yaptığınız gibi ihtiyacınız olan herhangi bir nesney Ve eğer bir `response_model` tanımladıysanız, döndĂŒrdĂŒÄŸĂŒnĂŒz nesneyi filtrelemek ve dönĂŒĆŸtĂŒrmek için yine kullanılacaktır. -**FastAPI**, status code'u (ayrıca cookie ve header'ları) bu *geçici (temporal)* response'tan alır ve `response_model` ile filtrelenmiß, sizin döndĂŒrdĂŒÄŸĂŒnĂŒz değeri içeren nihai response'a yerleßtirir. +**FastAPI**, status code'u (ayrıca cookie ve header'ları) bu *geçici* response'tan alır ve `response_model` ile filtrelenmiß, sizin döndĂŒrdĂŒÄŸĂŒnĂŒz değeri içeren nihai response'a yerleßtirir. Ayrıca `Response` parametresini dependency'lerde de tanımlayıp status code'u orada ayarlayabilirsiniz. Ancak unutmayın, en son ayarlanan değer geçerli olur. diff --git a/docs/tr/docs/advanced/response-cookies.md b/docs/tr/docs/advanced/response-cookies.md index 3d3b978bc..a33d4ef37 100644 --- a/docs/tr/docs/advanced/response-cookies.md +++ b/docs/tr/docs/advanced/response-cookies.md @@ -26,7 +26,7 @@ Sonra bunun içinde Cookie'leri set edin ve response'u döndĂŒrĂŒn: {* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *} -/// tip +/// tip | İpucu `Response` parametresini kullanmak yerine doğrudan bir response döndĂŒrĂŒrseniz, FastAPI onu olduğu gibi (doğrudan) döndĂŒrĂŒr. diff --git a/docs/tr/docs/advanced/response-headers.md b/docs/tr/docs/advanced/response-headers.md index d61e24da3..c4a654792 100644 --- a/docs/tr/docs/advanced/response-headers.md +++ b/docs/tr/docs/advanced/response-headers.md @@ -1,5 +1,6 @@ # Response Header'ları { #response-headers } + ## Bir `Response` parametresi kullanın { #use-a-response-parameter } *Path operation function* içinde (cookie'lerde yapabildiğiniz gibi) tipi `Response` olan bir parametre tanımlayabilirsiniz. diff --git a/docs/tr/docs/advanced/security/oauth2-scopes.md b/docs/tr/docs/advanced/security/oauth2-scopes.md index c5de15f8d..1d1dcb3cf 100644 --- a/docs/tr/docs/advanced/security/oauth2-scopes.md +++ b/docs/tr/docs/advanced/security/oauth2-scopes.md @@ -1,5 +1,6 @@ # OAuth2 scope'ları { #oauth2-scopes } + OAuth2 scope'larını **FastAPI** ile doğrudan kullanabilirsiniz; sorunsuz çalıßacak ßekilde entegre edilmißtir. Bu sayede OAuth2 standardını takip eden, daha ince taneli bir izin sistemini OpenAPI uygulamanıza (ve API dokĂŒmanlarınıza) entegre edebilirsiniz. diff --git a/docs/tr/docs/advanced/settings.md b/docs/tr/docs/advanced/settings.md index a39e28a92..5734387fe 100644 --- a/docs/tr/docs/advanced/settings.md +++ b/docs/tr/docs/advanced/settings.md @@ -1,5 +1,6 @@ # Ayarlar ve Ortam Değißkenleri { #settings-and-environment-variables } + Birçok durumda uygulamanızın bazı harici ayarlara veya konfigĂŒrasyonlara ihtiyacı olabilir; örneğin secret key'ler, veritabanı kimlik bilgileri, e-posta servisleri için kimlik bilgileri vb. Bu ayarların çoğu değißkendir (değißebilir); örneğin veritabanı URL'leri. Ayrıca birçoğu hassas olabilir; örneğin secret'lar. diff --git a/docs/tr/docs/advanced/stream-data.md b/docs/tr/docs/advanced/stream-data.md index a71bb3217..9b58d962b 100644 --- a/docs/tr/docs/advanced/stream-data.md +++ b/docs/tr/docs/advanced/stream-data.md @@ -2,7 +2,7 @@ Veriyi JSON olarak yapılandırabiliyorsanız, [JSON Lines Akıßı](../tutorial/stream-json-lines.md) kullanın. -Ancak saf ikili (binary) veri ya da string akıtmak istiyorsanız, bunu ĆŸĂ¶yle yapabilirsiniz. +Ancak **saf ikili (binary) veri** ya da string akıtmak istiyorsanız, bunu ĆŸĂ¶yle yapabilirsiniz. /// note | Not @@ -40,7 +40,7 @@ FastAPI veriyi Pydantic ile JSON'a çevirmeye veya herhangi bir ßekilde serile {* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} -Bu aynı zamanda `StreamingResponse` ile veriyi tam olarak ihtiyaç duyduğunuz biçimde ĂŒretme ve encode etme konusunda hem bir özgĂŒrlĂŒk hem de bir sorumluluk verdiği anlamına gelir; tip annotasyonlarından bağımsızdır. đŸ€“ +Bu aynı zamanda `StreamingResponse` ile veriyi tam olarak ihtiyaç duyduğunuz biçimde ĂŒretme ve encode etme konusunda hem bir **özgĂŒrlĂŒk** hem de bir **sorumluluk** verdiği anlamına gelir; tip annotasyonlarından bağımsızdır. đŸ€“ ### Bytes Akıßı { #stream-bytes } diff --git a/docs/tr/docs/advanced/wsgi.md b/docs/tr/docs/advanced/wsgi.md index 84eb7981a..6e61aff6a 100644 --- a/docs/tr/docs/advanced/wsgi.md +++ b/docs/tr/docs/advanced/wsgi.md @@ -1,5 +1,6 @@ # WSGI'yi Dahil Etme - Flask, Django ve Diğerleri { #including-wsgi-flask-django-others } + WSGI uygulamalarını [Alt Uygulamalar - Mount Etme](sub-applications.md), [Bir Proxy Arkasında](behind-a-proxy.md) bölĂŒmlerinde gördĂŒÄŸĂŒnĂŒz gibi mount edebilirsiniz. Bunun için `WSGIMiddleware`'ı kullanabilir ve bunu WSGI uygulamanızı (örneğin Flask, Django vb.) sarmalamak için kullanabilirsiniz. diff --git a/docs/tr/docs/alternatives.md b/docs/tr/docs/alternatives.md index 556e7abbe..e214907b5 100644 --- a/docs/tr/docs/alternatives.md +++ b/docs/tr/docs/alternatives.md @@ -10,7 +10,7 @@ Baßkalarının daha önceki çalıßmaları olmasaydı, **FastAPI** var olmazd Yıllarca yeni bir framework olußturmaktan kaçındım. Önce **FastAPI**’ın bugĂŒn kapsadığı özelliklerin tamamını, birçok farklı framework, eklenti ve araçla çözmeyi denedim. -Namun bir noktada, geçmißteki araçlardan en iyi fikirleri alıp, mĂŒmkĂŒn olan en iyi ßekilde birleßtiren ve daha önce mevcut olmayan dil özelliklerini (Python 3.6+ tip belirteçleri) kullanarak tĂŒm bu özellikleri sağlayan bir ßey gelißtirmekten baßka seçenek kalmadı. +Ancak bir noktada, geçmißteki araçlardan en iyi fikirleri alıp, mĂŒmkĂŒn olan en iyi ßekilde birleßtiren ve daha önce mevcut olmayan dil özelliklerini (Python 3.6+ tip belirteçleri) kullanarak tĂŒm bu özellikleri sağlayan bir ßey gelißtirmekten baßka seçenek kalmadı. ## Daha Önce Gelißtirilen Araçlar { #previous-tools } @@ -60,7 +60,7 @@ Flask’ın sadeliği göz önĂŒne alındığında, API gelißtirmek için iyi b Gereken araç ve parçaları kolayca eßleßtirip birleßtirmeyi sağlayan bir mikroframework olmak. -Basit ve kullanımı kolay bir yönlendirme (routing) sistemine sahip olmak. +Basit ve kullanımı kolay bir routing sistemine sahip olmak. /// @@ -72,7 +72,7 @@ Hatta bir FastAPI uygulamasının içinde Requests kullanmak yaygındır. Yine de FastAPI, Requests’ten epey ilham almıßtır. -**Requests** bir kĂŒtĂŒphane olarak API’larla (istemci olarak) etkileßime geçmeye yararken, **FastAPI** API’lar (sunucu olarak) gelißtirmeye yarar. +**Requests** bir kĂŒtĂŒphane olarak API’larla (client olarak) etkileßime geçmeye yararken, **FastAPI** API’lar (server olarak) gelißtirmeye yarar. Yani daha çok zıt uçlardadırlar ama birbirlerini tamamlarlar. @@ -82,7 +82,7 @@ Bu yĂŒzden resmi web sitesinde de söylendiği gibi: > Requests, tĂŒm zamanların en çok indirilen Python paketlerinden biridir -Kullanımı çok basittir. Örneğin bir `GET` isteği yapmak için: +Kullanımı çok basittir. Örneğin bir `GET` request'i yapmak için: ```Python response = requests.get("http://example.com/some/url") @@ -137,9 +137,9 @@ Birçok Flask REST frameworkâ€™ĂŒ var; ancak zaman ayırıp inceledikten sonra ### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow } -API sistemlerinin ihtiyaç duyduğu temel özelliklerden biri, koddan (Python) veriyi alıp ağ ĂŒzerinden gönderilebilecek bir ßeye dönĂŒĆŸtĂŒrmek, yani veri “dönĂŒĆŸĂŒmâ€ĂŒdĂŒr. Örneğin, bir veritabanından gelen verileri içeren bir objeyi JSON objesine dönĂŒĆŸtĂŒrmek, `datetime` objelerini string’e çevirmek vb. +API sistemlerinin ihtiyaç duyduğu temel özelliklerden biri, koddan (Python) veriyi alıp ağ ĂŒzerinden gönderilebilecek bir ßeye dönĂŒĆŸtĂŒrmek, yani veri “serileßtirme”dir. Örneğin, bir veritabanından gelen verileri içeren bir objeyi JSON objesine dönĂŒĆŸtĂŒrmek, `datetime` objelerini string’e çevirmek vb. -API’ların ihtiyaç duyduğu bir diğer önemli özellik, veri doğrulamadır; belirli parametreler göz önĂŒne alındığında verinin geçerli olduğundan emin olmak. Örneğin, bir alanın `int` olması ve rastgele bir metin olmaması. Bu özellikle dıßarıdan gelen veriler için kullanıßlıdır. +API’ların ihtiyaç duyduğu bir diğer önemli özellik, veri doğrulamadır; belirli parametreler göz önĂŒne alındığında verinin geçerli olduğundan emin olmak. Örneğin, bir alanın `int` olması ve rastgele bir metin olmaması. Bu özellikle gelen veriler için kullanıßlıdır. Bir veri doğrulama sistemi olmadan, tĂŒm bu kontrolleri kod içinde el ile yapmanız gerekir. @@ -155,7 +155,7 @@ Kodla, veri tiplerini ve doğrulamayı otomatik sağlayan “Ɵemalar” tanıml ### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs } -API’ların ihtiyaç duyduğu bir diğer bĂŒyĂŒk özellik, gelen isteklerden veriyi ayrıßtırmadır. +API’ların ihtiyaç duyduğu bir diğer bĂŒyĂŒk özellik, gelen request'lerden veriyi ayrıßtırmadır. Webargs, Flask dahil birkaç frameworkâ€™ĂŒn ĂŒzerinde bunu sağlamak için gelißtirilmiß bir araçtır. @@ -163,7 +163,7 @@ Veri doğrulama için arka planda Marshmallow’u kullanır. Aynı gelißtiricil **FastAPI**’dan önce benim de çok kullandığım harika bir araçtır. -/// info | Bilgi +/// note | Not Webargs, Marshmallow gelißtiricileri tarafından olußturuldu. @@ -171,13 +171,13 @@ Webargs, Marshmallow gelißtiricileri tarafından olußturuldu. /// tip | **FastAPI**'ye ilham olan -Gelen istek verisini otomatik doğrulamak. +Gelen request verisini otomatik doğrulamak. /// ### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec } -Marshmallow ve Webargs; doğrulama, ayrıßtırma ve dönĂŒĆŸĂŒmĂŒ eklenti olarak sağlar. +Marshmallow ve Webargs; doğrulama, ayrıßtırma ve serileßtirmeyi eklenti olarak sağlar. Ama dökĂŒmantasyon eksikti. Sonra APISpec gelißtirildi. @@ -193,7 +193,7 @@ Ancak yine, Python metni içinde (kocaman bir YAML) mikro bir söz dizimi sorunu Editör bu konuda pek yardımcı olamaz. Parametreleri veya Marshmallow ßemalarını değißtirip docstring’teki YAML’ı gĂŒncellemeyi unutursak, ĂŒretilen ßema geçerliliğini yitirir. -/// info | Bilgi +/// note | Not APISpec, Marshmallow gelißtiricileri tarafından olußturuldu. @@ -225,7 +225,7 @@ Bunu kullanmak, birkaç Flask full‑stack ĂŒreticisinin ortaya çıkmasına yol Aynı full‑stack ĂŒreticiler, [**FastAPI** Proje Üreticileri](project-generation.md)’nin de temelini olußturdu. -/// info | Bilgi +/// note | Not Flask-apispec, Marshmallow gelißtiricileri tarafından olußturuldu. @@ -233,7 +233,7 @@ Flask-apispec, Marshmallow gelißtiricileri tarafından olußturuldu. /// tip | **FastAPI**'ye ilham olan -Veri dönĂŒĆŸĂŒmĂŒ ve doğrulamayı tanımlayan aynı koddan, OpenAPI ßemasını otomatik ĂŒretmek. +Serileßtirme ve doğrulamayı tanımlayan aynı koddan, OpenAPI ßemasını otomatik ĂŒretmek. /// @@ -247,9 +247,9 @@ Angular 2’den esinlenen, entegre bir bağımlılık enjeksiyonu sistemi vardı Parametreler TypeScript tipleriyle (Python tip belirteçlerine benzer) açıklandığından, editör desteği oldukça iyidir. -Ancak TypeScript tip bilgisi JavaScript’e derlemeden sonra korunmadığından, aynı anda tiplere dayanarak doğrulama, dönĂŒĆŸĂŒm ve dökĂŒmantasyon tanımlanamaz. Bu ve bazı tasarım kararları nedeniyle doğrulama, dönĂŒĆŸĂŒm ve otomatik ßema ĂŒretimi için birçok yere dekoratör eklemek gerekir; proje oldukça ayrıntılı hĂąle gelir. +Ancak TypeScript tip bilgisi JavaScript’e derlemeden sonra korunmadığından, aynı anda tiplere dayanarak doğrulama, serileßtirme ve dökĂŒmantasyon tanımlanamaz. Bu ve bazı tasarım kararları nedeniyle doğrulama, serileßtirme ve otomatik ßema ĂŒretimi için birçok yere dekoratör eklemek gerekir; proje oldukça ayrıntılı hĂąle gelir. -İçiçe modelleri çok iyi ißleyemez. Yani istek gövdesindeki JSON, içinde baßka alanları ve onlar da içiçe JSON objelerini içeriyorsa, doğru ßekilde dökĂŒmante edilip doğrulanamaz. +İç içe modelleri çok iyi ißleyemez. Yani request'teki JSON body, içinde baßka alanları ve onlar da iç içe JSON objelerini içeriyorsa, doğru ßekilde dökĂŒmante edilip doğrulanamaz. /// tip | **FastAPI**'ye ilham olan @@ -283,15 +283,17 @@ Bu yĂŒzden **FastAPI**, en hızlı framework olduğu için (ĂŒĂ§ĂŒncĂŒ parti kı Falcon, baßka bir yĂŒksek performanslı Python frameworkâ€™ĂŒdĂŒr; minimal olacak ßekilde tasarlanmıß ve Hug gibi diğer framework’lere temel olmußtur. -İki parametre alan fonksiyonlar etrafında tasarlanmıßtır: “request” ve “response”. İstekten parçalar “okur”, cevaba parçalar “yazarsınız”. Bu tasarım nedeniyle, fonksiyon parametreleriyle standart Python tip belirteçlerini kullanarak istek parametrelerini ve gövdelerini ilan etmek mĂŒmkĂŒn değildir. +İki parametre alan fonksiyonlar etrafında tasarlanmıßtır: bir “request” ve bir “response”. Sonra request'ten parçalar “okur”, response'a parçalar “yazarsınız”. Bu tasarım nedeniyle, fonksiyon parametreleriyle standart Python tip belirteçlerini kullanarak request parametrelerini ve body'lerini ilan etmek mĂŒmkĂŒn değildir. -Dolayısıyla veri doğrulama, dönĂŒĆŸĂŒm ve dökĂŒmantasyon kodda yapılmalı; otomatik olmaz. Ya da Hug’da olduğu gibi Falcon’un ĂŒzerine bir framework olarak uygulanmalıdır. Falcon’un tasarımından etkilenen ve tek bir request objesi ile response objesini parametre olarak alan diğer framework’lerde de aynı ayrım vardır. +Dolayısıyla veri doğrulama, serileßtirme ve dökĂŒmantasyon kodda yapılmalı; otomatik olmaz. Ya da Hug’da olduğu gibi Falcon’un ĂŒzerine bir framework olarak uygulanmalıdır. Falcon’un tasarımından etkilenen ve tek bir request objesi ile response objesini parametre olarak alan diğer framework’lerde de aynı ayrım vardır. /// tip | **FastAPI**'ye ilham olan Harika performans elde etmenin yollarını bulmak. -Hug ile birlikte (Hug, Falcon’a dayanır) **FastAPI**'de fonksiyonlarda opsiyonel bir `response` parametresi ilan edilmesi fikrine ilham vermek. FastAPI'de bu parametre çoğunlukla header, cookie ve alternatif durum kodlarını ayarlamak için kullanılır. +Hug ile birlikte (Hug, Falcon’a dayanır) **FastAPI**'de fonksiyonlarda bir `response` parametresi ilan edilmesi fikrine ilham vermek. + +FastAPI'de bu parametre opsiyoneldir ve çoğunlukla header, cookie ve alternatif durum kodlarını ayarlamak için kullanılır. /// @@ -303,7 +305,7 @@ Hug ile birlikte (Hug, Falcon’a dayanır) **FastAPI**'de fonksiyonlarda opsiyo * Bu tiplere bağlı doğrulama ve dökĂŒmantasyon sağlar. * Bağımlılık enjeksiyonu sistemi vardır. -Pydantic gibi doğrulama, dönĂŒĆŸĂŒm ve dökĂŒmantasyon için ĂŒĂ§ĂŒncĂŒ parti bir kĂŒtĂŒphane kullanmaz; kendi içinde sağlar. Bu yĂŒzden bu veri tipi tanımlarını tekrar kullanmak o kadar kolay olmaz. +Pydantic gibi doğrulama, serileßtirme ve dökĂŒmantasyon için ĂŒĂ§ĂŒncĂŒ parti bir kĂŒtĂŒphane kullanmaz; kendi içinde sağlar. Bu yĂŒzden bu veri tipi tanımlarını tekrar kullanmak o kadar kolay olmaz. Biraz daha ayrıntılı yapılandırma ister. Ve ASGI yerine WSGI tabanlı olduğundan, Uvicorn, Starlette ve Sanic gibi araçların yĂŒksek performansından faydalanmaya yönelik tasarlanmamıßtır. @@ -333,7 +335,7 @@ Nadir bir özelliği daha vardı: aynı framework ile hem API’lar hem de CLI Senkron Python web framework’leri için önceki standart olan WSGI’ye dayandığından, WebSocket vb. ßeyleri ißleyemez, ancak yine de yĂŒksek performansa sahiptir. -/// info | Bilgi +/// note | Not Hug, Python dosyalarındaki import’ları otomatik sıralayan harika bir araç olan [`isort`](https://github.com/timothycrosley/isort)’un gelißtiricisi Timothy Crosley tarafından gelißtirildi. @@ -353,11 +355,11 @@ Ayrıca header ve cookie ayarlamak için fonksiyonlarda `response` parametresi i **FastAPI**’yi inßa etmeye karar vermeden hemen önce **APIStar** sunucusunu buldum. Aradığım ßeylerin neredeyse hepsine sahipti ve harika bir tasarımı vardı. -Python tip belirteçleriyle parametreleri ve istekleri ilan eden bir frameworkâ€™ĂŒn gördĂŒÄŸĂŒm ilk örneklerindendi (NestJS ve Molten’dan önce). Aßağı yukarı Hug ile aynı zamanlarda buldum; ancak APIStar, OpenAPI standardını kullanıyordu. +Python tip belirteçleriyle parametreleri ve request'leri ilan eden bir frameworkâ€™ĂŒn gördĂŒÄŸĂŒm ilk örneklerindendi (NestJS ve Molten’dan önce). Aßağı yukarı Hug ile aynı zamanlarda buldum; ancak APIStar, OpenAPI standardını kullanıyordu. -Farklı yerlerdeki aynı tip belirteçlerine dayanarak otomatik veri doğrulama, veri dönĂŒĆŸĂŒmĂŒ ve OpenAPI ßeması ĂŒretimi vardı. +Farklı yerlerdeki aynı tip belirteçlerine dayanarak otomatik veri doğrulama, veri serileßtirme ve OpenAPI ßeması ĂŒretimi vardı. -Gövde ßema tanımları Pydantic’tekiyle aynı Python tip belirteçlerini kullanmıyordu; biraz daha Marshmallow’a benziyordu. Bu yĂŒzden editör desteği o kadar iyi olmazdı; yine de APIStar mevcut en iyi seçenekti. +Body ßema tanımları Pydantic’tekiyle aynı Python tip belirteçlerini kullanmıyordu; biraz daha Marshmallow’a benziyordu. Bu yĂŒzden editör desteği o kadar iyi olmazdı; yine de APIStar mevcut en iyi seçenekti. O dönem kıyaslamalarda en iyi performansa sahipti (sadece Starlette tarafından geçiliyordu). @@ -373,7 +375,7 @@ Artık bir API web frameworkâ€™ĂŒ değildi; gelißtirici Starlette’e odaklanma ƞimdi APIStar, bir web frameworkâ€™ĂŒ değil, OpenAPI spesifikasyonlarını doğrulamak için araçlar takımından ibaret. -/// info | Bilgi +/// note | Not APIStar, aßağıdakilerin de yaratıcısı olan Tom Christie tarafından gelißtirildi: @@ -387,7 +389,7 @@ APIStar, aßağıdakilerin de yaratıcısı olan Tom Christie tarafından geliß Var olmak. -Aynı Python tipleriyle (hem veri doğrulama, dönĂŒĆŸĂŒm ve dökĂŒmantasyon) birden çok ßeyi ilan etmek ve aynı anda harika editör desteği sağlamak, bence dahiyane bir fikirdi. +Aynı Python tipleriyle (hem veri doğrulama, serileßtirme ve dökĂŒmantasyon) birden çok ßeyi ilan etmek ve aynı anda harika editör desteği sağlamak, bence dahiyane bir fikirdi. Uzun sĂŒre benzer bir framework arayıp birçok alternatifi denedikten sonra, APIStar mevcut en iyi seçenekti. @@ -401,7 +403,7 @@ Sonra APIStar bir sunucu olarak var olmaktan çıktı ve Starlette olußturuldu; ### [Pydantic](https://docs.pydantic.dev/) { #pydantic } -Pydantic, Python tip belirteçlerine dayalı olarak veri doğrulama, dönĂŒĆŸĂŒm ve dökĂŒmantasyon (JSON Schema kullanarak) tanımlamak için bir kĂŒtĂŒphanedir. +Pydantic, Python tip belirteçlerine dayalı olarak veri doğrulama, serileßtirme ve dökĂŒmantasyon (JSON Schema kullanarak) tanımlamak için bir kĂŒtĂŒphanedir. Bu onu aßırı sezgisel kılar. @@ -409,7 +411,7 @@ Marshmallow ile karßılaßtırılabilir. Kıyaslamalarda Marshmallow’dan daha /// tip | **FastAPI** bunu ßurada kullanır -TĂŒm veri doğrulama, veri dönĂŒĆŸĂŒmĂŒ ve JSON Schema tabanlı otomatik model dökĂŒmantasyonunu halletmekte. +TĂŒm veri doğrulama, veri serileßtirme ve JSON Schema tabanlı otomatik model dökĂŒmantasyonunu halletmekte. **FastAPI** daha sonra bu JSON Schema verisini alır ve (yaptığı diğer ßeylerin yanı sıra) OpenAPI içine yerleßtirir. @@ -427,9 +429,9 @@ Starlette, yĂŒksek performanslı asyncio servisleri olußturmak için ideal, haf * WebSocket desteği. * SĂŒreç içi arka plan görevleri. * Baßlatma ve kapatma olayları. -* HTTPX ĂŒzerinde gelißtirilmiß test istemcisi. -* CORS, GZip, Statik Dosyalar, Streaming cevaplar. -* Oturum (Session) ve Cookie desteği. +* HTTPX ĂŒzerinde gelißtirilmiß test client'ı. +* CORS, GZip, Statik Dosyalar, Streaming response'lar. +* Session ve Cookie desteği. * %100 test kapsamı. * %100 tip anotasyonlu kod tabanı. * Az sayıda zorunlu bağımlılık. @@ -438,7 +440,7 @@ Starlette, ßu anda test edilen en hızlı Python frameworkâ€™ĂŒdĂŒr. Yalnızca Starlette, temel web mikroframework ißlevselliğinin tamamını sağlar. -Ancak otomatik veri doğrulama, dönĂŒĆŸĂŒm veya dökĂŒmantasyon sağlamaz. +Ancak otomatik veri doğrulama, serileßtirme veya dökĂŒmantasyon sağlamaz. **FastAPI**’nin bunun ĂŒzerine eklediği ana ßeylerden biri, Pydantic kullanarak, bĂŒtĂŒnĂŒyle Python tip belirteçlerine dayalı bu özelliklerdir. Buna ek olarak bağımlılık enjeksiyonu sistemi, gĂŒvenlik yardımcıları, OpenAPI ßema ĂŒretimi vb. gelir. @@ -464,7 +466,7 @@ Dolayısıyla Starlette ile yapabildiğiniz her ßeyi, adeta “turbo ßarjlı S Uvicorn, uvloop ve httptools ĂŒzerinde inßa edilmiß, ıßık hızında bir ASGI sunucusudur. -Bir web frameworkâ€™ĂŒ değil, bir sunucudur. Örneğin path’lere göre yönlendirme araçları sağlamaz; bunu Starlette (veya **FastAPI**) gibi bir framework ĂŒstte sağlar. +Bir web frameworkâ€™ĂŒ değil, bir sunucudur. Örneğin path’lere göre routing araçları sağlamaz; bunu Starlette (veya **FastAPI**) gibi bir framework ĂŒstte sağlar. Starlette ve **FastAPI** için önerilen sunucudur. diff --git a/docs/tr/docs/async.md b/docs/tr/docs/async.md index 5acf5c145..b65756587 100644 --- a/docs/tr/docs/async.md +++ b/docs/tr/docs/async.md @@ -82,12 +82,12 @@ Bu "baßka bir ßeyi beklemek" genelde ißlemci ve RAM hızına kıyasla nispete * programınızın sisteme verdiği içeriğin diske yazılması * uzak bir API ißlemi * bir veritabanı ißleminin bitmesi -* bir veritabanı sorgusunun sonuç döndĂŒrmesi +* bir veritabanı query'sinin sonuç döndĂŒrmesi * vb. Çalıßma sĂŒresi çoğunlukla I/O ißlemlerini beklemekle geçtiğinden, bunlara "I/O bound" ißlemler denir. -"Bunun" asenkron" denmesinin sebebi, bilgisayarın / programın yavaß görevle "senkronize" olmak, görev tam bittiği anda orada olup görev sonucunu almak ve iße devam etmek için hiçbir ßey yapmadan beklemek zorunda olmamasıdır. +Buna "asenkron" denmesinin sebebi, bilgisayarın / programın yavaß görevle "senkronize" olmak, görev tam bittiği anda orada olup görev sonucunu almak ve iße devam etmek için hiçbir ßey yapmadan beklemek zorunda olmamasıdır. Bunun yerine "asenkron" bir sistem olarak, görev bittiğinde, bilgisayarın / programın o sırada yaptığı ißi bitirmesi için biraz (birkaç mikrosaniye) sırada bekleyebilir ve sonra sonuçları almak ĂŒzere geri dönĂŒp onlarla çalıßmaya devam edebilir. @@ -139,7 +139,7 @@ Aßkınla burgerleri yiyip gĂŒzel vakit geçiriyorsunuz. ✹ -/// note | Bilgi +/// note | Not Harika çizimler: [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎹 @@ -205,7 +205,7 @@ Sadece yiyorsunuz ve iß bitiyor. âč Vaktin çoğu tezgĂąhın önĂŒnde 🕙 beklemekle geçtiğinden, pek konußma ya da flört olmadı. 😞 -/// note | Bilgi +/// note | Not Harika çizimler: [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎹 @@ -239,9 +239,9 @@ Muhtemelen, bankada 🏩 ißlerini hallederken aßkını 😍 yanında götĂŒrme Bu, çoğu web uygulaması için de geçerlidir. -Çok fazla kullanıcı vardır; ancak sunucunuz, iyi olmayan bağlantılarından gelen istekleri 🕙 bekler. +Çok fazla kullanıcı vardır; ancak sunucunuz, onların pek iyi olmayan bağlantıları ĂŒzerinden request'lerin gelmesini 🕙 bekler. -Ve sonra yanıtların geri gelmesini yine 🕙 bekler. +Ardından response'ların geri gelmesini yine 🕙 bekler. Bu "beklemeler" 🕙 mikrosaniyelerle ölĂ§ĂŒlĂŒr; ama hepsi toplandığında sonuçta oldukça fazla bekleme olur. diff --git a/docs/tr/docs/deployment/cloud.md b/docs/tr/docs/deployment/cloud.md index b263ecc57..92a631734 100644 --- a/docs/tr/docs/deployment/cloud.md +++ b/docs/tr/docs/deployment/cloud.md @@ -16,7 +16,7 @@ FastAPI Cloud, *FastAPI and friends* açık kaynak projelerinin birincil sponsor ## Bulut Sağlayıcılar - Sponsorlar { #cloud-providers-sponsors } -Diğer bazı bulut sağlayıcılar da ✹ [**FastAPI'ye sponsor olur**](../help-fastapi.md#sponsor-the-author) ✹. 🙇 +Diğer bazı bulut sağlayıcılar da ✹ [**FastAPI'ye sponsor olur**](https://github.com/sponsors/tiangolo) ✹. 🙇 Kılavuzlarını takip etmek ve servislerini denemek için onları da değerlendirmek isteyebilirsiniz: diff --git a/docs/tr/docs/deployment/concepts.md b/docs/tr/docs/deployment/concepts.md index 211e2ab51..ee62ef647 100644 --- a/docs/tr/docs/deployment/concepts.md +++ b/docs/tr/docs/deployment/concepts.md @@ -1,5 +1,6 @@ # Deployment Kavramları { #deployments-concepts } + Bir **FastAPI** uygulamasını (hatta genel olarak herhangi bir web API'yi) deploy ederken, muhtemelen önemseyeceğiniz bazı kavramlar vardır. Bu kavramları kullanarak, **uygulamanızı deploy etmek** için **en uygun** yöntemi bulabilirsiniz. Önemli kavramlardan bazıları ßunlardır: diff --git a/docs/tr/docs/deployment/docker.md b/docs/tr/docs/deployment/docker.md index 3f73ec1ef..aebde767b 100644 --- a/docs/tr/docs/deployment/docker.md +++ b/docs/tr/docs/deployment/docker.md @@ -26,7 +26,7 @@ COPY ./app /code/app CMD ["fastapi", "run", "app/main.py", "--port", "80"] -# If running behind a proxy like Nginx or Traefik add --proxy-headers +# Nginx veya Traefik gibi bir proxy arkasında çalıßtırıyorsanız --proxy-headers ekleyin # CMD ["fastapi", "run", "app/main.py", "--port", "80", "--proxy-headers"] ``` @@ -243,14 +243,14 @@ Aßağıda açıklandığı gibi `CMD` talimatının **her zaman** **exec form** ✅ **Exec** form: ```Dockerfile -# ✅ Do this +# ✅ Bunu yapın CMD ["fastapi", "run", "app/main.py", "--port", "80"] ``` ⛔ **Shell** form: ```Dockerfile -# ⛔ Don't do this +# ⛔ Bunu yapmayın CMD fastapi run app/main.py --port 80 ``` diff --git a/docs/tr/docs/deployment/https.md b/docs/tr/docs/deployment/https.md index 1b8f34e5c..98fd9a230 100644 --- a/docs/tr/docs/deployment/https.md +++ b/docs/tr/docs/deployment/https.md @@ -17,7 +17,7 @@ Bir kullanıcı gözĂŒyle **HTTPS’in temellerini Ă¶ÄŸrenmek** için [https://h * HTTPS için **server**’ın, **ĂŒĂ§ĂŒncĂŒ bir taraf** tarafından verilen **"sertifikalara"** sahip olması gerekir. * Bu sertifikalar aslında ĂŒĂ§ĂŒncĂŒ tarafça "ĂŒretilmez", ĂŒĂ§ĂŒncĂŒ taraftan **temin edilir**. * Sertifikaların bir **geçerlilik sĂŒresi** vardır. - * SĂŒresi **dolar**. + * SĂŒreleri **sona erer**. * Sonrasında **yenilenmeleri**, ĂŒĂ§ĂŒncĂŒ taraftan **yeniden temin edilmeleri** gerekir. * Bağlantının ßifrelenmesi **TCP seviyesinde** gerçekleßir. * Bu, **HTTP’nin bir katman altıdır**. @@ -169,7 +169,7 @@ Bu ßekilde TLS Termination Proxy, birden fazla uygulama için **birden fazla do ### Sertifika Yenileme { #certificate-renewal } -Gelecekte bir noktada, her sertifikanın sĂŒresi **dolar** (temin edildikten yaklaßık 3 ay sonra). +Gelecekte bir noktada, her sertifikanın sĂŒresi **sona erer** (temin edildikten yaklaßık 3 ay sonra). Ardından baßka bir program (bazı durumlarda ayrı bir programdır, bazı durumlarda aynı TLS Termination Proxy olabilir) Let's Encrypt ile konußup sertifika(ları) yeniler. diff --git a/docs/tr/docs/deployment/manually.md b/docs/tr/docs/deployment/manually.md index de3d14348..2a2b16818 100644 --- a/docs/tr/docs/deployment/manually.md +++ b/docs/tr/docs/deployment/manually.md @@ -1,5 +1,6 @@ # Bir Sunucuyu Manuel Olarak Çalıßtırın { #run-a-server-manually } + ## `fastapi run` Komutunu Kullanın { #use-the-fastapi-run-command } Kısacası, FastAPI uygulamanızı sunmak için `fastapi run` kullanın: diff --git a/docs/tr/docs/editor-support.md b/docs/tr/docs/editor-support.md index 47182834e..d279152cb 100644 --- a/docs/tr/docs/editor-support.md +++ b/docs/tr/docs/editor-support.md @@ -2,7 +2,7 @@ Resmi [FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode), FastAPI gelißtirme akıßınızı iyileßtirir: *path operation* keßfi, gezinme, FastAPI Cloud’a deploy ve canlı log akıßı. -Daha fazla ayrıntı için, GitHub deposundaki README’ye bakın: [GitHub repository](https://github.com/fastapi/fastapi-vscode). +Daha fazla ayrıntı için, GitHub deposundaki README’ye bakın: [GitHub deposu](https://github.com/fastapi/fastapi-vscode). ## Kurulum ve YĂŒkleme { #setup-and-installation } diff --git a/docs/tr/docs/environment-variables.md b/docs/tr/docs/environment-variables.md index f34c859e0..b54e1cbfd 100644 --- a/docs/tr/docs/environment-variables.md +++ b/docs/tr/docs/environment-variables.md @@ -19,10 +19,10 @@ Python’a ihtiyaç duymadan, **shell (terminal)** içinde ortam değißkenleri
```console -// You could create an env var MY_NAME with +// MY_NAME adlı bir env var'ı ĆŸĂ¶yle olußturabilirsiniz $ export MY_NAME="Wade Wilson" -// Then you could use it with other programs, like +// Sonra bunu diğer programlarla ĆŸĂ¶yle kullanabilirsiniz $ echo "Hello $MY_NAME" Hello Wade Wilson @@ -37,10 +37,10 @@ Hello Wade Wilson
```console -// Create an env var MY_NAME +// MY_NAME adlı bir env var olußturun $ $Env:MY_NAME = "Wade Wilson" -// Use it with other programs, like +// Bunu diğer programlarla ĆŸĂ¶yle kullanın $ echo "Hello $Env:MY_NAME" Hello Wade Wilson @@ -78,20 +78,20 @@ Sonrasında bu Python programını çalıßtırabilirsiniz:
```console -// Here we don't set the env var yet +// Burada env var'ı henĂŒz ayarlamıyoruz $ python main.py -// As we didn't set the env var, we get the default value +// Env var'ı ayarlamadığımız için varsayılan değeri alırız Hello World from Python -// But if we create an environment variable first +// Ama önce bir ortam değißkeni olußturursak $ export MY_NAME="Wade Wilson" -// And then call the program again +// Sonra programı tekrar çağırırsak $ python main.py -// Now it can read the environment variable +// Artık ortam değißkenini okuyabilir Hello Wade Wilson from Python ``` @@ -105,20 +105,20 @@ Hello Wade Wilson from Python
```console -// Here we don't set the env var yet +// Burada env var'ı henĂŒz ayarlamıyoruz $ python main.py -// As we didn't set the env var, we get the default value +// Env var'ı ayarlamadığımız için varsayılan değeri alırız Hello World from Python -// But if we create an environment variable first +// Ama önce bir ortam değißkeni olußturursak $ $Env:MY_NAME = "Wade Wilson" -// And then call the program again +// Sonra programı tekrar çağırırsak $ python main.py -// Now it can read the environment variable +// Artık ortam değißkenini okuyabilir Hello Wade Wilson from Python ``` @@ -136,14 +136,14 @@ Bunu yapmak için, program komutunun hemen öncesinde ve aynı satırda tanımla
```console -// Create an env var MY_NAME in line for this program call +// Bu program çağrısı için aynı satırda MY_NAME adlı bir env var olußturun $ MY_NAME="Wade Wilson" python main.py -// Now it can read the environment variable +// Artık ortam değißkenini okuyabilir Hello Wade Wilson from Python -// The env var no longer exists afterwards +// Sonrasında env var artık mevcut değildir $ python main.py Hello World from Python diff --git a/docs/tr/docs/features.md b/docs/tr/docs/features.md index 1f034d690..9a85863b7 100644 --- a/docs/tr/docs/features.md +++ b/docs/tr/docs/features.md @@ -99,7 +99,7 @@ Artık anahtar adlarını yanlıß yazmak, dokĂŒmana gidip gelmek ya da sonunda Her ßey için mantıklı **varsayılanlar** ve her yerde isteğe bağlı yapılandırmalar vardır. TĂŒm parametreler, ihtiyacınızı karßılayacak ßekilde ince ayar yapılarak tanımlamak istediğiniz API’yi olußturabilir. -Ancak varsayılan hĂąliyle hepsi **“hemen çalıßır”**. +Ancak varsayılan hĂąliyle hepsi **"hemen çalıßır"**. ### Doğrulama { #validation } @@ -149,7 +149,7 @@ FastAPI, son derece kolay kullanımlı ama son derece gĂŒĂ§lĂŒ bir - Supported Python versions + Supported Python versions

@@ -45,11 +45,11 @@ Temel özellikleri ßunlardır: * **Hızlı**: Çok yĂŒksek performanslı, **NodeJS** ve **Go** ile eßit dĂŒzeyde (Starlette ve Pydantic sayesinde). [Mevcut en hızlı Python framework'lerinden biri](#performance). * **Kodlaması Hızlı**: Özellik gelißtirme hızını yaklaßık %200 ile %300 aralığında artırır. * * **Daha az hata**: İnsan (gelißtirici) kaynaklı hataları yaklaßık %40 azaltır. * -* **Sezgisel**: Harika bir editör desteği. Her yerde Tamamlama. Hata ayıklamaya daha az zaman. +* **Sezgisel**: Harika bir editör desteği. Her yerde Tamamlama. Hata ayıklamaya daha az zaman. * **Kolay**: Kullanımı ve Ă¶ÄŸrenmesi kolay olacak ßekilde tasarlandı. DokĂŒman okumaya daha az zaman. * **Kısa**: Kod tekrarını minimize eder. Her parametre tanımından birden fazla özellik. Daha az hata. * **Sağlam**: Production'a hazır kod elde edersiniz. Otomatik etkileßimli dokĂŒmantasyon ile birlikte. -* **Standardlara dayalı**: API'lar için açık standartlara dayalıdır (ve tamamen uyumludur); [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (önceden Swagger olarak biliniyordu) ve [JSON Schema](https://json-schema.org/). +* **Standartlara dayalı**: API'lar için açık standartlara dayalıdır (ve tamamen uyumludur); [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (önceden Swagger olarak biliniyordu) ve [JSON Schema](https://json-schema.org/). * tahmin, production uygulamalar gelißtiren dahili bir gelißtirme ekibinin yaptığı testlere dayanmaktadır. diff --git a/docs/tr/docs/project-generation.md b/docs/tr/docs/project-generation.md index 6c73a942d..3dfe7a9a7 100644 --- a/docs/tr/docs/project-generation.md +++ b/docs/tr/docs/project-generation.md @@ -1,5 +1,6 @@ # Full Stack FastAPI ƞablonu { #full-stack-fastapi-template } + ƞablonlar genellikle belirli bir kurulumla gelir, ancak esnek ve özelleßtirilebilir olacak ßekilde tasarlanırlar. Bu sayede ßablonu projenizin gereksinimlerine göre değißtirip uyarlayabilir, çok iyi bir baßlangıç noktası olarak kullanabilirsiniz. 🏁 Bu ßablonu baßlangıç için kullanabilirsiniz; Ă§ĂŒnkĂŒ ilk kurulumun, gĂŒvenliğin, veritabanının ve bazı API endpoint'lerinin önemli bir kısmı sizin için zaten hazırlanmıßtır. diff --git a/docs/tr/docs/python-types.md b/docs/tr/docs/python-types.md index f3a3447f1..69f256d00 100644 --- a/docs/tr/docs/python-types.md +++ b/docs/tr/docs/python-types.md @@ -1,5 +1,6 @@ # Python Tiplerine Giriß { #python-types-intro } + Python, isteğe bağlı "type hints" (diğer adıyla "type annotations") desteğine sahiptir. Bu **"type hints"** veya annotations, bir değißkenin tip'ini bildirmeye yarayan özel bir sözdizimidir. diff --git a/docs/tr/docs/tutorial/bigger-applications.md b/docs/tr/docs/tutorial/bigger-applications.md index b44d5bb9b..81866e8f7 100644 --- a/docs/tr/docs/tutorial/bigger-applications.md +++ b/docs/tr/docs/tutorial/bigger-applications.md @@ -17,16 +17,16 @@ Diyelim ki ĆŸĂ¶yle bir dosya yapınız var: ``` . ├── app -│   ├── __init__.py -│   ├── main.py -│   ├── dependencies.py -│   └── routers -│   │ ├── __init__.py -│   │ ├── items.py -│   │ └── users.py -│   └── internal -│   ├── __init__.py -│   └── admin.py +│ ├── __init__.py +│ ├── main.py +│ ├── dependencies.py +│ └── routers +│ │ ├── __init__.py +│ │ ├── items.py +│ │ └── users.py +│ └── internal +│ ├── __init__.py +│ └── admin.py ``` /// tip | İpucu @@ -77,7 +77,7 @@ Diyelim ki sadece kullanıcıları yönetmeye ayrılmıß dosyanız `/app/router Kullanıcılarla ilgili *path operation*’ları, kodun geri kalanından ayrı tutmak istiyorsunuz; böylece dĂŒzenli kalır. -Namun bu hĂąlĂą aynı **FastAPI** uygulaması/web API’sinin bir parçasıdır (aynı "Python Package" içinde). +Ancak bu hĂąlĂą aynı **FastAPI** uygulaması/web API’sinin bir parçasıdır (aynı "Python Package" içinde). Bu module için *path operation*’ları `APIRouter` kullanarak olußturabilirsiniz. @@ -123,7 +123,7 @@ Bu yĂŒzden onları ayrı bir `dependencies` moduleâ€™ĂŒne koyuyoruz (`app/depend Örneği basit tutmak için uydurma bir header kullanıyoruz. -Namun gerçek senaryolarda, entegre [Security yardımcı araçlarını](security/index.md) kullanarak daha iyi sonuç alırsınız. +Ancak gerçek senaryolarda, entegre [Security yardımcı araçlarını](security/index.md) kullanarak daha iyi sonuç alırsınız. /// @@ -138,7 +138,7 @@ Diyelim ki uygulamanızdaki "items" ile ilgili endpoint'ler de `app/routers/item Bu, `app/routers/users.py` ile aynı yapıdadır. -Namun biraz daha akıllı davranıp kodu sadeleßtirmek istiyoruz. +Ancak biraz daha akıllı davranıp kodu sadeleßtirmek istiyoruz. Bu module’deki tĂŒm *path operation*’ların ßu ortak özelliklere sahip olduğunu biliyoruz: @@ -230,7 +230,7 @@ from .dependencies import get_token_header * `dependencies` moduleâ€™ĂŒnĂŒ bul (`app/routers/dependencies.py` gibi hayali bir dosya)... * ve oradan `get_token_header` function’ını import et. -Namun o dosya yok; bizim dependency’lerimiz `app/dependencies.py` dosyasında. +Ancak o dosya yok; bizim dependency’lerimiz `app/dependencies.py` dosyasında. Uygulama/dosya yapımızın nasıl görĂŒndĂŒÄŸĂŒnĂŒ hatırlayın: @@ -437,7 +437,7 @@ Sonuç olarak, uygulamamızda `admin` moduleâ€™ĂŒndeki her bir *path operation* * `get_token_header` dependency’si. * `418` response’u. đŸ” -Namun bu sadece bizim uygulamamızdaki o `APIRouter` için geçerlidir; onu kullanan diğer kodlar için değil. +Ancak bu sadece bizim uygulamamızdaki o `APIRouter` için geçerlidir; onu kullanan diğer kodlar için değil. Dolayısıyla örneğin diğer projeler aynı `APIRouter`’ı farklı bir authentication yöntemiyle kullanabilir. @@ -490,7 +490,7 @@ Komuta dosya yolunu da verebilirsiniz, örneğin: $ fastapi dev app/main.py ``` -Namun o zaman her `fastapi` komutunu çalıßtırdığınızda doğru yolu hatırlayıp geçirmeniz gerekir. +Ancak o zaman her `fastapi` komutunu çalıßtırdığınızda doğru yolu hatırlayıp geçirmeniz gerekir. Ayrıca, diğer araçlar uygulamayı bulamayabilir; örneğin [VS Code Eklentisi](../editor-support.md) veya [FastAPI Cloud](https://fastapicloud.com). Bu yĂŒzden `pyproject.toml` içinde `entrypoint` kullanmanız önerilir. diff --git a/docs/tr/docs/tutorial/body-nested-models.md b/docs/tr/docs/tutorial/body-nested-models.md index bcf3057ef..d9f30c862 100644 --- a/docs/tr/docs/tutorial/body-nested-models.md +++ b/docs/tr/docs/tutorial/body-nested-models.md @@ -1,5 +1,6 @@ # Body - İç İçe Modeller { #body-nested-models } + **FastAPI** ile (Pydantic sayesinde) istediğiniz kadar derin iç içe geçmiß modelleri tanımlayabilir, doğrulayabilir, dokĂŒmante edebilir ve kullanabilirsiniz. ## List alanları { #list-fields } diff --git a/docs/tr/docs/tutorial/body.md b/docs/tr/docs/tutorial/body.md index 74b3d3707..d05bd54ec 100644 --- a/docs/tr/docs/tutorial/body.md +++ b/docs/tr/docs/tutorial/body.md @@ -1,5 +1,6 @@ # Request Body { #request-body } + Bir client'ten (örneğin bir tarayıcıdan) API'nize veri göndermeniz gerektiğinde, bunu **request body** olarak gönderirsiniz. Bir **request** body, client'in API'nize gönderdiği veridir. Bir **response** body ise API'nizin client'e gönderdiği veridir. diff --git a/docs/tr/docs/tutorial/debugging.md b/docs/tr/docs/tutorial/debugging.md index 48f99e99c..b73d65137 100644 --- a/docs/tr/docs/tutorial/debugging.md +++ b/docs/tr/docs/tutorial/debugging.md @@ -59,7 +59,7 @@ Yani örneğin `importer.py` adında baßka bir dosyanız var ve içinde ßunlar ```Python from myapp import app -# Some more code +# Biraz daha kod ``` bu durumda `myapp.py` içindeki otomatik olußturulan `__name__` değißkeni `"__main__"` değerine sahip olmaz. diff --git a/docs/tr/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/tr/docs/tutorial/dependencies/dependencies-with-yield.md index 7f56a95c7..be9588297 100644 --- a/docs/tr/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/tr/docs/tutorial/dependencies/dependencies-with-yield.md @@ -111,7 +111,7 @@ Ama ihtiyaç duyarsanız diye burada. đŸ€“ {* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *} -Exception yakalayıp buna göre özel bir response olußturmak istiyorsanız bir [Custom Exception Handler](../handling-errors.md#install-custom-exception-handlers) olußturun. +Exception yakalayıp buna göre özel bir response olußturmak istiyorsanız bir [Özel Exception Handler](../handling-errors.md#install-custom-exception-handlers) olußturun. ## `yield` ve `except` ile Dependency'ler { #dependencies-with-yield-and-except } @@ -233,7 +233,8 @@ participant operation as Path Operation `yield` kullanan dependency'ler, zaman içinde farklı kullanım senaryolarını kapsamak ve bazı sorunları dĂŒzeltmek için gelißti. -FastAPI'nin farklı sĂŒrĂŒmlerinde nelerin değißtiğini görmek isterseniz, advanced guide'da ßu bölĂŒmĂŒ okuyabilirsiniz: [Advanced Dependencies - Dependencies with `yield`, `HTTPException`, `except` and Background Tasks](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks). +FastAPI'nin farklı sĂŒrĂŒmlerinde nelerin değißtiğini görmek isterseniz, gelißmiß kılavuzda ßu bölĂŒmĂŒ okuyabilirsiniz: [Gelißmiß Dependency'ler - `yield`, `HTTPException`, `except` ve Background Tasks ile Dependency'ler](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks). + ## Context Managers { #context-managers } ### "Context Managers" Nedir? { #what-are-context-managers } diff --git a/docs/tr/docs/tutorial/extra-data-types.md b/docs/tr/docs/tutorial/extra-data-types.md index 93ae034b2..da0aab01b 100644 --- a/docs/tr/docs/tutorial/extra-data-types.md +++ b/docs/tr/docs/tutorial/extra-data-types.md @@ -53,7 +53,7 @@ Kullanabileceğiniz ek veri tiplerinden bazıları ßunlardır: ## Örnek { #example } -Yukarıdaki tiplerden bazılarını kullanan parametrelere sahip bir örnek *path operation* ĆŸĂ¶yle: +Yukarıdaki tiplerden bazılarını kullanan parametrelere sahip bir örnek *path operation*: {* ../../docs_src/extra_data_types/tutorial001_an_py310.py hl[1,3,12:16] *} diff --git a/docs/tr/docs/tutorial/extra-models.md b/docs/tr/docs/tutorial/extra-models.md index d25a80aad..9a499b30b 100644 --- a/docs/tr/docs/tutorial/extra-models.md +++ b/docs/tr/docs/tutorial/extra-models.md @@ -1,5 +1,6 @@ # Ek Modeller { #extra-models } + Önceki örnekten devam edersek, birbiriyle ilißkili birden fazla modelin olması oldukça yaygındır. Bu durum özellikle kullanıcı modellerinde sık görĂŒlĂŒr, Ă§ĂŒnkĂŒ: diff --git a/docs/tr/docs/tutorial/first-steps.md b/docs/tr/docs/tutorial/first-steps.md index 1d5cf6fbc..5147f2577 100644 --- a/docs/tr/docs/tutorial/first-steps.md +++ b/docs/tr/docs/tutorial/first-steps.md @@ -1,5 +1,6 @@ # İlk Adımlar { #first-steps } + En sade FastAPI dosyası ßu ßekilde görĂŒnĂŒr: {* ../../docs_src/first_steps/tutorial001_py310.py *} diff --git a/docs/tr/docs/tutorial/handling-errors.md b/docs/tr/docs/tutorial/handling-errors.md index b90e186a6..0339bde14 100644 --- a/docs/tr/docs/tutorial/handling-errors.md +++ b/docs/tr/docs/tutorial/handling-errors.md @@ -93,7 +93,7 @@ Ve bu exception’ı FastAPI ile global olarak handle etmek istiyorsunuz. Burada `/unicorns/yolo` için request atarsanız, *path operation* bir `UnicornException` `raise` eder. -Namun bu, `unicorn_exception_handler` tarafından handle edilir. +Ancak bu, `unicorn_exception_handler` tarafından handle edilir. Böylece HTTP status code’u `418` olan, JSON içeriği ßu ßekilde temiz bir hata response’u alırsınız: diff --git a/docs/tr/docs/tutorial/index.md b/docs/tr/docs/tutorial/index.md index 5dacd280a..e30f3bfbb 100644 --- a/docs/tr/docs/tutorial/index.md +++ b/docs/tr/docs/tutorial/index.md @@ -76,11 +76,11 @@ $ pip install "fastapi[standard]" /// note | Not -`pip install "fastapi[standard]"` ile kurduğunuzda, bazı varsayılan opsiyonel standard bağımlılıklarla birlikte gelir. Bunlara `fastapi-cloud-cli` da dahildir; bu sayede [FastAPI Cloud](https://fastapicloud.com)'a deploy edebilirsiniz. +`pip install "fastapi[standard]"` ile kurduğunuzda, bazı varsayılan opsiyonel standart bağımlılıklarla birlikte gelir. Bunlara `fastapi-cloud-cli` da dahildir; bu sayede [FastAPI Cloud](https://fastapicloud.com)'a deploy edebilirsiniz. Bu opsiyonel bağımlılıkları istemiyorsanız bunun yerine `pip install fastapi` kurabilirsiniz. -Standard bağımlılıkları kurmak istiyor ama `fastapi-cloud-cli` olmasın diyorsanız, `pip install "fastapi[standard-no-fastapi-cloud-cli]"` ile kurabilirsiniz. +Standart bağımlılıkları kurmak istiyor ama `fastapi-cloud-cli` olmasın diyorsanız, `pip install "fastapi[standard-no-fastapi-cloud-cli]"` ile kurabilirsiniz. /// diff --git a/docs/tr/docs/tutorial/metadata.md b/docs/tr/docs/tutorial/metadata.md index 5ed3f8580..8b97505e4 100644 --- a/docs/tr/docs/tutorial/metadata.md +++ b/docs/tr/docs/tutorial/metadata.md @@ -11,7 +11,7 @@ OpenAPI spesifikasyonunda ve otomatik API dokĂŒman arayĂŒzlerinde kullanılan ß | `title` | `str` | API'nin baßlığı. | | `summary` | `str` | API'nin kısa özeti. OpenAPI 3.1.0, FastAPI 0.99.0 sĂŒrĂŒmĂŒnden itibaren mevcut. | | `description` | `str` | API'nin kısa açıklaması. Markdown kullanabilir. | -| `version` | `string` | API'nin sĂŒrĂŒmĂŒ. Bu, OpenAPI'nin değil, kendi uygulamanızın sĂŒrĂŒmĂŒdĂŒr. Örneğin `2.5.0`. | +| `version` | `str` | API'nin sĂŒrĂŒmĂŒ. Bu, OpenAPI'nin değil, kendi uygulamanızın sĂŒrĂŒmĂŒdĂŒr. Örneğin `2.5.0`. | | `terms_of_service` | `str` | API'nin Kullanım Koßulları (Terms of Service) için bir URL. Verilirse, URL formatında olmalıdır. | | `contact` | `dict` | Yayınlanan API için iletißim bilgileri. Birden fazla alan içerebilir.
contact alanları
ParametreTipAçıklama
namestrİletißim kißisi/kurulußunu tanımlayan ad.
urlstrİletißim bilgilerine ißaret eden URL. URL formatında OLMALIDIR.
emailstrİletißim kißisi/kurulußunun e-posta adresi. E-posta adresi formatında OLMALIDIR.
| | `license_info` | `dict` | Yayınlanan API için lisans bilgileri. Birden fazla alan içerebilir.
license_info alanları
ParametreTipAçıklama
namestrZORUNLU (license_info ayarlanmıßsa). API için kullanılan lisans adı.
identifierstrAPI için bir [SPDX](https://spdx.org/licenses/) lisans ifadesi. identifier alanı, url alanıyla karßılıklı olarak dıßlayıcıdır (ikisi aynı anda kullanılamaz). OpenAPI 3.1.0, FastAPI 0.99.0 sĂŒrĂŒmĂŒnden itibaren mevcut.
urlstrAPI için kullanılan lisansa ait URL. URL formatında OLMALIDIR.
| diff --git a/docs/tr/docs/tutorial/path-operation-configuration.md b/docs/tr/docs/tutorial/path-operation-configuration.md index 75057bb26..ee4bc8739 100644 --- a/docs/tr/docs/tutorial/path-operation-configuration.md +++ b/docs/tr/docs/tutorial/path-operation-configuration.md @@ -1,5 +1,6 @@ # Path Operation Yapılandırması { #path-operation-configuration } + Onu yapılandırmak için *path operation decorator*’ınıza geçebileceğiniz çeßitli parametreler vardır. /// warning | Uyarı diff --git a/docs/tr/docs/tutorial/query-params-str-validations.md b/docs/tr/docs/tutorial/query-params-str-validations.md index 7abea5a2f..831cfcb1d 100644 --- a/docs/tr/docs/tutorial/query-params-str-validations.md +++ b/docs/tr/docs/tutorial/query-params-str-validations.md @@ -1,5 +1,6 @@ # Query Parametreleri ve String Doğrulamaları { #query-parameters-and-string-validations } + **FastAPI**, parametreleriniz için ek bilgi ve doğrulamalar (validation) tanımlamanıza izin verir. Örnek olarak ßu uygulamayı ele alalım: diff --git a/docs/tr/docs/tutorial/query-params.md b/docs/tr/docs/tutorial/query-params.md index 56e191f05..4f12c4fad 100644 --- a/docs/tr/docs/tutorial/query-params.md +++ b/docs/tr/docs/tutorial/query-params.md @@ -1,4 +1,4 @@ -# Sorgu Parametreleri { #query-parameters } +# Query Parametreleri { #query-parameters } Fonksiyonda path parametrelerinin parçası olmayan diğer parametreleri tanımladığınızda, bunlar otomatik olarak "query" parametreleri olarak yorumlanır. @@ -71,7 +71,7 @@ Ayrıca, **FastAPI** path parametresi olan `item_id`'nin bir path parametresi ol /// -## Sorgu parametresi tip dönĂŒĆŸĂŒmĂŒ { #query-parameter-type-conversion } +## Query parametresi tip dönĂŒĆŸĂŒmĂŒ { #query-parameter-type-conversion } `bool` tipleri de tanımlayabilirsiniz, ve bunlar dönĂŒĆŸtĂŒrĂŒlĂŒr: diff --git a/docs/tr/docs/tutorial/request-files.md b/docs/tr/docs/tutorial/request-files.md index d1f4656d9..ab54cfd39 100644 --- a/docs/tr/docs/tutorial/request-files.md +++ b/docs/tr/docs/tutorial/request-files.md @@ -64,7 +64,7 @@ Tipi `UploadFile` olan bir dosya parametresi tanımlayın: * Bu sayede görĂŒntĂŒler, videolar, bĂŒyĂŒk binary’ler vb. gibi bĂŒyĂŒk dosyalarda tĂŒm belleği tĂŒketmeden iyi çalıßır. * Upload edilen dosyadan metadata alabilirsiniz. * [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) bir `async` arayĂŒze sahiptir. -* [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) nesnesini dıßa açar; bunu, file-like nesne bekleyen diğer library’lere doğrudan geçebilirsiniz. +* Gerçek bir Python [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) nesnesini dıßa açar; bunu, file-like nesne bekleyen diğer library’lere doğrudan geçebilirsiniz. ### `UploadFile` { #uploadfile } diff --git a/docs/tr/docs/tutorial/request-forms.md b/docs/tr/docs/tutorial/request-forms.md index 12139992f..57f10fb1b 100644 --- a/docs/tr/docs/tutorial/request-forms.md +++ b/docs/tr/docs/tutorial/request-forms.md @@ -1,5 +1,6 @@ # Form Verisi { #form-data } + JSON yerine form alanlarını almanız gerektiğinde `Form` kullanabilirsiniz. /// note | Not diff --git a/docs/tr/docs/tutorial/response-status-code.md b/docs/tr/docs/tutorial/response-status-code.md index fa028265b..7acba44ed 100644 --- a/docs/tr/docs/tutorial/response-status-code.md +++ b/docs/tr/docs/tutorial/response-status-code.md @@ -1,4 +1,4 @@ -# Response Status Code { #response-status-code } +# Response Status Code'u { #response-status-code } Bir response model tanımlayabildiğiniz gibi, herhangi bir *path operation* içinde `status_code` parametresiyle response için kullanılacak HTTP status code'u da belirtebilirsiniz: @@ -18,7 +18,7 @@ Bir response model tanımlayabildiğiniz gibi, herhangi bir *path operation* iç `status_code` parametresi, HTTP status code'u içeren bir sayı alır. -/// note | Bilgi +/// note | Not Alternatif olarak `status_code`, Python'un [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus)'ı gibi bir `IntEnum` da alabilir. diff --git a/docs/tr/docs/tutorial/schema-extra-example.md b/docs/tr/docs/tutorial/schema-extra-example.md index 5c886f862..03f9eac9c 100644 --- a/docs/tr/docs/tutorial/schema-extra-example.md +++ b/docs/tr/docs/tutorial/schema-extra-example.md @@ -24,7 +24,7 @@ Aynı tekniği JSON Schema’yı genißletmek ve kendi özel ek bilgilerinizi ek /// -/// note | Bilgi +/// note | Not OpenAPI 3.1.0 (FastAPI 0.99.0’dan beri kullanılıyor), **JSON Schema** standardının bir parçası olan `examples` için destek ekledi. @@ -123,7 +123,7 @@ FastAPI’de OpenAPI’ye özel `examples`’ı, ßu araçlar için `openapi_exa /// tip | İpucu -Zaten **FastAPI** sĂŒrĂŒmĂŒ **0.99.0 veya ĂŒzerini** kullanıyorsanız, bĂŒyĂŒk olasılıkla bu detayları **atlanabilirsiniz**. +Zaten **FastAPI** sĂŒrĂŒmĂŒ **0.99.0 veya ĂŒzerini** kullanıyorsanız, bĂŒyĂŒk olasılıkla bu detayları **atlayabilirsiniz**. Bunlar daha çok OpenAPI 3.1.0’ın henĂŒz mevcut olmadığı eski sĂŒrĂŒmler için geçerlidir. @@ -155,7 +155,7 @@ OpenAPI ayrıca spesifikasyonun diğer bölĂŒmlerine de `example` ve `examples` * `File()` * `Form()` -/// note | Bilgi +/// note | Not Bu eski OpenAPI’ye özel `examples` parametresi, FastAPI `0.103.0` sĂŒrĂŒmĂŒnden beri `openapi_examples` olarak kullanılıyor. @@ -171,7 +171,7 @@ Ve artık, deprecated olan eski tekil (ve özel) `example` alanına kıyasla bu JSON Schema’daki bu yeni `examples` alanı, OpenAPI’de baßka yerlerde kullanılan (yukarıda anlatılan) metadata’lı `dict` yapısından farklı olarak **sadece örneklerden olußan bir `list`**’tir. -/// note | Bilgi +/// note | Not OpenAPI 3.1.0, JSON Schema ile bu yeni ve daha basit entegrasyonla yayımlandıktan sonra bile bir sĂŒre, otomatik dokĂŒmantasyonu sağlayan araç Swagger UI OpenAPI 3.1.0’ı desteklemiyordu (5.0.0 sĂŒrĂŒmĂŒnden beri destekliyor 🎉). diff --git a/docs/tr/docs/tutorial/security/first-steps.md b/docs/tr/docs/tutorial/security/first-steps.md index 457f53e8e..0d19aa0ec 100644 --- a/docs/tr/docs/tutorial/security/first-steps.md +++ b/docs/tr/docs/tutorial/security/first-steps.md @@ -26,7 +26,7 @@ GĂŒvenliği yönetmek için **FastAPI**’nin sunduğu araçları kullanalım. /// note | Not -The [`python-multipart`](https://github.com/Kludex/python-multipart) paketi, `pip install "fastapi[standard]"` komutunu çalıßtırdığınızda **FastAPI** ile birlikte otomatik olarak kurulur. +[`python-multipart`](https://github.com/Kludex/python-multipart) paketi, `pip install "fastapi[standard]"` komutunu çalıßtırdığınızda **FastAPI** ile birlikte otomatik olarak kurulur. Ancak `pip install fastapi` komutunu kullanırsanız, `python-multipart` paketi varsayılan olarak dahil edilmez. diff --git a/docs/tr/docs/tutorial/security/get-current-user.md b/docs/tr/docs/tutorial/security/get-current-user.md index 429f6dcc9..2883c06fe 100644 --- a/docs/tr/docs/tutorial/security/get-current-user.md +++ b/docs/tr/docs/tutorial/security/get-current-user.md @@ -14,7 +14,7 @@ Bize mevcut kullanıcıyı verecek ßekilde dĂŒzenleyelim. Body'leri bildirmek için Pydantic'i nasıl kullanıyorsak, aynı ßekilde onu baßka her yerde de kullanabiliriz: -{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *} +{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *} ## `get_current_user` dependency'si olußturun { #create-a-get-current-user-dependency } diff --git a/docs/tr/docs/tutorial/security/oauth2-jwt.md b/docs/tr/docs/tutorial/security/oauth2-jwt.md index 077d23f1b..df893ec82 100644 --- a/docs/tr/docs/tutorial/security/oauth2-jwt.md +++ b/docs/tr/docs/tutorial/security/oauth2-jwt.md @@ -18,7 +18,7 @@ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4 ƞifrelenmiß değildir; yani herkes içeriğindeki bilgiyi geri çıkarabilir. -Namun imzalanmıßtır. Bu yĂŒzden, sizin ĂŒrettiğiniz bir token'ı aldığınızda, gerçekten onu sizin ĂŒrettiğinizi doğrulayabilirsiniz. +Ancak imzalanmıßtır. Bu yĂŒzden, sizin ĂŒrettiğiniz bir token'ı aldığınızda, gerçekten onu sizin ĂŒrettiğinizi doğrulayabilirsiniz. Bu ßekilde, örneğin 1 haftalık sĂŒre sonu (expiration) olan bir token olußturabilirsiniz. Sonra kullanıcı ertesi gĂŒn token ile geri geldiğinde, kullanıcının hĂąlĂą sisteminizde oturum açmıß olduğunu bilirsiniz. @@ -120,7 +120,7 @@ Bir tane de kullanıcıyı authenticate edip geri döndĂŒren bir yardımcı fonk `authenticate_user`, veritabanında var olmayan bir username ile çağrıldığında, yine de sahte (dummy) bir hash'e karßı `verify_password` çalıßtırıyoruz. -Bu, username geçerli olsun ya da olmasın endpoint'in yaklaßık aynı sĂŒrede yanıt vermesini sağlar; böylece mevcut username'leri saymaya yarayabilecek zamanlama saldırılarını (timing attacks) engeller. +Bu, username geçerli olsun ya da olmasın endpoint'in yaklaßık aynı sĂŒrede yanıt vermesini sağlar; böylece mevcut username'leri saymaya yarayabilecek **timing attacks** saldırılarını engeller. /// note | Not diff --git a/docs/tr/docs/tutorial/security/simple-oauth2.md b/docs/tr/docs/tutorial/security/simple-oauth2.md index 961e70400..fdc318019 100644 --- a/docs/tr/docs/tutorial/security/simple-oauth2.md +++ b/docs/tr/docs/tutorial/security/simple-oauth2.md @@ -146,7 +146,7 @@ UserInDB( /// note | Not -`**user_dict` için daha kapsamlı bir açıklama için [**Extra Models** dokĂŒmantasyonundaki ilgili bölĂŒme](../extra-models.md#about-user-in-dict) geri dönĂŒp bakın. +`**user_dict` için daha kapsamlı bir açıklama için [**Extra Models** dokĂŒmantasyonundaki ilgili bölĂŒme](../extra-models.md#about-user-in-model-dump) geri dönĂŒp bakın. /// diff --git a/docs/tr/docs/tutorial/sql-databases.md b/docs/tr/docs/tutorial/sql-databases.md index ea4b9ebc4..1145c209a 100644 --- a/docs/tr/docs/tutorial/sql-databases.md +++ b/docs/tr/docs/tutorial/sql-databases.md @@ -352,6 +352,6 @@ $ fastapi dev ## Özet { #recap } -Bir SQL veritabanıyla etkileßim kurmak için [**SQLModel**](https://sqlmodel.tiangolo.com/) kullanabilir ve *data model* ile *table model* yaklaßımıyla kodu sadeleßtirebilirsiniz. +Bir SQL veritabanıyla etkileßim kurmak için [**SQLModel**](https://sqlmodel.tiangolo.com/) kullanabilir ve *data model*’ler ile *table model*’ler kullanarak kodu sadeleßtirebilirsiniz. **SQLModel** dokĂŒmantasyonunda çok daha fazlasını Ă¶ÄŸrenebilirsiniz; **FastAPI** ile SQLModel kullanımı için daha uzun bir mini [tutorial](https://sqlmodel.tiangolo.com/tutorial/fastapi/) da bulunuyor. 🚀 diff --git a/docs/tr/docs/tutorial/static-files.md b/docs/tr/docs/tutorial/static-files.md index 13c20cfa9..b271139a2 100644 --- a/docs/tr/docs/tutorial/static-files.md +++ b/docs/tr/docs/tutorial/static-files.md @@ -2,6 +2,14 @@ `StaticFiles` kullanarak bir dizindeki statik dosyaları otomatik olarak sunabilirsiniz. +/// tip | İpucu + +Bir frontend host etmeniz gerekiyorsa, bunun yerine `app.frontend()` kullanın; bununla ilgili bilgileri [Frontend](frontend.md) bölĂŒmĂŒnde okuyabilirsiniz. + +`app.frontend()`, altında `StaticFiles` kullanır ve frontend'ler için client-side routing'i handle etmek gibi ek avantajlar sağlar. + +/// + ## `StaticFiles` Kullanımı { #use-staticfiles } * `StaticFiles`'ı import edin. diff --git a/docs/tr/docs/tutorial/testing.md b/docs/tr/docs/tutorial/testing.md index 4e223d983..df5248ff4 100644 --- a/docs/tr/docs/tutorial/testing.md +++ b/docs/tr/docs/tutorial/testing.md @@ -75,6 +75,7 @@ Ayrıca **FastAPI** uygulamanız birden fazla dosya/modĂŒl vb. ile de olußturul `main.py` dosyasında **FastAPI** uygulamanız bulunuyor olsun: + {* ../../docs_src/app_testing/app_a_py310/main.py *} ### Test Dosyası { #testing-file } @@ -93,6 +94,7 @@ Bu dosya aynı package içinde olduğu için, `main` modĂŒlĂŒnden (`main.py`) `a {* ../../docs_src/app_testing/app_a_py310/test_main.py hl[3] *} + ...ve test kodunu da öncekiyle aynı ßekilde yazabilirsiniz. ## Test Etme: Genißletilmiß Örnek { #testing-extended-example } @@ -127,6 +129,7 @@ Sonrasında `test_main.py` dosyanızı genißletilmiß testlerle gĂŒncelleyebili {* ../../docs_src/app_testing/app_b_an_py310/test_main.py *} + Client'ın request içinde bir bilgi göndermesi gerektiğinde ve bunu nasıl yapacağınızı bilemediğinizde, `httpx` ile nasıl yapılacağını aratabilirsiniz (Google) ya da HTTPX’in tasarımı Requests’e dayandığı için `requests` ile nasıl yapıldığını da arayabilirsiniz. Sonra testlerinizde aynısını uygularsınız. diff --git a/docs/tr/docs/virtual-environments.md b/docs/tr/docs/virtual-environments.md index 4db3b132f..60494ac12 100644 --- a/docs/tr/docs/virtual-environments.md +++ b/docs/tr/docs/virtual-environments.md @@ -53,7 +53,7 @@ $ cd awesome-project ## Virtual Environment Olußturun { #create-a-virtual-environment } -Bir Python projesi ĂŒzerinde **ilk kez** çalıßmaya baßladığınızda, **virtual environment**'i projenizin içinde olußturun. +Bir Python projesi ĂŒzerinde **ilk kez** çalıßmaya baßladığınızda, virtual environment'i **projenizin içinde** olußturun. /// tip | İpucu @@ -443,6 +443,8 @@ Böylece `python` çalıßtırdığınızda, o virtual environment içinden (ve Artık projeniz ĂŒzerinde çalıßmaya baßlayabilirsiniz. + + /// tip | İpucu Yukarıdaki her ßeyin aslında ne olduğunu anlamak ister misiniz? @@ -517,7 +519,7 @@ $ pip install "harry==3" Sonuç olarak global Python environment'ınızda `harry` versiyon `3` kurulu olur. -Ve `philosophers-stone`'u tekrar çalıßtırmaya kalkarsanız, `harry` versiyon `1`e ihtiyaç duyduğu için **çalıßmama** ihtimali vardır. +Ve `philosophers-stone`'u tekrar çalıßtırmaya kalkarsanız, `harry` versiyon `1`'e ihtiyaç duyduğu için **çalıßmama** ihtimali vardır. ```mermaid flowchart LR From 60237faadb926f616b2b8947e1f793779844d22a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 13:47:39 +0000 Subject: [PATCH 278/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 1f1c25b0a..548310c7d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for tr (update-outdated). PR [#15891](https://github.com/fastapi/fastapi/pull/15891) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for pt (update-outdated). PR [#15893](https://github.com/fastapi/fastapi/pull/15893) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for zh (update-outdated). PR [#15898](https://github.com/fastapi/fastapi/pull/15898) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for uk (update-outdated). PR [#15900](https://github.com/fastapi/fastapi/pull/15900) by [@tiangolo](https://github.com/tiangolo). From c2cdfcbcdd0394c8b4dcf3bd30fca535091e5524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 15:50:11 +0200 Subject: [PATCH 279/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20es=20(update-outdated)=20(#15892)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] Co-authored-by: Yurii Motov --- docs/es/docs/_llm-test.md | 4 +- .../docs/advanced/additional-status-codes.md | 1 + .../es/docs/advanced/advanced-dependencies.md | 4 +- docs/es/docs/advanced/dataclasses.md | 2 +- docs/es/docs/advanced/events.md | 6 +-- docs/es/docs/advanced/generate-clients.md | 18 +------ docs/es/docs/advanced/json-base64-bytes.md | 8 ++-- docs/es/docs/advanced/openapi-callbacks.md | 2 +- .../advanced/response-change-status-code.md | 2 +- docs/es/docs/advanced/response-cookies.md | 6 +-- docs/es/docs/advanced/response-headers.md | 1 + .../docs/advanced/security/oauth2-scopes.md | 1 + docs/es/docs/advanced/settings.md | 22 ++++----- docs/es/docs/advanced/stream-data.md | 10 ++-- docs/es/docs/advanced/wsgi.md | 1 + docs/es/docs/alternatives.md | 16 +++---- docs/es/docs/async.md | 8 ++-- docs/es/docs/deployment/cloud.md | 2 +- docs/es/docs/deployment/concepts.md | 1 + docs/es/docs/deployment/docker.md | 1 + docs/es/docs/deployment/https.md | 2 +- docs/es/docs/deployment/manually.md | 2 +- docs/es/docs/editor-support.md | 2 +- docs/es/docs/environment-variables.md | 1 + docs/es/docs/features.md | 4 +- docs/es/docs/help-fastapi.md | 2 +- docs/es/docs/how-to/configure-swagger-ui.md | 8 ++-- .../docs/how-to/custom-request-and-route.md | 12 ++--- docs/es/docs/how-to/graphql.md | 2 +- ...migrate-from-pydantic-v1-to-pydantic-v2.md | 18 +++++++ .../docs/how-to/separate-openapi-schemas.md | 2 +- docs/es/docs/index.md | 4 +- docs/es/docs/project-generation.md | 18 +++---- docs/es/docs/python-types.md | 24 +++++----- docs/es/docs/tutorial/bigger-applications.md | 30 ++++++------ docs/es/docs/tutorial/body-nested-models.md | 2 +- docs/es/docs/tutorial/body.md | 1 + docs/es/docs/tutorial/debugging.md | 1 + .../dependencies/dependencies-with-yield.md | 1 + docs/es/docs/tutorial/extra-data-types.md | 1 + docs/es/docs/tutorial/extra-models.md | 2 +- docs/es/docs/tutorial/first-steps.md | 8 ++-- docs/es/docs/tutorial/handling-errors.md | 16 +++---- docs/es/docs/tutorial/index.md | 2 +- docs/es/docs/tutorial/metadata.md | 6 +-- .../tutorial/path-operation-configuration.md | 6 +-- .../tutorial/query-params-str-validations.md | 48 +++++++++---------- docs/es/docs/tutorial/query-params.md | 1 + docs/es/docs/tutorial/request-files.md | 6 +-- docs/es/docs/tutorial/request-forms.md | 6 +-- docs/es/docs/tutorial/response-status-code.md | 1 + docs/es/docs/tutorial/schema-extra-example.md | 2 +- docs/es/docs/tutorial/security/first-steps.md | 6 +-- .../tutorial/security/get-current-user.md | 8 ++-- docs/es/docs/tutorial/security/oauth2-jwt.md | 1 + .../docs/tutorial/security/simple-oauth2.md | 2 +- docs/es/docs/tutorial/sql-databases.md | 6 +-- docs/es/docs/tutorial/static-files.md | 8 ++++ docs/es/docs/tutorial/testing.md | 4 +- docs/es/docs/virtual-environments.md | 12 +++-- 60 files changed, 217 insertions(+), 187 deletions(-) diff --git a/docs/es/docs/_llm-test.md b/docs/es/docs/_llm-test.md index d0ffcc540..e5191d9da 100644 --- a/docs/es/docs/_llm-test.md +++ b/docs/es/docs/_llm-test.md @@ -197,7 +197,7 @@ AquĂ­ algunas cosas envueltas en elementos HTML "abbr" (algunas son inventadas): ### El abbr da una frase completa y una explicaciĂłn { #the-abbr-gives-a-full-phrase-and-an-explanation } * MDN -* I/O. +* I/O. //// @@ -464,7 +464,7 @@ Para instrucciones especĂ­ficas del idioma, mira p. ej. la secciĂłn `### Heading * el middleware * la aplicaciĂłn mĂłvil * el mĂłdulo -* el mount +* el mounting * la red * el origen * el override diff --git a/docs/es/docs/advanced/additional-status-codes.md b/docs/es/docs/advanced/additional-status-codes.md index 5c0ab6980..ea6db5feb 100644 --- a/docs/es/docs/advanced/additional-status-codes.md +++ b/docs/es/docs/advanced/additional-status-codes.md @@ -1,5 +1,6 @@ # CĂłdigos de Estado Adicionales { #additional-status-codes } + Por defecto, **FastAPI** devolverĂĄ los responses usando un `JSONResponse`, colocando el contenido que devuelves desde tu *path operation* dentro de ese `JSONResponse`. UsarĂĄ el cĂłdigo de estado por defecto o el que configures en tu *path operation*. diff --git a/docs/es/docs/advanced/advanced-dependencies.md b/docs/es/docs/advanced/advanced-dependencies.md index f3053ffe3..47e9d72a0 100644 --- a/docs/es/docs/advanced/advanced-dependencies.md +++ b/docs/es/docs/advanced/advanced-dependencies.md @@ -10,7 +10,7 @@ Imaginemos que queremos tener una dependencia que revise si el parĂĄmetro de que Pero queremos poder parametrizar ese contenido fijo. -## Una *instance* "callable" { #a-callable-instance } +## Una instance "callable" { #a-callable-instance } En Python hay una forma de hacer que una instance de una clase sea un "callable". @@ -108,7 +108,7 @@ Como verĂĄs abajo, esto es muy similar al comportamiento anterior a la versiĂłn Hay algunos casos de uso con condiciones especĂ­ficas que podrĂ­an beneficiarse del comportamiento antiguo de ejecutar el cĂłdigo de salida de dependencias con `yield` antes de enviar la response. -Por ejemplo, imagina que tienes cĂłdigo que usa una sesiĂłn de base de datos en una dependencia con `yield` solo para verificar un usuario, pero la sesiĂłn de base de datos no se vuelve a usar en la *path operation function*, solo en la dependencia, y la response tarda mucho en enviarse, como un `StreamingResponse` que envĂ­a datos lentamente, pero que por alguna razĂłn no usa la base de datos. +Por ejemplo, imagina que tienes cĂłdigo que usa una sesiĂłn de base de datos en una dependencia con `yield` solo para verificar un usuario, pero la sesiĂłn de base de datos no se vuelve a usar en la *path operation function*, solo en la dependencia, **y** la response tarda mucho en enviarse, como un `StreamingResponse` que envĂ­a datos lentamente, pero que por alguna razĂłn no usa la base de datos. En este caso, la sesiĂłn de base de datos se mantendrĂ­a hasta que la response termine de enviarse, pero si no la usas, entonces no serĂ­a necesario mantenerla. diff --git a/docs/es/docs/advanced/dataclasses.md b/docs/es/docs/advanced/dataclasses.md index e49cada43..9c988dc37 100644 --- a/docs/es/docs/advanced/dataclasses.md +++ b/docs/es/docs/advanced/dataclasses.md @@ -82,7 +82,7 @@ En ese caso, simplemente puedes intercambiar los `dataclasses` estĂĄndar con `py Puedes combinar `dataclasses` con otras anotaciones de tipos en muchas combinaciones diferentes para formar estructuras de datos complejas. -Revisa las anotaciones en el cĂłdigo arriba para ver mĂĄs detalles especĂ­ficos. +Revisa los consejos de anotaciĂłn en el cĂłdigo arriba para ver mĂĄs detalles especĂ­ficos. ## Aprende MĂĄs { #learn-more } diff --git a/docs/es/docs/advanced/events.md b/docs/es/docs/advanced/events.md index e69d6b054..1d221e033 100644 --- a/docs/es/docs/advanced/events.md +++ b/docs/es/docs/advanced/events.md @@ -6,13 +6,13 @@ De la misma manera, puedes definir lĂłgica (cĂłdigo) que deberĂ­a ser ejecutada Debido a que este cĂłdigo se ejecuta antes de que la aplicaciĂłn **comience** a tomar requests, y justo despuĂ©s de que **termine** de manejarlos, cubre todo el **lifespan** de la aplicaciĂłn (la palabra "lifespan" serĂĄ importante en un momento 😉). -Esto puede ser muy Ăștil para configurar **recursos** que necesitas usar para toda la app, y que son **compartidos** entre requests, y/o que necesitas **limpiar** despuĂ©s. Por ejemplo, un pool de conexiones a una base de datos, o cargando un modelo de machine learning compartido. +Esto puede ser muy Ăștil para configurar **recursos** que necesitas usar para toda la app, y que son **compartidos** entre requests, y/o que necesitas **limpiar** despuĂ©s. Por ejemplo, un pool de conexiones a una base de datos, o cargando un modelo de Machine Learning compartido. ## Caso de Uso { #use-case } Empecemos con un ejemplo de **caso de uso** y luego veamos cĂłmo resolverlo con esto. -Imaginemos que tienes algunos **modelos de machine learning** que quieres usar para manejar requests. đŸ€– +Imaginemos que tienes algunos **modelos de Machine Learning** que quieres usar para manejar requests. đŸ€– Los mismos modelos son compartidos entre requests, por lo que no es un modelo por request, o uno por usuario o algo similar. @@ -32,7 +32,7 @@ Creamos una funciĂłn asĂ­ncrona `lifespan()` con `yield` asĂ­: {* ../../docs_src/events/tutorial003_py310.py hl[16,19] *} -AquĂ­ estamos simulando la operaciĂłn costosa de *startup* de cargar el modelo poniendo la funciĂłn del (falso) modelo en el diccionario con modelos de machine learning antes del `yield`. Este cĂłdigo serĂĄ ejecutado **antes** de que la aplicaciĂłn **comience a tomar requests**, durante el *startup*. +AquĂ­ estamos simulando la operaciĂłn costosa de *startup* de cargar el modelo poniendo la funciĂłn del (falso) modelo en el diccionario con modelos de Machine Learning antes del `yield`. Este cĂłdigo serĂĄ ejecutado **antes** de que la aplicaciĂłn **comience a tomar requests**, durante el *startup*. Y luego, justo despuĂ©s del `yield`, quitaremos el modelo de memoria. Este cĂłdigo serĂĄ ejecutado **despuĂ©s** de que la aplicaciĂłn **termine de manejar requests**, justo antes del *shutdown*. Esto podrĂ­a, por ejemplo, liberar recursos como la memoria o una GPU. diff --git a/docs/es/docs/advanced/generate-clients.md b/docs/es/docs/advanced/generate-clients.md index 51834d89c..a44c92294 100644 --- a/docs/es/docs/advanced/generate-clients.md +++ b/docs/es/docs/advanced/generate-clients.md @@ -20,20 +20,6 @@ FastAPI genera automĂĄticamente especificaciones **OpenAPI 3.1**, asĂ­ que cualq /// -## Generadores de SDKs de sponsors de FastAPI { #sdk-generators-from-fastapi-sponsors } - -Esta secciĂłn destaca soluciones **respaldadas por empresas** y **venture-backed** de compañías que sponsor FastAPI. Estos productos ofrecen **funcionalidades adicionales** e **integraciones** ademĂĄs de SDKs generados de alta calidad. - -Al ✹ [**ser sponsor de FastAPI**](../help-fastapi.md#sponsor-the-author) ✹, estas compañías ayudan a asegurar que el framework y su **ecosistema** se mantengan saludables y **sustentables**. - -Su sponsorship tambiĂ©n demuestra un fuerte compromiso con la **comunidad** de FastAPI (tĂș), mostrando que no solo les importa ofrecer un **gran servicio**, sino tambiĂ©n apoyar un **framework robusto y prĂłspero**, FastAPI. 🙇 - -Por ejemplo, podrĂ­as querer probar: - -* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) - -Algunas de estas soluciones tambiĂ©n pueden ser open source u ofrecer niveles gratuitos, asĂ­ que puedes probarlas sin un compromiso financiero. Hay otros generadores de SDK comerciales disponibles y se pueden encontrar en lĂ­nea. đŸ€“ - ## Crea un SDK de TypeScript { #create-a-typescript-sdk } Empecemos con una aplicaciĂłn simple de FastAPI: @@ -52,7 +38,7 @@ Puedes ver esos esquemas porque fueron declarados con los modelos en la app. Esa informaciĂłn estĂĄ disponible en el **OpenAPI schema** de la app, y luego se muestra en la documentaciĂłn de la API. -Y esa misma informaciĂłn de los modelos que estĂĄ incluida en OpenAPI es lo que puede usarse para **generar el cĂłdigo del cliente**. +Esa misma informaciĂłn de los modelos que estĂĄ incluida en OpenAPI es lo que puede usarse para **generar el cĂłdigo del cliente**. ### Hey API { #hey-api } @@ -131,7 +117,7 @@ Puedes **modificar** la forma en que estos operation IDs son **generados** para En este caso tendrĂĄs que asegurarte de que cada operation ID sea **Ășnico** de alguna otra manera. -Por ejemplo, podrĂ­as asegurarte de que cada *path operation* tenga un tag, y luego generar el operation ID basado en el **tag** y el **name** de la *path operation* (el nombre de la funciĂłn). +Por ejemplo, podrĂ­as asegurarte de que cada *path operation* tenga un tag, y luego generar el operation ID basado en el **tag** y el **nombre** de la *path operation* (el nombre de la funciĂłn). ### FunciĂłn personalizada para generar ID Ășnico { #custom-generate-unique-id-function } diff --git a/docs/es/docs/advanced/json-base64-bytes.md b/docs/es/docs/advanced/json-base64-bytes.md index 12936722c..8c0bcfe09 100644 --- a/docs/es/docs/advanced/json-base64-bytes.md +++ b/docs/es/docs/advanced/json-base64-bytes.md @@ -4,7 +4,7 @@ Si tu app necesita recibir y enviar datos JSON, pero necesitas incluir datos bin ## Base64 vs Archivos { #base64-vs-files } -Considera primero si puedes usar [Archivos en request](../tutorial/request-files.md) para subir datos binarios y [Response personalizada - FileResponse](./custom-response.md#fileresponse--fileresponse-) para enviar datos binarios, en lugar de codificarlos en JSON. +Considera primero si puedes usar [Archivos en request](../tutorial/request-files.md) para subir datos binarios y [Response personalizada - FileResponse](./custom-response.md#fileresponse) para enviar datos binarios, en lugar de codificarlos en JSON. JSON solo puede contener strings codificados en UTF-8, asĂ­ que no puede contener bytes crudos. @@ -14,7 +14,7 @@ Usa base64 solo si definitivamente necesitas incluir datos binarios en JSON y no ## Pydantic `bytes` { #pydantic-bytes } -Puedes declarar un modelo de Pydantic con campos `bytes`, y luego usar `val_json_bytes` en la configuraciĂłn del modelo para indicarle que use base64 para validar datos JSON de entrada; como parte de esa validaciĂłn decodificarĂĄ el string base64 en bytes. +Puedes declarar un modelo de Pydantic con campos `bytes`, y luego usar `val_json_bytes` en la configuraciĂłn del modelo para indicarle que use base64 para *validar* datos JSON de entrada; como parte de esa validaciĂłn decodificarĂĄ el string base64 en bytes. {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} @@ -52,12 +52,12 @@ RecibirĂĄs una response como: ## Pydantic `bytes` para datos de salida { #pydantic-bytes-for-output-data } -TambiĂ©n puedes usar campos `bytes` con `ser_json_bytes` en la configuraciĂłn del modelo para datos de salida, y Pydantic serializarĂĄ los bytes como base64 al generar la response JSON. +TambiĂ©n puedes usar campos `bytes` con `ser_json_bytes` en la configuraciĂłn del modelo para datos de salida, y Pydantic *serializarĂĄ* los bytes como base64 al generar la response JSON. {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *} ## Pydantic `bytes` para datos de entrada y salida { #pydantic-bytes-for-input-and-output-data } -Y por supuesto, puedes usar el mismo modelo configurado para usar base64 para manejar tanto la entrada (*validate*) con `val_json_bytes` como la salida (*serialize*) con `ser_json_bytes` al recibir y enviar datos JSON. +Y por supuesto, puedes usar el mismo modelo configurado para usar base64 para manejar tanto la entrada (*validar*) con `val_json_bytes` como la salida (*serializar*) con `ser_json_bytes` al recibir y enviar datos JSON. {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/es/docs/advanced/openapi-callbacks.md b/docs/es/docs/advanced/openapi-callbacks.md index 49896b64b..6b04f2da0 100644 --- a/docs/es/docs/advanced/openapi-callbacks.md +++ b/docs/es/docs/advanced/openapi-callbacks.md @@ -173,7 +173,7 @@ Ahora usa el parĂĄmetro `callbacks` en el *decorador de path operation de tu API /// tip | Consejo -Observa que no estĂĄs pasando el router en sĂ­ (`invoices_callback_router`) a `callbacks=`, sino su `.routes`, como en `invoices_callback_router.routes`. **FastAPI** usarĂĄ esas rutas para generar la documentaciĂłn OpenAPI del callback. +Observa que no estĂĄs pasando el router en sĂ­ (`invoices_callback_router`) a `callbacks=`, sino su `.routes`, como en `invoices_callback_router.routes`. FastAPI usarĂĄ esas rutas para generar la documentaciĂłn OpenAPI del callback. /// diff --git a/docs/es/docs/advanced/response-change-status-code.md b/docs/es/docs/advanced/response-change-status-code.md index 859f484de..aa3c8bf42 100644 --- a/docs/es/docs/advanced/response-change-status-code.md +++ b/docs/es/docs/advanced/response-change-status-code.md @@ -2,7 +2,7 @@ Probablemente leĂ­ste antes que puedes establecer un [CĂłdigo de Estado de Response](../tutorial/response-status-code.md) por defecto. -Pero en algunos casos necesitas devolver un cĂłdigo de estado diferente al predeterminado. +Pero en algunos casos necesitas devolver un cĂłdigo de estado diferente al por defecto. ## Caso de uso { #use-case } diff --git a/docs/es/docs/advanced/response-cookies.md b/docs/es/docs/advanced/response-cookies.md index e40a19129..917072cbe 100644 --- a/docs/es/docs/advanced/response-cookies.md +++ b/docs/es/docs/advanced/response-cookies.md @@ -1,6 +1,6 @@ # Cookies de Response { #response-cookies } -## Usar un parĂĄmetro `Response` { #use-a-response-parameter } +## Usa un parĂĄmetro `Response` { #use-a-response-parameter } Puedes declarar un parĂĄmetro de tipo `Response` en tu *path operation function*. @@ -16,11 +16,11 @@ Y si declaraste un `response_model`, todavĂ­a se utilizarĂĄ para filtrar y conve TambiĂ©n puedes declarar el parĂĄmetro `Response` en las dependencias, y establecer cookies (y headers) en ellas. -## Devolver una `Response` directamente { #return-a-response-directly } +## Devuelve una `Response` directamente { #return-a-response-directly } TambiĂ©n puedes crear cookies al devolver una `Response` directamente en tu cĂłdigo. -Para hacer eso, puedes crear un response como se describe en [Devolver un Response Directamente](response-directly.md). +Para hacer eso, puedes crear un response como se describe en [Devuelve un Response Directamente](response-directly.md). Luego establece Cookies en ella, y luego devuĂ©lvela: diff --git a/docs/es/docs/advanced/response-headers.md b/docs/es/docs/advanced/response-headers.md index 06107eb2d..e2eb8f550 100644 --- a/docs/es/docs/advanced/response-headers.md +++ b/docs/es/docs/advanced/response-headers.md @@ -1,5 +1,6 @@ # Headers de Response { #response-headers } + ## Usa un parĂĄmetro `Response` { #use-a-response-parameter } Puedes declarar un parĂĄmetro de tipo `Response` en tu *path operation function* (como puedes hacer para cookies). diff --git a/docs/es/docs/advanced/security/oauth2-scopes.md b/docs/es/docs/advanced/security/oauth2-scopes.md index f9ddd19e3..e399cd855 100644 --- a/docs/es/docs/advanced/security/oauth2-scopes.md +++ b/docs/es/docs/advanced/security/oauth2-scopes.md @@ -1,5 +1,6 @@ # Scopes de OAuth2 { #oauth2-scopes } + Puedes usar scopes de OAuth2 directamente con **FastAPI**, estĂĄn integrados para funcionar de manera fluida. Esto te permitirĂ­a tener un sistema de permisos mĂĄs detallado, siguiendo el estĂĄndar de OAuth2, integrado en tu aplicaciĂłn OpenAPI (y la documentaciĂłn de la API). diff --git a/docs/es/docs/advanced/settings.md b/docs/es/docs/advanced/settings.md index 2411ddc45..e61229f0d 100644 --- a/docs/es/docs/advanced/settings.md +++ b/docs/es/docs/advanced/settings.md @@ -20,7 +20,7 @@ Eso significa que cualquier valor leĂ­do en Python desde una variable de entorno ## Pydantic `Settings` { #pydantic-settings } -Afortunadamente, Pydantic proporciona una gran utilidad para manejar estas configuraciones provenientes de variables de entorno con [Pydantic: Settings management](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). +Afortunadamente, Pydantic proporciona una gran utilidad para manejar estas configuraciones provenientes de variables de entorno con [Pydantic: GestiĂłn de Settings](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). ### Instalar `pydantic-settings` { #install-pydantic-settings } @@ -120,7 +120,7 @@ TambiĂ©n necesitarĂ­as un archivo `__init__.py` como viste en [Aplicaciones MĂĄs En algunas ocasiones podrĂ­a ser Ăștil proporcionar las configuraciones desde una dependencia, en lugar de tener un objeto global con `settings` que se use en todas partes. -Esto podrĂ­a ser especialmente Ăștil durante las pruebas, ya que es muy fĂĄcil sobrescribir una dependencia con tus propias configuraciones personalizadas. +Esto podrĂ­a ser especialmente Ăștil al escribir pruebas, ya que es muy fĂĄcil sobrescribir una dependencia con tus propias configuraciones personalizadas. ### El archivo de configuraciĂłn { #the-config-file } @@ -148,9 +148,9 @@ Y luego podemos requerirlo desde la *path operation function* como una dependenc {* ../../docs_src/settings/app02_an_py310/main.py hl[17,19:21] *} -### Configuraciones y pruebas { #settings-and-testing } +### Configuraciones y escribir pruebas { #settings-and-testing } -Luego serĂ­a muy fĂĄcil proporcionar un objeto de configuraciones diferente durante las pruebas al crear una sobrescritura de dependencia para `get_settings`: +Luego serĂ­a muy fĂĄcil proporcionar un objeto de configuraciones diferente al escribir pruebas creando una sobrescritura de dependencia para `get_settings`: {* ../../docs_src/settings/app02_an_py310/test_main.py hl[9:10,13,21] *} @@ -160,7 +160,7 @@ Luego podemos probar que se estĂĄ usando. ## Leer un archivo `.env` { #reading-a-env-file } -Si tienes muchas configuraciones que posiblemente cambien mucho, tal vez en diferentes entornos, podrĂ­a ser Ăștil ponerlos en un archivo y luego leerlos desde allĂ­ como si fueran variables de entorno. +Si tienes muchas configuraciones que posiblemente cambien mucho, tal vez en diferentes entornos, podrĂ­a ser Ăștil ponerlas en un archivo y luego leerlas desde allĂ­ como si fueran variables de entorno. Esta prĂĄctica es lo suficientemente comĂșn que tiene un nombre, estas variables de entorno generalmente se colocan en un archivo `.env`, y el archivo se llama un "dotenv". @@ -172,7 +172,7 @@ Pero un archivo dotenv realmente no tiene que tener ese nombre exacto. /// -Pydantic tiene soporte para leer desde estos tipos de archivos usando un paquete externo. Puedes leer mĂĄs en [Pydantic Settings: Dotenv (.env) support](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). +Pydantic tiene soporte para leer desde estos tipos de archivos usando un paquete externo. Puedes leer mĂĄs en [Pydantic Settings: soporte para Dotenv (.env)](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). /// tip | Consejo @@ -197,7 +197,7 @@ Y luego actualizar tu `config.py` con: /// tip | Consejo -El atributo `model_config` se usa solo para configuraciĂłn de Pydantic. Puedes leer mĂĄs en [Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/). +El atributo `model_config` se usa solo para configuraciĂłn de Pydantic. Puedes leer mĂĄs en [Pydantic: Conceptos: ConfiguraciĂłn](https://docs.pydantic.dev/latest/concepts/config/). /// @@ -289,14 +289,14 @@ participant execute as Ejecutar funciĂłn En el caso de nuestra dependencia `get_settings()`, la funciĂłn ni siquiera toma argumentos, por lo que siempre devuelve el mismo valor. -De esa manera, se comporta casi como si fuera solo una variable global. Pero como usa una funciĂłn de dependencia, entonces podemos sobrescribirla fĂĄcilmente para las pruebas. +De esa manera, se comporta casi como si fuera solo una variable global. Pero como usa una funciĂłn de dependencia, entonces podemos sobrescribirla fĂĄcilmente al escribir pruebas. -`@lru_cache` es parte de `functools`, que es parte del paquete estĂĄndar de Python, puedes leer mĂĄs sobre Ă©l en las [docs de Python para `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache). +`@lru_cache` es parte de `functools`, que es parte del paquete estĂĄndar de Python, puedes leer mĂĄs sobre Ă©l en la [documentaciĂłn de Python para `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache). ## Resumen { #recap } Puedes usar Pydantic Settings para manejar las configuraciones o ajustes de tu aplicaciĂłn, con todo el poder de los modelos de Pydantic. -* Al usar una dependencia, puedes simplificar las pruebas. +* Al usar una dependencia, puedes simplificar la escritura de pruebas. * Puedes usar archivos `.env` con Ă©l. -* Usar `@lru_cache` te permite evitar leer el archivo dotenv una y otra vez para cada request, mientras te permite sobrescribirlo durante las pruebas. +* Usar `@lru_cache` te permite evitar leer el archivo dotenv una y otra vez para cada request, mientras te permite sobrescribirlo al escribir pruebas. diff --git a/docs/es/docs/advanced/stream-data.md b/docs/es/docs/advanced/stream-data.md index 2db037e0a..68c89ce44 100644 --- a/docs/es/docs/advanced/stream-data.md +++ b/docs/es/docs/advanced/stream-data.md @@ -2,7 +2,7 @@ Si quieres transmitir datos que se puedan estructurar como JSON, deberĂ­as [Transmitir JSON Lines](../tutorial/stream-json-lines.md). -Pero si quieres transmitir datos binarios puros o strings, aquĂ­ tienes cĂłmo hacerlo. +Pero si quieres **transmitir datos binarios puros** o strings, aquĂ­ tienes cĂłmo hacerlo. /// note | Nota @@ -12,11 +12,11 @@ Añadido en FastAPI 0.134.0. ## Casos de uso { #use-cases } -PodrĂ­as usar esto si quieres transmitir strings puros, por ejemplo directamente de la salida de un servicio de AI LLM. +PodrĂ­as usar esto si quieres transmitir strings puros, por ejemplo directamente de la salida de un servicio de **AI LLM**. -TambiĂ©n podrĂ­as usarlo para transmitir archivos binarios grandes, donde transmites cada bloque de datos a medida que lo lees, sin tener que leerlo todo en memoria de una sola vez. +TambiĂ©n podrĂ­as usarlo para transmitir **archivos binarios grandes**, donde transmites cada bloque de datos a medida que lo lees, sin tener que leerlo todo en memoria de una sola vez. -TambiĂ©n podrĂ­as transmitir video o audio de esta manera; incluso podrĂ­a generarse mientras lo procesas y lo envĂ­as. +TambiĂ©n podrĂ­as transmitir **video** o **audio** de esta manera; incluso podrĂ­a generarse mientras lo procesas y lo envĂ­as. ## Un `StreamingResponse` con `yield` { #a-streamingresponse-with-yield } @@ -40,7 +40,7 @@ Como FastAPI no intentarĂĄ convertir los datos a JSON con Pydantic ni serializar {* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} -Esto tambiĂ©n significa que con `StreamingResponse` tienes la libertad y la responsabilidad de producir y codificar los bytes de datos exactamente como necesites enviarlos, independientemente de las anotaciones de tipos. đŸ€“ +Esto tambiĂ©n significa que con `StreamingResponse` tienes la **libertad** y la **responsabilidad** de producir y codificar los bytes de datos exactamente como necesites enviarlos, independientemente de las anotaciones de tipos. đŸ€“ ### Transmitir bytes { #stream-bytes } diff --git a/docs/es/docs/advanced/wsgi.md b/docs/es/docs/advanced/wsgi.md index 8afe215a1..c85b8cc89 100644 --- a/docs/es/docs/advanced/wsgi.md +++ b/docs/es/docs/advanced/wsgi.md @@ -1,5 +1,6 @@ # Incluyendo WSGI - Flask, Django, otros { #including-wsgi-flask-django-others } + Puedes montar aplicaciones WSGI como viste con [Sub Aplicaciones - Mounts](sub-applications.md), [DetrĂĄs de un Proxy](behind-a-proxy.md). Para eso, puedes usar el `WSGIMiddleware` y usarlo para envolver tu aplicaciĂłn WSGI, por ejemplo, Flask, Django, etc. diff --git a/docs/es/docs/alternatives.md b/docs/es/docs/alternatives.md index 3bc1bf969..693e4d511 100644 --- a/docs/es/docs/alternatives.md +++ b/docs/es/docs/alternatives.md @@ -24,7 +24,7 @@ Fue creado para generar el HTML en el backend, no para crear APIs utilizadas por ### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework } -El framework Django REST fue creado para ser un kit de herramientas flexible para construir APIs Web utilizando Django, mejorando sus capacidades API. +Django REST Framework fue creado para ser un toolkit flexible para construir APIs Web usando Django por debajo, para mejorar sus capacidades de API. Es utilizado por muchas empresas, incluidas Mozilla, Red Hat y Eventbrite. @@ -88,7 +88,7 @@ La forma en que lo usas es muy sencilla. Por ejemplo, para hacer un `GET` reques response = requests.get("http://example.com/some/url") ``` -La operaciĂłn de path equivalente en FastAPI podrĂ­a verse como: +La *path operation* API equivalente de FastAPI podrĂ­a verse como: ```Python hl_lines="1" @app.get("/some/url") @@ -183,7 +183,7 @@ Pero la documentaciĂłn todavĂ­a falta. Entonces APISpec fue creado. Es un plug-in para muchos frameworks (y hay un plug-in para Starlette tambiĂ©n). -La manera en que funciona es que escribes la definiciĂłn del esquema usando el formato YAML dentro del docstring de cada funciĂłn que maneja un path. +La manera en que funciona es que escribes la definiciĂłn del esquema usando el formato YAML dentro del docstring de cada funciĂłn que maneja una ruta. Y genera esquemas OpenAPI. @@ -245,11 +245,11 @@ Logra algo algo similar a lo que se puede hacer con Flask-apispec. Tiene un sistema de inyecciĂłn de dependencias integrado, inspirado por Angular 2. Requiere pre-registrar los "inyectables" (como todos los otros sistemas de inyecciĂłn de dependencias que conozco), por lo que añade a la verbosidad y repeticiĂłn de cĂłdigo. -Como los parĂĄmetros se describen con tipos de TypeScript (similar a las anotaciones de tipos en Python), el soporte editorial es bastante bueno. +Como los parĂĄmetros se describen con tipos de TypeScript (similar a las anotaciones de tipos en Python), el soporte del editor es bastante bueno. Pero como los datos de TypeScript no se preservan despuĂ©s de la compilaciĂłn a JavaScript, no puede depender de los tipos para definir validaciĂłn, serializaciĂłn y documentaciĂłn al mismo tiempo. Debido a esto y algunas decisiones de diseño, para obtener validaciĂłn, serializaciĂłn y generaciĂłn automĂĄtica del esquema, es necesario agregar decoradores en muchos lugares. Por lo tanto, se vuelve bastante verboso. -No puede manejar muy bien modelos anidados. Entonces, si el cuerpo JSON en la request es un objeto JSON que tiene campos internos que a su vez son objetos JSON anidados, no puede ser documentado y validado apropiadamente. +No puede manejar muy bien modelos anidados. Entonces, si el body JSON en la request es un objeto JSON que tiene campos internos que a su vez son objetos JSON anidados, no puede ser documentado y validado apropiadamente. /// tip | InspirĂł a **FastAPI** a @@ -311,11 +311,11 @@ Requiere configuraciones un poquito mĂĄs verbosas. Y dado que se basa en WSGI (e El sistema de inyecciĂłn de dependencias requiere pre-registrar las dependencias y las dependencias se resuelven en base a los tipos declarados. Por lo tanto, no es posible declarar mĂĄs de un "componente" que proporcione cierto tipo. -Los paths se declaran en un solo lugar, usando funciones declaradas en otros lugares (en lugar de usar decoradores que pueden colocarse justo encima de la funciĂłn que maneja el endpoint). Esto se acerca mĂĄs a cĂłmo lo hace Django que a cĂłmo lo hace Flask (y Starlette). Separa en el cĂłdigo cosas que estĂĄn relativamente acopladas. +Las rutas se declaran en un solo lugar, usando funciones declaradas en otros lugares (en lugar de usar decoradores que pueden colocarse justo encima de la funciĂłn que maneja el endpoint). Esto se acerca mĂĄs a cĂłmo lo hace Django que a cĂłmo lo hace Flask (y Starlette). Separa en el cĂłdigo cosas que estĂĄn relativamente acopladas. /// tip | InspirĂł a **FastAPI** a -Definir validaciones extra para tipos de datos usando el valor "default" de los atributos del modelo. Esto mejora el soporte del editor y no estaba disponible en Pydantic antes. +Definir validaciones extra para tipos de datos usando el valor "por defecto" de los atributos del modelo. Esto mejora el soporte del editor y no estaba disponible en Pydantic antes. Esto en realidad inspirĂł la actualizaciĂłn de partes de Pydantic, para soportar el mismo estilo de declaraciĂłn de validaciĂłn (toda esta funcionalidad ya estĂĄ disponible en Pydantic). @@ -433,7 +433,7 @@ Tiene: * CORS, GZip, Archivos estĂĄticos, Responses en streaming. * Soporte para sesiones y cookies. * Cobertura de tests del 100%. -* code base 100% tipada. +* codebase 100% con anotaciones de tipos. * Pocas dependencias obligatorias. Starlette es actualmente el framework de Python mĂĄs rĂĄpido probado. Solo superado por Uvicorn, que no es un framework, sino un servidor. diff --git a/docs/es/docs/async.md b/docs/es/docs/async.md index 299bd83e3..be64f4cbe 100644 --- a/docs/es/docs/async.md +++ b/docs/es/docs/async.md @@ -89,7 +89,7 @@ Como el tiempo de ejecuciĂłn se consume principalmente esperando operaciones de Se llama "asĂ­ncrono" porque la computadora / programa no tiene que estar "sincronizado" con la tarea lenta, esperando el momento exacto en que la tarea termine, sin hacer nada, para poder tomar el resultado de la tarea y continuar el trabajo. -En lugar de eso, al ser un sistema "asĂ­ncrono", una vez terminado, la tarea puede esperar un poco en la cola (algunos microsegundos) para que la computadora / programa termine lo que saliĂł a hacer, y luego regrese para tomar los resultados y continuar trabajando con ellos. +En lugar de eso, al ser un sistema "asĂ­ncrono", una vez terminado, la tarea puede esperar un poquito en la cola (algunos microsegundos) para que la computadora / programa termine lo que saliĂł a hacer, y luego regrese para tomar los resultados y continuar trabajando con ellos. Para el "sincrĂłnico" (contrario al "asĂ­ncrono") comĂșnmente tambiĂ©n usan el tĂ©rmino "secuencial", porque la computadora / programa sigue todos los pasos en secuencia antes de cambiar a una tarea diferente, incluso si esos pasos implican esperar. @@ -151,7 +151,7 @@ Imagina que eres la computadora / programa đŸ€– en esa historia. Mientras estĂĄs en la fila, estĂĄs inactivo 😮, esperando tu turno, sin hacer nada muy "productivo". Pero la fila es rĂĄpida porque el cajero solo estĂĄ tomando los pedidos (no preparĂĄndolos), asĂ­ que estĂĄ bien. -Luego, cuando es tu turno, haces un trabajo realmente "productivo", procesas el menĂș, decides lo que quieres, obtienes la elecciĂłn de tu crush, pagas, verificas que das el billete o tarjeta correctos, verificas que te cobren correctamente, verificas que el pedido tenga los artĂ­culos correctos, etc. +Luego, cuando es tu turno, haces un trabajo realmente "productivo", procesas el menĂș, decides lo que quieres, obtienes la elecciĂłn de tu crush, pagas, revisas que das el billete o tarjeta correctos, revisas que te cobren correctamente, revisas que el pedido tenga los artĂ­culos correctos, etc. Pero luego, aunque todavĂ­a no tienes tus hamburguesas, tu trabajo con el cajero estĂĄ "en pausa" ⏞, porque tienes que esperar 🕙 a que tus hamburguesas estĂ©n listas. @@ -387,7 +387,7 @@ En versiones previas de NodeJS / JavaScript en el Navegador, habrĂ­as usado "cal ## Coroutines { #coroutines } -**Coroutines** es simplemente el tĂ©rmino muy elegante para la cosa que devuelve una funciĂłn `async def`. Python sabe que es algo parecido a una funciĂłn, que puede comenzar y que terminarĂĄ en algĂșn momento, pero que podrĂ­a pausar ⏞ internamente tambiĂ©n, siempre que haya un `await` dentro de Ă©l. +**Coroutine** es simplemente el tĂ©rmino muy elegante para la cosa que devuelve una funciĂłn `async def`. Python sabe que es algo parecido a una funciĂłn, que puede comenzar y que terminarĂĄ en algĂșn momento, pero que podrĂ­a pausar ⏞ internamente tambiĂ©n, siempre que haya un `await` dentro de Ă©l. Pero toda esta funcionalidad de usar cĂłdigo asĂ­ncrono con `async` y `await` a menudo se resume como utilizar "coroutines". Es comparable a la funcionalidad clave principal de Go, las "Goroutines". @@ -417,7 +417,7 @@ Si tienes bastante conocimiento tĂ©cnico (coroutines, hilos, bloqueo, etc.) y ti Cuando declaras una *path operation function* con `def` normal en lugar de `async def`, se ejecuta en un threadpool externo que luego es esperado, en lugar de ser llamado directamente (ya que bloquearĂ­a el servidor). -Si vienes de otro framework async que no funciona de la manera descrita anteriormente y estĂĄs acostumbrado a definir funciones de *path operation* solo de cĂłmputo trivial con `def` normal para una pequeña ganancia de rendimiento (alrededor de 100 nanosegundos), ten en cuenta que en **FastAPI** el efecto serĂ­a bastante opuesto. En estos casos, es mejor usar `async def` a menos que tus *path operation functions* usen cĂłdigo que realice I/O de bloqueo. +Si vienes de otro framework async que no funciona de la manera descrita anteriormente y estĂĄs acostumbrado a definir *path operation functions* solo de cĂłmputo trivial con `def` normal para una pequeña ganancia de rendimiento (alrededor de 100 nanosegundos), ten en cuenta que en **FastAPI** el efecto serĂ­a bastante opuesto. En estos casos, es mejor usar `async def` a menos que tus *path operation functions* usen cĂłdigo que realice I/O de bloqueo. Aun asĂ­, en ambas situaciones, es probable que **FastAPI** [siga siendo mĂĄs rĂĄpida](index.md#performance) que (o al menos comparable a) tu framework anterior. diff --git a/docs/es/docs/deployment/cloud.md b/docs/es/docs/deployment/cloud.md index 266d3cfd2..64711455d 100644 --- a/docs/es/docs/deployment/cloud.md +++ b/docs/es/docs/deployment/cloud.md @@ -16,7 +16,7 @@ FastAPI Cloud es el sponsor principal y proveedor de financiamiento de los proye ## Proveedores de Nube - Sponsors { #cloud-providers-sponsors } -Otros proveedores de nube ✹ [**son sponsors de FastAPI**](../help-fastapi.md#sponsor-the-author) ✹ tambiĂ©n. 🙇 +Algunos otros proveedores de nube ✹ [**son sponsors de FastAPI**](https://github.com/sponsors/tiangolo) ✹ tambiĂ©n. 🙇 TambiĂ©n podrĂ­as considerarlos para seguir sus guĂ­as y probar sus servicios: diff --git a/docs/es/docs/deployment/concepts.md b/docs/es/docs/deployment/concepts.md index 9b3ac0a34..6a2d20a35 100644 --- a/docs/es/docs/deployment/concepts.md +++ b/docs/es/docs/deployment/concepts.md @@ -1,5 +1,6 @@ # Conceptos de ImplementaciĂłn { #deployments-concepts } + Cuando implementas una aplicaciĂłn **FastAPI**, o en realidad, cualquier tipo de API web, hay varios conceptos que probablemente te importen, y al entenderlos, puedes encontrar la **forma mĂĄs adecuada** de **implementar tu aplicaciĂłn**. Algunos de los conceptos importantes son: diff --git a/docs/es/docs/deployment/docker.md b/docs/es/docs/deployment/docker.md index f62db5e70..e54f0c205 100644 --- a/docs/es/docs/deployment/docker.md +++ b/docs/es/docs/deployment/docker.md @@ -1,5 +1,6 @@ # FastAPI en Contenedores - Docker { #fastapi-in-containers-docker } + Al desplegar aplicaciones de FastAPI, un enfoque comĂșn es construir una **imagen de contenedor de Linux**. Normalmente se realiza usando [**Docker**](https://www.docker.com/). Luego puedes desplegar esa imagen de contenedor de varias formas. Usar contenedores de Linux tiene varias ventajas, incluyendo **seguridad**, **replicabilidad**, **simplicidad**, y otras. diff --git a/docs/es/docs/deployment/https.md b/docs/es/docs/deployment/https.md index 227aab0d6..32f0fc28c 100644 --- a/docs/es/docs/deployment/https.md +++ b/docs/es/docs/deployment/https.md @@ -32,7 +32,7 @@ Ahora, desde una **perspectiva de desarrollador**, aquĂ­ hay varias cosas a tene * Esta extensiĂłn SNI permite que un solo servidor (con una **sola direcciĂłn IP**) tenga **varios certificados HTTPS** y sirva **mĂșltiples dominios/aplicaciones HTTPS**. * Para que esto funcione, un componente (programa) **Ășnico** que se ejecute en el servidor, escuchando en la **direcciĂłn IP pĂșblica**, debe tener **todos los certificados HTTPS** en el servidor. * **DespuĂ©s** de obtener una conexiĂłn segura, el protocolo de comunicaciĂłn sigue siendo **HTTP**. - * Los contenidos estĂĄn **encriptados**, aunque se enviĂ©n con el **protocolo HTTP**. + * Los contenidos estĂĄn **encriptados**, aunque se envĂ­en con el **protocolo HTTP**. Es una prĂĄctica comĂșn tener **un programa/servidor HTTP** ejecutĂĄndose en el servidor (la mĂĄquina, host, etc.) y **gestionando todas las partes de HTTPS**: recibiendo los **requests HTTPS encriptados**, enviando los **requests HTTP desencriptados** a la aplicaciĂłn HTTP real que se ejecuta en el mismo servidor (la aplicaciĂłn **FastAPI**, en este caso), tomando el **response HTTP** de la aplicaciĂłn, **encriptĂĄndolo** usando el **certificado HTTPS** adecuado y enviĂĄndolo de vuelta al cliente usando **HTTPS**. Este servidor a menudo se llama un **[TLS Termination Proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy)**. diff --git a/docs/es/docs/deployment/manually.md b/docs/es/docs/deployment/manually.md index 361a57c8f..90e25ecb4 100644 --- a/docs/es/docs/deployment/manually.md +++ b/docs/es/docs/deployment/manually.md @@ -93,7 +93,7 @@ Un proceso similar se aplicarĂ­a a cualquier otro programa de servidor ASGI. Al añadir `standard`, Uvicorn instalarĂĄ y usarĂĄ algunas dependencias adicionales recomendadas. -Eso incluye `uvloop`, el reemplazo de alto rendimiento para `asyncio`, que proporciona un gran impulso de rendimiento en concurrencia. +Eso incluye `uvloop`, el reemplazo directo de alto rendimiento para `asyncio`, que proporciona un gran impulso de rendimiento en concurrencia. Cuando instalas FastAPI con algo como `pip install "fastapi[standard]"` ya obtienes `uvicorn[standard]` tambiĂ©n. diff --git a/docs/es/docs/editor-support.md b/docs/es/docs/editor-support.md index fa552db23..9c9abdd5e 100644 --- a/docs/es/docs/editor-support.md +++ b/docs/es/docs/editor-support.md @@ -10,7 +10,7 @@ La **ExtensiĂłn de FastAPI** estĂĄ disponible tanto para [VS Code](https://code. ### Descubrimiento de la aplicaciĂłn { #application-discovery } -Por defecto, la extensiĂłn descubrirĂĄ automĂĄticamente aplicaciones FastAPI en tu espacio de trabajo escaneando archivos que creen un instance de `FastAPI()`. Si la detecciĂłn automĂĄtica no funciona con la estructura de tu proyecto, puedes especificar un punto de entrada mediante `[tool.fastapi]` en `pyproject.toml` o la configuraciĂłn de VS Code `fastapi.entryPoint` usando notaciĂłn de mĂłdulo (p. ej. `myapp.main:app`). +Por defecto, la extensiĂłn descubrirĂĄ automĂĄticamente aplicaciones FastAPI en tu espacio de trabajo escaneando archivos que crean un instance de `FastAPI()`. Si la detecciĂłn automĂĄtica no funciona con la estructura de tu proyecto, puedes especificar un punto de entrada mediante `[tool.fastapi]` en `pyproject.toml` o la configuraciĂłn de VS Code `fastapi.entryPoint` usando notaciĂłn de mĂłdulo (p. ej. `myapp.main:app`). ## Funcionalidades { #features } diff --git a/docs/es/docs/environment-variables.md b/docs/es/docs/environment-variables.md index 5c58771d9..aab76ebe6 100644 --- a/docs/es/docs/environment-variables.md +++ b/docs/es/docs/environment-variables.md @@ -1,5 +1,6 @@ # Variables de Entorno { #environment-variables } + /// tip | Consejo Si ya sabes quĂ© son las "variables de entorno" y cĂłmo usarlas, siĂ©ntete libre de saltarte esto. diff --git a/docs/es/docs/features.md b/docs/es/docs/features.md index 799af26e9..1feed92bd 100644 --- a/docs/es/docs/features.md +++ b/docs/es/docs/features.md @@ -130,7 +130,7 @@ Todos los esquemas de seguridad definidos en OpenAPI, incluyendo: * ParĂĄmetros de query. * Cookies, etc. -AdemĂĄs de todas las caracterĂ­sticas de seguridad de Starlette (incluyendo **cookies de sesiĂłn**). +AdemĂĄs de todas las funcionalidades de seguridad de Starlette (incluyendo **cookies de sesiĂłn**). Todo construido como herramientas y componentes reutilizables que son fĂĄciles de integrar con tus sistemas, almacenes de datos, bases de datos relacionales y NoSQL, etc. @@ -179,7 +179,7 @@ Con **FastAPI** obtienes todas las funcionalidades de **Starlette** (ya que Fast **FastAPI** es totalmente compatible con (y estĂĄ basado en) [**Pydantic**](https://docs.pydantic.dev/). Por lo tanto, cualquier cĂłdigo adicional de Pydantic que tengas, tambiĂ©n funcionarĂĄ. -Incluyendo paquetes externos tambiĂ©n basados en Pydantic, como ORMs, ODMs para bases de datos. +Incluyendo paquetes externos tambiĂ©n basados en Pydantic, como ORMs y ODMs para bases de datos. Esto tambiĂ©n significa que, en muchos casos, puedes pasar el mismo objeto que obtienes de un request **directamente a la base de datos**, ya que todo se valida automĂĄticamente. diff --git a/docs/es/docs/help-fastapi.md b/docs/es/docs/help-fastapi.md index 71e872d50..e1a8d1a52 100644 --- a/docs/es/docs/help-fastapi.md +++ b/docs/es/docs/help-fastapi.md @@ -68,7 +68,7 @@ Puedes [crear una nueva pregunta](https://github.com/fastapi/fastapi/discussions ## Únete al chat { #join-the-chat } -Únete al servidor de chat đŸ‘„ [Discord](https://discord.gg/VQjSZaeJmf) đŸ‘„ y charla con otros en la comunidad de FastAPI. +Únete al đŸ‘„ [servidor de chat de Discord](https://discord.gg/VQjSZaeJmf) đŸ‘„ y charla con otros en la comunidad de FastAPI. /// tip | Consejo diff --git a/docs/es/docs/how-to/configure-swagger-ui.md b/docs/es/docs/how-to/configure-swagger-ui.md index 8230f4a14..7ff728eef 100644 --- a/docs/es/docs/how-to/configure-swagger-ui.md +++ b/docs/es/docs/how-to/configure-swagger-ui.md @@ -1,4 +1,4 @@ -# Configurar Swagger UI { #configure-swagger-ui } +# Configura Swagger UI { #configure-swagger-ui } Puedes configurar algunos [parĂĄmetros adicionales de Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). @@ -8,7 +8,7 @@ Para configurarlos, pasa el argumento `swagger_ui_parameters` al crear el objeto FastAPI convierte las configuraciones a **JSON** para hacerlas compatibles con JavaScript, ya que eso es lo que Swagger UI necesita. -## Desactivar el resaltado de sintaxis { #disable-syntax-highlighting } +## Desactiva el resaltado de sintaxis { #disable-syntax-highlighting } Por ejemplo, podrĂ­as desactivar el resaltado de sintaxis en Swagger UI. @@ -24,7 +24,7 @@ Pero puedes desactivarlo estableciendo `syntaxHighlight` en `False`: -## Cambiar el tema { #change-the-theme } +## Cambia el tema { #change-the-theme } De la misma manera, podrĂ­as configurar el tema del resaltado de sintaxis con la clave `"syntaxHighlight.theme"` (ten en cuenta que tiene un punto en el medio): @@ -34,7 +34,7 @@ Esa configuraciĂłn cambiarĂ­a el tema de color del resaltado de sintaxis: -## Cambiar los parĂĄmetros por defecto de Swagger UI { #change-default-swagger-ui-parameters } +## Cambia los parĂĄmetros por defecto de Swagger UI { #change-default-swagger-ui-parameters } FastAPI incluye algunos parĂĄmetros de configuraciĂłn por defecto apropiados para la mayorĂ­a de los casos de uso. diff --git a/docs/es/docs/how-to/custom-request-and-route.md b/docs/es/docs/how-to/custom-request-and-route.md index 56013a5c7..5b4d8570f 100644 --- a/docs/es/docs/how-to/custom-request-and-route.md +++ b/docs/es/docs/how-to/custom-request-and-route.md @@ -18,8 +18,8 @@ Si apenas estĂĄs comenzando con **FastAPI**, quizĂĄs quieras saltar esta secciĂł Algunos casos de uso incluyen: -* Convertir cuerpos de requests no-JSON a JSON (por ejemplo, [`msgpack`](https://msgpack.org/index.html)). -* Descomprimir cuerpos de requests comprimidos con gzip. +* Convertir request bodies no-JSON a JSON (por ejemplo, [`msgpack`](https://msgpack.org/index.html)). +* Descomprimir request bodies comprimidos con gzip. * Registrar automĂĄticamente todos los request bodies. ## Manejo de codificaciones personalizadas de request body { #handling-custom-request-body-encodings } @@ -32,7 +32,7 @@ Y una subclase de `APIRoute` para usar esa clase de request personalizada. /// tip | Consejo -Este es un ejemplo sencillo para demostrar cĂłmo funciona. Si necesitas soporte para Gzip, puedes usar el [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) proporcionado. +Este es un ejemplo de juguete para demostrar cĂłmo funciona, si necesitas soporte para Gzip, puedes usar el [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) proporcionado. /// @@ -60,11 +60,11 @@ AquĂ­ lo usamos para crear un `GzipRequest` a partir del request original. Un `Request` tiene un atributo `request.scope`, que es simplemente un `dict` de Python que contiene los metadatos relacionados con el request. -Un `Request` tambiĂ©n tiene un `request.receive`, que es una funciĂłn para "recibir" el request body. +Un `Request` tambiĂ©n tiene un `request.receive`, que es una funciĂłn para "recibir" el body del request. El `dict` `scope` y la funciĂłn `receive` son ambos parte de la especificaciĂłn ASGI. -Y esas dos cosas, `scope` y `receive`, son lo que se necesita para crear una nueva *Request instance*. +Y esas dos cosas, `scope` y `receive`, son lo que se necesita para crear una nueva instance de `Request`. Para aprender mĂĄs sobre el `Request`, revisa [la documentaciĂłn de Starlette sobre Requests](https://www.starlette.dev/requests/). @@ -94,7 +94,7 @@ Todo lo que necesitamos hacer es manejar el request dentro de un bloque `try`/`e {* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[14,16] *} -Si ocurre una excepciĂłn, la `Request instance` aĂșn estarĂĄ en el alcance, asĂ­ que podemos leer y hacer uso del request body cuando manejamos el error: +Si ocurre una excepciĂłn, el instance de `Request` todavĂ­a estarĂĄ en el alcance, asĂ­ que podemos leer y hacer uso del request body cuando manejamos el error: {* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[17:19] *} diff --git a/docs/es/docs/how-to/graphql.md b/docs/es/docs/how-to/graphql.md index 11c0cc23c..a58a11764 100644 --- a/docs/es/docs/how-to/graphql.md +++ b/docs/es/docs/how-to/graphql.md @@ -29,7 +29,7 @@ AquĂ­ algunos de los paquetes de **GraphQL** que tienen soporte **ASGI**. PodrĂ­ ## GraphQL con Strawberry { #graphql-with-strawberry } -Si necesitas o quieres trabajar con **GraphQL**, [**Strawberry**](https://strawberry.rocks/) es el paquete **recomendado** ya que tiene un diseño muy similar al diseño de **FastAPI**, todo basado en **anotaciones de tipos**. +Si necesitas o quieres trabajar con **GraphQL**, [**Strawberry**](https://strawberry.rocks/) es el paquete **recomendado** ya que tiene el diseño mĂĄs cercano al diseño de **FastAPI**, todo basado en **anotaciones de tipos**. Dependiendo de tu caso de uso, podrĂ­as preferir usar un paquete diferente, pero si me preguntas, probablemente te sugerirĂ­a probar **Strawberry**. diff --git a/docs/es/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/es/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md index 22d51674d..571554cad 100644 --- a/docs/es/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md +++ b/docs/es/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -8,6 +8,8 @@ FastAPI versiĂłn 0.119.0 introdujo compatibilidad parcial con Pydantic v1 desde FastAPI 0.126.0 eliminĂł la compatibilidad con Pydantic v1, aunque siguiĂł soportando `pydantic.v1` por un poquito mĂĄs de tiempo. +FastAPI 0.128.0 tambiĂ©n eliminĂł la compatibilidad con `pydantic.v1`, asĂ­ que las versiones mĂĄs recientes de FastAPI requieren Pydantic v2. + /// warning | Advertencia El equipo de Pydantic dejĂł de dar soporte a Pydantic v1 para las versiones mĂĄs recientes de Python, comenzando con **Python 3.14**. @@ -54,6 +56,16 @@ Esto significa que puedes instalar la versiĂłn mĂĄs reciente de Pydantic v2 e im ### Compatibilidad de FastAPI con Pydantic v1 en v2 { #fastapi-support-for-pydantic-v1-in-v2 } +/// warning | Advertencia + +Esta compatibilidad de FastAPI con modelos de `pydantic.v1` se añadiĂł en **FastAPI 0.119.0** y se eliminĂł en **FastAPI 0.128.0**. Estaba pensada para ser una ayuda temporal para la migraciĂłn a Pydantic v2. + +En las versiones actuales de FastAPI, usar un modelo de `pydantic.v1` en tu app generarĂĄ un error. + +El resto de esta secciĂłn describe la compatibilidad temporal disponible solo en esas versiones antiguas. + +/// + Desde FastAPI 0.119.0, tambiĂ©n hay compatibilidad parcial para Pydantic v1 desde dentro de Pydantic v2, para facilitar la migraciĂłn a v2. AsĂ­ que podrĂ­as actualizar Pydantic a la Ășltima versiĂłn 2 y cambiar los imports para usar el submĂłdulo `pydantic.v1`, y en muchos casos simplemente funcionarĂ­a. @@ -122,6 +134,12 @@ Si necesitas usar algunas de las herramientas especĂ­ficas de FastAPI para parĂĄ ### Migra por pasos { #migrate-in-steps } +/// warning | Advertencia + +La migraciĂłn gradual usando tanto modelos de Pydantic v1 como de v2 en la misma app descrita abajo solo funciona en **FastAPI 0.119.0 a 0.127.x**. Se eliminĂł en **FastAPI 0.128.0**, las versiones mĂĄs recientes requieren modelos de **Pydantic v2**. + +/// + /// tip | Consejo Primero prueba con `bump-pydantic`, si tus tests pasan y eso funciona, entonces terminaste con un solo comando. ✹ diff --git a/docs/es/docs/how-to/separate-openapi-schemas.md b/docs/es/docs/how-to/separate-openapi-schemas.md index 1026085e0..14990a79a 100644 --- a/docs/es/docs/how-to/separate-openapi-schemas.md +++ b/docs/es/docs/how-to/separate-openapi-schemas.md @@ -77,7 +77,7 @@ Pero para `Item-Output`, `description` **es requerido**, tiene un asterisco rojo Con esta funcionalidad de **Pydantic v2**, la documentaciĂłn de tu API es mĂĄs **precisa**, y si tienes clientes y SDKs autogenerados, tambiĂ©n serĂĄn mĂĄs precisos, con una mejor **experiencia para desarrolladores** y consistencia. 🎉 -## No Separar Esquemas { #do-not-separate-schemas } +## No separes esquemas { #do-not-separate-schemas } Ahora, hay algunos casos donde podrĂ­as querer tener el **mismo esquema para entrada y salida**. diff --git a/docs/es/docs/index.md b/docs/es/docs/index.md index 58d534eef..7a9caec51 100644 --- a/docs/es/docs/index.md +++ b/docs/es/docs/index.md @@ -45,7 +45,7 @@ Las funcionalidades clave son: * **RĂĄpido**: Muy alto rendimiento, a la par con **NodeJS** y **Go** (gracias a Starlette y Pydantic). [Uno de los frameworks Python mĂĄs rĂĄpidos disponibles](#performance). * **RĂĄpido de programar**: Aumenta la velocidad para desarrollar funcionalidades en aproximadamente un 200% a 300%. * * **Menos bugs**: Reduce en aproximadamente un 40% los errores inducidos por humanos (desarrolladores). * -* **Intuitivo**: Gran soporte para editores. Autocompletado en todas partes. Menos tiempo depurando. +* **Intuitivo**: Gran soporte para editores. Autocompletado en todas partes. Menos tiempo depurando. * **FĂĄcil**: Diseñado para ser fĂĄcil de usar y aprender. Menos tiempo leyendo documentaciĂłn. * **Corto**: Minimiza la duplicaciĂłn de cĂłdigo. MĂșltiples funcionalidades desde cada declaraciĂłn de parĂĄmetro. Menos bugs. * **Robusto**: ObtĂ©n cĂłdigo listo para producciĂłn. Con documentaciĂłn interactiva automĂĄtica. @@ -479,7 +479,7 @@ Para un ejemplo mĂĄs completo incluyendo mĂĄs funcionalidades, ve al InyecciĂłn de Dependencias
** muy poderoso y fĂĄcil de usar. +* Un sistema de **InyecciĂłn de Dependencias** muy poderoso y fĂĄcil de usar. * Seguridad y autenticaciĂłn, incluyendo soporte para **OAuth2** con **tokens JWT** y autenticaciĂłn **HTTP Basic**. * TĂ©cnicas mĂĄs avanzadas (pero igualmente fĂĄciles) para declarar **modelos JSON profundamente anidados** (gracias a Pydantic). * IntegraciĂłn con **GraphQL** usando [Strawberry](https://strawberry.rocks) y otros paquetes. diff --git a/docs/es/docs/project-generation.md b/docs/es/docs/project-generation.md index 11a560eba..fd0fd7017 100644 --- a/docs/es/docs/project-generation.md +++ b/docs/es/docs/project-generation.md @@ -9,18 +9,18 @@ Repositorio de GitHub: [Plantilla Full Stack FastAPI](https://github.com/tiangol ## Plantilla Full Stack FastAPI - Stack de tecnologĂ­a y funcionalidades { #full-stack-fastapi-template-technology-stack-and-features } - ⚡ [**FastAPI**](https://fastapi.tiangolo.com/es) para la API del backend en Python. - - 🧰 [SQLModel](https://sqlmodel.tiangolo.com) para las interacciones con bases de datos SQL en Python (ORM). - - 🔍 [Pydantic](https://docs.pydantic.dev), utilizado por FastAPI, para la validaciĂłn de datos y gestiĂłn de configuraciones. - - đŸ’Ÿ [PostgreSQL](https://www.postgresql.org) como base de datos SQL. + - 🧰 [SQLModel](https://sqlmodel.tiangolo.com) para las interacciones con bases de datos SQL en Python (ORM). + - 🔍 [Pydantic](https://docs.pydantic.dev), utilizado por FastAPI, para la validaciĂłn de datos y gestiĂłn de configuraciones. + - đŸ’Ÿ [PostgreSQL](https://www.postgresql.org) como base de datos SQL. - 🚀 [React](https://react.dev) para el frontend. - - 💃 Usando TypeScript, hooks, Vite, y otras partes de una stack moderna de frontend. - - 🎹 [Tailwind CSS](https://tailwindcss.com) y [shadcn/ui](https://ui.shadcn.com) para los componentes del frontend. - - đŸ€– Un cliente de frontend generado automĂĄticamente. - - đŸ§Ș [Playwright](https://playwright.dev) para escribir pruebas End-to-End. - - 🩇 Soporte para modo oscuro. + - 💃 Usando TypeScript, hooks, Vite, y otras partes de una stack moderna de frontend. + - 🎹 [Tailwind CSS](https://tailwindcss.com) y [shadcn/ui](https://ui.shadcn.com) para los componentes del frontend. + - đŸ€– Un cliente de frontend generado automĂĄticamente. + - đŸ§Ș [Playwright](https://playwright.dev) para escribir pruebas End-to-End. + - 🩇 Soporte para modo oscuro. - 🐋 [Docker Compose](https://www.docker.com) para desarrollo y producciĂłn. - 🔒 Hashing seguro de contraseñas por defecto. -- 🔑 AutenticaciĂłn con tokens JWT. +- 🔑 AutenticaciĂłn con JWT (JSON Web Token). - đŸ“« RecuperaciĂłn de contraseñas basada en email. - ✅ Pruebas con [Pytest](https://pytest.org). - 📞 [Traefik](https://traefik.io) como proxy inverso / load balancer. diff --git a/docs/es/docs/python-types.md b/docs/es/docs/python-types.md index 878c8be03..6a13b97eb 100644 --- a/docs/es/docs/python-types.md +++ b/docs/es/docs/python-types.md @@ -1,8 +1,8 @@ # IntroducciĂłn a Tipos en Python { #python-types-intro } -Python tiene soporte para "anotaciones de tipos" opcionales (tambiĂ©n llamadas "type hints"). +Python tiene soporte para "anotaciones de tipos" opcionales (tambiĂ©n llamadas "anotaciones de tipos"). -Estas **"anotaciones de tipos"** o type hints son una sintaxis especial que permite declarar el tipo de una variable. +Estas **"anotaciones de tipos"** o anotaciones son una sintaxis especial que permite declarar el tipo de una variable. Al declarar tipos para tus variables, los editores y herramientas te pueden proporcionar un mejor soporte. @@ -44,7 +44,7 @@ Es un programa muy simple. Pero ahora imagina que lo escribieras desde cero. -En algĂșn momento habrĂ­as empezado la definiciĂłn de la funciĂłn, tenĂ­as los parĂĄmetros listos... +En algĂșn momento empiezas a definir la funciĂłn, y tienes los parĂĄmetros listos... Pero luego tienes que llamar "ese mĂ©todo que convierte la primera letra a mayĂșscula". @@ -58,7 +58,7 @@ Pero, tristemente, no obtienes nada Ăștil: -### Añadir tipos { #add-types } +### Añade tipos { #add-types } Modifiquemos una sola lĂ­nea de la versiĂłn anterior. @@ -120,7 +120,7 @@ Ahora sabes que debes corregirlo, convertir `age` a un string con `str(age)`: Acabas de ver el lugar principal para declarar anotaciones de tipos. Como parĂĄmetros de funciĂłn. -Este tambiĂ©n es el lugar principal donde los utilizarĂ­as con **FastAPI**. +Este tambiĂ©n es el lugar principal donde las utilizarĂ­as con **FastAPI**. ### Tipos simples { #simple-types } @@ -137,7 +137,7 @@ Puedes usar, por ejemplo: ### MĂłdulo `typing` { #typing-module } -Para algunos casos adicionales, podrĂ­as necesitar importar algunas cosas del mĂłdulo `typing` de la standard library, por ejemplo cuando quieres declarar que algo tiene "cualquier tipo", puedes usar `Any` de `typing`: +Para algunos casos adicionales, podrĂ­as necesitar importar algunas cosas del mĂłdulo `typing` del paquete estĂĄndar, por ejemplo cuando quieres declarar que algo tiene "cualquier tipo", puedes usar `Any` de `typing`: ```python from typing import Any @@ -149,7 +149,7 @@ def some_function(data: Any): ### Tipos genĂ©ricos { #generic-types } -Algunos tipos pueden tomar "parĂĄmetros de tipo" entre corchetes, para definir sus tipos internos, por ejemplo una "lista de strings" se declararĂ­a `list[str]`. +Algunos tipos pueden tomar "parĂĄmetros de tipo" entre corchetes, para definir sus tipos internos, por ejemplo una "list de strings" se declararĂ­a `list[str]`. Estos tipos que pueden tomar parĂĄmetros de tipo se llaman **Tipos GenĂ©ricos** o **GenĂ©ricos**. @@ -160,7 +160,7 @@ Puedes usar los mismos tipos integrados como genĂ©ricos (con corchetes y tipos d * `set` * `dict` -#### Lista { #list } +#### List { #list } Por ejemplo, vamos a definir una variable para ser una `list` de `str`. @@ -168,7 +168,7 @@ Declara la variable, con la misma sintaxis de dos puntos (`:`). Como tipo, pon `list`. -Como la lista es un tipo que contiene algunos tipos internos, los pones entre corchetes: +Como la `list` es un tipo que contiene algunos tipos internos, los pones entre corchetes: {* ../../docs_src/python_types/tutorial006_py310.py hl[1] *} @@ -180,15 +180,15 @@ En este caso, `str` es el parĂĄmetro de tipo pasado a `list`. /// -Eso significa: "la variable `items` es una `list`, y cada uno de los Ă­tems en esta lista es un `str`". +Eso significa: "la variable `items` es una `list`, y cada uno de los Ă­tems en esta `list` es un `str`". -Al hacer eso, tu editor puede proporcionar soporte incluso mientras procesa elementos de la lista: +Al hacer eso, tu editor puede proporcionar soporte incluso mientras procesa elementos de la `list`: Sin tipos, eso es casi imposible de lograr. -Nota que la variable `item` es uno de los elementos en la lista `items`. +Nota que la variable `item` es uno de los elementos en la `list` `items`. Y aĂșn asĂ­, el editor sabe que es un `str` y proporciona soporte para eso. diff --git a/docs/es/docs/tutorial/bigger-applications.md b/docs/es/docs/tutorial/bigger-applications.md index f45b4912a..31688d8ab 100644 --- a/docs/es/docs/tutorial/bigger-applications.md +++ b/docs/es/docs/tutorial/bigger-applications.md @@ -17,16 +17,16 @@ Digamos que tienes una estructura de archivos como esta: ``` . ├── app -│   ├── __init__.py -│   ├── main.py -│   ├── dependencies.py -│   └── routers -│   │ ├── __init__.py -│   │ ├── items.py -│   │ └── users.py -│   └── internal -│   ├── __init__.py -│   └── admin.py +│ ├── __init__.py +│ ├── main.py +│ ├── dependencies.py +│ └── routers +│ │ ├── __init__.py +│ │ ├── items.py +│ │ └── users.py +│ └── internal +│ ├── __init__.py +│ └── admin.py ``` /// tip | Consejo @@ -181,12 +181,12 @@ El resultado final es que los paths de item son ahora: ...como pretendĂ­amos. * SerĂĄn marcados con una lista de tags que contiene un solo string `"items"`. - * Estos "tags" son especialmente Ăștiles para los sistemas de documentaciĂłn interactiva automĂĄtica (usando OpenAPI). + * Estos "tags" son especialmente Ăștiles para los sistemas de documentaciĂłn interactiva automĂĄtica (usando OpenAPI). * Todos incluirĂĄn las `responses` predefinidas. * Todas estas *path operations* tendrĂĄn la lista de `dependencies` evaluadas/ejecutadas antes de ellas. - * Si tambiĂ©n declaras dependencias en una *path operation* especĂ­fica, **tambiĂ©n se ejecutarĂĄn**. - * Las dependencias del router se ejecutan primero, luego las [`dependencies` en el decorador](dependencies/dependencies-in-path-operation-decorators.md), y luego las dependencias de parĂĄmetros normales. - * TambiĂ©n puedes agregar [dependencias de `Security` con `scopes`](../advanced/security/oauth2-scopes.md). + * Si tambiĂ©n declaras dependencias en una *path operation* especĂ­fica, **tambiĂ©n se ejecutarĂĄn**. + * Las dependencias del router se ejecutan primero, luego las [`dependencies` en el decorador](dependencies/dependencies-in-path-operation-decorators.md), y luego las dependencias de parĂĄmetros normales. + * TambiĂ©n puedes agregar [dependencias de `Security` con `scopes`](../advanced/security/oauth2-scopes.md). /// tip | Consejo @@ -461,7 +461,7 @@ Los `APIRouter`s no estĂĄn "montados", no estĂĄn aislados del resto de la aplica Esto se debe a que queremos incluir sus *path operations* en el esquema de OpenAPI y las interfaces de usuario. -FastAPI mantiene los routers y *path operations* originales activos, y combina los prefijos del router, dependencias, tags, responses y otros metadatos al manejar requests y generar OpenAPI. +FastAPI mantiene los routers y path operations originales activos, y combina los prefijos del router, dependencias, tags, responses y otros metadatos al manejar requests y generar OpenAPI. /// diff --git a/docs/es/docs/tutorial/body-nested-models.md b/docs/es/docs/tutorial/body-nested-models.md index 14151a036..3ca586014 100644 --- a/docs/es/docs/tutorial/body-nested-models.md +++ b/docs/es/docs/tutorial/body-nested-models.md @@ -23,7 +23,7 @@ pasa el/los tipo(s) interno(s) como "parĂĄmetros de tipo" usando corchetes: `[` my_list: list[str] ``` -Eso es toda la sintaxis estĂĄndar de Python para declaraciones de tipo. +Esa es toda la sintaxis estĂĄndar de Python para declaraciones de tipo. Usa esa misma sintaxis estĂĄndar para atributos de modelos con tipos internos. diff --git a/docs/es/docs/tutorial/body.md b/docs/es/docs/tutorial/body.md index a87512da2..a71b81a40 100644 --- a/docs/es/docs/tutorial/body.md +++ b/docs/es/docs/tutorial/body.md @@ -1,5 +1,6 @@ # Request Body { #request-body } + Cuando necesitas enviar datos desde un cliente (digamos, un navegador) a tu API, los envĂ­as como un **request body**. Un **request** body es un dato enviado por el cliente a tu API. Un **response** body es el dato que tu API envĂ­a al cliente. diff --git a/docs/es/docs/tutorial/debugging.md b/docs/es/docs/tutorial/debugging.md index d91a32616..95e19c149 100644 --- a/docs/es/docs/tutorial/debugging.md +++ b/docs/es/docs/tutorial/debugging.md @@ -1,5 +1,6 @@ # DepuraciĂłn { #debugging } + Puedes conectar el depurador en tu editor, por ejemplo con Visual Studio Code o PyCharm. ## Llama a `uvicorn` { #call-uvicorn } diff --git a/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md index 552c98ed0..aab8eca7b 100644 --- a/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md @@ -234,6 +234,7 @@ participant operation as Path Operation Las dependencias con `yield` han evolucionado con el tiempo para cubrir diferentes casos de uso y corregir algunos problemas. Si quieres ver quĂ© ha cambiado en diferentes versiones de FastAPI, puedes leer mĂĄs al respecto en la guĂ­a avanzada, en [Dependencias avanzadas - Dependencias con `yield`, `HTTPException`, `except` y Tareas en Background](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks). + ## Context Managers { #context-managers } ### QuĂ© son los "Context Managers" { #what-are-context-managers } diff --git a/docs/es/docs/tutorial/extra-data-types.md b/docs/es/docs/tutorial/extra-data-types.md index b92d0fcd4..bd5fdc073 100644 --- a/docs/es/docs/tutorial/extra-data-types.md +++ b/docs/es/docs/tutorial/extra-data-types.md @@ -1,5 +1,6 @@ # Tipos de Datos Extra { #extra-data-types } + Hasta ahora, has estado usando tipos de datos comunes, como: * `int` diff --git a/docs/es/docs/tutorial/extra-models.md b/docs/es/docs/tutorial/extra-models.md index 4a3b75b5b..903a13c70 100644 --- a/docs/es/docs/tutorial/extra-models.md +++ b/docs/es/docs/tutorial/extra-models.md @@ -208,4 +208,4 @@ En este caso, puedes usar `dict`: Usa mĂșltiples modelos Pydantic y hereda libremente para cada caso. -No necesitas tener un solo modelo de datos por entidad si esa entidad debe poder tener diferentes "estados". Como el caso con la "entidad" usuario con un estado que incluye `password`, `password_hash` y sin contraseña. +No necesitas tener un solo modelo de datos por entidad si esa entidad debe poder tener diferentes "estados". La "entidad" **usuario** es un ejemplo, con estados que incluyen `password`, `password_hash` o ninguna contraseña. diff --git a/docs/es/docs/tutorial/first-steps.md b/docs/es/docs/tutorial/first-steps.md index 5aaf8bdfa..61e5f4099 100644 --- a/docs/es/docs/tutorial/first-steps.md +++ b/docs/es/docs/tutorial/first-steps.md @@ -90,13 +90,13 @@ VerĂĄs la documentaciĂłn alternativa automĂĄtica (proporcionada por [ReDoc](http Un "esquema" es una definiciĂłn o descripciĂłn de algo. No el cĂłdigo que lo implementa, sino solo una descripciĂłn abstracta. -#### Esquema de la API { #api-schema } +#### "Esquema" de la API { #api-schema } En este caso, [OpenAPI](https://github.com/OAI/OpenAPI-Specification) es una especificaciĂłn que dicta cĂłmo definir un esquema de tu API. Esta definiciĂłn de esquema incluye los paths de tu API, los posibles parĂĄmetros que toman, etc. -#### Esquema de Datos { #data-schema } +#### "Esquema" de datos { #data-schema } El tĂ©rmino "esquema" tambiĂ©n podrĂ­a referirse a la forma de algunos datos, como el contenido JSON. @@ -194,7 +194,7 @@ O, tambiĂ©n puedes pasar la opciĂłn `--entrypoint` al comando `fastapi dev`: $ fastapi dev --entrypoint main:app ``` -Pero tendrĂ­as que recordar pasar el path o entrypoint correctos cada vez que llames al comando `fastapi`. +Pero tendrĂ­as que recordar pasar el path\entrypoint correcto cada vez que llames al comando `fastapi`. AdemĂĄs, otras herramientas podrĂ­an no ser capaces de encontrarlo, por ejemplo la [ExtensiĂłn de VS Code](../editor-support.md) o [FastAPI Cloud](https://fastapicloud.com), asĂ­ que se recomienda usar el `entrypoint` en `pyproject.toml`. @@ -301,7 +301,7 @@ Normalmente usas: * `PUT`: para actualizar datos. * `DELETE`: para eliminar datos. -AsĂ­ que, en OpenAPI, cada uno de los mĂ©todos HTTP se llama una "operation". +AsĂ­ que, en OpenAPI, cada uno de los mĂ©todos HTTP se llama una "operaciĂłn". Vamos a llamarlas "**operaciones**" tambiĂ©n. diff --git a/docs/es/docs/tutorial/handling-errors.md b/docs/es/docs/tutorial/handling-errors.md index 737c43e41..f64064231 100644 --- a/docs/es/docs/tutorial/handling-errors.md +++ b/docs/es/docs/tutorial/handling-errors.md @@ -101,7 +101,7 @@ AsĂ­ que recibirĂĄs un error limpio, con un cĂłdigo de estado HTTP de `418` y un {"message": "Oops! yolo did something. There goes a rainbow..."} ``` -/// note | Nota TĂ©cnica +/// note | Detalles TĂ©cnicos TambiĂ©n podrĂ­as usar `from starlette.requests import Request` y `from starlette.responses import JSONResponse`. @@ -109,11 +109,11 @@ TambiĂ©n podrĂ­as usar `from starlette.requests import Request` y `from starlett /// -## Sobrescribir los manejadores de excepciones predeterminados { #override-the-default-exception-handlers } +## Sobrescribir los manejadores de excepciones por defecto { #override-the-default-exception-handlers } -**FastAPI** tiene algunos manejadores de excepciones predeterminados. +**FastAPI** tiene algunos manejadores de excepciones por defecto. -Estos manejadores se encargan de devolver los responses JSON predeterminadas cuando lanzas un `HTTPException` y cuando el request tiene datos invĂĄlidos. +Estos manejadores se encargan de devolver los responses JSON por defecto cuando lanzas un `HTTPException` y cuando el request tiene datos invĂĄlidos. Puedes sobrescribir estos manejadores de excepciones con los tuyos propios. @@ -121,7 +121,7 @@ Puedes sobrescribir estos manejadores de excepciones con los tuyos propios. Cuando un request contiene datos invĂĄlidos, **FastAPI** lanza internamente un `RequestValidationError`. -Y tambiĂ©n incluye un manejador de excepciones predeterminado para ello. +Y tambiĂ©n incluye un manejador de excepciones por defecto para ello. Para sobrescribirlo, importa el `RequestValidationError` y Ășsalo con `@app.exception_handler(RequestValidationError)` para decorar el manejador de excepciones. @@ -161,7 +161,7 @@ Por ejemplo, podrĂ­as querer devolver un response de texto plano en lugar de JSO {* ../../docs_src/handling_errors/tutorial004_py310.py hl[3:4,9:11,25] *} -/// note | Nota TĂ©cnica +/// note | Detalles TĂ©cnicos TambiĂ©n podrĂ­as usar `from starlette.responses import PlainTextResponse`. @@ -237,8 +237,8 @@ from starlette.exceptions import HTTPException as StarletteHTTPException ### Reutilizar los manejadores de excepciones de **FastAPI** { #reuse-fastapis-exception-handlers } -Si quieres usar la excepciĂłn junto con los mismos manejadores de excepciones predeterminados de **FastAPI**, puedes importar y reutilizar los manejadores de excepciones predeterminados de `fastapi.exception_handlers`: +Si quieres usar la excepciĂłn junto con los mismos manejadores de excepciones por defecto de **FastAPI**, puedes importar y reutilizar los manejadores de excepciones por defecto de `fastapi.exception_handlers`: {* ../../docs_src/handling_errors/tutorial006_py310.py hl[2:5,15,21] *} -En este ejemplo solo estĂĄs `print`eando el error con un mensaje muy expresivo, pero te haces una idea. Puedes usar la excepciĂłn y luego simplemente reutilizar los manejadores de excepciones predeterminados. +En este ejemplo solo estĂĄs `print`eando el error con un mensaje muy expresivo, pero te haces una idea. Puedes usar la excepciĂłn y luego simplemente reutilizar los manejadores de excepciones por defecto. diff --git a/docs/es/docs/tutorial/index.md b/docs/es/docs/tutorial/index.md index 414e865b2..59b9e4164 100644 --- a/docs/es/docs/tutorial/index.md +++ b/docs/es/docs/tutorial/index.md @@ -54,7 +54,7 @@ $ fastapi dev Es **ALTAMENTE recomendable** que escribas o copies el cĂłdigo, lo edites y lo ejecutes localmente. -Usarlo en tu editor es lo que realmente te muestra los beneficios de FastAPI, al ver cuĂĄn poco cĂłdigo tienes que escribir, todos los chequeos de tipos, autocompletado, etc. +Usarlo en tu editor es lo que realmente te muestra los beneficios de FastAPI, al ver cuĂĄn poco cĂłdigo tienes que escribir, todo el chequeo de tipos, autocompletado, etc. --- diff --git a/docs/es/docs/tutorial/metadata.md b/docs/es/docs/tutorial/metadata.md index 9dd9088da..d8b7176d5 100644 --- a/docs/es/docs/tutorial/metadata.md +++ b/docs/es/docs/tutorial/metadata.md @@ -1,4 +1,4 @@ -# Metadata y URLs de Docs { #metadata-and-docs-urls } +# Metadata y URLs de documentaciĂłn { #metadata-and-docs-urls } Puedes personalizar varias configuraciones de metadata en tu aplicaciĂłn **FastAPI**. @@ -11,7 +11,7 @@ Puedes establecer los siguientes campos que se usan en la especificaciĂłn OpenAP | `title` | `str` | El tĂ­tulo de la API. | | `summary` | `str` | Un resumen corto de la API. Disponible desde OpenAPI 3.1.0, FastAPI 0.99.0. | | `description` | `str` | Una breve descripciĂłn de la API. Puede usar Markdown. | -| `version` | `string` | La versiĂłn de la API. Esta es la versiĂłn de tu propia aplicaciĂłn, no de OpenAPI. Por ejemplo, `2.5.0`. | +| `version` | `str` | La versiĂłn de la API. Esta es la versiĂłn de tu propia aplicaciĂłn, no de OpenAPI. Por ejemplo, `2.5.0`. | | `terms_of_service` | `str` | Una URL a los TĂ©rminos de Servicio para la API. Si se proporciona, debe ser una URL. | | `contact` | `dict` | La informaciĂłn de contacto para la API expuesta. Puede contener varios campos.
contact fields
ParĂĄmetroTipoDescripciĂłn
namestrEl nombre identificativo de la persona/organizaciĂłn de contacto.
urlstrLa URL que apunta a la informaciĂłn de contacto. DEBE tener el formato de una URL.
emailstrLa direcciĂłn de correo electrĂłnico de la persona/organizaciĂłn de contacto. DEBE tener el formato de una direcciĂłn de correo.
| | `license_info` | `dict` | La informaciĂłn de la licencia para la API expuesta. Puede contener varios campos.
license_info fields
ParĂĄmetroTipoDescripciĂłn
namestrREQUERIDO (si se establece un license_info). El nombre de la licencia utilizada para la API.
identifierstrUna expresiĂłn de licencia [SPDX](https://spdx.org/licenses/) para la API. El campo identifier es mutuamente excluyente del campo url. Disponible desde OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrUna URL a la licencia utilizada para la API. DEBE tener el formato de una URL.
| @@ -104,7 +104,7 @@ Por ejemplo, para configurarlo para que se sirva en `/api/v1/openapi.json`: Si quieres deshabilitar el esquema OpenAPI completamente, puedes establecer `openapi_url=None`, eso tambiĂ©n deshabilitarĂĄ las interfaces de usuario de documentaciĂłn que lo usan. -## URLs de Docs { #docs-urls } +## URLs de documentaciĂłn { #docs-urls } Puedes configurar las dos interfaces de usuario de documentaciĂłn incluidas: diff --git a/docs/es/docs/tutorial/path-operation-configuration.md b/docs/es/docs/tutorial/path-operation-configuration.md index 30dc9c19f..7331b0f3a 100644 --- a/docs/es/docs/tutorial/path-operation-configuration.md +++ b/docs/es/docs/tutorial/path-operation-configuration.md @@ -56,7 +56,7 @@ Puedes añadir un `summary` y `description`: ## DescripciĂłn desde docstring { #description-from-docstring } -Como las descripciones tienden a ser largas y cubrir mĂșltiples lĂ­neas, puedes declarar la descripciĂłn de la *path operation* en la docstring de la funciĂłn y **FastAPI** la leerĂĄ desde allĂ­. +Como las descripciones tienden a ser largas y cubrir mĂșltiples lĂ­neas, puedes declarar la descripciĂłn de la *path operation* en la docstring de la funciĂłn y **FastAPI** la leerĂĄ desde allĂ­. Puedes escribir [Markdown](https://en.wikipedia.org/wiki/Markdown) en el docstring, se interpretarĂĄ y mostrarĂĄ correctamente (teniendo en cuenta la indentaciĂłn del docstring). @@ -90,11 +90,11 @@ Entonces, si no proporcionas una, **FastAPI** generarĂĄ automĂĄticamente una de ## Deprecar una *path operation* { #deprecate-a-path-operation } -Si necesitas marcar una *path operation* como deprecated, pero sin eliminarla, pasa el parĂĄmetro `deprecated`: +Si necesitas marcar una *path operation* como obsoleta, pero sin eliminarla, pasa el parĂĄmetro `deprecated`: {* ../../docs_src/path_operation_configuration/tutorial006_py310.py hl[16] *} -Se marcarĂĄ claramente como deprecado en la documentaciĂłn interactiva: +Se marcarĂĄ claramente como deprecated en la documentaciĂłn interactiva: diff --git a/docs/es/docs/tutorial/query-params-str-validations.md b/docs/es/docs/tutorial/query-params-str-validations.md index 01c2e4051..fab02dd35 100644 --- a/docs/es/docs/tutorial/query-params-str-validations.md +++ b/docs/es/docs/tutorial/query-params-str-validations.md @@ -18,7 +18,7 @@ Tener `str | None` permitirĂĄ que tu editor te dĂ© un mejor soporte y detecte er ## Validaciones adicionales { #additional-validation } -Vamos a hacer que, aunque `q` sea opcional, siempre que se proporcione, su longitud no exceda los 50 caracteres. +Vamos a hacer que, aunque `q` sea opcional, siempre que se proporcione, **su longitud no exceda los 50 caracteres**. ### Importar `Query` y `Annotated` { #import-query-and-annotated } @@ -69,7 +69,7 @@ Ahora que tenemos este `Annotated` donde podemos poner mĂĄs informaciĂłn (en est Nota que el valor por defecto sigue siendo `None`, por lo que el parĂĄmetro sigue siendo opcional. -Pero ahora, al tener `Query(max_length=50)` dentro de `Annotated`, le estamos diciendo a FastAPI que queremos que tenga validaciĂłn adicional para este valor, queremos que tenga un mĂĄximo de 50 caracteres. 😎 +Pero ahora, al tener `Query(max_length=50)` dentro de `Annotated`, le estamos diciendo a FastAPI que queremos que tenga **validaciĂłn adicional** para este valor, queremos que tenga un mĂĄximo de 50 caracteres. 😎 /// tip | Consejo @@ -79,9 +79,9 @@ AquĂ­ estamos usando `Query()` porque este es un **parĂĄmetro de query**. MĂĄs a FastAPI ahora: -* ValidarĂĄ los datos asegurĂĄndose de que la longitud mĂĄxima sea de 50 caracteres -* MostrarĂĄ un error claro para el cliente cuando los datos no sean vĂĄlidos -* DocumentarĂĄ el parĂĄmetro en el OpenAPI esquema *path operation* (asĂ­ aparecerĂĄ en la UI de documentaciĂłn automĂĄtica) +* **ValidarĂĄ** los datos asegurĂĄndose de que la longitud mĂĄxima sea de 50 caracteres +* MostrarĂĄ un **error claro** para el cliente cuando los datos no sean vĂĄlidos +* **DocumentarĂĄ** el parĂĄmetro en el esquema de OpenAPI *path operation* (asĂ­ aparecerĂĄ en la **UI de documentaciĂłn automĂĄtica**) ## Alternativa (antigua): `Query` como valor por defecto { #alternative-old-query-as-the-default-value } @@ -120,7 +120,7 @@ Luego, podemos pasar mĂĄs parĂĄmetros a `Query`. En este caso, el parĂĄmetro `ma q: str | None = Query(default=None, max_length=50) ``` -Esto validarĂĄ los datos, mostrarĂĄ un error claro cuando los datos no sean vĂĄlidos, y documentarĂĄ el parĂĄmetro en el esquema del *path operation* de OpenAPI. +Esto validarĂĄ los datos, mostrarĂĄ un error claro cuando los datos no sean vĂĄlidos, y documentarĂĄ el parĂĄmetro en el esquema de OpenAPI *path operation*. ### `Query` como valor por defecto o en `Annotated` { #query-as-the-default-value-or-in-annotated } @@ -150,13 +150,13 @@ q: str = Query(default="rick") ### Ventajas de `Annotated` { #advantages-of-annotated } -Usar `Annotated` es recomendado en lugar del valor por defecto en los parĂĄmetros de funciĂłn, es mejor por mĂșltiples razones. đŸ€“ +**Usar `Annotated` es recomendado** en lugar del valor por defecto en los parĂĄmetros de funciĂłn, es **mejor** por mĂșltiples razones. đŸ€“ -El valor por defecto del parĂĄmetro de funciĂłn es el valor real por defecto, eso es mĂĄs intuitivo con Python en general. 😌 +El valor **por defecto** del **parĂĄmetro de funciĂłn** es el **valor real por defecto**, eso es mĂĄs intuitivo con Python en general. 😌 -PodrĂ­as llamar a esa misma funciĂłn en otros lugares sin FastAPI, y funcionarĂ­a como se espera. Si hay un parĂĄmetro requerido (sin un valor por defecto), tu editor te avisarĂĄ con un error, Python tambiĂ©n se quejarĂĄ si lo ejecutas sin pasar el parĂĄmetro requerido. +PodrĂ­as **llamar** a esa misma funciĂłn en **otros lugares** sin FastAPI, y **funcionarĂ­a como se espera**. Si hay un parĂĄmetro **requerido** (sin un valor por defecto), tu **editor** te avisarĂĄ con un error, **Python** tambiĂ©n se quejarĂĄ si lo ejecutas sin pasar el parĂĄmetro requerido. -Cuando no usas `Annotated` y en su lugar usas el estilo de valor por defecto (antiguo), si llamas a esa funciĂłn sin FastAPI en otros lugares, tienes que recordar pasar los argumentos a la funciĂłn para que funcione correctamente, de lo contrario, los valores serĂĄn diferentes de lo que esperas (por ejemplo, `QueryInfo` o algo similar en lugar de `str`). Y tu editor no se quejarĂĄ, y Python no se quejarĂĄ al ejecutar esa funciĂłn, solo cuando los errores dentro de las operaciones hagan que funcione incorrectamente. +Cuando no usas `Annotated` y en su lugar usas el **estilo de valor por defecto (antiguo)**, si llamas a esa funciĂłn sin FastAPI en **otros lugares**, tienes que **recordar** pasar los argumentos a la funciĂłn para que funcione correctamente, de lo contrario, los valores serĂĄn diferentes de lo que esperas (por ejemplo, `QueryInfo` o algo similar en lugar de `str`). Y tu editor no se quejarĂĄ, y Python no se quejarĂĄ al ejecutar esa funciĂłn, solo cuando las operaciones internas generen errores. Dado que `Annotated` puede tener mĂĄs de una anotaciĂłn de metadato, ahora podrĂ­as incluso usar la misma funciĂłn con otras herramientas, como [Typer](https://typer.tiangolo.com/). 🚀 @@ -172,13 +172,13 @@ Puedes definir una ISBN o con `imdb-` para un ID de URL de pelĂ­cula de IMDB: +Por ejemplo, este validador personalizado revisa que el ID del Ă­tem empiece con `isbn-` para un nĂșmero de libro ISBN o con `imdb-` para un ID de URL de pelĂ­cula de IMDB: {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *} @@ -390,15 +390,15 @@ Esto estĂĄ disponible con Pydantic versiĂłn 2 o superior. 😎 /// tip | Consejo -Si necesitas hacer cualquier tipo de validaciĂłn que requiera comunicarte con algĂșn componente externo, como una base de datos u otra API, deberĂ­as usar Dependencias de FastAPI, las aprenderĂĄs mĂĄs adelante. +Si necesitas hacer cualquier tipo de validaciĂłn que requiera comunicarte con algĂșn **componente externo**, como una base de datos u otra API, deberĂ­as usar **Dependencias de FastAPI**, las aprenderĂĄs mĂĄs adelante. -Estos validadores personalizados son para cosas que pueden comprobarse solo con los mismos datos provistos en el request. +Estos validadores personalizados son para cosas que pueden revisarse **solo** con los **mismos datos** provistos en el request. /// ### Entiende ese cĂłdigo { #understand-that-code } -El punto importante es solo usar `AfterValidator` con una funciĂłn dentro de `Annotated`. Si quieres, sĂĄltate esta parte. đŸ€ž +El punto importante es solo usar **`AfterValidator` con una funciĂłn dentro de `Annotated`**. Si quieres, sĂĄltate esta parte. đŸ€ž --- @@ -406,7 +406,7 @@ Pero si te da curiosidad este ejemplo de cĂłdigo especĂ­fico y sigues entretenid #### String con `value.startswith()` { #string-with-value-startswith } -ÂżLo notaste? un string usando `value.startswith()` puede recibir una tupla, y comprobarĂĄ cada valor en la tupla: +ÂżLo notaste? Un string usando `value.startswith()` puede recibir una tupla, y revisarĂĄ cada valor en la tupla: {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *} @@ -416,13 +416,13 @@ Con `data.items()` obtenemos un `) envĂ­an los datos al /// note | Detalles TĂ©cnicos -Los datos de los forms normalmente se codifican usando el "media type" `application/x-www-form-urlencoded` cuando no incluyen archivos. +Los datos de los formularios normalmente se codifican usando el "media type" `application/x-www-form-urlencoded` cuando no incluyen archivos. Pero cuando el formulario incluye archivos, se codifica como `multipart/form-data`. Si usas `File`, **FastAPI** sabrĂĄ que tiene que obtener los archivos de la parte correcta del cuerpo. diff --git a/docs/es/docs/tutorial/request-forms.md b/docs/es/docs/tutorial/request-forms.md index 60722a261..640e02282 100644 --- a/docs/es/docs/tutorial/request-forms.md +++ b/docs/es/docs/tutorial/request-forms.md @@ -14,13 +14,13 @@ $ pip install python-multipart /// -## Importar `Form` { #import-form } +## Importa `Form` { #import-form } -Importar `Form` desde `fastapi`: +Importa `Form` desde `fastapi`: {* ../../docs_src/request_forms/tutorial001_an_py310.py hl[3] *} -## Definir parĂĄmetros de `Form` { #define-form-parameters } +## Define parĂĄmetros de `Form` { #define-form-parameters } Crea parĂĄmetros de formulario de la misma manera que lo harĂ­as para `Body` o `Query`: diff --git a/docs/es/docs/tutorial/response-status-code.md b/docs/es/docs/tutorial/response-status-code.md index 4b9f0e234..2e0b88c5d 100644 --- a/docs/es/docs/tutorial/response-status-code.md +++ b/docs/es/docs/tutorial/response-status-code.md @@ -1,5 +1,6 @@ # CĂłdigo de Estado del Response { #response-status-code } + De la misma manera que puedes especificar un modelo de response, tambiĂ©n puedes declarar el cĂłdigo de estado HTTP usado para el response con el parĂĄmetro `status_code` en cualquiera de las *path operations*: * `@app.get()` diff --git a/docs/es/docs/tutorial/schema-extra-example.md b/docs/es/docs/tutorial/schema-extra-example.md index fba7215ef..310697d0b 100644 --- a/docs/es/docs/tutorial/schema-extra-example.md +++ b/docs/es/docs/tutorial/schema-extra-example.md @@ -1,4 +1,4 @@ -# Declarar Datos de Ejemplo de Request { #declare-request-example-data } +# Declara Datos de Ejemplo de Request { #declare-request-example-data } Puedes declarar ejemplos de los datos que tu aplicaciĂłn puede recibir. diff --git a/docs/es/docs/tutorial/security/first-steps.md b/docs/es/docs/tutorial/security/first-steps.md index e4755f951..a8df7e9a5 100644 --- a/docs/es/docs/tutorial/security/first-steps.md +++ b/docs/es/docs/tutorial/security/first-steps.md @@ -146,7 +146,7 @@ Usar una URL relativa es importante para asegurarse de que tu aplicaciĂłn siga f Este parĂĄmetro no crea ese endpoint / *path operation*, pero declara que la URL `/token` serĂĄ la que el cliente deberĂĄ usar para obtener el token. Esa informaciĂłn se usa en OpenAPI, y luego en los sistemas de documentaciĂłn interactiva del API. -Pronto tambiĂ©n crearemos la verdadera *path operation*. +Pronto tambiĂ©n crearemos la path operation real. /// note | Nota @@ -174,13 +174,13 @@ Ahora puedes pasar ese `oauth2_scheme` en una dependencia con `Depends`. Esta dependencia proporcionarĂĄ un `str` que se asigna al parĂĄmetro `token` de la *path operation function*. -**FastAPI** sabrĂĄ que puede usar esta dependencia para definir un "security scheme" en el esquema OpenAPI (y en los docs automĂĄticos del API). +**FastAPI** sabrĂĄ que puede usar esta dependencia para definir un "security scheme" en el esquema OpenAPI (y en la documentaciĂłn automĂĄtica de la API). /// note | Detalles tĂ©cnicos **FastAPI** sabrĂĄ que puede usar la clase `OAuth2PasswordBearer` (declarada en una dependencia) para definir el esquema de seguridad en OpenAPI porque hereda de `fastapi.security.oauth2.OAuth2`, que a su vez hereda de `fastapi.security.base.SecurityBase`. -Todas las utilidades de seguridad que se integran con OpenAPI (y los docs automĂĄticos del API) heredan de `SecurityBase`, asĂ­ es como **FastAPI** puede saber cĂłmo integrarlas en OpenAPI. +Todas las utilidades de seguridad que se integran con OpenAPI (y la documentaciĂłn automĂĄtica de la API) heredan de `SecurityBase`, asĂ­ es como **FastAPI** puede saber cĂłmo integrarlas en OpenAPI. /// diff --git a/docs/es/docs/tutorial/security/get-current-user.md b/docs/es/docs/tutorial/security/get-current-user.md index fd331f68e..a47cfb0bc 100644 --- a/docs/es/docs/tutorial/security/get-current-user.md +++ b/docs/es/docs/tutorial/security/get-current-user.md @@ -4,7 +4,9 @@ En el capĂ­tulo anterior, el sistema de seguridad (que se basa en el sistema de {* ../../docs_src/security/tutorial001_an_py310.py hl[12] *} -Pero eso aĂșn no es tan Ăștil. Vamos a hacer que nos dĂ© el usuario actual. +Pero eso aĂșn no es tan Ăștil. + +Vamos a hacer que nos dĂ© el usuario actual. ## Crear un modelo de usuario { #create-a-user-model } @@ -12,7 +14,7 @@ Primero, vamos a crear un modelo de usuario con Pydantic. De la misma manera que usamos Pydantic para declarar cuerpos, podemos usarlo en cualquier otra parte: -{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *} +{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *} ## Crear una dependencia `get_current_user` { #create-a-get-current-user-dependency } @@ -66,7 +68,7 @@ Y puedes usar cualquier modelo o datos para los requisitos de seguridad (en este Pero no estĂĄs limitado a usar algĂșn modelo de datos, clase o tipo especĂ­fico. -ÂżQuieres tener un `id` y `email` y no tener un `username` en tu modelo? Claro. Puedes usar estas mismas herramientas. +ÂżQuieres tener un `id` y `email` y no tener ningĂșn `username` en tu modelo? Claro. Puedes usar estas mismas herramientas. ÂżQuieres solo tener un `str`? ÂżO solo un `dict`? ÂżO un instance de clase modelo de base de datos directamente? Todo funciona de la misma manera. diff --git a/docs/es/docs/tutorial/security/oauth2-jwt.md b/docs/es/docs/tutorial/security/oauth2-jwt.md index efd309df9..5b74ffd11 100644 --- a/docs/es/docs/tutorial/security/oauth2-jwt.md +++ b/docs/es/docs/tutorial/security/oauth2-jwt.md @@ -1,5 +1,6 @@ # OAuth2 con Password (y hashing), Bearer con tokens JWT { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens } + Ahora que tenemos todo el flujo de seguridad, hagamos que la aplicaciĂłn sea realmente segura, usando tokens JWT y hashing de contraseñas seguras. Este cĂłdigo es algo que puedes usar realmente en tu aplicaciĂłn, guardar los hashes de las contraseñas en tu base de datos, etc. diff --git a/docs/es/docs/tutorial/security/simple-oauth2.md b/docs/es/docs/tutorial/security/simple-oauth2.md index 2a98fff6c..d3e2bd2cb 100644 --- a/docs/es/docs/tutorial/security/simple-oauth2.md +++ b/docs/es/docs/tutorial/security/simple-oauth2.md @@ -146,7 +146,7 @@ UserInDB( /// note | Nota -Para una explicaciĂłn mĂĄs completa de `**user_dict` revisa en [la documentaciĂłn para **Extra Models**](../extra-models.md#about-user-in-dict). +Para una explicaciĂłn mĂĄs completa de `**user_dict` revisa en [la documentaciĂłn para **Extra Models**](../extra-models.md#about-user-in-model-dump). /// diff --git a/docs/es/docs/tutorial/sql-databases.md b/docs/es/docs/tutorial/sql-databases.md index 7131716ee..3bb3209b2 100644 --- a/docs/es/docs/tutorial/sql-databases.md +++ b/docs/es/docs/tutorial/sql-databases.md @@ -65,7 +65,7 @@ Hay algunas diferencias: * `Field(primary_key=True)` le dice a SQLModel que `id` es la **clave primaria** en la base de datos SQL (puedes aprender mĂĄs sobre claves primarias de SQL en la documentaciĂłn de SQLModel). - Nota: Usamos `int | None` para el campo de clave primaria para que en el cĂłdigo Python podamos *crear un objeto sin un `id`* (`id=None`), asumiendo que la base de datos lo *generarĂĄ al guardar*. SQLModel entiende que la base de datos proporcionarĂĄ el `id` y *define la columna como un `INTEGER` no nulo* en el esquema de la base de datos. Consulta la [documentaciĂłn de SQLModel sobre claves primarias](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) para mĂĄs detalles. + **Nota:** Usamos `int | None` para el campo de clave primaria para que en el cĂłdigo Python podamos *crear un objeto sin un `id`* (`id=None`), asumiendo que la base de datos lo *generarĂĄ al guardar*. SQLModel entiende que la base de datos proporcionarĂĄ el `id` y *define la columna como un `INTEGER` no nulo* en el esquema de la base de datos. Consulta la [documentaciĂłn de SQLModel sobre claves primarias](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) para mĂĄs detalles. * `Field(index=True)` le dice a SQLModel que debe crear un **Ă­ndice SQL** para esta columna, lo que permitirĂĄ bĂșsquedas mĂĄs rĂĄpidas en la base de datos cuando se lean datos filtrados por esta columna. @@ -181,7 +181,7 @@ Arreglaremos estas cosas añadiendo unos **modelos extra**. AquĂ­ es donde SQLMo En **SQLModel**, cualquier clase de modelo que tenga `table=True` es un **modelo de tabla**. -Y cualquier clase de modelo que no tenga `table=True` es un **modelo de datos**, estos son en realidad solo modelos de Pydantic (con un par de caracterĂ­sticas extra pequeñas). đŸ€“ +Y cualquier clase de modelo que no tenga `table=True` es un **modelo de datos**, estos son en realidad solo modelos de Pydantic (con un par de pequeñas funcionalidades extra). đŸ€“ Con SQLModel, podemos usar **herencia** para **evitar duplicar** todos los campos en todos los casos. @@ -296,7 +296,7 @@ Ahora usamos `response_model=HeroPublic` en lugar de la **anotaciĂłn de tipo de Si hubiĂ©ramos declarado `-> HeroPublic`, tu editor y linter se quejarĂ­an (con razĂłn) de que estĂĄs devolviendo un `Hero` en lugar de un `HeroPublic`. -Al declararlo en `response_model` le estamos diciendo a **FastAPI** que haga lo suyo, sin interferir con las anotaciones de tipo y la ayuda de tu editor y otras herramientas. +Al declararlo en `response_model` le estamos diciendo a **FastAPI** que haga lo suyo, sin interferir con las anotaciones de tipos y la ayuda de tu editor y otras herramientas. /// diff --git a/docs/es/docs/tutorial/static-files.md b/docs/es/docs/tutorial/static-files.md index b99ed5f9c..177be6302 100644 --- a/docs/es/docs/tutorial/static-files.md +++ b/docs/es/docs/tutorial/static-files.md @@ -2,6 +2,14 @@ Puedes servir archivos estĂĄticos automĂĄticamente desde un directorio utilizando `StaticFiles`. +/// tip | Consejo + +Si necesitas alojar un frontend, usa `app.frontend()` en su lugar, lee sobre ello en [Frontend](frontend.md). + +`app.frontend()` usa `StaticFiles` por debajo, con varias ventajas adicionales para frontends, como manejar el routing del lado del cliente. + +/// + ## Usa `StaticFiles` { #use-staticfiles } * Importa `StaticFiles`. diff --git a/docs/es/docs/tutorial/testing.md b/docs/es/docs/tutorial/testing.md index 9612b6cba..9c4ff69b8 100644 --- a/docs/es/docs/tutorial/testing.md +++ b/docs/es/docs/tutorial/testing.md @@ -28,7 +28,7 @@ Crea funciones con un nombre que comience con `test_` (esta es la convenciĂłn es Usa el objeto `TestClient` de la misma manera que con `httpx`. -Escribe declaraciones `assert` simples con las expresiones estĂĄndar de Python que necesites revisar (otra vez, estĂĄndar de `pytest`). +Escribe statements `assert` simples con las expresiones estĂĄndar de Python que necesites revisar (otra vez, estĂĄndar de `pytest`). {* ../../docs_src/app_testing/tutorial001_py310.py hl[2,12,15:18] *} @@ -90,7 +90,7 @@ Entonces podrĂ­as tener un archivo `test_main.py` con tus pruebas. PodrĂ­a estar │   └── test_main.py ``` -Debido a que este archivo estĂĄ en el mismo paquete, puedes usar importaciones relativas para importar el objeto `app` desde el mĂłdulo `main` (`main.py`): +Debido a que este archivo estĂĄ en el mismo paquete, puedes usar imports relativos para importar el objeto `app` desde el mĂłdulo `main` (`main.py`): {* ../../docs_src/app_testing/app_a_py310/test_main.py hl[3] *} diff --git a/docs/es/docs/virtual-environments.md b/docs/es/docs/virtual-environments.md index 1679fd02b..92cb83ba2 100644 --- a/docs/es/docs/virtual-environments.md +++ b/docs/es/docs/virtual-environments.md @@ -288,8 +288,8 @@ $ echo "*" > .venv/.gitignore /// details | QuĂ© significa ese comando -* `echo "*"`: "imprimirĂĄ" el texto `*` en el terminal (la siguiente parte cambia eso un poco) -* `>`: cualquier cosa impresa en el terminal por el comando a la izquierda de `>` no deberĂ­a imprimirse, sino escribirse en el archivo que va a la derecha de `>` +* `echo "*"`: "imprimirĂĄ" el texto `*` en la terminal (la siguiente parte cambia eso un poco) +* `>`: cualquier cosa impresa en la terminal por el comando a la izquierda de `>` no deberĂ­a imprimirse, sino escribirse en el archivo que va a la derecha de `>` * `.gitignore`: el nombre del archivo donde deberĂ­a escribirse el texto Y `*` para Git significa "todo". AsĂ­ que, ignorarĂĄ todo en el directorio `.venv`. @@ -443,6 +443,8 @@ De esta manera, cuando ejecutes `python` no intentarĂĄ ejecutarse desde ese ento Ahora estĂĄs listo para empezar a trabajar en tu proyecto. + + /// tip | Consejo ÂżQuieres entender todo lo anterior? @@ -694,7 +696,7 @@ Eso significa que el sistema ahora comenzarĂĄ a buscar primero los programas en: antes de buscar en los otros directorios. -AsĂ­ que, cuando escribas `python` en el terminal, el sistema encontrarĂĄ el programa Python en +AsĂ­ que, cuando escribas `python` en la terminal, el sistema encontrarĂĄ el programa Python en ```plaintext /home/user/code/awesome-project/.venv/bin/python @@ -718,7 +720,7 @@ C:\Users\user\code\awesome-project\.venv\Scripts antes de buscar en los otros directorios. -AsĂ­ que, cuando escribas `python` en el terminal, el sistema encontrarĂĄ el programa Python en +AsĂ­ que, cuando escribas `python` en la terminal, el sistema encontrarĂĄ el programa Python en ```plaintext C:\Users\user\code\awesome-project\.venv\Scripts\python @@ -800,7 +802,7 @@ $ cd ~/code/prisoner-of-azkaban
-Si no desactivas el entorno virtual para `philosophers-stone`, cuando ejecutes `python` en el terminal, intentarĂĄ usar el Python de `philosophers-stone`. +Si no desactivas el entorno virtual para `philosophers-stone`, cuando ejecutes `python` en la terminal, intentarĂĄ usar el Python de `philosophers-stone`.
From e23813a9b537672a882b589290ca128c0a55c95d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 13:50:58 +0000 Subject: [PATCH 280/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 548310c7d..9d6eacc89 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for es (update-outdated). PR [#15892](https://github.com/fastapi/fastapi/pull/15892) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for tr (update-outdated). PR [#15891](https://github.com/fastapi/fastapi/pull/15891) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for pt (update-outdated). PR [#15893](https://github.com/fastapi/fastapi/pull/15893) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for zh (update-outdated). PR [#15898](https://github.com/fastapi/fastapi/pull/15898) by [@tiangolo](https://github.com/tiangolo). From 512a3e7825dc7f9c4e08c350851d06ab005b18cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 15:57:35 +0200 Subject: [PATCH 281/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20de=20(update-outdated)=20(#15899)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] Co-authored-by: Yurii Motov --- docs/de/docs/_llm-test.md | 18 ++--- .../docs/advanced/additional-status-codes.md | 1 + .../de/docs/advanced/advanced-dependencies.md | 1 + docs/de/docs/advanced/dataclasses.md | 1 + docs/de/docs/advanced/events.md | 6 +- docs/de/docs/advanced/generate-clients.md | 14 ---- docs/de/docs/advanced/json-base64-bytes.md | 2 +- docs/de/docs/advanced/openapi-callbacks.md | 10 +-- .../advanced/response-change-status-code.md | 1 + docs/de/docs/advanced/response-cookies.md | 1 + docs/de/docs/advanced/response-headers.md | 2 +- .../docs/advanced/security/oauth2-scopes.md | 6 +- docs/de/docs/advanced/settings.md | 20 +++--- docs/de/docs/advanced/stream-data.md | 8 +-- docs/de/docs/advanced/wsgi.md | 1 + docs/de/docs/alternatives.md | 10 +-- docs/de/docs/async.md | 6 +- docs/de/docs/deployment/cloud.md | 2 +- docs/de/docs/deployment/concepts.md | 20 +++--- docs/de/docs/deployment/docker.md | 32 ++++----- docs/de/docs/deployment/https.md | 6 +- docs/de/docs/deployment/manually.md | 6 +- docs/de/docs/editor-support.md | 14 ++-- docs/de/docs/environment-variables.md | 8 +-- docs/de/docs/features.md | 68 +++++++++---------- docs/de/docs/help-fastapi.md | 1 + docs/de/docs/how-to/configure-swagger-ui.md | 2 +- .../docs/how-to/custom-request-and-route.md | 1 + docs/de/docs/how-to/graphql.md | 1 + ...migrate-from-pydantic-v1-to-pydantic-v2.md | 18 +++++ .../docs/how-to/separate-openapi-schemas.md | 1 + docs/de/docs/index.md | 2 +- docs/de/docs/project-generation.md | 2 +- docs/de/docs/python-types.md | 26 +++---- docs/de/docs/tutorial/bigger-applications.md | 20 +++--- docs/de/docs/tutorial/body-nested-models.md | 55 +++++++-------- docs/de/docs/tutorial/body.md | 13 ++-- docs/de/docs/tutorial/debugging.md | 2 +- .../dependencies/dependencies-with-yield.md | 12 ++-- docs/de/docs/tutorial/extra-data-types.md | 1 + docs/de/docs/tutorial/extra-models.md | 6 +- docs/de/docs/tutorial/first-steps.md | 14 ++-- docs/de/docs/tutorial/handling-errors.md | 20 +++--- docs/de/docs/tutorial/index.md | 1 + docs/de/docs/tutorial/metadata.md | 2 +- .../tutorial/path-operation-configuration.md | 8 +-- .../tutorial/query-params-str-validations.md | 18 ++--- docs/de/docs/tutorial/query-params.md | 19 +++--- docs/de/docs/tutorial/request-files.md | 30 ++++---- docs/de/docs/tutorial/request-forms.md | 1 + docs/de/docs/tutorial/response-status-code.md | 1 + docs/de/docs/tutorial/schema-extra-example.md | 8 +-- docs/de/docs/tutorial/security/first-steps.md | 1 + .../tutorial/security/get-current-user.md | 2 +- docs/de/docs/tutorial/security/oauth2-jwt.md | 4 +- .../docs/tutorial/security/simple-oauth2.md | 12 ++-- docs/de/docs/tutorial/sql-databases.md | 6 +- docs/de/docs/tutorial/static-files.md | 8 +++ docs/de/docs/tutorial/testing.md | 8 +-- docs/de/docs/virtual-environments.md | 12 ++-- 60 files changed, 318 insertions(+), 284 deletions(-) diff --git a/docs/de/docs/_llm-test.md b/docs/de/docs/_llm-test.md index 81e8e25f5..3fec41817 100644 --- a/docs/de/docs/_llm-test.md +++ b/docs/de/docs/_llm-test.md @@ -1,17 +1,17 @@ # LLM-Testdatei { #llm-test-file } -Dieses Dokument testet, ob das LLM, das die Dokumentation ĂŒbersetzt, den `general_prompt` in `scripts/translate.py` und den sprachspezifischen Prompt in `docs/{language code}/llm-prompt.md` versteht. Der sprachsspezifische Prompt wird an `general_prompt` angehĂ€ngt. +Dieses Dokument testet, ob das LLM, das die Dokumentation ĂŒbersetzt, den `general_prompt` in `scripts/translate.py` und den sprachspezifischen Prompt in `docs/{language code}/llm-prompt.md` versteht. Der sprachspezifische Prompt wird an `general_prompt` angehĂ€ngt. -Hier hinzugefĂŒgte Tests werden von allen Erstellern sprachsspezifischer Prompts gesehen. +Hier hinzugefĂŒgte Tests werden von allen Erstellern sprachspezifischer Prompts gesehen. So verwenden: -* Einen sprachsspezifischen Prompt haben – `docs/{language code}/llm-prompt.md`. +* Einen sprachspezifischen Prompt haben – `docs/{language code}/llm-prompt.md`. * Eine frische Übersetzung dieses Dokuments in die gewĂŒnschte Zielsprache durchfĂŒhren (siehe z. B. das Kommando `translate-page` der `translate.py`). Dadurch wird die Übersetzung unter `docs/{language code}/docs/_llm-test.md` erstellt. * PrĂŒfen Sie, ob in der Übersetzung alles in Ordnung ist. -* Verbessern Sie bei Bedarf Ihren sprachsspezifischen Prompt, den allgemeinen Prompt oder das englische Dokument. +* Verbessern Sie bei Bedarf Ihren sprachspezifischen Prompt, den allgemeinen Prompt oder das englische Dokument. * Beheben Sie anschließend manuell die verbleibenden Probleme in der Übersetzung, sodass es eine gute Übersetzung ist. -* Übersetzen Sie erneut, nachdem die gute Übersetzung vorliegt. Das ideale Ergebnis wĂ€re, dass das LLM an der Übersetzung keine Änderungen mehr vornimmt. Das bedeutet, dass der allgemeine Prompt und Ihr sprachsspezifischer Prompt so gut sind, wie sie sein können (Es wird manchmal ein paar scheinbar zufĂ€llige Änderungen machen, der Grund ist, dass [LLMs keine deterministischen Algorithmen sind](https://doublespeak.chat/#/handbook#deterministic-output)). +* Übersetzen Sie erneut, nachdem die gute Übersetzung vorliegt. Das ideale Ergebnis wĂ€re, dass das LLM an der Übersetzung keine Änderungen mehr vornimmt. Das bedeutet, dass der allgemeine Prompt und Ihr sprachspezifischer Prompt so gut sind, wie sie sein können (Es wird manchmal ein paar scheinbar zufĂ€llige Änderungen machen, der Grund ist, dass [LLMs keine deterministischen Algorithmen sind](https://doublespeak.chat/#/handbook#deterministic-output)). Die Tests: @@ -211,7 +211,7 @@ Siehe Abschnitt `### HTML abbr elements` im allgemeinen Prompt in `scripts/trans //// -## HTML „dfn“-Elemente { #html-dfn-elements } +## HTML-„dfn“-Elemente { #html-dfn-elements } * Cluster * Deep Learning @@ -240,7 +240,7 @@ Die einzige strenge Regel fĂŒr Überschriften ist, dass das LLM den Hash-Teil in Siehe Abschnitt `### Headings` im allgemeinen Prompt in `scripts/translate.py`. -FĂŒr einige sprachsspezifische Anweisungen, siehe z. B. den Abschnitt `### Headings` in `docs/de/llm-prompt.md`. +FĂŒr einige sprachspezifische Anweisungen, siehe z. B. den Abschnitt `### Headings` in `docs/de/llm-prompt.md`. //// @@ -363,12 +363,12 @@ FĂŒr einige sprachsspezifische Anweisungen, siehe z. B. den Abschnitt `### Headi * die Umgebungsvariable * die Umgebungsvariable * der `PATH` -* die `PATH`-Umgebungsvariable +* die `PATH`-Variable * die Authentifizierung * der Authentifizierungsanbieter * die Autorisierung -* das Anmeldeformular +* das Autorisierungsformular * der Autorisierungsanbieter * der Benutzer authentisiert sich * das System authentifiziert den Benutzer diff --git a/docs/de/docs/advanced/additional-status-codes.md b/docs/de/docs/advanced/additional-status-codes.md index f1a74a32c..6f0114cc1 100644 --- a/docs/de/docs/advanced/additional-status-codes.md +++ b/docs/de/docs/advanced/additional-status-codes.md @@ -1,5 +1,6 @@ # ZusĂ€tzliche Statuscodes { #additional-status-codes } + StandardmĂ€ĂŸig liefert **FastAPI** die Responses als `JSONResponse` zurĂŒck und fĂŒgt den Inhalt, den Sie aus Ihrer *Pfadoperation* zurĂŒckgeben, in diese `JSONResponse` ein. Es wird der Default-Statuscode oder derjenige verwendet, den Sie in Ihrer *Pfadoperation* festgelegt haben. diff --git a/docs/de/docs/advanced/advanced-dependencies.md b/docs/de/docs/advanced/advanced-dependencies.md index 580a9a874..da06794a9 100644 --- a/docs/de/docs/advanced/advanced-dependencies.md +++ b/docs/de/docs/advanced/advanced-dependencies.md @@ -1,5 +1,6 @@ # Fortgeschrittene AbhĂ€ngigkeiten { #advanced-dependencies } + ## Parametrisierte AbhĂ€ngigkeiten { #parameterized-dependencies } Alle AbhĂ€ngigkeiten, die wir bisher gesehen haben, waren festgelegte Funktionen oder Klassen. diff --git a/docs/de/docs/advanced/dataclasses.md b/docs/de/docs/advanced/dataclasses.md index ed8f13e72..bacf9d162 100644 --- a/docs/de/docs/advanced/dataclasses.md +++ b/docs/de/docs/advanced/dataclasses.md @@ -1,5 +1,6 @@ # Datenklassen verwenden { #using-dataclasses } + FastAPI basiert auf **Pydantic**, und ich habe Ihnen gezeigt, wie Sie Pydantic-Modelle verwenden können, um Requests und Responses zu deklarieren. Aber FastAPI unterstĂŒtzt auf die gleiche Weise auch die Verwendung von [`dataclasses`](https://docs.python.org/3/library/dataclasses.html): diff --git a/docs/de/docs/advanced/events.md b/docs/de/docs/advanced/events.md index 7e2def32d..6efe96809 100644 --- a/docs/de/docs/advanced/events.md +++ b/docs/de/docs/advanced/events.md @@ -102,7 +102,7 @@ Diese Funktionen können mit `async def` oder normalem `def` deklariert werden. ### `startup`-Event { #startup-event } -Um eine Funktion hinzuzufĂŒgen, die vor dem Start der Anwendung ausgefĂŒhrt werden soll, deklarieren Sie diese mit dem Event `startup`: +Um eine Funktion hinzuzufĂŒgen, die vor dem Start der Anwendung ausgefĂŒhrt werden soll, deklarieren Sie diese mit dem Event `"startup"`: {* ../../docs_src/events/tutorial001_py310.py hl[8] *} @@ -114,7 +114,7 @@ Und Ihre Anwendung empfĂ€ngt erst dann Requests, wenn alle `startup`-Eventhandle ### `shutdown`-Event { #shutdown-event } -Um eine Funktion hinzuzufĂŒgen, die beim Shutdown der Anwendung ausgefĂŒhrt werden soll, deklarieren Sie sie mit dem Event `shutdown`: +Um eine Funktion hinzuzufĂŒgen, die beim Shutdown der Anwendung ausgefĂŒhrt werden soll, deklarieren Sie sie mit dem Event `"shutdown"`: {* ../../docs_src/events/tutorial002_py310.py hl[6] *} @@ -150,7 +150,7 @@ Aus diesem Grund wird jetzt empfohlen, stattdessen `lifespan` wie oben erlĂ€uter Nur ein technisches Detail fĂŒr die neugierigen Nerds. đŸ€“ -In der technischen ASGI-Spezifikation ist dies Teil des [Lifespan Protokolls](https://asgi.readthedocs.io/en/latest/specs/lifespan.html) und definiert Events namens `startup` und `shutdown`. +In der technischen ASGI-Spezifikation ist dies Teil des [Lifespan-Protokolls](https://asgi.readthedocs.io/en/latest/specs/lifespan.html) und definiert Events namens `startup` und `shutdown`. /// note | Hinweis diff --git a/docs/de/docs/advanced/generate-clients.md b/docs/de/docs/advanced/generate-clients.md index 7c418226a..d93641bd3 100644 --- a/docs/de/docs/advanced/generate-clients.md +++ b/docs/de/docs/advanced/generate-clients.md @@ -20,20 +20,6 @@ FastAPI generiert automatisch **OpenAPI 3.1**-Spezifikationen, daher muss jedes /// -## SDK-Generatoren von FastAPI-Sponsoren { #sdk-generators-from-fastapi-sponsors } - -Dieser Abschnitt hebt **venture-unterstĂŒtzte** und **firmengestĂŒtzte** Lösungen hervor, die von Unternehmen entwickelt werden, welche FastAPI sponsern. Diese Produkte bieten **zusĂ€tzliche Funktionen** und **Integrationen** zusĂ€tzlich zu hochwertig generierten SDKs. - -Durch das ✹ [**Sponsoring von FastAPI**](../help-fastapi.md#sponsor-the-author) ✹ helfen diese Unternehmen sicherzustellen, dass das Framework und sein **Ökosystem** gesund und **nachhaltig** bleiben. - -Ihr Sponsoring zeigt auch ein starkes Engagement fĂŒr die FastAPI-**Community** (Sie), was bedeutet, dass sie nicht nur einen **großartigen Service** bieten möchten, sondern auch ein **robustes und florierendes Framework**, FastAPI, unterstĂŒtzen möchten. 🙇 - -Zum Beispiel könnten Sie ausprobieren: - -* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) - -Einige dieser Lösungen sind möglicherweise auch Open Source oder bieten kostenlose Tarife an, sodass Sie diese ohne finanzielle Verpflichtung ausprobieren können. Andere kommerzielle SDK-Generatoren sind online verfĂŒgbar und können dort gefunden werden. đŸ€“ - ## Ein TypeScript-SDK erstellen { #create-a-typescript-sdk } Beginnen wir mit einer einfachen FastAPI-Anwendung: diff --git a/docs/de/docs/advanced/json-base64-bytes.md b/docs/de/docs/advanced/json-base64-bytes.md index 26c7e7089..618bbd1a9 100644 --- a/docs/de/docs/advanced/json-base64-bytes.md +++ b/docs/de/docs/advanced/json-base64-bytes.md @@ -4,7 +4,7 @@ Wenn Ihre App JSON-Daten empfangen und senden muss, Sie darin aber BinĂ€rdaten e ## Base64 vs Dateien { #base64-vs-files } -PrĂŒfen Sie zunĂ€chst, ob Sie [Request Files](../tutorial/request-files.md) zum Hochladen von BinĂ€rdaten und [Benutzerdefinierte Response – FileResponse](./custom-response.md#fileresponse--fileresponse-) zum Senden von BinĂ€rdaten verwenden können, anstatt sie in JSON zu kodieren. +PrĂŒfen Sie zunĂ€chst, ob Sie [Requestdateien](../tutorial/request-files.md) zum Hochladen von BinĂ€rdaten und [Benutzerdefinierte Response – FileResponse](./custom-response.md#fileresponse) zum Senden von BinĂ€rdaten verwenden können, anstatt sie in JSON zu kodieren. JSON kann nur UTF-8-kodierte Strings enthalten, es kann daher keine rohen Bytes enthalten. diff --git a/docs/de/docs/advanced/openapi-callbacks.md b/docs/de/docs/advanced/openapi-callbacks.md index 989f8a1b0..b5d49c7e8 100644 --- a/docs/de/docs/advanced/openapi-callbacks.md +++ b/docs/de/docs/advanced/openapi-callbacks.md @@ -12,7 +12,7 @@ Sehen wir uns das alles anhand eines Beispiels an. Stellen Sie sich vor, Sie entwickeln eine Anwendung, mit der Sie Rechnungen erstellen können. -Diese Rechnungen haben eine `id`, einen optionalen `title`, einen `customer` (Kunde) und ein `total` (Gesamtsumme). +Diese Rechnungen haben eine `id`, einen `title` (optional), einen `customer` und ein `total`. Der Benutzer Ihrer API (ein externer Entwickler) erstellt mit einem POST-Request eine Rechnung in Ihrer API. @@ -118,13 +118,13 @@ In diesem Fall ist es der `str`: "{$callback_url}/invoices/{$request.body.id}" ``` -Wenn Ihr API-Benutzer (der externe Entwickler) also einen Request an *Ihre API* sendet, via: +Wenn Ihr API-Benutzer (der externe Entwickler) also einen Request an *Ihre API* sendet, an: ``` https://yourapi.com/invoices/?callback_url=https://www.external.org/events ``` -mit einem JSON-Körper: +mit einem JSON-Body: ```JSON { @@ -167,13 +167,13 @@ Beachten Sie, dass die verwendete Callback-URL die URL enthĂ€lt, die als Query-P An diesem Punkt haben Sie die benötigte(n) *Callback-Pfadoperation(en)* (diejenige(n), die der *externe Entwickler* in der *externen API* implementieren sollte) im Callback-Router, den Sie oben erstellt haben. -Verwenden Sie nun den Parameter `callbacks` im *Pfadoperation-Dekorator Ihrer API*, um das Attribut `.routes` (das ist eigentlich nur eine `list`e von Routen/*Pfadoperationen*) dieses Callback-Routers zu ĂŒbergeben: +Verwenden Sie nun den Parameter `callbacks` im *Pfadoperation-Dekorator Ihrer API*, um das Attribut `.routes` dieses Callback-Routers zu ĂŒbergeben: {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *} /// tip | Tipp -Beachten Sie, dass Sie nicht den Router selbst (`invoices_callback_router`) an `callback=` ĂŒbergeben, sondern das Attribut `.routes`, wie in `invoices_callback_router.routes`. FastAPI wird diese Routen verwenden, um die Callback-OpenAPI-Dokumentation zu generieren. +Beachten Sie, dass Sie nicht den Router selbst (`invoices_callback_router`) an `callbacks=` ĂŒbergeben, sondern dessen `.routes`, wie in `invoices_callback_router.routes`. FastAPI wird diese Routen verwenden, um die Callback-OpenAPI-Dokumentation zu generieren. /// diff --git a/docs/de/docs/advanced/response-change-status-code.md b/docs/de/docs/advanced/response-change-status-code.md index a0d90fe80..a334cc0bb 100644 --- a/docs/de/docs/advanced/response-change-status-code.md +++ b/docs/de/docs/advanced/response-change-status-code.md @@ -1,5 +1,6 @@ # Response – Statuscode Ă€ndern { #response-change-status-code } + Sie haben wahrscheinlich schon vorher gelesen, dass Sie einen Default-[Response-Statuscode](../tutorial/response-status-code.md) festlegen können. In manchen FĂ€llen mĂŒssen Sie jedoch einen anderen als den Default-Statuscode zurĂŒckgeben. diff --git a/docs/de/docs/advanced/response-cookies.md b/docs/de/docs/advanced/response-cookies.md index 672bbbe78..34eb6cfe9 100644 --- a/docs/de/docs/advanced/response-cookies.md +++ b/docs/de/docs/advanced/response-cookies.md @@ -1,5 +1,6 @@ # Response-Cookies { #response-cookies } + ## Einen `Response`-Parameter verwenden { #use-a-response-parameter } Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren. diff --git a/docs/de/docs/advanced/response-headers.md b/docs/de/docs/advanced/response-headers.md index bcec04be8..baf5715a3 100644 --- a/docs/de/docs/advanced/response-headers.md +++ b/docs/de/docs/advanced/response-headers.md @@ -38,4 +38,4 @@ Und da die `Response` hĂ€ufig zum Setzen von Headern und Cookies verwendet wird, Beachten Sie, dass benutzerdefinierte proprietĂ€re Header [mit dem PrĂ€fix `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) hinzugefĂŒgt werden können. -Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen können soll, mĂŒssen Sie diese zu Ihrer CORS-Konfiguration hinzufĂŒgen (weitere Informationen finden Sie unter [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), unter Verwendung des Parameters `expose_headers`, dokumentiert in [Starlettes CORS-Dokumentation](https://www.starlette.dev/middleware/#corsmiddleware). +Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen können soll, mĂŒssen Sie diese zu Ihren CORS-Konfigurationen hinzufĂŒgen (weitere Informationen finden Sie unter [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), unter Verwendung des Parameters `expose_headers`, dokumentiert in [Starlettes CORS-Dokumentation](https://www.starlette.dev/middleware/#corsmiddleware). diff --git a/docs/de/docs/advanced/security/oauth2-scopes.md b/docs/de/docs/advanced/security/oauth2-scopes.md index 6a459524c..74457b40d 100644 --- a/docs/de/docs/advanced/security/oauth2-scopes.md +++ b/docs/de/docs/advanced/security/oauth2-scopes.md @@ -247,7 +247,7 @@ Das wĂŒrde einer Drittanbieteranwendung passieren, die versucht, auf eine dieser ## Über Integrationen von Drittanbietern { #about-third-party-integrations } -In diesem Beispiel verwenden wir den OAuth2-Flow „Password“. +In diesem Beispiel verwenden wir den OAuth2-Flow „password“. Das ist angemessen, wenn wir uns bei unserer eigenen Anwendung anmelden, wahrscheinlich mit unserem eigenen Frontend. @@ -255,9 +255,9 @@ Weil wir darauf vertrauen können, dass es den `username` und das `password` erh Wenn Sie jedoch eine OAuth2-Anwendung erstellen, mit der andere eine Verbindung herstellen wĂŒrden (d.h. wenn Sie einen Authentifizierungsanbieter erstellen, der Facebook, Google, GitHub usw. entspricht), sollten Sie einen der anderen Flows verwenden. -Am hĂ€ufigsten ist der „Implicit“-Flow. +Am hĂ€ufigsten ist der implicit Flow. -Am sichersten ist der „Code“-Flow, die Implementierung ist jedoch komplexer, da mehr Schritte erforderlich sind. Da er komplexer ist, schlagen viele Anbieter letztendlich den „Implicit“-Flow vor. +Am sichersten ist der code Flow, die Implementierung ist jedoch komplexer, da mehr Schritte erforderlich sind. Da er komplexer ist, schlagen viele Anbieter letztendlich den implicit Flow vor. /// note | Hinweis diff --git a/docs/de/docs/advanced/settings.md b/docs/de/docs/advanced/settings.md index 1df74802b..993e5ae71 100644 --- a/docs/de/docs/advanced/settings.md +++ b/docs/de/docs/advanced/settings.md @@ -14,13 +14,13 @@ Um Umgebungsvariablen zu verstehen, können Sie [Umgebungsvariablen](../environm ## Typen und Validierung { #types-and-validation } -Diese Umgebungsvariablen können nur Text-Zeichenketten verarbeiten, da sie außerhalb von Python liegen und mit anderen Programmen und dem Rest des Systems (und sogar mit verschiedenen Betriebssystemen wie Linux, Windows, macOS) kompatibel sein mĂŒssen. +Diese Umgebungsvariablen können nur Text-Strings verarbeiten, da sie außerhalb von Python liegen und mit anderen Programmen und dem Rest des Systems (und sogar mit verschiedenen Betriebssystemen wie Linux, Windows, macOS) kompatibel sein mĂŒssen. Das bedeutet, dass jeder in Python aus einer Umgebungsvariablen gelesene Wert ein `str` ist und jede Konvertierung in einen anderen Typ oder jede Validierung im Code erfolgen muss. ## Pydantic `Settings` { #pydantic-settings } -GlĂŒcklicherweise bietet Pydantic ein großartiges Werkzeug zur Verarbeitung dieser Einstellungen, die von Umgebungsvariablen stammen, mit [Pydantic: Settings Management](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). +GlĂŒcklicherweise bietet Pydantic ein großartiges Werkzeug zur Verarbeitung dieser Einstellungen, die von Umgebungsvariablen stammen, mit [Pydantic: Settings-Verwaltung](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). ### `pydantic-settings` installieren { #install-pydantic-settings } @@ -92,9 +92,9 @@ Um mehrere Umgebungsvariablen fĂŒr einen einzelnen Befehl festzulegen, trennen S /// -Und dann wĂŒrde die Einstellung `admin_email` auf „deadpool@example.com“ gesetzt. +Und dann wĂŒrde die Einstellung `admin_email` auf `"deadpool@example.com"` gesetzt. -Der `app_name` wĂ€re „ChimichangApp“. +Der `app_name` wĂ€re `"ChimichangApp"`. Und `items_per_user` wĂŒrde seinen Defaultwert von `50` behalten. @@ -128,7 +128,7 @@ Ausgehend vom vorherigen Beispiel könnte Ihre Datei `config.py` so aussehen: {* ../../docs_src/settings/app02_an_py310/config.py hl[10] *} -Beachten Sie, dass wir jetzt keine Standardinstanz `settings = Settings()` erstellen. +Beachten Sie, dass wir jetzt keine Defaultinstanz `settings = Settings()` erstellen. ### Die Haupt-Anwendungsdatei { #the-main-app-file } @@ -158,7 +158,7 @@ Bei der AbhĂ€ngigkeitsĂŒberschreibung legen wir einen neuen Wert fĂŒr `admin_ema Dann können wir testen, ob das verwendet wird. -## Lesen einer `.env`-Datei { #reading-a-env-file } +## Eine `.env`-Datei lesen { #reading-a-env-file } Wenn Sie viele Einstellungen haben, die sich möglicherweise oft Ă€ndern, vielleicht in verschiedenen Umgebungen, kann es nĂŒtzlich sein, diese in eine Datei zu schreiben und sie dann daraus zu lesen, als wĂ€ren sie Umgebungsvariablen. @@ -172,7 +172,7 @@ Aber eine dotenv-Datei muss nicht unbedingt genau diesen Dateinamen haben. /// -Pydantic unterstĂŒtzt das Lesen dieser Dateitypen mithilfe einer externen Bibliothek. Weitere Informationen finden Sie unter [Pydantic Settings: Dotenv (.env) support](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). +Pydantic unterstĂŒtzt das Lesen dieser Dateitypen mithilfe einer externen Bibliothek. Weitere Informationen finden Sie unter [Pydantic Settings: Dotenv (.env)-UnterstĂŒtzung](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). /// tip | Tipp @@ -197,13 +197,13 @@ Und dann aktualisieren Sie Ihre `config.py` mit: /// tip | Tipp -Das Attribut `model_config` wird nur fĂŒr die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter [Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/). +Das Attribut `model_config` wird nur fĂŒr die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter [Pydantic: Konzepte: Konfiguration](https://docs.pydantic.dev/latest/concepts/config/). /// Hier definieren wir die Konfiguration `env_file` innerhalb Ihrer Pydantic-`Settings`-Klasse und setzen den Wert auf den Dateinamen mit der dotenv-Datei, die wir verwenden möchten. -### Die `Settings` nur einmal laden mittels `lru_cache` { #creating-the-settings-only-once-with-lru-cache } +### Die `Settings` nur einmal mittels `lru_cache` erstellen { #creating-the-settings-only-once-with-lru-cache } Das Lesen einer Datei von der Festplatte ist normalerweise ein kostspieliger (langsamer) Vorgang, daher möchten Sie ihn wahrscheinlich nur einmal ausfĂŒhren und dann dasselbe Einstellungsobjekt erneut verwenden, anstatt es fĂŒr jeden Request zu lesen. @@ -291,7 +291,7 @@ Im Fall unserer AbhĂ€ngigkeit `get_settings()` akzeptiert die Funktion nicht ein Auf diese Weise verhĂ€lt es sich fast so, als wĂ€re es nur eine globale Variable. Da es jedoch eine AbhĂ€ngigkeitsfunktion verwendet, können wir diese zu Testzwecken problemlos ĂŒberschreiben. -`@lru_cache` ist Teil von `functools`, welches Teil von Pythons Standardbibliothek ist. Weitere Informationen dazu finden Sie in der [Python Dokumentation fĂŒr `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache). +`@lru_cache` ist Teil von `functools`, welches Teil von Pythons Standardbibliothek ist. Weitere Informationen dazu finden Sie in der [Python-Dokumentation fĂŒr `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache). ## Zusammenfassung { #recap } diff --git a/docs/de/docs/advanced/stream-data.md b/docs/de/docs/advanced/stream-data.md index 500970029..16ff73e78 100644 --- a/docs/de/docs/advanced/stream-data.md +++ b/docs/de/docs/advanced/stream-data.md @@ -20,13 +20,13 @@ Sie könnten auf diese Weise auch **Video** oder **Audio** streamen, es könnte ## Eine `StreamingResponse` mit `yield` { #a-streamingresponse-with-yield } -Wenn Sie in Ihrer Pfadoperation-Funktion ein `response_class=StreamingResponse` deklarieren, können Sie `yield` verwenden, um nacheinander jeden Datenchunk zu senden. +Wenn Sie in Ihrer *Pfadoperation-Funktion* ein `response_class=StreamingResponse` deklarieren, können Sie `yield` verwenden, um nacheinander jeden Datenchunk zu senden. {* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *} FastAPI ĂŒbergibt jeden Datenchunk unverĂ€ndert an die `StreamingResponse`, es wird nicht versucht, ihn in JSON oder etwas Ähnliches zu konvertieren. -### Nicht-async-Pfadoperation-Funktionen { #non-async-path-operation-functions } +### Nicht-async-*Pfadoperation-Funktionen* { #non-async-path-operation-functions } Sie können auch regulĂ€re `def`-Funktionen (ohne `async`) verwenden und `yield` auf die gleiche Weise einsetzen. @@ -58,7 +58,7 @@ Zum Beispiel können Sie eine `PNGStreamingResponse` erstellen, die den `Content {* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} -Dann können Sie diese neue Klasse mit `response_class=PNGStreamingResponse` in Ihrer Pfadoperation-Funktion verwenden: +Dann können Sie diese neue Klasse mit `response_class=PNGStreamingResponse` in Ihrer *Pfadoperation-Funktion* verwenden: {* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} @@ -98,7 +98,7 @@ Aber in vielen FĂ€llen wĂŒrde das Lesen einer Datei oder eines dateiĂ€hnlichen O /// -Um die Event-Loop nicht zu blockieren, können Sie die Pfadoperation-Funktion einfach mit normalem `def` statt `async def` deklarieren, dadurch fĂŒhrt FastAPI sie in einem Threadpool-Worker aus, um die Haupt-Event-Loop nicht zu blockieren. +Um die Event-Loop nicht zu blockieren, können Sie die *Pfadoperation-Funktion* einfach mit normalem `def` statt `async def` deklarieren, dadurch fĂŒhrt FastAPI sie in einem Threadpool-Worker aus, um die Haupt-Event-Loop nicht zu blockieren. {* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} diff --git a/docs/de/docs/advanced/wsgi.md b/docs/de/docs/advanced/wsgi.md index 19d002886..353734a3a 100644 --- a/docs/de/docs/advanced/wsgi.md +++ b/docs/de/docs/advanced/wsgi.md @@ -1,5 +1,6 @@ # WSGI inkludieren – Flask, Django und andere { #including-wsgi-flask-django-others } + Sie können WSGI-Anwendungen mounten, wie Sie es in [Unteranwendungen – Mounts](sub-applications.md), [Hinter einem Proxy](behind-a-proxy.md) gesehen haben. Dazu können Sie die `WSGIMiddleware` verwenden und damit Ihre WSGI-Anwendung wrappen, zum Beispiel Flask, Django usw. diff --git a/docs/de/docs/alternatives.md b/docs/de/docs/alternatives.md index 70948e499..5a814cb55 100644 --- a/docs/de/docs/alternatives.md +++ b/docs/de/docs/alternatives.md @@ -283,7 +283,7 @@ Aus diesem Grund basiert **FastAPI** auf Starlette, da dieses das schnellste ver Falcon ist ein weiteres leistungsstarkes Python-Framework. Es ist minimalistisch konzipiert und dient als Grundlage fĂŒr andere Frameworks wie Hug. -Es ist so konzipiert, dass es ĂŒber Funktionen verfĂŒgt, welche zwei Parameter empfangen, einen „Request“ und eine „Response“. Dann „lesen“ Sie Teile des Requests und „schreiben“ Teile der Response. Aufgrund dieses Designs ist es nicht möglich, Request-Parameter und -Bodys mit Standard-Python-Typhinweisen als Funktionsparameter zu deklarieren. +Es ist so konzipiert, dass es ĂŒber Funktionen verfĂŒgt, welche zwei Parameter empfangen, einen „Request“ und eine „Response“. Dann „lesen“ Sie Teile des Requests und „schreiben“ Teile der Response. Aufgrund dieses Designs ist es nicht möglich, Request-Parameter und Requestbodys mit Standard-Python-Typhinweisen als Funktionsparameter zu deklarieren. Daher mĂŒssen Datenvalidierung, Serialisierung und Dokumentation im Code und nicht automatisch erfolgen. Oder sie mĂŒssen als Framework oberhalb von Falcon implementiert werden, so wie Hug. Dieselbe Unterscheidung findet auch in anderen Frameworks statt, die vom Design von Falcon inspiriert sind und ein Requestobjekt und ein Responseobjekt als Parameter haben. @@ -351,11 +351,11 @@ Hug inspirierte **FastAPI** dazu, einen `response`-Parameter in Funktionen zu de /// -### [APIStar](https://github.com/encode/apistar) (≩ 0.5) { #apistar-0-5 } +### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 } Kurz bevor ich mich entschied, **FastAPI** zu erstellen, fand ich den **APIStar**-Server. Er hatte fast alles, was ich suchte, und ein tolles Design. -Er war eine der ersten Implementierungen eines Frameworks, die ich je gesehen hatte (vor NestJS und Molten), welches Python-Typhinweise zur Deklaration von Parametern und Requests verwendeten. Ich habe ihn mehr oder weniger zeitgleich mit Hug gefunden. Aber APIStar nutzte den OpenAPI-Standard. +Er war eine der ersten Implementierungen eines Frameworks, die ich je gesehen hatte (vor NestJS und Molten), das Python-Typhinweise zur Deklaration von Parametern und Requests verwendete. Ich habe ihn mehr oder weniger zeitgleich mit Hug gefunden. Aber APIStar nutzte den OpenAPI-Standard. Er verfĂŒgte an mehreren Stellen ĂŒber automatische Datenvalidierung, Datenserialisierung und OpenAPI-Schemagenerierung, basierend auf denselben Typhinweisen. @@ -433,7 +433,7 @@ Es bietet: * CORS, GZip, statische Dateien, Responses streamen. * Session- und Cookie-UnterstĂŒtzung. * 100 % Testabdeckung. -* 100 % Typannotierte Codebasis. +* 100 % typannotierte Codebasis. * Wenige starke AbhĂ€ngigkeiten. Starlette ist derzeit das schnellste getestete Python-Framework. Nur ĂŒbertroffen von Uvicorn, welches kein Framework, sondern ein Server ist. @@ -448,7 +448,7 @@ Das ist eines der wichtigsten Dinge, welche **FastAPI** hinzufĂŒgt, alles basier ASGI ist ein neuer „Standard“, welcher von Mitgliedern des Django-Kernteams entwickelt wird. Es handelt sich immer noch nicht um einen „Python-Standard“ (ein PEP), obwohl sie gerade dabei sind, das zu tun. -Dennoch wird es bereits von mehreren Tools als „Standard“ verwendet. Das verbessert die InteroperabilitĂ€t erheblich, da Sie Uvicorn mit jeden anderen ASGI-Server (wie Daphne oder Hypercorn) tauschen oder ASGI-kompatible Tools wie `python-socketio` hinzufĂŒgen können. +Dennoch wird es bereits von mehreren Tools als „Standard“ verwendet. Das verbessert die InteroperabilitĂ€t erheblich, da Sie Uvicorn mit jedem anderen ASGI-Server (wie Daphne oder Hypercorn) tauschen oder ASGI-kompatible Tools wie `python-socketio` hinzufĂŒgen können. /// diff --git a/docs/de/docs/async.md b/docs/de/docs/async.md index d2a3a1de2..060e39bf9 100644 --- a/docs/de/docs/async.md +++ b/docs/de/docs/async.md @@ -44,7 +44,7 @@ Wenn Ihre Anwendung (irgendwie) nicht mit etwas anderem kommunizieren und auf de --- -Wenn Sie sich unsicher sind, verwenden Sie einfach `def`. +Wenn Sie sich unsicher sind, verwenden Sie normales `def`. --- @@ -70,7 +70,7 @@ Asynchroner Code bedeutet lediglich, dass die Sprache 💬 eine Möglichkeit hat WĂ€hrend der Zeit, die „Langsam-Datei“ 📝 benötigt, kann das System also andere Aufgaben erledigen. -Dann kommt der Computer / das Programm đŸ€– bei jeder Gelegenheit zurĂŒck, weil es entweder wieder wartet oder wann immer es đŸ€– die ganze Arbeit erledigt hat, die zu diesem Zeitpunkt zu tun war. Und es đŸ€– wird nachschauen, ob eine der Aufgaben, auf die es gewartet hat, fertig ist. +Dann kommt der Computer / das Programm đŸ€– bei jeder Gelegenheit zurĂŒck, weil es entweder wieder wartet oder wann immer es đŸ€– die ganze Arbeit erledigt hat, die zu diesem Zeitpunkt zu tun war. Und es đŸ€– wird nachschauen, ob eine der Aufgaben, auf die es gewartet hat, bereits fertig ist, und tun, was es zu tun hatte. Dann nimmt es đŸ€– die erste erledigte Aufgabe (sagen wir, unsere „Langsam-Datei“ 📝) und bearbeitet sie weiter. @@ -361,7 +361,7 @@ Wenn Sie mit **FastAPI** arbeiten, mĂŒssen Sie sich darĂŒber keine Sorgen machen Wenn Sie jedoch `async` / `await` ohne FastAPI verwenden möchten, können Sie dies auch tun. -### Schreiben Sie Ihren eigenen asynchronen Code { #write-your-own-async-code } +### Ihren eigenen asynchronen Code schreiben { #write-your-own-async-code } Starlette (und **FastAPI**) basieren auf [AnyIO](https://anyio.readthedocs.io/en/stable/), was bedeutet, dass es sowohl kompatibel mit der Python-Standardbibliothek [asyncio](https://docs.python.org/3/library/asyncio-task.html) als auch mit [Trio](https://trio.readthedocs.io/en/stable/) ist. diff --git a/docs/de/docs/deployment/cloud.md b/docs/de/docs/deployment/cloud.md index 2c8fe85c4..75f7ef881 100644 --- a/docs/de/docs/deployment/cloud.md +++ b/docs/de/docs/deployment/cloud.md @@ -16,7 +16,7 @@ FastAPI Cloud ist der Hauptsponsor und Finanzierungsgeber fĂŒr die *FastAPI and ## Cloudanbieter – Sponsoren { #cloud-providers-sponsors } -Einige andere Cloudanbieter ✹ [**sponsern FastAPI**](../help-fastapi.md#sponsor-the-author) ✹ ebenfalls. 🙇 +Einige andere Cloudanbieter ✹ [**sponsern FastAPI**](https://github.com/sponsors/tiangolo) ✹ ebenfalls. 🙇 Sie könnten diese ebenfalls in Betracht ziehen, deren Anleitungen folgen und ihre Dienste ausprobieren: diff --git a/docs/de/docs/deployment/concepts.md b/docs/de/docs/deployment/concepts.md index be00b2260..487ad6392 100644 --- a/docs/de/docs/deployment/concepts.md +++ b/docs/de/docs/deployment/concepts.md @@ -1,6 +1,6 @@ # Deployment-Konzepte { #deployments-concepts } -Bei dem Deployment – der Bereitstellung – einer **FastAPI**-Anwendung, oder eigentlich jeder Art von Web-API, gibt es mehrere Konzepte, die Sie wahrscheinlich interessieren, und mithilfe der Sie die **am besten geeignete** Methode zum **Deployment Ihrer Anwendung** finden können. +Beim Deployment einer **FastAPI**-Anwendung, oder eigentlich jeder Art von Web-API, gibt es mehrere Konzepte, die Sie wahrscheinlich interessieren, und mithilfe derer Sie die **am besten geeignete** Methode zum **Deployment Ihrer Anwendung** finden können. Einige wichtige Konzepte sind: @@ -59,7 +59,7 @@ Die nĂ€chsten zu berĂŒcksichtigenden Konzepte drehen sich dann um das Programm, Wir werden viel ĂŒber den laufenden „**Prozess**“ sprechen, daher ist es nĂŒtzlich, Klarheit darĂŒber zu haben, was das bedeutet und was der Unterschied zum Wort „**Programm**“ ist. -### Was ist ein Programm { #what-is-a-program } +### Was ein Programm ist { #what-is-a-program } Das Wort **Programm** wird hĂ€ufig zur Beschreibung vieler Dinge verwendet: @@ -67,14 +67,14 @@ Das Wort **Programm** wird hĂ€ufig zur Beschreibung vieler Dinge verwendet: * Die **Datei**, die vom Betriebssystem **ausgefĂŒhrt** werden kann, zum Beispiel: `python`, `python.exe` oder `uvicorn`. * Ein bestimmtes Programm, wĂ€hrend es auf dem Betriebssystem **lĂ€uft**, die CPU nutzt und Dinge im Arbeitsspeicher ablegt. Dies wird auch als **Prozess** bezeichnet. -### Was ist ein Prozess { #what-is-a-process } +### Was ein Prozess ist { #what-is-a-process } Das Wort **Prozess** wird normalerweise spezifischer verwendet und bezieht sich nur auf das, was im Betriebssystem ausgefĂŒhrt wird (wie im letzten Punkt oben): * Ein bestimmtes Programm, wĂ€hrend es auf dem Betriebssystem **ausgefĂŒhrt** wird. * Dies bezieht sich weder auf die Datei noch auf den Code, sondern **speziell** auf das, was vom Betriebssystem **ausgefĂŒhrt** und verwaltet wird. -* Jedes Programm, jeder Code **kann nur dann Dinge tun**, wenn er **ausgefĂŒhrt** wird, wenn also ein **Prozess lĂ€uft**. -* Der Prozess kann von Ihnen oder vom Betriebssystem **terminiert** („beendet“, „gekillt“) werden. An diesem Punkt hört es auf zu laufen/ausgefĂŒhrt zu werden und kann **keine Dinge mehr tun**. +* Jedes Programm, jeder Code **kann nur dann Dinge tun**, wenn er **ausgefĂŒhrt** wird. Also dann, wenn ein **Prozess lĂ€uft**. +* Der Prozess kann von Ihnen oder vom Betriebssystem **terminiert** („beendet“, „gekillt“) werden. An diesem Punkt hört er auf zu laufen/ausgefĂŒhrt zu werden und kann **keine Dinge mehr tun**. * Hinter jeder Anwendung, die Sie auf Ihrem Computer ausfĂŒhren, steckt ein Prozess, jedes laufende Programm, jedes Fenster usw. Und normalerweise laufen viele Prozesse **gleichzeitig**, wĂ€hrend ein Computer eingeschaltet ist. * Es können **mehrere Prozesse** desselben **Programms** gleichzeitig ausgefĂŒhrt werden. @@ -117,7 +117,7 @@ Einige Beispiele fĂŒr Tools, die diese Aufgabe ĂŒbernehmen können, sind: * Docker * Kubernetes * Docker Compose -* Docker im Schwarm-Modus +* Docker im Swarm-Modus * Systemd * Supervisor * Es wird intern von einem Cloudanbieter im Rahmen seiner Dienste verwaltet @@ -137,7 +137,7 @@ Und wir als Entwickler verbessern den Code stĂ€ndig, wenn wir diese Bugs finden ### Kleine Fehler automatisch handhaben { #small-errors-automatically-handled } -Wenn beim Erstellen von Web-APIs mit FastAPI ein Fehler in unserem Code auftritt, wird FastAPI ihn normalerweise dem einzelnen Request zurĂŒckgeben, der den Fehler ausgelöst hat. 🛡 +Wenn beim Erstellen von Web-APIs mit FastAPI ein Fehler in unserem Code auftritt, wird FastAPI ihn normalerweise auf den einzelnen Request beschrĂ€nken, der den Fehler ausgelöst hat. 🛡 Der Client erhĂ€lt fĂŒr diesen Request einen **500 Internal Server Error**, aber die Anwendung arbeitet bei den nĂ€chsten Requests weiter, anstatt einfach komplett abzustĂŒrzen. @@ -170,7 +170,7 @@ Dies könnte zum Beispiel erledigt werden durch: * Docker * Kubernetes * Docker Compose -* Docker im Schwarm-Modus +* Docker im Swarm-Modus * Systemd * Supervisor * Intern von einem Cloudanbieter im Rahmen seiner Dienste @@ -178,7 +178,7 @@ Dies könnte zum Beispiel erledigt werden durch: ## Replikation – Prozesse und Arbeitsspeicher { #replication-processes-and-memory } -Wenn Sie eine FastAPI-Anwendung verwenden und ein Serverprogramm wie den `fastapi`-Befehl, der Uvicorn ausfĂŒhrt, kann **ein einzelner Prozess** an mehrere Clients gleichzeitig ausliefern. +Wenn Sie eine FastAPI-Anwendung verwenden und ein Serverprogramm wie den `fastapi`-Befehl, der Uvicorn ausfĂŒhrt, kann die AusfĂŒhrung in **einem Prozess** mehrere Clients gleichzeitig versorgen. In vielen FĂ€llen möchten Sie jedoch mehrere Workerprozesse gleichzeitig ausfĂŒhren. @@ -200,7 +200,7 @@ Um also **mehrere Prozesse** gleichzeitig zu haben, muss es einen **einzelnen Pr Wenn das Programm nun Dinge in den Arbeitsspeicher lĂ€dt, zum Beispiel ein Modell fĂŒr maschinelles Lernen in einer Variablen oder den Inhalt einer großen Datei in einer Variablen, verbraucht das alles **einen Teil des Arbeitsspeichers (RAM – Random Access Memory)** des Servers. -Und mehrere Prozesse teilen sich normalerweise keinen Speicher. Das bedeutet, dass jeder laufende Prozess seine eigenen Dinge, eigenen Variablen und eigenen Speicher hat. Und wenn Sie in Ihrem Code viel Speicher verbrauchen, verbraucht **jeder Prozess** die gleiche Menge Speicher. +Und mehrere Prozesse **teilen sich normalerweise keinen Speicher**. Das bedeutet, dass jeder laufende Prozess seine eigenen Dinge, eigenen Variablen und eigenen Speicher hat. Und wenn Sie in Ihrem Code viel Speicher verbrauchen, verbraucht **jeder Prozess** die gleiche Menge Speicher. ### Serverspeicher { #server-memory } diff --git a/docs/de/docs/deployment/docker.md b/docs/de/docs/deployment/docker.md index db249f74f..0ab886c46 100644 --- a/docs/de/docs/deployment/docker.md +++ b/docs/de/docs/deployment/docker.md @@ -36,7 +36,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] Container (hauptsĂ€chlich Linux-Container) sind eine sehr **leichtgewichtige** Möglichkeit, Anwendungen einschließlich aller ihrer AbhĂ€ngigkeiten und erforderlichen Dateien zu verpacken und sie gleichzeitig von anderen Containern (anderen Anwendungen oder Komponenten) im selben System isoliert zu halten. -Linux-Container werden mit demselben Linux-Kernel des Hosts (Maschine, virtuellen Maschine, Cloud-Servers, usw.) ausgefĂŒhrt. Das bedeutet einfach, dass sie sehr leichtgewichtig sind (im Vergleich zu vollstĂ€ndigen virtuellen Maschinen, die ein gesamtes Betriebssystem emulieren). +Linux-Container werden mit demselben Linux-Kernel des Hosts (Maschine, virtueller Maschine, Cloud-Server usw.) ausgefĂŒhrt. Das bedeutet einfach, dass sie sehr leichtgewichtig sind (im Vergleich zu vollstĂ€ndigen virtuellen Maschinen, die ein gesamtes Betriebssystem emulieren). Auf diese Weise verbrauchen Container **wenig Ressourcen**, eine Menge vergleichbar mit der direkten AusfĂŒhrung der Prozesse (eine virtuelle Maschine wĂŒrde viel mehr verbrauchen). @@ -46,7 +46,7 @@ Container verfĂŒgen außerdem ĂŒber ihre eigenen **isoliert** laufenden Prozesse Ein **Container** wird von einem **Containerimage** ausgefĂŒhrt. -Ein Containerimage ist eine **statische** Version aller Dateien, Umgebungsvariablen und des Standardbefehls/-programms, welche in einem Container vorhanden sein sollten. **Statisch** bedeutet hier, dass das Container-**Image** nicht lĂ€uft, nicht ausgefĂŒhrt wird, sondern nur die gepackten Dateien und Metadaten enthĂ€lt. +Ein Containerimage ist eine **statische** Version aller Dateien, Umgebungsvariablen und des Standardbefehls/-programms, die in einem Container vorhanden sein sollten. **Statisch** bedeutet hier, dass das Container-**Image** nicht lĂ€uft, nicht ausgefĂŒhrt wird, sondern nur die gepackten Dateien und Metadaten enthĂ€lt. Im Gegensatz zu einem „**Containerimage**“, bei dem es sich um den gespeicherten statischen Inhalt handelt, bezieht sich ein „**Container**“ normalerweise auf die laufende Instanz, das Ding, das **ausgefĂŒhrt** wird. @@ -89,7 +89,7 @@ Ein Container lĂ€uft, solange der **Hauptprozess** (Befehl oder Programm) lĂ€uft Ein Container hat normalerweise einen **einzelnen Prozess**, aber es ist auch möglich, Unterprozesse vom Hauptprozess aus zu starten, und auf diese Weise haben Sie **mehrere Prozesse** im selben Container. -Es ist jedoch nicht möglich, einen laufenden Container, ohne **mindestens einen laufenden Prozess** zu haben. Wenn der Hauptprozess stoppt, stoppt der Container. +Es ist jedoch nicht möglich, einen laufenden Container ohne **mindestens einen laufenden Prozess** zu haben. Wenn der Hauptprozess stoppt, stoppt der Container. ## Ein Docker-Image fĂŒr FastAPI erstellen { #build-a-docker-image-for-fastapi } @@ -184,19 +184,19 @@ COPY ./app /code/app CMD ["fastapi", "run", "app/main.py", "--port", "80"] ``` -1. Beginne mit dem offiziellen Python-Basisimage. +1. Beginnen Sie mit dem offiziellen Python-Basisimage. -2. Setze das aktuelle Arbeitsverzeichnis auf `/code`. +2. Setzen Sie das aktuelle Arbeitsverzeichnis auf `/code`. Hier platzieren wir die Datei `requirements.txt` und das Verzeichnis `app`. -3. Kopiere die Datei mit den Paketanforderungen in das Verzeichnis `/code`. +3. Kopieren Sie die Datei mit den Paketanforderungen in das Verzeichnis `/code`. Kopieren Sie zuerst **nur** die Datei mit den Anforderungen, nicht den Rest des Codes. Da sich diese Datei **nicht oft Ă€ndert**, erkennt Docker das und verwendet den **Cache** fĂŒr diesen Schritt, wodurch der Cache auch fĂŒr den nĂ€chsten Schritt aktiviert wird. -4. Installiere die PaketabhĂ€ngigkeiten aus der Anforderungsdatei. +4. Installieren Sie die PaketabhĂ€ngigkeiten aus der Anforderungsdatei. Die Option `--no-cache-dir` weist `pip` an, die heruntergeladenen Pakete nicht lokal zu speichern, da dies nur benötigt wird, sollte `pip` erneut ausgefĂŒhrt werden, um dieselben Pakete zu installieren, aber das ist beim Arbeiten mit Containern nicht der Fall. @@ -212,13 +212,13 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] Durch die Verwendung des Caches in diesem Schritt **sparen** Sie viel **Zeit**, wenn Sie das Image wĂ€hrend der Entwicklung immer wieder erstellen, anstatt **jedes Mal** alle AbhĂ€ngigkeiten **herunterzuladen und zu installieren**. -5. Kopiere das Verzeichnis `./app` in das Verzeichnis `/code`. +5. Kopieren Sie das Verzeichnis `./app` in das Verzeichnis `/code`. Da hier der gesamte Code enthalten ist, der sich **am hĂ€ufigsten Ă€ndert**, wird der Docker-**Cache** nicht ohne weiteres fĂŒr diesen oder andere **folgende Schritte** verwendet. Daher ist es wichtig, dies **nahe dem Ende** des `Dockerfile`s zu platzieren, um die Erstellungszeiten des Containerimages zu optimieren. -6. Lege den **Befehl** fest, um `fastapi run` zu nutzen, welches Uvicorn darunter verwendet. +6. Legen Sie den **Befehl** fest, um `fastapi run` zu nutzen, welches Uvicorn darunter verwendet. `CMD` nimmt eine Liste von Zeichenfolgen entgegen. Jede dieser Zeichenfolgen entspricht dem, was Sie durch Leerzeichen getrennt in die Befehlszeile eingeben wĂŒrden. @@ -405,7 +405,7 @@ COPY ./main.py /code/ CMD ["fastapi", "run", "main.py", "--port", "80"] ``` -1. Kopiere die Datei `main.py` direkt in das Verzeichnis `/code` (ohne ein Verzeichnis `./app`). +1. Kopieren Sie die Datei `main.py` direkt in das Verzeichnis `/code` (ohne ein Verzeichnis `./app`). 2. Verwenden Sie `fastapi run`, um Ihre Anwendung in der einzelnen Datei `main.py` bereitzustellen. @@ -440,7 +440,7 @@ Traefik verfĂŒgt ĂŒber Integrationen mit Docker, Kubernetes und anderen, sodass /// -Alternativ könnte HTTPS von einem Cloud-Anbieter als einer seiner Dienste gehandhabt werden (wĂ€hrend die Anwendung weiterhin in einem Container ausgefĂŒhrt wird). +Alternativ könnte HTTPS von einem Cloudanbieter als einer seiner Dienste gehandhabt werden (wĂ€hrend die Anwendung weiterhin in einem Container ausgefĂŒhrt wird). ## Beim Hochfahren ausfĂŒhren und Neustarts { #running-on-startup-and-restarts } @@ -488,7 +488,7 @@ Und normalerweise wĂ€re dieser **Load Balancer** in der Lage, Requests zu verarb In einem solchen Szenario möchten Sie wahrscheinlich **einen einzelnen (Uvicorn-)Prozess pro Container** haben, da Sie die Replikation bereits auf Cluster-Ebene durchfĂŒhren wĂŒrden. -In diesem Fall möchten Sie also **nicht** mehrere Worker im Container haben, z. B. mit der `--workers` Befehlszeilenoption. Sie möchten nur einen **einzelnen Uvicorn-Prozess** pro Container haben (wahrscheinlich aber mehrere Container). +In diesem Fall möchten Sie also **nicht** mehrere Worker im Container haben, z. B. mit der `--workers`-Befehlszeilenoption. Sie möchten nur einen **einzelnen Uvicorn-Prozess** pro Container haben (wahrscheinlich aber mehrere Container). Ein weiterer Prozessmanager im Container (wie es bei mehreren Workern der Fall wĂ€re) wĂŒrde nur **unnötige KomplexitĂ€t** hinzufĂŒgen, um welche Sie sich höchstwahrscheinlich bereits mit Ihrem Clustersystem kĂŒmmern. @@ -496,7 +496,7 @@ Ein weiterer Prozessmanager im Container (wie es bei mehreren Workern der Fall w NatĂŒrlich gibt es **SonderfĂ€lle**, in denen Sie **einen Container** mit mehreren **Uvicorn-Workerprozessen** haben möchten. -In diesen FĂ€llen können Sie die `--workers` Befehlszeilenoption verwenden, um die Anzahl der zu startenden Worker festzulegen: +In diesen FĂ€llen können Sie die `--workers`-Befehlszeilenoption verwenden, um die Anzahl der zu startenden Worker festzulegen: ```{ .dockerfile .annotate } FROM python:3.14 @@ -513,7 +513,7 @@ COPY ./app /code/app CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] ``` -1. Hier verwenden wir die `--workers` Befehlszeilenoption, um die Anzahl der Worker auf 4 festzulegen. +1. Hier verwenden wir die `--workers`-Befehlszeilenoption, um die Anzahl der Worker auf 4 festzulegen. Hier sind einige Beispiele, wann das sinnvoll sein könnte: @@ -529,7 +529,7 @@ Dann möchten Sie vielleicht **einen einzelnen Container** mit einem **Prozessma --- -Der Hauptpunkt ist, dass **keine** dieser Regeln **in Stein gemeißelt** ist, der man blind folgen muss. Sie können diese Ideen verwenden, um **Ihren eigenen Anwendungsfall zu evaluieren**, zu entscheiden, welcher Ansatz fĂŒr Ihr System am besten geeignet ist und herauszufinden, wie Sie folgende Konzepte verwalten: +Der Hauptpunkt ist, dass **keine** dieser Regeln **in Stein gemeißelt** ist, der man blind folgen muss. Sie können diese Ideen verwenden, um **I Ihren eigenen Anwendungsfall zu evaluieren**, zu entscheiden, welcher Ansatz fĂŒr Ihr System am besten geeignet ist und herauszufinden, wie Sie folgende Konzepte verwalten: * Sicherheit – HTTPS * Beim Hochfahren ausfĂŒhren @@ -576,7 +576,7 @@ Sie sollten wahrscheinlich **nicht** dieses Basis-Docker-Image (oder ein anderes Wenn Sie **Kubernetes** (oder andere) verwenden und bereits **Replikation** auf Cluster-Ebene mit mehreren **Containern** eingerichtet haben. In diesen FĂ€llen ist es besser, **ein Image von Grund auf neu zu erstellen**, wie oben beschrieben: [Ein Docker-Image fĂŒr FastAPI erstellen](#build-a-docker-image-for-fastapi). -Und wenn Sie mehrere Worker benötigen, können Sie einfach die `--workers` Befehlszeilenoption verwenden. +Und wenn Sie mehrere Worker benötigen, können Sie einfach die `--workers`-Befehlszeilenoption verwenden. /// note | Technische Details diff --git a/docs/de/docs/deployment/https.md b/docs/de/docs/deployment/https.md index 0f97909c2..b4c49ff4d 100644 --- a/docs/de/docs/deployment/https.md +++ b/docs/de/docs/deployment/https.md @@ -21,10 +21,10 @@ Aus **Sicht des Entwicklers** sollten Sie beim Nachdenken ĂŒber HTTPS Folgendes * Und dann mĂŒssen sie vom Dritten **erneuert**, **erneut erworben** werden. * Die VerschlĂŒsselung der Verbindung erfolgt auf **TCP-Ebene**. * Das ist eine Schicht **unter HTTP**. - * Die Handhabung von **Zertifikaten und VerschlĂŒsselung** erfolgt also **vor HTTP**. + * Die **Zertifikats- und VerschlĂŒsselungs**-Handhabung erfolgt also **vor HTTP**. * **TCP weiß nichts ĂŒber „Domains“**. Nur ĂŒber IP-Adressen. * Die Informationen ĂŒber die angeforderte **spezifische Domain** befinden sich in den **HTTP-Daten**. -* Die **HTTPS-Zertifikate** „zertifizieren“ eine **bestimmte Domain**, aber das Protokoll und die VerschlĂŒsselung erfolgen auf TCP-Ebene, **ohne zu wissen**, um welche Domain es sich handelt. +* Die **HTTPS-Zertifikate** „zertifizieren“ eine **bestimmte Domain**, aber das Protokoll und die VerschlĂŒsselung erfolgen auf TCP-Ebene, **bevor bekannt ist**, um welche Domain es sich handelt. * **StandardmĂ€ĂŸig** bedeutet das, dass Sie nur **ein HTTPS-Zertifikat pro IP-Adresse** haben können. * Ganz gleich, wie groß Ihr Server ist oder wie klein die einzelnen Anwendungen darauf sind. * HierfĂŒr gibt es jedoch eine **Lösung**. @@ -194,7 +194,7 @@ Dieser ganze Erneuerungsprozess, wĂ€hrend die Anwendung weiterhin bereitgestellt Wenn Sie einen Proxy zur Verarbeitung von HTTPS verwenden, weiß Ihr **Anwendungsserver** (z. B. Uvicorn ĂŒber das FastAPI CLI) nichts ĂŒber den HTTPS-Prozess, er kommuniziert per einfachem HTTP mit dem **TLS-Terminierungsproxy**. -Dieser **Proxy** wĂŒrde normalerweise unmittelbar vor dem Übermitteln der Anfrage an den **Anwendungsserver** einige HTTP-Header dynamisch setzen, um dem Anwendungsserver mitzuteilen, dass der Request vom Proxy **weitergeleitet** wird. +Dieser **Proxy** wĂŒrde normalerweise unmittelbar vor dem Übermitteln des Requests an den **Anwendungsserver** einige HTTP-Header dynamisch setzen, um dem Anwendungsserver mitzuteilen, dass der Request vom Proxy **weitergeleitet** wird. /// note | Technische Details diff --git a/docs/de/docs/deployment/manually.md b/docs/de/docs/deployment/manually.md index eae850a69..fa8a9c963 100644 --- a/docs/de/docs/deployment/manually.md +++ b/docs/de/docs/deployment/manually.md @@ -55,7 +55,7 @@ Es gibt mehrere Alternativen, einschließlich: * [Uvicorn](https://www.uvicorn.dev/): ein hochperformanter ASGI-Server. * [Hypercorn](https://hypercorn.readthedocs.io/): ein ASGI-Server, der unter anderem kompatibel mit HTTP/2 und Trio ist. * [Daphne](https://github.com/django/daphne): der fĂŒr Django Channels entwickelte ASGI-Server. -* [Granian](https://github.com/emmett-framework/granian): Ein Rust HTTP-Server fĂŒr Python-Anwendungen. +* [Granian](https://github.com/emmett-framework/granian): Ein Rust-HTTP-Server fĂŒr Python-Anwendungen. ## Servermaschine und Serverprogramm { #server-machine-and-server-program } @@ -65,11 +65,11 @@ Das Wort „**Server**“ wird hĂ€ufig verwendet, um sowohl den entfernten/Cloud Denken Sie einfach daran, dass sich „Server“ im Allgemeinen auf eines dieser beiden Dinge beziehen kann. -Wenn man sich auf die entfernte Maschine bezieht, wird sie ĂŒblicherweise als **Server**, aber auch als **Maschine**, **VM** (virtuelle Maschine) oder **Knoten** bezeichnet. Diese Begriffe beziehen sich auf irgendeine Art von entfernten Rechner, normalerweise unter Linux, auf dem Sie Programme ausfĂŒhren. +Wenn man sich auf die entfernte Maschine bezieht, wird sie ĂŒblicherweise als **Server**, aber auch als **Maschine**, **VM** (virtuelle Maschine) oder **Knoten** bezeichnet. Diese Begriffe beziehen sich auf irgendeine Art von entferntem Rechner, normalerweise unter Linux, auf dem Sie Programme ausfĂŒhren. ## Das Serverprogramm installieren { #install-the-server-program } -Wenn Sie FastAPI installieren, wird es mit einem Produktionsserver, Uvicorn, geliefert, und Sie können ihn mit dem `fastapi run` Befehl starten. +Wenn Sie FastAPI installieren, wird es mit einem Produktionsserver, Uvicorn, geliefert, und Sie können ihn mit dem `fastapi run`-Befehl starten. Aber Sie können auch ein ASGI-Serverprogramm manuell installieren. diff --git a/docs/de/docs/editor-support.md b/docs/de/docs/editor-support.md index 97782f54f..f93dd5346 100644 --- a/docs/de/docs/editor-support.md +++ b/docs/de/docs/editor-support.md @@ -1,6 +1,6 @@ # Editor-UnterstĂŒtzung { #editor-support } -Die offizielle [FastAPI-Erweiterung](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) verbessert Ihren FastAPI-Entwicklungsworkflow mit Pfadoperation-Erkennung und -Navigation sowie FastAPI-Cloud-Deployment und Live-Logstreaming. +Die offizielle [FastAPI-Erweiterung](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) verbessert Ihren FastAPI-Entwicklungsworkflow mit *Pfadoperation*-Erkennung und -Navigation sowie FastAPI-Cloud-Deployment und Live-Logstreaming. Weitere Details zur Erweiterung finden Sie im README im [GitHub-Repository](https://github.com/fastapi/fastapi-vscode). @@ -14,10 +14,10 @@ StandardmĂ€ĂŸig erkennt die Erweiterung FastAPI-Anwendungen in Ihrem Workspace a ## Funktionen { #features } -- Pfadoperation-Explorer – Eine Baumansicht in der Seitenleiste aller *Pfadoperationen* in Ihrer Anwendung. Klicken Sie, um zu einer beliebigen Route- oder Router-Definition zu springen. -- Routensuche – Suchen Sie nach Pfad, Methode oder Namen mit Ctrl + Shift + E (unter macOS: Cmd + Shift + E). -- CodeLens-Navigation – Anklickbare Links oberhalb von Testclient-Aufrufen (z. B. `client.get('/items')`), die zur passenden Pfadoperation springen und so eine schnelle Navigation zwischen Tests und Implementierung ermöglichen. -- Zu FastAPI Cloud deployen – Deployment Ihrer App mit einem Klick auf [FastAPI Cloud](https://fastapicloud.com/). -- Anwendungslogs streamen – Echtzeit-Logstreaming Ihrer auf FastAPI Cloud deployten Anwendung mit Loglevel-Filterung und Textsuche. +- **Pfadoperation-Explorer** – Eine Baumansicht in der Seitenleiste aller *Pfadoperationen* in Ihrer Anwendung. Klicken Sie, um zu einer beliebigen Route- oder Router-Definition zu springen. +- **Routensuche** – Suchen Sie nach Pfad, Methode oder Namen mit Ctrl + Shift + E (unter macOS: Cmd + Shift + E). +- **CodeLens-Navigation** – Anklickbare Links oberhalb von Testclient-Aufrufen (z. B. `client.get('/items')`), die zur passenden *Pfadoperation* springen und so eine schnelle Navigation zwischen Tests und Implementierung ermöglichen. +- **Zu FastAPI Cloud deployen** – Deployment Ihrer App mit einem Klick auf [FastAPI Cloud](https://fastapicloud.com/). +- **Anwendungslogs streamen** – Echtzeit-Logstreaming Ihrer auf FastAPI Cloud deployten Anwendung mit Loglevel-Filterung und Textsuche. -Wenn Sie sich mit den Funktionen der Erweiterung vertraut machen möchten, können Sie den Erweiterungs‑Walkthrough aufrufen, indem Sie die Befehlspalette öffnen (Ctrl + Shift + P oder unter macOS: Cmd + Shift + P) und „Welcome: Open walkthrough 
“ auswĂ€hlen und anschließend den Walkthrough „Get started with FastAPI“ wĂ€hlen. +Wenn Sie sich mit den Funktionen der Erweiterung vertraut machen möchten, können Sie den Erweiterungs‑Walkthrough aufrufen, indem Sie die Befehlspalette öffnen (Ctrl + Shift + P oder unter macOS: Cmd + Shift + P) und „Welcome: Open walkthrough ...“ auswĂ€hlen und anschließend den Walkthrough „Get started with FastAPI“ wĂ€hlen. diff --git a/docs/de/docs/environment-variables.md b/docs/de/docs/environment-variables.md index 7bff442cd..1678ead27 100644 --- a/docs/de/docs/environment-variables.md +++ b/docs/de/docs/environment-variables.md @@ -12,7 +12,7 @@ Umgebungsvariablen können nĂŒtzlich sein, um **Einstellungen** der Anwendung zu ## Umgebungsvariablen erstellen und verwenden { #create-and-use-env-vars } -Sie können Umgebungsvariablen in der **Shell (Terminal)** erstellen und verwenden, ohne Python zu benötigen: +Sie können Umgebungsvariablen in der **Shell (Terminal)** **erstellen** und verwenden, ohne Python zu benötigen: //// tab | Linux, macOS, Windows Bash @@ -67,7 +67,7 @@ print(f"Hello {name} from Python") Das zweite Argument von [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) ist der Defaultwert, der zurĂŒckgegeben wird. -Wenn er nicht angegeben wird, ist er standardmĂ€ĂŸig `None`. Hier geben wir „World“ als den zu verwendenden Defaultwert an. +Wenn er nicht angegeben wird, ist er standardmĂ€ĂŸig `None`. Hier geben wir `"World"` als den zu verwendenden Defaultwert an. /// @@ -255,7 +255,7 @@ $ python //// tab | Linux, macOS -Das System wird das `python` Programm in `/opt/custompython/bin` **finden** und es ausfĂŒhren. +Das System wird das `python`-Programm in `/opt/custompython/bin` **finden** und es ausfĂŒhren. Es wĂ€re ungefĂ€hr gleichbedeutend mit der Eingabe von: @@ -271,7 +271,7 @@ $ /opt/custompython/bin/python //// tab | Windows -Das System wird das `python` Programm in `C:\opt\custompython\bin\python` **finden** und es ausfĂŒhren. +Das System wird das `python`-Programm in `C:\opt\custompython\bin\python` **finden** und es ausfĂŒhren. Es wĂ€re ungefĂ€hr gleichbedeutend mit der Eingabe von: diff --git a/docs/de/docs/features.md b/docs/de/docs/features.md index 73fa876a9..f24ec2426 100644 --- a/docs/de/docs/features.md +++ b/docs/de/docs/features.md @@ -1,10 +1,10 @@ # Merkmale { #features } -## FastAPI Merkmale { #fastapi-features } +## FastAPI-Merkmale { #fastapi-features } **FastAPI** ermöglicht Ihnen Folgendes: -### Basiert auf offenen Standards { #based-on-open-standards } +### Auf offenen Standards basieren { #based-on-open-standards } * [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) fĂŒr die Erstellung von APIs, inklusive Deklarationen von Pfad-Operationen, Parametern, Requestbodys, Sicherheit, usw. * Automatische Dokumentation der Datenmodelle mit [**JSON Schema**](https://json-schema.org/) (da OpenAPI selbst auf JSON Schema basiert). @@ -15,7 +15,7 @@ Interaktive API-Dokumentation und erkundbare Web-BenutzeroberflĂ€chen. Da das Framework auf OpenAPI basiert, gibt es mehrere Optionen, zwei sind standardmĂ€ĂŸig vorhanden. -* [**Swagger UI**](https://github.com/swagger-api/swagger-ui), bietet interaktive Erkundung, testen und rufen Sie Ihre API direkt im Webbrowser auf. +* [**Swagger UI**](https://github.com/swagger-api/swagger-ui), mit interaktiver Erkundung, rufen Sie Ihre API direkt vom Browser aus auf und testen Sie sie. ![Swagger UI Interaktion](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) @@ -36,7 +36,7 @@ from datetime import date from pydantic import BaseModel -# Deklarieren Sie eine Variable als ein str +# Deklarieren Sie eine Variable vom Typ str # und bekommen Sie Editor-UnterstĂŒtzung innerhalb der Funktion def main(user_id: str): return user_id @@ -67,11 +67,11 @@ my_second_user: User = User(**second_user_data) `**second_user_data` bedeutet: -Nimm die SchlĂŒssel-Wert-Paare des `second_user_data` Dicts und ĂŒbergebe sie direkt als SchlĂŒsselwort-Argumente. Äquivalent zu: `User(id=4, name="Mary", joined="2018-11-30")` +Übergeben Sie die SchlĂŒssel und Werte des `second_user_data` Dicts direkt als SchlĂŒssel-Wert-Argumente, Ă€quivalent zu: `User(id=4, name="Mary", joined="2018-11-30")` /// -### Editor UnterstĂŒtzung { #editor-support } +### EditorunterstĂŒtzung { #editor-support } Das ganze Framework wurde so entworfen, dass es einfach und intuitiv zu benutzen ist; alle Entscheidungen wurden auf mehreren Editoren getestet, sogar vor der Implementierung, um die bestmögliche Entwicklererfahrung zu gewĂ€hrleisten. @@ -85,31 +85,31 @@ So kann Ihr Editor Sie unterstĂŒtzen: * in [Visual Studio Code](https://code.visualstudio.com/): -![Editor UnterstĂŒtzung](https://fastapi.tiangolo.com/img/vscode-completion.png) +![EditorunterstĂŒtzung](https://fastapi.tiangolo.com/img/vscode-completion.png) * in [PyCharm](https://www.jetbrains.com/pycharm/): -![Editor UnterstĂŒtzung](https://fastapi.tiangolo.com/img/pycharm-completion.png) +![EditorunterstĂŒtzung](https://fastapi.tiangolo.com/img/pycharm-completion.png) -Sie bekommen sogar AutovervollstĂ€ndigung an Stellen, an denen Sie dies vorher nicht fĂŒr möglich gehalten hĂ€tten. Zum Beispiel der `price` SchlĂŒssel in einem JSON Datensatz (dieser könnte auch verschachtelt sein), der aus einem Request kommt. +Sie bekommen sogar AutovervollstĂ€ndigung an Stellen, an denen Sie dies vorher nicht fĂŒr möglich gehalten hĂ€tten. Zum Beispiel der `price`-SchlĂŒssel innerhalb eines JSON-Bodys (dieser könnte auch verschachtelt sein), der aus einem Request kommt. Nie wieder falsche SchlĂŒsselnamen tippen, Hin und HerhĂŒpfen zwischen der Dokumentation, Hoch- und Runterscrollen, um herauszufinden, ob es `username` oder `user_name` war. ### Kompakt { #short } -Es gibt fĂŒr alles sensible **Defaultwerte**, mit optionaler Konfiguration ĂŒberall. Alle Parameter können feinjustiert werden, damit sie tun, was Sie benötigen, und die API definieren, die Sie brauchen. +Es gibt fĂŒr alles sinnvolle **Defaultwerte**, mit optionaler Konfiguration ĂŒberall. Alle Parameter können feinjustiert werden, damit sie tun, was Sie benötigen, und die API definieren, die Sie brauchen. Aber standardmĂ€ĂŸig **„funktioniert einfach alles“**. ### Validierung { #validation } * Validierung fĂŒr die meisten (oder alle?) Python-**Datentypen**, hierzu gehören: - * JSON Objekte (`dict`). - * JSON Listen (`list`), die den Typ ihrer Elemente definieren. - * Strings (`str`) mit definierter minimaler und maximaler LĂ€nge. + * JSON-Objekte (`dict`). + * JSON-Array (`list`), das Elementtypen definiert. + * String-Felder (`str`) mit definierter minimaler und maximaler LĂ€nge. * Zahlen (`int`, `float`) mit Mindest- und Maximalwerten, usw. -* Validierung fĂŒr mehr exotische Typen, wie: +* Validierung fĂŒr exotischere Typen, wie: * URL. * E-Mail. * UUID. @@ -124,42 +124,42 @@ Sicherheit und Authentifizierung sind integriert. Ohne Kompromisse bei Datenbank Alle in OpenAPI definierten Sicherheitsschemas, inklusive: * HTTP Basic. -* **OAuth2** (auch mit **JWT Tokens**). Siehe dazu das Tutorial zu [OAuth2 mit JWT](tutorial/security/oauth2-jwt.md). -* API SchlĂŒssel in: +* **OAuth2** (auch mit **JWT-Tokens**). Siehe dazu das Tutorial zu [OAuth2 mit JWT](tutorial/security/oauth2-jwt.md). +* API-SchlĂŒssel in: * Headern. * Query-Parametern. * Cookies, usw. -ZusĂ€tzlich alle Sicherheitsfunktionen von Starlette (inklusive **Session Cookies**). +ZusĂ€tzlich alle Sicherheitsfunktionen von Starlette (inklusive **Session-Cookies**). -Alles als wiederverwendbare Tools und Komponenten gebaut, die einfach in Ihre Systeme, Datenspeicher, relationale und nicht-relationale Datenbanken, usw., integriert werden können. +Alles als wiederverwendbare Tools und Komponenten gebaut, die einfach in Ihre Systeme, Datenspeicher, relationale und NoSQL-Datenbanken, usw., integriert werden können. ### Dependency Injection { #dependency-injection } -FastAPI enthĂ€lt ein extrem einfach zu verwendendes, aber extrem mĂ€chtiges Dependency Injection System. +FastAPI enthĂ€lt ein extrem einfach zu verwendendes, aber extrem mĂ€chtiges Dependency Injection-System. * Selbst AbhĂ€ngigkeiten können AbhĂ€ngigkeiten haben, woraus eine Hierarchie oder ein **„Graph“ von AbhĂ€ngigkeiten** entsteht. * Alles **automatisch gehandhabt** durch das Framework. -* Alle AbhĂ€ngigkeiten können Daten von Requests anfordern und das Verhalten von **Pfadoperationen** und der automatisierten Dokumentation **modifizieren**. +* Alle AbhĂ€ngigkeiten können Daten von Requests anfordern und die EinschrĂ€nkungen der **Pfadoperationen** sowie die automatische Dokumentation **erweitern**. * **Automatische Validierung** selbst fĂŒr solche Parameter von *Pfadoperationen*, welche in AbhĂ€ngigkeiten definiert sind. -* UnterstĂŒtzung fĂŒr komplexe Authentifizierungssysteme, **Datenbankverbindungen**, usw. +* UnterstĂŒtzung fĂŒr komplexe Benutzerauthentifizierungssysteme, **Datenbankverbindungen**, usw. * **Keine Kompromisse** bei Datenbanken, Frontends, usw., sondern einfache Integration mit allen. -### Unbegrenzte Erweiterungen { #unlimited-plug-ins } +### Unbegrenzte „Plug-ins“ { #unlimited-plug-ins } Oder mit anderen Worten, sie werden nicht benötigt. Importieren und nutzen Sie den Code, den Sie brauchen. -Jede Integration wurde so entworfen, dass sie so einfach zu nutzen ist (mit AbhĂ€ngigkeiten), dass Sie eine Erweiterung fĂŒr Ihre Anwendung mit nur zwei Zeilen Code erstellen können. Hierbei nutzen Sie die gleiche Struktur und Syntax, wie bei *Pfadoperationen*. +Jede Integration wurde so entworfen, dass sie so einfach zu nutzen ist (mit AbhĂ€ngigkeiten), dass Sie ein „Plug-in“ fĂŒr Ihre Anwendung mit nur 2 Zeilen Code erstellen können. Hierbei nutzen Sie die gleiche Struktur und Syntax, wie bei *Pfadoperationen*. ### Getestet { #tested } * 100 % Testabdeckung. -* 100 % Typen annotiert. +* Zu 100 % typannotierte Codebasis. * Verwendet in Produktionsanwendungen. -## Starlette Merkmale { #starlette-features } +## Starlette-Merkmale { #starlette-features } -**FastAPI** ist vollkommen kompatibel (und basiert auf) [**Starlette**](https://www.starlette.dev/). Das bedeutet, wenn Sie eigenen Starlette Quellcode haben, funktioniert der. +**FastAPI** ist vollkommen kompatibel (und basiert auf) [**Starlette**](https://www.starlette.dev/). Das bedeutet, wenn Sie eigenen Starlette-Quellcode haben, funktioniert dieser auch. `FastAPI` ist tatsĂ€chlich eine Unterklasse von `Starlette`. Wenn Sie also bereits Starlette kennen oder benutzen, das meiste funktioniert genau so. @@ -173,11 +173,11 @@ Mit **FastAPI** bekommen Sie alles von **Starlette** (da FastAPI nur Starlette a * **CORS**, GZip, statische Dateien, Responses streamen. * **Sitzungs- und Cookie**-UnterstĂŒtzung. * 100 % Testabdeckung. -* 100 % Typen annotierte Codebasis. +* Zu 100 % typannotierte Codebasis. -## Pydantic Merkmale { #pydantic-features } +## Pydantic-Merkmale { #pydantic-features } -**FastAPI** ist vollkommen kompatibel (und basiert auf) [**Pydantic**](https://docs.pydantic.dev/). Das bedeutet, wenn Sie eigenen Pydantic Quellcode haben, funktioniert der. +**FastAPI** ist vollkommen kompatibel (und basiert auf) [**Pydantic**](https://docs.pydantic.dev/). Das bedeutet, wenn Sie eigenen Pydantic-Quellcode haben, funktioniert dieser auch. Inklusive externer Bibliotheken, die auf Pydantic basieren, wie ORMs, ODMs fĂŒr Datenbanken. @@ -188,14 +188,14 @@ Das gleiche gilt auch fĂŒr die andere Richtung: Sie können in vielen FĂ€llen da Mit **FastAPI** bekommen Sie alle Funktionen von **Pydantic** (da FastAPI fĂŒr die gesamte Datenverarbeitung Pydantic nutzt): * **Kein Kopfzerbrechen**: - * Keine neue Schemadefinition-Mikrosprache zu lernen. + * Keine neue Schemadefinitions-Mikrosprache zu lernen. * Wenn Sie Pythons Typen kennen, wissen Sie, wie man Pydantic verwendet. * Gutes Zusammenspiel mit Ihrer/Ihrem **IDE/Linter/Gehirn**: * Weil Pydantics Datenstrukturen einfach nur Instanzen ihrer definierten Klassen sind; AutovervollstĂ€ndigung, Linting, mypy und Ihre Intuition sollten alle einwandfrei mit Ihren validierten Daten funktionieren. * Validierung von **komplexen Strukturen**: - * Benutzung von hierarchischen Pydantic-Modellen, Python-`typing`s `List` und `Dict`, etc. - * Die Validierer erlauben es, komplexe Datenschemen klar und einfach zu definieren, ĂŒberprĂŒft und dokumentiert als JSON Schema. - * Sie können tief **verschachtelte JSON** Objekte haben, die alle validiert und annotiert sind. + * Benutzung von hierarchischen Pydantic-Modellen, Python-`typing`s `List` und `Dict`, usw. + * Die Validierer erlauben es, komplexe Datenschemas klar und einfach zu definieren, ĂŒberprĂŒft und dokumentiert als JSON Schema. + * Sie können tief **verschachtelte JSON**-Objekte haben, die alle validiert und annotiert sind. * **Erweiterbar**: - * Pydantic erlaubt die Definition von eigenen Datentypen oder sie können die Validierung mit einer `validator`-dekorierten Methode im Modell erweitern. + * Pydantic erlaubt die Definition von eigenen Datentypen oder Sie können die Validierung mit Methoden in einem Modell erweitern, die mit dem Validator-Dekorator dekoriert sind. * 100 % Testabdeckung. diff --git a/docs/de/docs/help-fastapi.md b/docs/de/docs/help-fastapi.md index 83d015739..4a8687562 100644 --- a/docs/de/docs/help-fastapi.md +++ b/docs/de/docs/help-fastapi.md @@ -1,5 +1,6 @@ # Helfen { #help } + Möchten Sie FastAPI helfen oder Hilfe zu FastAPI erhalten? Es gibt sehr einfache Möglichkeiten, zu helfen und Hilfe zu bekommen. diff --git a/docs/de/docs/how-to/configure-swagger-ui.md b/docs/de/docs/how-to/configure-swagger-ui.md index 2f8904be7..d25062615 100644 --- a/docs/de/docs/how-to/configure-swagger-ui.md +++ b/docs/de/docs/how-to/configure-swagger-ui.md @@ -67,4 +67,4 @@ presets: [ Dabei handelt es sich um **JavaScript**-Objekte, nicht um Strings, daher können Sie diese nicht direkt vom Python-Code aus ĂŒbergeben. -Wenn Sie solche JavaScript-Konfigurationen verwenden mĂŒssen, können Sie einen der frĂŒher genannten Wege verwenden. Überschreiben Sie alle *Pfadoperationen* der Swagger-OberflĂ€che und schreiben Sie manuell jedes benötigte JavaScript. +Wenn Sie solche Nur-JavaScript-Konfigurationen verwenden mĂŒssen, können Sie einen der frĂŒher genannten Wege verwenden. Überschreiben Sie die gesamte *Pfadoperation* der Swagger-OberflĂ€che und schreiben Sie manuell jedes benötigte JavaScript. diff --git a/docs/de/docs/how-to/custom-request-and-route.md b/docs/de/docs/how-to/custom-request-and-route.md index 5e2dee95d..60fe71ed3 100644 --- a/docs/de/docs/how-to/custom-request-and-route.md +++ b/docs/de/docs/how-to/custom-request-and-route.md @@ -1,5 +1,6 @@ # Benutzerdefinierte Request- und APIRoute-Klasse { #custom-request-and-apiroute-class } + In einigen FĂ€llen möchten Sie möglicherweise die von den Klassen `Request` und `APIRoute` verwendete Logik ĂŒberschreiben. Das kann insbesondere eine gute Alternative zur Logik in einer Middleware sein. diff --git a/docs/de/docs/how-to/graphql.md b/docs/de/docs/how-to/graphql.md index bf1490f70..cb1891b63 100644 --- a/docs/de/docs/how-to/graphql.md +++ b/docs/de/docs/how-to/graphql.md @@ -1,5 +1,6 @@ # GraphQL { #graphql } + Da **FastAPI** auf dem **ASGI**-Standard basiert, ist es sehr einfach, jede **GraphQL**-Bibliothek zu integrieren, die auch mit ASGI kompatibel ist. Sie können normale FastAPI-*Pfadoperationen* mit GraphQL in derselben Anwendung kombinieren. diff --git a/docs/de/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/de/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md index c252b3e0f..5ea3b9561 100644 --- a/docs/de/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md +++ b/docs/de/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -8,6 +8,8 @@ FastAPI Version 0.119.0 fĂŒhrte eine teilweise UnterstĂŒtzung fĂŒr Pydantic v1 i FastAPI 0.126.0 entfernte die UnterstĂŒtzung fĂŒr Pydantic v1, wĂ€hrend `pydantic.v1` noch eine Weile unterstĂŒtzt wurde. +FastAPI 0.128.0 entfernte ebenfalls die UnterstĂŒtzung fĂŒr `pydantic.v1`, daher erfordern die neuesten Versionen von FastAPI Pydantic v2. + /// warning | Achtung Das Pydantic-Team hat die UnterstĂŒtzung fĂŒr Pydantic v1 in den neuesten Python-Versionen eingestellt, beginnend mit **Python 3.14**. @@ -54,6 +56,16 @@ Das bedeutet, Sie können die neueste Version von Pydantic v2 installieren und d ### FastAPI-UnterstĂŒtzung fĂŒr Pydantic v1 in v2 { #fastapi-support-for-pydantic-v1-in-v2 } +/// warning | Achtung + +Diese FastAPI-UnterstĂŒtzung fĂŒr `pydantic.v1`-Modelle wurde in **FastAPI 0.119.0** hinzugefĂŒgt und in **FastAPI 0.128.0** entfernt. Sie war als temporĂ€re Hilfe fĂŒr die Migration zu Pydantic v2 gedacht. + +In aktuellen Versionen von FastAPI löst die Verwendung eines `pydantic.v1`-Modells in Ihrer App einen Fehler aus. + +Der Rest dieses Abschnitts beschreibt die temporĂ€re UnterstĂŒtzung, die nur in diesen Ă€lteren Versionen verfĂŒgbar ist. + +/// + Seit FastAPI 0.119.0 gibt es außerdem eine teilweise UnterstĂŒtzung fĂŒr Pydantic v1 innerhalb von Pydantic v2, um die Migration auf v2 zu erleichtern. Sie könnten also Pydantic auf die neueste Version 2 aktualisieren und die Importe so Ă€ndern, dass das Untermodul `pydantic.v1` verwendet wird, und in vielen FĂ€llen wĂŒrde es einfach funktionieren. @@ -122,6 +134,12 @@ Wenn Sie einige der FastAPI-spezifischen Tools fĂŒr Parameter wie `Body`, `Query ### In Schritten migrieren { #migrate-in-steps } +/// warning | Achtung + +Die unten beschriebene schrittweise Migration mit sowohl Pydantic‑v1‑ als auch Pydantic‑v2‑Modellen in derselben App funktioniert nur in **FastAPI 0.119.0 bis 0.127.x**. Sie wurde in **FastAPI 0.128.0** entfernt, die neuesten Versionen erfordern **Pydantic‑v2**-Modelle. + +/// + /// tip | Tipp Probieren Sie zuerst `bump-pydantic` aus. Wenn Ihre Tests erfolgreich sind und das funktioniert, sind Sie mit einem einzigen Befehl fertig. ✹ diff --git a/docs/de/docs/how-to/separate-openapi-schemas.md b/docs/de/docs/how-to/separate-openapi-schemas.md index 3752ffb10..ae1df6176 100644 --- a/docs/de/docs/how-to/separate-openapi-schemas.md +++ b/docs/de/docs/how-to/separate-openapi-schemas.md @@ -1,5 +1,6 @@ # Separate OpenAPI-Schemas fĂŒr Eingabe und Ausgabe oder nicht { #separate-openapi-schemas-for-input-and-output-or-not } + Seit der Veröffentlichung von **Pydantic v2** ist die generierte OpenAPI etwas genauer und **korrekter** als zuvor. 😎 TatsĂ€chlich gibt es in einigen FĂ€llen sogar **zwei JSON-Schemas** in OpenAPI fĂŒr dasselbe Pydantic-Modell, fĂŒr Eingabe und Ausgabe, je nachdem, ob sie **Defaultwerte** haben. diff --git a/docs/de/docs/index.md b/docs/de/docs/index.md index 32fe63ca8..9922e7621 100644 --- a/docs/de/docs/index.md +++ b/docs/de/docs/index.md @@ -167,7 +167,7 @@ Es gibt einen [FastAPI-Mini-Dokumentarfilm](https://www.youtube.com/watch?v=mpR8 -Wenn Sie eine CLI-Anwendung fĂŒr das Terminal erstellen, anstelle einer Web-API, schauen Sie sich [**Typer**](https://typer.tiangolo.com/) an. +Wenn Sie eine CLI-Anwendung fĂŒr das Terminal erstellen, anstelle einer Web-API, schauen Sie sich [**Typer**](https://typer.tiangolo.com/) an. **Typer** ist die kleine Schwester von FastAPI. Und es soll das **FastAPI der CLIs** sein. ⌚ 🚀 diff --git a/docs/de/docs/project-generation.md b/docs/de/docs/project-generation.md index fd754906a..d2dbadbc9 100644 --- a/docs/de/docs/project-generation.md +++ b/docs/de/docs/project-generation.md @@ -17,7 +17,7 @@ GitHub-Repository: [Full Stack FastAPI Template](https://github.com/tiangolo/ful - 🎹 [Tailwind CSS](https://tailwindcss.com) und [shadcn/ui](https://ui.shadcn.com) fĂŒr die Frontend-Komponenten. - đŸ€– Ein automatisch generierter Frontend-Client. - đŸ§Ș [Playwright](https://playwright.dev) fĂŒr End-to-End-Tests. - - 🩇 „Dark-Mode“-UnterstĂŒtzung. + - 🩇 Dark-Mode-UnterstĂŒtzung. - 🐋 [Docker Compose](https://www.docker.com) fĂŒr Entwicklung und Produktion. - 🔒 Sicheres Passwort-Hashing standardmĂ€ĂŸig. - 🔑 JWT (JSON Web Token)-Authentifizierung. diff --git a/docs/de/docs/python-types.md b/docs/de/docs/python-types.md index aee30fc2f..a67b8b309 100644 --- a/docs/de/docs/python-types.md +++ b/docs/de/docs/python-types.md @@ -44,7 +44,7 @@ Es ist ein sehr einfaches Programm. Aber nun stellen Sie sich vor, Sie wĂŒrden es selbst schreiben. -Irgendwann sind die Funktions-Parameter fertig, Sie starten mit der Definition des Körpers ... +Irgendwann beginnen Sie, die Funktion zu definieren, und haben die Parameter bereit ... Aber dann mĂŒssen Sie „diese Methode aufrufen, die den ersten Buchstaben in Großbuchstaben umwandelt“. @@ -52,7 +52,7 @@ War es `upper`? War es `uppercase`? `first_uppercase`? `capitalize`? Dann versuchen Sie es mit dem langjĂ€hrigen Freund des Programmierers, der Editor-AutovervollstĂ€ndigung. -Sie geben den ersten Parameter der Funktion ein, `first_name`, dann einen Punkt (`.`) und drĂŒcken `Strg+Leertaste`, um die VervollstĂ€ndigung auszulösen. +Sie geben den ersten Parameter der Funktion ein, `first_name`, dann einen Punkt (`.`) und drĂŒcken `Ctrl+Space`, um die VervollstĂ€ndigung auszulösen. Aber leider erhalten Sie nichts NĂŒtzliches: @@ -62,7 +62,7 @@ Aber leider erhalten Sie nichts NĂŒtzliches: Lassen Sie uns eine einzelne Zeile aus der vorherigen Version Ă€ndern. -Wir Ă€ndern den folgenden Teil, die Parameter der Funktion, von: +Wir Ă€ndern genau dieses Fragment, die Parameter der Funktion, von: ```Python first_name, last_name @@ -94,7 +94,7 @@ Und das HinzufĂŒgen von Typhinweisen Ă€ndert normalerweise nichts an dem, was oh Aber jetzt stellen Sie sich vor, Sie sind wieder mitten in der Erstellung dieser Funktion, aber mit Typhinweisen. -An derselben Stelle versuchen Sie, die AutovervollstĂ€ndigung mit „Strg+Leertaste“ auszulösen, und Sie sehen: +An derselben Stelle versuchen Sie, die AutovervollstĂ€ndigung mit `Ctrl+Space` auszulösen, und Sie sehen: @@ -116,7 +116,7 @@ Jetzt, da Sie wissen, dass Sie das reparieren mĂŒssen, konvertieren Sie `age` mi {* ../../docs_src/python_types/tutorial004_py310.py hl[2] *} -## Deklarieren von Typen { #declaring-types } +## Typen deklarieren { #declaring-types } Sie haben gerade den Haupt-Einsatzort fĂŒr die Deklaration von Typhinweisen gesehen. Als Funktionsparameter. @@ -180,7 +180,7 @@ In diesem Fall ist `str` der Typ-Parameter, der an `list` ĂŒbergeben wird. /// -Das bedeutet: Die Variable `items` ist eine Liste – `list` – und jedes der Elemente in dieser Liste ist ein String – `str`. +Das bedeutet: „Die Variable `items` ist eine `list`, und jedes der Elemente in dieser Liste ist ein `str`“. Auf diese Weise kann Ihr Editor Sie auch bei der Bearbeitung von EintrĂ€gen aus der Liste unterstĂŒtzen: @@ -263,9 +263,9 @@ Und wiederum bekommen Sie die volle Editor-UnterstĂŒtzung: -Beachten Sie, das bedeutet: „`one_person` ist eine **Instanz** der Klasse `Person`“. +Beachten Sie, dass das bedeutet: „`one_person` ist eine **Instanz** der Klasse `Person`“. -Es bedeutet nicht: „`one_person` ist die **Klasse** genannt `Person`“. +Es bedeutet nicht: „`one_person` ist die **Klasse** namens `Person`“. ## Pydantic-Modelle { #pydantic-models } @@ -279,7 +279,7 @@ Dann erzeugen Sie eine Instanz dieser Klasse mit einigen Werten, und Pydantic va Und Sie erhalten volle Editor-UnterstĂŒtzung fĂŒr dieses Objekt. -Ein Beispiel aus der offiziellen Pydantic Dokumentation: +Ein Beispiel aus der offiziellen Pydantic-Dokumentation: {* ../../docs_src/python_types/tutorial011_py310.py *} @@ -301,11 +301,11 @@ Sie können `Annotated` von `typing` importieren. {* ../../docs_src/python_types/tutorial013_py310.py hl[1,4] *} -Python selbst macht nichts mit `Annotated`. FĂŒr Editoren und andere Tools ist der Typ immer noch `str`. +Python selbst macht nichts mit diesem `Annotated`. FĂŒr Editoren und andere Tools ist der Typ immer noch `str`. -Aber Sie können `Annotated` nutzen, um **FastAPI** mit Metadaten zu versorgen, die ihm sagen, wie sich Ihre Anwendung verhalten soll. +Aber Sie können diesen Platz in `Annotated` nutzen, um **FastAPI** zusĂ€tzliche Metadaten darĂŒber bereitzustellen, wie sich Ihre Anwendung verhalten soll. -Wichtig ist, dass **der erste *Typ-Parameter***, den Sie `Annotated` ĂŒbergeben, der **tatsĂ€chliche Typ** ist. Der Rest sind Metadaten fĂŒr andere Tools. +Wichtig ist, dass **der erste *Typ-Parameter***, den Sie `Annotated` ĂŒbergeben, der **tatsĂ€chliche Typ** ist. Der Rest sind nur Metadaten fĂŒr andere Tools. Im Moment mĂŒssen Sie nur wissen, dass `Annotated` existiert, und dass es Standard-Python ist. 😎 @@ -335,7 +335,7 @@ Mit **FastAPI** deklarieren Sie Parameter mit Typhinweisen, und Sie erhalten: * **Daten zu validieren**: aus jedem Request: * **Automatische Fehler** generieren, die an den Client zurĂŒckgegeben werden, wenn die Daten ungĂŒltig sind. * Die API mit OpenAPI zu **dokumentieren**: - * Die dann von den BenutzeroberflĂ€chen der automatisch generierten interaktiven Dokumentation verwendet wird. + * die dann von den BenutzeroberflĂ€chen der automatisch generierten interaktiven Dokumentation verwendet wird. Das mag alles abstrakt klingen. Machen Sie sich keine Sorgen. Sie werden all das in Aktion sehen im [Tutorial – Benutzerhandbuch](tutorial/index.md). diff --git a/docs/de/docs/tutorial/bigger-applications.md b/docs/de/docs/tutorial/bigger-applications.md index d119bb019..119f3e8c0 100644 --- a/docs/de/docs/tutorial/bigger-applications.md +++ b/docs/de/docs/tutorial/bigger-applications.md @@ -17,16 +17,16 @@ Nehmen wir an, Sie haben eine Dateistruktur wie diese: ``` . ├── app -│   ├── __init__.py -│   ├── main.py -│   ├── dependencies.py -│   └── routers -│   │ ├── __init__.py -│   │ ├── items.py -│   │ └── users.py -│   └── internal -│   ├── __init__.py -│   └── admin.py +│ ├── __init__.py +│ ├── main.py +│ ├── dependencies.py +│ └── routers +│ │ ├── __init__.py +│ │ ├── items.py +│ │ └── users.py +│ └── internal +│ ├── __init__.py +│ └── admin.py ``` /// tip | Tipp diff --git a/docs/de/docs/tutorial/body-nested-models.md b/docs/de/docs/tutorial/body-nested-models.md index 0c5e84de2..f95b65e57 100644 --- a/docs/de/docs/tutorial/body-nested-models.md +++ b/docs/de/docs/tutorial/body-nested-models.md @@ -4,7 +4,7 @@ Mit **FastAPI** können Sie (dank Pydantic) beliebig tief verschachtelte Modelle ## Listen als Felder { #list-fields } -Sie können ein Attribut als Kindtyp definieren, zum Beispiel eine Python-`list`. +Sie können ein Attribut als Kindtyp definieren. Zum Beispiel eine Python-`list`: {* ../../docs_src/body_nested_models/tutorial001_py310.py hl[12] *} @@ -12,11 +12,12 @@ Das bewirkt, dass `tags` eine Liste ist, wenngleich es nichts ĂŒber den Typ der ## Listen mit Typ-Parametern als Felder { #list-fields-with-type-parameter } -Aber Python erlaubt es, Listen mit inneren Typen, auch „Typ-Parameter“ genannt, zu deklarieren. +Aber Python hat eine spezifische Möglichkeit, Listen mit inneren Typen, auch „Typ-Parameter“ genannt, zu deklarieren: ### Eine `list` mit einem Typ-Parameter deklarieren { #declare-a-list-with-a-type-parameter } -Um Typen zu deklarieren, die Typ-Parameter (innere Typen) haben, wie `list`, `dict`, `tuple`, ĂŒbergeben Sie den/die inneren Typ(en) als „Typ-Parameter“ in eckigen Klammern: `[` und `]` +Um Typen zu deklarieren, die Typ-Parameter (innere Typen) haben, wie `list`, `dict`, `tuple`, +ĂŒbergeben Sie den/die inneren Typ(en) als „Typ-Parameter“ in eckigen Klammern: `[` und `]` ```Python my_list: list[str] @@ -32,19 +33,19 @@ In unserem Beispiel können wir also bewirken, dass `tags` spezifisch eine „Li ## Set-Typen { #set-types } -Aber dann denken wir darĂŒber nach und stellen fest, dass sich die Tags nicht wiederholen sollen, es sollen eindeutige Strings sein. +Aber dann denken wir darĂŒber nach und stellen fest, dass sich die Tags nicht wiederholen sollten, sie wĂ€ren wahrscheinlich eindeutige Strings. -Python hat einen Datentyp speziell fĂŒr Mengen eindeutiger Dinge: das `set`. +Und Python hat einen speziellen Datentyp fĂŒr Mengen eindeutiger Elemente, das `set`. -Deklarieren wir also `tags` als Set von Strings. +Dann können wir `tags` als Set von Strings deklarieren: {* ../../docs_src/body_nested_models/tutorial003_py310.py hl[12] *} -Jetzt, selbst wenn Sie einen Request mit duplizierten Daten erhalten, werden diese zu einem Set eindeutiger Dinge konvertiert. +Damit wird, selbst wenn Sie einen Request mit duplizierten Daten erhalten, dieser zu einem Set eindeutiger Elemente konvertiert. -Und wann immer Sie diese Daten ausgeben, selbst wenn die Quelle Duplikate hatte, wird es als Set von eindeutigen Dingen ausgegeben. +Und wann immer Sie diese Daten ausgeben, selbst wenn die Quelle Duplikate hatte, wird es als Set von eindeutigen Elementen ausgegeben. -Und es wird entsprechend annotiert/dokumentiert. +Und es wird entsprechend annotiert / dokumentiert. ## Verschachtelte Modelle { #nested-models } @@ -52,13 +53,13 @@ Jedes Attribut eines Pydantic-Modells hat einen Typ. Aber dieser Typ kann selbst ein anderes Pydantic-Modell sein. -Sie können also tief verschachtelte JSON-„Objekte“ deklarieren, mit spezifischen Attributnamen, -typen, und -validierungen. +Sie können also tief verschachtelte JSON-„Objekte“ deklarieren, mit spezifischen Attributnamen, Typen und Validierungen. Alles das beliebig tief verschachtelt. ### Ein Kindmodell definieren { #define-a-submodel } -FĂŒr ein Beispiel können wir ein `Image`-Modell definieren. +Zum Beispiel können wir ein `Image`-Modell definieren: {* ../../docs_src/body_nested_models/tutorial004_py310.py hl[7:9] *} @@ -68,7 +69,7 @@ Und dann können wir es als Typ eines Attributes verwenden: {* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *} -Das wĂŒrde bedeuten, dass **FastAPI** einen Body wie folgt erwartet: +Das wĂŒrde bedeuten, dass **FastAPI** einen Body Ă€hnlich dem folgenden erwartet: ```JSON { @@ -84,7 +85,7 @@ Das wĂŒrde bedeuten, dass **FastAPI** einen Body wie folgt erwartet: } ``` -Wiederum, nur mit dieser Deklaration erhalten Sie von **FastAPI**: +Wiederum, nur mit dieser Deklaration erhalten Sie mit **FastAPI**: * Editor-UnterstĂŒtzung (CodevervollstĂ€ndigung, usw.), selbst fĂŒr verschachtelte Modelle * Datenkonvertierung @@ -105,7 +106,7 @@ Es wird getestet, ob der String eine gĂŒltige URL ist, und als solche wird er in ## Attribute mit Listen von Kindmodellen { #attributes-with-lists-of-submodels } -Sie können Pydantic-Modelle auch als Typen innerhalb von `list`, `set`, usw. verwenden: +Sie können Pydantic-Modelle auch als Kindtypen von `list`, `set`, usw. verwenden: {* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *} @@ -149,13 +150,13 @@ Sie können beliebig tief verschachtelte Modelle definieren: /// note | Hinweis -Beachten Sie, wie `Offer` eine Liste von `Item`s hat, die ihrerseits eine optionale Liste von `Image`s haben. +Beachten Sie, wie `Offer` eine Liste von `Item`s hat, die ihrerseits eine optionale Liste von `Image`s haben /// ## Bodys aus reinen Listen { #bodies-of-pure-lists } -Wenn das Ă€ußerste Element des JSON-Bodys, das Sie erwarten, ein JSON-`array` (eine Python-`list`) ist, können Sie den Typ im Funktionsparameter deklarieren, mit der gleichen Syntax wie in Pydantic-Modellen: +Wenn der Wert auf oberster Ebene des JSON-Bodys, den Sie erwarten, ein JSON-`array` (eine Python-`list`) ist, können Sie den Typ im Parameter der Funktion deklarieren, genau wie in Pydantic-Modellen: ```Python images: list[Image] @@ -169,29 +170,29 @@ so wie in: Und Sie erhalten Editor-UnterstĂŒtzung ĂŒberall. -Selbst fĂŒr Dinge in Listen: +Selbst fĂŒr Elemente innerhalb von Listen: -Sie wĂŒrden diese Editor-UnterstĂŒtzung nicht erhalten, wenn Sie direkt mit `dict`, statt mit Pydantic-Modellen arbeiten wĂŒrden. +Sie wĂŒrden diese Art von Editor-UnterstĂŒtzung nicht erhalten, wenn Sie direkt mit `dict`, statt mit Pydantic-Modellen arbeiten wĂŒrden. -Aber Sie mĂŒssen sich auch nicht weiter um die Modelle kĂŒmmern, hereinkommende Dicts werden automatisch in sie konvertiert. Und was Sie zurĂŒckgeben, wird automatisch nach JSON konvertiert. +Aber Sie mĂŒssen sich auch nicht um diese kĂŒmmern, hereinkommende Dicts werden automatisch konvertiert und Ihre Ausgabe wird ebenfalls automatisch nach JSON konvertiert. ## Bodys mit beliebigen `dict`s { #bodies-of-arbitrary-dicts } Sie können einen Body auch als `dict` deklarieren, mit SchlĂŒsseln eines Typs und Werten eines anderen Typs. -So brauchen Sie vorher nicht zu wissen, wie die Feld-/Attributnamen lauten (wie es bei Pydantic-Modellen der Fall wĂ€re). +So brauchen Sie vorher nicht zu wissen, wie die gĂŒltigen Feld-/Attributnamen lauten (wie es bei Pydantic-Modellen der Fall wĂ€re). -Das ist nĂŒtzlich, wenn Sie SchlĂŒssel empfangen, deren Namen Sie nicht bereits kennen. +Das ist nĂŒtzlich, wenn Sie SchlĂŒssel empfangen wollen, die Sie nicht bereits kennen. --- Ein anderer nĂŒtzlicher Anwendungsfall ist, wenn Sie SchlĂŒssel eines anderen Typs haben wollen, z. B. `int`. -Das schauen wir uns mal an. +Das schauen wir uns hier an. -Im folgenden Beispiel akzeptieren Sie irgendein `dict`, solange es `int`-SchlĂŒssel und `float`-Werte hat: +In diesem Fall akzeptieren Sie irgendein `dict`, solange es `int`-SchlĂŒssel mit `float`-Werten hat: {* ../../docs_src/body_nested_models/tutorial009_py310.py hl[7] *} @@ -201,9 +202,9 @@ Bedenken Sie, dass JSON nur `str` als SchlĂŒssel unterstĂŒtzt. Aber Pydantic hat automatische Datenkonvertierung. -Das bedeutet, dass Ihre API-Clients nur Strings senden können, aber solange diese Strings nur Zahlen enthalten, wird Pydantic sie konvertieren und validieren. +Das bedeutet, dass Ihre API-Clients zwar nur Strings als SchlĂŒssel senden können, Pydantic diese aber konvertieren und validieren wird, solange diese Strings nur Ganzzahlen enthalten. -Und das `dict`, welches Sie als `weights` erhalten, wird `int`-SchlĂŒssel und `float`-Werte haben. +Und das `dict`, welches Sie als `weights` erhalten, wird tatsĂ€chlich `int`-SchlĂŒssel und `float`-Werte haben. /// @@ -213,8 +214,8 @@ Mit **FastAPI** haben Sie die maximale FlexibilitĂ€t von Pydantic-Modellen, wĂ€h Aber mit all den VorzĂŒgen: -* Editor-UnterstĂŒtzung (CodevervollstĂ€ndigung ĂŒberall) -* Datenkonvertierung (auch bekannt als Parsen, Serialisierung) +* Editor-UnterstĂŒtzung (CodevervollstĂ€ndigung ĂŒberall!) +* Datenkonvertierung (auch bekannt als Parsen / Serialisierung) * Datenvalidierung * Schema-Dokumentation * Automatische Dokumentation diff --git a/docs/de/docs/tutorial/body.md b/docs/de/docs/tutorial/body.md index 656b55c63..6ced5f732 100644 --- a/docs/de/docs/tutorial/body.md +++ b/docs/de/docs/tutorial/body.md @@ -14,7 +14,7 @@ Um Daten zu senden, sollten Sie eines von: `POST` (meistverwendet), `PUT`, `DELE Das Senden eines Bodys mit einem `GET`-Request hat ein undefiniertes Verhalten in den Spezifikationen, wird aber dennoch von FastAPI unterstĂŒtzt, nur fĂŒr sehr komplexe/extreme AnwendungsfĂ€lle. -Da davon abgeraten wird, zeigt die interaktive Dokumentation mit Swagger-BenutzeroberflĂ€che die Dokumentation fĂŒr den Body nicht an, wenn `GET` verwendet wird, und zwischengeschaltete Proxys unterstĂŒtzen es möglicherweise nicht. +Da davon abgeraten wird, zeigt die interaktive Dokumentation mit Swagger UI die Dokumentation fĂŒr den Body nicht an, wenn `GET` verwendet wird, und zwischengeschaltete Proxys unterstĂŒtzen es möglicherweise nicht. /// @@ -32,6 +32,7 @@ Verwenden Sie Standard-Python-Typen fĂŒr alle Attribute: {* ../../docs_src/body/tutorial001_py310.py hl[5:9] *} + Wie auch bei der Deklaration von Query-Parametern gilt: Wenn ein Modellattribut einen Defaultwert hat, ist das Attribut nicht erforderlich. Andernfalls ist es erforderlich. Verwenden Sie `None`, um es einfach optional zu machen. Zum Beispiel deklariert das obige Modell ein JSON „`object`“ (oder Python-`dict`) wie dieses: @@ -45,7 +46,7 @@ Zum Beispiel deklariert das obige Modell ein JSON „`object`“ (oder Python-zusĂ€tzliche Schritte nach Abschluss ausfĂŒhren. -Verwenden Sie dazu `yield` statt `return` und schreiben Sie die zusĂ€tzlichen Schritte / den zusĂ€tzlichen Code danach. +Verwenden Sie dazu `yield` statt `return` und schreiben Sie die zusĂ€tzlichen Schritte (Code) danach. /// tip | Tipp @@ -77,7 +77,7 @@ Und wiederum benötigt `dependency_b` den Wert von `dependency_a` (hier `dep_a` {* ../../docs_src/dependencies/tutorial008_an_py310.py hl[18:19,26:27] *} -Auf die gleiche Weise könnten Sie einige AbhĂ€ngigkeiten mit `yield` und einige andere AbhĂ€ngigkeiten mit `return` haben, und alle können beliebig voneinander abhĂ€ngen. +Auf die gleiche Weise könnten Sie einige AbhĂ€ngigkeiten mit `yield` und einige andere AbhĂ€ngigkeiten mit `return` haben, und einige davon von einigen der anderen abhĂ€ngen lassen. Und Sie könnten eine einzelne AbhĂ€ngigkeit haben, die auf mehreren ge`yield`eten AbhĂ€ngigkeiten basiert, usw. @@ -234,6 +234,7 @@ participant operation as Pfadoperation AbhĂ€ngigkeiten mit `yield` haben sich im Laufe der Zeit weiterentwickelt, um verschiedene AnwendungsfĂ€lle abzudecken und einige Probleme zu beheben. Wenn Sie sehen möchten, was sich in verschiedenen Versionen von FastAPI geĂ€ndert hat, lesen Sie mehr dazu im fortgeschrittenen Teil, unter [Fortgeschrittene AbhĂ€ngigkeiten – AbhĂ€ngigkeiten mit `yield`, `HTTPException`, `except` und Hintergrundtasks](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks). + ## Kontextmanager { #context-managers } ### Was sind „Kontextmanager“ { #what-are-context-managers } @@ -266,18 +267,19 @@ Wenn Sie gerade erst mit **FastAPI** beginnen, möchten Sie das vielleicht vorer In Python können Sie Kontextmanager erstellen, indem Sie [eine Klasse mit zwei Methoden erzeugen: `__enter__()` und `__exit__()`](https://docs.python.org/3/reference/datamodel.html#context-managers). -Sie können solche auch innerhalb von **FastAPI**-AbhĂ€ngigkeiten mit `yield` verwenden, indem Sie `with`- oder `async with`-Anweisungen innerhalb der AbhĂ€ngigkeits-Funktion verwenden: +Sie können solche auch innerhalb von **FastAPI**-AbhĂ€ngigkeiten mit `yield` verwenden, indem Sie +`with`- oder `async with`-Anweisungen innerhalb der AbhĂ€ngigkeits-Funktion verwenden: {* ../../docs_src/dependencies/tutorial010_py310.py hl[1:9,13] *} /// tip | Tipp -Andere Möglichkeiten, einen Kontextmanager zu erstellen, sind: +Eine weitere Möglichkeit, einen Kontextmanager zu erstellen, ist: * [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) oder * [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) -Verwenden Sie diese, um eine Funktion zu dekorieren, die ein einziges `yield` hat. +indem Sie damit eine Funktion dekorieren, die ein einziges `yield` hat. Das ist es auch, was **FastAPI** intern fĂŒr AbhĂ€ngigkeiten mit `yield` verwendet. diff --git a/docs/de/docs/tutorial/extra-data-types.md b/docs/de/docs/tutorial/extra-data-types.md index 92401172b..d1feab1a0 100644 --- a/docs/de/docs/tutorial/extra-data-types.md +++ b/docs/de/docs/tutorial/extra-data-types.md @@ -1,5 +1,6 @@ # ZusĂ€tzliche Datentypen { #extra-data-types } + Bisher haben Sie gĂ€ngige Datentypen verwendet, wie zum Beispiel: * `int` diff --git a/docs/de/docs/tutorial/extra-models.md b/docs/de/docs/tutorial/extra-models.md index 59580d73a..8e0b094ad 100644 --- a/docs/de/docs/tutorial/extra-models.md +++ b/docs/de/docs/tutorial/extra-models.md @@ -63,7 +63,7 @@ wĂŒrden wir ein Python-`dict` erhalten mit: #### Ein `dict` entpacken { #unpacking-a-dict } -Wenn wir ein `dict` wie `user_dict` nehmen und es einer Funktion (oder Klasse) mit `**user_dict` ĂŒbergeben, wird Python es „entpacken“. Es wird die SchlĂŒssel und Werte von `user_dict` direkt als SchlĂŒsselwort-Argumente ĂŒbergeben. +Wenn wir ein `dict` wie `user_dict` nehmen und es einer Funktion (oder Klasse) mit `**user_dict` ĂŒbergeben, wird Python es „entpacken“. Es wird die SchlĂŒssel und Werte von `user_dict` direkt als SchlĂŒssel-Wert-Argumente ĂŒbergeben. Setzen wir also das `user_dict` von oben ein: @@ -196,7 +196,7 @@ DafĂŒr verwenden Sie Pythons Standard-`list`: ## Response mit beliebigem `dict` { #response-with-arbitrary-dict } -Sie können auch eine Response deklarieren, die ein beliebiges `dict` zurĂŒckgibt, indem Sie nur die Typen der SchlĂŒssel und Werte ohne ein Pydantic-Modell deklarieren. +Sie können auch eine Response deklarieren, die ein einfaches beliebiges `dict` verwendet, indem Sie nur den Typ der SchlĂŒssel und Werte deklarieren, ohne ein Pydantic-Modell zu verwenden. Dies ist nĂŒtzlich, wenn Sie die gĂŒltigen Feld-/Attributnamen nicht im Voraus kennen (die fĂŒr ein Pydantic-Modell benötigt werden wĂŒrden). @@ -208,4 +208,4 @@ In diesem Fall können Sie `dict` verwenden: Verwenden Sie gerne mehrere Pydantic-Modelle und vererben Sie je nach Bedarf. -Sie brauchen kein einzelnes Datenmodell pro Einheit, wenn diese Einheit in der Lage sein muss, verschiedene „ZustĂ€nde“ zu haben. Wie im Fall der Benutzer-„Einheit“ mit einem Zustand einschließlich `password`, `password_hash` und ohne Passwort. +Sie brauchen kein einzelnes Datenmodell pro EntitĂ€t, wenn diese EntitĂ€t in der Lage sein muss, verschiedene „ZustĂ€nde“ zu haben. Die **Benutzer**-„EntitĂ€t“ ist ein Beispiel, mit ZustĂ€nden, die `password`, `password_hash` oder kein Passwort umfassen. diff --git a/docs/de/docs/tutorial/first-steps.md b/docs/de/docs/tutorial/first-steps.md index f605c5540..8e97b5b5d 100644 --- a/docs/de/docs/tutorial/first-steps.md +++ b/docs/de/docs/tutorial/first-steps.md @@ -236,7 +236,7 @@ Sie können alle [Starlette](https://www.starlette.dev/)-FunktionalitĂ€ten auch /// -### Schritt 2: Erzeugen einer `FastAPI`-„Instanz“ { #step-2-create-a-fastapi-instance } +### Schritt 2: Eine `FastAPI`-„Instanz“ erstellen { #step-2-create-a-fastapi-instance } {* ../../docs_src/first_steps/tutorial001_py310.py hl[3] *} @@ -244,7 +244,7 @@ In diesem Beispiel ist die Variable `app` eine „Instanz“ der Klasse `FastAPI Dies wird der Hauptinteraktionspunkt fĂŒr die Erstellung all Ihrer APIs sein. -### Schritt 3: Erstellen einer *Pfadoperation* { #step-3-create-a-path-operation } +### Schritt 3: Eine *Pfadoperation* erstellen { #step-3-create-a-path-operation } #### Pfad { #path } @@ -305,7 +305,7 @@ In OpenAPI wird folglich jede dieser HTTP-Methoden als „Operation“ bezeichne Wir werden sie auch „**Operationen**“ nennen. -#### Definieren eines *Pfadoperation-Dekorators* { #define-a-path-operation-decorator } +#### Einen *Pfadoperation-Dekorator* definieren { #define-a-path-operation-decorator } {* ../../docs_src/first_steps/tutorial001_py310.py hl[6] *} @@ -353,7 +353,7 @@ Wenn Sie beispielsweise GraphQL verwenden, fĂŒhren Sie normalerweise alle Aktion /// -### Schritt 4: Definieren der **Pfadoperation-Funktion** { #step-4-define-the-path-operation-function } +### Schritt 4: Die **Pfadoperation-Funktion** definieren { #step-4-define-the-path-operation-function } Das ist unsere „**Pfadoperation-Funktion**“: @@ -399,11 +399,11 @@ Stellen Sie Ihre App in der **[FastAPI Cloud](https://fastapicloud.com)** mit ei **[FastAPI Cloud](https://fastapicloud.com)** wird vom selben Autor und Team hinter **FastAPI** entwickelt. -Es vereinfacht den Prozess des Erstellens, Deployens und des Zugriffs auf eine API mit minimalem Aufwand. +Es vereinfacht den Prozess des **Erstellens**, **Deployens** und des **Zugriffs** auf eine API mit minimalem Aufwand. Es bringt die gleiche **Developer-Experience** beim Erstellen von Apps mit FastAPI auch zum **Deployment** in der Cloud. 🎉 -FastAPI Cloud ist der Hauptsponsor und Finanzierer der „FastAPI and friends“ Open-Source-Projekte. ✹ +FastAPI Cloud ist der Hauptsponsor und Finanzierer der *FastAPI and friends*-Open-Source-Projekte. ✹ #### Zu anderen Cloudanbietern deployen { #deploy-to-other-cloud-providers } @@ -414,7 +414,7 @@ Folgen Sie den Anleitungen Ihres Cloudanbieters, um dort FastAPI-Apps bereitzust ## Zusammenfassung { #recap } * Importieren Sie `FastAPI`. -* Erstellen Sie eine `app` Instanz. +* Erstellen Sie eine `app`-Instanz. * Schreiben Sie einen **Pfadoperation-Dekorator** unter Verwendung von Dekoratoren wie `@app.get("/")`. * Definieren Sie eine **Pfadoperation-Funktion**, zum Beispiel `def root(): ...`. * Starten Sie den Entwicklungsserver mit dem Befehl `fastapi dev`. diff --git a/docs/de/docs/tutorial/handling-errors.md b/docs/de/docs/tutorial/handling-errors.md index 261831a8e..17e2767fe 100644 --- a/docs/de/docs/tutorial/handling-errors.md +++ b/docs/de/docs/tutorial/handling-errors.md @@ -8,12 +8,12 @@ Sie könnten dem Client mitteilen mĂŒssen, dass: * Der Client nicht genĂŒgend Berechtigungen fĂŒr diese Operation hat. * Der Client keinen Zugriff auf diese Ressource hat. -* Die Ressource, auf die der Client versucht hat, zuzugreifen, nicht existiert. +* Das Item, auf das der Client versucht hat zuzugreifen, nicht existiert. * usw. In diesen FĂ€llen wĂŒrden Sie normalerweise einen **HTTP-Statuscode** im Bereich **400** (von 400 bis 499) zurĂŒckgeben. -Dies ist vergleichbar mit den HTTP-Statuscodes im Bereich 200 (von 200 bis 299). Diese „200“-Statuscodes bedeuten, dass der Request in irgendeiner Weise erfolgreich war. +Dies ist vergleichbar mit den HTTP-Statuscodes im Bereich 200 (von 200 bis 299). Diese „200“-Statuscodes bedeuten, dass der Request irgendwie ein „Erfolg“ war. Die Statuscodes im Bereich 400 bedeuten hingegen, dass es einen Fehler seitens des Clients gab. @@ -37,7 +37,7 @@ Das bedeutet auch, wenn Sie sich innerhalb einer Hilfsfunktion befinden, die Sie Der Vorteil des Auslösens einer Exception gegenĂŒber dem ZurĂŒckgeben eines Wertes wird im Abschnitt ĂŒber AbhĂ€ngigkeiten und Sicherheit deutlicher werden. -In diesem Beispiel lösen wir eine Exception mit einem Statuscode von `404` aus, wenn der Client einen Artikel mit einer nicht existierenden ID anfordert: +In diesem Beispiel lösen wir eine Exception mit einem Statuscode von `404` aus, wenn der Client ein Item mit einer nicht existierenden ID anfordert: {* ../../docs_src/handling_errors/tutorial001_py310.py hl[11] *} @@ -51,7 +51,7 @@ Wenn der Client `http://example.com/items/foo` anfordert (ein `item_id` `"foo"`) } ``` -Aber wenn der Client `http://example.com/items/bar` anfordert (ein nicht-existierendes `item_id` `"bar"`), erhĂ€lt er einen HTTP-Statuscode 404 (der „Not Found“-Error) und eine JSON-Response wie: +Aber wenn der Client `http://example.com/items/bar` anfordert (ein nicht-existierendes `item_id` `"bar"`), erhĂ€lt er einen HTTP-Statuscode 404 (der „not found“-Error) und eine JSON-Response wie: ```JSON { @@ -71,7 +71,7 @@ Diese werden von **FastAPI** automatisch gehandhabt und in JSON konvertiert. ## Benutzerdefinierte Header hinzufĂŒgen { #add-custom-headers } -Es gibt Situationen, in denen es nĂŒtzlich ist, dem HTTP-Error benutzerdefinierte Header hinzuzufĂŒgen. Zum Beispiel in einigen Sicherheitsszenarien. +Es gibt Situationen, in denen es nĂŒtzlich ist, dem HTTP-Error benutzerdefinierte Header hinzuzufĂŒgen. Zum Beispiel fĂŒr einige Arten von Sicherheit. Sie werden es wahrscheinlich nicht direkt in Ihrem Code verwenden mĂŒssen. @@ -117,7 +117,7 @@ Diese Handler sind dafĂŒr verantwortlich, die Default-JSON-Responses zurĂŒckzuge Sie können diese Exceptionhandler mit Ihren eigenen ĂŒberschreiben. -### Überschreiben von Request-Validierungs-Exceptions { #override-request-validation-exceptions } +### Request-Validierungs-Exceptions ĂŒberschreiben { #override-request-validation-exceptions } Wenn ein Request ungĂŒltige Daten enthĂ€lt, löst **FastAPI** intern einen `RequestValidationError` aus. @@ -153,7 +153,7 @@ Validation errors: Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to parse string as an integer ``` -### Überschreiben des `HTTPException`-Fehlerhandlers { #override-the-httpexception-error-handler } +### Den `HTTPException`-Fehlerhandler ĂŒberschreiben { #override-the-httpexception-error-handler } Auf die gleiche Weise können Sie den `HTTPException`-Handler ĂŒberschreiben. @@ -177,7 +177,7 @@ Das bedeutet aber auch, dass, wenn Sie ihn einfach in einen String umwandeln und /// -### Verwenden des `RequestValidationError`-Bodys { #use-the-requestvalidationerror-body } +### Den `RequestValidationError`-Body verwenden { #use-the-requestvalidationerror-body } Der `RequestValidationError` enthĂ€lt den empfangenen `body` mit den ungĂŒltigen Daten. @@ -185,7 +185,7 @@ Sie könnten diesen wĂ€hrend der Entwicklung Ihrer Anwendung verwenden, um den B {* ../../docs_src/handling_errors/tutorial005_py310.py hl[14] *} -Versuchen Sie nun, einen ungĂŒltigen Artikel zu senden: +Versuchen Sie nun, ein ungĂŒltiges Item zu senden: ```JSON { @@ -194,7 +194,7 @@ Versuchen Sie nun, einen ungĂŒltigen Artikel zu senden: } ``` -Sie erhalten eine Response, die Ihnen sagt, dass die Daten ungĂŒltig sind und die den empfangenen Body enthĂ€lt: +Sie erhalten eine Response, die Ihnen sagt, dass die Daten ungĂŒltig sind, und die den empfangenen Body enthĂ€lt: ```JSON hl_lines="12-15" { diff --git a/docs/de/docs/tutorial/index.md b/docs/de/docs/tutorial/index.md index 4b5272ebd..c0f25c916 100644 --- a/docs/de/docs/tutorial/index.md +++ b/docs/de/docs/tutorial/index.md @@ -1,5 +1,6 @@ # Tutorial – Benutzerhandbuch { #tutorial-user-guide } + Dieses Tutorial zeigt Ihnen Schritt fĂŒr Schritt, wie Sie **FastAPI** mit den meisten seiner Funktionen verwenden können. Jeder Abschnitt baut schrittweise auf den vorhergehenden auf, ist jedoch in einzelne Themen gegliedert, sodass Sie direkt zu einem bestimmten Thema ĂŒbergehen können, um Ihre spezifischen API-Anforderungen zu lösen. diff --git a/docs/de/docs/tutorial/metadata.md b/docs/de/docs/tutorial/metadata.md index a0d79786e..e6549aa3c 100644 --- a/docs/de/docs/tutorial/metadata.md +++ b/docs/de/docs/tutorial/metadata.md @@ -11,7 +11,7 @@ Sie können die folgenden Felder festlegen, die in der OpenAPI-Spezifikation und | `title` | `str` | Der Titel der API. | | `summary` | `str` | Eine kurze Zusammenfassung der API. VerfĂŒgbar seit OpenAPI 3.1.0, FastAPI 0.99.0. | | `description` | `str` | Eine kurze Beschreibung der API. Kann Markdown verwenden. | -| `version` | `string` | Die Version der API. Das ist die Version Ihrer eigenen Anwendung, nicht die von OpenAPI. Zum Beispiel `2.5.0`. | +| `version` | `str` | Die Version der API. Das ist die Version Ihrer eigenen Anwendung, nicht die von OpenAPI. Zum Beispiel `2.5.0`. | | `terms_of_service` | `str` | Eine URL zu den Nutzungsbedingungen fĂŒr die API. Falls angegeben, muss es sich um eine URL handeln. | | `contact` | `dict` | Die Kontaktinformationen fĂŒr die freigegebene API. Kann mehrere Felder enthalten.
contact-Felder
ParameterTypBeschreibung
namestrDer identifizierende Name der Kontaktperson/Organisation.
urlstrDie URL, die auf die Kontaktinformationen verweist. MUSS im Format einer URL vorliegen.
emailstrDie E-Mail-Adresse der Kontaktperson/Organisation. MUSS im Format einer E-Mail-Adresse vorliegen.
| | `license_info` | `dict` | Die Lizenzinformationen fĂŒr die freigegebene API. Kann mehrere Felder enthalten.
license_info-Felder
ParameterTypBeschreibung
namestrERFORDERLICH (wenn eine license_info festgelegt ist). Der fĂŒr die API verwendete Lizenzname.
identifierstrEin [SPDX](https://spdx.org/licenses/)-Lizenzausdruck fĂŒr die API. Das Feld identifier und das Feld url schließen sich gegenseitig aus. VerfĂŒgbar seit OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrEine URL zur Lizenz, die fĂŒr die API verwendet wird. MUSS im Format einer URL vorliegen.
| diff --git a/docs/de/docs/tutorial/path-operation-configuration.md b/docs/de/docs/tutorial/path-operation-configuration.md index 9fd381b7e..56c8a69e7 100644 --- a/docs/de/docs/tutorial/path-operation-configuration.md +++ b/docs/de/docs/tutorial/path-operation-configuration.md @@ -38,11 +38,11 @@ Diese werden zum OpenAPI-Schema hinzugefĂŒgt und von den automatischen Dokumenta -### Tags mittels Enumeration { #tags-with-enums } +### Tags mit Enums { #tags-with-enums } -Wenn Sie eine große Anwendung haben, können sich am Ende **viele Tags** anhĂ€ufen, und Sie möchten sicherstellen, dass Sie fĂŒr verwandte *Pfadoperationen* immer den **gleichen Tag** verwenden. +Wenn Sie eine große Anwendung haben, können sich am Ende **mehrere Tags** anhĂ€ufen, und Sie möchten sicherstellen, dass Sie fĂŒr verwandte *Pfadoperationen* immer den **gleichen Tag** verwenden. -In diesem Fall macht es Sinn, die Tags in einem `Enum` zu speichern. +In diesen FĂ€llen kann es sinnvoll sein, die Tags in einem `Enum` zu speichern. **FastAPI** unterstĂŒtzt das auf die gleiche Weise wie einfache Strings: @@ -104,4 +104,4 @@ Vergleichen Sie, wie deprecatete und nicht-deprecatete *Pfadoperationen* aussehe ## Zusammenfassung { #recap } -Sie können auf einfache Weise Metadaten fĂŒr Ihre *Pfadoperationen* definieren, indem Sie den *Pfadoperation-Dekoratoren* Parameter hinzufĂŒgen. +Sie können Ihre *Pfadoperationen* einfach konfigurieren und Metadaten hinzufĂŒgen, indem Sie den *Pfadoperation-Dekoratoren* Parameter ĂŒbergeben. diff --git a/docs/de/docs/tutorial/query-params-str-validations.md b/docs/de/docs/tutorial/query-params-str-validations.md index a00596f08..bec5f574a 100644 --- a/docs/de/docs/tutorial/query-params-str-validations.md +++ b/docs/de/docs/tutorial/query-params-str-validations.md @@ -81,7 +81,7 @@ FastAPI wird nun: * Die Daten **validieren**, um sicherzustellen, dass die LĂ€nge maximal 50 Zeichen betrĂ€gt * Einen **klaren Fehler** fĂŒr den Client anzeigen, wenn die Daten ungĂŒltig sind -* Den Parameter in der OpenAPI-Schema-*Pfadoperation* **dokumentieren** (sodass er in der **automatischen Dokumentation** angezeigt wird) +* Den Parameter in der OpenAPI-Schema-*Pfadoperation* **dokumentieren** (sodass er in der **automatischen DokumentationsoberflĂ€che** angezeigt wird) ## Alternative (alt): `Query` als Defaultwert { #alternative-old-query-as-the-default-value } @@ -179,7 +179,7 @@ Dieses spezielle Suchmuster im regulĂ€ren Ausdruck ĂŒberprĂŒft, dass der erhalte Wenn Sie sich mit all diesen **„regulĂ€rer Ausdruck“**-Ideen verloren fĂŒhlen, keine Sorge. Sie sind ein schwieriges Thema fĂŒr viele Menschen. Sie können noch viele Dinge tun, ohne regulĂ€re AusdrĂŒcke direkt zu benötigen. -Aber nun wissen Sie, dass Sie sie in **FastAPI** immer dann verwenden können, wenn Sie sie brauchen. +Nun wissen Sie, dass Sie sie in **FastAPI** immer dann verwenden können, wenn Sie sie brauchen. ## Defaultwerte { #default-values } @@ -276,7 +276,7 @@ Wenn Sie zu: http://localhost:8000/items/ ``` -gehen, wird der Default fĂŒr `q` sein: `["foo", "bar"]`, und Ihre Response wird sein: +gehen, wird der Defaultwert fĂŒr `q` sein: `["foo", "bar"]`, und Ihre Response wird sein: ```JSON { @@ -311,7 +311,7 @@ Diese Informationen werden in das generierte OpenAPI aufgenommen und von den Dok Beachten Sie, dass verschiedene Tools möglicherweise unterschiedliche UnterstĂŒtzungslevels fĂŒr OpenAPI haben. -Einige davon könnten noch nicht alle zusĂ€tzlichen Informationen anzuzeigen, die Sie erklĂ€rten, obwohl in den meisten FĂ€llen die fehlende FunktionalitĂ€t bereits in der Entwicklung geplant ist. +Einige davon könnten noch nicht alle zusĂ€tzlichen Informationen anzeigen, die Sie deklariert haben, obwohl in den meisten FĂ€llen die fehlende FunktionalitĂ€t bereits in der Entwicklung geplant ist. /// @@ -335,7 +335,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems Aber `item-query` ist kein gĂŒltiger Name fĂŒr eine Variable in Python. -Der am Ă€hnlichsten wĂ€re `item_query`. +Am Ă€hnlichsten wĂ€re `item_query`. Aber Sie benötigen dennoch, dass er genau `item-query` ist ... @@ -347,7 +347,7 @@ Dann können Sie ein `alias` deklarieren, und dieser Alias wird verwendet, um de Nehmen wir an, Ihnen gefĂ€llt dieser Parameter nicht mehr. -Sie mĂŒssen ihn eine Weile dort belassen, da es Clients gibt, die ihn verwenden, aber Sie möchten, dass die Dokumentation ihn klar als deprecatet anzeigt. +Sie mĂŒssen ihn eine Weile dort belassen, da es Clients gibt, die ihn verwenden, aber Sie möchten, dass die Dokumentation ihn klar als deprecatet anzeigt. Dann ĂŒbergeben Sie den Parameter `deprecated=True` an `Query`: @@ -395,7 +395,7 @@ Diese benutzerdefinierten Validatoren sind fĂŒr Dinge gedacht, die einfach mit d /// -### Dieses Codebeispiel verstehen { #understand-that-code } +### Diesen Code verstehen { #understand-that-code } Der wichtige Punkt ist einfach die Verwendung von **`AfterValidator` mit einer Funktion innerhalb von `Annotated`**. FĂŒhlen Sie sich frei, diesen Teil zu ĂŒberspringen. đŸ€ž @@ -403,9 +403,9 @@ Der wichtige Punkt ist einfach die Verwendung von **`AfterValidator` mit einer F Aber wenn Sie neugierig auf dieses spezielle Codebeispiel sind und immer noch Spaß haben, hier sind einige zusĂ€tzliche Details. -#### Zeichenkette mit `value.startswith()` { #string-with-value-startswith } +#### String mit `value.startswith()` { #string-with-value-startswith } -Haben Sie bemerkt? Eine Zeichenkette mit `value.startswith()` kann ein Tuple ĂŒbernehmen, und es wird jeden Wert im Tuple ĂŒberprĂŒfen: +Haben Sie bemerkt? Ein String mit `value.startswith()` kann ein Tuple ĂŒbernehmen, und es wird jeden Wert im Tuple ĂŒberprĂŒfen: {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *} diff --git a/docs/de/docs/tutorial/query-params.md b/docs/de/docs/tutorial/query-params.md index d386bc718..86ec9f4ab 100644 --- a/docs/de/docs/tutorial/query-params.md +++ b/docs/de/docs/tutorial/query-params.md @@ -23,7 +23,7 @@ Aber wenn Sie sie mit Python-Typen deklarieren (im obigen Beispiel als `int`), w Die gleichen Prozesse, die fĂŒr Pfad-Parameter gelten, werden auch auf Query-Parameter angewendet: -* Editor UnterstĂŒtzung (natĂŒrlich) +* Editor-UnterstĂŒtzung (natĂŒrlich) * Daten-„Parsen“ * Datenvalidierung * Automatische Dokumentation @@ -67,17 +67,17 @@ In diesem Fall wird der Funktionsparameter `q` optional und standardmĂ€ĂŸig `Non /// tip | Tipp -Beachten Sie auch, dass **FastAPI** intelligent genug ist, um zu erkennen, dass `item_id` ein Pfad-Parameter ist und `q` keiner, daher muss letzteres ein Query-Parameter sein. +Beachten Sie auch, dass **FastAPI** intelligent genug ist, um zu erkennen, dass der Pfad-Parameter `item_id` ein Pfad-Parameter ist und `q` keiner, daher muss letzteres ein Query-Parameter sein. /// -## Query-Parameter Typkonvertierung { #query-parameter-type-conversion } +## Typkonvertierung von Query-Parametern { #query-parameter-type-conversion } Sie können auch `bool`-Typen deklarieren, und sie werden konvertiert: {* ../../docs_src/query_params/tutorial003_py310.py hl[7] *} -Wenn Sie nun zu: +Wenn Sie in diesem Fall zu: ``` http://127.0.0.1:8000/items/foo?short=1 @@ -109,6 +109,7 @@ http://127.0.0.1:8000/items/foo?short=yes gehen, oder zu irgendeiner anderen Variante der Groß-/Kleinschreibung (Alles groß, Anfangsbuchstabe groß, usw.), dann wird Ihre Funktion den Parameter `short` mit dem `bool`-Wert `True` sehen, ansonsten mit dem Wert `False`. + ## Mehrere Pfad- und Query-Parameter { #multiple-path-and-query-parameters } Sie können mehrere Pfad-Parameter und Query-Parameter gleichzeitig deklarieren, **FastAPI** weiß, welches welcher ist. @@ -121,7 +122,7 @@ Parameter werden anhand ihres Namens erkannt: ## Erforderliche Query-Parameter { #required-query-parameters } -Wenn Sie einen Defaultwert fĂŒr Nicht-Pfad-Parameter deklarieren (Bis jetzt haben wir nur Query-Parameter gesehen), dann ist der Parameter nicht erforderlich. +Wenn Sie einen Defaultwert fĂŒr Nicht-Pfad-Parameter deklarieren (bis jetzt haben wir nur Query-Parameter gesehen), dann ist der Parameter nicht erforderlich. Wenn Sie keinen spezifischen Wert haben wollen, sondern der Parameter einfach optional sein soll, dann setzen Sie den Defaultwert auf `None`. @@ -129,7 +130,7 @@ Aber wenn Sie wollen, dass ein Query-Parameter erforderlich ist, vergeben Sie ei {* ../../docs_src/query_params/tutorial005_py310.py hl[6:7] *} -Hier ist `needy` ein erforderlicher Query-Parameter vom Typ `str`. +Hier ist der Query-Parameter `needy` ein erforderlicher Query-Parameter vom Typ `str`. Wenn Sie in Ihrem Browser eine URL wie: @@ -137,7 +138,7 @@ Wenn Sie in Ihrem Browser eine URL wie: http://127.0.0.1:8000/items/foo-item ``` -... öffnen, ohne den benötigten Parameter `needy`, dann erhalten Sie einen Fehler wie den folgenden: +... öffnen, ohne den erforderlichen Parameter `needy` hinzuzufĂŒgen, dann erhalten Sie einen Fehler wie den folgenden: ```JSON { @@ -161,7 +162,7 @@ Da `needy` ein erforderlicher Parameter ist, mĂŒssen Sie ihn in der URL setzen: http://127.0.0.1:8000/items/foo-item?needy=sooooneedy ``` -... Das funktioniert: +... das funktioniert: ```JSON { @@ -174,7 +175,7 @@ Und natĂŒrlich können Sie einige Parameter als erforderlich, einige mit Default {* ../../docs_src/query_params/tutorial006_py310.py hl[8] *} -In diesem Fall gibt es drei Query-Parameter: +In diesem Fall gibt es 3 Query-Parameter: * `needy`, ein erforderlicher `str`. * `skip`, ein `int` mit einem Defaultwert `0`. diff --git a/docs/de/docs/tutorial/request-files.md b/docs/de/docs/tutorial/request-files.md index f2a234c3b..7a344604a 100644 --- a/docs/de/docs/tutorial/request-files.md +++ b/docs/de/docs/tutorial/request-files.md @@ -24,7 +24,7 @@ Importieren Sie `File` und `UploadFile` von `fastapi`: ## `File`-Parameter definieren { #define-file-parameters } -Erstellen Sie Datei-Parameter, so wie Sie es auch mit `Body` und `Form` machen wĂŒrden: +Erstellen Sie Datei-Parameter, so wie Sie es auch mit `Body` oder `Form` machen wĂŒrden: {* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *} @@ -44,7 +44,7 @@ Um Dateibodys zu deklarieren, mĂŒssen Sie `File` verwenden, da diese Parameter s Die Dateien werden als „Formulardaten“ hochgeladen. -Wenn Sie den Typ Ihrer *Pfadoperation-Funktion* als `bytes` deklarieren, wird **FastAPI** die Datei fĂŒr Sie auslesen, und Sie erhalten den Inhalt als `bytes`. +Wenn Sie den Typ des Parameters Ihrer *Pfadoperation-Funktion* als `bytes` deklarieren, wird **FastAPI** die Datei fĂŒr Sie auslesen, und Sie erhalten den Inhalt als `bytes`. Bedenken Sie, dass das bedeutet, dass sich der gesamte Inhalt der Datei im Arbeitsspeicher befindet. Das wird fĂŒr kleinere Dateien gut funktionieren. @@ -63,27 +63,27 @@ Definieren Sie einen Datei-Parameter mit dem Typ `UploadFile`: * Eine Datei, die bis zu einem bestimmten GrĂ¶ĂŸen-Limit im Arbeitsspeicher behalten wird, und wenn das Limit ĂŒberschritten wird, auf der Festplatte gespeichert wird. * Das bedeutet, es wird fĂŒr große Dateien wie Bilder, Videos, große BinĂ€rdateien, usw. gut funktionieren, ohne den ganzen Arbeitsspeicher aufzubrauchen. * Sie können Metadaten aus der hochgeladenen Datei auslesen. -* Es hat eine [dateiartige](https://docs.python.org/3/glossary.html#term-file-like-object) `async`hrone Schnittstelle. +* Es hat eine [dateiartige](https://docs.python.org/3/glossary.html#term-file-like-object) `async`-Schnittstelle. * Es stellt ein tatsĂ€chliches Python-[`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile)-Objekt bereit, welches Sie direkt anderen Bibliotheken ĂŒbergeben können, die ein dateiartiges Objekt erwarten. ### `UploadFile` { #uploadfile } `UploadFile` hat die folgenden Attribute: -* `filename`: Ein `str` mit dem ursprĂŒnglichen Namen der hochgeladenen Datei (z. B. `meinbild.jpg`). +* `filename`: Ein `str` mit dem ursprĂŒnglichen Namen der hochgeladenen Datei (z. B. `myimage.jpg`). * `content_type`: Ein `str` mit dem Inhaltstyp (MIME-Typ / Medientyp) (z. B. `image/jpeg`). -* `file`: Ein [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (ein [dateiartiges](https://docs.python.org/3/glossary.html#term-file-like-object) Objekt). Das ist das tatsĂ€chliche Python-Objekt, das Sie direkt anderen Funktionen oder Bibliotheken ĂŒbergeben können, welche ein „file-like“-Objekt erwarten. +* `file`: Ein [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (ein [dateiartiges](https://docs.python.org/3/glossary.html#term-file-like-object) Objekt). Das ist das tatsĂ€chliche Python-Dateiobjekt, das Sie direkt anderen Funktionen oder Bibliotheken ĂŒbergeben können, welche ein „file-like“-Objekt erwarten. -`UploadFile` hat die folgenden `async`hronen Methoden. Sie alle rufen die entsprechenden Methoden des darunterliegenden Datei-Objekts auf (wobei intern `SpooledTemporaryFile` verwendet wird). +`UploadFile` hat die folgenden `async`-Methoden. Sie alle rufen die entsprechenden Methoden des darunterliegenden Datei-Objekts auf (wobei intern `SpooledTemporaryFile` verwendet wird). -* `write(daten)`: Schreibt `daten` (`str` oder `bytes`) in die Datei. -* `read(anzahl)`: Liest `anzahl` (`int`) bytes/Zeichen aus der Datei. -* `seek(versatz)`: Geht zur Position `versatz` (`int`) in der Datei. +* `write(data)`: Schreibt `data` (`str` oder `bytes`) in die Datei. +* `read(size)`: Liest `size` (`int`) Bytes/Zeichen aus der Datei. +* `seek(offset)`: Geht zur Byte-Position `offset` (`int`) in der Datei. * z. B. wĂŒrde `await myfile.seek(0)` zum Anfang der Datei gehen. * Das ist besonders dann nĂŒtzlich, wenn Sie `await myfile.read()` einmal ausfĂŒhren und dann diese Inhalte erneut auslesen mĂŒssen. * `close()`: Schließt die Datei. -Da alle diese Methoden `async`hron sind, mĂŒssen Sie sie „await“en („erwarten“). +Da alle diese Methoden `async`-Methoden sind, mĂŒssen Sie sie „await“en („erwarten“). Zum Beispiel können Sie innerhalb einer `async` *Pfadoperation-Funktion* den Inhalt wie folgt auslesen: @@ -105,7 +105,7 @@ Wenn Sie die `async`-Methoden verwenden, fĂŒhrt **FastAPI** die Datei-Methoden i /// note | Technische Details zu Starlette -FastAPIs `UploadFile` erbt direkt von Starlettes `UploadFile`, fĂŒgt aber ein paar notwendige Teile hinzu, um es kompatibel mit **Pydantic** und anderen Teilen von FastAPI zu machen. +**FastAPI**s `UploadFile` erbt direkt von **Starlette**s `UploadFile`, fĂŒgt aber ein paar notwendige Teile hinzu, um es kompatibel mit **Pydantic** und anderen Teilen von FastAPI zu machen. /// @@ -113,15 +113,15 @@ FastAPIs `UploadFile` erbt direkt von Starlettes `UploadFile`, fĂŒgt aber ein pa Der Weg, wie HTML-Formulare (`
`) die Daten zum Server senden, verwendet normalerweise eine „spezielle“ Kodierung fĂŒr diese Daten. Diese unterscheidet sich von JSON. -**FastAPI** stellt sicher, dass diese Daten korrekt ausgelesen werden, statt JSON zu erwarten. +**FastAPI** stellt sicher, dass diese Daten von der richtigen Stelle ausgelesen werden, statt JSON zu erwarten. /// note | Technische Details -Daten aus Formularen werden, wenn es keine Dateien sind, normalerweise mit dem „media type“ `application/x-www-form-urlencoded` kodiert. +Daten aus Formularen werden, wenn sie keine Dateien enthalten, normalerweise mit dem „media type“ `application/x-www-form-urlencoded` kodiert. Sollte das Formular aber Dateien enthalten, dann werden diese mit `multipart/form-data` kodiert. Wenn Sie `File` verwenden, wird **FastAPI** wissen, dass es die Dateien vom korrekten Teil des Bodys holen muss. -Wenn Sie mehr ĂŒber diese Kodierungen und Formularfelder lesen möchten, besuchen Sie die [MDN-Webdokumentation fĂŒr `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). +Wenn Sie mehr ĂŒber diese Kodierungen und Formularfelder lesen möchten, besuchen Sie die [MDN-Webdokumentation fĂŒr `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// @@ -149,7 +149,7 @@ Sie können auch `File()` mit `UploadFile` verwenden, um zum Beispiel zusĂ€tzlic Es ist auch möglich, mehrere Dateien gleichzeitig hochzuladen. -Diese werden demselben Formularfeld zugeordnet, welches mit den Formulardaten gesendet wird. +Diese werden demselben „Formularfeld“ zugeordnet, welches mittels „Formulardaten“ gesendet wird. Um das zu machen, deklarieren Sie eine Liste von `bytes` oder `UploadFile`s: diff --git a/docs/de/docs/tutorial/request-forms.md b/docs/de/docs/tutorial/request-forms.md index 815de0dce..aedcd4a51 100644 --- a/docs/de/docs/tutorial/request-forms.md +++ b/docs/de/docs/tutorial/request-forms.md @@ -1,5 +1,6 @@ # Formulardaten { #form-data } + Wenn Sie Felder aus Formularen statt JSON empfangen mĂŒssen, können Sie `Form` verwenden. /// note | Hinweis diff --git a/docs/de/docs/tutorial/response-status-code.md b/docs/de/docs/tutorial/response-status-code.md index 63f1870e8..63962829d 100644 --- a/docs/de/docs/tutorial/response-status-code.md +++ b/docs/de/docs/tutorial/response-status-code.md @@ -1,5 +1,6 @@ # Response-Statuscode { #response-status-code } + Genauso wie Sie ein Responsemodell angeben können, können Sie auch den HTTP-Statuscode fĂŒr die Response mit dem Parameter `status_code` in jeder der *Pfadoperationen* deklarieren: * `@app.get()` diff --git a/docs/de/docs/tutorial/schema-extra-example.md b/docs/de/docs/tutorial/schema-extra-example.md index a34f8097b..9bf0eafec 100644 --- a/docs/de/docs/tutorial/schema-extra-example.md +++ b/docs/de/docs/tutorial/schema-extra-example.md @@ -14,7 +14,7 @@ Diese zusĂ€tzlichen Informationen werden unverĂ€ndert zum fĂŒr dieses Modell aus Sie können das Attribut `model_config` verwenden, das ein `dict` akzeptiert, wie beschrieben in [Pydantic-Dokumentation: Configuration](https://docs.pydantic.dev/latest/api/config/). -Sie können `json_schema_extra` setzen, mit einem `dict`, das alle zusĂ€tzlichen Daten enthĂ€lt, die im generierten JSON-Schema angezeigt werden sollen, einschließlich `examples`. +Sie können `"json_schema_extra"` setzen, mit einem `dict`, das alle zusĂ€tzlichen Daten enthĂ€lt, die im generierten JSON-Schema angezeigt werden sollen, einschließlich `examples`. /// tip | Tipp @@ -88,7 +88,7 @@ Das Format dieses OpenAPI-spezifischen Felds `examples` ist ein `dict` mit **meh Dies erfolgt nicht innerhalb jedes in OpenAPI enthaltenen JSON-Schemas, sondern außerhalb, in der *Pfadoperation*. -### Verwendung des Parameters `openapi_examples` { #using-the-openapi-examples-parameter } +### Den Parameter `openapi_examples` verwenden { #using-the-openapi-examples-parameter } Sie können die OpenAPI-spezifischen `examples` in FastAPI mit dem Parameter `openapi_examples` deklarieren, fĂŒr: @@ -189,9 +189,9 @@ In Versionen von FastAPI vor 0.99.0 (0.99.0 und höher verwenden das neuere Open Aber jetzt, da FastAPI 0.99.0 und höher, OpenAPI 3.1.0 verwendet, das JSON Schema 2020-12 verwendet, und Swagger UI 5.0.0 und höher, ist alles konsistenter und die Beispiele sind in JSON Schema enthalten. -### Swagger-BenutzeroberflĂ€che und OpenAPI-spezifische `examples` { #swagger-ui-and-openapi-specific-examples } +### Swagger UI und OpenAPI-spezifische `examples` { #swagger-ui-and-openapi-specific-examples } -Da die Swagger-BenutzeroberflĂ€che derzeit nicht mehrere JSON Schema Beispiele unterstĂŒtzt (Stand: 26.08.2023), hatten Benutzer keine Möglichkeit, mehrere Beispiele in der Dokumentation anzuzeigen. +Da Swagger UI derzeit nicht mehrere JSON Schema Beispiele unterstĂŒtzt (Stand: 26.08.2023), hatten Benutzer keine Möglichkeit, mehrere Beispiele in der Dokumentation anzuzeigen. Um dieses Problem zu lösen, hat FastAPI `0.103.0` **UnterstĂŒtzung** fĂŒr die Deklaration desselben alten **OpenAPI-spezifischen** `examples`-Felds mit dem neuen Parameter `openapi_examples` hinzugefĂŒgt. đŸ€“ diff --git a/docs/de/docs/tutorial/security/first-steps.md b/docs/de/docs/tutorial/security/first-steps.md index 2fa587184..69e8abec0 100644 --- a/docs/de/docs/tutorial/security/first-steps.md +++ b/docs/de/docs/tutorial/security/first-steps.md @@ -1,5 +1,6 @@ # Sicherheit – Erste Schritte { #security-first-steps } + Stellen wir uns vor, dass Sie Ihre **Backend**-API auf einer Domain haben. Und Sie haben ein **Frontend** auf einer anderen Domain oder in einem anderen Pfad derselben Domain (oder in einer Mobile-Anwendung). diff --git a/docs/de/docs/tutorial/security/get-current-user.md b/docs/de/docs/tutorial/security/get-current-user.md index 5178de9b0..1bcccfd82 100644 --- a/docs/de/docs/tutorial/security/get-current-user.md +++ b/docs/de/docs/tutorial/security/get-current-user.md @@ -14,7 +14,7 @@ Erstellen wir zunĂ€chst ein Pydantic-Benutzermodell. So wie wir Pydantic zum Deklarieren von Bodys verwenden, können wir es auch ĂŒberall sonst verwenden: -{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *} +{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *} ## Eine `get_current_user`-AbhĂ€ngigkeit erstellen { #create-a-get-current-user-dependency } diff --git a/docs/de/docs/tutorial/security/oauth2-jwt.md b/docs/de/docs/tutorial/security/oauth2-jwt.md index 1a42eb6f3..d04bd00d4 100644 --- a/docs/de/docs/tutorial/security/oauth2-jwt.md +++ b/docs/de/docs/tutorial/security/oauth2-jwt.md @@ -120,7 +120,7 @@ Und noch eine, um einen Benutzer zu authentifizieren und zurĂŒckzugeben. Wenn `authenticate_user` mit einem Benutzernamen aufgerufen wird, der in der Datenbank nicht existiert, fĂŒhren wir dennoch `verify_password` gegen einen Dummy-Hash aus. -So stellt man sicher, dass der Endpunkt ungefĂ€hr gleich viel Zeit fĂŒr die Antwort benötigt, unabhĂ€ngig davon, ob der Benutzername gĂŒltig ist oder nicht. Dadurch werden Timing-Angriffe verhindert, mit denen vorhandene Benutzernamen ermittelt werden könnten. +So stellt man sicher, dass der Endpunkt ungefĂ€hr gleich viel Zeit fĂŒr die Antwort benötigt, unabhĂ€ngig davon, ob der Benutzername gĂŒltig ist oder nicht. Dadurch werden **Timing-Angriffe** verhindert, mit denen vorhandene Benutzernamen ermittelt werden könnten. /// note | Hinweis @@ -168,7 +168,7 @@ Wenn der Token ungĂŒltig ist, geben Sie sofort einen HTTP-Fehler zurĂŒck. {* ../../docs_src/security/tutorial004_an_py310.py hl[93:110] *} -## Die *Pfadoperation* `/token` aktualisieren { #update-the-token-path-operation } +## Die `/token`-*Pfadoperation* aktualisieren { #update-the-token-path-operation } Erstellen Sie ein `timedelta` mit der Ablaufzeit des Tokens. diff --git a/docs/de/docs/tutorial/security/simple-oauth2.md b/docs/de/docs/tutorial/security/simple-oauth2.md index f5304bd32..b7b041bc1 100644 --- a/docs/de/docs/tutorial/security/simple-oauth2.md +++ b/docs/de/docs/tutorial/security/simple-oauth2.md @@ -20,7 +20,7 @@ Die Spezifikation besagt auch, dass `username` und `password` als Formulardaten ### `scope` { #scope } -Ferner sagt die Spezifikation, dass der Client ein weiteres Formularfeld "`scope`" („Geltungsbereich“) senden kann. +Ferner sagt die Spezifikation, dass der Client ein weiteres Formularfeld „`scope`“ senden kann. Der Name des Formularfelds lautet `scope` (im Singular), tatsĂ€chlich handelt es sich jedoch um einen langen String mit durch Leerzeichen getrennten „Scopes“. @@ -120,7 +120,7 @@ Immer wenn Sie genau den gleichen Inhalt (genau das gleiche Passwort) ĂŒbergeben Sie können jedoch nicht vom Kauderwelsch zurĂŒck zum Passwort konvertieren. -##### Warum Passwort-Hashing verwenden? { #why-use-password-hashing } +##### Warum Passwort-Hashing verwenden { #why-use-password-hashing } Wenn Ihre Datenbank gestohlen wird, hat der Dieb nicht die Klartext-Passwörter Ihrer Benutzer, sondern nur die Hashes. @@ -146,7 +146,7 @@ UserInDB( /// note | Hinweis -Eine ausfĂŒhrlichere ErklĂ€rung von `**user_dict` finden Sie in [der Dokumentation fĂŒr **Extra Modelle**](../extra-models.md#about-user-in-dict). +Eine ausfĂŒhrlichere ErklĂ€rung von `**user_dict` finden Sie in [der Dokumentation fĂŒr **Extra Modelle**](../extra-models.md#about-user-in-model-dump). /// @@ -226,7 +226,7 @@ Verwenden Sie die Anmeldedaten: Benutzer: `johndoe` -Passwort: `secret`. +Passwort: `secret` @@ -264,9 +264,9 @@ Wenn Sie auf das Schlosssymbol klicken und sich abmelden und dann den gleichen V Versuchen Sie es nun mit einem inaktiven Benutzer und authentisieren Sie sich mit: -Benutzer: `alice`. +Benutzer: `alice` -Passwort: `secret2`. +Passwort: `secret2` Und versuchen Sie, die Operation `GET` mit dem Pfad `/users/me` zu verwenden. diff --git a/docs/de/docs/tutorial/sql-databases.md b/docs/de/docs/tutorial/sql-databases.md index d7988f9a2..3c7aabae3 100644 --- a/docs/de/docs/tutorial/sql-databases.md +++ b/docs/de/docs/tutorial/sql-databases.md @@ -8,7 +8,7 @@ Hier werden wir ein Beispiel mit [SQLModel](https://sqlmodel.tiangolo.com/) sehe /// tip | Tipp -Sie könnten jede andere SQL- oder NoSQL-Datenbankbibliothek verwenden, die Sie möchten (in einigen FĂ€llen als „ORMs“ bezeichnet), FastAPI zwingt Sie nicht, irgendetwas zu verwenden. 😎 +Sie könnten jede andere SQL- oder NoSQL-Datenbankbibliothek verwenden, die Sie möchten (in einigen FĂ€llen als „ORMs“ bezeichnet), FastAPI zwingt Sie nicht, irgendetwas zu verwenden. 😎 /// @@ -121,7 +121,7 @@ Da jedes SQLModel-Modell auch ein Pydantic-Modell ist, können Sie es in denselb Wenn Sie beispielsweise einen Parameter vom Typ `Hero` deklarieren, wird er aus dem **JSON-Body** gelesen. -Auf die gleiche Weise können Sie es als **RĂŒckgabetyp** der Funktion deklarieren, und dann wird die Form der Daten in der automatischen API-Dokumentation angezeigt. +Auf die gleiche Weise können Sie es als **RĂŒckgabetyp** der Funktion deklarieren, und dann wird die Form der Daten in der automatischen API-Dokumentations-UI angezeigt. {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[40:45] hl[40:45] *} @@ -266,7 +266,7 @@ In der vorherigen Version der App hatten wir keine Möglichkeit, einen Helden ** Das `HeroUpdate`-*Datenmodell* ist etwas Besonderes, es hat **die selben Felder**, die benötigt werden, um einen neuen Helden zu erstellen, aber alle Felder sind **optional** (sie haben alle einen Defaultwert). Auf diese Weise, wenn Sie einen Helden aktualisieren, können Sie nur die Felder senden, die Sie aktualisieren möchten. -Da sich tatsĂ€chlich **alle Felder Ă€ndern** (der Typ enthĂ€lt jetzt `None` und sie haben jetzt einen Standardwert von `None`), mĂŒssen wir sie erneut **deklarieren**. +Da sich tatsĂ€chlich **alle Felder Ă€ndern** (der Typ enthĂ€lt jetzt `None` und sie haben jetzt einen Defaultwert von `None`), mĂŒssen wir sie erneut **deklarieren**. Wir mĂŒssen wirklich nicht von `HeroBase` erben, weil wir alle Felder neu deklarieren. Ich lasse es aus KonsistenzgrĂŒnden erben, aber das ist nicht notwendig. Es ist mehr eine Frage des persönlichen Geschmacks. đŸ€· diff --git a/docs/de/docs/tutorial/static-files.md b/docs/de/docs/tutorial/static-files.md index 8fb4c1908..ef75ca91a 100644 --- a/docs/de/docs/tutorial/static-files.md +++ b/docs/de/docs/tutorial/static-files.md @@ -2,6 +2,14 @@ Mit `StaticFiles` können Sie statische Dateien aus einem Verzeichnis automatisch bereitstellen. +/// tip | Tipp + +Wenn Sie ein Frontend hosten mĂŒssen, verwenden Sie stattdessen `app.frontend()`; lesen Sie mehr dazu unter [Frontend](frontend.md). + +`app.frontend()` verwendet darunter `StaticFiles`, mit mehreren zusĂ€tzlichen Vorteilen fĂŒr Frontends, wie der Handhabung von clientseitigem Routing. + +/// + ## `StaticFiles` verwenden { #use-staticfiles } * Importieren Sie `StaticFiles`. diff --git a/docs/de/docs/tutorial/testing.md b/docs/de/docs/tutorial/testing.md index 73dc14860..59d0be6bb 100644 --- a/docs/de/docs/tutorial/testing.md +++ b/docs/de/docs/tutorial/testing.md @@ -24,7 +24,7 @@ Importieren Sie `TestClient`. Erstellen Sie einen `TestClient`, indem Sie ihm Ihre **FastAPI**-Anwendung ĂŒbergeben. -Erstellen Sie Funktionen mit einem Namen, der mit `test_` beginnt (das sind `pytest`-Konventionen). +Erstellen Sie Funktionen mit einem Namen, der mit `test_` beginnt (das ist eine Standard-`pytest`-Konvention). Verwenden Sie das `TestClient`-Objekt auf die gleiche Weise wie `httpx`. @@ -36,7 +36,7 @@ Schreiben Sie einfache `assert`-Anweisungen mit den Standard-Python-AusdrĂŒcken, Beachten Sie, dass die Testfunktionen normal `def` und nicht `async def` sind. -Und die Anrufe an den Client sind ebenfalls normale Anrufe, die nicht `await` verwenden. +Und die Aufrufe an den Client sind ebenfalls normale Aufrufe, die nicht `await` verwenden. Dadurch können Sie `pytest` ohne Komplikationen direkt nutzen. @@ -62,7 +62,7 @@ In einer echten Anwendung wĂŒrden Sie Ihre Tests wahrscheinlich in einer anderen Und Ihre **FastAPI**-Anwendung könnte auch aus mehreren Dateien/Modulen, usw. bestehen. -### **FastAPI** Anwendungsdatei { #fastapi-app-file } +### **FastAPI**-Anwendungsdatei { #fastapi-app-file } Nehmen wir an, Sie haben eine Dateistruktur wie in [GrĂ¶ĂŸere Anwendungen](bigger-applications.md) beschrieben: @@ -131,7 +131,7 @@ Anschließend könnten Sie `test_main.py` mit den erweiterten Tests aktualisiere {* ../../docs_src/app_testing/app_b_an_py310/test_main.py *} -Wenn Sie möchten, dass der Client Informationen im Request ĂŒbergibt und Sie nicht wissen, wie das geht, können Sie suchen (googeln), wie es mit `httpx` gemacht wird, oder sogar, wie es mit `requests` gemacht wird, da das Design von HTTPX auf dem Design von Requests basiert. +Immer wenn der Client Informationen im Request ĂŒbergeben soll und Sie nicht wissen, wie, können Sie danach suchen (googeln), wie es mit `httpx` gemacht wird, oder sogar, wie es mit `requests` gemacht wird, da das Design von HTTPX auf dem Design von Requests basiert. Dann machen Sie in Ihren Tests einfach das gleiche. diff --git a/docs/de/docs/virtual-environments.md b/docs/de/docs/virtual-environments.md index 81d13cc91..782d1cdcf 100644 --- a/docs/de/docs/virtual-environments.md +++ b/docs/de/docs/virtual-environments.md @@ -443,6 +443,8 @@ Auf diese Weise, wenn Sie `python` ausfĂŒhren, wird nicht versucht, es aus diese Jetzt sind Sie bereit, mit Ihrem Projekt zu arbeiten. + + /// tip | Tipp Möchten Sie verstehen, was das alles oben bedeutet? @@ -455,7 +457,7 @@ Lesen Sie weiter. đŸ‘‡đŸ€“ Um mit FastAPI zu arbeiten, mĂŒssen Sie [Python](https://www.python.org/) installieren. -Danach mĂŒssen Sie FastAPI und alle anderen Pakete, die Sie verwenden möchten, **installieren**. +Danach mĂŒssen Sie FastAPI und alle anderen **Pakete**, die Sie verwenden möchten, **installieren**. Um Pakete zu installieren, wĂŒrden Sie normalerweise den `pip`-Befehl verwenden, der mit Python geliefert wird (oder Ă€hnliche Alternativen). @@ -639,7 +641,7 @@ $ source .venv/Scripts/activate Dieser Befehl erstellt oder Ă€ndert einige [Umgebungsvariablen](environment-variables.md), die fĂŒr die nĂ€chsten Befehle verfĂŒgbar sein werden. -Eine dieser Variablen ist die `PATH`-Umgebungsvariable. +Eine dieser Variablen ist die `PATH`-Variable. /// tip | Tipp @@ -649,7 +651,7 @@ Sie können mehr ĂŒber die `PATH`-Umgebungsvariable im Abschnitt [Umgebungsvaria Das Aktivieren einer virtuellen Umgebung fĂŒgt deren Pfad `.venv/bin` (auf Linux und macOS) oder `.venv\Scripts` (auf Windows) zur `PATH`-Umgebungsvariable hinzu. -Angenommen, die `PATH`-Umgebungsvariable sah vor dem Aktivieren der Umgebung so aus: +Angenommen, die `PATH`-Variable sah vor dem Aktivieren der Umgebung so aus: //// tab | Linux, macOS @@ -678,7 +680,7 @@ Das bedeutet, dass das System nach Programmen sucht in: //// -Nach dem Aktivieren der virtuellen Umgebung wĂŒrde die `PATH`-Umgebungsvariable folgendermaßen aussehen: +Nach dem Aktivieren der virtuellen Umgebung wĂŒrde die `PATH`-Variable folgendermaßen aussehen: //// tab | Linux, macOS @@ -728,7 +730,7 @@ finden und dieses verwenden. //// -Ein wichtiger Punkt ist, dass es den Pfad der virtuellen Umgebung am **Anfang** der `PATH`-Umgebungsvariable platziert. Das System wird es **vor** allen anderen verfĂŒgbaren Pythons finden. Auf diese Weise, wenn Sie `python` ausfĂŒhren, wird das Python **aus der virtuellen Umgebung** verwendet anstelle eines anderen `python` (zum Beispiel, einem `python` aus einer globalen Umgebung). +Ein wichtiger Punkt ist, dass es den Pfad der virtuellen Umgebung am **Anfang** der `PATH`-Variable platziert. Das System wird es **vor** allen anderen verfĂŒgbaren Pythons finden. Auf diese Weise, wenn Sie `python` ausfĂŒhren, wird das Python **aus der virtuellen Umgebung** verwendet anstelle eines anderen `python` (zum Beispiel, einem `python` aus einer globalen Umgebung). Das Aktivieren einer virtuellen Umgebung Ă€ndert auch ein paar andere Dinge, aber dies ist eines der wichtigsten Dinge, die es tut. From a49e35172dcfc064f8b3a6e0758442da774a977d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 13:58:04 +0000 Subject: [PATCH 282/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 9d6eacc89..24f97509a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for de (update-outdated). PR [#15899](https://github.com/fastapi/fastapi/pull/15899) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for es (update-outdated). PR [#15892](https://github.com/fastapi/fastapi/pull/15892) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for tr (update-outdated). PR [#15891](https://github.com/fastapi/fastapi/pull/15891) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for pt (update-outdated). PR [#15893](https://github.com/fastapi/fastapi/pull/15893) by [@tiangolo](https://github.com/tiangolo). From 28c93900e71f69ac536ebdd317c476003750a8de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 15:59:00 +0200 Subject: [PATCH 283/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20ja=20(update-outdated)=20(#15895)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] Co-authored-by: Yurii Motov --- docs/ja/docs/_llm-test.md | 1 + .../docs/advanced/additional-status-codes.md | 2 +- .../ja/docs/advanced/advanced-dependencies.md | 6 +-- docs/ja/docs/advanced/dataclasses.md | 4 +- docs/ja/docs/advanced/events.md | 6 +-- docs/ja/docs/advanced/generate-clients.md | 14 ------ docs/ja/docs/advanced/json-base64-bytes.md | 2 +- docs/ja/docs/advanced/openapi-callbacks.md | 8 ++-- .../advanced/response-change-status-code.md | 1 + docs/ja/docs/advanced/response-cookies.md | 1 + docs/ja/docs/advanced/response-headers.md | 1 + .../docs/advanced/security/oauth2-scopes.md | 1 + docs/ja/docs/advanced/settings.md | 2 +- docs/ja/docs/advanced/stream-data.md | 22 +++++----- docs/ja/docs/advanced/wsgi.md | 1 + docs/ja/docs/alternatives.md | 20 ++++----- docs/ja/docs/async.md | 2 +- docs/ja/docs/deployment/cloud.md | 4 +- docs/ja/docs/deployment/concepts.md | 43 +++++++------------ docs/ja/docs/deployment/docker.md | 10 ++--- docs/ja/docs/deployment/https.md | 14 +++--- docs/ja/docs/deployment/manually.md | 2 +- docs/ja/docs/editor-support.md | 2 +- docs/ja/docs/environment-variables.md | 6 +-- docs/ja/docs/features.md | 4 +- docs/ja/docs/help-fastapi.md | 1 + docs/ja/docs/how-to/configure-swagger-ui.md | 2 +- .../docs/how-to/custom-request-and-route.md | 2 +- docs/ja/docs/how-to/graphql.md | 1 + ...migrate-from-pydantic-v1-to-pydantic-v2.md | 18 ++++++++ .../docs/how-to/separate-openapi-schemas.md | 4 +- docs/ja/docs/index.md | 20 ++++----- docs/ja/docs/project-generation.md | 2 +- docs/ja/docs/python-types.md | 6 +-- docs/ja/docs/tutorial/bigger-applications.md | 20 ++++----- docs/ja/docs/tutorial/body-nested-models.md | 1 + docs/ja/docs/tutorial/body.md | 1 + docs/ja/docs/tutorial/debugging.md | 2 +- .../dependencies/dependencies-with-yield.md | 1 + docs/ja/docs/tutorial/extra-data-types.md | 1 + docs/ja/docs/tutorial/extra-models.md | 2 +- docs/ja/docs/tutorial/first-steps.md | 5 ++- docs/ja/docs/tutorial/handling-errors.md | 1 + docs/ja/docs/tutorial/index.md | 1 + docs/ja/docs/tutorial/metadata.md | 6 +-- .../tutorial/path-operation-configuration.md | 1 + .../tutorial/query-params-str-validations.md | 4 +- docs/ja/docs/tutorial/query-params.md | 1 + docs/ja/docs/tutorial/request-files.md | 1 + docs/ja/docs/tutorial/request-forms.md | 2 +- docs/ja/docs/tutorial/response-status-code.md | 1 + docs/ja/docs/tutorial/schema-extra-example.md | 1 + docs/ja/docs/tutorial/security/first-steps.md | 4 +- .../tutorial/security/get-current-user.md | 2 +- docs/ja/docs/tutorial/security/oauth2-jwt.md | 8 ++-- .../docs/tutorial/security/simple-oauth2.md | 16 +++---- docs/ja/docs/tutorial/sql-databases.md | 1 + docs/ja/docs/tutorial/static-files.md | 8 ++++ docs/ja/docs/tutorial/testing.md | 8 ++-- docs/ja/docs/virtual-environments.md | 10 ++--- 60 files changed, 181 insertions(+), 163 deletions(-) diff --git a/docs/ja/docs/_llm-test.md b/docs/ja/docs/_llm-test.md index 4edaa93bf..91eeffd0c 100644 --- a/docs/ja/docs/_llm-test.md +++ b/docs/ja/docs/_llm-test.md @@ -1,5 +1,6 @@ # LLM テă‚čăƒˆăƒ•ă‚Ąă‚€ăƒ« { #llm-test-file } + ă“ăźăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆăŻă€ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆă‚’çż»èšłă™ă‚‹ LLM が、`scripts/translate.py` た `general_prompt` べ、`docs/{language code}/llm-prompt.md` ăźèš€èȘžć›șæœ‰ăƒ—ăƒ­ăƒłăƒ—ăƒˆă‚’ç†è§Łă—ăŠă„ă‚‹ă‹ă‚’ăƒ†ă‚čăƒˆă—ăŸă™ă€‚èš€èȘžć›șæœ‰ăƒ—ăƒ­ăƒłăƒ—ăƒˆăŻ `general_prompt` ăźæœ«ć°Ÿă«èżœćŠ ă•ă‚ŒăŸă™ă€‚ ă“ă“ă«èżœćŠ ă—ăŸăƒ†ă‚čトは、すăčăŠăźèš€èȘžć›șæœ‰ăƒ—ăƒ­ăƒłăƒ—ăƒˆăźèš­èšˆè€…ăŒć‚ç…§ă—ăŸă™ă€‚ diff --git a/docs/ja/docs/advanced/additional-status-codes.md b/docs/ja/docs/advanced/additional-status-codes.md index ad9bd57dc..0c19abd49 100644 --- a/docs/ja/docs/advanced/additional-status-codes.md +++ b/docs/ja/docs/advanced/additional-status-codes.md @@ -16,7 +16,7 @@ {* ../../docs_src/additional_status_codes/tutorial001_an_py310.py hl[4,25] *} -/// warning +/// warning | æłšæ„ äžŠăźäŸ‹ăźă‚ˆă†ă« `Response` ă‚’ç›ŽæŽ„èż”ă™ăšă€ăă‚ŒăŻăăźăŸăŸèż”ă•ă‚ŒăŸă™ă€‚ diff --git a/docs/ja/docs/advanced/advanced-dependencies.md b/docs/ja/docs/advanced/advanced-dependencies.md index 13c796373..e06ca4721 100644 --- a/docs/ja/docs/advanced/advanced-dependencies.md +++ b/docs/ja/docs/advanced/advanced-dependencies.md @@ -10,9 +10,9 @@ ただし、そぼć›ș漚ぼ憅ćźčăŻăƒ‘ăƒ©ăƒĄăƒŒă‚żćŒ–ă§ăă‚‹ă‚ˆă†ă«ă—ăŸă„ă§ă™ă€‚ -## "callable" ăȘă‚€ăƒłă‚čタンă‚č { #a-callable-instance } +## 「callable」ăȘă‚€ăƒłă‚čタンă‚č { #a-callable-instance } -Python ă«ăŻă€ă‚Żăƒ©ă‚čăźă‚€ăƒłă‚čタンă‚čを "callable" にするæ–čæł•ăŒă‚ă‚ŠăŸă™ă€‚ +Python ă«ăŻă€ă‚Żăƒ©ă‚čăźă‚€ăƒłă‚čタンă‚čを「callableă€ă«ă™ă‚‹æ–čæł•ăŒă‚ă‚ŠăŸă™ă€‚ ă‚Żăƒ©ă‚čè‡Șäœ“ïŒˆă“ă‚ŒăŻă™ă§ă« callable ă§ă™ïŒ‰ă§ăŻăȘăă€ăăźă‚Żăƒ©ă‚čăźă‚€ăƒłă‚čタンă‚čです。 @@ -146,7 +146,7 @@ FastAPI 0.110.0 より才では、`yield` ă‚’æŒă€äŸć­˜é–ąäż‚ă‚’äœżă„ă€ă FastAPI 0.106.0 より才では、`yield` ăźćŸŒă§äŸ‹ć€–ă‚’é€ć‡șă™ă‚‹ă“ăšăŻă§ăăŸă›ă‚“ă§ă—ăŸă€‚`yield` ă‚’æŒă€äŸć­˜é–ąäż‚ăźç”‚äș†ă‚łăƒŒăƒ‰ăŻăƒŹă‚čポンă‚čé€äżĄă€ŒćŸŒă€ă«ćźŸèĄŒă•ă‚Œă‚‹ăŸă‚ă€[äŸ‹ć€–ăƒăƒłăƒ‰ăƒ©](../tutorial/handling-errors.md#install-custom-exception-handlers)ăŻă™ă§ă«ćźŸèĄŒæžˆăżă§ă—ăŸă€‚ -ă“ă‚ŒăŻäž»ă«ă€äŸć­˜é–ąäż‚ăŒ "yield" した搌じă‚Șăƒ–ă‚žă‚§ă‚Żăƒˆă‚’ăƒăƒƒă‚Żă‚°ăƒ©ă‚Šăƒłăƒ‰ă‚żă‚čă‚Żć†…ă§ćˆ©ç”šă§ăă‚‹ă‚ˆă†ă«ă™ă‚‹ăŸă‚ăźèš­èšˆă§ă—ăŸă€‚ç”‚äș†ă‚łăƒŒăƒ‰ăŻăƒăƒƒă‚Żă‚°ăƒ©ă‚Šăƒłăƒ‰ă‚żă‚čク漌äș†ćŸŒă«ćźŸèĄŒă•ă‚Œă‚‹ă‹ă‚‰ă§ă™ă€‚ +ă“ă‚ŒăŻäž»ă«ă€äŸć­˜é–ąäż‚ăŒă€Œyield」した搌じă‚Șăƒ–ă‚žă‚§ă‚Żăƒˆă‚’ăƒăƒƒă‚Żă‚°ăƒ©ă‚Šăƒłăƒ‰ă‚żă‚čă‚Żć†…ă§ćˆ©ç”šă§ăă‚‹ă‚ˆă†ă«ă™ă‚‹ăŸă‚ăźèš­èšˆă§ă—ăŸă€‚ç”‚äș†ă‚łăƒŒăƒ‰ăŻăƒăƒƒă‚Żă‚°ăƒ©ă‚Šăƒłăƒ‰ă‚żă‚čク漌äș†ćŸŒă«ćźŸèĄŒă•ă‚Œă‚‹ă‹ă‚‰ă§ă™ă€‚ これは、レă‚čポンă‚čăŒăƒăƒƒăƒˆăƒŻăƒŒă‚ŻäžŠă‚’ç§»ć‹•ă™ă‚‹ăźă‚’ćŸ…ăŁăŠă„ă‚‹é–“ă«ăƒȘă‚œăƒŒă‚čă‚’äżæŒă—ăȘă„ă‚ˆă†ă«ă™ă‚‹æ„ć›łă§ă€FastAPI 0.106.0 ă§ć€‰æ›Žă•ă‚ŒăŸă—ăŸă€‚ diff --git a/docs/ja/docs/advanced/dataclasses.md b/docs/ja/docs/advanced/dataclasses.md index 42627c4ed..2cfe8e905 100644 --- a/docs/ja/docs/advanced/dataclasses.md +++ b/docs/ja/docs/advanced/dataclasses.md @@ -74,7 +74,7 @@ dataclass はè‡Ș拕的に Pydantic た dataclass ă«ć€‰æ›ă•ă‚ŒăŸă™ă€‚ い぀もどおり、FastAPI ă§ăŻćż…èŠă«ćżœă˜ăŠ `def` ず `async def` ă‚’ç”„ăżćˆă‚ă›ă‚‰ă‚ŒăŸă™ă€‚ - ă©ăĄă‚‰ă‚’ă„ă€äœżă†ă‹ăźćŸ©çż’ăŒćż…èŠăȘ栮搈は、[`async` ず `await`](../async.md#in-a-hurry) ă«é–ąă™ă‚‹ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆăź _"In a hurry?"_ ă‚»ă‚Żă‚·ăƒ§ăƒłă‚’ć‚ç…§ă—ăŠăă ă•ă„ă€‚ + ă©ăĄă‚‰ă‚’ă„ă€äœżă†ă‹ăźćŸ©çż’ăŒćż…èŠăȘ栮搈は、[`async` ず `await`](../async.md#in-a-hurry) ă«é–ąă™ă‚‹ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆăź _ă€Œæ€„ă„ă§ă„ăŸă™ă‹ïŒŸă€_ ă‚»ă‚Żă‚·ăƒ§ăƒłă‚’ć‚ç…§ă—ăŠăă ă•ă„ă€‚ 9. こぼ *path operation é–ąæ•°* ăŻïŒˆćŻèƒœă§ăŻă‚ă‚ŠăŸă™ăŒïŒ‰dataclass è‡Șäœ“ăŻèż”ă•ăšă€ć†…éƒšăƒ‡ăƒŒă‚żă‚’æŒă€èŸžæ›žăźăƒȘă‚čăƒˆă‚’èż”ă—ăŠă„ăŸă™ă€‚ @@ -82,7 +82,7 @@ dataclass はè‡Ș拕的に Pydantic た dataclass ă«ć€‰æ›ă•ă‚ŒăŸă™ă€‚ `dataclasses` ăŻä»–ăźćž‹æłšé‡ˆăšć€šæ§˜ăȘç”„ăżćˆă‚ă›ăŒćŻèƒœă§ă€è€‡é›‘ăȘăƒ‡ăƒŒă‚żæ§‹é€ ă‚’æ§‹æˆă§ăăŸă™ă€‚ -äžŠèš˜ăźă‚łăƒŒăƒ‰ć†…ă‚łăƒĄăƒłăƒˆăźăƒ’ăƒłăƒˆă‚’ć‚ç…§ă—ăŠă€ă‚ˆă‚Šć…·äœ“çš„ăȘè©łçŽ°ă‚’çąșèȘă—ăŠăă ă•ă„ă€‚ +äžŠèš˜ăźă‚łăƒŒăƒ‰ć†…ăźæłšé‡ˆăźăƒ’ăƒłăƒˆă‚’ć‚ç…§ă—ăŠă€ă‚ˆă‚Šć…·äœ“çš„ăȘè©łçŽ°ă‚’çąșèȘă—ăŠăă ă•ă„ă€‚ ## さらに歊ぶ { #learn-more } diff --git a/docs/ja/docs/advanced/events.md b/docs/ja/docs/advanced/events.md index f7dcf3b58..12064f948 100644 --- a/docs/ja/docs/advanced/events.md +++ b/docs/ja/docs/advanced/events.md @@ -120,7 +120,7 @@ async with lifespan(app): ここでは、`shutdown` ăźă‚€ăƒ™ăƒłăƒˆăƒăƒłăƒ‰ăƒ©é–ąæ•°ăŒă€ăƒ†ă‚­ă‚čăƒˆèĄŒ `"Application shutdown"` ă‚’ăƒ•ă‚Ąă‚€ăƒ« `log.txt` ă«æ›žăèŸŒăżăŸă™ă€‚ -/// note | æƒ…ć ± +/// note | ć‚™è€ƒ `open()` é–ąæ•°ăź `mode="a"` ăŻă€ŒèżœćŠ ă€ïŒˆappendïŒ‰ă‚’æ„ć‘łă—ăŸă™ă€‚ă€ăŸă‚Šă€ăăźăƒ•ă‚Ąă‚€ăƒ«ă«æ—ąă«ă‚ă‚‹ć†…ćźčă‚’äžŠæ›žăă›ăšă€èĄŒăŒćŸŒă‚ă«èżœèš˜ă•ă‚ŒăŸă™ă€‚ @@ -140,7 +140,7 @@ async with lifespan(app): ### `startup` ず `shutdown` ă‚’ăŸăšă‚ăŠ { #startup-and-shutdown-together } -è”·ć‹•æ™‚ăšă‚·ăƒŁăƒƒăƒˆăƒ€ă‚Šăƒłæ™‚ăźăƒ­ă‚žăƒƒă‚ŻăŻé–ąé€Łă—ăŠă„ă‚‹ă“ăšăŒć€šă„ă§ă™ă€‚äœ•ă‹ă‚’é–‹ć§‹ă—ăŠă‹ă‚‰ç”‚äș†ă—ăŸă„ă€ăƒȘă‚œăƒŒă‚čをçČćŸ—ă—ăŠă‹ă‚‰è§Łæ”Ÿă—ăŸă„ă€ăȘどです. +è”·ć‹•æ™‚ăšă‚·ăƒŁăƒƒăƒˆăƒ€ă‚Šăƒłæ™‚ăźăƒ­ă‚žăƒƒă‚ŻăŻé–ąé€Łă—ăŠă„ă‚‹ă“ăšăŒć€šă„ă§ă™ă€‚äœ•ă‹ă‚’é–‹ć§‹ă—ăŠă‹ă‚‰ç”‚äș†ă—ăŸă„ă€ăƒȘă‚œăƒŒă‚čをçČćŸ—ă—ăŠă‹ă‚‰è§Łæ”Ÿă—ăŸă„ă€ăȘどです。 ć…±æœ‰ă™ă‚‹ăƒ­ă‚žăƒƒă‚Żă‚„ć€‰æ•°ăźăȘă„ćˆ„ă€…ăźé–ąæ•°ă§ăă‚Œă‚’èĄŒă†ăźăŻé›Łă—ăă€ă‚°ăƒ­ăƒŒăƒăƒ«ć€‰æ•°ăȘă©ă«ć€€ă‚’äżć­˜ă™ă‚‹ćż…èŠăŒć‡șăŠăăŸă™ă€‚ @@ -152,7 +152,7 @@ async with lifespan(app): ć†…éƒšçš„ă«ăŻă€ASGI ăźæŠ€èĄ“ä»•æ§˜ă«ăŠă„ăŠă€ă“ă‚ŒăŻ [Lifespan ăƒ—ăƒ­ăƒˆă‚łăƒ«](https://asgi.readthedocs.io/en/latest/specs/lifespan.html) ぼ侀郹であり、`startup` ず `shutdown` ăšă„ă†ă‚€ăƒ™ăƒłăƒˆăŒćźšçŸ©ă•ă‚ŒăŠă„ăŸă™ă€‚ -/// note | æƒ…ć ± +/// note | ć‚™è€ƒ Starlette た `lifespan` ăƒăƒłăƒ‰ăƒ©ă«ă€ă„ăŠăŻă€[Starlette た Lifespan ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆ](https://www.starlette.dev/lifespan/)ă§è©łă—ăèȘ­ă‚€ă“ăšăŒă§ăăŸă™ă€‚ diff --git a/docs/ja/docs/advanced/generate-clients.md b/docs/ja/docs/advanced/generate-clients.md index 42a60b787..196ec5280 100644 --- a/docs/ja/docs/advanced/generate-clients.md +++ b/docs/ja/docs/advanced/generate-clients.md @@ -20,20 +20,6 @@ FastAPI はè‡Ș拕的に **OpenAPI 3.1** ăźä»•æ§˜ă‚’ç”Ÿæˆă—ăŸă™ă€‚ă—ăŸăŒ /// -## FastAPI ă‚čăƒăƒłă‚”ăƒŒă«ă‚ˆă‚‹ SDK ă‚žă‚§ăƒăƒŹăƒŒă‚ż { #sdk-generators-from-fastapi-sponsors } - -ă“ăźă‚»ă‚Żă‚·ăƒ§ăƒłă§ăŻă€FastAPI をă‚čăƒăƒłă‚”ăƒŒă—ăŠă„ă‚‹äŒæ„­ă«ă‚ˆă‚‹ă€**ăƒ™ăƒłăƒăƒŁăƒŒæ”ŻæŽ**および**äŒæ„­æ”ŻæŽ**ăźă‚œăƒȘăƒ„ăƒŒă‚·ăƒ§ăƒłă‚’çŽčä»‹ă—ăŸă™ă€‚ă“ă‚Œă‚‰ăźèŁœć“ăŻă€é«˜ć“èłȘăȘ生成 SDK ă«ćŠ ăˆăŠă€**èżœćŠ æ©Ÿèƒœ**や**由搈**ă‚’æäŸ›ă—ăŸă™ă€‚ - -✹ [**FastAPI をă‚čăƒăƒłă‚”ăƒŒă™ă‚‹**](../help-fastapi.md#sponsor-the-author) ✹ ă“ăšă§ă€ă“ă‚Œă‚‰ăźäŒæ„­ăŻăƒ•ăƒŹăƒŒăƒ ăƒŻăƒŒă‚Żăšăăź**゚コシă‚čテム**ăźć„ć…šæ€§ăš**æŒç¶šćŻèƒœæ€§**ă‚’æ”ŻæŽă—ăŠă„ăŸă™ă€‚ - -ă“ăźæ”ŻæŽăŻă€FastAPI た**ă‚łăƒŸăƒ„ăƒ‹ăƒ†ă‚Ł**ïŒˆçš†ă•ă‚“ïŒ‰ăžăźćŒ·ă„ă‚łăƒŸăƒƒăƒˆăƒĄăƒłăƒˆăźèĄšæ˜Žă§ă‚‚ă‚ă‚Šă€**ć„Șă‚ŒăŸă‚”ăƒŒăƒ“ă‚č**ăźæäŸ›ă ă‘ă§ăȘく、栅牱でç™șć±•ă™ă‚‹ăƒ•ăƒŹăƒŒăƒ ăƒŻăƒŒă‚Ż FastAPI ă‚’æ”Żăˆă‚‹ć§żć‹ąă‚’ç€șă—ăŠă„ăŸă™ă€‚đŸ™‡ - -äŸ‹ăˆă°ă€æŹĄăźă‚ˆă†ăȘă‚‚ăźăŒă‚ă‚ŠăŸă™: - -* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) - -ă“ă‚Œă‚‰ăźă‚œăƒȘăƒ„ăƒŒă‚·ăƒ§ăƒłăźäž­ă«ăŻă‚ȘăƒŒăƒ—ăƒłă‚œăƒŒă‚čă‚„ç„Ąæ–™æž ă‚’æäŸ›ă™ă‚‹ă‚‚ăźă‚‚ă‚ă‚Šă€é‡‘éŠ­çš„ă‚łăƒŸăƒƒăƒˆăƒĄăƒłăƒˆăȘă—ă§è©Šă™ă“ăšăŒă§ăăŸă™ă€‚ä»–ăźć•†ç”š SDK ă‚žă‚§ăƒăƒŹăƒŒă‚żă‚‚ć­˜ćœšă—ă€ă‚Șăƒłăƒ©ă‚€ăƒłă§èŠ‹ă€ă‘ă‚‰ă‚ŒăŸă™ă€‚đŸ€“ - ## TypeScript SDK ă‚’äœœæˆă™ă‚‹ { #create-a-typescript-sdk } ăŸăšăŻç°Ąć˜ăȘ FastAPI ケプăƒȘă‹ă‚‰ć§‹ă‚ăŸă™: diff --git a/docs/ja/docs/advanced/json-base64-bytes.md b/docs/ja/docs/advanced/json-base64-bytes.md index c3c361a96..214ce14c6 100644 --- a/docs/ja/docs/advanced/json-base64-bytes.md +++ b/docs/ja/docs/advanced/json-base64-bytes.md @@ -4,7 +4,7 @@ ## Base64 ăšăƒ•ă‚Ąă‚€ăƒ« { #base64-vs-files } -ăƒă‚€ăƒŠăƒȘăƒ‡ăƒŒă‚żăźă‚ąăƒƒăƒ—ăƒ­ăƒŒăƒ‰ă«ăŻăŸăšă€JSON ă«ă‚šăƒłă‚łăƒŒăƒ‰ă™ă‚‹ä»Łă‚ă‚Šă« [Request Files](../tutorial/request-files.md) ă‚’ă€ăƒă‚€ăƒŠăƒȘăƒ‡ăƒŒă‚żăźé€äżĄă«ăŻ [ă‚«ă‚čタムレă‚čポンă‚č - FileResponse](./custom-response.md#fileresponse--fileresponse-) ă‚’äœżăˆă‚‹ă‹æ€œèšŽă—ăŠăă ă•ă„ă€‚ +ăƒă‚€ăƒŠăƒȘăƒ‡ăƒŒă‚żăźă‚ąăƒƒăƒ—ăƒ­ăƒŒăƒ‰ă«ăŻăŸăšă€JSON ă«ă‚šăƒłă‚łăƒŒăƒ‰ă™ă‚‹ä»Łă‚ă‚Šă« [ăƒȘクスă‚čăƒˆăƒ•ă‚Ąă‚€ăƒ«](../tutorial/request-files.md) ă‚’ă€ăƒă‚€ăƒŠăƒȘăƒ‡ăƒŒă‚żăźé€äżĄă«ăŻ [ă‚«ă‚čタムレă‚čポンă‚č - FileResponse](./custom-response.md#fileresponse) ă‚’äœżăˆă‚‹ă‹æ€œèšŽă—ăŠăă ă•ă„ă€‚ JSON は UTF-8 ă§ă‚šăƒłă‚łăƒŒăƒ‰ă•ă‚ŒăŸæ–‡ć­—ćˆ—ăźăżă‚’ć«ă‚ă‚‰ă‚Œă‚‹ăŸă‚ă€ç”Ÿăźăƒă‚€ăƒˆćˆ—ăŻć«ă‚ă‚‰ă‚ŒăŸă›ă‚“ă€‚ diff --git a/docs/ja/docs/advanced/openapi-callbacks.md b/docs/ja/docs/advanced/openapi-callbacks.md index 5bc90c68e..e3ddeab98 100644 --- a/docs/ja/docs/advanced/openapi-callbacks.md +++ b/docs/ja/docs/advanced/openapi-callbacks.md @@ -23,7 +23,7 @@ * API ćˆ©ç”šè€…ïŒˆć€–éƒšé–‹ç™șè€…ïŒ‰ă«é€šçŸ„ă‚’é€ă‚Šèż”ă—ăŸă™ă€‚ * ă“ă‚ŒăŻïŒˆă‚ăȘたぼ API ă‹ă‚‰ïŒ‰ć€–éƒšé–‹ç™șè€…ăŒæäŸ›ă™ă‚‹ *ć€–éƒš API* に POST ăƒȘクスă‚čăƒˆă‚’é€ă‚‹ă“ăšă§èĄŒă‚ă‚ŒăŸă™ïŒˆă“ă‚ŒăŒă€Œă‚łăƒŒăƒ«ăƒăƒƒă‚Żă€ă§ă™ïŒ‰ă€‚ -## 通澾ぼ FastAPI ケプăƒȘ { #the-normal-fastapi-app } +## 通澾ぼ **FastAPI** ケプăƒȘ { #the-normal-fastapi-app } ăŸăšă€ă‚łăƒŒăƒ«ăƒăƒƒă‚Żă‚’èżœćŠ ă™ă‚‹ć‰ăźé€šćžžăź API ケプăƒȘăŒă©ă†ăȘă‚‹ă‹èŠ‹ăŠăżăŸă—ă‚‡ă†ă€‚ @@ -76,7 +76,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) しかし、あăȘăŸăŻă™ă§ă« **FastAPI** で API たè‡Șć‹•ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆă‚’ç°Ąć˜ă«äœœă‚‹æ–čæł•ă‚’çŸ„ăŁăŠă„ăŸă™ă€‚ -ăăźçŸ„è­˜ă‚’äœżăŁăŠă€*ć€–éƒš API* ăŒă©ă†ă‚ă‚‹ăčăă‹ă‚’ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆćŒ–ă—ăŸă™â€Šâ€Šă€ăŸă‚Šă€ć€–éƒš API ăŒćźŸèŁ…ă™ăčき *path operation(s)*ïŒˆă‚ăȘたぼ API ăŒć‘Œăłć‡șă™ă‚‚ăźïŒ‰ă‚’äœœæˆă—ăŸă™ă€‚ +ăăźçŸ„è­˜ă‚’äœżăŁăŠă€*ć€–éƒš API* ăŒă©ă†ă‚ă‚‹ăčăă‹ă‚’ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆćŒ–ă—ăŸă™... ă€ăŸă‚Šă€ć€–éƒš API ăŒćźŸèŁ…ă™ăčき *path operation(s)*ïŒˆă‚ăȘたぼ API ăŒć‘Œăłć‡șă™ă‚‚ăźïŒ‰ă‚’äœœæˆă—ăŸă™ă€‚ /// tip | 豆矄識 @@ -86,13 +86,13 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) /// -### ă‚łăƒŒăƒ«ăƒăƒƒă‚Żç”š APIRouter ă‚’äœœæˆ { #create-a-callback-apirouter } +### ă‚łăƒŒăƒ«ăƒăƒƒă‚Żç”š `APIRouter` ă‚’äœœæˆ { #create-a-callback-apirouter } ăŸăšă€1 ă€ä»„äžŠăźă‚łăƒŒăƒ«ăƒăƒƒă‚Żă‚’ć«ă‚€æ–°ă—ă„ `APIRouter` ă‚’äœœæˆă—ăŸă™ă€‚ {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[1,23] *} -### ă‚łăƒŒăƒ«ăƒăƒƒă‚Żăź path operation ă‚’äœœæˆ { #create-the-callback-path-operation } +### ă‚łăƒŒăƒ«ăƒăƒƒă‚Żăź *path operation* ă‚’äœœæˆ { #create-the-callback-path-operation } äžŠă§äœœæˆă—ăŸăźăšćŒă˜ `APIRouter` ă‚’äœżăŁăŠă€ă‚łăƒŒăƒ«ăƒăƒƒă‚Żăź *path operation* ă‚’äœœæˆă—ăŸă™ă€‚ diff --git a/docs/ja/docs/advanced/response-change-status-code.md b/docs/ja/docs/advanced/response-change-status-code.md index 22f5f3701..35fcc5bbd 100644 --- a/docs/ja/docs/advanced/response-change-status-code.md +++ b/docs/ja/docs/advanced/response-change-status-code.md @@ -1,5 +1,6 @@ # ハă‚čポンă‚č - ă‚čăƒ†ăƒŒă‚żă‚čă‚łăƒŒăƒ‰ăźć€‰æ›Ž { #response-change-status-code } + ă™ă§ă«ă€ăƒ‡ăƒ•ă‚©ăƒ«ăƒˆăź[ハă‚čポンă‚čたă‚čăƒ†ăƒŒă‚żă‚čă‚łăƒŒăƒ‰](../tutorial/response-status-code.md)ă‚’èš­ćźšă§ăă‚‹ă“ăšă‚’ă”ć­˜çŸ„ă‹ă‚‚ă—ă‚ŒăŸă›ă‚“ă€‚ ă—ă‹ă—ć Žćˆă«ă‚ˆăŁăŠăŻă€ăƒ‡ăƒ•ă‚©ăƒ«ăƒˆăšăŻç•°ăȘるă‚čăƒ†ăƒŒă‚żă‚čă‚łăƒŒăƒ‰ă‚’èż”ă™ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚ diff --git a/docs/ja/docs/advanced/response-cookies.md b/docs/ja/docs/advanced/response-cookies.md index c395b09c6..912181554 100644 --- a/docs/ja/docs/advanced/response-cookies.md +++ b/docs/ja/docs/advanced/response-cookies.md @@ -1,5 +1,6 @@ # ハă‚čポンă‚čた Cookie { #response-cookies } + ## `Response` ăƒ‘ăƒ©ăƒĄăƒŒă‚żă‚’äœżă† { #use-a-response-parameter } *path operation é–ąæ•°*で `Response` ćž‹ăźăƒ‘ăƒ©ăƒĄăƒŒă‚żă‚’ćźŁèš€ă§ăăŸă™ă€‚ diff --git a/docs/ja/docs/advanced/response-headers.md b/docs/ja/docs/advanced/response-headers.md index 3a61f5742..d5f6f31a3 100644 --- a/docs/ja/docs/advanced/response-headers.md +++ b/docs/ja/docs/advanced/response-headers.md @@ -1,5 +1,6 @@ # ハă‚čポンă‚čăƒ˜ăƒƒăƒ€ăƒŒ { #response-headers } + ## `Response` ăƒ‘ăƒ©ăƒĄăƒŒă‚żă‚’äœżă† { #use-a-response-parameter } Cookie ăšćŒæ§˜ă«ïŒ‰*path operation é–ąæ•°*で `Response` ćž‹ăźăƒ‘ăƒ©ăƒĄăƒŒă‚żă‚’ćźŁèš€ă§ăăŸă™ă€‚ diff --git a/docs/ja/docs/advanced/security/oauth2-scopes.md b/docs/ja/docs/advanced/security/oauth2-scopes.md index cab7f8deb..b01bd01ca 100644 --- a/docs/ja/docs/advanced/security/oauth2-scopes.md +++ b/docs/ja/docs/advanced/security/oauth2-scopes.md @@ -1,5 +1,6 @@ # OAuth2 たă‚čă‚łăƒŒăƒ— { #oauth2-scopes } + OAuth2 たă‚čă‚łăƒŒăƒ—ăŻ **FastAPI** ă§ç›ŽæŽ„ćˆ©ç”šă§ăă€ă‚·ăƒŒăƒ ăƒŹă‚čă«ç”±ćˆă•ă‚ŒăŠă„ăŸă™ă€‚ ă“ă‚Œă«ă‚ˆă‚Šă€OAuth2 æš™æș–ă«ćŸ“ăŁăŸă€ă‚ˆă‚Šăă‚çŽ°ă‹ăȘæš©é™ă‚·ă‚čテムを、OpenAPI ćŻŸćżœă‚ąăƒ—ăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłïŒˆăŠă‚ˆăł API ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆïŒ‰ă«ç”±ćˆă§ăăŸă™ă€‚ diff --git a/docs/ja/docs/advanced/settings.md b/docs/ja/docs/advanced/settings.md index e42ec845c..b3fd89a46 100644 --- a/docs/ja/docs/advanced/settings.md +++ b/docs/ja/docs/advanced/settings.md @@ -52,7 +52,7 @@ Pydantic から `BaseSettings` ă‚’ă‚€ăƒłăƒăƒŒăƒˆă—ăŠă€ăăźă‚”ăƒ–ă‚Żăƒ©ă‚č Pydantic ăƒąăƒ‡ăƒ«ăšćŒæ§˜ă«ă€ćž‹ă‚ąăƒŽăƒ†ăƒŒă‚·ăƒ§ăƒłăšïŒˆćż…èŠăȘă‚‰ïŒ‰ăƒ‡ăƒ•ă‚©ăƒ«ăƒˆć€€ă‚’æŒă€ă‚Żăƒ©ă‚čć±žæ€§ă‚’ćźŁèš€ă—ăŸă™ă€‚ -`Field()` ă«ă‚ˆă‚‹èżœćŠ ăƒăƒȘăƒ‡ăƒŒă‚·ăƒ§ăƒłăȘど、Pydantic ăƒąăƒ‡ăƒ«ă§äœżăˆă‚‹ăźăšćŒă˜ăƒăƒȘăƒ‡ăƒŒă‚·ăƒ§ăƒłæ©Ÿèƒœă‚’ă™ăčăŠćˆ©ç”šă§ăăŸă™ă€‚ +異ăȘă‚‹ăƒ‡ăƒŒă‚żćž‹ă‚„ `Field()` ă«ă‚ˆă‚‹èżœćŠ ăƒăƒȘăƒ‡ăƒŒă‚·ăƒ§ăƒłăȘど、Pydantic ăƒąăƒ‡ăƒ«ă§äœżăˆă‚‹ăźăšćŒă˜ăƒăƒȘăƒ‡ăƒŒă‚·ăƒ§ăƒłæ©Ÿèƒœăšăƒ„ăƒŒăƒ«ă‚’ă™ăčăŠćˆ©ç”šă§ăăŸă™ă€‚ {* ../../docs_src/settings/tutorial001_py310.py hl[2,5:8,11] *} diff --git a/docs/ja/docs/advanced/stream-data.md b/docs/ja/docs/advanced/stream-data.md index 820f2d8b6..6360cdab5 100644 --- a/docs/ja/docs/advanced/stream-data.md +++ b/docs/ja/docs/advanced/stream-data.md @@ -2,9 +2,9 @@ JSON ăšă—ăŠæ§‹é€ ćŒ–ă§ăă‚‹ăƒ‡ăƒŒă‚żă‚’ă‚čトăƒȘăƒŒăƒ ă—ăŸă„ć ŽćˆăŻă€[JSON Lines をă‚čトăƒȘăƒŒăƒ ă™ă‚‹](../tutorial/stream-json-lines.md) を揂照しどください。 -しかし、箔çȋăȘăƒă‚€ăƒŠăƒȘăƒ‡ăƒŒă‚żă‚„æ–‡ć­—ćˆ—ă‚’ă‚čトăƒȘăƒŒăƒ ă—ăŸă„ć ŽćˆăŻă€æŹĄăźă‚ˆă†ă«ă§ăăŸă™ă€‚ +しかし、**箔çȋăȘăƒă‚€ăƒŠăƒȘăƒ‡ăƒŒă‚ż**ă‚„æ–‡ć­—ćˆ—ă‚’ă‚čトăƒȘăƒŒăƒ ă—ăŸă„ć ŽćˆăŻă€æŹĄăźă‚ˆă†ă«ă§ăăŸă™ă€‚ -/// note | æƒ…ć ± +/// note | ć‚™è€ƒ FastAPI 0.134.0 ă§èżœćŠ ă•ă‚ŒăŸă—ăŸă€‚ @@ -12,21 +12,21 @@ FastAPI 0.134.0 ă§èżœćŠ ă•ă‚ŒăŸă—ăŸă€‚ ## ăƒŠăƒŒă‚čă‚±ăƒŒă‚č { #use-cases } -äŸ‹ăˆă°ă€AI LLM ă‚”ăƒŒăƒ“ă‚čたć‡șćŠ›ă‚’ăăźăŸăŸă€çŽ”çȋăȘæ–‡ć­—ćˆ—ăšă—ăŠă‚čトăƒȘăƒŒăƒ ă—ăŸă„ć Žćˆă«äœżăˆăŸă™ă€‚ +äŸ‹ăˆă°ă€**AI LLM** ă‚”ăƒŒăƒ“ă‚čたć‡șćŠ›ă‚’ăăźăŸăŸă€çŽ”çȋăȘæ–‡ć­—ćˆ—ăšă—ăŠă‚čトăƒȘăƒŒăƒ ă—ăŸă„ć Žćˆă«äœżăˆăŸă™ă€‚ -ュヹăƒȘに䞀ćșŠă«ć…šăŠèȘ­ăżèŸŒă‚€ă“ずăȘく、èȘ­ăżèŸŒăżăȘăŒă‚‰ăƒăƒŁăƒłă‚Żă”ăšă«é€ă‚‹ă“ăšă§ă€ć·šć€§ăȘăƒă‚€ăƒŠăƒȘăƒ•ă‚Ąă‚€ăƒ«ă‚’ă‚čトăƒȘăƒŒăƒ ă™ă‚‹ă“ăšă«ă‚‚äœżăˆăŸă™ă€‚ +ュヹăƒȘに䞀ćșŠă«ć…šăŠèȘ­ăżèŸŒă‚€ă“ずăȘく、èȘ­ăżèŸŒăżăȘăŒă‚‰ăƒăƒŁăƒłă‚Żă”ăšă«é€ă‚‹ă“ăšă§ă€**淚性ăȘăƒă‚€ăƒŠăƒȘăƒ•ă‚Ąă‚€ăƒ«**をă‚čトăƒȘăƒŒăƒ ă™ă‚‹ă“ăšă«ă‚‚äœżăˆăŸă™ă€‚ -ćŒæ§˜ă«ă€ć‹•ç”»ă‚„éŸłćŁ°ă‚’ă‚čトăƒȘăƒŒăƒ ă™ă‚‹ă“ăšă‚‚ă§ăăŸă™ă€‚ć‡Šç†ă—ăȘăŒă‚‰ç”Ÿæˆă—ă€ăăźăŸăŸé€äżĄă™ă‚‹ă“ăšă‚‚ćŻèƒœă§ă™ă€‚ +ćŒæ§˜ă«ă€**ć‹•ç”»**や**音棰**をă‚čトăƒȘăƒŒăƒ ă™ă‚‹ă“ăšă‚‚ă§ăăŸă™ă€‚ć‡Šç†ă—ăȘăŒă‚‰ç”Ÿæˆă—ă€ăăźăŸăŸé€äżĄă™ă‚‹ă“ăšă‚‚ćŻèƒœă§ă™ă€‚ ## `yield` ă‚’äœżăŁăŸ `StreamingResponse` { #a-streamingresponse-with-yield } -path operation é–ąæ•°ă§ `response_class=StreamingResponse` ă‚’ćźŁèš€ă™ă‚‹ăšă€`yield` ă‚’äœżăŁăŠăƒ‡ăƒŒă‚żă‚’ăƒăƒŁăƒłă‚Żă”ăšă«é †æŹĄé€äżĄă§ăăŸă™ă€‚ +*path operation é–ąæ•°*で `response_class=StreamingResponse` ă‚’ćźŁèš€ă™ă‚‹ăšă€`yield` ă‚’äœżăŁăŠăƒ‡ăƒŒă‚żă‚’ăƒăƒŁăƒłă‚Żă”ăšă«é †æŹĄé€äżĄă§ăăŸă™ă€‚ {* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *} FastAPI ăŻć„ăƒ‡ăƒŒă‚żăƒăƒŁăƒłă‚Żă‚’ăăźăŸăŸ `StreamingResponse` ă«æžĄă—ă€JSON ăȘă©ă«ć€‰æ›ă—ă‚ˆă†ăšăŻă—ăŸă›ă‚“ă€‚ -### 非 async ăȘ path operation é–ąæ•° { #non-async-path-operation-functions } +### 非 async ăȘ *path operation é–ąæ•°* { #non-async-path-operation-functions } `async` ăȘしぼ通澾ぼ `def` é–ąæ•°ă§ă‚‚ćŒæ§˜ă« `yield` ă‚’äœżăˆăŸă™ă€‚ @@ -40,7 +40,7 @@ FastAPI ăŻć„ăƒ‡ăƒŒă‚żăƒăƒŁăƒłă‚Żă‚’ăăźăŸăŸ `StreamingResponse` ă«æžĄă— {* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} -ă€ăŸă‚Šă€`StreamingResponse` ă§ăŻćž‹ă‚ąăƒŽăƒ†ăƒŒă‚·ăƒ§ăƒłă«äŸć­˜ă›ăšă€é€äżĄă—ăŸă„ćœąćŒă«ćˆă‚ă›ăŠăƒă‚€ăƒˆćˆ—ă‚’ç”Ÿæˆăƒ»ă‚šăƒłă‚łăƒŒăƒ‰ă™ă‚‹ă€Œè‡Șç”±ă€ăšă€ŒèČŹä»»ă€ăŒă‚ăȘăŸă«ă‚ă‚ŠăŸă™ă€‚ đŸ€“ +ă€ăŸă‚Šă€`StreamingResponse` ă§ăŻćž‹ă‚ąăƒŽăƒ†ăƒŒă‚·ăƒ§ăƒłă«äŸć­˜ă›ăšă€é€äżĄă—ăŸă„ćœąćŒă«ćˆă‚ă›ăŠăƒă‚€ăƒˆćˆ—ă‚’ç”Ÿæˆăƒ»ă‚šăƒłă‚łăƒŒăƒ‰ă™ă‚‹**è‡Ș由**ず**èČŹä»»**があăȘăŸă«ă‚ă‚ŠăŸă™ă€‚ đŸ€“ ### ăƒă‚€ăƒˆćˆ—ă‚’ă‚čトăƒȘăƒŒăƒ ă™ă‚‹ { #stream-bytes } @@ -58,7 +58,7 @@ FastAPI ăŻć„ăƒ‡ăƒŒă‚żăƒăƒŁăƒłă‚Żă‚’ăăźăŸăŸ `StreamingResponse` ă«æžĄă— {* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} -ăăźćŸŒă€path operation é–ąæ•°ă§ `response_class=PNGStreamingResponse` ăšă—ăŠă“ăźæ–°ă—ă„ă‚Żăƒ©ă‚čă‚’äœżç”šă§ăăŸă™: +ăăźćŸŒă€*path operation é–ąæ•°*で `response_class=PNGStreamingResponse` ăšă—ăŠă“ăźæ–°ă—ă„ă‚Żăƒ©ă‚čă‚’äœżç”šă§ăăŸă™: {* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} @@ -90,7 +90,7 @@ FastAPI ăŻć„ăƒ‡ăƒŒă‚żăƒăƒŁăƒłă‚Żă‚’ăăźăŸăŸ `StreamingResponse` ă«æžĄă— ăŸăŸă€ć€šăăźć Žćˆă€ăƒ‡ă‚Łă‚čă‚Żă‚„ăƒăƒƒăƒˆăƒŻăƒŒă‚Żă‹ă‚‰èȘ­ăżć‡șすため、èȘ­ăżć–ă‚ŠăŻăƒ–ăƒ­ăƒƒă‚­ăƒłă‚°ïŒˆă‚€ăƒ™ăƒłăƒˆăƒ«ăƒŒăƒ—ă‚’ăƒ–ăƒ­ăƒƒă‚Żă—ćŸ—ă‚‹ïŒ‰ć‡Šç†ă«ăȘă‚ŠăŸă™ă€‚ -/// note | æƒ…ć ± +/// note | ć‚™è€ƒ äžŠèš˜ăźäŸ‹ăŻäŸ‹ć€–ă§ă€`io.BytesIO` ăŻæ—ąă«ăƒĄăƒąăƒȘäžŠă«ă‚ă‚‹ăŸă‚ă€èȘ­ăżć–ă‚ŠăŒäœ•ă‹ă‚’ăƒ–ăƒ­ăƒƒă‚Żă™ă‚‹ă“ăšăŻă‚ă‚ŠăŸă›ă‚“ă€‚ @@ -98,7 +98,7 @@ FastAPI ăŻć„ăƒ‡ăƒŒă‚żăƒăƒŁăƒłă‚Żă‚’ăăźăŸăŸ `StreamingResponse` ă«æžĄă— /// -ă‚€ăƒ™ăƒłăƒˆăƒ«ăƒŒăƒ—ăźăƒ–ăƒ­ăƒƒă‚­ăƒłă‚°ă‚’éżă‘ă‚‹ă«ăŻă€path operation é–ąæ•°ă‚’ `async def` ではăȘく通澾ぼ `def` ă§ćźŁèš€ă—ăŠăă ă•ă„ă€‚ăă†ă™ă‚‹ăš FastAPI ăŻăăźé–ąæ•°ă‚’ă‚čăƒŹăƒƒăƒ‰ăƒ—ăƒŒăƒ«ăƒŻăƒŒă‚«ăƒŒäžŠă§ćźŸèĄŒă—ă€ăƒĄă‚€ăƒłăƒ«ăƒŒăƒ—ăźăƒ–ăƒ­ăƒƒă‚­ăƒłă‚°ă‚’éżă‘ăŸă™ă€‚ +ă‚€ăƒ™ăƒłăƒˆăƒ«ăƒŒăƒ—ăźăƒ–ăƒ­ăƒƒă‚­ăƒłă‚°ă‚’éżă‘ă‚‹ă«ăŻă€*path operation é–ąæ•°*を `async def` ではăȘく通澾ぼ `def` ă§ćźŁèš€ă—ăŠăă ă•ă„ă€‚ăă†ă™ă‚‹ăš FastAPI ăŻăăźé–ąæ•°ă‚’ă‚čăƒŹăƒƒăƒ‰ăƒ—ăƒŒăƒ«ăƒŻăƒŒă‚«ăƒŒäžŠă§ćźŸèĄŒă—ă€ăƒĄă‚€ăƒłăƒ«ăƒŒăƒ—ăźăƒ–ăƒ­ăƒƒă‚­ăƒłă‚°ă‚’éżă‘ăŸă™ă€‚ {* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} diff --git a/docs/ja/docs/advanced/wsgi.md b/docs/ja/docs/advanced/wsgi.md index bab1ae3bf..40511398d 100644 --- a/docs/ja/docs/advanced/wsgi.md +++ b/docs/ja/docs/advanced/wsgi.md @@ -1,5 +1,6 @@ # WSGI ăźç”„ăżèŸŒăż - Flask、Django ăȘど { #including-wsgi-flask-django-others } + [ă‚”ăƒ–ă‚ąăƒ—ăƒȘă‚±ăƒŒă‚·ăƒ§ăƒł - マォント](sub-applications.md)、[ăƒ—ăƒ­ă‚­ă‚·ăźèƒŒćŸŒ](behind-a-proxy.md) ă§èŠ‹ăŸă‚ˆă†ă«ă€WSGI ケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłă‚’ăƒžă‚Šăƒłăƒˆă§ăăŸă™ă€‚ ăăźăŸă‚ă« `WSGIMiddleware` ă‚’äœżç”šă—ăŠă€Flask や Django ăȘどた WSGI ケプăƒȘă‚’ăƒ©ăƒƒăƒ—ă§ăăŸă™ă€‚ diff --git a/docs/ja/docs/alternatives.md b/docs/ja/docs/alternatives.md index b1b3874a7..3b3140ed8 100644 --- a/docs/ja/docs/alternatives.md +++ b/docs/ja/docs/alternatives.md @@ -88,7 +88,7 @@ RequestsăŻéžćžžă«ă‚·ăƒłăƒ—ăƒ«ă‹ă€ç›Žæ„Ÿçš„ăȘăƒ‡ă‚¶ă‚€ăƒłă§äœżă„ă‚„ă™ă response = requests.get("http://example.com/some/url") ``` -ćŻŸćżœă™ă‚‹FastAPIたAPIたpath operationăŻă“ăźă‚ˆă†ă«ăȘă‚ŠăŸă™: +ćŻŸćżœă™ă‚‹FastAPI恎たAPI *path operation* ăŻă“ăźă‚ˆă†ă«ăȘă‚ŠăŸă™: ```Python hl_lines="1" @app.get("/some/url") @@ -96,12 +96,12 @@ def read_url(): return {"message": "Hello World"} ``` - `requests.get(...)` ず`@app.get(...)` ă«ăŻéĄžäŒŒç‚čăŒèŠ‹ć—ă‘ă‚‰ă‚ŒăŸă™ă€‚ +`requests.get(...)` ず`@app.get(...)` ă«ăŻéĄžäŒŒç‚čăŒèŠ‹ć—ă‘ă‚‰ă‚ŒăŸă™ă€‚ /// tip | **FastAPI**ăžäžŽăˆăŸă‚€ăƒłă‚čăƒ”ăƒŹăƒŒă‚·ăƒ§ăƒł * ă‚·ăƒłăƒ—ăƒ«ă§ç›Žæ„Ÿçš„ăȘAPIă‚’æŒăŁăŠă„ă‚‹ç‚č。 -* HTTPăƒĄă‚œăƒƒăƒ‰ćă‚’ç›ŽæŽ„ćˆ©ç”šă—ă€ć˜çŽ”ă§ç›Žæ„Ÿçš„ă§ă‚ă‚‹ă€‚ +* HTTPăƒĄă‚œăƒƒăƒ‰ć (operation) ă‚’ç›ŽæŽ„ćˆ©ç”šă—ă€ć˜çŽ”ă§ç›Žæ„Ÿçš„ă§ă‚ă‚‹ă€‚ * é©ćˆ‡ăȘăƒ‡ăƒ•ă‚©ăƒ«ăƒˆć€€ă‚’æŒăĄă€ă€ă€ćŒ·ćŠ›ăȘă‚«ă‚čă‚żăƒžă‚€ă‚șæ€§ă‚’æŒăŁăŠă„ă‚‹ă€‚ /// @@ -223,7 +223,7 @@ Flask、Flask-apispec、Marshmallow、Webargsăźç”„ăżćˆă‚ă›ăŻă€**FastAPI** * [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase) * [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb) -ăă—ăŠă€ă“ă‚Œă‚‰ăźăƒ•ăƒ«ă‚čă‚żăƒƒă‚Żă‚žă‚§ăƒăƒŹăƒŒă‚żăƒŒăŻă€[**FastAPI** Project Generators](project-generation.md)ぼ慃べăȘăŁăŠă„ăŸă—ăŸă€‚ +ăă—ăŠă€ă“ă‚Œă‚‰ăźăƒ•ăƒ«ă‚čă‚żăƒƒă‚Żă‚žă‚§ăƒăƒŹăƒŒă‚żăƒŒăŻă€[**FastAPI** ăƒ—ăƒ­ă‚žă‚§ă‚Żăƒˆă‚žă‚§ăƒăƒŹăƒŒă‚żăƒŒ](project-generation.md)ぼ慃べăȘăŁăŠă„ăŸă—ăŸă€‚ /// note | ć‚™è€ƒ @@ -247,7 +247,7 @@ Angular 2ă«ă‚€ăƒłă‚čăƒ”ăƒŹăƒŒă‚·ăƒ§ăƒłă‚’ć—ă‘ăŸă€ç”±ćˆă•ă‚ŒăŸäŸć­˜æ€§ ăƒ‘ăƒ©ăƒĄăƒŒă‚żăŻTypeScriptăźćž‹ă§èš˜èż°ă•ă‚Œă‚‹ăźă§ (Pythonăźćž‹ăƒ’ăƒłăƒˆă«äŒŒăŠă„ăŸă™) ă€ă‚šăƒ‡ă‚Łă‚żăźă‚”ăƒăƒŒăƒˆăŻăšăŠă‚‚è‰Żă„ă§ă™ă€‚ -しかし、TypeScriptăźăƒ‡ăƒŒă‚żăŻJavaScriptăžăźă‚łăƒłăƒ‘ă‚€ăƒ«ćŸŒă«ăŻæź‹ă•ă‚ŒăȘいため、バăƒȘăƒ‡ăƒŒă‚·ăƒ§ăƒłă€ă‚·ăƒȘă‚ąăƒ©ă‚€ă‚ŒăƒŒă‚·ăƒ§ăƒłă€ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆćŒ–ă‚’ćŒæ™‚ă«ćźšçŸ©ă™ă‚‹ăźă«ćž‹ă«é Œă‚‹ă“ăšăŻă§ăăŸă›ă‚“ă€‚ăăźăŸă‚ă€ăƒăƒȘăƒ‡ăƒŒă‚·ăƒ§ăƒłă€ă‚·ăƒȘă‚ąăƒ©ă‚€ă‚ŒăƒŒă‚·ăƒ§ăƒłă€ă‚čă‚­ăƒŒăƒžăźè‡Șć‹•ç”Ÿæˆă‚’èĄŒă†ăŸă‚ă«ăŻă€ć€šăăźć Žæ‰€ă§ăƒ‡ă‚łăƒŹăƒŒă‚żă‚’èżœćŠ ă™ă‚‹ćż…èŠăŒă‚ă‚Šă€éžćžžă«ć†—é•·ă«ăȘă‚ŠăŸă™ă€‚ +しかし、TypeScriptăźăƒ‡ăƒŒă‚żăŻJavaScriptăžăźă‚łăƒłăƒ‘ă‚€ăƒ«ćŸŒă«ăŻæź‹ă•ă‚ŒăȘいため、バăƒȘăƒ‡ăƒŒă‚·ăƒ§ăƒłă€ă‚·ăƒȘă‚ąăƒ©ă‚€ă‚ŒăƒŒă‚·ăƒ§ăƒłă€ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆćŒ–ă‚’ćŒæ™‚ă«ćźšçŸ©ă™ă‚‹ăźă«ćž‹ă«é Œă‚‹ă“ăšăŻă§ăăŸă›ă‚“ă€‚ă“ăźă“ăšăšă„ăă€ă‹ăźèš­èšˆäžŠăźćˆ€æ–­ă«ă‚ˆă‚Šă€ăƒăƒȘăƒ‡ăƒŒă‚·ăƒ§ăƒłă€ă‚·ăƒȘă‚ąăƒ©ă‚€ă‚ŒăƒŒă‚·ăƒ§ăƒłă€ă‚čă‚­ăƒŒăƒžăźè‡Șć‹•ç”Ÿæˆă‚’èĄŒă†ăŸă‚ă«ăŻă€ć€šăăźć Žæ‰€ă§ăƒ‡ă‚łăƒŹăƒŒă‚żă‚’èżœćŠ ă™ă‚‹ćż…èŠăŒă‚ă‚Šă€éžćžžă«ć†—é•·ă«ăȘă‚ŠăŸă™ă€‚ ć…„ă‚Œć­ă«ăȘăŁăŸăƒąăƒ‡ăƒ«ă‚’ă†ăŸăæ‰±ăˆăŸă›ă‚“ă€‚ăăźăŸă‚ă€ăƒȘクスă‚čトたJSONăƒœăƒ‡ă‚ŁăŒć†…éƒšăƒ•ă‚ŁăƒŒăƒ«ăƒ‰ă‚’æŒă€JSONă‚Șブゾェクトで、それが順ç•Șă«ăƒă‚čトされたJSONă‚Șăƒ–ă‚žă‚§ă‚Żăƒˆă«ăȘăŁăŠă„ă‚‹ć Žćˆă€é©ćˆ‡ă«ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆćŒ–ă‚„ăƒăƒȘăƒ‡ăƒŒă‚·ăƒ§ăƒłă‚’ă™ă‚‹ă“ăšăŒă§ăăŸă›ă‚“ă€‚ @@ -333,15 +333,15 @@ OpenAPIやJSON SchemaぼようăȘæš™æș–にćŸșă„ă„ăŸă‚‚ăźă§ăŻă‚ă‚ŠăŸă› ćŒă˜ăƒ•ăƒŹăƒŒăƒ ăƒŻăƒŒă‚Żă‚’äœżăŁăŠAPIずCLIă‚’äœœæˆă§ăă‚‹ă€éąç™œăçă—ă„æ©Ÿèƒœă‚’æŒăŁăŠă„ăŸă™ă€‚ -ä»„ć‰ăźPythonăźćŒæœŸćž‹Webăƒ•ăƒŹăƒŒăƒ ăƒŻăƒŒă‚Żæš™æș– (WSGI) ă‚’ăƒ™ăƒŒă‚čă«ă—ăŠă„ă‚‹ăŸă‚ă€WebsocketăȘă©ăŻæ‰±ăˆăŸă›ă‚“ăŒă€ăă‚Œă§ă‚‚é«˜æ€§èƒœă§ă™ă€‚ +ä»„ć‰ăźPythonăźćŒæœŸćž‹Webăƒ•ăƒŹăƒŒăƒ ăƒŻăƒŒă‚Żæš™æș– (WSGI) ă‚’ăƒ™ăƒŒă‚čă«ă—ăŠă„ă‚‹ăŸă‚ă€WebSocketăȘă©ăŻæ‰±ăˆăŸă›ă‚“ăŒă€ăă‚Œă§ă‚‚é«˜æ€§èƒœă§ă™ă€‚ /// note | ć‚™è€ƒ -HugはTimothy Crosleyă«ă‚ˆă‚Šäœœæˆă•ă‚ŒăŸă—ăŸă€‚ćœŒăŻ[`isort`](https://github.com/timothycrosley/isort)ăȘど、Pythonăźăƒ•ă‚Ąă‚€ăƒ«ć†…ăźă‚€ăƒłăƒăƒŒăƒˆăźäžŠăłæ›żăˆă‚’è‡Ș拕的におこうăȘă†çŽ æ™Žă‚‰ă—ă„ăƒ„ăƒŒăƒ«ăźé–‹ç™șè€…ă§ă™ă€‚ +HugはTimothy Crosleyă«ă‚ˆă‚Šäœœæˆă•ă‚ŒăŸă—ăŸă€‚ćœŒăŻ[`isort`](https://github.com/timothycrosley/isort)ăȘど、Pythonăźăƒ•ă‚Ąă‚€ăƒ«ć†…ăźă‚€ăƒłăƒăƒŒăƒˆăźäžŠăłæ›żăˆă‚’è‡Șć‹•çš„ă«èĄŒă†çŽ æ™Žă‚‰ă—ă„ăƒ„ăƒŒăƒ«ăźé–‹ç™șè€…ă§ă™ă€‚ /// -/// tip | **FastAPI**ăžäžŽăˆăŸă‚€ăƒłă‚čăƒ”ăƒŹăƒŒă‚·ăƒ§ăƒł +/// tip | **FastAPI**ă«ă‚€ăƒłă‚čăƒ”ăƒŹăƒŒă‚·ăƒ§ăƒłă‚’äžŽăˆăŸă‚ąă‚€ăƒ‡ă‚ą HugはAPIStară«éƒšćˆ†çš„ăȘă‚€ăƒłă‚čăƒ”ăƒŹăƒŒă‚·ăƒ§ăƒłă‚’äžŽăˆăŠăŠă‚Šă€ç§ăŒç™șèŠ‹ă—ăŸäž­ă§ăŻAPIStarăšćŒæ§˜ă«æœ€ă‚‚æœŸćŸ…ăźæŒăŠă‚‹ăƒ„ăƒŒăƒ«ăźäž€ă€ă§ă—ăŸă€‚ @@ -430,7 +430,7 @@ StarletteăŻă€è»œé‡ăȘCtrl + Shift + P、macOS: Cmd + Shift + PïŒ‰ă‚’é–‹ăă€"Welcome: Open walkthrough..." ă‚’éžæŠžă—ăŠă‹ă‚‰ă€"Get started with FastAPI" ăźă‚Šă‚©ăƒŒă‚Żă‚čăƒ«ăƒŒă‚’éžă‚“ă§ăă ă•ă„ă€‚ +æ‹ĄćŒ”æ©Ÿèƒœăźæ©Ÿèƒœă«æ…Łă‚Œă‚‹ă«ăŻă€ă‚łăƒžăƒłăƒ‰ăƒ‘ăƒŹăƒƒăƒˆïŒˆCtrl + Shift + P、macOS: Cmd + Shift + PïŒ‰ă‚’é–‹ăă€ă€ŒWelcome: Open walkthrough...ă€ă‚’éžæŠžă—ăŠă‹ă‚‰ă€ă€ŒGet started with FastAPIă€ăźă‚Šă‚©ăƒŒă‚Żă‚čăƒ«ăƒŒă‚’éžă‚“ă§ăă ă•ă„ă€‚ diff --git a/docs/ja/docs/environment-variables.md b/docs/ja/docs/environment-variables.md index 846f32846..eb20d3a58 100644 --- a/docs/ja/docs/environment-variables.md +++ b/docs/ja/docs/environment-variables.md @@ -163,7 +163,7 @@ Hello World from Python ă€ăŸă‚Šă€ç’°ćąƒć€‰æ•°ă‹ă‚‰PythonでèȘ­ăżć–ă‚‹**あらゆる怀**は **`str`にăȘり**ă€ä»–ăźćž‹ăžăźć€‰æ›ă‚„ăƒăƒȘăƒ‡ăƒŒă‚·ăƒ§ăƒłăŻă‚łăƒŒăƒ‰ć†…ă§èĄŒă†ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚ -ç’°ćąƒć€‰æ•°ă‚’äœżăŁăŠ**ケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłèš­ćźš**ă‚’æ‰±ă†æ–čæł•に぀いおは、[高ćșŠăȘăƒŠăƒŒă‚¶ăƒŒă‚Źă‚€ăƒ‰ - Settings and Environment Variables](./advanced/settings.md)ă§è©łă—ăć­ŠăčăŸă™ă€‚ +ç’°ćąƒć€‰æ•°ă‚’äœżăŁăŠ**ケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłèš­ćźš**ă‚’æ‰±ă†æ–čæł•に぀いおは、[高ćșŠăȘăƒŠăƒŒă‚¶ăƒŒă‚Źă‚€ăƒ‰ - èš­ćźšăšç’°ćąƒć€‰æ•°](./advanced/settings.md)ă§è©łă—ăć­ŠăčăŸă™ă€‚ ## `PATH`ç’°ćąƒć€‰æ•° { #path-environment-variable } @@ -285,7 +285,7 @@ $ C:\opt\custompython\bin\python //// -ă“ăźæƒ…ć ±ăŻă€[Virtual Environments](virtual-environments.md)に぀いお歊ぶ際にもćœčç«‹ăĄăŸă™ă€‚ +ă“ăźæƒ…ć ±ăŻă€[ä»źæƒłç’°ćąƒ](virtual-environments.md)に぀いお歊ぶ際にもćœčç«‹ăĄăŸă™ă€‚ ## ăŸăšă‚ { #conclusion } @@ -295,4 +295,4 @@ $ C:\opt\custompython\bin\python ć€šăăźć Žćˆă€ç’°ćąƒć€‰æ•°ăŒă©ăźă‚ˆă†ă«ćœčç«‹ăĄă€ă™ăă«é©ç”šă§ăă‚‹ăźă‹ăŻă‚ăŸă‚Šæ˜Žçąșă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ă—ă‹ă—ă€é–‹ç™șäž­ăźă•ăŸă–ăŸăȘă‚·ăƒŠăƒȘă‚Șă§äœ•ćșŠă‚‚ç™»ć Žă™ă‚‹ăŸă‚ă€çŸ„っどおくべよいでしょう。 -äŸ‹ăˆă°ă€æŹĄăźă‚»ă‚Żă‚·ăƒ§ăƒłăź[Virtual Environments](virtual-environments.md)ă§ă“ăźæƒ…ć ±ăŒćż…èŠă«ăȘă‚ŠăŸă™ă€‚ +äŸ‹ăˆă°ă€æŹĄăźă‚»ă‚Żă‚·ăƒ§ăƒłăź[ä»źæƒłç’°ćąƒ](virtual-environments.md)ă§ă“ăźæƒ…ć ±ăŒćż…èŠă«ăȘă‚ŠăŸă™ă€‚ diff --git a/docs/ja/docs/features.md b/docs/ja/docs/features.md index 607a59c4d..930988428 100644 --- a/docs/ja/docs/features.md +++ b/docs/ja/docs/features.md @@ -99,7 +99,7 @@ Python 開ç™ș者èȘżæŸ»ă§ăŻă€[æœ€ă‚‚ă‚ˆăäœżă‚ă‚Œă‚‹æ©Ÿèƒœăź 1 ă€ăŒă€Œă‚Ș すăčăŠă«ćŠ„ćœ“ăȘ **ăƒ‡ăƒ•ă‚©ăƒ«ăƒˆ** ăŒă‚ă‚Šă€ă©ă“ă§ă‚‚ă‚Șăƒ—ă‚·ăƒ§ăƒłă§æ§‹æˆă§ăăŸă™ă€‚ćż…èŠă«ćżœă˜ăŠă™ăčăŠăźăƒ‘ăƒ©ăƒĄăƒŒă‚żă‚’ćŸźèȘżæ•Žă—ăŠă€æ±‚ă‚ă‚‹ API ă‚’ćźšçŸ©ă§ăăŸă™ă€‚ -ă—ă‹ă—ăƒ‡ăƒ•ă‚©ăƒ«ăƒˆăźăŸăŸă§ă‚‚ă€ă™ăčお **ă†ăŸăć‹•ăăŸă™**。 +ă—ă‹ă—ăƒ‡ăƒ•ă‚©ăƒ«ăƒˆăźăŸăŸă§ă‚‚ă€ă™ăčお **ă€Œă†ăŸăć‹•ăăŸă™ă€**。 ### 怜蚌 { #validation } @@ -140,7 +140,7 @@ FastAPI ă«ăŻă€éžćžžă«äœżă„ă‚„ă™ăă€ă‹ă€éžćžžă«ćŒ·ćŠ›ăȘ - +
ă€ăŸă‚Šăăźăƒ•ă‚ŁăƒŒăƒ«ăƒ‰ă«ăŻ **ćžžă«ć€€ăŒă‚ă‚ŠăŸă™**ă€‚ć€€ăŒ `None`JSON では `null`ïŒ‰ă«ăȘるこべがあるだけです。 @@ -72,7 +72,7 @@ 侀æ–č、`Item-Output` では、`description` は **濅須**ïŒˆè”€ă„ă‚ąă‚čタăƒȘă‚čă‚Żă‚ă‚ŠïŒ‰ă§ă™ă€‚
- +
こぼ **Pydantic v2** ăźæ©Ÿèƒœă«ă‚ˆă‚Šă€API ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆăŻă‚ˆă‚Š **æ­Łçąș** にăȘり、è‡Șć‹•ç”Ÿæˆă•ă‚ŒăŸă‚Żăƒ©ă‚€ă‚ąăƒłăƒˆă‚„ SDK ă‚‚ă‚ˆă‚Šæ­ŁçąșにăȘă‚ŠăŸă™ă€‚ă“ă‚Œă«ă‚ˆă‚Šă€ă‚ˆă‚Šè‰Żă„ **開ç™șè€…ă‚šă‚Żă‚čペăƒȘスンă‚č** べ侀èČ«æ€§ăŒćŸ—ă‚‰ă‚ŒăŸă™ă€‚đŸŽ‰ diff --git a/docs/ja/docs/index.md b/docs/ja/docs/index.md index 0c588e59c..97ee2f5a4 100644 --- a/docs/ja/docs/index.md +++ b/docs/ja/docs/index.md @@ -49,15 +49,15 @@ FastAPI は、Python ăźæš™æș–ă§ă‚ă‚‹ćž‹ăƒ’ăƒłăƒˆă«ćŸșいいお Python で AP * **簡捘**: ç°Ąć˜ă«ćˆ©ç”šăƒ»çż’ćŸ—ă§ăă‚‹ă‚ˆă†ă«ăƒ‡ă‚¶ă‚€ăƒłă•ă‚ŒăŠă„ăŸă™ă€‚ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆă‚’èȘ­ă‚€æ™‚é–“ă‚’ć‰Šæž›ă—ăŸă™ă€‚ * **短い**: ă‚łăƒŒăƒ‰ăźé‡è€‡ă‚’æœ€ć°é™ă«ă—ăŸă™ă€‚ć„ăƒ‘ăƒ©ăƒĄăƒŒă‚żćźŁèš€ă‹ă‚‰è€‡æ•°ăźæ©Ÿèƒœă‚’ćŸ—ă‚‰ă‚ŒăŸă™ă€‚ăƒă‚°ă‚‚æž›ă‚ŠăŸă™ă€‚ * **ć …ç‰ąæ€§**: è‡Șć‹•ćŻŸè©±ćž‹ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆă«ă‚ˆă‚Šă€æœŹç•Șç’°ćąƒć‘ă‘ăźă‚łăƒŒăƒ‰ăŒćŸ—ă‚‰ă‚ŒăŸă™ă€‚ -* **Standards-based**: API たă‚ȘăƒŒăƒ—ăƒłă‚čă‚żăƒłăƒ€ăƒŒăƒ‰ă«ćŸșă„ă„ăŠăŠă‚ŠïŒˆăă—ăŠćźŒć…šă«äș’æ›æ€§ăŒă‚ă‚ŠăŸă™ïŒ‰ă€[OpenAPI](https://github.com/OAI/OpenAPI-Specification)ïŒˆä»„ć‰ăŻ Swagger ăšă—ăŠçŸ„ă‚‰ă‚ŒăŠă„ăŸă—ăŸïŒ‰ă‚„ [JSON Schema](https://json-schema.org/) ă‚’ă‚”ăƒăƒŒăƒˆă—ăŸă™ă€‚ +* **æš™æș–æș–æ‹ **: API たă‚ȘăƒŒăƒ—ăƒłă‚čă‚żăƒłăƒ€ăƒŒăƒ‰ă«ćŸșă„ă„ăŠăŠă‚ŠïŒˆăă—ăŠćźŒć…šă«äș’æ›æ€§ăŒă‚ă‚ŠăŸă™ïŒ‰ă€[OpenAPI](https://github.com/OAI/OpenAPI-Specification)ïŒˆä»„ć‰ăŻ Swagger ăšă—ăŠçŸ„ă‚‰ă‚ŒăŠă„ăŸă—ăŸïŒ‰ă‚„ [JSON Schema](https://json-schema.org/) ă‚’ă‚”ăƒăƒŒăƒˆă—ăŸă™ă€‚ * æœŹç•ȘケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłă‚’æ§‹çŻ‰ă—ăŠă„ă‚‹ç€Ÿć†…é–‹ç™șăƒăƒŒăƒ ăźăƒ†ă‚čトにćŸșă„ăèŠ‹ç©ă‚‚ă‚Šă§ă™ă€‚ -## Sponsors { #sponsors } +## ă‚čăƒăƒłă‚”ăƒŒ { #sponsors } -### Keystone Sponsor { #keystone-sponsor } +### Keystone ă‚čăƒăƒłă‚”ăƒŒ { #keystone-sponsor }
{% for sponsor in sponsors.keystone -%} @@ -65,7 +65,7 @@ FastAPI は、Python ăźæš™æș–ă§ă‚ă‚‹ćž‹ăƒ’ăƒłăƒˆă«ćŸșいいお Python で AP {% endfor -%}
-### Gold Sponsors { #gold-sponsors } +### Gold ă‚čăƒăƒłă‚”ăƒŒ { #gold-sponsors }
{% for sponsor in sponsors.gold -%} @@ -73,7 +73,7 @@ FastAPI は、Python ăźæš™æș–ă§ă‚ă‚‹ćž‹ăƒ’ăƒłăƒˆă«ćŸșいいお Python で AP {% endfor -%}
-### Silver Sponsors { #silver-sponsors } +### Silver ă‚čăƒăƒłă‚”ăƒŒ { #silver-sponsors }
{% for sponsor in sponsors.silver -%} @@ -125,7 +125,7 @@ FastAPI は、Python ăźæš™æș–ă§ă‚ă‚‹ćž‹ăƒ’ăƒłăƒˆă«ćŸșいいお Python で AP
-fastapi dev ă‚łăƒžăƒłăƒ‰ă«ă€ă„ăŠ +fastapi dev ă‚łăƒžăƒłăƒ‰ă«ă€ă„ăŠ... `fastapi dev` コマンドは `main.py` ăƒ•ă‚Ąă‚€ăƒ«ă‚’è‡Ș拕的にèȘ­ăżć–ă‚Šă€ăăźäž­ăź **FastAPI** ケプăƒȘă‚’æ€œć‡șし、[Uvicorn](https://www.uvicorn.dev) ă‚’äœżç”šă—ăŠă‚”ăƒŒăƒăƒŒă‚’è”·ć‹•ă—ăŸă™ă€‚ @@ -471,11 +471,11 @@ item: Item ...ă«ć€‰æ›Žă—ă€ă‚šăƒ‡ă‚Łă‚żăŒć±žæ€§ă‚’è‡Șć‹•èŁœćźŒă—ă€ăăźćž‹ă‚’çŸ„ă‚‹ă“ăšă‚’çąșèȘă—ăŠăă ă•ă„ă€‚ -![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) +![ă‚šăƒ‡ă‚Łă‚żă‚”ăƒăƒŒăƒˆ](https://fastapi.tiangolo.com/img/vscode-completion.png) -ă‚ˆă‚Šć€šăăźæ©Ÿèƒœă‚’ć«ă‚€ă€ă‚ˆă‚ŠćźŒć…šăȘäŸ‹ă«ă€ă„ăŠăŻă€Tutorial - User Guide を揂照しどください。 +ă‚ˆă‚Šć€šăăźæ©Ÿèƒœă‚’ć«ă‚€ă€ă‚ˆă‚ŠćźŒć…šăȘäŸ‹ă«ă€ă„ăŠăŻă€ăƒăƒ„ăƒŒăƒˆăƒȘă‚ąăƒ« - ăƒŠăƒŒă‚¶ăƒŒă‚Źă‚€ăƒ‰ を揂照しどください。 -**ăƒă‚żăƒăƒŹæłšæ„**: tutorial - user guide ă«ăŻä»„äž‹ăŒć«ăŸă‚ŒăŸă™ă€‚ +**ăƒă‚żăƒăƒŹæłšæ„**: ăƒăƒ„ăƒŒăƒˆăƒȘă‚ąăƒ« - ăƒŠăƒŒă‚¶ăƒŒă‚Źă‚€ăƒ‰ă«ăŻä»„äž‹ăŒć«ăŸă‚ŒăŸă™ă€‚ * **ăƒ˜ăƒƒăƒ€ăƒŒ**、**Cookie**、**ăƒ•ă‚©ăƒŒăƒ ăƒ•ă‚ŁăƒŒăƒ«ăƒ‰**、**ăƒ•ă‚Ąă‚€ăƒ«**ăȘă©ă€ä»–ăźă•ăŸă–ăŸăȘć Žæ‰€ă‹ă‚‰ăź **ăƒ‘ăƒ©ăƒĄăƒŒă‚ż** ćźŁèš€ă€‚ * `maximum_length` や `regex` ぼようăȘ **æ€œèšŒćˆ¶çŽ„** ă‚’èš­ćźšă™ă‚‹æ–čæł•。 diff --git a/docs/ja/docs/project-generation.md b/docs/ja/docs/project-generation.md index b6550e3ac..829d6a608 100644 --- a/docs/ja/docs/project-generation.md +++ b/docs/ja/docs/project-generation.md @@ -2,7 +2,7 @@ ăƒ†ăƒłăƒ—ăƒŹăƒŒăƒˆăŻé€šćžžă€ç‰čćźšăźă‚»ăƒƒăƒˆă‚ąăƒƒăƒ—ăŒć«ăŸă‚ŒăŠă„ăŸă™ăŒă€æŸ”è»Ÿă§ă‚«ă‚čă‚żăƒžă‚€ă‚șă§ăă‚‹ă‚ˆă†ă«èš­èšˆă•ă‚ŒăŠă„ăŸă™ă€‚ă“ă‚Œă«ă‚ˆă‚Šă€ăƒ—ăƒ­ă‚žă‚§ă‚ŻăƒˆăźèŠä»¶ă«ćˆă‚ă›ăŠć€‰æ›Žăƒ»é©ćżœă§ăă€ć„Șれたć‡șç™șç‚čにăȘă‚ŠăŸă™ă€‚đŸ -ă“ăźăƒ†ăƒłăƒ—ăƒŹăƒŒăƒˆă‚’äœżăŁăŠé–‹ć§‹ă§ăăŸă™ă€‚ćˆæœŸă‚»ăƒƒăƒˆă‚ąăƒƒăƒ—ă€ă‚»ă‚­ăƒ„ăƒȘăƒ†ă‚Łă€ăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚čă€ă„ăă€ă‹ăźAPIă‚šăƒłăƒ‰ăƒă‚€ăƒłăƒˆăŒă™ă§ă«ç”šæ„ă•ă‚ŒăŠă„ăŸă™ă€‚ +ă“ăźăƒ†ăƒłăƒ—ăƒŹăƒŒăƒˆă‚’äœżăŁăŠé–‹ć§‹ă§ăăŸă™ă€‚ćˆæœŸă‚»ăƒƒăƒˆă‚ąăƒƒăƒ—ăźć€šăă€ă‚»ă‚­ăƒ„ăƒȘăƒ†ă‚Łă€ăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚čă€ă„ăă€ă‹ăźAPIă‚šăƒłăƒ‰ăƒă‚€ăƒłăƒˆăŒă™ă§ă«ç”šæ„ă•ă‚ŒăŠă„ăŸă™ă€‚ GitHubăƒȘポゾトăƒȘ: [Full Stack FastAPI Template](https://github.com/tiangolo/full-stack-fastapi-template) diff --git a/docs/ja/docs/python-types.md b/docs/ja/docs/python-types.md index 2399503fc..e6ff3c25d 100644 --- a/docs/ja/docs/python-types.md +++ b/docs/ja/docs/python-types.md @@ -151,7 +151,7 @@ def some_function(data: Any): äž€éƒšăźćž‹ăŻă€è§’æ‹ŹćŒ§ć†…ă§ă€Œćž‹ăƒ‘ăƒ©ăƒĄăƒŒă‚żă€ă‚’ć—ă‘ć–ă‚Šă€ć†…éƒšăźćž‹ă‚’ćźšçŸ©ă§ăăŸă™ă€‚äŸ‹ăˆă°ă€Œæ–‡ć­—ćˆ—ăźăƒȘă‚čト」は `list[str]` ăšă—ăŠćźŁèš€ă—ăŸă™ă€‚ -ă“ăźă‚ˆă†ă«ćž‹ăƒ‘ăƒ©ăƒĄăƒŒă‚żă‚’ć–ă‚Œă‚‹ćž‹ăŻ **Generic types**ïŒˆă‚žă‚§ăƒăƒȘクă‚čïŒ‰ăšć‘Œă°ă‚ŒăŸă™ă€‚ +ă“ăźă‚ˆă†ă«ćž‹ăƒ‘ăƒ©ăƒĄăƒŒă‚żă‚’ć–ă‚Œă‚‹ćž‹ăŻ **Generic types** ăŸăŸăŻ **Generics**ïŒˆă‚žă‚§ăƒăƒȘクă‚čïŒ‰ăšć‘Œă°ă‚ŒăŸă™ă€‚ æŹĄăźç”„ăżèŸŒăżćž‹ă‚’ă‚žă‚§ăƒăƒȘクă‚čăšă—ăŠïŒˆè§’æ‹ŹćŒ§ăšć†…éƒšăźćž‹ă§ïŒ‰äœżăˆăŸă™: @@ -265,7 +265,7 @@ def some_function(data: Any): これは「`one_person` ăŻă‚Żăƒ©ă‚č `Person` た **ă‚€ăƒłă‚čタンă‚č** ă§ă‚ă‚‹ă€ă“ăšă‚’æ„ć‘łă—ăŸă™ă€‚ -「`one_person` は `Person` べいう損才ぼ **ă‚Żăƒ© ă‚č** ă§ă‚ă‚‹ă€ăšă„ă†æ„ć‘łă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ +「`one_person` は `Person` べいう損才ぼ **ă‚Żăƒ©ă‚č** ă§ă‚ă‚‹ă€ăšă„ă†æ„ć‘łă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ ## Pydantic ăźăƒąăƒ‡ăƒ« { #pydantic-models } @@ -343,6 +343,6 @@ Python è‡Șäœ“ăŻă€ă“ăź `Annotated` ă§äœ•ă‹ă‚’ă™ă‚‹ă‚ă‘ă§ăŻă‚ă‚ŠăŸă› /// note | ć‚™è€ƒ -すでにすăčăŠăźăƒăƒ„ăƒŒăƒˆăƒȘă‚ąăƒ«ă‚’ç”‚ăˆăŠă€ćž‹ă«ă€ă„ăŠăźè©łçŽ°ă‚’èŠ‹ă‚‹ăŸă‚ă«ă“ăźăƒšăƒŒă‚žă«æˆ»ăŁăŠăăŸć ŽćˆăŻă€è‰Żă„ăƒȘă‚œăƒŒă‚čべしど [`mypy` ăźă€ŒăƒăƒŒăƒˆă‚·ăƒŒăƒˆ`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html) ăŒă‚ă‚ŠăŸă™ă€‚ +すでにすăčăŠăźăƒăƒ„ăƒŒăƒˆăƒȘă‚ąăƒ«ă‚’ç”‚ăˆăŠă€ćž‹ă«ă€ă„ăŠăźè©łçŽ°ă‚’èŠ‹ă‚‹ăŸă‚ă«ă“ăźăƒšăƒŒă‚žă«æˆ»ăŁăŠăăŸć ŽćˆăŻă€è‰Żă„ăƒȘă‚œăƒŒă‚čべしど [`mypy` ăźă€ŒăƒăƒŒăƒˆă‚·ăƒŒăƒˆă€](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html) ăŒă‚ă‚ŠăŸă™ă€‚ /// diff --git a/docs/ja/docs/tutorial/bigger-applications.md b/docs/ja/docs/tutorial/bigger-applications.md index 9d4239449..51ea7be51 100644 --- a/docs/ja/docs/tutorial/bigger-applications.md +++ b/docs/ja/docs/tutorial/bigger-applications.md @@ -17,16 +17,16 @@ Flask ć‡șèș«ă§ă‚ă‚Œă°ă€Flask た Blueprint ă«ç›žćœ“ă—ăŸă™ă€‚ ``` . ├── app -│   ├── __init__.py -│   ├── main.py -│   ├── dependencies.py -│   └── routers -│   │ ├── __init__.py -│   │ ├── items.py -│   │ └── users.py -│   └── internal -│   ├── __init__.py -│   └── admin.py +│ ├── __init__.py +│ ├── main.py +│ ├── dependencies.py +│ └── routers +│ │ ├── __init__.py +│ │ ├── items.py +│ │ └── users.py +│ └── internal +│ ├── __init__.py +│ └── admin.py ``` /// tip | 豆矄識 diff --git a/docs/ja/docs/tutorial/body-nested-models.md b/docs/ja/docs/tutorial/body-nested-models.md index a92df6b7a..d926189ff 100644 --- a/docs/ja/docs/tutorial/body-nested-models.md +++ b/docs/ja/docs/tutorial/body-nested-models.md @@ -1,5 +1,6 @@ # ボディ - ネă‚čăƒˆă•ă‚ŒăŸăƒąăƒ‡ăƒ« { #body-nested-models } + **FastAPI** ă‚’äœżç”šă™ă‚‹ăšă€æ·±ăăƒă‚čăƒˆă•ă‚ŒăŸä»»æ„ăźăƒąăƒ‡ăƒ«ă‚’ćźšçŸ©ă€æ€œèšŒă€æ–‡æ›žćŒ–ă€äœżç”šă™ă‚‹ă“ăšăŒă§ăăŸă™ïŒˆPydanticăźăŠă‹ă’ă§ă™ïŒ‰ă€‚ ## ăƒȘă‚čăƒˆăźăƒ•ă‚ŁăƒŒăƒ«ăƒ‰ { #list-fields } diff --git a/docs/ja/docs/tutorial/body.md b/docs/ja/docs/tutorial/body.md index 78fcf5f0a..c26198d3b 100644 --- a/docs/ja/docs/tutorial/body.md +++ b/docs/ja/docs/tutorial/body.md @@ -1,5 +1,6 @@ # ăƒȘクスă‚čトボディ { #request-body } + ă‚Żăƒ©ă‚€ă‚ąăƒłăƒˆïŒˆäŸ‹ăˆă°ăƒ–ăƒ©ă‚Šă‚¶ïŒ‰ă‹ă‚‰APIă«ăƒ‡ăƒŒă‚żă‚’é€äżĄă™ă‚‹ćż…èŠăŒă‚ă‚‹ć Žćˆă€**ăƒȘクスă‚čトボディ**ăšă—ăŠé€äżĄă—ăŸă™ă€‚ **ăƒȘクスă‚čト**ăƒœăƒ‡ă‚ŁăŻă€ă‚Żăƒ©ă‚€ă‚ąăƒłăƒˆă‹ă‚‰APIăžé€äżĄă•ă‚Œă‚‹ăƒ‡ăƒŒă‚żă§ă™ă€‚**ハă‚čポンă‚č**ボディは、APIăŒă‚Żăƒ©ă‚€ă‚ąăƒłăƒˆă«é€äżĄă™ă‚‹ăƒ‡ăƒŒă‚żă§ă™ă€‚ diff --git a/docs/ja/docs/tutorial/debugging.md b/docs/ja/docs/tutorial/debugging.md index a5b0c9016..1a02e1933 100644 --- a/docs/ja/docs/tutorial/debugging.md +++ b/docs/ja/docs/tutorial/debugging.md @@ -99,7 +99,7 @@ from myapp import app --- -Pycharmă‚’äœżç”šă™ă‚‹ć Žćˆă€æŹĄăźă“ăšăŒćŻèƒœă§ă™: +PyCharmă‚’äœżç”šă™ă‚‹ć Žćˆă€æŹĄăźă“ăšăŒćŻèƒœă§ă™: * ă€ŒćźŸèĄŒă€ăƒĄăƒ‹ăƒ„ăƒŒă‚’ă‚ȘăƒŒăƒ—ăƒłă€‚ * ă‚Șăƒ—ă‚·ăƒ§ăƒłă€Œăƒ‡ăƒăƒƒă‚°...ă€ă‚’éžæŠžă€‚ diff --git a/docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md index 2c310607c..b4ddfe7f8 100644 --- a/docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md @@ -234,6 +234,7 @@ participant operation as Path Operation `yield`ă‚’æŒă€äŸć­˜é–ąäż‚ăŻă€ă•ăŸă–ăŸăȘăƒŠăƒŒă‚čă‚±ăƒŒă‚čă‚’ă‚«ăƒăƒŒă—ă€ă„ăă€ă‹ăźć•éĄŒă‚’äżźæ­Łă™ă‚‹ăŸă‚ă«ă€æ™‚é–“ăšăšă‚‚ă«é€ČćŒ–ă—ăŠăăŸă—ăŸă€‚ FastAPIぼ異ăȘă‚‹ăƒăƒŒă‚žăƒ§ăƒłă§äœ•ăŒć€‰ă‚ăŁăŸăźă‹ă‚’çŸ„ă‚ŠăŸă„ć ŽćˆăŻă€äžŠçŽšă‚Źă‚€ăƒ‰ăź[äžŠçŽšăźäŸć­˜é–ąäż‚ - `yield`、`HTTPException`、`except`ă€ăƒăƒƒă‚Żă‚°ăƒ©ă‚Šăƒłăƒ‰ă‚żă‚čă‚Żă‚’æŒă€äŸć­˜é–ąäż‚](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks)ă§è©łă—ăèȘ­ă‚ăŸă™ă€‚ + ## コンテキă‚čăƒˆăƒžăƒăƒŒă‚žăƒŁ { #context-managers } ### 「コンテキă‚čăƒˆăƒžăƒăƒŒă‚žăƒŁă€ăšăŻ { #what-are-context-managers } diff --git a/docs/ja/docs/tutorial/extra-data-types.md b/docs/ja/docs/tutorial/extra-data-types.md index 1bbfeb71e..b63e3fe1a 100644 --- a/docs/ja/docs/tutorial/extra-data-types.md +++ b/docs/ja/docs/tutorial/extra-data-types.md @@ -1,5 +1,6 @@ # èżœćŠ ăƒ‡ăƒŒă‚żćž‹ { #extra-data-types } + ä»ŠăŸă§ă€ä»„äž‹ăźă‚ˆă†ăȘäž€èˆŹçš„ăȘăƒ‡ăƒŒă‚żćž‹ă‚’äœżç”šă—ăŠăăŸă—ăŸ: * `int` diff --git a/docs/ja/docs/tutorial/extra-models.md b/docs/ja/docs/tutorial/extra-models.md index 20883068c..d9548500e 100644 --- a/docs/ja/docs/tutorial/extra-models.md +++ b/docs/ja/docs/tutorial/extra-models.md @@ -208,4 +208,4 @@ some_variable: PlaneItem | CarItem è€‡æ•°ăźPydanticăƒąăƒ‡ăƒ«ă‚’äœżç”šă—ă€ă‚±ăƒŒă‚čごずにè‡Șç”±ă«ç¶™æ‰żă—ăŸă™ă€‚ -スンティティが異ăȘă‚‹ă€ŒçŠ¶æ…‹ă€ă‚’æŒăŸăȘければăȘらăȘă„ć ŽćˆăŻă€ă‚šăƒłăƒ†ă‚Łăƒ†ă‚Łă”ăšă«ć˜äž€ăźăƒ‡ăƒŒă‚żăƒąăƒ‡ăƒ«ă‚’æŒă€ćż…èŠăŻă‚ă‚ŠăŸă›ă‚“ă€‚`password`、`password_hash`、パă‚čăƒŻăƒŒăƒ‰ăȘă—ă‚’ć«ă‚€çŠ¶æ…‹ă‚’æŒă€ăƒŠăƒŒă‚¶ăƒŒă€Œă‚šăƒłăƒ†ă‚Łăƒ†ă‚Łă€ăźć ŽćˆăšćŒæ§˜ă§ă™ă€‚ +スンティティが異ăȘă‚‹ă€ŒçŠ¶æ…‹ă€ă‚’æŒăŸăȘければăȘらăȘă„ć ŽćˆăŻă€ă‚šăƒłăƒ†ă‚Łăƒ†ă‚Łă”ăšă«ć˜äž€ăźăƒ‡ăƒŒă‚żăƒąăƒ‡ăƒ«ă‚’æŒă€ćż…èŠăŻă‚ă‚ŠăŸă›ă‚“ă€‚`password`、`password_hash`、パă‚čăƒŻăƒŒăƒ‰ăȘă—ă‚’ć«ă‚€çŠ¶æ…‹ă‚’æŒă€**ăƒŠăƒŒă‚¶ăƒŒ**ă€Œă‚šăƒłăƒ†ă‚Łăƒ†ă‚Łă€ăźć ŽćˆăšćŒæ§˜ă§ă™ă€‚ diff --git a/docs/ja/docs/tutorial/first-steps.md b/docs/ja/docs/tutorial/first-steps.md index 75d100871..ae0556d15 100644 --- a/docs/ja/docs/tutorial/first-steps.md +++ b/docs/ja/docs/tutorial/first-steps.md @@ -78,7 +78,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) æŹĄă«ă€[http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)にスクセă‚čă—ăŸă™ă€‚ -ć…ˆă»ă©ăšăŻç•°ăȘる、è‡Șć‹•ç”Ÿæˆă•ă‚ŒăŸćŻŸè©±çš„APIăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆăŒèĄšç€șă•ă‚ŒăŸă™ïŒˆ[ReDoc](https://github.com/Rebilly/ReDoc)ă«ă‚ˆăŁăŠæäŸ›ïŒ‰: +ä»Łæ›żăźè‡Șć‹•ç”Ÿæˆăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆăŒèĄšç€șă•ă‚ŒăŸă™ïŒˆ[ReDoc](https://github.com/Rebilly/ReDoc)ă«ă‚ˆăŁăŠæäŸ›ïŒ‰: ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -104,7 +104,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) #### OpenAPIおよびJSONă‚čă‚­ăƒŒăƒž { #openapi-and-json-schema } -OpenAPIはAPIぼためぼAPIă‚čă‚­ăƒŒăƒžă‚’ćźšçŸ©ă—ăŸă™ă€‚ăă—ăŠă€ăăźă‚čă‚­ăƒŒăƒžăŻ**JSONăƒ‡ăƒŒă‚żă‚čă‚­ăƒŒăƒž**ăźæš™æș–èŠæ Œă§ă‚ă‚‹**JSON Schema**ă‚’ćˆ©ç”šă™ă‚‹APIă«ă‚ˆăŁăŠé€ć—ă•ă‚Œă‚‹ăƒ‡ăƒŒă‚żăźćźšçŸ©ïŒˆăŸăŸăŻă€Œă‚čă‚­ăƒŒăƒžă€ïŒ‰ă‚’ć«ă‚“ă§ă„ăŸă™ă€‚ +OpenAPIはAPIぼためぼAPIă‚čă‚­ăƒŒăƒžă‚’ćźšçŸ©ă—ăŸă™ă€‚ăă—ăŠă€ăăźă‚čă‚­ăƒŒăƒžă«ăŻă€JSONăƒ‡ăƒŒă‚żă‚čă‚­ăƒŒăƒžăźæš™æș–である**JSON Schema**ă‚’äœżç”šă—ăŠă€APIă«ă‚ˆăŁăŠé€ć—äżĄă•ă‚Œă‚‹ăƒ‡ăƒŒă‚żăźćźšçŸ©ïŒˆăŸăŸăŻă€Œă‚čă‚­ăƒŒăƒžă€ïŒ‰ăŒć«ăŸă‚ŒăŸă™ă€‚ #### `openapi.json`をçąșèȘ { #check-the-openapi-json } @@ -239,6 +239,7 @@ CLIはFastAPIケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłă‚’è‡Șć‹•æ€œć‡șă—ăŠă‚Żăƒ©ă‚Šăƒ‰ă«ăƒ‡ăƒ— ### Step 2: `FastAPI`ăźă€Œă‚€ăƒłă‚čタンă‚čă€ă‚’ç”Ÿæˆ { #step-2-create-a-fastapi-instance } {* ../../docs_src/first_steps/tutorial001_py310.py hl[3] *} + ここで、`app`ć€‰æ•°ăŒ`FastAPI`ă‚Żăƒ©ă‚čăźă€Œă‚€ăƒłă‚čタンă‚čă€ă«ăȘă‚ŠăŸă™ă€‚ これが、すăčおたAPIă‚’äœœæˆă™ă‚‹ăŸă‚ăźäž»èŠăȘăƒă‚€ăƒłăƒˆă«ăȘă‚ŠăŸă™ă€‚ diff --git a/docs/ja/docs/tutorial/handling-errors.md b/docs/ja/docs/tutorial/handling-errors.md index 8d0190cb0..491b72da2 100644 --- a/docs/ja/docs/tutorial/handling-errors.md +++ b/docs/ja/docs/tutorial/handling-errors.md @@ -1,5 +1,6 @@ # ă‚šăƒ©ăƒŒăƒăƒłăƒ‰ăƒȘング { #handling-errors } + APIă‚’äœżç”šă—ăŠă„ă‚‹ă‚Żăƒ©ă‚€ă‚ąăƒłăƒˆă«ă‚šăƒ©ăƒŒă‚’é€šçŸ„ă™ă‚‹ćż…èŠăŒă‚ă‚‹çŠ¶æłăŻăŸăă•ă‚“ă‚ă‚ŠăŸă™ă€‚ ă“ăźă‚Żăƒ©ă‚€ă‚ąăƒłăƒˆăŻă€ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ă‚’æŒă€ăƒ–ăƒ©ă‚Šă‚¶ă€èȘ°ă‹ăźă‚łăƒŒăƒ‰ă€IoTăƒ‡ăƒă‚€ă‚čăȘă©ăŒè€ƒăˆă‚‰ă‚ŒăŸă™ă€‚ diff --git a/docs/ja/docs/tutorial/index.md b/docs/ja/docs/tutorial/index.md index 8182c92ae..42b0eb523 100644 --- a/docs/ja/docs/tutorial/index.md +++ b/docs/ja/docs/tutorial/index.md @@ -1,5 +1,6 @@ # ăƒăƒ„ăƒŒăƒˆăƒȘă‚ąăƒ« - ăƒŠăƒŒă‚¶ăƒŒă‚Źă‚€ăƒ‰ { #tutorial-user-guide } + ă“ăźăƒăƒ„ăƒŒăƒˆăƒȘă‚ąăƒ«ă§ăŻă€**FastAPI**ăźă»ăšă‚“ă©ăźæ©Ÿèƒœă‚’äœżă†æ–čæł•ă‚’æź”éšŽçš„ă«çŽčä»‹ă—ăŸă™ă€‚ ć„ă‚»ă‚Żă‚·ăƒ§ăƒłăŻć‰ăźă‚»ă‚Żă‚·ăƒ§ăƒłă‚’èžăŸăˆăŸć†…ćźčにăȘăŁăŠă„ăŸă™ă€‚ă—ă‹ă—ă€ăƒˆăƒ”ăƒƒă‚Żă”ăšă«ćˆ†ć‰Čされどいるぼで、ç‰č漚ぼAPIăźăƒ‹ăƒŒă‚șをæș€ăŸă™ăŸă‚ă«ă€ä»»æ„ăźç‰čćźšăźăƒˆăƒ”ăƒƒă‚Żă«ç›ŽæŽ„é€Čă‚ă‚‹ă‚ˆă†ă«ăȘăŁăŠă„ăŸă™ă€‚ diff --git a/docs/ja/docs/tutorial/metadata.md b/docs/ja/docs/tutorial/metadata.md index 6a426d530..0f5f0cb6c 100644 --- a/docs/ja/docs/tutorial/metadata.md +++ b/docs/ja/docs/tutorial/metadata.md @@ -11,10 +11,10 @@ OpenAPIä»•æ§˜ăŠă‚ˆăłè‡Ș拕APIăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆUIă§äœżç”šă•ă‚Œă‚‹æŹĄăźăƒ• | `title` | `str` | APIăźă‚żă‚€ăƒˆăƒ«ă§ă™ă€‚ | | `summary` | `str` | APIăźçŸ­ă„èŠçŽ„ă§ă™ă€‚ OpenAPI 3.1.0、FastAPI 0.99.0 ä»„é™ă§ćˆ©ç”šă§ăăŸă™ă€‚ | | `description` | `str` | APIぼ短いèȘŹæ˜Žă§ă™ă€‚Markdownă‚’äœżç”šă§ăăŸă™ă€‚ | -| `version` | `string` | APIăźăƒăƒŒă‚žăƒ§ăƒłă§ă™ă€‚ă“ă‚ŒăŻOpenAPIăźăƒăƒŒă‚žăƒ§ăƒłă§ăŻăȘく、あăȘたè‡Șèș«ăźă‚ąăƒ—ăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłăźăƒăƒŒă‚žăƒ§ăƒłă§ă™ă€‚ăŸăšăˆă° `2.5.0` です。 | +| `version` | `str` | APIăźăƒăƒŒă‚žăƒ§ăƒłă§ă™ă€‚ă“ă‚ŒăŻOpenAPIăźăƒăƒŒă‚žăƒ§ăƒłă§ăŻăȘく、あăȘたè‡Șèș«ăźă‚ąăƒ—ăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłăźăƒăƒŒă‚žăƒ§ăƒłă§ă™ă€‚ăŸăšăˆă° `2.5.0` です。 | | `terms_of_service` | `str` | APIăźćˆ©ç”šèŠçŽ„ăžăźURLă§ă™ă€‚æŒ‡ćźšă™ă‚‹ć Žćˆă€URLă§ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚ | -| `contact` | `dict` | 慬開されるAPIăźé€Łç”Ąć…ˆæƒ…ć ±ă§ă™ă€‚è€‡æ•°ăźăƒ•ă‚ŁăƒŒăƒ«ăƒ‰ă‚’ć«ă‚ă‚‰ă‚ŒăŸă™ă€‚
contact fields
ParameterTypeDescription
namestré€Łç”Ąć…ˆăźć€‹äșș/甄çč”ă‚’è­˜ćˆ„する損才です。
urlstré€Łç”Ąć…ˆæƒ…ć ±ă‚’æŒ‡ă™URLです。URLćœąćŒă§ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚
emailstré€Łç”Ąć…ˆăźć€‹äșș/甄çč”ăźăƒĄăƒŒăƒ«ă‚ąăƒ‰ăƒŹă‚čă§ă™ă€‚ăƒĄăƒŒăƒ«ă‚ąăƒ‰ăƒŹă‚čćœąćŒă§ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚
| -| `license_info` | `dict` | 慬開されるAPIăźăƒ©ă‚€ă‚»ăƒłă‚čæƒ…ć ±ă§ă™ă€‚è€‡æ•°ăźăƒ•ă‚ŁăƒŒăƒ«ăƒ‰ă‚’ć«ă‚ă‚‰ă‚ŒăŸă™ă€‚
license_info fields
ParameterTypeDescription
namestrćż…é ˆïŒˆlicense_info ăŒèš­ćźšă•ă‚ŒăŠă„ă‚‹ć ŽćˆïŒ‰ă€‚APIă«äœżç”šă•ă‚Œă‚‹ăƒ©ă‚€ă‚»ăƒłă‚č損です。
identifierstrAPIた [SPDX](https://spdx.org/licenses/) ăƒ©ă‚€ă‚»ăƒłă‚čćŒă§ă™ă€‚identifier ăƒ•ă‚ŁăƒŒăƒ«ăƒ‰ăŻ url ăƒ•ă‚ŁăƒŒăƒ«ăƒ‰ăšćŒæ™‚ă«æŒ‡ćźšă§ăăŸă›ă‚“ă€‚ OpenAPI 3.1.0、FastAPI 0.99.0 ä»„é™ă§ćˆ©ç”šă§ăăŸă™ă€‚
urlstrAPIă«äœżç”šă•ă‚Œă‚‹ăƒ©ă‚€ă‚»ăƒłă‚čぞたURLです。URLćœąćŒă§ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚
| +| `contact` | `dict` | 慬開されるAPIăźé€Łç”Ąć…ˆæƒ…ć ±ă§ă™ă€‚è€‡æ•°ăźăƒ•ă‚ŁăƒŒăƒ«ăƒ‰ă‚’ć«ă‚ă‚‰ă‚ŒăŸă™ă€‚
contact ăźăƒ•ă‚ŁăƒŒăƒ«ăƒ‰
ăƒ‘ăƒ©ăƒĄăƒŒă‚żćž‹èȘŹæ˜Ž
namestré€Łç”Ąć…ˆăźć€‹äșș/甄çč”ă‚’è­˜ćˆ„する損才です。
urlstré€Łç”Ąć…ˆæƒ…ć ±ă‚’æŒ‡ă™URLです。URLćœąćŒă§ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚
emailstré€Łç”Ąć…ˆăźć€‹äșș/甄çč”ăźăƒĄăƒŒăƒ«ă‚ąăƒ‰ăƒŹă‚čă§ă™ă€‚ăƒĄăƒŒăƒ«ă‚ąăƒ‰ăƒŹă‚čćœąćŒă§ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚
| +| `license_info` | `dict` | 慬開されるAPIăźăƒ©ă‚€ă‚»ăƒłă‚čæƒ…ć ±ă§ă™ă€‚è€‡æ•°ăźăƒ•ă‚ŁăƒŒăƒ«ăƒ‰ă‚’ć«ă‚ă‚‰ă‚ŒăŸă™ă€‚
license_info ăźăƒ•ă‚ŁăƒŒăƒ«ăƒ‰
ăƒ‘ăƒ©ăƒĄăƒŒă‚żćž‹èȘŹæ˜Ž
namestrćż…é ˆïŒˆlicense_info ăŒèš­ćźšă•ă‚ŒăŠă„ă‚‹ć ŽćˆïŒ‰ă€‚APIă«äœżç”šă•ă‚Œă‚‹ăƒ©ă‚€ă‚»ăƒłă‚č損です。
identifierstrAPIた [SPDX](https://spdx.org/licenses/) ăƒ©ă‚€ă‚»ăƒłă‚čćŒă§ă™ă€‚identifier ăƒ•ă‚ŁăƒŒăƒ«ăƒ‰ăŻ url ăƒ•ă‚ŁăƒŒăƒ«ăƒ‰ăšćŒæ™‚ă«æŒ‡ćźšă§ăăŸă›ă‚“ă€‚ OpenAPI 3.1.0、FastAPI 0.99.0 ä»„é™ă§ćˆ©ç”šă§ăăŸă™ă€‚
urlstrAPIă«äœżç”šă•ă‚Œă‚‹ăƒ©ă‚€ă‚»ăƒłă‚čぞたURLです。URLćœąćŒă§ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚
| ä»„äž‹ăźă‚ˆă†ă«èš­ćźšă§ăăŸă™: diff --git a/docs/ja/docs/tutorial/path-operation-configuration.md b/docs/ja/docs/tutorial/path-operation-configuration.md index a5f34128a..05bf9208e 100644 --- a/docs/ja/docs/tutorial/path-operation-configuration.md +++ b/docs/ja/docs/tutorial/path-operation-configuration.md @@ -1,5 +1,6 @@ # Path Operationăźèš­ćźš { #path-operation-configuration } + *path operationăƒ‡ă‚łăƒŹăƒŒă‚ż*ă‚’èš­ćźšă™ă‚‹ăŸă‚ăźăƒ‘ăƒ©ăƒĄăƒŒă‚żăŒă„ăă€ă‹ă‚ă‚ŠăŸă™ă€‚ /// warning | æłšæ„ diff --git a/docs/ja/docs/tutorial/query-params-str-validations.md b/docs/ja/docs/tutorial/query-params-str-validations.md index a113cb4a7..38d2b5c68 100644 --- a/docs/ja/docs/tutorial/query-params-str-validations.md +++ b/docs/ja/docs/tutorial/query-params-str-validations.md @@ -41,7 +41,7 @@ FastAPI ăŻăƒăƒŒă‚žăƒ§ăƒł 0.95.0 で `Annotated` ăźă‚”ăƒăƒŒăƒˆă‚’èżœćŠ ă—ïŒˆ ## `q` ăƒ‘ăƒ©ăƒĄăƒŒă‚żăźćž‹ă§ `Annotated` ă‚’äœżă† { #use-annotated-in-the-type-for-the-q-parameter } -ä»„ć‰ă€[Python Types Intro](../python-types.md#type-hints-with-metadata-annotations) で `Annotated` ă‚’äœżăŁăŠăƒ‘ăƒ©ăƒĄăƒŒă‚żă«ăƒĄă‚żăƒ‡ăƒŒă‚żă‚’èżœćŠ ă§ăă‚‹ăšèȘŹæ˜Žă—ăŸă“ăšă‚’èŠšăˆăŠă„ăŸă™ă‹ïŒŸ +ä»„ć‰ă€[Python 枋慄門](../python-types.md#type-hints-with-metadata-annotations) で `Annotated` ă‚’äœżăŁăŠăƒ‘ăƒ©ăƒĄăƒŒă‚żă«ăƒĄă‚żăƒ‡ăƒŒă‚żă‚’èżœćŠ ă§ăă‚‹ăšèȘŹæ˜Žă—ăŸă“ăšă‚’èŠšăˆăŠă„ăŸă™ă‹ïŒŸ いよいよ FastAPI ă§äœżă†ăšăă§ă™ă€‚ 🚀 @@ -242,7 +242,7 @@ q: Annotated[str | None, Query(min_length=3)] = None http://localhost:8000/items/?q=foo&q=bar ``` -*path operation function* 憅ぼ *function parameter* `q` ă§ă€è€‡æ•°ăź `q` *query parameters'* ć€€ïŒˆ`foo` ず `bar`ïŒ‰ă‚’ Python た `list` ăšă—ăŠć—ă‘ć–ă‚ŠăŸă™ă€‚ +*path operation function* 憅ぼ *function parameter* `q` ă§ă€è€‡æ•°ăź `q` *クスăƒȘăƒ‘ăƒ©ăƒĄăƒŒă‚ż*ăźć€€ïŒˆ`foo` ず `bar`ïŒ‰ă‚’ Python た `list` ăšă—ăŠć—ă‘ć–ă‚ŠăŸă™ă€‚ そぼため、こぼURLたハă‚čポンă‚čăŻä»„äž‹ăźă‚ˆă†ă«ăȘă‚ŠăŸă™: diff --git a/docs/ja/docs/tutorial/query-params.md b/docs/ja/docs/tutorial/query-params.md index 24320cc77..2bca43a95 100644 --- a/docs/ja/docs/tutorial/query-params.md +++ b/docs/ja/docs/tutorial/query-params.md @@ -1,5 +1,6 @@ # クスăƒȘăƒ‘ăƒ©ăƒĄăƒŒă‚ż { #query-parameters } + パă‚čăƒ‘ăƒ©ăƒĄăƒŒă‚żă§ăŻăȘă„é–ąæ•°ăƒ‘ăƒ©ăƒĄăƒŒă‚żă‚’ćźŁèš€ă™ă‚‹ăšă€ăă‚Œă‚‰ăŻè‡Șć‹•çš„ă«ă€Œă‚Żă‚šăƒȘă€ăƒ‘ăƒ©ăƒĄăƒŒă‚żăšă—ăŠè§Łé‡ˆă•ă‚ŒăŸă™ă€‚ {* ../../docs_src/query_params/tutorial001_py310.py hl[9] *} diff --git a/docs/ja/docs/tutorial/request-files.md b/docs/ja/docs/tutorial/request-files.md index 82bafb776..f4bd2314b 100644 --- a/docs/ja/docs/tutorial/request-files.md +++ b/docs/ja/docs/tutorial/request-files.md @@ -1,5 +1,6 @@ # ăƒȘクスă‚čăƒˆăƒ•ă‚Ąă‚€ăƒ« { #request-files } + `File` ă‚’äœżăŁăŠă€ă‚Żăƒ©ă‚€ă‚ąăƒłăƒˆăŒă‚ąăƒƒăƒ—ăƒ­ăƒŒăƒ‰ă™ă‚‹ăƒ•ă‚Ąă‚€ăƒ«ă‚’ćźšçŸ©ă§ăăŸă™ă€‚ /// note | ć‚™è€ƒ diff --git a/docs/ja/docs/tutorial/request-forms.md b/docs/ja/docs/tutorial/request-forms.md index 022f13208..0478a5439 100644 --- a/docs/ja/docs/tutorial/request-forms.md +++ b/docs/ja/docs/tutorial/request-forms.md @@ -70,4 +70,4 @@ HTMLăƒ•ă‚©ăƒŒăƒ ïŒˆ`
`ïŒ‰ăŒă‚”ăƒŒăƒă«ăƒ‡ăƒŒă‚żă‚’é€äżĄă™ă‚‹æ–č ## ăŸăšă‚ { #recap } -ăƒ•ă‚©ăƒŒăƒ ăƒ‡ăƒŒă‚żăźć…„ćŠ›ăƒ‘ăƒ©ăƒĄăƒŒă‚żă‚’ćźŁèš€ă™ă‚‹ă«ăŻă€`Form`ă‚’äœżç”šă™ă‚‹ă€‚ +ăƒ•ă‚©ăƒŒăƒ ăƒ‡ăƒŒă‚żăźć…„ćŠ›ăƒ‘ăƒ©ăƒĄăƒŒă‚żă‚’ćźŁèš€ă™ă‚‹ă«ăŻă€`Form`ă‚’äœżç”šă—ăŸă™ă€‚ diff --git a/docs/ja/docs/tutorial/response-status-code.md b/docs/ja/docs/tutorial/response-status-code.md index a04add113..e4239e11a 100644 --- a/docs/ja/docs/tutorial/response-status-code.md +++ b/docs/ja/docs/tutorial/response-status-code.md @@ -1,5 +1,6 @@ # ハă‚čポンă‚čă‚čăƒ†ăƒŒă‚żă‚čă‚łăƒŒăƒ‰ { #response-status-code } + ハă‚čポンă‚čăƒąăƒ‡ăƒ«ă‚’æŒ‡ćźšă™ă‚‹ăźăšćŒă˜æ–čæł•ă§ă€ăƒŹă‚čポンă‚čă«äœżç”šă•ă‚Œă‚‹HTTPă‚čăƒ†ăƒŒă‚żă‚čă‚łăƒŒăƒ‰ă‚’ä»„äž‹ăź*path operations*ぼいずれかぼ`status_code`ăƒ‘ăƒ©ăƒĄăƒŒă‚żă§ćźŁèš€ă™ă‚‹ă“ăšă‚‚ă§ăăŸă™ă€‚ * `@app.get()` diff --git a/docs/ja/docs/tutorial/schema-extra-example.md b/docs/ja/docs/tutorial/schema-extra-example.md index 742106037..e44e2471d 100644 --- a/docs/ja/docs/tutorial/schema-extra-example.md +++ b/docs/ja/docs/tutorial/schema-extra-example.md @@ -1,5 +1,6 @@ # ăƒȘクスă‚čトたExampleăƒ‡ăƒŒă‚żăźćźŁèš€ { #declare-request-example-data } + ケプăƒȘăŒć—ă‘ć–ă‚Œă‚‹ăƒ‡ăƒŒă‚żăźäŸ‹ă‚’ćźŁèš€ă§ăăŸă™ă€‚ ă“ă“ă§ăŻă€ăă‚Œă‚’èĄŒă†ă„ăă€ă‹ăźæ–čæł•ă‚’çŽčä»‹ă—ăŸă™ă€‚ diff --git a/docs/ja/docs/tutorial/security/first-steps.md b/docs/ja/docs/tutorial/security/first-steps.md index 386adbed8..e5d7c58b5 100644 --- a/docs/ja/docs/tutorial/security/first-steps.md +++ b/docs/ja/docs/tutorial/security/first-steps.md @@ -109,7 +109,7 @@ OAuth2は、バックスンドやAPIăŒăƒŠăƒŒă‚¶ăƒŒă‚’èȘèšŒă™ă‚‹ă‚”ăƒŒăƒăƒŒ * ăƒŠăƒŒă‚¶ăƒŒăŒăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ă§ă‚ŻăƒȘックしど、フロントスンドぼWebケプăƒȘăźćˆ„ăźă‚»ă‚Żă‚·ăƒ§ăƒłă«ç§»ć‹•ă—ăŸă™ă€‚ * フロントスンドはAPIă‹ă‚‰ă•ă‚‰ă«ăƒ‡ăƒŒă‚żă‚’ć–ćŸ—ă™ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚ * しかし、ç‰čćźšăźă‚šăƒłăƒ‰ăƒă‚€ăƒłăƒˆăźèȘèšŒăŒćż…èŠă§ă™ă€‚ - * したがっど、APIでèȘèšŒă™ă‚‹ăŸă‚ă€HTTPăƒ˜ăƒƒăƒ€ăƒŒ`Authorization`に`Bearer`ăźæ–‡ć­—ćˆ—ăšăƒˆăƒŒă‚Żăƒłă‚’ćŠ ăˆăŸć€€ă‚’é€äżĄă—ăŸă™ă€‚ + * したがっど、APIでèȘèšŒă™ă‚‹ăŸă‚ă€HTTPăƒ˜ăƒƒăƒ€ăƒŒ`Authorization`に`Bearer `ăźæ–‡ć­—ćˆ—ăšăƒˆăƒŒă‚Żăƒłă‚’ćŠ ăˆăŸć€€ă‚’é€äżĄă—ăŸă™ă€‚ * ăƒˆăƒŒă‚Żăƒłă«`foobar`ăŒć«ăŸă‚ŒăŠă„ă‚‹ć Žćˆă€`Authorization`ăƒ˜ăƒƒăƒ€ăƒŒăźć†…ćźčăŻæŹĄăźă‚ˆă†ă«ăȘă‚ŠăŸă™: `Bearer foobar`。 ## **FastAPI**た`OAuth2PasswordBearer` { #fastapis-oauth2passwordbearer } @@ -178,7 +178,7 @@ oauth2_scheme(some, parameters) /// note | æŠ€èĄ“è©łçŽ° -**FastAPI**は、`OAuth2PasswordBearer` ă‚Żăƒ©ă‚č (äŸć­˜é–ąäż‚ă§ćźŁèš€ă•ă‚ŒăŠă„ă‚‹) ă‚’äœżç”šă—ăŠOpenAPIăźă‚»ă‚­ăƒ„ăƒȘティă‚čă‚­ăƒŒăƒ ă‚’ćźšçŸ©ă§ăă‚‹ă“ăšă‚’çŸ„ăŁăŠă„ăŸă™ă€‚ă“ă‚ŒăŻ`fastapi.security.oauth2.OAuth2`、`fastapi.security.base.SecurityBase`ă‚’ç¶™æ‰żă—ăŠă„ă‚‹ă‹ă‚‰ă§ă™ă€‚ +**FastAPI**は、`OAuth2PasswordBearer` ă‚Żăƒ©ă‚č (äŸć­˜é–ąäż‚ă§ćźŁèš€ă•ă‚ŒăŠă„ă‚‹) ă‚’äœżç”šă—ăŠOpenAPIăźă‚»ă‚­ăƒ„ăƒȘティă‚čă‚­ăƒŒăƒ ă‚’ćźšçŸ©ă§ăă‚‹ă“ăšă‚’çŸ„ăŁăŠă„ăŸă™ă€‚ă“ă‚ŒăŻă€ă“ăźă‚Żăƒ©ă‚čが`fastapi.security.oauth2.OAuth2`ă‚’ç¶™æ‰żă—ăŠăŠă‚Šă€ă•ă‚‰ă«ăă‚ŒăŒ`fastapi.security.base.SecurityBase`ă‚’ç¶™æ‰żă—ăŠă„ă‚‹ă‹ă‚‰ă§ă™ă€‚ OpenAPIăšç”±ćˆă™ă‚‹ă‚»ă‚­ăƒ„ăƒȘăƒ†ă‚ŁăƒŠăƒŒăƒ†ă‚ŁăƒȘティ (およびè‡Ș拕APIăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆ) はすăčお`SecurityBase`ă‚’ç¶™æ‰żă—ăŠă„ăŸă™ă€‚ăă‚Œă«ă‚ˆă‚Šă€**FastAPI**はそれらをOpenAPIă«ç”±ćˆă™ă‚‹æ–čæł•ă‚’çŸ„ă‚‹ă“ăšăŒă§ăăŸă™ă€‚ diff --git a/docs/ja/docs/tutorial/security/get-current-user.md b/docs/ja/docs/tutorial/security/get-current-user.md index 1e77c9f65..f8e4295bf 100644 --- a/docs/ja/docs/tutorial/security/get-current-user.md +++ b/docs/ja/docs/tutorial/security/get-current-user.md @@ -14,7 +14,7 @@ ăƒœăƒ‡ă‚Łă‚’ćźŁèš€ă™ă‚‹ăźă«Pydantică‚’äœżç”šă™ă‚‹ăźăšćŒă˜ă‚„ă‚Šæ–čで、Pydantică‚’ćˆ„ăźă©ă‚“ăȘăšă“ă‚ă§ă‚‚äœżă†ă“ăšăŒă§ăăŸă™: -{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *} +{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *} ## äŸć­˜é–ąäż‚ `get_current_user` ă‚’äœœæˆ { #create-a-get-current-user-dependency } diff --git a/docs/ja/docs/tutorial/security/oauth2-jwt.md b/docs/ja/docs/tutorial/security/oauth2-jwt.md index 7e41326e3..40cefad9d 100644 --- a/docs/ja/docs/tutorial/security/oauth2-jwt.md +++ b/docs/ja/docs/tutorial/security/oauth2-jwt.md @@ -1,6 +1,6 @@ # パă‚čăƒŻăƒŒăƒ‰ïŒˆăŠă‚ˆăłăƒăƒƒă‚·ăƒ„ćŒ–ïŒ‰ă«ă‚ˆă‚‹OAuth2、JWTăƒˆăƒŒă‚Żăƒłă«ă‚ˆă‚‹Bearer { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens } -ă“ă‚Œă§ă‚»ă‚­ăƒ„ăƒȘăƒ†ă‚Łăźæ”ă‚ŒăŒć…šăŠă‚ă‹ăŁăŸăźă§ă€JWTăƒˆăƒŒă‚Żăƒłăšćź‰ć…šăȘパă‚čăƒŻăƒŒăƒ‰ăźăƒăƒƒă‚·ăƒ„ćŒ–ă‚’äœżç”šă—ăŠă€ćźŸéš›ă«ă‚ąăƒ—ăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłă‚’ćź‰ć…šă«ă—ăŠăżăŸă—ă‚‡ă†ă€‚ +ă“ă‚Œă§ă‚»ă‚­ăƒ„ăƒȘăƒ†ă‚Łăźæ”ă‚ŒăŒć…šăŠă‚ă‹ăŁăŸăźă§ă€JWTăƒˆăƒŒă‚Żăƒłăšćź‰ć…šăȘパă‚čăƒŻăƒŒăƒ‰ăźăƒăƒƒă‚·ăƒ„ćŒ–ă‚’äœżç”šă—ăŠă€ćźŸéš›ă«ă‚ąăƒ—ăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłă‚’ćź‰ć…šă«ă—ăŠăżăŸă—ă‚‡ă†ă€‚ ă“ăźă‚łăƒŒăƒ‰ăŻă€ă‚ąăƒ—ăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłă§ćźŸéš›ă«äœżç”šă—ăŸă‚Šă€ăƒ‘ă‚čăƒŻăƒŒăƒ‰ăƒăƒƒă‚·ăƒ„ă‚’ăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚čă«äżć­˜ă™ă‚‹ăšă„ăŁăŸç”šé€”ă«ćˆ©ç”šă§ăăŸă™ă€‚ @@ -46,7 +46,7 @@ $ pip install pyjwt RSAやECDSAぼようăȘăƒ‡ă‚žă‚żăƒ«çœČćă‚ąăƒ«ă‚ŽăƒȘă‚șăƒ ă‚’äœżç”šă™ă‚‹äșˆćźšăŒă‚ă‚‹ć ŽćˆăŻă€cryptographyăƒ©ă‚€ăƒ–ăƒ©ăƒȘăźäŸć­˜é–ąäż‚`pyjwt[crypto]`ă‚’ă‚€ăƒłă‚čăƒˆăƒŒăƒ«ă—ăŠăă ă•ă„ă€‚ -è©łçŽ°ăŻ[PyJWT Installation docs](https://pyjwt.readthedocs.io/en/latest/installation.html)でçąșèȘă§ăăŸă™ă€‚ +è©łçŽ°ăŻ[PyJWT ă‚€ăƒłă‚čăƒˆăƒŒăƒ«ă«é–ąă™ă‚‹ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆ](https://pyjwt.readthedocs.io/en/latest/installation.html)でçąșèȘă§ăăŸă™ă€‚ /// @@ -120,7 +120,7 @@ pwdlibはbcryptăƒăƒƒă‚·ăƒ„ă‚ąăƒ«ă‚ŽăƒȘă‚șăƒ ă‚‚ă‚”ăƒăƒŒăƒˆă—ăŠă„ăŸă™ăŒ `authenticate_user` ăŒăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚čă«ć­˜ćœšă—ăȘă„ăƒŠăƒŒă‚¶ăƒŒćă§ć‘Œăłć‡șă•ă‚ŒăŸć Žćˆă§ă‚‚ă€ăƒ€ăƒŸăƒŒăźăƒăƒƒă‚·ăƒ„ă‚’äœżăŁăŠ `verify_password` ă‚’ćźŸèĄŒă—ăŸă™ă€‚ -ă“ă‚Œă«ă‚ˆă‚Šă€ăƒŠăƒŒă‚¶ăƒŒćăŒæœ‰ćŠčă‹ă©ă†ă‹ă«é–ąă‚ă‚‰ăšă‚šăƒłăƒ‰ăƒă‚€ăƒłăƒˆăźćżœç­”æ™‚é–“ăŒăŠăŠă‚ˆăćŒă˜ă«ăȘă‚Šă€æ—ąć­˜ăźăƒŠăƒŒă‚¶ăƒŒćă‚’ćˆ—æŒ™ă™ă‚‹ăŸă‚ă«æ‚Șç”šă•ă‚Œă†ă‚‹ă€Œă‚żă‚€ăƒŸăƒłă‚°æ”»æ’ƒă€ă‚’é˜Čæ­ąă§ăăŸă™ă€‚ +ă“ă‚Œă«ă‚ˆă‚Šă€ăƒŠăƒŒă‚¶ăƒŒćăŒæœ‰ćŠčă‹ă©ă†ă‹ă«é–ąă‚ă‚‰ăšă‚šăƒłăƒ‰ăƒă‚€ăƒłăƒˆăźćżœç­”æ™‚é–“ăŒăŠăŠă‚ˆăćŒă˜ă«ăȘă‚Šă€æ—ąć­˜ăźăƒŠăƒŒă‚¶ăƒŒćă‚’ćˆ—æŒ™ă™ă‚‹ăŸă‚ă«æ‚Ș甹されうる**ă‚żă‚€ăƒŸăƒłă‚°æ”»æ’ƒ**をé˜Čæ­ąă§ăăŸă™ă€‚ /// note | ć‚™è€ƒ @@ -215,7 +215,7 @@ Password: `secret` /// tip | 豆矄識 -ă‚łăƒŒăƒ‰ăźă©ă“ă«ă‚‚ćčłæ–‡ăźăƒ‘ă‚čăƒŻăƒŒăƒ‰"`secret`"はăȘăă€ăƒăƒƒă‚·ăƒ„ćŒ–ă•ă‚ŒăŸă‚‚ăźă—ă‹ăȘいこべをçąșèȘă—ăŠăă ă•ă„ă€‚ +ă‚łăƒŒăƒ‰ăźă©ă“ă«ă‚‚ćčłæ–‡ăźăƒ‘ă‚čăƒŻăƒŒăƒ‰ă€Œ`secret`」はăȘăă€ăƒăƒƒă‚·ăƒ„ćŒ–ă•ă‚ŒăŸă‚‚ăźă—ă‹ăȘいこべをçąșèȘă—ăŠăă ă•ă„ă€‚ /// diff --git a/docs/ja/docs/tutorial/security/simple-oauth2.md b/docs/ja/docs/tutorial/security/simple-oauth2.md index 9e9487d86..84f6101b7 100644 --- a/docs/ja/docs/tutorial/security/simple-oauth2.md +++ b/docs/ja/docs/tutorial/security/simple-oauth2.md @@ -14,7 +14,7 @@ OAuth2 では、「password flowă€ïŒˆă“ă“ă§äœżç”šă™ă‚‹ăƒ•ăƒ­ăƒŒïŒ‰ă‚’äœżă† ăŸăŸă€ăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚čăźăƒąăƒ‡ăƒ«ă§ăŻä»»æ„ăźćˆ„ćă‚’äœżăŁăŠæ§‹ă„ăŸă›ă‚“ă€‚ -ă—ă‹ă—ă€ăƒ­ă‚°ă‚€ăƒłç”šăź path operation ă§ăŻă€ä»•æ§˜ăšăźäș’æ›æ€§ă‚’äżă€ïŒˆăŸăšăˆă°ç”„ăżèŸŒăżăźAPIăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆă‚·ă‚čăƒ†ăƒ ă‚’äœżăˆă‚‹ă‚ˆă†ă«ă™ă‚‹ïŒ‰ăŸă‚ă«ă€ă“ă‚Œă‚‰ăźćć‰ă‚’äœżă†ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚ +ă—ă‹ă—ă€ăƒ­ă‚°ă‚€ăƒłç”šăź *path operation* ă§ăŻă€ä»•æ§˜ăšăźäș’æ›æ€§ă‚’äżă€ïŒˆăŸăšăˆă°ç”„ăżèŸŒăżăźAPIăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆă‚·ă‚čăƒ†ăƒ ă‚’äœżăˆă‚‹ă‚ˆă†ă«ă™ă‚‹ïŒ‰ăŸă‚ă«ă€ă“ă‚Œă‚‰ăźćć‰ă‚’äœżă†ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚ ăŸăŸă€ä»•æ§˜ă§ăŻ `username` ず `password` ăŻăƒ•ă‚©ăƒŒăƒ ăƒ‡ăƒŒă‚żăšă—ăŠé€ă‚‰ăȘければăȘらăȘă„ïŒˆă€ăŸă‚Šă€ă“ă“ă§ăŻJSONăŻäœżă‚ăȘă„ïŒ‰ă“ăšă‚‚ćźšă‚ă‚‰ă‚ŒăŠă„ăŸă™ă€‚ @@ -50,7 +50,7 @@ OAuth2 ă«ăšăŁăŠăŻć˜ăȘă‚‹æ–‡ć­—ćˆ—ă§ă™ă€‚ ### `OAuth2PasswordRequestForm` { #oauth2passwordrequestform } -ăŸăšă€`OAuth2PasswordRequestForm` ă‚’ă‚€ăƒłăƒăƒŒăƒˆă—ă€`/token` た path operation に `Depends` ă§äŸć­˜é–ąäż‚ăšă—ăŠäœżă„ăŸă™: +ăŸăšă€`OAuth2PasswordRequestForm` ă‚’ă‚€ăƒłăƒăƒŒăƒˆă—ă€`/token` た *path operation* に `Depends` ă§äŸć­˜é–ąäż‚ăšă—ăŠäœżă„ăŸă™: {* ../../docs_src/security/tutorial003_an_py310.py hl[4,78] *} @@ -132,7 +132,7 @@ OAuth2 ăźä»•æ§˜ă§ăŻă€ć›ș柚怀 `password` ă‚’æŒă€ăƒ•ă‚ŁăƒŒăƒ«ăƒ‰ `grant_ty `UserInDB(**user_dict)` ăŻæŹĄă‚’æ„ć‘łă—ăŸă™: -`user_dict` ăźă‚­ăƒŒăšć€€ă‚’ă€ăăźăŸăŸă‚­ăƒŒăƒŻăƒŒăƒ‰ćŒ•æ•°ăšă—ăŠæžĄă—ăŸă™ă€‚ă€ăŸă‚ŠæŹĄăšćŒç­‰ă§ă™: +*`user_dict` ăźă‚­ăƒŒăšć€€ă‚’ă€ăăźăŸăŸă‚­ăƒŒăƒŻăƒŒăƒ‰ćŒ•æ•°ăšă—ăŠæžĄă—ăŸă™ă€‚ă€ăŸă‚ŠæŹĄăšćŒç­‰ă§ă™:* ```Python UserInDB( @@ -146,7 +146,7 @@ UserInDB( /// note | ć‚™è€ƒ -`**user_dict` ぼより漌慹ăȘè§ŁèȘŹăŻă€[**èżœćŠ ăƒąăƒ‡ăƒ«**ăźăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆ](../extra-models.md#about-user-in-dict)を揂照しどください。 +`**user_dict` ぼより漌慹ăȘè§ŁèȘŹăŻă€[**èżœćŠ ăƒąăƒ‡ăƒ«**ăźăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆ](../extra-models.md#about-user-in-model-dump)を揂照しどください。 /// @@ -188,7 +188,7 @@ UserInDB( ケクティブăȘăƒŠăƒŒă‚¶ăƒŒăźć Žćˆă«ăźăż `current_user` ă‚’ć–ćŸ—ă—ăŸă„ăšă—ăŸă™ă€‚ -そこで、`get_current_active_user` ă‚’äŸć­˜é–ąäż‚ăšă—ăŠćˆ©ç”šă™ă‚‹èżœćŠ ăźäŸć­˜é–ąäż‚ `get_current_active_user` ă‚’äœœæˆă—ăŸă™ă€‚ +ăă“ă§ă€ä»ŠćșŠăŻ `get_current_user` ă‚’äŸć­˜é–ąäż‚ăšă—ăŠćˆ©ç”šă™ă‚‹èżœćŠ ăźäŸć­˜é–ąäż‚ `get_current_active_user` ă‚’äœœæˆă—ăŸă™ă€‚ これら2ă€ăźäŸć­˜é–ąäż‚ăŻă€ăƒŠăƒŒă‚¶ăƒŒăŒć­˜ćœšă—ăȘă„ă€ăŸăŸăŻéžă‚ąă‚Żăƒ†ă‚Łăƒ–ă§ă‚ă‚‹ć Žćˆă«ă€HTTPă‚šăƒ©ăƒŒă‚’èż”ă™ă ă‘ă§ă™ă€‚ @@ -236,7 +236,7 @@ Password: `secret` ### è‡Șćˆ†ăźăƒŠăƒŒă‚¶ăƒŒăƒ‡ăƒŒă‚żă‚’ć–ćŸ— { #get-your-own-user-data } -`GET` た path `/users/me` ă‚’äœżă„ăŸă™ă€‚ +今ćșŠăŻ path `/users/me` で operation `GET` ă‚’äœżă„ăŸă™ă€‚ æŹĄăźă‚ˆă†ăȘăƒŠăƒŒă‚¶ăƒŒăƒ‡ăƒŒă‚żăŒć–ćŸ—ă§ăăŸă™: @@ -268,7 +268,7 @@ User: `alice` Password: `secret2` -そしど `GET` た path `/users/me` ă‚’äœżă„ăŸă™ă€‚ +そしど path `/users/me` で operation `GET` ă‚’äœżăŁăŠăżăŸă™ă€‚ æŹĄăźă‚ˆă†ăȘ「Inactive useră€ă‚šăƒ©ăƒŒă«ăȘă‚ŠăŸă™: @@ -284,6 +284,6 @@ Password: `secret2` ă“ă‚Œă‚‰ăźé“ć…·ă‚’äœżăˆă°ă€ä»»æ„ăźăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚čă€ä»»æ„ăźăƒŠăƒŒă‚¶ăƒŒ/ăƒ‡ăƒŒă‚żăƒąăƒ‡ăƒ«ăšäș’æ›æ€§ăźă‚ă‚‹ă‚»ă‚­ăƒ„ăƒȘăƒ†ă‚Łă‚·ă‚čăƒ†ăƒ ă‚’æ§‹çŻ‰ă§ăăŸă™ă€‚ -ăŸă ă—ă€ćźŸéš›ă«ăŻăŸă ă€Œćź‰ć…šă€ă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ +ć”Żäž€æŹ ă‘ăŠă„ă‚‹ç‚čăŻă€ćźŸéš›ă«ăŻăŸă ă€Œćź‰ć…šă€ă§ăŻăȘいこべです。 æŹĄăźç« ă§ăŻă€ćź‰ć…šăȘパă‚čăƒŻăƒŒăƒ‰ăƒăƒƒă‚·ăƒ„ăƒ©ă‚€ăƒ–ăƒ©ăƒȘず JWT ăƒˆăƒŒă‚Żăƒłăźäœżă„æ–čă‚’èŠ‹ăŠă„ăăŸă™ă€‚ diff --git a/docs/ja/docs/tutorial/sql-databases.md b/docs/ja/docs/tutorial/sql-databases.md index 13c71fdb2..190eedbbb 100644 --- a/docs/ja/docs/tutorial/sql-databases.md +++ b/docs/ja/docs/tutorial/sql-databases.md @@ -1,5 +1,6 @@ # SQLăƒȘăƒŹăƒŒă‚·ăƒ§ăƒŠăƒ«ïŒ‰ăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚č { #sql-relational-databases } + FastAPI は SQLăƒȘăƒŹăƒŒă‚·ăƒ§ăƒŠăƒ«ïŒ‰ăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚čăźäœżç”šă‚’ćż…é ˆă«ăŻă—ăŸă›ă‚“ă€‚ćż…èŠă§ă‚ă‚Œă°ă€ä»»æ„ăźăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚čă‚’äœżç”šă§ăăŸă™ă€‚ ここでは [SQLModel](https://sqlmodel.tiangolo.com/) ă‚’äœżăŁăŸäŸ‹ă‚’èŠ‹ăŠă„ăăŸă™ă€‚ diff --git a/docs/ja/docs/tutorial/static-files.md b/docs/ja/docs/tutorial/static-files.md index 81f281c2e..fd0d47e9c 100644 --- a/docs/ja/docs/tutorial/static-files.md +++ b/docs/ja/docs/tutorial/static-files.md @@ -2,6 +2,14 @@ `StaticFiles` ă‚’äœżç”šă—ăŠă€ăƒ‡ă‚ŁăƒŹă‚ŻăƒˆăƒȘă‹ă‚‰é™çš„ăƒ•ă‚Ąă‚€ăƒ«ă‚’è‡Șć‹•çš„ă«æäŸ›ă§ăăŸă™ă€‚ +/// tip | 豆矄識 + +フロントスンドをホă‚čăƒˆă™ă‚‹ćż…èŠăŒă‚ă‚‹ć ŽćˆăŻă€ä»Łă‚ă‚Šă« `app.frontend()` ă‚’äœżç”šă—ăŠăă ă•ă„ă€‚è©łă—ăăŻ [フロントスンド](frontend.md) をèȘ­ă‚“ă§ăă ă•ă„ă€‚ + +`app.frontend()` は憅郹で `StaticFiles` ă‚’äœżç”šă—ăŠăŠă‚Šă€client-side routing ぼ懩理ăȘă©ă€ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ć‘ă‘ăźèżœćŠ ăźćˆ©ç‚čăŒă„ăă€ă‹ă‚ă‚ŠăŸă™ă€‚ + +/// + ## `StaticFiles` ăźäœżç”š { #use-staticfiles } * `StaticFiles` ă‚’ă‚€ăƒłăƒăƒŒăƒˆă€‚ diff --git a/docs/ja/docs/tutorial/testing.md b/docs/ja/docs/tutorial/testing.md index 57dcd86c9..e82fc261e 100644 --- a/docs/ja/docs/tutorial/testing.md +++ b/docs/ja/docs/tutorial/testing.md @@ -22,7 +22,7 @@ $ pip install httpx `TestClient` ă‚’ă‚€ăƒłăƒăƒŒăƒˆă—ăŸă™ă€‚ -`TestClient` ă‚’äœœæˆă—ă€**FastAPI** ă«æžĄă—ăŸă™ă€‚ +**FastAPI** ケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłă‚’æžĄă—ăŠ `TestClient` ă‚’äœœæˆă—ăŸă™ă€‚ `test_` ă‹ă‚‰ć§‹ăŸă‚‹ćć‰ăźé–ąæ•°ă‚’äœœæˆă—ăŸă™ (これは `pytest` ăźæš™æș–çš„ăȘă‚łăƒłăƒ™ăƒłă‚·ăƒ§ăƒłă§ă™)。 @@ -52,7 +52,7 @@ $ pip install httpx /// tip | 豆矄識 -FastAPIケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłăžăźăƒȘクスă‚čăƒˆăźé€äżĄăšăŻćˆ„ă«ă€ăƒ†ă‚čトで `async` é–ąæ•° (éžćŒæœŸăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚čé–ąæ•°ăȘど) ă‚’ć‘Œăłć‡șă—ăŸă„ć ŽćˆăŻă€é«˜ćșŠăȘăƒăƒ„ăƒŒăƒˆăƒȘă‚ąăƒ«ăź[Async Tests](../advanced/async-tests.md) を揂照しどください。 +FastAPIケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłăžăźăƒȘクスă‚čăƒˆăźé€äżĄăšăŻćˆ„ă«ă€ăƒ†ă‚čトで `async` é–ąæ•° (éžćŒæœŸăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚čé–ąæ•°ăȘど) ă‚’ć‘Œăłć‡șă—ăŸă„ć ŽćˆăŻă€é«˜ćșŠăȘăƒăƒ„ăƒŒăƒˆăƒȘă‚ąăƒ«ăź[éžćŒæœŸăƒ†ă‚čト](../advanced/async-tests.md) を揂照しどください。 /// @@ -64,7 +64,7 @@ FastAPIケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłăžăźăƒȘクスă‚čăƒˆăźé€äżĄăšăŻćˆ„ă«ă€ăƒ† ### **FastAPI** ケプăƒȘăƒ•ă‚Ąă‚€ăƒ« { #fastapi-app-file } -[Bigger Applications](bigger-applications.md) でèȘŹæ˜Žă•ă‚ŒăŠă„ă‚‹ă€æŹĄăźă‚ˆă†ăȘăƒ•ă‚Ąă‚€ăƒ«æ§‹æˆăŒă‚ă‚‹ăšă—ăŸă™: +[ć€§èŠæšĄăȘケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒł](bigger-applications.md) でèȘŹæ˜Žă•ă‚ŒăŠă„ă‚‹ă€æŹĄăźă‚ˆă†ăȘăƒ•ă‚Ąă‚€ăƒ«æ§‹æˆăŒă‚ă‚‹ăšă—ăŸă™: ``` . @@ -113,7 +113,7 @@ FastAPIケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłăžăźăƒȘクスă‚čăƒˆăźé€äżĄăšăŻćˆ„ă«ă€ăƒ† │   └── test_main.py ``` -ここで、**FastAPI** ケプăƒȘがある `main.py` ăƒ•ă‚Ąă‚€ăƒ«ă«ăŻă€ä»–ăź path operation ăŒă‚ă‚ŠăŸă™ă€‚ +ここで、**FastAPI** ケプăƒȘがある `main.py` ăƒ•ă‚Ąă‚€ăƒ«ă«ăŻă€ä»–ăź **path operations** ăŒă„ăă€ă‹ă‚ă‚ŠăŸă™ă€‚ ă‚šăƒ©ăƒŒă‚’èż”ă™ćŻèƒœæ€§ăźă‚ă‚‹ `GET` ă‚ȘăƒšăƒŹăƒŒă‚·ăƒ§ăƒłăŒă‚ă‚ŠăŸă™ă€‚ diff --git a/docs/ja/docs/virtual-environments.md b/docs/ja/docs/virtual-environments.md index 633825b64..19325fa1d 100644 --- a/docs/ja/docs/virtual-environments.md +++ b/docs/ja/docs/virtual-environments.md @@ -35,15 +35,15 @@ Pythonăƒ—ăƒ­ă‚žă‚§ă‚Żăƒˆăźäœœæ„­ă§ăŻă€**ä»źæƒłç’°ćąƒ**ïŒˆăŸăŸăŻéĄžäŒŒăź
```console -// Go to the home directory +// ăƒ›ăƒŒăƒ ăƒ‡ă‚ŁăƒŹă‚ŻăƒˆăƒȘに移拕 $ cd -// Create a directory for all your code projects +// すăčăŠăźă‚łăƒŒăƒ‰ăƒ—ăƒ­ă‚žă‚§ă‚Żăƒˆç”šăźăƒ‡ă‚ŁăƒŹă‚ŻăƒˆăƒȘă‚’äœœæˆ $ mkdir code -// Enter into that code directory +// そぼ code ディレクトăƒȘに慄る $ cd code -// Create a directory for this project +// こぼプロゾェクト甹ぼディレクトăƒȘă‚’äœœæˆ $ mkdir awesome-project -// Enter into that project directory +// そぼプロゾェクトディレクトăƒȘに慄る $ cd awesome-project ``` From c80355b65eda4e636aff4463d159c1bdc2029982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 15:59:24 +0200 Subject: [PATCH 284/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20zh-hant=20(update-outdated)=20(#15896)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] Co-authored-by: Yurii Motov --- docs/zh-hant/docs/_llm-test.md | 36 ++-- .../docs/advanced/additional-status-codes.md | 1 + .../docs/advanced/advanced-dependencies.md | 1 + docs/zh-hant/docs/advanced/dataclasses.md | 6 +- docs/zh-hant/docs/advanced/events.md | 1 + .../zh-hant/docs/advanced/generate-clients.md | 18 +- .../docs/advanced/json-base64-bytes.md | 8 +- .../docs/advanced/openapi-callbacks.md | 6 +- .../advanced/response-change-status-code.md | 1 + .../zh-hant/docs/advanced/response-cookies.md | 10 +- .../zh-hant/docs/advanced/response-headers.md | 6 +- .../docs/advanced/security/oauth2-scopes.md | 76 ++++----- docs/zh-hant/docs/advanced/settings.md | 6 +- docs/zh-hant/docs/advanced/stream-data.md | 10 +- docs/zh-hant/docs/advanced/wsgi.md | 1 + docs/zh-hant/docs/alternatives.md | 4 +- docs/zh-hant/docs/async.md | 160 +++++++++--------- docs/zh-hant/docs/deployment/cloud.md | 2 +- docs/zh-hant/docs/deployment/concepts.md | 1 + docs/zh-hant/docs/deployment/docker.md | 6 +- docs/zh-hant/docs/deployment/https.md | 1 + docs/zh-hant/docs/deployment/manually.md | 12 +- docs/zh-hant/docs/editor-support.md | 1 + docs/zh-hant/docs/environment-variables.md | 1 + docs/zh-hant/docs/features.md | 96 ++++++----- docs/zh-hant/docs/help-fastapi.md | 1 + .../docs/how-to/configure-swagger-ui.md | 4 +- .../docs/how-to/custom-request-and-route.md | 2 +- docs/zh-hant/docs/how-to/graphql.md | 20 +-- ...migrate-from-pydantic-v1-to-pydantic-v2.md | 20 ++- .../docs/how-to/separate-openapi-schemas.md | 36 ++-- docs/zh-hant/docs/index.md | 6 +- docs/zh-hant/docs/project-generation.md | 1 + docs/zh-hant/docs/python-types.md | 38 ++--- .../docs/tutorial/bigger-applications.md | 22 +-- .../docs/tutorial/body-nested-models.md | 1 + docs/zh-hant/docs/tutorial/body.md | 2 + docs/zh-hant/docs/tutorial/debugging.md | 1 + .../dependencies/dependencies-with-yield.md | 1 + .../zh-hant/docs/tutorial/extra-data-types.md | 1 + docs/zh-hant/docs/tutorial/extra-models.md | 14 +- docs/zh-hant/docs/tutorial/first-steps.md | 30 ++-- docs/zh-hant/docs/tutorial/handling-errors.md | 4 +- docs/zh-hant/docs/tutorial/index.md | 2 +- docs/zh-hant/docs/tutorial/metadata.md | 12 +- .../tutorial/path-operation-configuration.md | 1 + .../tutorial/query-params-str-validations.md | 85 +++++----- docs/zh-hant/docs/tutorial/query-params.md | 5 +- docs/zh-hant/docs/tutorial/request-files.md | 1 + docs/zh-hant/docs/tutorial/request-forms.md | 1 + .../docs/tutorial/response-status-code.md | 1 + .../docs/tutorial/schema-extra-example.md | 4 +- .../docs/tutorial/security/first-steps.md | 44 ++--- .../tutorial/security/get-current-user.md | 2 +- .../docs/tutorial/security/oauth2-jwt.md | 4 +- .../docs/tutorial/security/simple-oauth2.md | 4 +- docs/zh-hant/docs/tutorial/sql-databases.md | 122 ++++++------- docs/zh-hant/docs/tutorial/static-files.md | 8 + docs/zh-hant/docs/tutorial/testing.md | 12 +- docs/zh-hant/docs/virtual-environments.md | 10 +- 60 files changed, 515 insertions(+), 478 deletions(-) diff --git a/docs/zh-hant/docs/_llm-test.md b/docs/zh-hant/docs/_llm-test.md index 0ea674cd8..09efe8377 100644 --- a/docs/zh-hant/docs/_llm-test.md +++ b/docs/zh-hant/docs/_llm-test.md @@ -35,7 +35,7 @@ //// tab | æžŹè©Š -Yesterday, my friend wrote: "If you spell incorrectly correctly, you have spelled it incorrectly". To which I answered: "Correct, but 'incorrectly' is incorrectly not '"incorrectly"'". +æ˜šć€©ïŒŒæˆ‘çš„æœ‹ć‹ćŻ«é“ïŒšă€ŒćŠ‚æžœäœ æ­Łçąșćœ°æ‹ŒćŻ« incorrectlyïŒŒäœ ć°±æŠŠćźƒæ‹Œæˆ incorrectly äș†ă€ă€‚æˆ‘ć›žç­”ïŒšă€Œæ­Łçąș䜆 'incorrectly' éŒŻćœšćźƒäžæ˜Ż '"incorrectly"'"」。 /// note | æłšæ„ @@ -59,7 +59,7 @@ LLM ćŸˆćŻèƒœæœƒæŠŠé€™æź”çż»è­ŻéŒŻă€‚é‡é»žćȘćœšæ–Œé‡æ–°çż»è­Żæ™‚æ˜ŻćŠèƒœäż `pip install "foo[bar]"` -çš‹ćŒçąŒç‰‡æź”äž­ć­—äžČćžžć€Œçš„äŸ‹ć­ïŒš"this"、'that'。 +çš‹ćŒçąŒç‰‡æź”äž­ć­—äžČćžžć€Œçš„äŸ‹ć­ïŒš`"this"`、`'that'`。 èŒƒé›Łçš„çš‹ćŒçąŒç‰‡æź”äž­ć­—äžČćžžć€ŒäŸ‹ć­ïŒš`f"I like {'oranges' if orange else "apples"}"` @@ -125,23 +125,23 @@ works(foo="bar") # é€™ćŻä»„é‹äœœ 🎉 //// tab | æžŹè©Š /// note | æłšæ„ -Some text +侀äș›æ–‡ć­— /// /// note | æŠ€èĄ“çŽ°çŻ€ -Some text +侀äș›æ–‡ć­— /// /// tip | 提ç€ș -Some text +侀äș›æ–‡ć­— /// /// warning | è­Šć‘Š -Some text +侀äș›æ–‡ć­— /// /// danger | ć±éšȘ -Some text +侀äș›æ–‡ć­— /// //// @@ -222,15 +222,15 @@ Some text ### 開癌ç¶Čé æ‡‰ç”šçš‹ćŒ - æ•™ć­ž { #develop-a-webapp-a-tutorial } -Hello. +äœ ć„œă€‚ ### ćž‹ćˆ„æç€șèˆ‡èš»è§Ł { #type-hints-and-annotations } -Hello again. +ć†æŹĄäœ ć„œă€‚ ### è¶…éĄžèˆ‡ć­éĄžćˆ„ { #super-and-subclasses } -Hello again. +ć†æŹĄäœ ć„œă€‚ //// @@ -248,15 +248,15 @@ Hello again. //// tab | æžŹè©Š -* you -* your +* 䜠 +* 䜠的 -* e.g. -* etc. +* äŸ‹ćŠ‚ +* 等等 -* `foo` as an `int` -* `bar` as a `str` -* `baz` as a `list` +* `foo` 䜜ç‚ș `int` +* `bar` 䜜ç‚ș `str` +* `baz` 䜜ç‚ș `list` * æ•™ć­ž - äœżç”šè€…æŒ‡ć— * é€ČéšŽäœżç”šè€…æŒ‡ć— @@ -283,7 +283,7 @@ Hello again. * ćłæ™‚ * æš™æș– * 預蚭 -* ćŒșćˆ†ć€§ć°ćŻ« +* ć€ćˆ†ć€§ć°ćŻ« * äžć€ćˆ†ć€§ć°ćŻ« * æäŸ›æ‡‰ç”šçš‹ćŒæœć‹™ diff --git a/docs/zh-hant/docs/advanced/additional-status-codes.md b/docs/zh-hant/docs/advanced/additional-status-codes.md index 0e5941a8d..bbb4f57dc 100644 --- a/docs/zh-hant/docs/advanced/additional-status-codes.md +++ b/docs/zh-hant/docs/advanced/additional-status-codes.md @@ -1,5 +1,6 @@ # éĄć€–çš„ç‹€æ…‹çąŒ { #additional-status-codes } + ćœšé èš­æƒ…æłäž‹ïŒŒ**FastAPI** æœƒäœżç”š `JSONResponse` ć‚łć›žć›žæ‡‰ïŒŒäžŠæŠŠäœ ćŸžäœ çš„ă€Œè·ŻćŸ‘æ“äœœïŒˆpath operationïŒ‰ă€ć›žć‚łçš„ć…§ćźč攟é€Čè©Č `JSONResponse` 侭。 ćźƒæœƒäœżç”šé èš­çš„ç‹€æ…‹çąŒïŒŒæˆ–äœ ćœšè·ŻćŸ‘æ“äœœäž­èš­ćźšçš„ç‹€æ…‹çąŒă€‚ diff --git a/docs/zh-hant/docs/advanced/advanced-dependencies.md b/docs/zh-hant/docs/advanced/advanced-dependencies.md index 880d92ce9..92dabdaf1 100644 --- a/docs/zh-hant/docs/advanced/advanced-dependencies.md +++ b/docs/zh-hant/docs/advanced/advanced-dependencies.md @@ -1,5 +1,6 @@ # é€Č階盞䟝 { #advanced-dependencies } + ## ćƒæ•žćŒ–çš„ç›žäŸ { #parameterized-dependencies } 戰盼才ç‚șæ­ąçœ‹ćˆ°çš„ç›žäŸéƒœæ˜Żć›șćźšçš„ć‡œćŒæˆ–éĄžćˆ„ă€‚ diff --git a/docs/zh-hant/docs/advanced/dataclasses.md b/docs/zh-hant/docs/advanced/dataclasses.md index 0a673889e..64ba7dde2 100644 --- a/docs/zh-hant/docs/advanced/dataclasses.md +++ b/docs/zh-hant/docs/advanced/dataclasses.md @@ -63,12 +63,12 @@ FastAPI ć»șç«‹ćœš **Pydantic** äč‹äžŠïŒŒæˆ‘äč‹ć‰ç€șçŻ„éŽćŠ‚äœ•äœżç”š Pydantic 7. é€™èŁĄ `response_model` äœżç”šçš„æ˜Żă€Œ`Author` dataclass çš„æž…ć–źă€é€™çšźćž‹ćˆ„èš»èš˜ă€‚ ćŒæšŁćœ°ïŒŒäœ ćŻä»„æŠŠ `dataclasses` 與暙æș–ćž‹ćˆ„èš»èš˜ç”„ćˆäœżç”šă€‚ -8. æłšæ„é€™ć€‹ă€Œè·ŻćŸ‘æ“äœœć‡œćŒă€äœżç”šçš„æ˜Żäž€èˆŹçš„ `def` 而非 `async def`。 +8. æłšæ„é€™ć€‹*è·ŻćŸ‘æ“äœœć‡œćŒ*äœżç”šçš„æ˜Żäž€èˆŹçš„ `def` 而非 `async def`。 äž€ćŠ‚ćŸ€ćžžïŒŒćœš FastAPI äž­äœ ćŻä»„èŠ–éœ€èŠæ··ç”š `def` 與 `async def`。 - ćŠ‚æžœéœ€èŠè€‡çż’äœ•æ™‚ç”šć“Șć€‹ïŒŒè«‹ćƒè€ƒæ–‡ä»¶äž­é—œæ–Œ [`async` 與 `await`](../async.md#in-a-hurry) çš„ç« çŻ€ă€ŒIn a hurry?」。 -9. é€™ć€‹ă€Œè·ŻćŸ‘æ“äœœć‡œćŒă€ć›žć‚łçš„äžæ˜Ż dataclass雖然äčŸćŻä»„ïŒ‰ïŒŒè€Œæ˜Żäž€ć€‹ćŒ…ć«ć…§éƒšèł‡æ–™çš„ć­—ć…žæž…ć–źă€‚ + ćŠ‚æžœéœ€èŠè€‡çż’äœ•æ™‚ç”šć“Șć€‹ïŒŒè«‹ćƒè€ƒæ–‡ä»¶äž­é—œæ–Œ [`async` 與 `await`](../async.md#in-a-hurry) 的章節 _ă€Œè¶•æ™‚é–“ïŒŸă€_。 +9. 這怋*è·ŻćŸ‘æ“äœœć‡œćŒ*ć›žć‚łçš„äžæ˜Ż dataclass雖然äčŸćŻä»„ïŒ‰ïŒŒè€Œæ˜Żäž€ć€‹ćŒ…ć«ć…§éƒšèł‡æ–™çš„ć­—ć…žæž…ć–źă€‚ FastAPI æœƒäœżç”š `response_model` ćƒæ•žïŒˆć…¶äž­ćŒ…ć« dataclassïŒ‰äŸ†èœ‰æ›ć›žæ‡‰ă€‚ diff --git a/docs/zh-hant/docs/advanced/events.md b/docs/zh-hant/docs/advanced/events.md index 60014a90a..e132d9f3d 100644 --- a/docs/zh-hant/docs/advanced/events.md +++ b/docs/zh-hant/docs/advanced/events.md @@ -1,5 +1,6 @@ # ç”Ÿć‘œé€±æœŸäș‹ä»¶ { #lifespan-events } + äœ ćŻä»„ćźšçŸ©ćœšæ‡‰ç”šçš‹ćŒ**敟拕**äč‹ć‰èŠćŸ·èĄŒçš„é‚èŒŻïŒˆçš‹ćŒçąŒïŒ‰ă€‚äčŸć°±æ˜ŻèȘȘïŒŒé€™æź”çš‹ćŒçąŒæœƒćœšæ‡‰ç”šé–‹ć§‹æŽ„æ”¶è«‹æ±‚**äč‹ć‰**、**ćȘćŸ·èĄŒäž€æŹĄ**。 ćŒæšŁćœ°ïŒŒäœ äčŸćŻä»„ćźšçŸ©ćœšæ‡‰ç”šçš‹ćŒ**關閉**æ™‚èŠćŸ·èĄŒçš„é‚èŒŻïŒˆçš‹ćŒçąŒïŒ‰ă€‚ćœšé€™çšźæƒ…æłäž‹ïŒŒé€™æź”çš‹ćŒçąŒæœƒćœšè™•ç†äș†**èš±ć€šè«‹æ±‚**äč‹ćŸŒă€**ćȘćŸ·èĄŒäž€æŹĄ**。 diff --git a/docs/zh-hant/docs/advanced/generate-clients.md b/docs/zh-hant/docs/advanced/generate-clients.md index a56877ccd..cc7a6865a 100644 --- a/docs/zh-hant/docs/advanced/generate-clients.md +++ b/docs/zh-hant/docs/advanced/generate-clients.md @@ -20,20 +20,6 @@ FastAPI 會è‡Ș拕由生 **OpenAPI 3.1** èŠæ ŒïŒŒć› æ­€äœ äœżç”šçš„ä»»äœ•ć·„ć…· /// -## 䟆è‡Ș FastAPI èŽŠćŠ©ć•†çš„ SDK 由生晹 { #sdk-generators-from-fastapi-sponsors } - -æœŹçŻ€é‡é»žä»‹çŽčç”±èŽŠćŠ© FastAPI çš„ć…ŹćžæäŸ›çš„**ć‰”æŠ•æ”ŻæŒ**與**ć…Źćžç¶­é‹**çš„è§Łæ±șæ–čæĄˆă€‚這äș›ç”ąć“ćœšé«˜ć“èłȘ的è‡Ș拕由生 SDK äč‹ć€–還提䟛**éĄć€–ćŠŸèƒœ**與**æ•Žćˆ**。 - -透過 ✹ [**èŽŠćŠ© FastAPI**](../help-fastapi.md#sponsor-the-author) ✚這äș›ć…Źćžćč«ćŠ©çąșäżæĄ†æž¶èˆ‡ć…¶**ç”Ÿæ…‹çł»**ç¶­æŒć„ćș·äž”**æ°žçșŒ**。 - -ä»–ć€‘çš„èŽŠćŠ©äčŸć±•çŸć° FastAPI **瀟矀**䜠的高ćșŠæ‰żè«ŸïŒŒäžćƒ…é—œćżƒæäŸ›**ć„Șè‰Żæœć‹™**ä蟿”ŻæŒ **FastAPI** 䜜ç‚ș侀怋**ç©©ć„äž”è“Źć‹ƒçš„æĄ†æž¶**。🙇 - -äŸ‹ćŠ‚ïŒŒäœ ćŻä»„ć˜—è©ŠïŒš - -* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) - -ć…¶äž­æœ‰äș›æ–čæĄˆäčŸćŻèƒœæ˜Żé–‹æșæˆ–æäŸ›ć…èČ»æ–čæĄˆïŒŒèź“䜠䞍需èČĄć‹™æ‰żè«Ÿć°±èƒœè©Šç”šă€‚ć…¶ä»–ć•†æ„­çš„ SDK 由生晹äčŸäžć°‘ïŒŒäœ ćŻä»„朹ç¶Čè·ŻäžŠæ‰Ÿćˆ°ă€‚đŸ€“ - ## ć»ș立 TypeScript SDK { #create-a-typescript-sdk } ć…ˆćŸžäž€ć€‹ç°Ąć–źçš„ FastAPI æ‡‰ç”šé–‹ć§‹ïŒš @@ -56,7 +42,7 @@ FastAPI 會è‡Ș拕由生 **OpenAPI 3.1** èŠæ ŒïŒŒć› æ­€äœ äœżç”šçš„ä»»äœ•ć·„ć…· ### Hey API { #hey-api } -ç•¶æˆ‘ć€‘æœ‰ć«æšĄćž‹çš„ FastAPI æ‡‰ç”šćŸŒïŒŒć°±èƒœç”š Hey API äŸ†ç”ąç”Ÿ TypeScript ç”šæˆ¶ç«Żă€‚æœ€ćż«çš„æ–čæł•æ˜Żé€éŽ npx +ç•¶æˆ‘ć€‘æœ‰ć«æšĄćž‹çš„ FastAPI æ‡‰ç”šćŸŒïŒŒć°±èƒœç”š Hey API äŸ†ç”ąç”Ÿ TypeScript ç”šæˆ¶ç«Żă€‚æœ€ćż«çš„æ–čæł•æ˜Żé€éŽ npx。 ```sh npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client @@ -194,7 +180,7 @@ npx @hey-api/openapi-ts -i ./openapi.json -o src/client äœżç”šè‡Șć‹•ç”ąç”Ÿçš„ç”šæˆ¶ç«Żæ™‚ïŒŒäœ æœƒćŸ—ćˆ°ä»„äž‹é …ç›źçš„**è‡Șć‹•ćźŒæˆ** * æ–čæł• -* æœŹæ–‡äž­çš„è«‹æ±‚æœ‰æ•ˆèŒ‰è·ă€æŸ„è©ąćƒæ•žç­‰ +* Body äž­çš„è«‹æ±‚æœ‰æ•ˆèŒ‰è·ă€æŸ„è©ąćƒæ•žç­‰ * ć›žæ‡‰çš„æœ‰æ•ˆèŒ‰è· 䜠ä蟿œƒć°æ‰€æœ‰ć…§ćźčçČćŸ—**èĄŒć…§éŒŻèȘ€**提ç€ș。 diff --git a/docs/zh-hant/docs/advanced/json-base64-bytes.md b/docs/zh-hant/docs/advanced/json-base64-bytes.md index 9f1ecfa2e..bdf146b8c 100644 --- a/docs/zh-hant/docs/advanced/json-base64-bytes.md +++ b/docs/zh-hant/docs/advanced/json-base64-bytes.md @@ -4,7 +4,7 @@ ## Base64 與æȘ”æĄˆ { #base64-vs-files } -è«‹ć…ˆè€ƒæ…źæ˜ŻćŠèƒœç”š [請求æȘ”æĄˆ](../tutorial/request-files.md) äŸ†äžŠć‚łäșŒé€Čäœèł‡æ–™ïŒŒäžŠç”š [è‡Șèš‚ć›žæ‡‰ - FileResponse](./custom-response.md#fileresponse--fileresponse-) äŸ†ć‚łé€äșŒé€Čäœèł‡æ–™ïŒŒè€Œäžæ˜ŻæŠŠćźƒć€‘ç·šçąŒé€Č JSON。 +è«‹ć…ˆè€ƒæ…źæ˜ŻćŠèƒœç”š [請求æȘ”æĄˆ](../tutorial/request-files.md) äŸ†äžŠć‚łäșŒé€Čäœèł‡æ–™ïŒŒäžŠç”š [è‡Șèš‚ć›žæ‡‰ - FileResponse](./custom-response.md#fileresponse) äŸ†ć‚łé€äșŒé€Čäœèł‡æ–™ïŒŒè€Œäžæ˜ŻæŠŠćźƒć€‘ç·šçąŒé€Č JSON。 JSON ćȘèƒœćŒ…ć« UTF-8 ç·šçąŒçš„ć­—äžČïŒŒć› æ­€ç„Ąæł•ç›ŽæŽ„ćŒ…ć«ćŽŸć§‹äœć…ƒç”„ă€‚ @@ -14,7 +14,7 @@ Base64 ćŻä»„æŠŠäșŒé€Čäœèł‡æ–™ç·šçąŒæˆć­—äžČ䜆ç‚șæ­€æœƒäœżç”šæŻ”ćŽŸć§‹äșŒ ## Pydantic `bytes` { #pydantic-bytes } -äœ ćŻä»„ćźŁć‘Šć«æœ‰ `bytes` æŹ„äœçš„ Pydantic æšĄćž‹ïŒŒäžŠćœšæšĄćž‹èš­ćźšäž­äœżç”š `val_json_bytes`ïŒŒäœżć…¶ćœšé©—è­‰èŒžć…„çš„ JSON èł‡æ–™æ™‚äœżç”š base64ïŒ›ćœšé©—è­‰éŽçš‹äž­ïŒŒćźƒæœƒć°‡ base64 歗äžČè§ŁçąŒç‚șäœć…ƒç”„ă€‚ +äœ ćŻä»„ćźŁć‘Šć«æœ‰ `bytes` æŹ„äœçš„ Pydantic æšĄćž‹ïŒŒäžŠćœšæšĄćž‹èš­ćźšäž­äœżç”š `val_json_bytes`ïŒŒäœżć…¶ćœš*驗證*èŒžć…„çš„ JSON èł‡æ–™æ™‚äœżç”š base64ïŒ›ćœšé©—è­‰éŽçš‹äž­ïŒŒćźƒæœƒć°‡ base64 歗äžČè§ŁçąŒç‚șäœć…ƒç”„ă€‚ {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} @@ -52,12 +52,12 @@ Base64 ćŻä»„æŠŠäșŒé€Čäœèł‡æ–™ç·šçąŒæˆć­—äžČ䜆ç‚șæ­€æœƒäœżç”šæŻ”ćŽŸć§‹äșŒ ## Pydantic `bytes` 甚斌茞ć‡șèł‡æ–™ { #pydantic-bytes-for-output-data } -䜠äčŸćŻä»„ćœšæšĄćž‹èš­ćźšäž­æ­é… `ser_json_bytes` äœżç”š `bytes` æŹ„äœäŸ†è™•ç†èŒžć‡șèł‡æ–™ïŒ›ç•¶ç”ąç”Ÿ JSON ć›žæ‡‰æ™‚ïŒŒPydantic æœƒć°‡äœć…ƒç”„ä»„ base64 é€ČèĄŒćșćˆ—ćŒ–ă€‚ +䜠äčŸćŻä»„ćœšæšĄćž‹èš­ćźšäž­æ­é… `ser_json_bytes` äœżç”š `bytes` æŹ„äœäŸ†è™•ç†èŒžć‡șèł‡æ–™ïŒ›ç•¶ç”ąç”Ÿ JSON ć›žæ‡‰æ™‚ïŒŒPydantic æœƒć°‡äœć…ƒç”„ä»„ base64 é€ČèĄŒ*ćșćˆ—ćŒ–*。 {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *} ## Pydantic `bytes` ç”šæ–ŒèŒžć…„èˆ‡èŒžć‡șèł‡æ–™ { #pydantic-bytes-for-input-and-output-data } -當然䜠äčŸćŻä»„äœżç”šćŒäž€ć€‹ä»„ base64 èš­ćźšçš„æšĄćž‹ïŒŒćŒæ™‚è™•ç†èŒžć…„ïŒˆä»„ `val_json_bytes` 驗證與茞ć‡ș仄 `ser_json_bytes` ćșćˆ—ćŒ–ïŒ‰çš„ JSON èł‡æ–™ă€‚ +當然䜠äčŸćŻä»„äœżç”šćŒäž€ć€‹ä»„ base64 èš­ćźšçš„æšĄćž‹ïŒŒćŒæ™‚è™•ç†æŽ„æ”¶èˆ‡ć‚łé€ JSON èł‡æ–™æ™‚çš„èŒžć…„ïŒˆä»„ `val_json_bytes` *驗證*與茞ć‡ș仄 `ser_json_bytes` *ćșćˆ—ćŒ–*ïŒ‰ă€‚ {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/zh-hant/docs/advanced/openapi-callbacks.md b/docs/zh-hant/docs/advanced/openapi-callbacks.md index 8b4af6dd3..6ab869acc 100644 --- a/docs/zh-hant/docs/advanced/openapi-callbacks.md +++ b/docs/zh-hant/docs/advanced/openapi-callbacks.md @@ -4,7 +4,7 @@ 當䜠的 API æ‡‰ç”šć‘Œć«ă€Œć€–éƒš APIă€æ™‚ç™Œç”Ÿçš„éŽçš‹çš±ç‚șă€Œć›žć‘ŒïŒˆcallbackïŒ‰ă€ă€‚ć› ç‚șć€–éƒšé–‹ç™Œè€…æ’°ćŻ«çš„è»Ÿé«”æœƒć…ˆć‘äœ çš„ API 癌ć‡ș請求掄著䜠的 API ć†ă€Œć›žć‘Œă€ïŒŒäčŸć°±æ˜Żć‘ïŒˆćŻèƒœćŒäž€äœé–‹ç™Œè€…ć»șç«‹çš„ïŒ‰ć€–éƒš API ç™Œé€è«‹æ±‚ă€‚ -ćœšé€™çšźæƒ…æłäž‹ïŒŒäœ ćŻèƒœæƒłèŠæ–‡ä»¶ćŒ–èȘȘ明è©Čć€–éƒš API 應è©Č長什éșŒæšŁć­ă€‚ćꃿ‡‰è©Č有ć“Șäș›ă€Œè·ŻćŸ‘æ“äœœă€ă€æ‡‰è©ČæŽ„ć—ä»€éșŒ bodyă€æ‡‰è©Č曞悳什éșŒ responseïŒŒç­‰ç­‰ă€‚ +ćœšé€™çšźæƒ…æłäž‹ïŒŒäœ ćŻèƒœæƒłèŠæ–‡ä»¶ćŒ–èȘȘ明è©Čć€–éƒš API 應è©Č長什éșŒæšŁć­ă€‚ćꃿ‡‰è©Č有ć“Șäș›ă€Œè·ŻćŸ‘æ“äœœă€ă€æ‡‰è©ČæŽ„ć—ä»€éșŒ bodyă€æ‡‰è©Č曞悳什éșŒć›žæ‡‰ïŒŒç­‰ç­‰ă€‚ ## ćž¶æœ‰ć›žć‘Œçš„æ‡‰ç”š { #an-app-with-callbacks } @@ -82,7 +82,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) ćœšæ’°ćŻ«ć›žć‘Œçš„æ–‡ä»¶ćŒ–çš‹ćŒçąŒæ™‚ïŒŒæŠŠè‡Șć·±æƒłćƒæˆé‚Łäœă€Œć€–éƒšé–‹ç™Œè€…ă€æœƒćŸˆæœ‰ćč«ćŠ©ă€‚è€Œäž”äœ çŸćœšæ˜ŻćœšćŻŠäœœă€Œć€–éƒš APIă€ïŒŒäžæ˜Żă€Œäœ çš„ API」。 -æš«æ™‚æŽĄç”šé€™ć€‹ïŒˆć€–éƒšé–‹ç™Œè€…ïŒ‰çš„èŠ–è§’ïŒŒæœ‰ćŠ©æ–Œèź“äœ æ›Žç›ŽèŠș㜰æ±ș漚è©ČæŠŠćƒæ•žă€body 的 Pydantic æšĄćž‹ă€response çš„æšĄćž‹ç­‰æ”Ÿćœšć“ȘèŁĄïŒŒć°æ–Œé‚Łć€‹ă€Œć€–éƒš APIă€æœƒæ›Žæž…æ„šă€‚ +æš«æ™‚æŽĄç”šé€™ć€‹ïŒˆć€–éƒšé–‹ç™Œè€…ïŒ‰çš„èŠ–è§’ïŒŒæœ‰ćŠ©æ–Œèź“äœ æ›Žç›ŽèŠș㜰æ±ș漚è©ČæŠŠćƒæ•žă€body 的 Pydantic æšĄćž‹ă€ć›žæ‡‰æšĄćž‹ç­‰æ”Ÿćœšć“ȘèŁĄïŒŒć°æ–Œé‚Łć€‹ă€Œć€–éƒš APIă€æœƒæ›Žæž…æ„šă€‚ /// @@ -99,7 +99,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) ćźƒçœ‹è”·äŸ†ć°±ćƒäž€èˆŹçš„ FastAPIă€Œè·ŻćŸ‘æ“äœœă€ïŒš * ćŻèƒœéœ€èŠćźŁć‘Šćźƒæ‡‰è©Č掄收的 bodyïŒŒäŸ‹ćŠ‚ `body: InvoiceEvent`。 -* äčŸćŻä»„ćźŁć‘Šćźƒæ‡‰è©Č曞悳的 responseïŒŒäŸ‹ćŠ‚ `response_model=InvoiceEventReceived`。 +* äčŸćŻä»„ćźŁć‘Šćźƒæ‡‰è©Čć›žć‚łçš„ć›žæ‡‰ïŒŒäŸ‹ćŠ‚ `response_model=InvoiceEventReceived`。 {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *} diff --git a/docs/zh-hant/docs/advanced/response-change-status-code.md b/docs/zh-hant/docs/advanced/response-change-status-code.md index 31b688512..ee6373a30 100644 --- a/docs/zh-hant/docs/advanced/response-change-status-code.md +++ b/docs/zh-hant/docs/advanced/response-change-status-code.md @@ -1,5 +1,6 @@ # ć›žæ‡‰ - èźŠæ›Žç‹€æ…‹çąŒ { #response-change-status-code } + äœ ćŻèƒœć·Čç¶“èź€éŽïŒŒćŻä»„èš­ćźšé èš­çš„[ć›žæ‡‰ç‹€æ…‹çąŒ](../tutorial/response-status-code.md)。 䜆有äș›æƒ…æłäœ éœ€èŠć›žć‚łèˆ‡é èš­äžćŒçš„ç‹€æ…‹çąŒă€‚ diff --git a/docs/zh-hant/docs/advanced/response-cookies.md b/docs/zh-hant/docs/advanced/response-cookies.md index 2ba14c3f6..b27552330 100644 --- a/docs/zh-hant/docs/advanced/response-cookies.md +++ b/docs/zh-hant/docs/advanced/response-cookies.md @@ -2,9 +2,9 @@ ## äœżç”š `Response` ćƒæ•ž { #use-a-response-parameter } -äœ ćŻä»„ćœšè·ŻćŸ‘æ“äœœć‡œćŒïŒˆpath operation functionïŒ‰äž­ćźŁć‘Šäž€ć€‹ćž‹ćˆ„ç‚ș `Response` çš„ćƒæ•žă€‚ +äœ ćŻä»„ćœšäœ çš„*è·ŻćŸ‘æ“äœœć‡œćŒ*path operation functionïŒ‰äž­ćźŁć‘Šäž€ć€‹ćž‹ćˆ„ç‚ș `Response` çš„ćƒæ•žă€‚ -æŽ„è‘—äœ ćŻä»„ćœšé‚Łć€‹ă€Œæš«æ™‚ă€çš„ `Response` ç‰©ä»¶äžŠèš­ćźš Cookie。 +æŽ„è‘—äœ ćŻä»„ćœšé‚Łć€‹*暫時*的 `Response` ç‰©ä»¶äžŠèš­ćźš Cookie。 {* ../../docs_src/response_cookies/tutorial002_py310.py hl[1, 8:9] *} @@ -12,7 +12,7 @@ ćŠ‚æžœäœ ćźŁć‘Šäș† `response_model`ïŒŒćźƒä»æœƒç”šäŸ†éŽæżŸäžŠèœ‰æ›äœ ć›žć‚łçš„ç‰©ä»¶ă€‚ -FastAPI æœƒäœżç”šé‚Łć€‹æš«æ™‚çš„ `Response` 揖ć‡ș CookieïŒˆä»„ćŠæš™é ­èˆ‡ç‹€æ…‹çąŒïŒ‰ïŒŒäžŠć°‡ćźƒć€‘æ”Ÿć…„æœ€ç”‚ć›žæ‡‰ïŒ›æœ€ç”‚ć›žæ‡‰ćŒ…ć«äœ ć›žć‚łçš„ć€ŒïŒŒäž”æœƒć„—ç”šä»»äœ• `response_model` çš„éŽæżŸă€‚ +**FastAPI** æœƒäœżç”šé‚Łć€‹*暫時*的 `Response` 揖ć‡ș CookieïŒˆä»„ćŠæš™é ­èˆ‡ç‹€æ…‹çąŒïŒ‰ïŒŒäžŠć°‡ćźƒć€‘æ”Ÿć…„æœ€ç”‚ć›žæ‡‰ïŒ›æœ€ç”‚ć›žæ‡‰ćŒ…ć«äœ ć›žć‚łçš„ć€ŒïŒŒäž”æœƒć„—ç”šä»»äœ• `response_model` çš„éŽæżŸă€‚ 䜠äčŸćŻä»„ćœšç›žäŸé …ïŒˆdependenciesïŒ‰äž­ćźŁć‘Š `Response` ćƒæ•žïŒŒäžŠćœšć…¶äž­èš­ćźš CookieïŒˆèˆ‡æš™é ­ïŒ‰ă€‚ @@ -42,9 +42,9 @@ FastAPI æœƒäœżç”šé‚Łć€‹æš«æ™‚çš„ `Response` 揖ć‡ș CookieïŒˆä»„ćŠæš™é ­èˆ‡ç‹€ 䜠äčŸćŻä»„äœżç”š `from starlette.responses import Response` 或 `from starlette.responses import JSONResponse`。 -ç‚șäș†æ–čäŸżé–‹ç™Œè€…ïŒŒFastAPI äčŸć°‡ç›žćŒçš„ `starlette.responses` 透過 `fastapi.responses` æäŸ›ă€‚äžéŽïŒŒć€§ć€šæ•žćŻç”šçš„ć›žæ‡‰éĄžćˆ„éƒœç›ŽæŽ„äŸ†è‡Ș Starlette。 +**FastAPI** ç‚șäș†æ–čäŸżäœ é€™äœé–‹ç™Œè€…ïŒŒäčŸć°‡ç›žćŒçš„ `starlette.responses` 透過 `fastapi.responses` æäŸ›ă€‚äžéŽïŒŒć€§ć€šæ•žćŻç”šçš„ć›žæ‡‰éĄžćˆ„éƒœç›ŽæŽ„äŸ†è‡Ș Starlette。 -ćŠć€–ç”±æ–Œ `Response` ćžžç”šæ–Œèš­ćźšæš™é ­èˆ‡ CookieFastAPI äčŸćœš `fastapi.Response` 提䟛äș†ćźƒă€‚ +ćŠć€–ç”±æ–Œ `Response` ćžžç”šæ–Œèš­ćźšæš™é ­èˆ‡ Cookie**FastAPI** äčŸćœš `fastapi.Response` 提䟛äș†ćźƒă€‚ /// diff --git a/docs/zh-hant/docs/advanced/response-headers.md b/docs/zh-hant/docs/advanced/response-headers.md index 4f7494a8b..002fb0e54 100644 --- a/docs/zh-hant/docs/advanced/response-headers.md +++ b/docs/zh-hant/docs/advanced/response-headers.md @@ -12,7 +12,7 @@ ćŠ‚æžœäœ ćźŁć‘Šäș† `response_model`ïŒŒćźƒä»æœƒç”šäŸ†éŽæżŸäžŠèœ‰æ›äœ ć›žć‚łçš„ç‰©ä»¶ă€‚ -FastAPI æœƒäœżç”šé‚Łć€‹æš«æ™‚æ€§çš„ć›žæ‡‰äŸ†æ“·ć–æš™é ­ïŒˆé‚„æœ‰ Cookie èˆ‡ç‹€æ…‹çąŒïŒ‰ïŒŒäžŠæŠŠćźƒć€‘æ”Ÿćˆ°æœ€ç”‚ć›žæ‡‰äž­ïŒ›æœ€ç”‚ć›žæ‡‰ćŒ…ć«äœ ć›žć‚łçš„ć€ŒïŒŒäž”æœƒäŸä»»äœ• `response_model` é€ČèĄŒéŽæżŸă€‚ +**FastAPI** æœƒäœżç”šé‚Łć€‹æš«æ™‚æ€§çš„ć›žæ‡‰äŸ†æ“·ć–æš™é ­ïŒˆé‚„æœ‰ Cookie èˆ‡ç‹€æ…‹çąŒïŒ‰ïŒŒäžŠæŠŠćźƒć€‘æ”Ÿćˆ°æœ€ç”‚ć›žæ‡‰äž­ïŒ›æœ€ç”‚ć›žæ‡‰ćŒ…ć«äœ ć›žć‚łçš„ć€ŒïŒŒäž”æœƒäŸä»»äœ• `response_model` é€ČèĄŒéŽæżŸă€‚ 䜠äčŸćŻä»„ćœšäŸèłŽäž­ćźŁć‘Š `Response` ćƒæ•žïŒŒäžŠćœšć…¶äž­èš­ćźšæš™é ­ïŒˆèˆ‡ CookieïŒ‰ă€‚ @@ -28,9 +28,9 @@ FastAPI æœƒäœżç”šé‚Łć€‹æš«æ™‚æ€§çš„ć›žæ‡‰äŸ†æ“·ć–æš™é ­ïŒˆé‚„æœ‰ Cookie 與狀 䜠äčŸćŻä»„äœżç”š `from starlette.responses import Response` 或 `from starlette.responses import JSONResponse`。 -ç‚șäș†æ–čäŸżé–‹ç™Œè€…ïŒŒFastAPI 提䟛與 `starlette.responses` 盾搌的慧ćźčæ–Œ `fastapi.responses`ă€‚äœ†ć€§ć€šæ•žćŻç”šçš„ć›žæ‡‰éĄžćž‹ć…¶ćŻŠç›ŽæŽ„äŸ†è‡Ș Starlette。 +ç‚șäș†æ–čäŸżé–‹ç™Œè€…ïŒŒ**FastAPI** 提䟛與 `starlette.responses` 盾搌的慧ćźčæ–Œ `fastapi.responses`ă€‚äœ†ć€§ć€šæ•žćŻç”šçš„ć›žæ‡‰éĄžćž‹ć…¶ćŻŠç›ŽæŽ„äŸ†è‡Ș Starlette。 -由斌 `Response` ćžžç”šäŸ†èš­ćźšæš™é ­èˆ‡ CookieFastAPI äčŸćœš `fastapi.Response` 提䟛äș†ćźƒă€‚ +由斌 `Response` ćžžç”šäŸ†èš­ćźšæš™é ­èˆ‡ Cookie**FastAPI** äčŸćœš `fastapi.Response` 提䟛äș†ćźƒă€‚ /// diff --git a/docs/zh-hant/docs/advanced/security/oauth2-scopes.md b/docs/zh-hant/docs/advanced/security/oauth2-scopes.md index d0a6ad014..bfd9260e3 100644 --- a/docs/zh-hant/docs/advanced/security/oauth2-scopes.md +++ b/docs/zh-hant/docs/advanced/security/oauth2-scopes.md @@ -1,6 +1,6 @@ # OAuth2 çŻ„ćœïŒˆscopes { #oauth2-scopes } -äœ ćŻä»„ç›ŽæŽ„ćœš FastAPI äž­äœżç”š OAuth2 的 scopesć·Čæ•ŽćˆćŻç„Ąçž«é‹äœœă€‚ +äœ ćŻä»„ç›ŽæŽ„ćœš **FastAPI** äž­äœżç”š OAuth2 的 scopesć·Čæ•ŽćˆćŻç„Ąçž«é‹äœœă€‚ é€™èƒœèź“äœ ćœš OpenAPI æ‡‰ç”šïŒˆä»„ćŠ API 文件䞭䟝照 OAuth2 æš™æș–ïŒŒćŻŠäœœæ›ŽçŽ°çȒćșŠçš„æŹŠé™çł»ç”±ă€‚ @@ -8,7 +8,7 @@ æŻæŹĄäœ ă€Œäœżç”šă€Facebook、Google、GitHub、Microsoft、XTwitterïŒ‰ă€Œç™»ć…„ă€æ™‚ïŒŒé‚Łć€‹æ‡‰ç”šć°±æ˜Żćœšäœżç”šćž¶æœ‰ scopes 的 OAuth2。 -ćœšæœŹçŻ€äž­ïŒŒäœ ć°‡çœ‹ćˆ°ćŠ‚äœ•ćœšäœ çš„ FastAPI æ‡‰ç”šäž­ïŒŒç”šćŒæšŁçš„ćž¶æœ‰ scopes 的 OAuth2 çźĄç†é©—è­‰èˆ‡æŽˆæŹŠă€‚ +ćœšæœŹçŻ€äž­ïŒŒäœ ć°‡çœ‹ćˆ°ćŠ‚äœ•ćœšäœ çš„ **FastAPI** æ‡‰ç”šäž­ïŒŒç”šćŒæšŁçš„ćž¶æœ‰ scopes 的 OAuth2 çźĄç†é©—è­‰èˆ‡æŽˆæŹŠă€‚ /// warning @@ -42,9 +42,9 @@ OAuth2 èŠæ Œć°‡ă€Œscopesă€ćźšçŸ©ç‚ș仄ç©șç™œćˆ†éš”çš„äž€äžČ歗äžČćˆ—èĄšă€‚ ćźƒć€‘é€šćžžç”šäŸ†ćźŁć‘Šç‰čćźšçš„ćź‰ć…šæ€§æŹŠé™ïŒŒäŸ‹ćŠ‚ïŒš -- `users:read` 或 `users:write` æ˜ŻćžžèŠ‹çš„äŸ‹ć­ă€‚ -- `instagram_basic` æ˜Ż Facebook / Instagram äœżç”šçš„ă€‚ -- `https://www.googleapis.com/auth/drive` æ˜Ż Google äœżç”šçš„ă€‚ +* `users:read` 或 `users:write` æ˜ŻćžžèŠ‹çš„äŸ‹ć­ă€‚ +* `instagram_basic` æ˜Ż Facebook / Instagram äœżç”šçš„ă€‚ +* `https://www.googleapis.com/auth/drive` æ˜Ż Google äœżç”šçš„ă€‚ /// note @@ -58,9 +58,9 @@ OAuth2 èŠæ Œć°‡ă€Œscopesă€ćźšçŸ©ç‚ș仄ç©șç™œćˆ†éš”çš„äž€äžČ歗äžČćˆ—èĄšă€‚ /// -## ć…šć±€æŠ‚è§€ { #global-view } +## ć…šćŸŸæŠ‚è§€ { #global-view } -ć…ˆćż«é€Ÿçœ‹çœ‹ç›žć°æ–Œäž»æ•™ć­žă€Œäœżç”šćŻ†çąŒïŒˆèˆ‡é›œæčŠïŒ‰ă€Bearer 與 JWT token 的 OAuth2ă€çš„ć·źç•°ïŒˆ[OAuth2 with Password (and hashing), Bearer with JWT tokens](../../tutorial/security/oauth2-jwt.md)ïŒ‰ă€‚çŸćœšćŠ ć…„äș† OAuth2 scopes +ć…ˆćż«é€Ÿçœ‹çœ‹äž»èŠ **æ•™ć­ž - äœżç”šè€…æŒ‡ć—** äž­ [OAuth2 with Password (and hashing), Bearer with JWT tokens](../../tutorial/security/oauth2-jwt.md) çŻ„äŸ‹çš„èźŠæ›Žéƒšćˆ†ă€‚çŸćœšćŠ ć…„äș† OAuth2 scopes {* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *} @@ -84,7 +84,7 @@ OAuth2 èŠæ Œć°‡ă€Œscopesă€ćźšçŸ©ç‚ș仄ç©șç™œćˆ†éš”çš„äž€äžČ歗äžČćˆ—èĄšă€‚ ## 慧搫 scopes 的 JWT token { #jwt-token-with-scopes } -çŸćœšïŒŒäżźæ”č token çš„è·ŻćŸ‘æ“äœœä»„ć›žć‚łæ‰€è«‹æ±‚çš„ scopes。 +çŸćœšïŒŒäżźæ”č token 的*è·ŻćŸ‘æ“äœœ*ä»„ć›žć‚łæ‰€è«‹æ±‚çš„ scopes。 æˆ‘ć€‘ä»ç„¶äœżç”šç›žćŒçš„ `OAuth2PasswordRequestForm`ă€‚ćźƒćŒ…ć«ć±Źæ€§ `scopes`ïŒŒć…¶ç‚ș `list` 的 `str`ïŒŒćˆ—ć‡șè«‹æ±‚äž­æ”¶ćˆ°çš„æŻć€‹ scope。 @@ -100,9 +100,9 @@ OAuth2 èŠæ Œć°‡ă€Œscopesă€ćźšçŸ©ç‚ș仄ç©șç™œćˆ†éš”çš„äž€äžČ歗äžČćˆ—èĄšă€‚ {* ../../docs_src/security/tutorial005_an_py310.py hl[157] *} -## ćœšè·ŻćŸ‘æ“äœœèˆ‡ç›žäŸæ€§äž­ćźŁć‘Š scopes { #declare-scopes-in-path-operations-and-dependencies } +## 朹*è·ŻćŸ‘æ“äœœ*èˆ‡ç›žäŸæ€§äž­ćźŁć‘Š scopes { #declare-scopes-in-path-operations-and-dependencies } -çŸćœšæˆ‘ć€‘ćźŁć‘Š `/users/me/items/` é€™ć€‹è·ŻćŸ‘æ“äœœéœ€èŠ `items` 這怋 scope。 +çŸćœšæˆ‘ć€‘ćźŁć‘Š `/users/me/items/` 這怋*è·ŻćŸ‘æ“äœœ*需芁 `items` 這怋 scope。 ç‚șæ­€ïŒŒæˆ‘ć€‘ćŸž `fastapi` ćŒŻć…„äžŠäœżç”š `Security`。 @@ -120,7 +120,7 @@ OAuth2 èŠæ Œć°‡ă€Œscopesă€ćźšçŸ©ç‚ș仄ç©șç™œćˆ†éš”çš„äž€äžČ歗äžČćˆ—èĄšă€‚ äœ äžäž€ćźšéœ€èŠćœšäžćŒćœ°æ–č抠侊侍搌的 scopes。 -æˆ‘ć€‘ćœšé€™èŁĄé€™æšŁćšïŒŒæ˜Żç‚șäș†ç€ș範 FastAPI ćŠ‚äœ•è™•ç†ćœšäžćŒć±€çŽšćźŁć‘Šçš„ scopes。 +æˆ‘ć€‘ćœšé€™èŁĄé€™æšŁćšïŒŒæ˜Żç‚șäș†ç€ș範 **FastAPI** ćŠ‚äœ•è™•ç†ćœšäžćŒć±€çŽšćźŁć‘Šçš„ scopes。 /// @@ -130,7 +130,7 @@ OAuth2 èŠæ Œć°‡ă€Œscopesă€ćźšçŸ©ç‚ș仄ç©șç™œćˆ†éš”çš„äž€äžČ歗äžČćˆ—èĄšă€‚ `Security` ć…¶ćŻŠæ˜Ż `Depends` çš„ć­éĄžćˆ„ïŒŒćƒ…ć€šäș†äž€ć€‹æˆ‘ć€‘çšćŸŒæœƒçœ‹ćˆ°çš„ćƒæ•žă€‚ -æ”č甹 `Security` è€Œäžæ˜Ż `Depends`ïŒŒèƒœèź“ FastAPI çŸ„é“ćŻä»„ćźŁć‘Šćź‰ć…šæ€§ scopesă€ćœšć…§éƒšäœżç”šćźƒć€‘ïŒŒäžŠç”š OpenAPI æ–‡ä»¶ćŒ– API。 +æ”č甹 `Security` è€Œäžæ˜Ż `Depends`ïŒŒèƒœèź“ **FastAPI** çŸ„é“ćŻä»„ćźŁć‘Šćź‰ć…šæ€§ scopesă€ćœšć…§éƒšäœżç”šćźƒć€‘ïŒŒäžŠç”š OpenAPI æ–‡ä»¶ćŒ– API。 ćŠć€–ïŒŒç•¶äœ ćŸž `fastapi` ćŒŻć…„ `Query`、`Path`、`Depends`、`Security` ç­‰æ™‚ïŒŒćŻŠéš›äžŠćźƒć€‘æ˜Żć›žć‚łç‰čæźŠéĄžćˆ„çš„ć‡œćŒă€‚ @@ -184,7 +184,7 @@ OAuth2 èŠæ Œć°‡ă€Œscopesă€ćźšçŸ©ç‚ș仄ç©șç™œćˆ†éš”çš„äž€äžČ歗äžČćˆ—èĄšă€‚ ## 驗證 `scopes` { #verify-the-scopes } -æˆ‘ć€‘çŸćœšèŠé©—è­‰ïŒŒæ­€ç›žäŸæ€§èˆ‡æ‰€æœ‰ç›žäŸè€…ïŒˆćŒ…ć«è·ŻćŸ‘æ“äœœïŒ‰æ‰€èŠæ±‚çš„æ‰€æœ‰ scopesïŒŒæ˜ŻćŠéƒœćŒ…ć«ćœšæ”¶ćˆ°çš„ token ć…§æ‰€æäŸ›çš„ scopes äž­ïŒ›ćŠć‰‡ć°±äžŸć‡ș `HTTPException`。 +æˆ‘ć€‘çŸćœšèŠé©—è­‰ïŒŒæ­€ç›žäŸæ€§èˆ‡æ‰€æœ‰ç›žäŸè€…ïŒˆćŒ…ć«*è·ŻćŸ‘æ“äœœ*所芁求的所有 scopesïŒŒæ˜ŻćŠéƒœćŒ…ć«ćœšæ”¶ćˆ°çš„ token ć…§æ‰€æäŸ›çš„ scopes äž­ïŒ›ćŠć‰‡ć°±äžŸć‡ș `HTTPException`。 ç‚șæ­€ïŒŒæˆ‘ć€‘äœżç”š `security_scopes.scopes`ïŒŒć…¶äž­ćŒ…ć«äž€ć€‹ `list`ïŒŒćˆ—ć‡ș所有這äș› `str` ćœąćŒçš„ scopes。 @@ -196,30 +196,30 @@ OAuth2 èŠæ Œć°‡ă€Œscopesă€ćźšçŸ©ç‚ș仄ç©șç™œćˆ†éš”çš„äž€äžČ歗äžČćˆ—èĄšă€‚ 由斌 `get_current_active_user` 盞䟝斌 `get_current_user`ïŒŒć› æ­€ćœš `get_current_active_user` 漣摊的 `"me"` 這怋 scope æœƒćŒ…ć«ćœšć‚łç”Š `get_current_user` 的 `security_scopes.scopes` 的濅須 scopes æž…ć–źäž­ă€‚ -è·ŻćŸ‘æ“äœœæœŹèș«äčŸćźŁć‘Šäș† `"items"` 這怋 scopeïŒŒć› æ­€ćźƒä蟿œƒćŒ…ć«ćœšć‚łç”Š `get_current_user` 的 `security_scopes.scopes` 侭。 +*è·ŻćŸ‘æ“äœœ*æœŹèș«äčŸćźŁć‘Šäș† `"items"` 這怋 scopeïŒŒć› æ­€ćźƒä蟿œƒćŒ…ć«ćœšć‚łç”Š `get_current_user` 的 `security_scopes.scopes` 侭。 ä»„äž‹æ˜Żç›žäŸæ€§èˆ‡ scopes çš„éšŽć±€é—œäż‚ïŒš -- è·ŻćŸ‘æ“äœœ `read_own_items` ć…·æœ‰ïŒš - - 需芁的 scopes `["items"]`䞊有盞䟝性 - - `get_current_active_user` - - ç›žäŸć‡œćŒ `get_current_active_user` ć…·æœ‰ïŒš - - 需芁的 scopes `["me"]`䞊有盞䟝性 - - `get_current_user` - - ç›žäŸć‡œćŒ `get_current_user` ć…·æœ‰ïŒš - - è‡Șèș«æČ’有需芁的 scopes。 - - äž€ć€‹äœżç”š `oauth2_scheme` çš„ç›žäŸæ€§ă€‚ - - äž€ć€‹ćž‹ćˆ„ç‚ș `SecurityScopes` 的 `security_scopes` ćƒæ•žïŒš - - 這怋 `security_scopes` ćƒæ•žæœ‰ć±Źæ€§ `scopes`ïŒŒć…¶ç‚ș侀怋 `list`ïŒŒćŒ…ć«äș†äžŠéąćźŁć‘Šçš„æ‰€æœ‰ scopesïŒŒć› æ­€ïŒš - - ć°æ–Œè·ŻćŸ‘æ“äœœ `read_own_items``security_scopes.scopes` æœƒćŒ…ć« `["me", "items"]`。 - - ć°æ–Œè·ŻćŸ‘æ“äœœ `read_users_me`ïŒŒć› ç‚șćźƒćœšç›žäŸæ€§ `get_current_active_user` äž­èą«ćźŁć‘ŠïŒŒ`security_scopes.scopes` æœƒćŒ…ć« `["me"]`。 - - ć°æ–Œè·ŻćŸ‘æ“äœœ `read_system_status`ïŒŒć› ç‚ș柃æČ’æœ‰ćźŁć‘Šä»»äœ•ćž¶ `scopes` 的 `Security`ïŒŒäž”ć…¶ç›žäŸæ€§ `get_current_user` ä蟿œȘćźŁć‘Šä»»äœ• `scopes`所仄 `security_scopes.scopes` æœƒćŒ…ć« `[]`ç©șïŒ‰ă€‚ +* *è·ŻćŸ‘æ“äœœ* `read_own_items` ć…·æœ‰ïŒš + * 需芁的 scopes `["items"]`䞊有盞䟝性 + * `get_current_active_user` + * ç›žäŸć‡œćŒ `get_current_active_user` ć…·æœ‰ïŒš + * 需芁的 scopes `["me"]`䞊有盞䟝性 + * `get_current_user` + * ç›žäŸć‡œćŒ `get_current_user` ć…·æœ‰ïŒš + * è‡Șèș«æČ’有需芁的 scopes。 + * äž€ć€‹äœżç”š `oauth2_scheme` çš„ç›žäŸæ€§ă€‚ + * äž€ć€‹ćž‹ćˆ„ç‚ș `SecurityScopes` 的 `security_scopes` ćƒæ•žïŒš + * 這怋 `security_scopes` ćƒæ•žæœ‰ć±Źæ€§ `scopes`ïŒŒć…¶ç‚ș侀怋 `list`ïŒŒćŒ…ć«äș†äžŠéąćźŁć‘Šçš„æ‰€æœ‰ scopesïŒŒć› æ­€ïŒš + * ć°æ–Œ*è·ŻćŸ‘æ“äœœ* `read_own_items``security_scopes.scopes` æœƒćŒ…ć« `["me", "items"]`。 + * ć°æ–Œ*è·ŻćŸ‘æ“äœœ* `read_users_me`ïŒŒć› ç‚șćźƒćœšç›žäŸæ€§ `get_current_active_user` äž­èą«ćźŁć‘ŠïŒŒ`security_scopes.scopes` æœƒćŒ…ć« `["me"]`。 + * ć°æ–Œ*è·ŻćŸ‘æ“äœœ* `read_system_status`ïŒŒć› ç‚ș柃æČ’æœ‰ćźŁć‘Šä»»äœ•ćž¶ `scopes` 的 `Security`ïŒŒäž”ć…¶ç›žäŸæ€§ `get_current_user` ä蟿œȘćźŁć‘Šä»»äœ• `scopes`所仄 `security_scopes.scopes` æœƒćŒ…ć« `[]`ç©șïŒ‰ă€‚ /// tip -é€™èŁĄé‡èŠäž”ă€Œç„žć„‡ă€çš„æ˜ŻïŒš`get_current_user` ćœšæŻć€‹è·ŻćŸ‘æ“äœœäž­ïŒŒæœƒæœ‰äžćŒçš„ `scopes` æž…ć–źéœ€èŠæȘ࿟„。 +é€™èŁĄé‡èŠäž”ă€Œç„žć„‡ă€çš„æ˜ŻïŒš`get_current_user` ćœšæŻć€‹*è·ŻćŸ‘æ“äœœ*äž­ïŒŒæœƒæœ‰äžćŒçš„ `scopes` æž…ć–źéœ€èŠæȘ࿟„。 -這漌慹揖æ±șæ–Œè©Čè·ŻćŸ‘æ“äœœèˆ‡ć…¶ç›žäŸæ€§æščäž­æŻć€‹ç›žäŸæ€§æ‰€ćźŁć‘Šçš„ `scopes`。 +這漌慹揖æ±șæ–Œè©Čç‰č漚*è·ŻćŸ‘æ“äœœ*èˆ‡ć…¶ç›žäŸæ€§æščäž­æŻć€‹ç›žäŸæ€§æ‰€ćźŁć‘Šçš„ `scopes`。 /// @@ -227,11 +227,11 @@ OAuth2 èŠæ Œć°‡ă€Œscopesă€ćźšçŸ©ç‚ș仄ç©șç™œćˆ†éš”çš„äž€äžČ歗äžČćˆ—èĄšă€‚ äœ ćŻä»„ćœšä»»æ„äœçœźă€ć€šć€‹ćœ°æ–čäœżç”š `SecurityScopes`ïŒŒćźƒäžéœ€èŠäœæ–Œă€Œæ čă€ç›žäŸæ€§ă€‚ -ćźƒæœƒæ°žé ćž¶æœ‰ć°æ–Œă€Œè©Čç‰čćźšă€è·ŻćŸ‘æ“äœœèˆ‡ă€Œè©Čç‰čćźšă€ç›žäŸæ€§æščäž­ïŒŒç›źć‰ `Security` ç›žäŸæ€§æ‰€ćźŁć‘Šçš„ćź‰ć…šæ€§ scopesïŒˆä»„ćŠæ‰€æœ‰ç›žäŸè€…ïŒ‰ïŒš +ćźƒæœƒæ°žé ćž¶æœ‰ć°æ–Œ**è©Čç‰č漚***è·ŻćŸ‘æ“äœœ*與**è©Čç‰č漚**盞䟝性æščäž­ïŒŒç›źć‰ `Security` ç›žäŸæ€§æ‰€ćźŁć‘Šçš„ćź‰ć…šæ€§ scopesïŒˆä»„ćŠæ‰€æœ‰ç›žäŸè€…ïŒ‰ă€‚ -曠ç‚ș `SecurityScopes` æœƒæ“æœ‰ç”±ç›žäŸè€…ćźŁć‘Šçš„æ‰€æœ‰ scopesïŒŒäœ ćŻä»„ćœšäž€ć€‹é›†äž­ćŒç›žäŸć‡œćŒäž­ç”šćźƒäŸ†é©—è­‰ token æ˜ŻćŠć…·æœ‰æ‰€éœ€ scopesïŒŒç„¶ćŸŒćœšäžćŒè·ŻćŸ‘æ“äœœäž­ćźŁć‘ŠäžćŒçš„ scope èŠæ±‚ă€‚ +曠ç‚ș `SecurityScopes` æœƒæ“æœ‰ç”±ç›žäŸè€…ćźŁć‘Šçš„æ‰€æœ‰ scopesïŒŒäœ ćŻä»„ćœšäž€ć€‹é›†äž­ćŒç›žäŸć‡œćŒäž­ç”šćźƒäŸ†é©—è­‰ token æ˜ŻćŠć…·æœ‰æ‰€éœ€ scopesïŒŒç„¶ćŸŒćœšäžćŒ*è·ŻćŸ‘æ“äœœ*侭漣摊侍搌的 scope èŠæ±‚ă€‚ -ćźƒć€‘æœƒćœšæŻć€‹è·ŻćŸ‘æ“äœœèą«ć„è‡Ș獚立æȘ࿟„。 +ćźƒć€‘æœƒćœšæŻć€‹*è·ŻćŸ‘æ“äœœ*èą«ć„è‡Ș獚立æȘ࿟„。 ## 詊甚看看 { #check-it } @@ -241,9 +241,9 @@ OAuth2 èŠæ Œć°‡ă€Œscopesă€ćźšçŸ©ç‚ș仄ç©șç™œćˆ†éš”çš„äž€äžČ歗äžČćˆ—èĄšă€‚ ćŠ‚æžœäœ æČ’有遞任䜕 scopeïŒŒäœ ä»æœƒă€Œé€šéŽé©—è­‰ă€ïŒŒäœ†ç•¶äœ ć˜—è©Šć­˜ć– `/users/me/` 或 `/users/me/items/` æ™‚ïŒŒæœƒæ”¶ćˆ°æČ’æœ‰è¶łć€ æŹŠé™çš„éŒŻèȘ€ă€‚äœ ä»èƒœć­˜ć– `/status/`。 -苄䜠ćȘ遞äș† `me` 而æœȘ遞 `items`ïŒŒäœ èƒœć­˜ć– `/users/me/`ïŒŒäœ†ç„Ąæł•ć­˜ć– `/users/me/items/`。 +苄䜠ćȘ遞äș† `me` 這怋 scope 而æœȘ遞 `items` 這怋 scopeïŒŒäœ èƒœć­˜ć– `/users/me/`ïŒŒäœ†ç„Ąæł•ć­˜ć– `/users/me/items/`。 -é€™ć°±æ˜ŻçŹŹäž‰æ–过‰ç”šćœšć–ćŸ—äœżç”šè€…æäŸ›çš„ token ćŸŒïŒŒć˜—è©Šć­˜ć–äžŠèż°è·ŻćŸ‘æ“äœœæ™‚ïŒŒæœƒäŸäœżç”šè€…æŽˆèˆ‡è©Čæ‡‰ç”šçš„æŹŠé™ć€šćŻĄè€Œæœ‰äžćŒç”æžœă€‚ +é€™ć°±æ˜ŻçŹŹäž‰æ–过‰ç”šćœšć–ćŸ—äœżç”šè€…æäŸ›çš„ token ćŸŒïŒŒć˜—è©Šć­˜ć–äžŠèż°ć…¶äž­äž€ć€‹*è·ŻćŸ‘æ“äœœ*æ™‚ïŒŒæœƒäŸäœżç”šè€…æŽˆèˆ‡è©Čæ‡‰ç”šçš„æŹŠé™ć€šćŻĄè€Œæœ‰äžćŒç”æžœă€‚ ## é—œæ–ŒçŹŹäž‰æ–čæ•Žćˆ { #about-third-party-integrations } @@ -255,9 +255,9 @@ OAuth2 èŠæ Œć°‡ă€Œscopesă€ćźšçŸ©ç‚ș仄ç©șç™œćˆ†éš”çš„äž€äžČ歗äžČćˆ—èĄšă€‚ äœ†ćŠ‚æžœäœ èŠæ‰“é€ äž€ć€‹èź“ä»–äșșé€ŁæŽ„çš„ OAuth2 應甚äčŸć°±æ˜Żäœ èЁć»șç«‹äž€ć€‹ç›žç•¶æ–Œ Facebook、Google、GitHub 等的èș«ćˆ†é©—證提䟛者䜠應è©Čäœżç”šć…¶ä»–æ”çš‹äč‹äž€ă€‚ -æœ€ćžžèŠ‹çš„æ˜Ż Implicit FlowïŒˆéš±ćŒæ”çš‹ïŒ‰ă€‚ +æœ€ćžžèŠ‹çš„æ˜Ż implicit flowïŒˆéš±ćŒæ”çš‹ïŒ‰ă€‚ -æœ€ćź‰ć…šçš„æ˜Ż Authorization Code FlowïŒˆæŽˆæŹŠçąŒæ”çš‹ïŒ‰ïŒŒäœ†ćźƒéœ€èŠæ›Žć€šæ­„é©Ÿă€ćŻŠäœœä蟿›Žè€‡é›œă€‚ć› ç‚șèŒƒè€‡é›œïŒŒèš±ć€šæäŸ›è€…æœ€ćŸŒæœƒć»șè­°äœżç”šéš±ćŒæ”çš‹ă€‚ +æœ€ćź‰ć…šçš„æ˜Ż code flowïŒˆæŽˆæŹŠçąŒæ”çš‹ïŒ‰ïŒŒäœ†ćźƒéœ€èŠæ›Žć€šæ­„é©Ÿă€ćŻŠäœœä蟿›Žè€‡é›œă€‚ć› ç‚șèŒƒè€‡é›œïŒŒèš±ć€šæäŸ›è€…æœ€ćŸŒæœƒć»șè­°äœżç”šéš±ćŒæ”çš‹ă€‚ /// note @@ -267,7 +267,7 @@ OAuth2 èŠæ Œć°‡ă€Œscopesă€ćźšçŸ©ç‚ș仄ç©șç™œćˆ†éš”çš„äž€äžČ歗äžČćˆ—èĄšă€‚ /// -FastAPI 朹 `fastapi.security.oauth2` 䞭提䟛äș†æ‰€æœ‰é€™äș› OAuth2 é©—è­‰æ”çš‹çš„ć·„ć…·ă€‚ +**FastAPI** 朹 `fastapi.security.oauth2` 䞭提䟛äș†æ‰€æœ‰é€™äș› OAuth2 é©—è­‰æ”çš‹çš„ć·„ć…·ă€‚ ## ćœšèŁéŁŸć™š `dependencies` äž­äœżç”š `Security` { #security-in-decorator-dependencies } diff --git a/docs/zh-hant/docs/advanced/settings.md b/docs/zh-hant/docs/advanced/settings.md index 9892f8f00..4ec1ea672 100644 --- a/docs/zh-hant/docs/advanced/settings.md +++ b/docs/zh-hant/docs/advanced/settings.md @@ -297,6 +297,6 @@ participant execute as Execute function äœ ćŻä»„äœżç”š Pydantic Settings äŸ†è™•ç†æ‡‰ç”šçš‹ćŒçš„èš­ćźšæˆ–ç”„æ…‹ïŒŒäžŠäș«æœ‰ Pydantic model çš„ć…šéƒšèƒœćŠ›ă€‚ -- é€éŽç›žäŸćŻä»„èź“æžŹè©Šæ›Žćźčæ˜“ă€‚ -- äœ ćŻä»„æ­é… `.env` æȘ”äœżç”šă€‚ -- äœżç”š `@lru_cache` ćŻä»„éżć…æŻć€‹è«‹æ±‚éƒœé‡è€‡èź€ć– dotenv æȘ”ïŒŒćŒæ™‚ä»ćŻćœšæžŹè©Šæ™‚èŠ†ćŻ«èš­ćźšă€‚ +* é€éŽç›žäŸćŻä»„èź“æžŹè©Šæ›Žćźčæ˜“ă€‚ +* äœ ćŻä»„æ­é… `.env` æȘ”äœżç”šă€‚ +* äœżç”š `@lru_cache` ćŻä»„éżć…æŻć€‹è«‹æ±‚éƒœé‡è€‡èź€ć– dotenv æȘ”ïŒŒćŒæ™‚ä»ćŻćœšæžŹè©Šæ™‚èŠ†ćŻ«èš­ćźšă€‚ diff --git a/docs/zh-hant/docs/advanced/stream-data.md b/docs/zh-hant/docs/advanced/stream-data.md index d28cd35ec..c38c48faf 100644 --- a/docs/zh-hant/docs/advanced/stream-data.md +++ b/docs/zh-hant/docs/advanced/stream-data.md @@ -2,7 +2,7 @@ ćŠ‚æžœäœ èŠäžČæ”ćŻç”š JSON ç”æ§‹ćŒ–çš„èł‡æ–™ïŒŒæ‡‰è©Č[äžČ攁 JSON Lines](../tutorial/stream-json-lines.md)。 -äœ†ćŠ‚æžœäœ æƒłäžČ攁玔äșŒé€Čäœèł‡æ–™æˆ–ć­—äžČïŒŒä»„äž‹æ˜Żćšæł•ă€‚ +äœ†ćŠ‚æžœäœ æƒł**äžČ攁玔äșŒé€Čäœèł‡æ–™**æˆ–ć­—äžČïŒŒä»„äž‹æ˜Żćšæł•ă€‚ /// note @@ -12,11 +12,11 @@ ## äœżç”šæƒ…ćąƒ { #use-cases } -ç•¶äœ æƒłäžČæ”çŽ”ć­—äžČæ™‚ćŻä»„ç”šé€™ć€‹æ©Ÿćˆ¶ïŒŒäŸ‹ćŠ‚ç›ŽæŽ„èœ‰ç™ŒäŸ†è‡Ș AI LLM æœć‹™çš„èŒžć‡ș。 +ç•¶äœ æƒłäžČæ”çŽ”ć­—äžČæ™‚ćŻä»„ç”šé€™ć€‹æ©Ÿćˆ¶ïŒŒäŸ‹ćŠ‚ç›ŽæŽ„èœ‰ç™ŒäŸ†è‡Ș **AI LLM** æœć‹™çš„èŒžć‡ș。 -䜠äčŸćŻä»„ç”šćźƒäŸ†äžČæ”ć€§ćž‹äșŒé€Č䜍æȘ”æĄˆïŒŒé‚Šèź€é‚Šć°‡æŻć€‹ć€ćĄŠïŒˆchunkäžČ攁ć‡șćŽ»ïŒŒè€Œäžćż…äž€æŹĄæŠŠæ•Žć€‹æȘ”æĄˆèŒ‰ć…„èš˜æ†¶é«”ă€‚ +䜠äčŸćŻä»„ç”šćźƒäŸ†äžČ攁**性枋äșŒé€Č䜍æȘ”æĄˆ**ïŒŒé‚Šèź€é‚Šć°‡æŻć€‹ć€ćĄŠïŒˆchunkäžČ攁ć‡șćŽ»ïŒŒè€Œäžćż…äž€æŹĄæŠŠæ•Žć€‹æȘ”æĄˆèŒ‰ć…„èš˜æ†¶é«”ă€‚ -䜠äčŸćŻä»„ç”šćŒæšŁæ–čćŒäžČæ”èŠ–èšŠæˆ–éŸłèšŠïŒŒç”šè‡łćŻä»„ćœšè™•ç†çš„ćŒæ™‚ćłæ™‚ç”ąç”ŸäžŠć‚łé€ă€‚ +䜠äčŸćŻä»„ç”šćŒæšŁæ–čćŒäžČ攁**芖蚊**或**éŸłèšŠ**ïŒŒç”šè‡łćŻä»„ćœšè™•ç†çš„ćŒæ™‚ćłæ™‚ç”ąç”ŸäžŠć‚łé€ă€‚ ## äœżç”š `yield` 的 `StreamingResponse` { #a-streamingresponse-with-yield } @@ -40,7 +40,7 @@ FastAPI æœƒćŠ‚ćŻŠć°‡æŻć€‹èł‡æ–™ć€ćĄŠäș€ç”Š `StreamingResponse`ïŒŒäžæœƒć˜—è©Š {* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} -這ä蟿„ć‘łè‘—äœżç”š `StreamingResponse` 時䜠擁有è‡Ș由與èČŹä»»ïŒŒéœ€äŸéœ€æ±‚è‡ȘèĄŒç”ąç”ŸäžŠç·šçąŒèŠć‚łé€çš„äœć…ƒç”„èł‡æ–™ïŒŒèˆ‡ćž‹ćˆ„èš»è§Łç„Ąé—œă€‚ đŸ€“ +這ä蟿„ć‘łè‘—äœżç”š `StreamingResponse` 時䜠擁有**è‡Ș由**與**èČŹä»»**需䟝需求è‡ȘèĄŒç”ąç”ŸäžŠç·šçąŒèŠć‚łé€çš„äœć…ƒç”„èł‡æ–™ïŒŒèˆ‡ćž‹ćˆ„èš»è§Łç„Ąé—œă€‚ đŸ€“ ### äžČæ”äœć…ƒç”„ { #stream-bytes } diff --git a/docs/zh-hant/docs/advanced/wsgi.md b/docs/zh-hant/docs/advanced/wsgi.md index 944720bb6..161496a98 100644 --- a/docs/zh-hant/docs/advanced/wsgi.md +++ b/docs/zh-hant/docs/advanced/wsgi.md @@ -1,5 +1,6 @@ # ćŒ…ć« WSGIFlask、Django 等 { #including-wsgi-flask-django-others } + äœ ćŻä»„ćƒćœš [ć­æ‡‰ç”šçš‹ćŒ - 掛茉](sub-applications.md)、[朹 Proxy ćŸŒæ–č](behind-a-proxy.md) äž­æ‰€èŠ‹é‚ŁæšŁæŽ›èŒ‰ WSGI æ‡‰ç”šă€‚ ç‚șæ­€ïŒŒäœ ćŻä»„äœżç”š `WSGIMiddleware` äŸ†ćŒ…äœäœ çš„ WSGI æ‡‰ç”šïŒŒäŸ‹ćŠ‚ Flask、Django 等。 diff --git a/docs/zh-hant/docs/alternatives.md b/docs/zh-hant/docs/alternatives.md index fc3f7b38e..d9573892e 100644 --- a/docs/zh-hant/docs/alternatives.md +++ b/docs/zh-hant/docs/alternatives.md @@ -80,7 +80,7 @@ Requests èš­èšˆéžćžžç°Ąć–źç›Žè§€ă€ćźčæ˜“äœżç”šïŒŒäž”æœ‰ćˆç†çš„é èš­ć€Œă€‚ ć› æ­€ïŒŒćŠ‚ć…¶ćź˜ç¶Č所蚀 -> Requests is one of the most downloaded Python packages of all time +> Requests æ˜Żæœ‰ćČä»„äŸ†äž‹èŒ‰æŹĄæ•žæœ€ć€šçš„ Python ć„—ä»¶äč‹äž€ ç”šæł•éžćžžç°Ąć–źă€‚äŸ‹ćŠ‚ïŒŒç™Œć‡ș侀怋 `GET` è«‹æ±‚ïŒŒäœ æœƒćŻ«ïŒš @@ -213,7 +213,7 @@ APISpec 由與 Marshmallow ç›žćŒçš„é–‹ç™Œè€…ć‰”ć»ș。 ćźƒæ˜Żć€‹ćŸˆæŁ’äœ†èą«äœŽäŒ°çš„ć·„ć…·ă€‚ćźƒç†æ‡‰æŻ”èš±ć€š Flask ć€–æŽ›æ›Žć—æ­ĄèżŽïŒŒćŻèƒœć› ç‚șćźƒçš„æ–‡ä»¶éŽæ–Œç°Ąæœ”èˆ‡æŠœè±Ąă€‚ -é€™è§Łæ±șäș†ćœš Python æ–‡ä»¶ć­—äžČäž­æ’°ćŻ« YAMLïŒˆćŠäž€çšźèȘžæł•ïŒ‰çš„é—źéą˜ă€‚ +é€™è§Łæ±șäș†ćœš Python æ–‡ä»¶ć­—äžČäž­æ’°ćŻ« YAMLïŒˆćŠäž€çšźèȘžæł•ïŒ‰çš„ć•éĄŒă€‚ ćœšæ‰“é€  **FastAPI** ć‰ïŒŒæˆ‘æœ€ć–œæ­Ąçš„ćŸŒç«ŻæŠ€èĄ“ç”„ćˆć°±æ˜Ż Flask、Flask-apispec、Marshmallow 與 Webargs。 diff --git a/docs/zh-hant/docs/async.md b/docs/zh-hant/docs/async.md index 74eb8081d..cad99a5a6 100644 --- a/docs/zh-hant/docs/async.md +++ b/docs/zh-hant/docs/async.md @@ -2,7 +2,7 @@ 有關*è·ŻćŸ‘æ“äœœć‡œćŒ*的 `async def` èȘžæł•çš„çŽ°çŻ€èˆ‡éžćŒæ­„ (asynchronous) çš‹ćŒçąŒă€äžŠèĄŒ (concurrency) 與ćčłèĄŒ (parallelism) 的侀äș›èƒŒæ™ŻçŸ„è­˜ă€‚ -## è¶•æ™‚é–“ć—Ž? { #in-a-hurry } +## è¶•æ™‚é–“ć—Ž { #in-a-hurry } TL;DR: @@ -14,7 +14,6 @@ results = await some_library() ç„¶ćŸŒïŒŒäœżç”š `async def` ćźŁć‘Šäœ çš„*è·ŻćŸ‘æ“äœœć‡œćŒ* - ```Python hl_lines="2" @app.get('/') async def read_results(): @@ -49,7 +48,7 @@ def results(): --- -**æłšæ„**ïŒšäœ ćŻä»„ćœš*è·ŻćŸ‘æ“äœœć‡œćŒ*äž­æ··ćˆäœżç”š `def` 撌 `async def` ïŒŒäžŠäœżç”šæœ€é©ćˆäœ éœ€æ±‚çš„æ–čćŒäŸ†ćźšçŸ©æŻć€‹ć‡œćŒă€‚FastAPI 會ćč«äœ ćšæ­Łçąșçš„è™•ç†ă€‚ +**æłšæ„**ïŒšäœ ćŻä»„ćœš*è·ŻćŸ‘æ“äœœć‡œćŒ*äž­æ··ćˆäœżç”š `def` 撌 `async def`ïŒŒäžŠäœżç”šæœ€é©ćˆäœ éœ€æ±‚çš„æ–čćŒäŸ†ćźšçŸ©æŻć€‹ć‡œćŒă€‚FastAPI 會ćč«äœ ćšæ­Łçąșçš„è™•ç†ă€‚ ç„Ąè«–ćŠ‚äœ•ïŒŒćœšäžŠèż°ć“Șçšźæƒ…æłäž‹ïŒŒFastAPI ä»ć°‡ä»„éžćŒæ­„æ–čćŒé‹èĄŒïŒŒäžŠäž”é€ŸćșŠéžćžžćż«ă€‚ @@ -57,7 +56,7 @@ def results(): ## æŠ€èĄ“çŽ°çŻ€ { #technical-details } -çŸä»Łç‰ˆæœŹçš„ Python æ”ŻæŽäœżç”š **「捔繋」** 的 **`async` 撌 `await`** èȘžæł•äŸ†ćŻ« **ă€ŒéžćŒæ­„çš‹ćŒçąŒă€**。 +çŸä»Łç‰ˆæœŹçš„ Python æ”ŻæŽäœżç”šçš±ç‚ș **「捔繋」** çš„æ±è„żïŒŒé€éŽ **`async` 撌 `await`** èȘžæł•äŸ†ćŻ« **ă€ŒéžćŒæ­„çš‹ćŒçąŒă€**。 æŽ„äž‹äŸ†æˆ‘ć€‘é€äž€ä»‹çŽč @@ -67,39 +66,40 @@ def results(): ## éžćŒæ­„çš‹ćŒçąŒ { #asynchronous-code } -éžćŒæ­„çš‹ćŒçąŒćƒ…æ„ć‘łè‘—çš‹ćŒèȘžèš€ 💬 æœ‰èŸŠæł•ć‘ŠèšŽé›»è…Š/çš‹ćŒ đŸ€– ćœšçš‹ćŒçąŒäž­çš„æŸć€‹é»žïŒŒćźƒ đŸ€– éœ€èŠç­‰ćŸ…æŸäș›äș‹æƒ…ćꌿˆă€‚è꓿ˆ‘ć€‘ć‡èš­é€™äș›äș‹æƒ…èą«çš±ç‚șă€Œæ…ąé€ŸæȘ”æĄˆă€đŸ“ă€‚ +éžćŒæ­„çš‹ćŒçąŒćƒ…æ„ć‘łè‘—çš‹ćŒèȘžèš€ 💬 æœ‰èŸŠæł•ć‘ŠèšŽé›»è…Š / çš‹ćŒ đŸ€– ćœšçš‹ćŒçąŒäž­çš„æŸć€‹é»žïŒŒćźƒ đŸ€– éœ€èŠç­‰ćŸ…ć…¶ä»–ćœ°æ–č的*某äș›äș‹æƒ…*ćźŒæˆă€‚èź“æˆ‘ć€‘ć‡èš­é€™ć€‹*某äș›äș‹æƒ…*èą«çš±ç‚șă€Œæ…ąé€ŸæȘ”æĄˆă€đŸ“ă€‚ + +ć› æ­€ïŒŒćœšă€Œæ…ąé€ŸæȘ”æĄˆă€đŸ“ ćźŒæˆçš„é€™æź”æ™‚é–“ïŒŒé›»è…ŠćŻä»„ćŽ»è™•ç†äž€äș›ć…¶ä»–ć·„äœœă€‚ -ć› æ­€ïŒŒćœšç­‰ćŸ…ă€Œæ…ąé€ŸæȘ”æĄˆă€đŸ“ ćźŒæˆçš„é€™æź”æ™‚é–“ïŒŒé›»è…ŠćŻä»„ćŽ»è™•ç†äž€äș›ć…¶ä»–ć·„äœœă€‚ +掄著電腊 / çš‹ćŒ đŸ€– æœƒćœšæŻæŹĄæœ‰æ©Ÿæœƒæ™‚ć›žäŸ†ïŒŒć› ç‚șćźƒćˆćœšç­‰ćŸ…ïŒŒæˆ–æ˜Żćœšćźƒ đŸ€– ćźŒæˆç•¶æ™‚æ‰‹äžŠçš„æ‰€æœ‰ć·„äœœæ™‚ć›žäŸ†ă€‚ç„¶ćŸŒćźƒ đŸ€– æœƒæŸ„çœ‹æ˜ŻćŠæœ‰ä»»äœ•ç­‰ćŸ…äž­çš„ä»»ć‹™ć·Čç¶“ćźŒæˆïŒŒäžŠćŸ·èĄŒćż…èŠçš„ćŸŒçșŒæ“äœœă€‚ -æŽ„è‘—çš‹ćŒ đŸ€– æœƒćœšæœ‰ç©șæȘ”æ™‚ć›žäŸ†æŸ„çœ‹æ˜ŻćŠæœ‰ç­‰ćŸ…çš„ć·„äœœć·Čç¶“ćźŒæˆïŒŒäžŠćŸ·èĄŒćż…èŠçš„ćŸŒçșŒæ“äœœă€‚ +æŽ„äž‹äŸ†ïŒŒćźƒ đŸ€– ć–ćŸ—çŹŹäž€ć€‹ćźŒæˆçš„ä»»ć‹™ïŒˆäŸ‹ćŠ‚æˆ‘ć€‘çš„ă€Œæ…ąé€ŸæȘ”æĄˆă€đŸ“ïŒ‰ïŒŒäžŠçčŒçșŒćŸ·èĄŒèˆ‡äč‹ç›žé—œçš„æ‰€æœ‰æ“äœœă€‚ -æŽ„äž‹äŸ†ïŒŒćźƒ đŸ€– ćźŒæˆçŹŹäž€ć€‹ć·„äœœïŒˆäŸ‹ćŠ‚æˆ‘ć€‘çš„ă€Œæ…ąé€ŸæȘ”æĄˆă€đŸ“ïŒ‰äžŠçčŒçșŒćŸ·èĄŒç›žé—œçš„æ‰€æœ‰æ“äœœă€‚ -é€™ć€‹ă€Œç­‰ćŸ…ć…¶ä»–äș‹æƒ…ă€é€šćžžæŒ‡çš„æ˜Żäž€äș›ç›žć°èŒƒæ…ąçš„ïŒˆèˆ‡è™•ç†ć™šć’Œ RAM 蚘憶體的速ćșŠç›žæŻ”的 I/O æ“äœœïŒŒæŻ”ćŠ‚èȘȘ +é€™ć€‹ă€Œç­‰ćŸ…ć…¶ä»–äș‹æƒ…ă€é€šćžžæŒ‡çš„æ˜Żäž€äș›ç›žć°èŒƒæ…ąçš„ïŒˆèˆ‡è™•ç†ć™šć’Œ RAM 蚘憶體的速ćșŠç›žæŻ”的 I/O æ“äœœïŒŒæŻ”ćŠ‚èȘȘç­‰ćŸ…ïŒš * 透過ç¶Čè·Żć‚łé€äŸ†è‡Șç”šæˆ¶ç«Żçš„èł‡æ–™ -* ćŸžç¶Čè·ŻæŽ„æ”¶äŸ†è‡Șç”šæˆ¶ç«Żçš„èł‡æ–™ -* ćŸžçŁçąŸèź€ć–æȘ”æĄˆć…§ćźč -* 氇慧ćźčćŻ«ć…„çŁçąŸ +* äœ çš„çš‹ćŒć‚łé€çš„èł‡æ–™é€éŽç¶Čè·Żèą«ç”šæˆ¶ç«ŻæŽ„æ”¶ +* çł»ç”±ćŸžçŁçąŸèź€ć–æȘ”æĄˆć…§ćźčäžŠæäŸ›ç”Šäœ çš„çš‹ćŒ +* äœ çš„çš‹ćŒäș€ç”Šçł»ç”±çš„ć…§ćźčèą«ćŻ«ć…„çŁçąŸ * 遠端 API 操䜜 -* èł‡æ–™ćș«æ“äœœ -* èł‡æ–™ćș«æŸ„è©ą +* èł‡æ–™ćș«æ“äœœćꌿˆ +* èł‡æ–™ćș«æŸ„è©ąć›žć‚łç”æžœ * 等等 -ç”±æ–Œć€§éƒšćˆ†çš„ćŸ·èĄŒæ™‚é–“éƒœæ¶ˆè€—ćœšç­‰ćŸ… I/O æ“äœœäžŠïŒŒć› æ­€é€™äș›æ“äœœèą«çš±ç‚ș "I/O 毆集枋" æ“äœœă€‚ +ç”±æ–Œć€§éƒšćˆ†çš„ćŸ·èĄŒæ™‚é–“éƒœæ¶ˆè€—ćœšç­‰ćŸ… I/O æ“äœœäžŠïŒŒć› æ­€é€™äș›æ“äœœèą«çš±ç‚ș "I/O bound" æ“äœœă€‚ -ä苿‰€ä»„çš±ç‚șă€ŒéžćŒæ­„ă€ïŒŒæ˜Żć› ç‚ș電腊/çš‹ćŒäžéœ€èŠèˆ‡é‚Łäș›è€—æ™‚çš„ä»»ć‹™ă€ŒćŒæ­„ă€ïŒŒç­‰ćŸ…ä»»ć‹™ćźŒæˆçš„çČŸçąșæ™‚é–“ïŒŒç„¶ćŸŒæ‰èƒœć–ćŸ—ç”æžœäžŠçčŒçșŒć·„äœœă€‚ +ä苿‰€ä»„çš±ç‚șă€ŒéžćŒæ­„ă€ïŒŒæ˜Żć› ç‚ș電腊 / çš‹ćŒäžéœ€èŠèˆ‡é‚Łäș›è€—æ™‚çš„ä»»ć‹™ă€ŒćŒæ­„ă€ïŒŒćœšä»€éșŒéƒœäžćšçš„æƒ…æłäž‹ç­‰ćŸ…ä»»ć‹™ćꌿˆçš„çČŸçąșæ™‚é–“ïŒŒæ‰èƒœć–ćŸ—ä»»ć‹™ç”æžœäžŠçčŒçșŒć·„äœœă€‚ -ç›žććœ°ïŒŒéžćŒæ­„çł»ç”±ćœšä»»ć‹™ćźŒæˆćŸŒïŒŒćŻä»„èź“ä»»ć‹™çšćŸźç­‰äž€äž‹ïŒˆćčŸćŸźç§’ïŒ‰ïŒŒç­‰ćŸ…é›»è…Š/çš‹ćŒćźŒæˆæ‰‹é ­äžŠçš„ć…¶ä»–ć·„äœœïŒŒç„¶ćŸŒć†ć›žäŸ†ć–ćŸ—ç”æžœçčŒçșŒé€ČèĄŒă€‚ +ç›žććœ°ïŒŒäœœç‚șäž€ć€‹ă€ŒéžćŒæ­„ă€çł»ç”±ïŒŒä»»ć‹™ćźŒæˆćŸŒïŒŒćŻä»„èź“ä»»ć‹™çšćŸźæŽ’éšŠç­‰äž€äž‹ïŒˆćčŸćŸźç§’ïŒ‰ïŒŒç­‰ćŸ…é›»è…Š / çš‹ćŒćźŒæˆæ‰‹é ­äžŠçš„ć…¶ä»–ć·„äœœïŒŒç„¶ćŸŒć†ć›žäŸ†ć–ćŸ—ç”æžœçčŒçșŒé€ČèĄŒă€‚ -ç›žć°æ–Œă€ŒéžćŒæ­„ă€ïŒˆasynchronousïŒ‰ïŒŒă€ŒćŒæ­„ă€ïŒˆsynchronousäčŸćžžèą«çš±äœœă€Œé †ćșæ€§ă€ïŒˆsequentialïŒ‰ïŒŒć› ç‚ș電腊/çš‹ćŒæœƒäŸćșćŸ·èĄŒæ‰€æœ‰æ­„é©ŸïŒŒćłäŸżé€™äș›æ­„é©Ÿæ¶‰ćŠç­‰ćŸ…ïŒŒæ‰æœƒćˆ‡æ›ćˆ°ć…¶ä»–ä»»ć‹™ă€‚ +ç›žć°æ–Œă€ŒéžćŒæ­„ă€ïŒˆasynchronousïŒ‰ïŒŒă€ŒćŒæ­„ă€ïŒˆsynchronousäčŸćžžèą«çš±äœœă€Œé †ćșæ€§ă€ïŒˆsequentialïŒ‰ïŒŒć› ç‚ș電腊 / çš‹ćŒæœƒäŸćșćŸ·èĄŒæ‰€æœ‰æ­„é©ŸïŒŒćłäŸżé€™äș›æ­„é©Ÿæ¶‰ćŠç­‰ćŸ…ïŒŒæ‰æœƒćˆ‡æ›ćˆ°ć…¶ä»–ä»»ć‹™ă€‚ ### äžŠèĄŒèˆ‡æŒąć Ą { #concurrency-and-burgers } -äžŠèż°éžćŒæ­„çš‹ćŒçąŒçš„æŠ‚ćż”æœ‰æ™‚äčŸèą«çš±ç‚șă€ŒäžŠèĄŒă€ïŒŒćźƒäžćŒæ–Œă€ŒćčłèĄŒă€ă€‚ +äžŠèż°**éžćŒæ­„**çš‹ćŒçąŒçš„æŠ‚ćż”æœ‰æ™‚äčŸèą«çš±ç‚ș**ă€ŒäžŠèĄŒă€**ïŒŒćźƒäžćŒæ–Œ**「ćčłèĄŒă€**。 -äžŠèĄŒć’ŒćčłèĄŒéƒœèˆ‡ "侍搌的äș‹æƒ…æˆ–ć€šæˆ–ć°‘ćŒæ™‚ç™Œç”Ÿ" æœ‰é—œă€‚ +**äžŠèĄŒ**撌ćčłèĄŒéƒœèˆ‡ "侍搌的äș‹æƒ…æˆ–ć€šæˆ–ć°‘ćŒæ™‚ç™Œç”Ÿ" æœ‰é—œă€‚ -äœ†äžŠèĄŒć’ŒćčłèĄŒäč‹é–“çš„çŽ°çŻ€æ˜ŻćźŒć…šäžćŒçš„ă€‚ +䜆*äžŠèĄŒ*撌ćčłèĄŒäč‹é–“çš„çŽ°çŻ€æ˜ŻćźŒć…šäžćŒçš„ă€‚ ç‚șäș†ç†è§Łć·źç•°ïŒŒè«‹æƒłćƒä»„äž‹æœ‰é—œæŒąć Ąçš„æ•…äș‹ïŒš @@ -113,7 +113,7 @@ def results(): -æ”¶éŠ€ć“Ąé€šçŸ„ć»šæˆżæș–ć‚™äœ çš„æŒąć ĄïŒˆć„˜çźĄä»–ć€‘é‚„ćœšç‚șć‰éąć…¶ä»–éĄ§ćźąæș–ć‚™éŁŸç‰©ïŒ‰ă€‚ +æ”¶éŠ€ć“Ąé€šçŸ„ć»šæˆżçš„ć»šćž«ïŒŒèź“ä»–ć€‘çŸ„é“éœ€èŠæș–ć‚™äœ çš„æŒąć ĄïŒˆć„˜çźĄä»–ć€‘é‚„ćœšç‚șć‰éąć…¶ä»–éĄ§ćźąæș–ć‚™éŁŸç‰©ïŒ‰ă€‚ @@ -125,7 +125,7 @@ def results(): ćœšç­‰ćŸ…æŒąć Ąçš„ćŒæ™‚ïŒŒäœ ćŻä»„èˆ‡æˆ€äșșéžäž€ćŒ”æĄŒć­ïŒŒç„¶ćŸŒćäž‹äŸ†èŠćŸˆé•·äž€æź”æ™‚é–“ïŒˆć› ç‚șæŒąć Ąććˆ†è±ȘèŻïŒŒæș–ć‚™ç‰č戄èČ»ć·„ă€‚ïŒ‰ -é€™æź”æ™‚é–“ïŒŒäœ é‚„èƒœæŹŁèłžäœ çš„æˆ€äșșæœ‰ć€šéșŒçš„ćŻæ„›ă€è°æ˜Žèˆ‡èż·äșș。✹😍✹ +ç•¶äœ ć’Œæˆ€äșșććœšæĄŒé‚Šç­‰ćŸ…æŒąć Ąæ™‚ïŒŒäœ ćŻä»„æŠŠé€™æź”æ™‚é–“æ‹żäŸ†æŹŁèłžäœ çš„æˆ€äșșæœ‰ć€šéșŒæŁ’ă€ćŻæ„›ćˆè°æ˜Ž ✹😍✹。 @@ -135,7 +135,7 @@ def results(): -äœ ć’Œæˆ€äșșäș«ç”šé€™é “ć€§é€ïŒŒæ•Žć€‹éŽçš‹ććˆ†é–‹ćżƒâœš +äœ ć’Œæˆ€äșșäș«ç”šé€™é “ć€§é€ïŒŒæ•Žć€‹éŽçš‹ććˆ†é–‹ćżƒă€‚âœš @@ -147,21 +147,21 @@ def results(): --- -æƒłćƒäœ æ˜Żæ•…äș‹äž­çš„é›»è…Šæˆ–çš‹ćŒ đŸ€–ă€‚ +æƒłćƒäœ æ˜Żæ•…äș‹äž­çš„電腊 / çš‹ćŒ đŸ€–ă€‚ ç•¶äœ æŽ’éšŠæ™‚ïŒŒäœ ćœšæ”Ÿç©șđŸ˜ŽïŒŒç­‰ćŸ…èŒȘćˆ°äœ ïŒŒæČ’æœ‰ćšä»»äœ•ă€Œç”Ÿç”ąæ€§ă€çš„äș‹æƒ…ă€‚äœ†é€™æČ’é—œäż‚ïŒŒć› ç‚șæ”¶éŠ€ć“ĄćȘæ˜ŻæŽ„ć–źïŒˆè€Œäžæ˜Żæș–ć‚™éŁŸç‰©ïŒ‰ïŒŒæ‰€ä»„æŽ’éšŠé€ŸćșŠćŸˆćż«ă€‚ -ç„¶ćŸŒïŒŒç•¶èŒȘćˆ°äœ æ™‚ïŒŒäœ é–‹ć§‹ćšçœŸæ­Łă€Œæœ‰ç”Ÿç”ąćŠ›ă€çš„ć·„äœœïŒŒè™•ç†èœć–źïŒŒæ±șćźšäœ æƒłèŠä»€éșŒïŒŒæ›żæˆ€äșșéžæ“‡é€é»žïŒŒä»˜æŹŸïŒŒçąșèȘäœ ç”Šäș†æ­Łçąșçš„ćžłć–źæˆ–äżĄç”šćĄïŒŒæȘ࿟„äœ æ˜ŻćŠèą«æ­Łçąș收èČ»ïŒŒçąșèȘèš‚ć–źäž­çš„é …ç›źæ˜ŻćŠæ­Łçąș等等。 +ç„¶ćŸŒïŒŒç•¶èŒȘćˆ°äœ æ™‚ïŒŒäœ é–‹ć§‹ćšçœŸæ­Łă€Œæœ‰ç”Ÿç”ąćŠ›ă€çš„ć·„äœœïŒŒè™•ç†èœć–źïŒŒæ±șćźšäœ æƒłèŠä»€éșŒïŒŒć–ćŸ—æˆ€äșșçš„éžæ“‡ïŒŒä»˜æŹŸïŒŒçąșèȘäœ ç”Šäș†æ­Łçąșçš„ćžłć–źæˆ–äżĄç”šćĄïŒŒæȘ࿟„äœ æ˜ŻćŠèą«æ­Łçąș收èČ»ïŒŒçąșèȘèš‚ć–źäž­çš„é …ç›źæ˜ŻćŠæ­Łçąș等等。 äœ†æ˜ŻïŒŒćłäœżäœ é‚„æČ’æœ‰æ‹żćˆ°æŒąć ĄïŒŒäœ èˆ‡æ”¶éŠ€ć“Ąçš„ć·„䜜ć·Čç¶“ă€Œæš«ćœă€äș† âžïŒŒć› ç‚șäœ ćż…é ˆç­‰ćŸ… 🕙 æŒąć Ąæș–ć‚™ć„œă€‚ äœ†ç•¶äœ é›ąé–‹æ«ƒæȘŻïŒŒććˆ°æĄŒć­æ—ïŒŒæ‹żè‘—ć±Źæ–Œäœ çš„è™ŸçąŒç­‰ćŸ…æ™‚ïŒŒäœ ćŻä»„æŠŠæłšæ„ćŠ› 🔀 èœ‰ç§»ćˆ°æˆ€äșșèș«äžŠïŒŒäžŠé–‹ć§‹ă€Œć·„äœœă€âŻ đŸ€“â€”â€”äčŸć°±æ˜Żć’Œæˆ€äșșèȘżæƒ… đŸ˜ă€‚é€™æ™‚äœ ćˆé–‹ć§‹ćšäž€äș›éžćžžă€Œæœ‰ç”Ÿç”ąćŠ›ă€çš„äș‹æƒ…。 -æŽ„è‘—ïŒŒæ”¶éŠ€ć“Ą 💁 ć°‡äœ çš„è™ŸçąŒéĄŻç€șćœšæ«ƒæȘŻèžąćč•äžŠïŒŒäžŠć‘ŠèšŽäœ ă€ŒæŒąć Ąć·Čç¶“ćšć„œäș†ă€ă€‚äœ†äœ äžæœƒç˜‹ç‹‚ćœ°ç«‹ćˆ»è·łè”·äŸ†ïŒŒć› ç‚ș饯ç€șçš„è™ŸçąŒèźŠæˆäș†äœ çš„ă€‚äœ çŸ„道æČ’有äșșæœƒæ¶è”°äœ çš„æŒąć ĄïŒŒć› ç‚ș䜠有è‡Șć·±çš„è™ŸçąŒïŒŒä»–ć€‘ä蟿œ‰ä»–ć€‘çš„è™ŸçąŒă€‚ +æŽ„è‘—ïŒŒæ”¶éŠ€ć“Ą 💁 é€éŽæŠŠäœ çš„è™ŸçąŒéĄŻç€șćœšæ«ƒæȘŻèžąćč•äžŠïŒŒèĄšç€șă€ŒæŒąć Ąć·Čç¶“ćšć„œäș†ă€ïŒŒäœ†äœ äžæœƒćœšéĄŻç€șçš„è™ŸçąŒèźŠæˆäœ çš„è™ŸçąŒæ™‚ć°±ç˜‹ç‹‚ćœ°ç«‹ćˆ»è·łè”·äŸ†ă€‚äœ çŸ„é“æČ’有äșșæœƒæ¶è”°äœ çš„æŒąć ĄïŒŒć› ç‚ș䜠有è‡Șć·±çš„è™ŸçąŒïŒŒä»–ć€‘ä蟿œ‰ä»–ć€‘çš„è™ŸçąŒă€‚ -所仄䜠會等戀äșșèŹ›ćźŒæ•…äș‹ïŒˆćꌿˆç•¶ć‰çš„ć·„䜜 ⏯/æ­Łćœšé€ČèĄŒçš„ä»»ć‹™ đŸ€“ïŒ‰ïŒŒç„¶ćŸŒćŸźçŹ‘è‘—æș«æŸ”ćœ°èȘȘäœ èŠćŽ»æ‹żæŒąć Ąäș† ⏾。 +所仄䜠會等戀äșșèŹ›ćźŒæ•…äș‹ïŒˆćꌿˆç•¶ć‰çš„ć·„䜜 ⏯ / æ­Łćœšé€ČèĄŒçš„ä»»ć‹™ đŸ€“ïŒ‰ïŒŒç„¶ćŸŒćŸźçŹ‘è‘—æș«æŸ”ćœ°èȘȘäœ èŠćŽ»æ‹żæŒąć Ąäș† ⏾。 -ç„¶ćŸŒäœ è”°ć‘æ«ƒæȘŻ đŸ”€ïŒŒć›žćˆ°ć·Čç¶“ćźŒæˆçš„æœ€ćˆä»»ć‹™ âŻïŒŒæ‹żè”·æŒąć ĄïŒŒèȘȘèČèŹèŹïŒŒäžŠćž¶ć›žæĄŒäžŠă€‚é€™ć°±ç”æŸäș†èˆ‡æ«ƒæȘŻçš„äș’ć‹•æ­„驟/任拙 âčïŒŒæŽ„äž‹äŸ†æœƒç”ąç”Ÿäž€ć€‹æ–°çš„ä»»ć‹™ïŒŒă€ŒćƒæŒąć Ąă€ 🔀 âŻïŒŒè€Œć…ˆć‰çš„ă€Œæ‹żæŒąć Ąă€ä»»ć‹™ć·Čç¶“ćźŒæˆäș† âč。 +ç„¶ćŸŒäœ è”°ć‘æ«ƒæȘŻ đŸ”€ïŒŒć›žćˆ°ć·Čç¶“ćźŒæˆçš„æœ€ćˆä»»ć‹™ âŻïŒŒæ‹żè”·æŒąć ĄïŒŒèȘȘèČèŹèŹïŒŒäžŠćž¶ć›žæĄŒäžŠă€‚é€™ć°±ç”æŸäș†èˆ‡æ«ƒæȘŻäș’ć‹•çš„æ­„驟 / 任拙 âčă€‚æŽ„è‘—ïŒŒé€™ćˆç”ąç”Ÿäș†äž€ć€‹æ–°çš„ä»»ć‹™ïŒŒă€ŒćƒæŒąć Ąă€đŸ”€ âŻïŒŒè€Œć…ˆć‰çš„ă€Œæ‹żæŒąć Ąă€ä»»ć‹™ć·Čç¶“ćźŒæˆäș† âč。 ### ćčłèĄŒæŒąć Ą { #parallel-burgers } @@ -181,19 +181,19 @@ def results(): -æ”¶éŠ€ć“Ąè”°é€Čć»šæˆżæș–ć‚™éŁŸç‰©ă€‚ +æ”¶éŠ€ć“Ąè”°é€Čć»šæˆżă€‚ äœ ç«™ćœšæ«ƒæȘŻć‰ç­‰ćŸ… đŸ•™ïŒŒä»„ć…ć…¶ä»–äșșć…ˆæ‹żè”°äœ çš„æŒąć ĄïŒŒć› ç‚șé€™èŁĄæČ’æœ‰è™ŸçąŒç‰Œçł»ç”±ă€‚ -ç”±æ–Œäœ ć’Œæˆ€äșșéƒœćż™è‘—äžèź“ćˆ„äșșæ¶è”°äœ çš„æŒąć ĄïŒŒç­‰æŒąć Ąæș–ć‚™ć„œæ™‚ïŒŒäœ æ čæœŹç„Ąæł•ć°ˆćżƒć’Œæˆ€äșșäș’ć‹•ă€‚đŸ˜ž +ç”±æ–Œäœ ć’Œæˆ€äșșéƒœćż™è‘—äžèź“ćˆ„äșșæ’ćˆ°äœ ć‰éąäžŠćœšæŒąć Ąé€äŸ†æ™‚æ‹żè”°äœ çš„æŒąć ĄïŒŒäœ æ čæœŹç„Ąæł•ć°ˆćżƒć’Œæˆ€äșșäș’ć‹•ă€‚đŸ˜ž -é€™æ˜Żă€ŒćŒæ­„ă€(synchronous)ć·„äœœïŒŒäœ ć’Œæ”¶éŠ€ć“Ą/滚枫 👹‍🍳 æ˜Żă€ŒćŒæ­„ćŒ–ă€çš„ă€‚äœ ćż…é ˆç­‰ćˆ° 🕙 æ”¶éŠ€ć“Ą/滚枫 👹‍🍳 ćźŒæˆæŒąć ĄäžŠäș€ç”Šäœ çš„é‚Łäž€ćˆ»ïŒŒćŠć‰‡ćˆ„äșșćŻèƒœæœƒæ‹żè”°äœ çš„é€é»žă€‚ +é€™æ˜Żă€ŒćŒæ­„ă€(synchronous)ć·„äœœïŒŒäœ ć’Œæ”¶éŠ€ć“Ą / 滚枫 👹‍🍳 æ˜Żă€ŒćŒæ­„ćŒ–ă€çš„ă€‚äœ ćż…é ˆç­‰ćˆ° 🕙 æ”¶éŠ€ć“Ą / 滚枫 👹‍🍳 ćźŒæˆæŒąć ĄäžŠäș€ç”Šäœ çš„é‚Łäž€ćˆ»ïŒŒćŠć‰‡ćˆ„äșșćŻèƒœæœƒæ‹żè”°äœ çš„é€é»žă€‚ -æœ€ç”‚ïŒŒç¶“éŽé•·æ™‚é–“çš„ç­‰ćŸ… đŸ•™ïŒŒæ”¶éŠ€ć“Ą/滚枫 👹‍🍳 æ‹żè‘—æŒąć Ąć›žäŸ†äș†ă€‚ +æœ€ç”‚ïŒŒç¶“éŽé•·æ™‚é–“ćœšæ«ƒæȘŻć‰çš„ç­‰ćŸ… đŸ•™ïŒŒæ”¶éŠ€ć“Ą / 滚枫 👹‍🍳 æ‹żè‘—æŒąć Ąć›žäŸ†äș†ă€‚ @@ -203,7 +203,7 @@ def results(): -æ•Žć€‹éŽçš‹äž­æČ’有ć€Șć€šçš„è«‡æƒ…èȘȘæ„›ïŒŒć› ç‚șć€§éƒšćˆ†æ™‚é–“ 🕙 éƒœèŠ±ćœšæ«ƒæȘŻć‰ç­‰ćŸ…ă€‚đŸ˜ž +æ•Žć€‹éŽçš‹äž­æČ’有ć€Șć€šèŠć€©æˆ–è«‡æƒ…èȘȘæ„›ïŒŒć› ç‚șć€§éƒšćˆ†æ™‚é–“ 🕙 éƒœèŠ±ćœšæ«ƒæȘŻć‰ç­‰ćŸ…ă€‚đŸ˜ž /// note | æłšæ„ @@ -213,15 +213,15 @@ def results(): --- -朹這怋ćčłèĄŒæŒąć Ąçš„æƒ…ćąƒäž‹ïŒŒäœ æ˜Żäž€ć€‹çš‹ćŒ đŸ€– äž”æœ‰ć…©ć€‹è™•ç†ć™šïŒˆäœ ć’Œæˆ€äșșïŒ‰ïŒŒć…©è€…éƒœćœšç­‰ćŸ… 🕙 äžŠć°ˆæłšæ–Œç­‰ćŸ…æ«ƒæȘŻäžŠçš„逐點 đŸ•™ïŒŒç­‰ćŸ…çš„æ™‚é–“éžćžžé•·ă€‚ +朹這怋ćčłèĄŒæŒąć Ąçš„æƒ…ćąƒäž‹ïŒŒäœ æ˜Żäž€ć€‹çš‹ćŒ đŸ€– äž”æœ‰ć…©ć€‹è™•ç†ć™šïŒˆäœ ć’Œæˆ€äșșïŒ‰ïŒŒć…©è€…éƒœćœšç­‰ćŸ… 🕙 äžŠć°ˆæłš ⏯ æ–Œćœšæ«ƒæȘŻć‰ç­‰ćŸ… đŸ•™ïŒŒç­‰ćŸ…çš„æ™‚é–“éžćžžé•·ă€‚ -é€™ćź¶é€ŸéŁŸćș—有 8 ć€‹è™•ç†ć™šïŒˆæ”¶éŠ€ć“Ą/ć»šćž«ïŒ‰ă€‚è€ŒäžŠèĄŒæŒąć Ąćș—ćŻèƒœćȘ有 2 ć€‹è™•ç†ć™šïŒˆäž€äœæ”¶éŠ€ć“Ąć’Œäž€äœć»šćž«ïŒ‰ă€‚ +é€™ćź¶é€ŸéŁŸćș—有 8 ć€‹è™•ç†ć™šïŒˆæ”¶éŠ€ć“Ą / ć»šćž«ïŒ‰ă€‚è€ŒäžŠèĄŒæŒąć Ąćș—ćŻèƒœćȘ有 2 ć€‹è™•ç†ć™šïŒˆäž€äœæ”¶éŠ€ć“Ąć’Œäž€äœć»šćž«ïŒ‰ă€‚ ć„˜çźĄćŠ‚æ­€ïŒŒæœ€ç”‚çš„é«”é©—äžŠäžæ˜Żæœ€ç†æƒłçš„ă€‚đŸ˜ž --- -é€™æ˜Żèˆ‡æŒąć ĄéĄžäŒŒçš„æ•…äș‹ă€‚đŸ” +é€™æ˜Żèˆ‡æŒąć ĄéĄžäŒŒçš„ćčłèĄŒç‰ˆæœŹæ•…äș‹ă€‚đŸ” äž€ć€‹æ›Žă€ŒçŸćŻŠă€çš„äŸ‹ć­ïŒŒæƒłćƒäž€é–“éŠ€èĄŒă€‚ @@ -241,29 +241,29 @@ def results(): èš±ć€šç”šæˆ¶æ­Łćœšäœżç”šäœ çš„æ‡‰ç”šçš‹ćŒïŒŒè€Œäœ çš„äŒșæœć™šć‰‡ćœšç­‰ćŸ… 🕙 這äș›ç”šæˆ¶äžé‚ŁéșŒç©©ćźšçš„ç¶Čè·ŻäŸ†ć‚łé€è«‹æ±‚ă€‚ -æŽ„è‘—ïŒŒć†æŹĄç­‰ćŸ… 🕙 ć›žæ‡‰ă€‚ +æŽ„è‘—ïŒŒć†æŹĄç­‰ćŸ… 🕙 ć›žæ‡‰ć›žäŸ†ă€‚ -é€™çšźă€Œç­‰ćŸ…ă€ 🕙 é€šćžžä»„ćŸźç§’äŸ†èĄĄé‡ïŒŒäœ†çŽŻćŠ è”·äŸ†ïŒŒæœ€ç”‚é‚„æ˜ŻèŠ±èČ»äș†ćŸˆć€šç­‰ćŸ…æ™‚é–“ă€‚ +é€™çšźă€Œç­‰ćŸ…ă€đŸ•™ é€šćžžä»„ćŸźç§’äŸ†èĄĄé‡ïŒŒäœ†çŽŻćŠ è”·äŸ†ïŒŒæœ€ç”‚é‚„æ˜ŻèŠ±èČ»äș†ćŸˆć€šç­‰ćŸ…æ™‚é–“ă€‚ -é€™ć°±æ˜Żç‚ș什éșŒć°æ–Œ Web API 䟆èȘȘïŒŒäœżç”šéžćŒæ­„çš‹ćŒçąŒ ⏾🔀⏯ æ˜Żéžćžžæœ‰æ„ć‘łçš„ă€‚ +é€™ć°±æ˜Żç‚ș什éșŒć°æ–Œ Web API 䟆èȘȘïŒŒäœżç”šéžćŒæ­„çš‹ćŒçąŒ ⏾🔀⏯ æ˜Żéžćžžæœ‰æ„çŸ©çš„ă€‚ é€™çšźéĄžćž‹çš„éžćŒæ­„æ€§æ­Łæ˜Ż NodeJS æˆćŠŸçš„ćŽŸć› ïŒˆć„˜çźĄ NodeJS äžæ˜ŻćčłèĄŒçš„這ä蟿˜Ż Go èȘžèš€äœœç‚șçš‹ćŒèȘžèš€çš„äž€ć€‹ćŒ·ć€§ć„Ș拱。 -這與 **FastAPI** 所胜提䟛的性胜氎ćčłç›žćŒă€‚ +這與 **FastAPI** 所胜提䟛的效胜氎æș–ç›žćŒă€‚ -äœ ćŻä»„ćŒæ™‚ćˆ©ç”šäžŠèĄŒæ€§ć’ŒćčłèĄŒæ€§ïŒŒé€Čäž€æ­„æć‡æ•ˆèƒœïŒŒé€™æŻ”ć€§ć€šæ•žć·ČæžŹè©Šçš„ NodeJS æĄ†æž¶éƒœæ›Žćż«ïŒŒäžŠäž”èˆ‡ Go èȘžèš€ç›žç•¶ïŒŒè€Œ Go æ˜Żäž€çšźæ›ŽæŽ„èż‘ C çš„ç·šè­ŻèȘžèš€ïŒˆ[æ„ŸèŹ Starlette](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1)ïŒ‰ă€‚ +äœ ćŻä»„ćŒæ™‚ćˆ©ç”šćčłèĄŒæ€§ć’ŒéžćŒæ­„性é€Čäž€æ­„æć‡æ•ˆèƒœïŒŒé€™æŻ”ć€§ć€šæ•žć·ČæžŹè©Šçš„ NodeJS æĄ†æž¶éƒœæ›Žćż«ïŒŒäžŠäž”èˆ‡ Go èȘžèš€ç›žç•¶ïŒŒè€Œ Go æ˜Żäž€çšźæ›ŽæŽ„èż‘ C çš„ç·šè­ŻèȘžèš€ïŒˆ[é€™éƒœèŠæ­žćŠŸæ–Œ Starlette](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1)ïŒ‰ă€‚ -### äžŠèĄŒæŻ”ćčłèĄŒæ›Žć„œć—ŽïŒŸ { #is-concurrency-better-than-parallelism } +### äžŠèĄŒæŻ”ćčłèĄŒæ›Žć„œć—Ž { #is-concurrency-better-than-parallelism } äžæ˜Żçš„ïŒé€™äžæ˜Żæ•…äș‹çš„æœŹæ„ă€‚ äžŠèĄŒèˆ‡ćčłèĄŒäžćŒă€‚äžŠèĄŒćœšæŸäș› **ç‰č漚** çš„éœ€èŠć€§é‡ç­‰ćŸ…çš„æƒ…ćąƒäž‹èĄšçŸæ›Žć„œă€‚æ­Łć› ćŠ‚æ­€ïŒŒäžŠèĄŒćœš Web æ‡‰ç”šçš‹ćŒé–‹ç™Œäž­é€šćžžæŻ”ćčłèĄŒæ›Žæœ‰ć„Șć‹ąă€‚äœ†äžŠäžæ˜Żæ‰€æœ‰æƒ…ćąƒéƒœćŠ‚æ­€ă€‚ -ć› æ­€ïŒŒç‚șäș†ćčłèĄĄć ±ć°ŽïŒŒæƒłćƒäž‹éąé€™ć€‹çŸ­æ•…äș‹ +ć› æ­€ïŒŒç‚șäș†ćčłèĄĄć ±ć°ŽïŒŒæƒłćƒäž‹éąé€™ć€‹çŸ­æ•…äș‹ïŒš > äœ éœ€èŠæ‰“æŽƒäž€é–“ćˆć€§ćˆé«’çš„æˆżć­ă€‚ -*æ˜Żçš„ïŒŒé€™ć°±æ˜Żć…šéƒšçš„æ•…äș‹ă€‚* +*æ˜Żçš„ïŒŒé€™ć°±æ˜Żć…šéƒšçš„æ•…äș‹*。 --- @@ -273,32 +273,32 @@ def results(): ç„Ąè«–èŒȘæ”ćŸ·èĄŒèˆ‡ćŠïŒˆäžŠèĄŒïŒ‰ïŒŒäœ éƒœéœ€èŠç›žćŒçš„ć·„æ™‚ćźŒæˆä»»ć‹™ïŒŒćŒæ™‚éœ€èŠćŸ·èĄŒç›žćŒć·„äœœé‡ă€‚ -äœ†æ˜ŻïŒŒćœšé€™çšźæƒ…ćąƒäž‹ïŒŒćŠ‚æžœäœ ćŻä»„é‚€è«‹8äœć‰æ”¶éŠ€ć“Ą/ć»šćž«ïŒˆçŸćœšæ˜Żæž…æœ”ć·„ïŒ‰äŸ†ćč«ćż™ïŒŒæŻć€‹äșșïŒˆćŠ äžŠäœ ïŒ‰èČ èČŹæˆżć­çš„æŸć€‹ć€ćŸŸïŒŒé€™æšŁäœ ć°±ćŻä»„ **ćčłèĄŒ** ćœ°æ›Žćż«ćźŒæˆć·„äœœă€‚ +äœ†æ˜ŻïŒŒćœšé€™çšźæƒ…ćąƒäž‹ïŒŒćŠ‚æžœäœ ćŻä»„é‚€è«‹ 8 äœć‰æ”¶éŠ€ć“Ą / ć»šćž«ïŒˆçŸćœšæ˜Żæž…æœ”ć·„ïŒ‰äŸ†ćč«ćż™ïŒŒæŻć€‹äșșïŒˆćŠ äžŠäœ ïŒ‰èČ èČŹæˆżć­çš„æŸć€‹ć€ćŸŸïŒŒé€™æšŁäœ ć°±ćŻä»„ćœšéĄć€–ć”ćŠ©äž‹ **ćčłèĄŒ** ćœ°æ›Žćż«ćźŒæˆć·„äœœă€‚ ćœšé€™ć€‹ć Žæ™Żäž­ïŒŒæŻć€‹æž…æœ”ć·„ïŒˆćŒ…æ‹Źäœ ïŒ‰éƒœæ˜Żäž€ć€‹è™•ç†ć™šïŒŒćźŒæˆć·„äœœçš„äž€éƒšćˆ†ă€‚ -ç”±æ–Œć€§ć€šæ•žçš„ćŸ·èĄŒæ™‚é–“éƒœèŠ±ćœšćŻŠéš›çš„ć·„äœœäžŠïŒˆè€Œäžæ˜Żç­‰ćŸ…ïŒ‰ïŒŒè€Œé›»è…Šäž­çš„ć·„äœœç”± CPU ćźŒæˆïŒŒć› æ­€é€™äș›ć•éĄŒèą«çš±ç‚ș「CPU 毆集枋」。 +ç”±æ–Œć€§ć€šæ•žçš„ćŸ·èĄŒæ™‚é–“éƒœèŠ±ćœšćŻŠéš›çš„ć·„äœœäžŠïŒˆè€Œäžæ˜Żç­‰ćŸ…ïŒ‰ïŒŒè€Œé›»è…Šäž­çš„ć·„äœœç”± CPU ćźŒæˆïŒŒć› æ­€é€™äș›ć•éĄŒèą«çš±ç‚ș「CPU bound」。 --- -ćžžèŠ‹çš„ CPU ćŻ†é›†ćž‹æ“äœœçŻ„äŸ‹ćŒ…æ‹Źé‚Łäș›éœ€èЁé€ČèĄŒè€‡é›œæ•žć­žèšˆçź—çš„ä»»ć‹™ă€‚ +ćžžèŠ‹çš„ CPU bound æ“äœœçŻ„äŸ‹ćŒ…æ‹Źé‚Łäș›éœ€èЁé€ČèĄŒè€‡é›œæ•žć­žèšˆçź—çš„ä»»ć‹™ă€‚ äŸ‹ćŠ‚ïŒš -* **éŸłèšŠ**或**ćœ–ćƒè™•ç†** -* **電腊芖èŠș**ïŒšäž€ćŒ”ćœ–ç‰‡ç”±æ•žç™ŸèŹć€‹ćƒçŽ ç”„æˆïŒŒæŻć€‹ćƒçŽ æœ‰ 3 ć€‹ć€Œ/顏è‰Č處理這äș›ćƒçŽ é€šćžžéœ€èŠćŒæ™‚é€ČèĄŒć€§é‡èšˆçź—ïŒ› -* **æ©Ÿć™šć­žçż’**: é€šćžžéœ€èŠć€§é‡çš„ă€ŒçŸ©é™Łă€ć’Œă€Œć‘é‡ă€é‹çź—ă€‚æƒłćƒäž€ć€‹ćŒ…ć«æ•žć­—çš„ć·šć€§é›»ć­èĄšæ ŒïŒŒäžŠæ‰€æœ‰çš„æ•žć­—ćŒæ™‚ç›žäč˜; -* **æ·±ćșŠć­žçż’**: é€™æ˜Żæ©Ÿć™šć­žçż’çš„ć­é ˜ćŸŸïŒŒćŒæšŁé©ç”šă€‚ćȘäžéŽé€™äžćƒ…ćƒ…æ˜Żäž€ćŒ”æ•žć­—èĄšæ ŒïŒŒè€Œæ˜Żć€§é‡çš„æ•žæ“šé›†ćˆïŒŒäžŠäž”ćœšćŸˆć€šæƒ…æłäž‹ïŒŒäœ æœƒäœżç”šç‰čæźŠçš„è™•ç†ć™šäŸ†æ§‹ć»șæˆ–äœżç”šé€™äș›æšĄćž‹ă€‚ +* **éŸłèšŠ**或**ćœ–ćƒè™•ç†**。 +* **電腊芖èŠș**ïŒšäž€ćŒ”ćœ–ç‰‡ç”±æ•žç™ŸèŹć€‹ćƒçŽ ç”„æˆïŒŒæŻć€‹ćƒçŽ æœ‰ 3 ć€‹ć€Œ / 顏è‰Č處理這äș›ćƒçŽ é€šćžžéœ€èŠćŒæ™‚é€ČèĄŒć€§é‡èšˆçź—ă€‚ +* **æ©Ÿć™šć­žçż’**ïŒšé€šćžžéœ€èŠć€§é‡çš„ă€ŒçŸ©é™Łă€ć’Œă€Œć‘é‡ă€é‹çź—ă€‚æƒłćƒäž€ć€‹ćŒ…ć«æ•žć­—çš„ć·šć€§é›»ć­èĄšæ ŒïŒŒäžŠć°‡æ‰€æœ‰æ•žć­—ćŒæ™‚ç›žäč˜ă€‚ +* **æ·±ćșŠć­žçż’**ïŒšé€™æ˜Żæ©Ÿć™šć­žçż’çš„ć­é ˜ćŸŸïŒŒćŒæšŁé©ç”šă€‚ćȘäžéŽé€™äžćƒ…ćƒ…æ˜Żäž€ćŒ”èŠç›žäč˜çš„æ•žć­—èĄšæ ŒïŒŒè€Œæ˜Żć€§é‡çš„æ•žæ“šé›†ćˆïŒŒäžŠäž”ćœšćŸˆć€šæƒ…æłäž‹ïŒŒäœ æœƒäœżç”šç‰čæźŠçš„è™•ç†ć™šäŸ†æ§‹ć»ș揊 / æˆ–äœżç”šé€™äș›æšĄćž‹ă€‚ ### äžŠèĄŒ + ćčłèĄŒ: Web + æ©Ÿć™šć­žçż’ { #concurrency-parallelism-web-machine-learning } äœżç”š **FastAPI**ïŒŒäœ ćŻä»„ćˆ©ç”šäžŠèĄŒçš„ć„Șć‹ąïŒŒé€™ćœš Web é–‹ç™Œäž­éžćžžćžžèŠ‹ïŒˆé€™ä蟿˜Ż NodeJS çš„æœ€ć€§ćžćŒ•ćŠ›ïŒ‰ă€‚ -䜆䜠äčŸćŻä»„ćˆ©ç”šćčłèĄŒèˆ‡ć€šèĄŒçš‹ (multiprocessing)ïŒˆèź“ć€šć€‹èĄŒçš‹ćŒæ™‚é‹èĄŒïŒ‰ 的ć„Șć‹ąäŸ†è™•ç†æ©Ÿć™šć­žçż’çł»ç”±äž­çš„ **CPU 毆集枋**ć·„äœœă€‚ +䜆䜠äčŸćŻä»„ćˆ©ç”šćčłèĄŒèˆ‡ć€šèĄŒçš‹ (multiprocessing)ïŒˆèź“ć€šć€‹èĄŒçš‹ćŒæ™‚é‹èĄŒïŒ‰ 的ć„Șć‹ąäŸ†è™•ç†æ©Ÿć™šć­žçż’çł»ç”±äž­çš„ **CPU bound** ć·„äœœă€‚ -é€™äž€é»žïŒŒć†ćŠ äžŠ Python æ˜Ż **èł‡æ–™ç§‘ć­ž**ă€æ©Ÿć™šć­žçż’ïŒŒć°€ć…¶æ˜Żæ·±ćșŠć­žçż’的䞻èЁèȘžèš€ïŒŒèź“ **FastAPI** 成ç‚șèł‡æ–™ç§‘ć­ž/æ©Ÿć™šć­žçż’ Web API ć’Œæ‡‰ç”šçš‹ćŒïŒˆä»„ćŠèš±ć€šć…¶ä»–æ‡‰ç”šçš‹ćŒïŒ‰çš„ç”•äœłéžæ“‡ă€‚ +é€™äž€é»žïŒŒć†ćŠ äžŠ Python æ˜Ż **èł‡æ–™ç§‘ć­ž**ă€æ©Ÿć™šć­žçż’ïŒŒć°€ć…¶æ˜Żæ·±ćșŠć­žçż’的䞻èЁèȘžèš€ïŒŒèź“ **FastAPI** 成ç‚șèł‡æ–™ç§‘ć­ž / æ©Ÿć™šć­žçż’ Web API ć’Œæ‡‰ç”šçš‹ćŒïŒˆä»„ćŠèš±ć€šć…¶ä»–æ‡‰ç”šçš‹ćŒïŒ‰çš„ç”•äœłéžæ“‡ă€‚ -æƒłäș†è§ŁćŠ‚äœ•ćœšç”Ÿç”ąç’°ćąƒäž­ćŻŠçŸé€™çšźćčłèĄŒæ€§ïŒŒè«‹ćƒèŠ‹ [郚汏](deployment/index.md)。 +æƒłäș†è§ŁćŠ‚äœ•ćœšç”Ÿç”ąç’°ćąƒäž­ćŻŠçŸé€™çšźćčłèĄŒæ€§ïŒŒè«‹ćƒèŠ‹ [郚çœČ](deployment/index.md)。 ## `async` 撌 `await` { #async-and-await } @@ -310,37 +310,37 @@ def results(): burgers = await get_burgers(2) ``` -é€™èŁĄçš„é—œé”æ˜Ż `await`ă€‚ćźƒć‘ŠèšŽ Python ćż…é ˆç­‰ćŸ… ⏞ `get_burgers(2)` ćźŒæˆćźƒçš„ć·„äœœ đŸ•™ïŒŒ ç„¶ćŸŒć°‡ç”æžœć„Č歘朹 `burgers` äž­ă€‚ćŠ‚æ­€ïŒŒPython ć°±ćŻä»„ćœšæ­€æœŸé–“ćŽ»è™•ç†ć…¶ä»–äș‹æƒ… 🔀 ⏯ ïŒˆäŸ‹ćŠ‚æŽ„æ”¶ćŠäž€ć€‹è«‹æ±‚ïŒ‰ă€‚ +é€™èŁĄçš„é—œé”æ˜Ż `await`ă€‚ćźƒć‘ŠèšŽ Python ćż…é ˆç­‰ćŸ… ⏞ `get_burgers(2)` ćźŒæˆćźƒçš„ć·„äœœ đŸ•™ïŒŒç„¶ćŸŒć°‡ç”æžœć„Č歘朹 `burgers` äž­ă€‚ćŠ‚æ­€ïŒŒPython ć°±ćŻä»„ćœšæ­€æœŸé–“ćŽ»è™•ç†ć…¶ä»–äș‹æƒ… 🔀 âŻïŒˆäŸ‹ćŠ‚æŽ„æ”¶ćŠäž€ć€‹è«‹æ±‚ïŒ‰ă€‚ -èŠèź“ `await` é‹äœœïŒŒćźƒćż…é ˆäœæ–Œæ”ŻæŒéžćŒæ­„ćŠŸèƒœçš„ć‡œćŒć…§ă€‚ç‚ș歀ćȘéœ€äœżç”š `async def` ćźŁć‘Šć‡œćŒïŒš +èŠèź“ `await` é‹äœœïŒŒćźƒćż…é ˆäœæ–Œæ”ŻæŽéžćŒæ­„ćŠŸèƒœçš„ć‡œćŒć…§ă€‚ç‚ș歀ćȘéœ€äœżç”š `async def` ćźŁć‘Šć‡œćŒïŒš ```Python hl_lines="1" async def get_burgers(number: int): - # Do some asynchronous stuff to create the burgers + # 恚侀äș›éžćŒæ­„的äș‹æƒ…äŸ†èŁœäœœæŒąć Ą return burgers ``` -...è€Œäžæ˜Ż `def`: +...è€Œäžæ˜Ż `def` ```Python hl_lines="2" -# This is not asynchronous +# é€™äžæ˜ŻéžćŒæ­„çš„ def get_sequential_burgers(number: int): - # Do some sequential stuff to create the burgers + # 恚侀äș›ćŸȘćșçš„äș‹æƒ…äŸ†èŁœäœœæŒąć Ą return burgers ``` -äœżç”š `async def`Python çŸ„é“ćœšè©Čć‡œćŒć…§éœ€èŠæłšæ„ `await`ïŒŒäžŠäž”ćźƒćŻä»„ă€Œæš«ćœă€ ⏞ ćŸ·èĄŒè©Čć‡œćŒïŒŒç„¶ćŸŒćŸ·èĄŒć…¶ä»–ä»»ć‹™ 🔀 ćŸŒć›žäŸ†ă€‚ +äœżç”š `async def`Python çŸ„é“ćœšè©Čć‡œćŒć…§éœ€èŠæłšæ„ `await` é‹çź—ćŒïŒŒäžŠäž”ćźƒćŻä»„ă€Œæš«ćœă€âž ćŸ·èĄŒè©Čć‡œćŒïŒŒç„¶ćŸŒćŸ·èĄŒć…¶ä»–ä»»ć‹™ 🔀 ćŸŒć›žäŸ†ă€‚ ç•¶äœ æƒłèŠć‘Œć« `async def` ć‡œćŒæ™‚ïŒŒćż…é ˆäœżç”šă€Œawaită€ă€‚ć› æ­€ïŒŒé€™æšŁćŻ«ć°‡ç„Ąæł•é‹èĄŒïŒš ```Python -# This won't work, because get_burgers was defined with: async def +# é€™äžæœƒé‹äœœïŒŒć› ç‚ș get_burgers æ˜Żç”š async def ćźšçŸ©çš„ burgers = get_burgers(2) ``` --- -ćŠ‚æžœäœ æ­Łćœšäœżç”šæŸć€‹ć‡œćŒćș«ïŒŒćźƒć‘ŠèšŽäœ ćŻä»„äœżç”š `await` ć‘Œć«ćźƒïŒŒé‚ŁéșŒäœ éœ€èŠç”š `async def` ćźšçŸ©*è·ŻćŸ‘æ“äœœć‡œćŒ*ïŒŒćŠ‚ïŒš +ćŠ‚æžœäœ æ­Łćœšäœżç”šæŸć€‹ć‡œćŒćș«ïŒŒćźƒć‘ŠèšŽäœ ćŻä»„äœżç”š `await` ć‘Œć«ćźƒïŒŒé‚ŁéșŒäœ éœ€èŠç”š `async def` ć»șç«‹äœżç”šćźƒçš„*è·ŻćŸ‘æ“äœœć‡œćŒ*ïŒŒćŠ‚ïŒš ```Python hl_lines="2-3" @app.get('/burgers') @@ -357,7 +357,7 @@ async def read_burgers(): 那éșŒïŒŒé€™ć°±ćƒă€Œć…ˆæœ‰é›žé‚„æ˜Żć…ˆæœ‰è›‹ă€çš„ć•éĄŒïŒŒèŠćŠ‚äœ•ć‘Œć«çŹŹäž€ć€‹ `async` ć‡œćŒć‘ąïŒŸ -ćŠ‚æžœäœ äœżç”š FastAPIïŒŒç„Ąéœ€æ“”ćżƒé€™ć€‹ć•éĄŒïŒŒć› ç‚șă€ŒçŹŹäž€ć€‹ă€ć‡œćŒć°‡æ˜Żäœ çš„*è·ŻćŸ‘æ“äœœć‡œćŒ*FastAPI æœƒçŸ„é“ćŠ‚äœ•æ­Łçąșè™•ç†é€™ć€‹ć•éĄŒă€‚ +ćŠ‚æžœäœ äœżç”š **FastAPI**ïŒŒç„Ąéœ€æ“”ćżƒé€™ć€‹ć•éĄŒïŒŒć› ç‚șă€ŒçŹŹäž€ć€‹ă€ć‡œćŒć°‡æ˜Żäœ çš„*è·ŻćŸ‘æ“äœœć‡œćŒ*FastAPI æœƒçŸ„é“ćŠ‚äœ•æ­Łçąșè™•ç†é€™ć€‹ć•éĄŒă€‚ äœ†ćŠ‚æžœäœ æƒłćœšæČ’有 FastAPI çš„æƒ…æłäž‹äœżç”š `async` / `await`䜠äčŸćŻä»„é€™æšŁćšă€‚ @@ -367,9 +367,9 @@ StarletteïŒˆć’Œ **FastAPI**ïŒ‰æ˜ŻćŸșæ–Œ [AnyIO](https://anyio.readthedocs.io/en/ ç‰čćˆ„æ˜ŻïŒŒäœ ćŻä»„ç›ŽæŽ„äœżç”š [AnyIO](https://anyio.readthedocs.io/en/stable/) äŸ†è™•ç†æ›Žè€‡é›œçš„äžŠèĄŒäœżç”šæĄˆäŸ‹ïŒŒé€™äș›æĄˆäŸ‹éœ€èŠäœ ćœšè‡Șć·±çš„çš‹ćŒçąŒäž­äœżç”šæ›Žé«˜éšŽçš„æšĄćŒă€‚ -ćłäœżäœ äžäœżç”š **FastAPI**䜠äčŸćŻä»„äœżç”š [AnyIO](https://anyio.readthedocs.io/en/stable/) äŸ†æ’°ćŻ«è‡Șć·±çš„éžćŒæ­„æ‡‰ç”šçš‹ćŒïŒŒäžŠçČćŸ—é«˜ç›žćźčæ€§ćŠäž€äș›ć„œè™•ïŒˆäŸ‹ćŠ‚ă€Œç”æ§‹ćŒ–äžŠèĄŒă€ïŒ‰ă€‚ +ćłäœżäœ äžäœżç”š FastAPI䜠äčŸćŻä»„äœżç”š [AnyIO](https://anyio.readthedocs.io/en/stable/) äŸ†æ’°ćŻ«è‡Șć·±çš„éžćŒæ­„æ‡‰ç”šçš‹ćŒïŒŒäžŠçČćŸ—é«˜ç›žćźčæ€§ćŠäž€äș›ć„œè™•ïŒˆäŸ‹ćŠ‚*ç”æ§‹ćŒ–äžŠèĄŒ*ïŒ‰ă€‚ -æˆ‘ćŠć€–ćœš AnyIO äč‹äžŠćšäș†äž€ć€‹è–„ć°èŁçš„ć‡œćŒćș«ïŒŒçšćŸźæ”čé€Čćž‹ćˆ„èš»è§Łä»„çČćŸ—æ›Žć„œçš„**è‡Șć‹•èŁœć…š**、**ćłæ™‚éŒŻèȘ€**ç­‰ă€‚ćŒæ™‚ćźƒä蟿äŸ›ć‹ć–„的介çŽčèˆ‡æ•™ć­žïŒŒćč«ćŠ©äœ **ç†è§Ł**äžŠæ’°ćŻ«**è‡Șć·±çš„éžćŒæ­„çš‹ćŒçąŒ**[Asyncer](https://asyncer.tiangolo.com/)ă€‚ç•¶äœ éœ€èŠ**ć°‡éžćŒæ­„çš‹ćŒçąŒèˆ‡äž€èˆŹ**ïŒˆé˜»ćĄž/ćŒæ­„ïŒ‰**çš‹ćŒçąŒæ•Žćˆ**æ™‚ïŒŒćźƒç‰čćˆ„ćŻŠç”šă€‚ +æˆ‘ćŠć€–ćœš AnyIO äč‹äžŠćšäș†äž€ć€‹è–„ć°èŁçš„ć‡œćŒćș«ïŒŒçšćŸźæ”čé€Čćž‹ćˆ„èš»è§Łä»„çČćŸ—æ›Žć„œçš„**è‡Șć‹•èŁœć…š**、**ćłæ™‚éŒŻèȘ€**ç­‰ă€‚ćŒæ™‚ćźƒä蟿äŸ›ć‹ć–„的介çŽčèˆ‡æ•™ć­žïŒŒćč«ćŠ©äœ **ç†è§Ł**äžŠæ’°ćŻ«**è‡Șć·±çš„éžćŒæ­„çš‹ćŒçąŒ**[Asyncer](https://asyncer.tiangolo.com/)ă€‚ç•¶äœ éœ€èŠ**ć°‡éžćŒæ­„çš‹ćŒçąŒèˆ‡äž€èˆŹ**ïŒˆé˜»ćĄž / ćŒæ­„ïŒ‰**çš‹ćŒçąŒæ•Žćˆ**æ™‚ïŒŒćźƒç‰čćˆ„ćŻŠç”šă€‚ ### ć…¶ä»–ćœąćŒçš„éžćŒæ­„çš‹ćŒçąŒ { #other-forms-of-asynchronous-code } @@ -381,21 +381,21 @@ StarletteïŒˆć’Œ **FastAPI**ïŒ‰æ˜ŻćŸșæ–Œ [AnyIO](https://anyio.readthedocs.io/en/ äœ†ćœšæ­€äč‹ć‰ïŒŒè™•ç†éžćŒæ­„çš‹ćŒçąŒèŠæ›ŽćŠ è€‡é›œć’Œć›°é›Łă€‚ -ćœšèŒƒèˆŠçš„ Python ç‰ˆæœŹäž­ïŒŒäœ ćŻèƒœæœƒäœżç”šć€šćŸ·èĄŒç·’æˆ– [Gevent](https://www.gevent.org/)ă€‚äœ†é€™äș›çš‹ćŒçąŒèŠæ›Žé›Łä»„ç†è§Łă€èȘżè©Šć’Œæ€è€ƒă€‚ +ćœšèŒƒèˆŠçš„ Python ç‰ˆæœŹäž­ïŒŒäœ ćŻèƒœæœƒäœżç”šć€šćŸ·èĄŒç·’æˆ– [Gevent](https://www.gevent.org/)ă€‚äœ†é€™äș›çš‹ćŒçąŒèŠæ›Žé›Łä»„ç†è§Łă€ć”éŒŻć’Œæ€è€ƒă€‚ -ćœšèŒƒèˆŠçš„ NodeJS / ç€èŠœć™š JavaScript äž­ïŒŒäœ æœƒäœżç”šă€Œć›žć‘Œă€ïŒŒé€™ćŻèƒœæœƒć°Žè‡Žâ€œć›žć‘Œćœ°ç„â€ă€‚ +ćœšèŒƒèˆŠçš„ NodeJS / ç€èŠœć™š JavaScript äž­ïŒŒäœ æœƒäœżç”šă€Œć›žć‘Œă€ă€‚é€™ćŻèƒœæœƒć°Žè‡Žă€Œć›žć‘Œćœ°ç„ă€ă€‚ ## 捔繋 { #coroutines } -「捔繋」ćȘæ˜Ż `async def` ć‡œćŒæ‰€ć›žć‚łçš„éžćžžç‰čæźŠçš„äș‹ç‰©ćçš±ă€‚Python çŸ„é“ćźƒæ˜Żäž€ć€‹éĄžäŒŒć‡œćŒçš„æ±è„żïŒŒćŻä»„ć•Ÿć‹•ćźƒïŒŒäžŠäž”ćœšæŸć€‹æ™‚ćˆ»ćźƒæœƒç”æŸïŒŒäœ†ćźƒäčŸćŻèƒœćœšć…§éƒšæš«ćœ ⏞ćȘèŠé‡ćˆ° `await`。 +**捔繋**ćȘæ˜Ż `async def` ć‡œćŒæ‰€ć›žć‚łçš„éžćžžç‰čæźŠçš„äș‹ç‰©ćçš±ă€‚Python çŸ„é“ćźƒæ˜Żäž€ć€‹éĄžäŒŒć‡œćŒçš„æ±è„żïŒŒćŻä»„ć•Ÿć‹•ćźƒïŒŒäžŠäž”ćœšæŸć€‹æ™‚ćˆ»ćźƒæœƒç”æŸïŒŒäœ†ćźƒäčŸćŻèƒœćœšć…§éƒšæš«ćœ ⏞ćȘèŠé‡ćˆ° `await`。 -é€™çšźäœżç”š `async` 撌 `await` çš„éžćŒæ­„çš‹ćŒçąŒćŠŸèƒœé€šćžžèą«æŠ‚æ‹Źç‚șă€Œć”çš‹ă€ă€‚é€™èˆ‡ Go èȘžèš€çš„äž»èЁç‰čæ€§ă€ŒGoroutinesă€ç›žäŒŒă€‚ +äœ†é€™çšźäœżç”š `async` 撌 `await` çš„éžćŒæ­„çš‹ćŒçąŒćŠŸèƒœïŒŒé€šćžžèą«æŠ‚æ‹Źç‚șäœżç”šă€Œć”çš‹ă€ă€‚é€™èˆ‡ Go èȘžèš€çš„äž»èЁç‰čæ€§ă€ŒGoroutinesă€ç›žäŒŒă€‚ ## 甐論 { #conclusion } èź“æˆ‘ć€‘ć†æŹĄć›žéĄ§äč‹ć‰çš„ć„ć­ïŒš -> çŸä»Łç‰ˆæœŹçš„ Python æ”ŻæŒäœżç”š **"捔繋"** 的 **`async` 撌 `await`** èȘžæł•äŸ†ćŻ« **"éžćŒæ­„çš‹ćŒçąŒ"**。 +> çŸä»Łç‰ˆæœŹçš„ Python æ”ŻæŽäœżç”šçš±ç‚ș **「捔繋」** çš„æ±è„żïŒŒé€éŽ **`async` 撌 `await`** èȘžæł•äŸ†ćŻ« **ă€ŒéžćŒæ­„çš‹ćŒçąŒă€**。 çŸćœšæ‡‰è©Čèƒœæ˜Žç™œć…¶ć«æ„äș†ă€‚✚ @@ -407,7 +407,7 @@ StarletteïŒˆć’Œ **FastAPI**ïŒ‰æ˜ŻćŸșæ–Œ [AnyIO](https://anyio.readthedocs.io/en/ äœ ć€§æŠ‚ćŻä»„è·łéŽé€™æź”ă€‚ -é€™èŁĄæ˜Żæœ‰é—œ FastAPI ć…§éƒšæŠ€èĄ“çŽ°çŻ€ă€‚ +é€™èŁĄæ˜Żæœ‰é—œ **FastAPI** ćș•ć±€ćŠ‚äœ•é‹äœœçš„éžćžžæŠ€èĄ“æ€§çš„çŽ°çŻ€ă€‚ ćŠ‚æžœäœ æœ‰ç›žç•¶ć€šçš„æŠ€èĄ“èƒŒæ™ŻïŒˆäŸ‹ćŠ‚ć”çš‹ă€ćŸ·èĄŒç·’ă€é˜»ćĄžç­‰ïŒ‰ïŒŒäžŠäž”ć° FastAPI ćŠ‚äœ•è™•ç† `async def` èˆ‡ćžžèŠ `def` æ„Ÿćˆ°ć„œć„‡ïŒŒè«‹çčŒçșŒé–±èź€ă€‚ @@ -415,9 +415,9 @@ StarletteïŒˆć’Œ **FastAPI**ïŒ‰æ˜ŻćŸșæ–Œ [AnyIO](https://anyio.readthedocs.io/en/ ### è·ŻćŸ‘æ“äœœć‡œćŒ { #path-operation-functions } -ç•¶äœ äœżç”š `def` è€Œäžæ˜Ż `async def` 漣摊*è·ŻćŸ‘æ“äœœć‡œćŒ*時è©Čć‡œćŒæœƒćœšć€–éƒšçš„ćŸ·èĄŒç·’æ± ïŒˆthreadpoolïŒ‰äž­ćŸ·èĄŒïŒŒç„¶ćŸŒç­‰ćŸ…ç”æžœïŒŒè€Œäžæ˜Żç›ŽæŽ„ć‘Œć«ïŒˆć› ç‚șé€™æšŁæœƒé˜»ćĄžäŒșæœć™šïŒ‰ă€‚ +ç•¶äœ äœżç”šäž€èˆŹçš„ `def` è€Œäžæ˜Ż `async def` 漣摊*è·ŻćŸ‘æ“äœœć‡œćŒ*時è©Čć‡œćŒæœƒćœšć€–éƒšçš„ćŸ·èĄŒç·’æ± ïŒˆthreadpoolïŒ‰äž­ćŸ·èĄŒïŒŒç„¶ćŸŒç­‰ćŸ…ç”æžœïŒŒè€Œäžæ˜Żç›ŽæŽ„ć‘Œć«ïŒˆć› ç‚șé€™æšŁæœƒé˜»ćĄžäŒșæœć™šïŒ‰ă€‚ -ćŠ‚æžœäœ äŸ†è‡Șæ–Œć…¶ä»–äžä»„é€™çšźæ–čćŒé‹äœœçš„éžćŒæ­„æĄ†æž¶ïŒŒè€Œäž”äœ çż’æ…Łæ–Œäœżç”šæ™źé€šçš„ `def` ćźšçŸ©ćƒ…é€ČèĄŒç°Ąć–źèšˆçź—çš„*è·ŻćŸ‘æ“äœœć‡œćŒ*ïŒŒç›źçš„æ˜ŻçČćŸ—ćŸźć°çš„æ€§èƒœćąžç›ŠïŒˆć€§çŽ„ 100 ć„ˆç§’ïŒ‰ïŒŒè«‹æłšæ„ïŒŒćœš FastAPI äž­ïŒŒæ•ˆæžœæœƒćźŒć…šç›žćă€‚ćœšé€™äș›æƒ…æłäž‹ïŒŒæœ€ć„œäœżç”š `async def`陀非䜠的*è·ŻćŸ‘æ“äœœć‡œćŒ*ćŸ·èĄŒé˜»ćĄžçš„ I/O çš„çš‹ćŒçąŒă€‚ +ćŠ‚æžœäœ äŸ†è‡Șæ–Œć…¶ä»–äžä»„é€™çšźæ–čćŒé‹äœœçš„éžćŒæ­„æĄ†æž¶ïŒŒè€Œäž”äœ çż’æ…Łæ–Œäœżç”šæ™źé€šçš„ `def` ćźšçŸ©ćƒ…é€ČèĄŒç°Ąć–źèšˆçź—çš„*è·ŻćŸ‘æ“äœœć‡œćŒ*ïŒŒç›źçš„æ˜ŻçČćŸ—ćŸźć°çš„æ•ˆèƒœćąžç›ŠïŒˆć€§çŽ„ 100 ć„ˆç§’ïŒ‰ïŒŒè«‹æłšæ„ïŒŒćœš **FastAPI** äž­ïŒŒæ•ˆæžœæœƒćźŒć…šç›žćă€‚ćœšé€™äș›æƒ…æłäž‹ïŒŒæœ€ć„œäœżç”š `async def`陀非䜠的*è·ŻćŸ‘æ“äœœć‡œćŒ*ćŸ·èĄŒé˜»ćĄžçš„ I/O çš„çš‹ćŒçąŒă€‚ äžéŽïŒŒćœšé€™ć…©çšźæƒ…æłäž‹ïŒŒ**FastAPI** [ä»ç„¶ćŸˆćż«](index.md#performance)ïŒŒè‡łć°‘èˆ‡äœ äč‹ć‰çš„æĄ†æž¶ç›žç•¶ïŒˆæˆ–è€…æ›Žćż«ïŒ‰ă€‚ @@ -427,18 +427,18 @@ StarletteïŒˆć’Œ **FastAPI**ïŒ‰æ˜ŻćŸșæ–Œ [AnyIO](https://anyio.readthedocs.io/en/ ### ć­äŸèłŽé … { #sub-dependencies } -äœ ćŻä»„æ“æœ‰ć€šć€‹ç›žäș’äŸèłŽçš„äŸèłŽé …ć’Œ[ć­äŸèłŽé …](tutorial/dependencies/sub-dependencies.md)䜜ç‚șć‡œćŒćźšçŸ©çš„ćƒæ•žïŒ‰ïŒŒć…¶äž­äž€äș›ćŻèƒœæ˜Żç”š `async def` ćźŁć‘ŠïŒŒäčŸćŻèƒœæ˜Żç”š `def` ćźŁć‘Šă€‚ćźƒć€‘ä»ç„¶ćŻä»„æ­Łćžžé‹äœœïŒŒç”š `def` ćźšçŸ©çš„é‚Łäș›ć°‡æœƒćœšć€–éƒšçš„ćŸ·èĄŒç·’äž­ć‘Œć«ïŒˆäŸ†è‡ȘćŸ·èĄŒç·’æ± ïŒ‰ïŒŒè€Œäžæ˜Żèą«ă€Œç­‰ćŸ…ă€ă€‚ +äœ ćŻä»„æ“æœ‰ć€šć€‹ç›žäș’äŸèłŽçš„äŸèłŽé …ć’Œ[ć­äŸèłŽé …](tutorial/dependencies/sub-dependencies.md)䜜ç‚șć‡œćŒćźšçŸ©çš„ćƒæ•žïŒ‰ïŒŒć…¶äž­äž€äș›ćŻèƒœæ˜Żç”š `async def` ćźŁć‘ŠïŒŒäčŸćŻèƒœæ˜Żç”šäž€èˆŹçš„ `def` ćźŁć‘Šă€‚ćźƒć€‘ä»ç„¶ćŻä»„æ­Łćžžé‹äœœïŒŒç”šäž€èˆŹçš„ `def` ćźšçŸ©çš„é‚Łäș›ć°‡æœƒćœšć€–éƒšçš„ćŸ·èĄŒç·’äž­ć‘Œć«ïŒˆäŸ†è‡ȘćŸ·èĄŒç·’æ± ïŒ‰ïŒŒè€Œäžæ˜Żèą«ă€Œç­‰ćŸ…ă€ă€‚ ### ć…¶ä»–èŒ”ćŠ©ć‡œćŒ { #other-utility-functions } -äœ ćŻä»„ç›ŽæŽ„ć‘Œć«ä»»äœ•äœżç”š `def` 或 `async def` ć»șç«‹çš„ć…¶ä»–èŒ”ćŠ©ć‡œćŒïŒŒFastAPI äžæœƒćœ±éŸżäœ ć‘Œć«ćźƒć€‘çš„æ–čćŒă€‚ +äœ ćŻä»„ç›ŽæŽ„ć‘Œć«ä»»äœ•äœżç”šäž€èˆŹçš„ `def` 或 `async def` ć»șç«‹çš„ć…¶ä»–èŒ”ćŠ©ć‡œćŒïŒŒFastAPI äžæœƒćœ±éŸżäœ ć‘Œć«ćźƒć€‘çš„æ–čćŒă€‚ -這與 FastAPI ç‚șäœ ć‘Œć«*è·ŻćŸ‘æ“äœœć‡œćŒ*ć’ŒäŸèłŽé …çš„é‚èŒŻæœ‰æ‰€äžćŒă€‚ +這與 FastAPI ç‚șäœ ć‘Œć«çš„ć‡œćŒæœ‰æ‰€äžćŒïŒš*è·ŻćŸ‘æ“äœœć‡œćŒ*ć’ŒäŸèłŽé …ă€‚ -ćŠ‚æžœäœ çš„èŒ”ćŠ©ć‡œćŒæ˜Żç”š `def` ćźŁć‘Šçš„ïŒŒćźƒć°‡æœƒèą«ç›ŽæŽ„ć‘Œć«ïŒˆæŒ‰ç…§äœ ćœšçš‹ćŒçąŒäž­æ’°ćŻ«çš„æ–čćŒïŒ‰ïŒŒè€Œäžæ˜ŻćœšćŸ·èĄŒç·’æ± äž­ă€‚ćŠ‚æžœè©Čć‡œćŒæ˜Żç”š `async def` ćźŁć‘ŠïŒŒé‚ŁéșŒäœ ćœšć‘Œć«æ™‚應è©Čäœżç”š `await` ç­‰ćŸ…ć…¶ç”æžœă€‚ +ćŠ‚æžœäœ çš„èŒ”ćŠ©ć‡œćŒæ˜Żç”š `def` ćźŁć‘Šçš„äž€èˆŹć‡œćŒïŒŒćźƒć°‡æœƒèą«ç›ŽæŽ„ć‘Œć«ïŒˆæŒ‰ç…§äœ ćœšçš‹ćŒçąŒäž­æ’°ćŻ«çš„æ–čćŒïŒ‰ïŒŒè€Œäžæ˜ŻćœšćŸ·èĄŒç·’æ± äž­ă€‚ćŠ‚æžœè©Čć‡œćŒæ˜Żç”š `async def` ćźŁć‘ŠïŒŒé‚ŁéșŒäœ ćœšçš‹ćŒçąŒäž­ć‘Œć«ćꃿ™‚應è©Čäœżç”š `await` ç­‰ćŸ…ć…¶ç”æžœă€‚ --- ć†äž€æŹĄćŒ·èȘżïŒŒé€™äș›éƒœæ˜ŻéžćžžæŠ€èĄ“æ€§çš„çŽ°çŻ€ïŒŒćŠ‚æžœäœ ç‰čćœ°ćœšć°‹æ‰Ÿé€™äș›èł‡èšŠïŒŒé€™äș›ć…§ćźčćŻèƒœæœƒć°äœ æœ‰ćč«ćŠ©ă€‚ -ćŠć‰‡ïŒŒćȘ需達ćŸȘäžŠéąæćˆ°çš„æŒ‡ćŒ•ćłćŻïŒšè¶•æ™‚é–“ć—Ž?。 +ćŠć‰‡ïŒŒćȘ需達ćŸȘäžŠéąæćˆ°ç« çŻ€çš„æŒ‡ćŒ•ćłćŻïŒšè¶•æ™‚é–“ć—ŽïŒŸă€‚ diff --git a/docs/zh-hant/docs/deployment/cloud.md b/docs/zh-hant/docs/deployment/cloud.md index 86d216ca6..caf05ec16 100644 --- a/docs/zh-hant/docs/deployment/cloud.md +++ b/docs/zh-hant/docs/deployment/cloud.md @@ -16,7 +16,7 @@ FastAPI Cloud æ˜Ż *FastAPI and friends* 開æșć°ˆæĄˆçš„äž»èŠèŽŠćŠ©èˆ‡èł‡é‡‘æ ## é›Čç«ŻäŸ›æ‡‰ć•† - èŽŠćŠ©ć•† { #cloud-providers-sponsors } -慶他䞀äș›é›Čç«ŻäŸ›æ‡‰ć•†ä蟿œƒ ✹ [**èŽŠćŠ© FastAPI**](../help-fastapi.md#sponsor-the-author) ✹。🙇 +慶他䞀äș›é›Čç«ŻäŸ›æ‡‰ć•†ä蟿œƒ ✹ [**èŽŠćŠ© FastAPI**](https://github.com/sponsors/tiangolo) ✹。🙇 䜠äčŸćŻä»„ćƒè€ƒä»–ć€‘çš„æŒ‡ć—äžŠè©Šç”šć…¶æœć‹™ïŒš diff --git a/docs/zh-hant/docs/deployment/concepts.md b/docs/zh-hant/docs/deployment/concepts.md index 0b8677bfd..070bcf544 100644 --- a/docs/zh-hant/docs/deployment/concepts.md +++ b/docs/zh-hant/docs/deployment/concepts.md @@ -1,5 +1,6 @@ # 郚çœČæŠ‚ćż” { #deployments-concepts } + 當䜠芁郚çœČ侀怋 FastAPI æ‡‰ç”šïŒŒæˆ–ć…¶ćŻŠä»»äœ•éĄžćž‹çš„ Web API 時有ćčŸć€‹äœ ćŻèƒœćœšæ„çš„æŠ‚ćż”ă€‚æŽŒæĄé€™äș›æŠ‚ćż”ćŸŒïŒŒäœ ć°±èƒœæ‰Ÿć‡șæœ€é©ćˆéƒšçœČ䜠應甚的æ–čćŒă€‚ 侀äș›é‡èŠçš„æŠ‚ćż”ćŒ…æ‹ŹïŒš diff --git a/docs/zh-hant/docs/deployment/docker.md b/docs/zh-hant/docs/deployment/docker.md index 650873887..b10299def 100644 --- a/docs/zh-hant/docs/deployment/docker.md +++ b/docs/zh-hant/docs/deployment/docker.md @@ -258,7 +258,7 @@ CMD fastapi run app/main.py --port 80 äœ ćŻä»„ćœš [Docker 關斌 shell 與 exec ćœąćŒçš„æ–‡ä»¶](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form) é–±èź€æ›Žć€šă€‚ -äœżç”š `docker compose` 時這會ç‰čćˆ„æ˜ŽéĄŻă€‚æŠ€èĄ“çŽ°çŻ€è«‹èŠ‹é€™æź” Docker Compose ćžžèŠ‹ć•éĄŒïŒš[ç‚ș什éșŒæˆ‘çš„æœć‹™èŠèŠ± 10 秒才重新ć»șç«‹æˆ–ćœæ­ąïŒŸ](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop) +äœżç”š `docker compose` 時這會ç‰čćˆ„æ˜ŽéĄŻă€‚æŠ€èĄ“çŽ°çŻ€è«‹èŠ‹é€™æź” Docker Compose ćžžèŠ‹ć•éĄŒïŒš[ç‚ș什éșŒæˆ‘çš„æœć‹™èŠèŠ± 10 秒才重新ć»șç«‹æˆ–ćœæ­ąïŒŸ](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop)。 #### ç›źéŒ„ç”æ§‹ { #directory-structure } @@ -454,7 +454,7 @@ Traefik 與 Docker、Kubernetes ç­‰æ•Žćˆè‰Żć„œïŒŒć› æ­€ç‚ș䜠的ćźčć™šèš­ćźšèˆ‡ ## è€‡æœŹ - èĄŒçš‹æ•žé‡ { #replication-number-of-processes } -ćŠ‚æžœäœ ćœšæœ‰ Kubernetes、Docker Swarm Mode、NomadïŒŒæˆ–ć…¶ä»–éĄžäŒŒçš„ćˆ†æ•ŁćŒćźčć™šçźĄç†çł»ç”±çš„ă€Œćąé›†ă€äžŠé‹äœœïŒŒé‚Łäœ ć€§æŠ‚æœƒćžŒæœ›ćœšă€Œćąé›†ć±€çŽšă€è™•ç†ă€Œè€‡æœŹă€ïŒŒè€Œäžæ˜ŻćœšæŻć€‹ćźčć™šć…§äœżç”šă€ŒèĄŒçš‹çźĄç†ć™šă€ïŒˆäŸ‹ćŠ‚ćž¶æœ‰ workers 的 UvicornïŒ‰ă€‚ +ćŠ‚æžœäœ ćœšæœ‰ Kubernetes、Docker Swarm Mode、NomadïŒŒæˆ–ć…¶ä»–éĄžäŒŒçš„ćˆ†æ•ŁćŒćźčć™šçźĄç†çł»ç”±çš„ă€Œćąé›†ă€äžŠé‹äœœïŒŒé‚Łäœ ć€§æŠ‚æœƒćžŒæœ›ćœšă€Œćąé›†ć±€çŽšă€è™•ç†ă€Œè€‡æœŹă€ïŒŒè€Œäžæ˜ŻćœšæŻć€‹ćźčć™šć…§äœżç”šă€ŒèĄŒçš‹çźĄç†ć™šă€ïŒˆäŸ‹ćŠ‚ćž¶æœ‰ workers 的 UvicornïŒ‰ă€‚ 惏 Kubernetes é€™éĄžçš„ćˆ†æ•ŁćŒćźčć™šçźĄç†çł»ç”±ïŒŒé€šćžžć…§ć»șè™•ç†ă€Œćźčć™šè€‡æœŹă€ä»„ćŠæ”ŻæŽé€Čć…„è«‹æ±‚çš„ă€ŒèČ èŒ‰ćčłèĄĄă€çš„èƒœćŠ›â€”â€”ć…šéƒšéƒœćœšă€Œćąé›†ć±€çŽšă€ă€‚ @@ -574,7 +574,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] äœ ć€§æŠ‚ă€Œäžæ‡‰è©Čă€äœżç”šé€™ć€‹ćŸșćș• Docker æ˜ ćƒïŒˆæˆ–ć…¶ä»–éĄžäŒŒçš„ïŒ‰ă€‚ -ćŠ‚æžœäœ äœżç”š KubernetesïŒˆæˆ–ć…¶ä»–ïŒ‰äžŠć·Čćœšćąé›†ć±€çŽšèš­ćźšă€Œè€‡æœŹă€ă€äœżç”šć€šć€‹ă€Œćźč晹」。朹這äș›æƒ…æłäž‹ïŒŒæ›Žć„œçš„ćšæł•æ˜ŻćŠ‚äžŠæ‰€èż°[ćŸžé›¶ć»șçœźæ˜ ćƒ](#build-a-docker-image-for-fastapi)。 +ćŠ‚æžœäœ äœżç”š KubernetesïŒˆæˆ–ć…¶ä»–ïŒ‰äžŠć·Čćœšćąé›†ć±€çŽšèš­ćźšă€Œè€‡æœŹă€ă€äœżç”šć€šć€‹ă€Œćźč晹」。朹這äș›æƒ…æłäž‹ïŒŒæ›Žć„œçš„ćšæł•æ˜ŻćŠ‚äžŠæ‰€èż°ă€ŒćŸžé›¶ć»șçœźæ˜ ćƒă€ïŒš[ç‚ș FastAPI ć»șçœź Docker æ˜ ćƒ](#build-a-docker-image-for-fastapi)。 è‹„äœ éœ€èŠć€šć€‹ workersćȘèŠäœżç”š `--workers` ć‘œä»€ćˆ—éžé …ćłćŻă€‚ diff --git a/docs/zh-hant/docs/deployment/https.md b/docs/zh-hant/docs/deployment/https.md index ddafcb34b..fead5a4b9 100644 --- a/docs/zh-hant/docs/deployment/https.md +++ b/docs/zh-hant/docs/deployment/https.md @@ -1,5 +1,6 @@ # 關斌 HTTPS { #about-https } + äșșć€‘ćŸˆćźč易仄ç‚ș HTTPS ćȘæ˜Żă€Œć•Ÿç”šæˆ–æœȘć•Ÿç”šă€çš„ćŠŸèƒœă€‚ äœ†ćŻŠéš›äžŠè€‡é›œćŸ—ć€šă€‚ diff --git a/docs/zh-hant/docs/deployment/manually.md b/docs/zh-hant/docs/deployment/manually.md index 2260f6942..590d0b011 100644 --- a/docs/zh-hant/docs/deployment/manually.md +++ b/docs/zh-hant/docs/deployment/manually.md @@ -40,7 +40,7 @@ $ fastapi run fastapi run ASGI。FastAPI æ˜Żäž€ć€‹ ASGI ç¶Čé æĄ†æž¶ă€‚ -ćœšé ç«ŻäŒșæœć™šæ©Ÿć™šäžŠćŸ·èĄŒ FastAPI 應甚或任䜕 ASGI æ‡‰ç”šïŒ‰æ‰€éœ€çš„é—œé”æ˜Ż ASGI äŒșæœć™šçš‹ćŒïŒŒäŸ‹ćŠ‚ Uvicorn`fastapi` æŒ‡ä»€é èš­ć°±æ˜Żäœżç”šćźƒă€‚ +ćœšé ç«ŻäŒșæœć™šæ©Ÿć™šäžŠćŸ·èĄŒ **FastAPI** 應甚或任䜕 ASGI æ‡‰ç”šïŒ‰æ‰€éœ€çš„é—œé”æ˜Ż ASGI äŒșæœć™šçš‹ćŒïŒŒäŸ‹ćŠ‚ **Uvicorn**`fastapi` æŒ‡ä»€é èš­ć°±æ˜Żäœżç”šćźƒă€‚ æœ‰æ•žć€‹æ›żä»Łæ–čæĄˆïŒŒćŒ…æ‹ŹïŒš @@ -61,11 +61,11 @@ FastAPI æŽĄç”šć»ș立 Python ç¶Čé æĄ†æž¶èˆ‡äŒșæœć™šçš„æš™æș– è·ŻćŸ‘ă€æ“äœœă€ćƒæ•žă€è«‹æ±‚ć…§æ–‡ă€ćź‰ć…šæ€§ç­‰ćźŁć‘Šă€‚ +* äœżç”š [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) 䟆ć»ș立 APIïŒŒćŒ…ć« è·ŻćŸ‘ æ“äœœă€ćƒæ•žă€è«‹æ±‚ć…§æ–‡ă€ćź‰ć…šæ€§ç­‰ćźŁć‘Šă€‚ * äœżç”š [**JSON Schema**](https://json-schema.org/)ïŒˆć› ç‚ș OpenAPI æœŹèș«ć°±æ˜ŻćŸșæ–Œ JSON Schemaè‡Șć‹•ç”Ÿæˆèł‡æ–™æšĄćž‹æ–‡ä»¶ă€‚ * ç¶“éŽçžćŻ†çš„ç ”ç©¶ćŸŒćœçčžé€™äș›æš™æș–é€ČèĄŒèš­èšˆïŒŒè€Œäžæ˜Żäș‹ćŸŒćœšć·Čæœ‰çł»ç”±äžŠé™„ćŠ çš„äž€ć±€ćŠŸèƒœă€‚ * 這äčŸè꓿ˆ‘ć€‘ćœšć€šçšźèȘžèš€äž­ćŻä»„äœżç”šè‡Ș拕**ç”šæˆ¶ç«Żçš‹ćŒçąŒç”Ÿæˆ**。 ### èƒœć€ è‡Șć‹•ç”Ÿæˆæ–‡ä»¶ { #automatic-docs } -FastAPI 胜生成äș’ć‹•ćŒ API æ–‡ä»¶ć’ŒæŽąçŽąæ€§çš„ Web äœżç”šè€…ä»‹éąă€‚ç”±æ–Œè©ČæĄ†æž¶ćŸșæ–Œ OpenAPIïŒŒć› æ­€æœ‰ć€šçšźéžæ“‡ïŒŒé èš­æäŸ›äș†ć…©çšźă€‚ +äș’ć‹•ćŒ API æ–‡ä»¶èˆ‡æŽąçŽąç”šçš„ Web äœżç”šè€…ä»‹éąă€‚ç”±æ–Œè©ČæĄ†æž¶ćŸșæ–Œ OpenAPIïŒŒć› æ­€æœ‰ć€šçšźéžæ“‡ïŒŒé èš­ćŒ…ć« 2 繼。 * [**Swagger UI**](https://github.com/swagger-api/swagger-ui) 提䟛äș’ć‹•ćŒæŽąçŽąïŒŒèź“äœ ćŻä»„ç›ŽæŽ„ćŸžç€èŠœć™šć‘Œć«äžŠæžŹè©Šäœ çš„ API 。 @@ -27,22 +27,22 @@ FastAPI 胜生成äș’ć‹•ćŒ API æ–‡ä»¶ć’ŒæŽąçŽąæ€§çš„ Web äœżç”šè€…ä»‹éąă€‚ç”± é€™äž€ćˆ‡éƒœćŸș斌暙æș–çš„ **Python ćž‹ćˆ„**ćźŁć‘ŠïŒˆæ„ŸèŹ PydanticïŒ‰ă€‚ç„Ąéœ€ć­žçż’æ–°çš„èȘžæł•ćȘéœ€äœżç”šæš™æș–çš„çŸä»Ł Python。 -ćŠ‚æžœäœ éœ€èŠ 2 ćˆ†é˜äŸ†ć­žçż’ćŠ‚äœ•äœżç”š Python ćž‹ćˆ„ïŒˆćłäœżäœ äžäœżç”š FastAPIïŒ‰ïŒŒćŻä»„çœ‹çœ‹é€™ć€‹ç°ĄçŸ­çš„æ•™ć­žïŒš[Python ćž‹ćˆ„](python-types.md)。 +ćŠ‚æžœäœ éœ€èŠ 2 ćˆ†é˜äŸ†è€‡çż’ćŠ‚äœ•äœżç”š Python ćž‹ćˆ„ïŒˆćłäœżäœ äžäœżç”š FastAPIïŒ‰ïŒŒćŻä»„çœ‹çœ‹é€™ć€‹ç°ĄçŸ­çš„æ•™ć­žïŒš[Python ćž‹ćˆ„](python-types.md)。 -ćŠ‚æžœäœ ćŻ«ćž¶æœ‰ Python ćž‹ćˆ„çš„çš‹ćŒçąŒïŒš +äœ æ’°ćŻ«ćž¶æœ‰ćž‹ćˆ„çš„æš™æș– Python ```Python from datetime import date from pydantic import BaseModel -# ćźŁć‘Šäž€ć€‹èźŠæ•žç‚ș string -# äžŠćœšć‡œćŒäž­çČćŸ— editor support +# ć°‡èźŠæ•žćźŁć‘Šç‚ș str +# äžŠćœšć‡œćŒć…§ć–ćŸ— editor support def main(user_id: str): return user_id -# 漣摊侀怋 Pydantic model +# 侀怋 Pydantic model class User(BaseModel): id: int name: str @@ -65,9 +65,9 @@ my_second_user: User = User(**second_user_data) /// note -`**second_user_data` æ„æ€æ˜Ż: +`**second_user_data` æ„æ€æ˜ŻïŒš -氇 `second_user_data` ć­—ć…žç›ŽæŽ„äœœç‚ș key-value ćŒ•æ•žć‚łéžïŒŒç­‰ćŒæ–ŒïŒš`User(id=4, name="Mary", joined="2018-11-30")` +氇 `second_user_data` dict 的 keys 撌 values 盎掄䜜ç‚ș key-value ćŒ•æ•žć‚łéžïŒŒç­‰ćŒæ–ŒïŒš`User(id=4, name="Mary", joined="2018-11-30")` /// @@ -75,31 +75,31 @@ my_second_user: User = User(**second_user_data) æ•Žć€‹æĄ†æž¶çš„èš­èšˆæ˜Żç‚șäș†èź“äœżç”šèźŠćŸ—ç°Ąć–źäž”ç›Žè§€ïŒŒćœšé–‹ć§‹é–‹ç™Œäč‹ć‰ïŒŒæ‰€æœ‰æ±șç­–éƒœćœšć€šć€‹ç·šèŒŻć™šäžŠé€ČèĄŒäș†æžŹè©ŠïŒŒä»„çąșäżæäŸ›æœ€äœłçš„é–‹ç™Œé«”é©—ă€‚ -ćœšæœ€èż‘çš„ Python 開癌者èȘżæŸ„äž­ïŒŒæˆ‘ć€‘èƒœçœ‹ćˆ°[èą«äœżç”šæœ€ć€šçš„ćŠŸèƒœæ˜Ż autocompletion](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features)。 +朹 Python 開癌者èȘżæŸ„äž­ïŒŒæˆ‘ć€‘èƒœæž…æ„šçœ‹ćˆ°[æœ€ćžžç”šçš„ćŠŸèƒœäč‹äž€æ˜Żă€Œautocompletion」](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features)。 æ•Žć€‹ **FastAPI** æĄ†æž¶ć°±æ˜ŻćŸșæ–Œé€™äž€é»žïŒŒä»»äœ•ćœ°æ–čéƒœćŻä»„é€ČèĄŒè‡Șć‹•èŁœéœŠă€‚ -䜠ćčŸäčŽäžéœ€èŠç¶“ćžžäŸ†ć›žçœ‹æ–‡ä»¶ă€‚ +äœ ćŸˆć°‘éœ€èŠć›žäŸ†æŸ„çœ‹æ–‡ä»¶ă€‚ ćœšé€™èŁĄïŒŒäœ çš„ç·šèŒŻć™šćŻèƒœæœƒé€™æšŁćč«ćŠ©äœ ïŒš -* 朹 [Visual Studio Code](https://code.visualstudio.com/) äž­: +* 朹 [Visual Studio Code](https://code.visualstudio.com/) 䞭 ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) -* 朹 [PyCharm](https://www.jetbrains.com/pycharm/) äž­: +* 朹 [PyCharm](https://www.jetbrains.com/pycharm/) 䞭 ![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) -äœ ć°‡èƒœé€ČèĄŒçš‹ćŒçąŒèŁœéœŠïŒŒé€™æ˜Żćœšäč‹ć‰äœ ćŻèƒœæ›ŸèȘç‚șäžćŻèƒœçš„äș‹ă€‚äŸ‹ćŠ‚ïŒŒè«‹æ±‚ JSON bodyïŒˆćŻèƒœæ˜Żć·ąç‹€çš„ïŒ‰äž­çš„é” `price`。 +äœ ć°‡èƒœé€ČèĄŒçš‹ćŒçąŒèŁœéœŠïŒŒé€™æ˜Żćœšäč‹ć‰äœ ćŻèƒœæ›ŸèȘç‚șäžćŻèƒœçš„äș‹ă€‚äŸ‹ćŠ‚ïŒŒäŸ†è‡Ș請求的 JSON bodyïŒˆćŻèƒœæ˜Żć·ąç‹€çš„ïŒ‰äž­çš„é” `price`。 é€™æšŁæŻ”èŒƒäžæœƒèŒžéŒŻé”ćïŒŒäžç”šäŸ†ć›žçż»çœ‹æ–‡ä»¶ïŒŒäčŸäžç”šäŸ†ć›žæ»Ÿć‹•ć°‹æ‰Ÿäœ æœ€ćŸŒäœżç”šçš„ `username` 或者 `user_name`。 ### ç°Ąæœ” { #short } -FastAPI ç‚ș䜠提䟛äș†**é èš­ć€Œ**ïŒŒèź“äœ äžćż…ćœšćˆæœŸé€ČèĄŒçčç‘Łçš„é…çœźïŒŒäž€ćˆ‡éƒœćŻä»„è‡Șć‹•é‹äœœă€‚ćŠ‚æžœäœ æœ‰æ›Žć…·é«”çš„éœ€æ±‚ïŒŒć‰‡ćŻä»„é€ČèĄŒèȘżæ•Žć’Œè‡ȘćźšçŸ©ă€‚ +柃ç‚șæ‰€æœ‰ć…§ćźčæäŸ›ćˆç†çš„**é èš­ć€Œ**ïŒŒäžŠäž”æŻè™•éƒœćŻéžæ“‡æ€§èš­ćźšă€‚æ‰€æœ‰ćƒæ•žéƒœćŻä»„ćŸźèȘżïŒŒä»„ćźŒæˆäœ éœ€èŠçš„èĄŒç‚șäžŠćźšçŸ©äœ éœ€èŠçš„ API。 -äœ†é èš­æƒ…æłäž‹ïŒŒäž€ćˆ‡éƒœă€Œç›ŽæŽ„ćŻç”šă€ă€‚ +äœ†é èš­æƒ…æłäž‹ïŒŒäž€ćˆ‡éƒœ **ă€Œç›ŽæŽ„ćŻç”šă€**。 ### 驗證 { #validation } @@ -109,47 +109,47 @@ FastAPI ç‚ș䜠提䟛äș†**é èš­ć€Œ**ïŒŒèź“äœ äžćż…ćœšćˆæœŸé€ČèĄŒçčç‘Łçš„配 * 歗äžČ (`str`) æŹ„äœïŒŒćźšçŸ©æœ€ć°æˆ–æœ€ć€§é•·ćșŠă€‚ * æ•žć­— (`int`, `float`) èˆ‡ć…¶æœ€ć€§ć€Œć’Œæœ€ć°ć€Œç­‰ă€‚ -* é©—è­‰ć€–äŸ†çš„ćž‹ćˆ„ïŒŒæŻ”ćŠ‚: - * URL - * Email - * UUID +* 驗證范ç‰čæźŠçš„ćž‹ćˆ„ïŒŒæŻ”ćŠ‚ïŒš + * URL。 + * Email。 + * UUID。 * ...等等。 æ‰€æœ‰çš„é©—è­‰éƒœç”±ćźŒć–„äž”ćŒ·ć€§çš„ **Pydantic** è™•ç†ă€‚ ### ćź‰ć…šæ€§ćŠèș«ä»œé©—è­‰ { #security-and-authentication } -FastAPI ć·Čç¶“æ•Žćˆäș†ćź‰ć…šæ€§ć’Œèș«ä»œé©—è­‰çš„ćŠŸèƒœïŒŒäœ†äžæœƒćŒ·ćˆ¶èˆ‡ç‰čćźšçš„èł‡æ–™ćș«æˆ–èł‡æ–™æšĄćž‹é€ČèĄŒç¶ćźšă€‚ +FastAPI ć·Čç¶“æ•Žćˆäș†ćź‰ć…šæ€§ć’Œèș«ä»œé©—è­‰çš„ćŠŸèƒœă€‚äžéœ€ćœšèł‡æ–™ćș«æˆ–èł‡æ–™æšĄćž‹äžŠćŠ„ć”ă€‚ -OpenAPI äž­ćźšçŸ©çš„ćź‰ć…šæšĄćŒïŒŒćŒ…æ‹ŹïŒš +OpenAPI äž­ćźšçŸ©çš„æ‰€æœ‰ćź‰ć…šæšĄćŒïŒŒćŒ…æ‹ŹïŒš * HTTP ćŸșæœŹèȘè­‰ă€‚ * **OAuth2**äčŸäœżç”š **JWT tokens**ïŒ‰ă€‚ćœš [OAuth2 with JWT](tutorial/security/oauth2-jwt.md) æŸ„çœ‹æ•™ć­žă€‚ * API ćŻ†é‘°ïŒŒćœšïŒš - * 暙頭Header - * æŸ„è©ąćƒæ•ž + * æš™é ­ă€‚ + * æŸ„è©ąćƒæ•žă€‚ * CookiesïŒŒç­‰ç­‰ă€‚ -ćŠ äžŠäŸ†è‡Ș StarletteïŒˆćŒ…æ‹Ź **session cookie**ïŒ‰çš„æ‰€æœ‰ćź‰ć…šç‰čæ€§ă€‚ +ćŠ äžŠäŸ†è‡Ș StarletteïŒˆćŒ…æ‹Ź **session cookies**ïŒ‰çš„æ‰€æœ‰ćź‰ć…šç‰čæ€§ă€‚ -所有的這äș›éƒœæ˜ŻćŻé‡è€‡äœżç”šçš„ć·„ć…·ć’Œć„—ä»¶ïŒŒćŻä»„èŒ•éŹ†èˆ‡äœ çš„çł»ç”±ă€èł‡æ–™ć„Čć­˜ïŒˆData StoresïŒ‰ă€é—œèŻćŒèł‡æ–™ćș«ïŒˆRDBMSïŒ‰ä»„ćŠéžé—œèŻćŒèł‡æ–™ćș«ïŒˆNoSQLïŒ‰ç­‰ç­‰æ•Žćˆă€‚ +所有的這äș›éƒœæ˜ŻćŻé‡è€‡äœżç”šçš„ć·„ć…·ć’Œć…ƒä»¶ïŒŒćŻä»„èŒ•éŹ†èˆ‡äœ çš„çł»ç”±ă€èł‡æ–™ć„Čć­˜ă€é—œèŻćŒć’Œ NoSQL èł‡æ–™ćș«ç­‰æ•Žćˆă€‚ ### äŸèłŽæłšć…„ïŒˆDependency Injection { #dependency-injection } FastAPI æœ‰äž€ć€‹äœżç”šç°Ąć–źïŒŒäœ†æ˜ŻéžćžžćŒ·ć€§çš„ äŸèłŽæłšć…„ 系由。 -* äŸèłŽé …ç”šè‡łćŻä»„æœ‰è‡Șć·±çš„äŸèłŽïŒŒćŸžè€Œćœąæˆäž€ć€‹ć±€çŽšæˆ–**äŸèłŽćœ–**çš„ç”æ§‹ă€‚ +* äŸèłŽé …ç”šè‡łćŻä»„æœ‰è‡Șć·±çš„äŸèłŽïŒŒćŸžè€Œćœąæˆäž€ć€‹ć±€çŽšæˆ–**äŸèłŽé …çš„ă€Œćœ–ă€**ç”æ§‹ă€‚ * 所有**è‡Șć‹•ćŒ–è™•ç†**éƒœç”±æĄ†æž¶ćźŒæˆă€‚ -* äŸèłŽé …äžćƒ…èƒœćŸžè«‹æ±‚äž­æć–èł‡æ–™ïŒŒé‚„èƒœ**氍 API çš„è·ŻćŸ‘æ“äœœé€ČèĄŒćŒ·ćŒ–**䞊è‡Șć‹•ç”Ÿæˆæ–‡æȘ”。 -* ćłäœżæ˜ŻäŸèłŽé …äž­ćźšçŸ©çš„*è·ŻćŸ‘æ“äœœćƒæ•ž*ä蟿œƒ**è‡Ș拕é€ČèĄŒé©—è­‰**。 -* æ”ŻæŒè€‡é›œçš„ç”šæˆ¶èș«ä»œé©—è­‰çł»ç”±ă€**èł‡æ–™ćș«é€ŁæŽ„**等。 -* äžèˆ‡èł‡æ–™ćș«ă€ć‰ç«Żç­‰é€ČèĄŒćŒ·ćˆ¶ç¶ćźšïŒŒäœ†èƒœèŒ•éŹ†æ•Žćˆćźƒć€‘ă€‚ +* æ‰€æœ‰äŸèłŽé …éƒœćŻä»„ćŸžè«‹æ±‚äž­èŠæ±‚èł‡æ–™ïŒŒäžŠ**æ“Žć……è·ŻćŸ‘æ“äœœ**çš„é™ćˆ¶æąä»¶èˆ‡è‡Șć‹•æ–‡ä»¶ă€‚ +* ćłäœżæ˜ŻäŸèłŽé …äž­ćźšçŸ©çš„*è·ŻćŸ‘æ“äœœ*ćƒæ•žïŒŒä蟿œƒ**è‡Ș拕é€ČèĄŒé©—è­‰**。 +* æ”ŻæŽè€‡é›œçš„äœżç”šè€…èș«ä»œé©—è­‰çł»ç”±ă€**èł‡æ–™ćș«é€ŁæŽ„**等。 +* **äžéœ€ćŠ„ć”**èł‡æ–™ćș«ă€ć‰ç«Żç­‰ă€‚äœ†èƒœèŒ•éŹ†æ•Žćˆćźƒć€‘ă€‚ ### ç„Ąé™ćˆ¶ă€Œæ“Žć……ćŠŸèƒœă€ { #unlimited-plug-ins } -或者èȘȘïŒŒç„Ąéœ€ć…¶ä»–éĄć€–é…çœźïŒŒç›ŽæŽ„ć°Žć…„äžŠäœżç”šäœ æ‰€éœ€èŠçš„çš‹ćŒçąŒă€‚ +或者èȘȘïŒŒć…¶ćŻŠäžéœ€èŠćźƒć€‘ïŒŒćŒŻć…„äžŠäœżç”šäœ éœ€èŠçš„çš‹ćŒçąŒćłćŻă€‚ -ä»»äœ•æ•Žćˆéƒœèą«èš­èšˆćŸ—éžćžžç°Ąć–źæ˜“ç”šïŒˆé€šéŽäŸèłŽæłšć…„ïŒ‰ïŒŒäœ ćȘ需甚與*è·ŻćŸ‘æ“äœœ*ç›žćŒçš„ç”æ§‹ć’ŒèȘžæł•ïŒŒç”šć…©èĄŒçš‹ćŒçąŒć°±èƒœç‚șäœ çš„æ‡‰ç”šçš‹ćŒć»șç«‹äž€ć€‹ă€Œæ“Žć……ćŠŸèƒœă€ă€‚ +ä»»äœ•æ•Žćˆéƒœèą«èš­èšˆćŸ—éžćžžç°Ąć–źæ˜“ç”šïŒˆé€šéŽäŸèłŽïŒ‰ïŒŒäœ ćȘ需甚與*è·ŻćŸ‘æ“äœœ*ç›žćŒçš„ç”æ§‹ć’ŒèȘžæł•甚 2 èĄŒçš‹ćŒçąŒć°±èƒœç‚șäœ çš„æ‡‰ç”šçš‹ćŒć»șç«‹äž€ć€‹ă€Œplug-in」。 ### æžŹè©Š { #tested } @@ -159,7 +159,9 @@ FastAPI æœ‰äž€ć€‹äœżç”šç°Ąć–źïŒŒäœ†æ˜ŻéžćžžćŒ·ć€§çš„ ORMs、ODMs。 +盾ćźčćŒ…æ‹ŹćŒæšŁćŸșæ–Œ Pydantic çš„ć€–éƒšć‡œćŒćș«ïŒŒäŸ‹ćŠ‚ç”šæ–Œèł‡æ–™ćș«çš„ ORMs 撌 ODMs。 -這ä蟿„ć‘łè‘—ćœšćŸˆć€šæƒ…æłäž‹ïŒŒäœ ćŻä»„æŠŠćŸžè«‹æ±‚äž­çČćŸ—çš„ç‰©ä»¶**ç›ŽæŽ„ć‚łćˆ°èł‡æ–™ćș«**ïŒŒć› ç‚șæ‰€æœ‰èł‡æ–™éƒœæœƒè‡Ș拕é€ČèĄŒé©—è­‰ă€‚ +這ä蟿„ć‘łè‘—ćœšćŸˆć€šæƒ…æłäž‹ïŒŒäœ ćŻä»„æŠŠćŸžè«‹æ±‚äž­çČćŸ—çš„ç›žćŒç‰©ä»¶**ç›ŽæŽ„ć‚łćˆ°èł‡æ–™ćș«**ïŒŒć› ç‚șæ‰€æœ‰èł‡æ–™éƒœæœƒè‡Ș拕é€ČèĄŒé©—è­‰ă€‚ 揍äč‹äșŠç„¶ïŒŒćœšćŸˆć€šæƒ…æłäž‹ïŒŒäœ äčŸćŻä»„æŠŠćŸžèł‡æ–™ćș«äž­çČć–çš„ç‰©ä»¶**ç›ŽæŽ„ć‚łç”Šćźąæˆ¶ç«Ż**。 通過 **FastAPI** äœ ćŻä»„çČćŸ—æ‰€æœ‰ **Pydantic** 的ç‰č性FastAPI ćŸșæ–Œ Pydantic ずäș†æ‰€æœ‰çš„èł‡æ–™è™•ç†ïŒ‰ïŒš -* **æ›Žç°Ąć–ź** - * äžéœ€èŠć­žçż’æ–°çš„ micro-language äŸ†ćźšçŸ©ç”æ§‹ă€‚ +* **äžć‚·è…Šç­‹** + * äžéœ€èŠć­žçż’æ–°çš„ schema ćźšçŸ© micro-language。 * ćŠ‚æžœäœ çŸ„é“ Python ćž‹ćˆ„ïŒŒäœ ć°±çŸ„é“ćŠ‚äœ•äœżç”š Pydantic。 -* ć’Œäœ çš„ **IDE/linter/brain** éƒœèƒœć„œć„œé…ćˆïŒš - * 曠ç‚ș Pydantic çš„èł‡æ–™ç”æ§‹ć…¶ćŻŠć°±æ˜Żäœ è‡Șć·±ćźšçŸ©çš„éĄžćˆ„ćŻŠäŸ‹ïŒŒæ‰€ä»„è‡Șć‹•èŁœéœŠă€linting、mypy ä»„ćŠäœ çš„ç›ŽèŠșéƒœèƒœćŸˆć„œćœ°ćœšç¶“éŽé©—è­‰çš„èł‡æ–™äžŠç™Œæźäœœç”šă€‚ +* ć’Œäœ çš„ **IDE/linter/brain** éƒœèƒœć„œć„œé…ćˆïŒš + * 曠ç‚ș pydantic çš„èł‡æ–™ç”æ§‹ć…¶ćŻŠć°±æ˜Żäœ è‡Șć·±ćźšçŸ©çš„éĄžćˆ„ćŻŠäŸ‹ïŒŒæ‰€ä»„è‡Șć‹•èŁœéœŠă€linting、mypy ä»„ćŠäœ çš„ç›ŽèŠșéƒœèƒœćŸˆć„œćœ°ćœšç¶“éŽé©—è­‰çš„èł‡æ–™äžŠç™Œæźäœœç”šă€‚ * 驗證**耇雜甐構** - * äœżç”š Pydantic æšĄćž‹æ™‚ïŒŒäœ ćŻä»„æŠŠèł‡æ–™ç”æ§‹ćˆ†ć±€èš­èšˆïŒŒäžŠäž”ç”š Python 的 `List` 撌 `Dict` ç­‰ćž‹ćˆ„äŸ†ćźšçŸ©ă€‚ + * äœżç”šéšŽć±€ćŒ Pydantic æšĄćž‹ă€Python `typing` 的 `List` 撌 `Dict` 等。 * é©—è­‰ć™šèź“æˆ‘ć€‘ćŻä»„èŒ•éŹ†ćœ°ćźšçŸ©ć’ŒæȘ࿟„è€‡é›œçš„èł‡æ–™ç”æ§‹ïŒŒäžŠæŠŠćźƒć€‘èœ‰æ›æˆ JSON Schema é€ČèĄŒèš˜éŒ„ă€‚ - * äœ ćŻä»„æ“æœ‰æ·±ć±€**淹狀的 JSON** ç‰©ä»¶ïŒŒäžŠć°ćźƒć€‘é€ČèĄŒé©—è­‰ć’Œèš»é‡‹ă€‚ -* **ćŻæ“Žć±•** - * Pydantic èź“æˆ‘ć€‘ćŻä»„ćźšçŸ©ćźąèŁœćŒ–çš„èł‡æ–™ćž‹ćˆ„ïŒŒæˆ–è€…äœ ćŻä»„äœżç”šćž¶æœ‰ validator èŁéŁŸć™šçš„æ–čæł•äŸ†æ“Žć±•æšĄćž‹äž­çš„é©—è­‰ćŠŸèƒœă€‚ + * äœ ćŻä»„æ“æœ‰æ·±ć±€**淹狀的 JSON** ç‰©ä»¶ïŒŒäžŠć°ćźƒć€‘é€ČèĄŒé©—è­‰ć’Œèš»è§Łă€‚ +* **ćŻæ“Žć……** + * Pydantic èź“æˆ‘ć€‘ćŻä»„ćźšçŸ©ćźąèŁœćŒ–çš„èł‡æ–™ćž‹ćˆ„ïŒŒæˆ–è€…äœ ćŻä»„äœżç”šćž¶æœ‰ validator èŁéŁŸć™šçš„æ–čæł•äŸ†æ“Žć……æšĄćž‹äž­çš„é©—è­‰ćŠŸèƒœă€‚ * 100% æžŹè©ŠèŠ†è“‹çŽ‡ă€‚ diff --git a/docs/zh-hant/docs/help-fastapi.md b/docs/zh-hant/docs/help-fastapi.md index 69af48a56..4a4a4fda5 100644 --- a/docs/zh-hant/docs/help-fastapi.md +++ b/docs/zh-hant/docs/help-fastapi.md @@ -1,5 +1,6 @@ # ć”ćŠ© { #help } + äœ æƒłèŠć”ćŠ© FastAPIïŒŒæˆ–ć–ćŸ—é—œæ–Œ FastAPI çš„ć”ćŠ©ć—ŽïŒŸ 有䞀äș›éžćžžç°Ąć–źçš„æ–čćŒćŻä»„æäŸ›ć”ćŠ©äžŠć–ćŸ—ć”ćŠ©ă€‚ diff --git a/docs/zh-hant/docs/how-to/configure-swagger-ui.md b/docs/zh-hant/docs/how-to/configure-swagger-ui.md index cbb63ef5e..37d9487b4 100644 --- a/docs/zh-hant/docs/how-to/configure-swagger-ui.md +++ b/docs/zh-hant/docs/how-to/configure-swagger-ui.md @@ -65,6 +65,6 @@ presets: [ ] ``` -這äș›æ˜Ż JavaScript ç‰©ä»¶ïŒŒè€Œäžæ˜Żć­—äžČïŒŒć› æ­€ç„Ąæł•ç›ŽæŽ„ćŸž Python çš‹ćŒçąŒć‚łéžă€‚ +這äș›æ˜Ż **JavaScript** ç‰©ä»¶ïŒŒè€Œäžæ˜Żć­—äžČïŒŒć› æ­€ç„Ąæł•ç›ŽæŽ„ćŸž Python çš‹ćŒçąŒć‚łéžă€‚ -è‹„éœ€èŠäœżç”šé€™éĄžćƒ…é™ JavaScript çš„èš­ćźšïŒŒäœ ćŻä»„äœżç”šäžŠéąä»‹çŽč的æ–čæł•ïŒšèŠ†ćŻ«æ‰€æœ‰ Swagger UI çš„è·ŻćŸ‘æ“äœœïŒˆpath operationïŒ‰ïŒŒäžŠæ‰‹ć‹•æ’°ćŻ«æ‰€éœ€çš„ JavaScript。 +è‹„éœ€èŠäœżç”šé€™éĄžćƒ…é™ JavaScript çš„èš­ćźšïŒŒäœ ćŻä»„äœżç”šäžŠèż°ć…¶äž­äž€çšźæ–čæł•ă€‚èŠ†ćŻ«æ•Žć€‹ Swagger UI *è·ŻćŸ‘æ“äœœ*ïŒŒäžŠæ‰‹ć‹•æ’°ćŻ«æ‰€éœ€çš„ JavaScript。 diff --git a/docs/zh-hant/docs/how-to/custom-request-and-route.md b/docs/zh-hant/docs/how-to/custom-request-and-route.md index 00031fcaa..afd097f51 100644 --- a/docs/zh-hant/docs/how-to/custom-request-and-route.md +++ b/docs/zh-hant/docs/how-to/custom-request-and-route.md @@ -104,6 +104,6 @@ {* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[26] *} -ćœšæ­€çŻ„äŸ‹äž­ïŒŒ`router` ćș•äž‹çš„è·ŻćŸ‘æ“äœœæœƒäœżç”šè‡Ș蚂的 `TimedRoute` éĄžćˆ„ïŒŒäžŠćœšć›žæ‡‰äž­ć€šćŠ äžŠäž€ć€‹ `X-Response-Time` 暙頭暙ç€ș由生è©Čć›žæ‡‰æ‰€èŠ±èČ»çš„æ™‚é–“ïŒš +ćœšæ­€çŻ„äŸ‹äž­ïŒŒ`router` ćș•䞋的 *è·ŻćŸ‘æ“äœœ* æœƒäœżç”šè‡Ș蚂的 `TimedRoute` éĄžćˆ„ïŒŒäžŠćœšć›žæ‡‰äž­ć€šćŠ äžŠäž€ć€‹ `X-Response-Time` 暙頭暙ç€ș由生è©Čć›žæ‡‰æ‰€èŠ±èČ»çš„æ™‚é–“ïŒš {* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[13:20] *} diff --git a/docs/zh-hant/docs/how-to/graphql.md b/docs/zh-hant/docs/how-to/graphql.md index 24e4d8979..fce5f4119 100644 --- a/docs/zh-hant/docs/how-to/graphql.md +++ b/docs/zh-hant/docs/how-to/graphql.md @@ -1,22 +1,22 @@ # GraphQL { #graphql } -由斌 FastAPI ćŸșæ–Œ ASGI æš™æș–ïŒŒæ•Žćˆä»»äœ•èˆ‡ ASGI 盾ćźč的 GraphQL ć‡œćŒćș«éƒœćŸˆćźčæ˜“ă€‚ +由斌 **FastAPI** ćŸșæ–Œ **ASGI** æš™æș–ïŒŒæ•Žćˆä»»äœ•äčŸç›žćźčæ–Œ ASGI 的 **GraphQL** ć‡œćŒćș«éƒœćŸˆćźčæ˜“ă€‚ -äœ ćŻä»„ćœšćŒäž€ć€‹æ‡‰ç”šçš‹ćŒäž­ćŒæ™‚äœżç”šäž€èˆŹçš„ FastAPI è·ŻćŸ‘æ“äœœ (path operation) 與 GraphQL。 +äœ ćŻä»„ćœšćŒäž€ć€‹æ‡‰ç”šçš‹ćŒäž­ćŒæ™‚äœżç”šäž€èˆŹçš„ FastAPI *è·ŻćŸ‘æ“äœœ (path operation)* 與 GraphQL。 /// tip -GraphQL è§Łæ±ș某äș›éžćžžç‰čćźšçš„äœżç”šæƒ…ćąƒă€‚ +**GraphQL** è§Łæ±ș某äș›éžćžžç‰čćźšçš„äœżç”šæƒ…ćąƒă€‚ -èˆ‡äž€èˆŹçš„ Web API ç›žæŻ”ïŒŒćźƒæœ‰ć„Ș點ä蟿œ‰çŒș點。 +èˆ‡äž€èˆŹçš„ **Web API** ç›žæŻ”ïŒŒćźƒæœ‰**ć„Ș點**ä蟿œ‰**çŒș點**。 -請çąșèȘćœšäœ çš„äœżç”šæƒ…ćąƒäž­ïŒŒé€™äș›æ•ˆç›Šæ˜ŻćŠè¶łä»„ćœŒèŁœć…¶é™ćˆ¶ă€‚ đŸ€“ +請çąșèȘćœšäœ çš„äœżç”šæƒ…ćąƒäž­ïŒŒé€™äș›**效益**æ˜ŻćŠè¶łä»„ćœŒèŁœć…¶**é™ćˆ¶**。 đŸ€“ /// ## GraphQL ć‡œćŒćș« { #graphql-libraries } -äž‹éąæ˜Żæ”ŻæŽ ASGI 的郹戆 GraphQL ć‡œćŒćș«ïŒŒäœ ćŻä»„與 FastAPI äž€è”·äœżç”šïŒš +äž‹éąæ˜Żæ”ŻæŽ **ASGI** 的郹戆 **GraphQL** ć‡œćŒćș«ïŒŒäœ ćŻä»„與 **FastAPI** äž€è”·äœżç”šïŒš * [Strawberry](https://strawberry.rocks/) 🍓 * 提䟛 [FastAPI 文件](https://strawberry.rocks/docs/integrations/fastapi) @@ -29,9 +29,9 @@ GraphQL è§Łæ±ș某äș›éžćžžç‰čćźšçš„äœżç”šæƒ…ćąƒă€‚ ## äœżç”š Strawberry 的 GraphQL { #graphql-with-strawberry } -ćŠ‚æžœäœ éœ€èŠæˆ–æƒłäœżç”š GraphQL[Strawberry](https://strawberry.rocks/) æ˜ŻæŽšè–Šçš„ć‡œćŒćș«ïŒŒć› ç‚șćźƒçš„èš­èšˆèˆ‡ FastAPI æœ€æŽ„èż‘ïŒŒć…šéƒšéƒœćŸșæ–Œćž‹ćˆ„èš»è§Ł (type annotations)。 +ćŠ‚æžœäœ éœ€èŠæˆ–æƒłäœżç”š **GraphQL**[**Strawberry**](https://strawberry.rocks/) æ˜Ż**掚薊的**ć‡œćŒćș«ïŒŒć› ç‚șćźƒçš„èš­èšˆæœ€æŽ„èż‘ **FastAPI** çš„èš­èšˆïŒŒć…šéƒšéƒœćŸșæ–Œ**ćž‹ćˆ„èš»è§Ł**。 -èŠ–äœ çš„äœżç”šæƒ…ćąƒè€ŒćźšïŒŒäœ ćŻèƒœæœƒćć„œć…¶ä»–ć‡œćŒćș«ïŒŒäœ†ćŠ‚æžœäœ ć•æˆ‘ïŒŒæˆ‘ć€§æŠ‚æœƒć»șè­°äœ ć…ˆè©Šè©Š Strawberry。 +èŠ–äœ çš„äœżç”šæƒ…ćąƒè€ŒćźšïŒŒäœ ćŻèƒœæœƒćć„œć…¶ä»–ć‡œćŒćș«ïŒŒäœ†ćŠ‚æžœäœ ć•æˆ‘ïŒŒæˆ‘ć€§æŠ‚æœƒć»șè­°äœ ć…ˆè©Šè©Š **Strawberry**。 ä»„äž‹æ˜ŻćŠ‚äœ•ć°‡ Strawberry 與 FastAPI æ•Žćˆçš„äž€ć€‹ć°äŸ‹ć­ïŒš @@ -45,7 +45,7 @@ GraphQL è§Łæ±ș某äș›éžćžžç‰čćźšçš„äœżç”šæƒ…ćąƒă€‚ æ—©æœŸç‰ˆæœŹçš„ Starlette 提䟛 `GraphQLApp` éĄžćˆ„ä»„æ•Žćˆ [Graphene](https://graphene-python.org/)。 -柃ć·Č朹 Starlette äž­èą«æŁ„ç”šïŒŒäœ†ćŠ‚æžœäœ çš„çš‹ćŒçąŒäœżç”šäș†ćźƒïŒŒćŻä»„èŒ•éŹ†é·ç§»ćˆ° [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3)ïŒŒæ¶”è“‹ç›žćŒçš„äœżç”šæƒ…ćąƒïŒŒäž”ä»‹éąćčŸäčŽç›žćŒă€‚ +柃ć·Č朹 Starlette äž­èą«æŁ„ç”šïŒŒäœ†ćŠ‚æžœäœ çš„çš‹ćŒçąŒäœżç”šäș†ćźƒïŒŒćŻä»„èŒ•éŹ†**遷移**戰 [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3)ïŒŒæ¶”è“‹ç›žćŒçš„äœżç”šæƒ…ćąƒïŒŒäž”ä»‹éą**ćčŸäčŽç›žćŒ**。 /// tip @@ -55,6 +55,6 @@ GraphQL è§Łæ±ș某äș›éžćžžç‰čćźšçš„äœżç”šæƒ…ćąƒă€‚ ## é€Č䞀歄äș†è§Ł { #learn-more } -äœ ćŻä»„ćœš [柘æ–č GraphQL 文件](https://graphql.org/) äž­é€Č䞀歄äș†è§Ł GraphQL。 +äœ ćŻä»„ćœš [柘æ–č GraphQL 文件](https://graphql.org/) äž­é€Č䞀歄äș†è§Ł **GraphQL**。 䜠äčŸćŻä»„é€éŽäžŠèż°é€Łç”é–±èź€ć„ć€‹ć‡œćŒćș«çš„æ›Žć€šć…§ćźč。 diff --git a/docs/zh-hant/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/zh-hant/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md index 4495e3dd7..77a58251e 100644 --- a/docs/zh-hant/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md +++ b/docs/zh-hant/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -8,6 +8,8 @@ FastAPI 0.119.0 透過 Pydantic v2 慧的 `pydantic.v1` æäŸ›ć° Pydantic v1 FastAPI 0.126.0 移陀äș†ć° Pydantic v1 çš„æ”ŻæŽïŒŒäœ†ćœšäž€æź”æ™‚é–“ć…§ä»æ”ŻæŽ `pydantic.v1`。 +FastAPI 0.128.0 äčŸç§»é™€äș†ć° `pydantic.v1` çš„æ”ŻæŽïŒŒć› æ­€æœ€æ–°ç‰ˆæœŹçš„ FastAPI 需芁 Pydantic v2。 + /// warning Pydantic 㜘隊è‡Ș **Python 3.14** 蔷ć·Čćœæ­ąćœšæœ€æ–°çš„ Python ç‰ˆæœŹäž­æ”ŻæŽ Pydantic v1。 @@ -46,7 +48,7 @@ Pydantic æäŸ›ćŸž v1 遷移戰 v2 的漘æ–č[é·ç§»æŒ‡ć—](https://docs.pydantic ## v2 侭的 Pydantic v1 { #pydantic-v1-in-v2 } -Pydantic v2 ć…§ć«ć­æšĄç”„ `pydantic.v1`提䟛 Pydantic v1 çš„æ‰€æœ‰ć…§ćźčă€‚äœ†ćœš Python 3.13 ä»„äžŠç‰ˆæœŹäžć†æ”ŻæŽă€‚ +Pydantic v2 ć…§ć«ć­æšĄç”„ `pydantic.v1`提䟛 Pydantic v1 çš„æ‰€æœ‰ć…§ćźčă€‚äœ†ćœš Python 3.13 äč‹ćŸŒçš„ç‰ˆæœŹäžć†æ”ŻæŽă€‚ é€™èĄšç€șäœ ćŻä»„ćź‰èŁæœ€æ–°çš„ Pydantic v2ïŒŒäžŠćŸžè©Čć­æšĄç”„ćŒŻć…„äžŠäœżç”šèˆŠçš„ Pydantic v1 ć…ƒä»¶ïŒŒć°±ćƒćź‰èŁäș†èˆŠç‰ˆ Pydantic v1 äž€æšŁă€‚ @@ -54,6 +56,16 @@ Pydantic v2 ć…§ć«ć­æšĄç”„ `pydantic.v1`提䟛 Pydantic v1 çš„æ‰€æœ‰ć…§ćźč ### FastAPI 氍 v2 äž­ Pydantic v1 çš„æ”ŻæŽ { #fastapi-support-for-pydantic-v1-in-v2 } +/// warning + +FastAPI 氍 `pydantic.v1` æšĄćž‹çš„æ”ŻæŽæ˜Żćœš **FastAPI 0.119.0** ćŠ ć…„ïŒŒäžŠćœš **FastAPI 0.128.0** ç§»é™€ă€‚é€™ćŽŸæœŹæ˜Żç‚șäș†é·ç§»ćˆ° Pydantic v2 è€ŒæäŸ›çš„è‡šæ™‚ć”ćŠ©ă€‚ + +ćœšç›źć‰ç‰ˆæœŹçš„ FastAPI äž­ïŒŒćœšäœ çš„æ‡‰ç”šäœżç”š `pydantic.v1` æšĄćž‹æœƒćŒ•ç™ŒéŒŻèȘ€ă€‚ + +æœŹçŻ€ć…¶é€˜ć…§ćźčæèż°çš„æ˜ŻćȘ朹那äș›èŒƒèˆŠç‰ˆæœŹäž­ćŻç”šçš„è‡šæ™‚æ”ŻæŽă€‚ + +/// + è‡Ș FastAPI 0.119.0 蔷ä蟿”ŻæŽé€éŽ Pydantic v2 慧的 Pydantic v1ïŒˆéƒšćˆ†ïŒ‰ä»„ć”ćŠ©é·ç§»è‡ł v2。 ć› æ­€ïŒŒäœ ćŻä»„ć…ˆć‡çŽšćˆ°æœ€æ–°çš„ Pydantic v2ïŒŒäžŠć°‡ćŒŻć…„æ”čç‚șäœżç”š `pydantic.v1` ć­æšĄç”„ïŒŒćœšć€šæ•žæƒ…æłäž‹ćłćŻæ­Łćžžé‹äœœă€‚ @@ -122,6 +134,12 @@ graph TB ### ćˆ†æ­„é·ç§» { #migrate-in-steps } +/// warning + +ä»„äž‹æèż°çš„ïŒŒćœšćŒäž€æ‡‰ç”šäž­ćŒæ™‚äœżç”š Pydantic v1 與 v2 æšĄćž‹é€ČèĄŒæŒžé€ČćŒé·ç§»ïŒŒćȘ適甚斌 **FastAPI 0.119.0 戰 0.127.x**ă€‚é€™é …æ”ŻæŽć·Č朹 **FastAPI 0.128.0** ç§»é™€ïŒŒæœ€æ–°ç‰ˆæœŹéœ€èŠ **Pydantic v2** æšĄćž‹ă€‚ + +/// + /// tip ć…ˆć˜—è©Šäœżç”š `bump-pydantic`ïŒŒćŠ‚æžœæžŹè©Šé€šéŽäž”äž€ćˆ‡æ­ŁćžžïŒŒäœ ć°±èƒœç”šäž€æąæŒ‡ä»€ćźŒæˆé·ç§»ă€‚âœš diff --git a/docs/zh-hant/docs/how-to/separate-openapi-schemas.md b/docs/zh-hant/docs/how-to/separate-openapi-schemas.md index 12fb7b8e8..72a806b4c 100644 --- a/docs/zh-hant/docs/how-to/separate-openapi-schemas.md +++ b/docs/zh-hant/docs/how-to/separate-openapi-schemas.md @@ -1,8 +1,8 @@ # æ˜ŻćŠć°‡èŒžć…„èˆ‡èŒžć‡șäœżç”šäžćŒçš„ OpenAPI ç”æ§‹æèż° { #separate-openapi-schemas-for-input-and-output-or-not } -è‡ȘćŸž Pydantic v2 ç™ŒäœˆćŸŒïŒŒç”Ÿæˆçš„ OpenAPI æŻ”ä»„ćŸ€æ›ŽçČŸçąșä蟿›Žæ­Łçąș。😎 +è‡ȘćŸž **Pydantic v2** ç™ŒäœˆćŸŒïŒŒç”Ÿæˆçš„ OpenAPI æŻ”ä»„ćŸ€æ›ŽçČŸçąșä蟿›Ž**æ­Łçąș**。😎 -ćŻŠéš›äžŠïŒŒćœšæŸäș›æƒ…æłäž‹ïŒŒćŒäž€ć€‹ Pydantic æšĄćž‹ćœš OpenAPI äž­æœƒćŒæ™‚æœ‰ć…©ć€‹ JSON SchemaïŒšćˆ†ćˆ„ç”šæ–ŒèŒžć…„èˆ‡èŒžć‡șïŒŒé€™ć–æ±șæ–Œćźƒæ˜ŻćŠæœ‰é èš­ć€Œă€‚ +ćŻŠéš›äžŠïŒŒćœšæŸäș›æƒ…æłäž‹ïŒŒćŒäž€ć€‹ Pydantic æšĄćž‹ćœš OpenAPI äž­æœƒćŒæ™‚æœ‰**慩怋 JSON Schema**ïŒšćˆ†ćˆ„ç”šæ–ŒèŒžć…„èˆ‡èŒžć‡șïŒŒé€™ć–æ±șæ–Œćźƒæ˜ŻćŠæœ‰**é èš­ć€Œ**。 äŸ†çœ‹çœ‹ćźƒćŠ‚äœ•é‹äœœïŒŒä»„ćŠè‹„éœ€èŠæ™‚è©ČćŠ‚äœ•èȘżæ•Žă€‚ @@ -18,11 +18,11 @@ {* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:15] hl[14] *} -...扇 `description` æŹ„äœć°‡äžæ˜Żćż…ćĄ«ă€‚ć› ç‚șćźƒçš„é èš­ć€Œæ˜Ż `None`。 +...扇 `description` æŹ„äœć°‡**äžæ˜Żćż…ćĄ«**。曠ç‚șćźƒçš„é èš­ć€Œæ˜Ż `None`。 ### æ–‡ä»¶äž­çš„èŒžć…„æšĄćž‹ { #input-model-in-docs } -äœ ćŻä»„ćœšæ–‡ä»¶äž­çąșèȘïŒŒ`description` æŹ„äœæČ’有玅è‰Čæ˜Ÿè™ŸïŒŒèĄšç€șäžæ˜Żćż…ćĄ«ïŒš +äœ ćŻä»„ćœšæ–‡ä»¶äž­çąșèȘïŒŒ`description` æŹ„äœæČ’有**箅è‰Č星號**ïŒŒèĄšç€șäžæ˜Żćż…ćĄ«ïŒš
@@ -34,7 +34,7 @@ {* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py hl[19] *} -...由斌 `description` æœ‰é èš­ć€ŒïŒŒć°±çź—äœ æČ’有ç‚șè©ČæŹ„äœć›žć‚łä»»äœ•ć…§ćźčïŒŒćźƒä»æœƒæœ‰é‚Łć€‹é èš­ć€Œă€‚ +...由斌 `description` æœ‰é èš­ć€ŒïŒŒć°±çź—äœ **æČ’有ç‚șè©ČæŹ„äœć›žć‚łä»»äœ•ć…§ćźč**ïŒŒćźƒä»æœƒæœ‰é‚Łć€‹**é èš­ć€Œ**。 ### 茞ć‡șć›žæ‡‰èł‡æ–™çš„æšĄćž‹ { #model-for-output-response-data } @@ -44,20 +44,20 @@
-é€™ä»ŁèĄšè©ČæŹ„äœäž€ćźšæœƒæœ‰ć€ŒïŒŒćȘæ˜Żæœ‰æ™‚ć€™ć€ŒćŻèƒœæ˜Ż `None`ïŒˆćœš JSON äž­ç‚ș `null`ïŒ‰ă€‚ +é€™ä»ŁèĄšè©ČæŹ„äœ**äž€ćźšæœƒæœ‰ć€Œ**ćȘæ˜Żæœ‰æ™‚ć€™ć€ŒćŻèƒœæ˜Ż `None`ïŒˆćœš JSON äž­ç‚ș `null`ïŒ‰ă€‚ -ć› æ­€ïŒŒäœżç”šäœ  API çš„ç”šæˆ¶ç«Żäžćż…æȘ࿟„ć€Œæ˜ŻćŠć­˜ćœšïŒŒćŻä»„ć‡èš­è©ČæŹ„äœäž€ćźšć­˜ćœšïŒ›ćȘæ˜Żæœ‰äș›æƒ…æłäž‹ćźƒçš„ć€Œæœƒæ˜Żé èš­çš„ `None`。 +ć› æ­€ïŒŒäœżç”šäœ  API çš„ç”šæˆ¶ç«Żäžćż…æȘ࿟„ć€Œæ˜ŻćŠć­˜ćœšïŒŒćŻä»„**ć‡èš­è©ČæŹ„äœäž€ćźšć­˜ćœš**ćȘæ˜Żæœ‰äș›æƒ…æłäž‹ćźƒçš„ć€Œæœƒæ˜Żé èš­çš„ `None`。 -朹 OpenAPI äž­ïŒŒæèż°é€™çšźæƒ…æłçš„æ–čćŒæ˜Żć°‡è©ČæŹ„äœæš™èš˜ç‚șćż…ćĄ«ïŒŒć› ç‚ș漃侀漚歘朹。 +朹 OpenAPI äž­ïŒŒæèż°é€™çšźæƒ…æłçš„æ–čćŒæ˜Żć°‡è©ČæŹ„äœæš™èš˜ç‚ș**濅楫**ïŒŒć› ç‚ș漃侀漚歘朹。 -ć› æ­€ïŒŒćŒäž€ć€‹æšĄćž‹çš„ JSON Schema æœƒäŸç”šæ–ŒèŒžć…„æˆ–èŒžć‡șè€ŒäžćŒïŒš +ć› æ­€ïŒŒćŒäž€ć€‹æšĄćž‹çš„ JSON Schema 會䟝甚斌**èŒžć…„æˆ–èŒžć‡ș**è€ŒäžćŒïŒš -- ç”šæ–ŒèŒžć…„æ™‚ïŒŒ`description` äžæ˜Żćż…ćĄ« -- 甚斌茞ć‡ș時`description` æ˜Żćż…ćĄ«ïŒˆäž”ćŻèƒœç‚ș `None`ïŒŒćœš JSON äž­ç‚ș `null` +* 甚斌**èŒžć…„**時`description` **äžæ˜Żćż…ćĄ«** +* 甚斌**茞ć‡ș**時`description` æ˜Ż**濅楫**ïŒˆäž”ćŻèƒœç‚ș `None`ïŒŒćœš JSON äž­ç‚ș `null` ### 文件䞭的茞ć‡șæšĄćž‹ { #model-for-output-in-docs } -䜠äčŸćŻä»„ćœšæ–‡ä»¶äž­æȘąèŠ–èŒžć‡șæšĄćž‹ïŒŒ`name` 與 `description` 郜仄玅è‰Č星號暙ç€șç‚șćż…ćĄ«ïŒš +䜠äčŸćŻä»„ćœšæ–‡ä»¶äž­æȘąèŠ–èŒžć‡șæšĄćž‹ïŒŒ`name` 與 `description` **ć…©è€…**郜仄**箅è‰Č星號**æš™ç€șç‚ș**濅楫**
@@ -67,23 +67,23 @@ ćŠ‚æžœäœ æŸ„çœ‹ OpenAPI äž­æ‰€æœ‰ćŻç”šçš„ç”æ§‹æèż°ïŒˆJSON SchemaïŒ‰ïŒŒæœƒçœ‹ćˆ°æœ‰ć…©ć€‹ïŒš`Item-Input` 與 `Item-Output`。 -ć°æ–Œ `Item-Input``description` äžæ˜Żćż…ćĄ«ïŒŒæČ’有玅è‰Čæ˜Ÿè™Ÿă€‚ +ć°æ–Œ `Item-Input``description` **äžæ˜Żćż…ćĄ«**æČ’有玅è‰Čæ˜Ÿè™Ÿă€‚ -äœ†ć°æ–Œ `Item-Output``description` æ˜Żćż…ćĄ«ïŒŒæœ‰çŽ…è‰Čæ˜Ÿè™Ÿă€‚ +äœ†ć°æ–Œ `Item-Output``description` æ˜Ż**濅楫**有玅è‰Čæ˜Ÿè™Ÿă€‚
-有äș† Pydantic v2 的這怋ç‰č性䜠的 API 文件會曎çČŸçąș苄䜠有è‡Șć‹•ç”ąç”Ÿçš„ç”šæˆ¶ç«Żèˆ‡ SDKïŒŒćźƒć€‘ä蟿œƒæ›ŽçČŸçąșïŒŒæäŸ›æ›Žć„œçš„é–‹ç™Œè€…é«”é©—èˆ‡äž€è‡Žæ€§ă€‚đŸŽ‰ +有äș† **Pydantic v2** 的這怋ç‰č性䜠的 API 文件會曎**çČŸçąș**苄䜠有è‡Șć‹•ç”ąç”Ÿçš„ç”šæˆ¶ç«Żèˆ‡ SDKïŒŒćźƒć€‘ä蟿œƒæ›ŽçČŸçąșïŒŒæäŸ›æ›Žć„œçš„**開癌者體驗**èˆ‡äž€è‡Žæ€§ă€‚đŸŽ‰ ## äžèŠćˆ†é–‹ç”æ§‹æèż° { #do-not-separate-schemas } -äžéŽïŒŒćœšæŸäș›æƒ…æłäž‹ïŒŒäœ ćŻèƒœæœƒćžŒæœ›èŒžć…„與茞ć‡șäœżç”šç›žćŒçš„ç”æ§‹æèż°ă€‚ +äžéŽïŒŒćœšæŸäș›æƒ…æłäž‹ïŒŒäœ ćŻèƒœæœƒćžŒæœ›**èŒžć…„èˆ‡èŒžć‡șäœżç”šç›žćŒçš„ç”æ§‹æèż°**。 æœ€ćžžèŠ‹çš„æƒ…ćąƒæ˜ŻïŒšäœ ć·Č經有䞀äș›è‡Șć‹•ç”ąç”Ÿçš„ç”šæˆ¶ç«Żçš‹ćŒçąŒïŒSDKïŒŒç›źć‰é‚„äžæƒłć…šéƒšæ›Žæ–°ïŒ›äčŸèš±äč‹ćŸŒæœƒćšïŒŒäœ†äžæ˜ŻçŸćœšă€‚ -ćœšé€™çšźæƒ…æłäž‹ïŒŒäœ ćŻä»„ćœš FastAPI äž­é€éŽćƒæ•ž `separate_input_output_schemas=False` ćœç”šé€™ć€‹ćŠŸèƒœă€‚ +ćœšé€™çšźæƒ…æłäž‹ïŒŒäœ ćŻä»„ćœš **FastAPI** äž­é€éŽćƒæ•ž `separate_input_output_schemas=False` ćœç”šé€™ć€‹ćŠŸèƒœă€‚ /// note @@ -95,7 +95,7 @@ ### æ–‡ä»¶äž­èŒžć…„èˆ‡èŒžć‡șäœżç”šç›žćŒç”æ§‹æèż°çš„æšĄćž‹ { #same-schema-for-input-and-output-models-in-docs } -æ­€æ™‚èŒžć…„èˆ‡èŒžć‡șć°‡ć…±ç”šćŒäž€ć€‹æšĄćž‹ç”æ§‹æèż°ïŒŒćȘ有 `Item`ïŒŒć…¶äž­ `description` äžæ˜Żćż…ćĄ«ïŒš +æ­€æ™‚èŒžć…„èˆ‡èŒžć‡șć°‡ć…±ç”šćŒäž€ć€‹æšĄćž‹ç”æ§‹æèż°ïŒŒćȘ有 `Item`ïŒŒć…¶äž­ `description` **äžæ˜Żćż…ćĄ«**
diff --git a/docs/zh-hant/docs/index.md b/docs/zh-hant/docs/index.md index 5a45a69c7..743357b96 100644 --- a/docs/zh-hant/docs/index.md +++ b/docs/zh-hant/docs/index.md @@ -277,7 +277,7 @@ INFO: Application startup complete.
關斌指什 fastapi dev... -指什 `fastapi dev` æœƒèź€ć–äœ çš„ `main.py`ïŒŒć”æžŹć…¶äž­çš„ **FastAPI** æ‡‰ç”šïŒŒäžŠäœżç”š [Uvicorn](https://www.uvicorn.dev) 敟拕äŒșæœć™šă€‚ +指什 `fastapi dev` 會è‡Șć‹•èź€ć–äœ çš„ `main.py`ïŒŒć”æžŹć…¶äž­çš„ **FastAPI** æ‡‰ç”šïŒŒäžŠäœżç”š [Uvicorn](https://www.uvicorn.dev) 敟拕äŒșæœć™šă€‚ é èš­æƒ…æłäž‹ïŒŒ`fastapi dev` æœƒćœšæœŹæ©Ÿé–‹ç™Œæ™‚ć•Ÿç”šè‡Șć‹•é‡æ–°èŒ‰ć…„ă€‚ @@ -473,7 +473,7 @@ item: Item ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) -è‹„æƒłçœ‹ćŒ…ć«æ›Žć€šćŠŸèƒœçš„ćźŒæ•ŽçŻ„äŸ‹ïŒŒè«‹ćƒè€ƒ Tutorial - User Guide。 +è‹„æƒłçœ‹ćŒ…ć«æ›Žć€šćŠŸèƒœçš„ćźŒæ•ŽçŻ„äŸ‹ïŒŒè«‹ćƒè€ƒ æ•™ć­ž - äœżç”šè€…æŒ‡ć—ă€‚ **ćŠ‡é€è­Šć‘Š**ïŒšæ•™ć­ž - äœżç”šè€…æŒ‡ć—ćŒ…ć«ïŒš @@ -520,7 +520,7 @@ CLI 會è‡Șć‹•ć”æžŹäœ çš„ FastAPI æ‡‰ç”šäžŠć°‡ć…¶éƒšçœČ戰é›Čç«Żă€‚è‹„äœ ć°šæœȘ ćźƒæŠŠç”š FastAPI 開癌應甚的**開癌者體驗**架戰**郚çœČ**戰é›Čç«Żçš„æ”çš‹äž­ă€‚đŸŽ‰ -FastAPI Cloud æ˜Żă€ŒFastAPI èˆ‡ć„œæœ‹ć‹ć€‘ă€é€™äș›é–‹æșć°ˆæĄˆçš„äž»èŠèŽŠćŠ©èˆ‡èł‡é‡‘äŸ†æșă€‚✚ +FastAPI Cloud æ˜Ż *FastAPI èˆ‡ć„œæœ‹ć‹ć€‘* 這äș›é–‹æșć°ˆæĄˆçš„äž»èŠèŽŠćŠ©èˆ‡èł‡é‡‘äŸ†æșă€‚✚ #### 郚çœČćˆ°ć…¶ä»–é›Čç«ŻäŸ›æ‡‰ć•† { #deploy-to-other-cloud-providers } diff --git a/docs/zh-hant/docs/project-generation.md b/docs/zh-hant/docs/project-generation.md index fc5c8e465..862417aff 100644 --- a/docs/zh-hant/docs/project-generation.md +++ b/docs/zh-hant/docs/project-generation.md @@ -1,5 +1,6 @@ # 慚端 FastAPI çŻ„æœŹ { #full-stack-fastapi-template } + çŻ„æœŹé€šćžžé™„ćž¶ç‰čćźšçš„èš­ćźšïŒŒäœ†èš­èšˆäžŠć…·æœ‰ćœˆæ€§äž”ćŻè‡Șèš‚ă€‚é€™èź“äœ ćŻä»„äŸć°ˆæĄˆéœ€æ±‚èȘżæ•Žèˆ‡æ“Žć……ïŒŒć› æ­€éžćžžé©ćˆäœœç‚șè”·é»žă€‚đŸ äœ ćŻä»„äœżç”šæ­€çŻ„æœŹćż«é€Ÿè”·æ­„ïŒŒèŁĄéąć·Čæ›żäœ ćźŒæˆć€§é‡ćˆć§‹èš­ćźšă€ćź‰ć…šæ€§ă€èł‡æ–™ćș«ïŒŒä»„揊郹戆 API 端點。 diff --git a/docs/zh-hant/docs/python-types.md b/docs/zh-hant/docs/python-types.md index dc7160261..295921760 100644 --- a/docs/zh-hant/docs/python-types.md +++ b/docs/zh-hant/docs/python-types.md @@ -2,11 +2,11 @@ Python æ”ŻæŽćŻéžç”šçš„ă€Œćž‹ćˆ„æç€șă€ïŒˆäčŸçš±ç‚șă€Œćž‹ćˆ„èš»èš˜ă€ïŒ‰ă€‚ -這äș›ă€Œćž‹ćˆ„提ç€șă€æˆ–èš»èš˜æ˜Żäž€çšźç‰čæźŠèȘžæł•ïŒŒç”šäŸ†ćźŁć‘Šèꊿ•žçš„ćž‹ćˆ„。 +這äș› **ă€Œćž‹ćˆ„æç€ș」** æˆ–èš»èš˜æ˜Żäž€çšźç‰čæźŠèȘžæł•ïŒŒç”šäŸ†ćźŁć‘Šèꊿ•žçš„ćž‹ćˆ„。 ç‚șäœ çš„èźŠæ•žćźŁć‘Šćž‹ćˆ„ćŸŒïŒŒç·šèŒŻć™šèˆ‡ć·„ć…·ć°±èƒœæäŸ›æ›Žć„œçš„æ”ŻæŽă€‚ -é€™èŁĄćȘæ˜Żé—œæ–Œ Python ćž‹ćˆ„æç€șçš„ćż«é€Ÿæ•™ć­žïŒè€‡çż’ă€‚ćźƒćȘæ¶”è“‹äœżç”šćœš **FastAPI** 時所需的最䜎限ćșŠ...ć…¶ćŻŠéžćžžć°‘ă€‚ +é€™èŁĄćȘæ˜Żé—œæ–Œ Python ćž‹ćˆ„æç€ș的**ćż«é€Ÿæ•™ć­žïŒè€‡çż’**。漃ćȘæ¶”è“‹äœżç”šćœš **FastAPI** 時所需的最䜎限ćșŠ...ć…¶ćŻŠéžćžžć°‘ă€‚ **FastAPI** ćźŒć…šæ˜Żä»„é€™äș›ćž‹ćˆ„提ç€șç‚șćŸșç€ŽïŒŒäžŠć› æ­€ćž¶äŸ†èš±ć€šć„Șć‹ąèˆ‡ć„œè™•ă€‚ @@ -137,7 +137,7 @@ John Doe ### `typing` æšĄç”„ { #typing-module } -朹侀äș›ć…¶ä»–æƒ…ćąƒäž­ïŒŒäœ ćŻèƒœéœ€èŠćŸžæš™æș–çš‹ćŒćș«çš„ `typing` æšĄç”„ćŒŻć…„äž€äș›æ±è„żïŒŒæŻ”ćŠ‚ç•¶äœ æƒłćźŁć‘ŠæŸć€‹æ±è„żćŻä»„æ˜Żă€Œä»»äœ•ćž‹ćˆ„ă€æ™‚ïŒŒćŻä»„ç”š `typing` èŁĄçš„ `Any` +朹侀äș›ć…¶ä»–æƒ…ćąƒäž­ïŒŒäœ ćŻèƒœéœ€èŠćŸžæš™æș–çš‹ćŒćș«çš„ `typing` æšĄç”„ćŒŻć…„äž€äș›æ±è„żïŒŒæŻ”ćŠ‚ç•¶äœ æƒłćźŁć‘ŠæŸć€‹æ±è„żćŻä»„æ˜Żă€Œä»»äœ•ćž‹ćˆ„ă€æ™‚ïŒŒćŻä»„ç”š `Any` ```python from typing import Any @@ -151,7 +151,7 @@ def some_function(data: Any): 有äș›ćž‹ćˆ„ćŻä»„ćœšæ–čæ‹Źè™Ÿäž­æŽ„æ”¶ă€Œćž‹ćˆ„ćƒæ•žă€ïŒŒä»„ćźšçŸ©ć…¶ć…§éƒšć…ƒçŽ çš„ćž‹ćˆ„ïŒŒäŸ‹ćŠ‚ă€Œć­—äžČ的 listă€ćŻä»„ćźŁć‘Šç‚ș `list[str]`。 -這äș›èƒœæŽ„æ”¶ćž‹ćˆ„ćƒæ•žçš„ćž‹ćˆ„çš±ç‚șă€Œæł›ćž‹ïŒˆGeneric typesïŒ‰ă€æˆ–ă€ŒGenerics」。 +這äș›èƒœæŽ„æ”¶ćž‹ćˆ„ćƒæ•žçš„ćž‹ćˆ„çš±ç‚ș **æł›ćž‹ïŒˆGeneric types** 或 **Generics**。 äœ ćŻä»„ć°‡ç›žćŒçš„ć…§ć»șćž‹ćˆ„ç”šäœœæł›ćž‹ïŒˆäœżç”šæ–čæ‹Źè™ŸäžŠćœšèŁĄéąæ”Ÿćž‹ćˆ„ïŒ‰ïŒš @@ -221,7 +221,7 @@ def some_function(data: Any): #### Union { #union } -äœ ćŻä»„ćźŁć‘Šäž€ć€‹èźŠæ•žćŻä»„æ˜Żă€Œć€šçšźćž‹ćˆ„ă€äž­çš„ä»»äž€çšźïŒŒäŸ‹ćŠ‚ `int` 或 `str`。 +äœ ćŻä»„ćźŁć‘Šäž€ć€‹èźŠæ•žćŻä»„æ˜Ż**ć€šçšźćž‹ćˆ„**äž­çš„ä»»äž€çšźïŒŒäŸ‹ćŠ‚ `int` 或 `str`。 芁這éșŒćźšçŸ©ïŒŒäœ äœżç”šè±Žç·šïŒˆ`|`ïŒ‰äŸ†ćˆ†éš”ć…©çšźćž‹ćˆ„ă€‚ @@ -263,9 +263,9 @@ def some_function(data: Any): -è«‹æłšæ„ïŒŒé€™èĄšç€ș「`one_person` æ˜ŻéĄžćˆ„ `Person` çš„ă€ŽćŻŠäŸ‹ïŒˆinstanceïŒ‰ă€ă€ă€‚ +è«‹æłšæ„ïŒŒé€™èĄšç€ș「`one_person` æ˜ŻéĄžćˆ„ `Person` 的**ćŻŠäŸ‹ïŒˆinstance**」。 -äžŠäžæ˜Żă€Œ`one_person` ć°±æ˜Żćç‚ș `Person` çš„ă€ŽéĄžćˆ„ïŒˆclassïŒ‰ă€ă€ă€‚ +äžŠäžæ˜Żă€Œ`one_person` ć°±æ˜Żćç‚ș `Person` 的**éĄžćˆ„ïŒˆclass**」。 ## Pydantic æšĄćž‹ { #pydantic-models } @@ -295,7 +295,7 @@ def some_function(data: Any): ## 搫䞭çčŒèł‡æ–™çš„ćž‹ćˆ„提ç€ș { #type-hints-with-metadata-annotations } -Python ä蟿œ‰äž€ć€‹ćŠŸèƒœïŒŒć…èš±äœżç”š `Annotated` 朹這äș›ćž‹ćˆ„提ç€șäž­æ”Ÿć…„éĄć€–çš„äž­çčŒèł‡æ–™ă€‚ +Python ä蟿œ‰äž€ć€‹ćŠŸèƒœïŒŒć…èš±äœżç”š `Annotated` 朹這äș›ćž‹ćˆ„提ç€șäž­æ”Ÿć…„**éĄć€–çš„äž­çčŒèł‡æ–™**。 äœ ćŻä»„ćŸž `typing` ćŒŻć…„ `Annotated`。 @@ -305,15 +305,15 @@ Python æœŹèș«äžæœƒć°é€™ć€‹ `Annotated` ćšä»»äœ•äș‹ă€‚ć°ç·šèŒŻć™šèˆ‡ć…¶ä»–ć·„ äœ†äœ ćŻä»„ćˆ©ç”š `Annotated` 這怋ç©ș間䟆提䟛 **FastAPI** éĄć€–çš„äž­çčŒèł‡æ–™ïŒŒć‘ŠèšŽćźƒäœ ćžŒæœ›æ‡‰ç”šçš‹ćŒćŠ‚äœ•é‹äœœă€‚ -é‡èŠçš„æ˜ŻèŠèš˜äœïŒŒć‚łç”Š `Annotated` çš„ă€ŒçŹŹäž€ć€‹ćž‹ćˆ„ćƒæ•žă€æ‰æ˜Żă€ŒçœŸæ­Łçš„ćž‹ćˆ„ă€ă€‚ć…¶é€˜çš„ïŒŒéƒœæ˜Żç”Šć…¶ä»–ć·„ć…·ç”šçš„äž­çčŒèł‡æ–™ă€‚ +é‡èŠçš„æ˜ŻèŠèš˜äœïŒŒć‚łç”Š `Annotated` 的**第侀怋*ćž‹ćˆ„ćƒæ•ž***æ‰æ˜Ż**ćŻŠéš›ćž‹ćˆ„**ă€‚ć…¶é€˜çš„ïŒŒéƒœæ˜Żç”Šć…¶ä»–ć·„ć…·ç”šçš„äž­çčŒèł‡æ–™ă€‚ ç›źć‰äœ ćȘ需芁矄道 `Annotated` çš„ć­˜ćœšïŒŒè€Œäž”ćźƒæ˜Żæš™æș–çš„ Python。😎 -äč‹ćŸŒäœ æœƒçœ‹ćˆ°ćꃿœ‰ć€šă€ŒćŒ·ć€§ă€ă€‚ +äč‹ćŸŒäœ æœƒçœ‹ćˆ°ćꃿœ‰ć€š**ćŒ·ć€§**。 /// tip | 提ç€ș -曠ç‚șé€™æ˜Żă€Œæš™æș– Pythonă€ïŒŒæ‰€ä»„äœ ćœšç·šèŒŻć™šă€ćˆ†æžèˆ‡é‡æ§‹çš‹ćŒçąŒçš„ć·„ć…·ç­‰æ–čéąïŒŒä»ç„¶èƒœçČćŸ—ă€Œæœ€äœłçš„é–‹ç™Œé«”é©—ă€ă€‚âœš +曠ç‚șé€™æ˜Ż**æš™æș– Python**ïŒŒæ‰€ä»„äœ ćœšç·šèŒŻć™šă€ćˆ†æžèˆ‡é‡æ§‹çš‹ćŒçąŒçš„ć·„ć…·ç­‰æ–čéąïŒŒä»ç„¶èƒœçČćŸ—**æœ€äœłçš„é–‹ç™Œé«”é©—**。✹ è€Œäž”äœ çš„çš‹ćŒçąŒä蟿œƒèˆ‡èš±ć€šć…¶ä»– Python ć·„ć…·èˆ‡çš‹ćŒćș«éžćžžç›žćźč。🚀 @@ -325,17 +325,17 @@ Python æœŹèș«äžæœƒć°é€™ć€‹ `Annotated` ćšä»»äœ•äș‹ă€‚ć°ç·šèŒŻć™šèˆ‡ć…¶ä»–ć·„ 朹 **FastAPI** äž­ïŒŒäœ ç”šćž‹ćˆ„æç€șäŸ†ćźŁć‘Šćƒæ•žïŒŒç„¶ćŸŒäœ æœƒćŸ—ćˆ°ïŒš -* ç·šèŒŻć™šæ”ŻæŽ -* ćž‹ćˆ„æȘ࿟„ +* **ç·šèŒŻć™šæ”ŻæŽ**。 +* **ćž‹ćˆ„æȘ࿟„**。 ...而 **FastAPI** ä蟿œƒç”šćŒæšŁçš„ćźŁć‘ŠäŸ†ïŒš -* ćźšçŸ©éœ€æ±‚ïŒšäŸ†è‡Șè«‹æ±‚çš„è·ŻćŸ‘ćƒæ•žă€æŸ„è©ąćƒæ•žă€æš™é ­ă€äž»é«”ïŒˆbodyïŒ‰ă€ç›žäŸæ€§ç­‰ -* èœ‰æ›èł‡æ–™ïŒšæŠŠè«‹æ±‚äž­çš„èł‡æ–™èœ‰æˆæ‰€éœ€ćž‹ćˆ„ -* é©—è­‰èł‡æ–™ïŒšäŸ†è‡ȘæŻć€‹è«‹æ±‚çš„èł‡æ–™ïŒš - * ç•¶èł‡æ–™ç„Ąæ•ˆæ™‚ïŒŒè‡Ș拕由生錯èȘ€äžŠć›žć‚łç”Šç”šæˆ¶ç«Ż -* äœżç”š OpenAPI æ›žćŻ« API 文件 - * äč‹ćŸŒæœƒç”±è‡Ș拕的äș’ć‹•ćŒæ–‡ä»¶ä»‹éąæ‰€äœżç”š +* **ćźšçŸ©éœ€æ±‚**䟆è‡Șè«‹æ±‚çš„è·ŻćŸ‘ćƒæ•žă€æŸ„è©ąćƒæ•žă€æš™é ­ă€äž»é«”ïŒˆbodyïŒ‰ă€ç›žäŸæ€§ç­‰ă€‚ +* **èœ‰æ›èł‡æ–™**ïŒšæŠŠè«‹æ±‚äž­çš„èł‡æ–™èœ‰æˆæ‰€éœ€ćž‹ćˆ„ă€‚ +* **é©—è­‰èł‡æ–™**䟆è‡ȘæŻć€‹è«‹æ±‚çš„èł‡æ–™ïŒš + * ç•¶èł‡æ–™ç„Ąæ•ˆæ™‚ïŒŒç”ąç”Ÿć›žć‚łç”Šç”šæˆ¶ç«Żçš„**è‡Ș拕錯èȘ€**。 +* äœżç”š OpenAPI **蚘錄** API + * äč‹ćŸŒæœƒç”±è‡Ș拕的äș’ć‹•ćŒæ–‡ä»¶ä»‹éąæ‰€äœżç”šă€‚ 這äș›çŸćœšèœè”·äŸ†ćŻèƒœæœ‰é»žæŠœè±Ąă€‚ćˆ„æ“”ćżƒă€‚äœ æœƒćœš[æ•™ć­ž - äœżç”šè€…æŒ‡ć—](tutorial/index.md)äž­çœ‹ćˆ°ćźƒć€‘çš„ćŻŠéš›é‹äœœă€‚ diff --git a/docs/zh-hant/docs/tutorial/bigger-applications.md b/docs/zh-hant/docs/tutorial/bigger-applications.md index 60dd4f350..624b2c2bc 100644 --- a/docs/zh-hant/docs/tutorial/bigger-applications.md +++ b/docs/zh-hant/docs/tutorial/bigger-applications.md @@ -17,16 +17,16 @@ FastAPI 提䟛äș†äž€ć€‹æ–čäŸżçš„ć·„ć…·ïŒŒèź“äœ ćœšç¶­æŒćœˆæ€§çš„ćŒæ™‚ïŒŒćč«äœ  ``` . ├── app -│   ├── __init__.py -│   ├── main.py -│   ├── dependencies.py -│   └── routers -│   │ ├── __init__.py -│   │ ├── items.py -│   │ └── users.py -│   └── internal -│   ├── __init__.py -│   └── admin.py +│ ├── __init__.py +│ ├── main.py +│ ├── dependencies.py +│ └── routers +│ │ ├── __init__.py +│ │ ├── items.py +│ │ └── users.py +│ └── internal +│ ├── __init__.py +│ └── admin.py ``` /// tip | 提ç€ș @@ -542,6 +542,6 @@ router.include_router(other_router) è«‹äœżç”šæœ‰æ–‡ä»¶èš˜èŒ‰çš„ APIïŒŒäŸ‹ćŠ‚è·ŻćŸ‘æ“äœœçš„èŁéŁŸć™šèˆ‡ `.include_router()` äŸ†æ–°ćąžè·Żç”±èˆ‡ routers。 -把 `router.routes` 芖ç‚șèŒƒäœŽéšŽçš„è·Żç”±æščç”æ§‹ïŒŒćźƒćŻèƒœćŒæ™‚ćŒ…ć«è·Żç”±ćźšçŸ©èˆ‡èą«çŽć…„çš„ routersïŒŒéżć…ć°‡ćźƒç•¶æˆæœ€ç”‚è·ŻćŸ‘æ“äœœçš„ćčłlatæž…ć–źäŸ†äŸèłŽă€‚ +把 `router.routes` 芖ç‚șèŒƒäœŽéšŽçš„è·Żç”±æščç”æ§‹ïŒŒćźƒćŻèƒœćŒæ™‚ćŒ…ć«è·Żç”±ćźšçŸ©èˆ‡èą«çŽć…„çš„ routersïŒŒéżć…ć°‡ćźƒç•¶æˆæœ€ç”‚è·ŻćŸ‘æ“äœœçš„æ‰ćčłæž…ć–źäŸ†äŸèłŽă€‚ /// diff --git a/docs/zh-hant/docs/tutorial/body-nested-models.md b/docs/zh-hant/docs/tutorial/body-nested-models.md index 161920acd..4e2e6427c 100644 --- a/docs/zh-hant/docs/tutorial/body-nested-models.md +++ b/docs/zh-hant/docs/tutorial/body-nested-models.md @@ -1,5 +1,6 @@ # Body - ć·ąç‹€æšĄćž‹ { #body-nested-models } + äœżç”š **FastAPI**ïŒŒäœ ćŻä»„ćźšçŸ©ă€é©—è­‰ă€æ–‡ä»¶ćŒ–ïŒŒäžŠäœżç”šä»»æ„æ·±ćșŠçš„ć·ąç‹€æšĄćž‹ïŒˆæ„ŸèŹ PydanticïŒ‰ă€‚ ## ćˆ—èĄšæŹ„äœ { #list-fields } diff --git a/docs/zh-hant/docs/tutorial/body.md b/docs/zh-hant/docs/tutorial/body.md index aff55730b..f1ba8e954 100644 --- a/docs/zh-hant/docs/tutorial/body.md +++ b/docs/zh-hant/docs/tutorial/body.md @@ -32,6 +32,7 @@ {* ../../docs_src/body/tutorial001_py310.py hl[5:9] *} + ć°±ć’ŒćźŁć‘ŠæŸ„è©ąćƒæ•žæ™‚äž€æšŁïŒŒç•¶æšĄćž‹ć±Źæ€§æœ‰é èš­ć€Œæ™‚ïŒŒćźƒć°±äžæ˜Żćż…ćĄ«ïŒ›ćŠć‰‡ć°±æ˜Żćż…ćĄ«ă€‚äœżç”š `None` ćŻäœżć…¶æˆç‚ș遞楫。 äŸ‹ćŠ‚ïŒŒäžŠèż°æšĄćž‹ć°æ‡‰çš„ JSON「`object`ă€ïŒˆæˆ– Python `dict`ïŒ‰ćŠ‚äž‹ïŒš @@ -135,6 +136,7 @@ {* ../../docs_src/body/tutorial003_py310.py hl[15:16] *} + ## è«‹æ±‚æœŹæ–‡ + è·ŻćŸ‘ + æŸ„è©ąćƒæ•ž { #request-body-path-query-parameters } 䜠äčŸćŻä»„ćŒæ™‚ćźŁć‘Š**æœŹæ–‡**、**è·ŻćŸ‘**與**æŸ„è©ą**ćƒæ•žă€‚ diff --git a/docs/zh-hant/docs/tutorial/debugging.md b/docs/zh-hant/docs/tutorial/debugging.md index 9501dec5c..a3254e3d1 100644 --- a/docs/zh-hant/docs/tutorial/debugging.md +++ b/docs/zh-hant/docs/tutorial/debugging.md @@ -1,5 +1,6 @@ # ć”éŒŻ { #debugging } + äœ ćŻä»„ćœšç·šèŒŻć™šäž­é€ŁæŽ„ć”éŒŻć™šïŒŒäŸ‹ćŠ‚ Visual Studio Code 或 PyCharm。 ## ć‘Œć« `uvicorn` { #call-uvicorn } diff --git a/docs/zh-hant/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/zh-hant/docs/tutorial/dependencies/dependencies-with-yield.md index 59d575fb0..c41f3ba7d 100644 --- a/docs/zh-hant/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/zh-hant/docs/tutorial/dependencies/dependencies-with-yield.md @@ -234,6 +234,7 @@ participant operation as Path Operation 搫 `yield` 的盞䟝隚時間挔é€ČïŒŒä»„æ¶”è“‹äžćŒçš„äœżç”šæƒ…ćąƒäžŠäżźæ­Łäž€äș›ć•éĄŒă€‚ ćŠ‚æžœäœ æƒłäș†è§ŁćœšäžćŒ FastAPI ç‰ˆæœŹäž­æ”čäș†ć“Șäș›ć…§ćźčïŒŒćŻä»„ćœšé€ČéšŽæŒ‡ć—äž­é–±èź€ïŒš[é€Č階盞䟝 — 搫 `yield`、`HTTPException`、`except` èˆ‡èƒŒæ™Żä»»ć‹™çš„ç›žäŸ](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks)。 + ## æƒ…ćąƒçźĄç†ć™š { #context-managers } ### 什éșŒæ˜Żă€Œæƒ…ćąƒçźĄç†ć™šă€ { #what-are-context-managers } diff --git a/docs/zh-hant/docs/tutorial/extra-data-types.md b/docs/zh-hant/docs/tutorial/extra-data-types.md index a5573379d..23c753232 100644 --- a/docs/zh-hant/docs/tutorial/extra-data-types.md +++ b/docs/zh-hant/docs/tutorial/extra-data-types.md @@ -1,5 +1,6 @@ # éĄć€–çš„èł‡æ–™ćž‹ćˆ„ { #extra-data-types } + 戰盼才ç‚șæ­ąïŒŒäœ äž€ç›Žćœšäœżç”šćžžèŠ‹çš„èł‡æ–™ćž‹ćˆ„ïŒŒäŸ‹ćŠ‚ïŒš * `int` diff --git a/docs/zh-hant/docs/tutorial/extra-models.md b/docs/zh-hant/docs/tutorial/extra-models.md index f5509f531..162325e9d 100644 --- a/docs/zh-hant/docs/tutorial/extra-models.md +++ b/docs/zh-hant/docs/tutorial/extra-models.md @@ -4,9 +4,9 @@ ć°äœżç”šè€…æšĄćž‹ć°€ć…¶ćŠ‚æ­€ïŒŒć› ç‚ș -* ă€ŒèŒžć…„æšĄćž‹ă€éœ€èŠèƒœćŒ…ć«ćŻ†çąŒă€‚ -* ă€ŒèŒžć‡șæšĄćž‹ă€äžæ‡‰ćŒ…ć«ćŻ†çąŒă€‚ -* ă€Œèł‡æ–™ćș«æšĄćž‹ă€é€šćžžéœ€èЁć„Č歘雜æčŠćŸŒçš„ćŻ†çąŒă€‚ +* **èŒžć…„æšĄćž‹**éœ€èŠèƒœćŒ…ć«ćŻ†çąŒă€‚ +* **茞ć‡șæšĄćž‹**äžæ‡‰ćŒ…ć«ćŻ†çąŒă€‚ +* **èł‡æ–™ćș«æšĄćž‹**é€šćžžéœ€èŠć„Č歘雜æčŠćŸŒçš„ćŻ†çąŒă€‚ /// danger @@ -140,7 +140,7 @@ UserInDB( ## æž›ć°‘é‡è€‡ { #reduce-duplication } -æž›ć°‘çš‹ćŒçąŒé‡è€‡æ˜Ż FastAPI çš„æ žćżƒç†ćż”äč‹äž€ă€‚ +æž›ć°‘çš‹ćŒçąŒé‡è€‡æ˜Ż **FastAPI** çš„æ žćżƒç†ćż”äč‹äž€ă€‚ 曠ç‚șé‡è€‡çš„çš‹ćŒçąŒæœƒæé«˜ç™Œç”ŸéŒŻèȘ€ă€ćź‰ć…šæ€§ć•éĄŒă€çš‹ćŒäžćŒæ­„ïŒˆæŸè™•æ›Žæ–°äœ†ć…¶ä»–è™•æœȘæ›Žæ–°ïŒ‰ç­‰éąšéšȘ。 @@ -176,7 +176,7 @@ UserInDB( æ­€çŻ„äŸ‹äž­ïŒŒæˆ‘ć€‘ć°‡ `Union[PlaneItem, CarItem]` 䜜ç‚șćŒ•æ•ž `response_model` çš„ć€Œă€‚ -ç”±æ–Œé€™èŁĄæ˜ŻæŠŠćźƒç•¶äœœćŒ•æ•žçš„ă€Œć€Œă€ć‚łć…„ïŒŒè€Œéžç”šæ–Œćž‹ćˆ„èš»èš˜ïŒŒć› æ­€ćłäœżćœš Python 3.10 äčŸćż…é ˆäœżç”š `Union`。 +ç”±æ–Œé€™èŁĄæ˜ŻæŠŠćźƒç•¶äœœ**ćŒ•æ•žçš„ć€Œ**ć‚łć…„ïŒŒè€Œéžæ”Ÿćœš**ćž‹ćˆ„èš»èš˜**äž­ïŒŒć› æ­€ćłäœżćœš Python 3.10 äčŸćż…é ˆäœżç”š `Union`。 è‹„ç”šæ–Œćž‹ćˆ„èš»èš˜ïŒŒć‰‡ćŻä»„äœżç”šç›Žç·šïŒˆ|ïŒ‰ïŒŒćŠ‚äž‹ïŒš @@ -184,7 +184,7 @@ UserInDB( some_variable: PlaneItem | CarItem ``` -äœ†è‹„ćŻ«æˆæŒ‡ćźšć€Œ `response_model=PlaneItem | CarItem` æœƒç™Œç”ŸéŒŻèȘ€ïŒŒć› ç‚ș Python æœƒć˜—è©Šćœš `PlaneItem` 與 `CarItem` äč‹é–“ćŸ·èĄŒă€Œç„Ąæ•ˆé‹çź—ă€ïŒŒè€Œéžć°‡ć…¶èŠ–ç‚șćž‹ćˆ„èš»èš˜ă€‚ +äœ†è‹„ćŻ«æˆæŒ‡ćźšć€Œ `response_model=PlaneItem | CarItem` æœƒç™Œç”ŸéŒŻèȘ€ïŒŒć› ç‚ș Python æœƒć˜—è©Šćœš `PlaneItem` 與 `CarItem` äč‹é–“ćŸ·èĄŒ**ç„Ąæ•ˆé‹çź—**ïŒŒè€Œéžć°‡ć…¶èŠ–ç‚șćž‹ćˆ„èš»èš˜ă€‚ ## æšĄćž‹çš„æž…ć–ź { #list-of-models } @@ -208,4 +208,4 @@ some_variable: PlaneItem | CarItem äŸæƒ…ćąƒäœżç”šć€šć€‹ Pydantic æšĄćž‹äžŠéˆæŽ»çčŒæ‰żă€‚ -ç•¶äž€ć€‹ćŻŠé«”éœ€èŠć‘ˆçŸäžćŒă€Œç‹€æ…‹ă€æ™‚ïŒŒäžćż…äŸ·é™æ–Œäž€ć€‹èł‡æ–™æšĄćž‹ă€‚äŸ‹ćŠ‚äœżç”šè€…é€™ć€‹ćŻŠé«”ïŒŒćŻèƒœæœ‰ćŒ…ć« `password`ă€ćŒ…ć« `password_hash`ïŒŒæˆ–äžć«ćŻ†çąŒç­‰äžćŒç‹€æ…‹ă€‚ +ç•¶äž€ć€‹ćŻŠé«”éœ€èŠć‘ˆçŸäžćŒă€Œç‹€æ…‹ă€æ™‚ïŒŒäžćż…äŸ·é™æ–Œäž€ć€‹èł‡æ–™æšĄćž‹ă€‚**äœżç”šè€…**ă€ŒćŻŠé«”ă€æ˜Żäž€ć€‹äŸ‹ć­ïŒŒćŻèƒœæœ‰ćŒ…ć« `password`ă€ćŒ…ć« `password_hash`ïŒŒæˆ–äžć«ćŻ†çąŒç­‰äžćŒç‹€æ…‹ă€‚ diff --git a/docs/zh-hant/docs/tutorial/first-steps.md b/docs/zh-hant/docs/tutorial/first-steps.md index 8d644abd1..bc023cc39 100644 --- a/docs/zh-hant/docs/tutorial/first-steps.md +++ b/docs/zh-hant/docs/tutorial/first-steps.md @@ -137,9 +137,9 @@ OpenAPI ç‚ș䜠的 API ćźšçŸ©äș† API 的 schemaă€‚è€Œè©Č schema æœƒćŒ…ć«äœ çš„ A #### OpenAPI 的甹途 { #what-is-openapi-for } -OpenAPI schema é©…ć‹•äș†ć…©ć€‹äș’ć‹•ćŒæ–‡ä»¶çł»ç”±ă€‚ +OpenAPI schema é©…ć‹•äș†ć…§ć»ș的慩怋äș’ć‹•ćŒæ–‡ä»¶çł»ç”±ă€‚ -è€Œäž”æœ‰èš±ć€šæ›żä»Łæ–čæĄˆïŒŒæ‰€æœ‰é€™äș›éƒœæ˜ŻćŸșæ–Œ OpenAPIă€‚äœ ćŻä»„èŒ•éŹ†ćœ°ć°‡ä»»äœ•é€™äș›æ›żä»Łæ–čæĄˆæ·»ćŠ ćˆ°äœżç”š **FastAPI** ć»șçœźçš„æ‡‰ç”šçš‹ćŒäž­ă€‚ +è€Œäž”æœ‰æ•žćçšźæ›żä»Łæ–čæĄˆïŒŒæ‰€æœ‰é€™äș›éƒœæ˜ŻćŸșæ–Œ OpenAPIă€‚äœ ćŻä»„èŒ•éŹ†ćœ°ć°‡ä»»äœ•é€™äș›æ›żä»Łæ–čæĄˆćŠ ć…„ćˆ°äœżç”š **FastAPI** ć»șçœźçš„æ‡‰ç”šçš‹ćŒäž­ă€‚ 䜠äčŸćŻä»„甹漃è‡Șć‹•ç”Ÿæˆçš‹ćŒçąŒïŒŒèź“ç”šæˆ¶ç«Żèˆ‡äœ çš„ API é€šèšŠă€‚äŸ‹ćŠ‚ć‰ç«Żă€æ‰‹æ©Ÿæˆ–ç‰©èŻç¶ČIoTïŒ‰æ‡‰ç”šçš‹ćŒă€‚ @@ -226,7 +226,7 @@ CLI 會è‡Șć‹•ć”æžŹäœ çš„ FastAPI æ‡‰ç”šäžŠć°‡ćźƒéƒšçœČ戰é›Čç«Żă€‚è‹„äœ ć°šæœȘ {* ../../docs_src/first_steps/tutorial001_py310.py hl[1] *} -`FastAPI` æ˜Żäž€ć€‹ Python éĄžćˆ„ïŒŒæäŸ›æ‰€æœ‰ API çš„ć…šéƒšćŠŸèƒœă€‚ +`FastAPI` æ˜Żäž€ć€‹ Python éĄžćˆ„ïŒŒæäŸ›äœ çš„ API æ‰€éœ€çš„æ‰€æœ‰ćŠŸèƒœă€‚ /// note | æŠ€èĄ“çŽ°çŻ€ @@ -244,7 +244,7 @@ CLI 會è‡Șć‹•ć”æžŹäœ çš„ FastAPI æ‡‰ç”šäžŠć°‡ćźƒéƒšçœČ戰é›Čç«Żă€‚è‹„äœ ć°šæœȘ é€™ć°‡æ˜Żäœ ć»ș立所有 API 的䞻芁äș’拕點。 -### çŹŹäž‰æ­„ïŒšć»șç«‹äž€ć€‹ă€Œè·ŻćŸ‘æ“äœœă€ { #step-3-create-a-path-operation } +### çŹŹäž‰æ­„ïŒšć»ș立䞀怋*è·ŻćŸ‘æ“äœœ* { #step-3-create-a-path-operation } #### è·ŻćŸ‘ { #path } @@ -256,7 +256,7 @@ CLI 會è‡Șć‹•ć”æžŹäœ çš„ FastAPI æ‡‰ç”šäžŠć°‡ćźƒéƒšçœČ戰é›Čç«Żă€‚è‹„äœ ć°šæœȘ https://example.com/items/foo ``` -â€Šâ€Šçš„è·ŻćŸ‘ć°‡æœƒæ˜ŻïŒš +...çš„è·ŻćŸ‘ć°‡æœƒæ˜ŻïŒš ``` /items/foo @@ -281,7 +281,7 @@ https://example.com/items/foo * `PUT` * `DELETE` -â€Šâ€Šä»„ćŠæ›Žć°‘èŠ‹çš„ïŒš +...ä»„ćŠæ›Žć°‘èŠ‹çš„ïŒš * `OPTIONS` * `HEAD` @@ -305,14 +305,14 @@ https://example.com/items/foo æˆ‘ć€‘ć°‡æœƒçš±ćźƒć€‘ç‚ș「**操䜜**」。 -#### ćźšçŸ©äž€ć€‹ă€Œè·ŻćŸ‘æ“äœœèŁéŁŸć™šă€ { #define-a-path-operation-decorator } +#### ćźšçŸ©äž€ć€‹*è·ŻćŸ‘æ“äœœèŁéŁŸć™š* { #define-a-path-operation-decorator } {* ../../docs_src/first_steps/tutorial001_py310.py hl[6] *} -`@app.get("/")` ć‘ŠèšŽ **FastAPI** é‚Łć€‹ć‡œćŒèČ èČŹè™•ç†è«‹æ±‚ïŒš +`@app.get("/")` ć‘ŠèšŽ **FastAPI** æ­Łäž‹æ–čçš„ć‡œćŒèČ èČŹè™•ç†ć‰ćŸ€ä»„äž‹äœçœźçš„è«‹æ±‚ïŒš * è·ŻćŸ‘ `/` -* äœżç”š get 操䜜 +* äœżç”š get 操䜜 /// note | `@decorator` èȘȘ明 @@ -353,7 +353,7 @@ Python 侭的 `@something` èȘžæł•èą«çš±ç‚șă€ŒèŁéŁŸć™šă€ă€‚ /// -### çŹŹć››æ­„ïŒšćźšçŸ©ă€Œè·ŻćŸ‘æ“äœœć‡œćŒă€ { #step-4-define-the-path-operation-function } +### çŹŹć››æ­„ïŒšćźšçŸ©**è·ŻćŸ‘æ“äœœć‡œćŒ** { #step-4-define-the-path-operation-function } é€™æ˜Żæˆ‘ć€‘çš„ă€Œ**è·ŻćŸ‘æ“äœœć‡œćŒ**ă€ïŒš @@ -377,7 +377,7 @@ Python 侭的 `@something` èȘžæł•èą«çš±ç‚șă€ŒèŁéŁŸć™šă€ă€‚ /// note -ćŠ‚æžœäœ äžçŸ„é“ć·źćˆ„ïŒŒè«‹æŸ„çœ‹ [Async: *"In a hurry?"*](../async.md#in-a-hurry)。 +ćŠ‚æžœäœ äžçŸ„é“ć·źćˆ„ïŒŒè«‹æŸ„çœ‹ [Async*ă€ŒćŸˆè¶•æ™‚é–“ïŒŸă€*](../async.md#in-a-hurry)。 /// @@ -399,11 +399,11 @@ Python 侭的 `@something` èȘžæł•èą«çš±ç‚șă€ŒèŁéŁŸć™šă€ă€‚ **[FastAPI Cloud](https://fastapicloud.com)** 由 **FastAPI** çš„äœœè€…èˆ‡ćœ˜éšŠæ‰“é€ ă€‚ -ćźƒèź“äœ ä»„æœ€ć°çš„æˆæœŹćźŒæˆ API 的**ć»șçœź**、**郚çœČ**與**歘揖**æ”çš‹ă€‚ +ćźƒèź“äœ ä»„æœ€ć°‘çš„ćżƒćŠ›ç°ĄćŒ– API 的**ć»șçœź**、**郚çœČ**與**歘揖**æ”çš‹ă€‚ ćźƒæŠŠç”š FastAPI é–‹ç™Œæ‡‰ç”šçš„ćŒæšŁ**開癌者體驗**ćž¶ćˆ°ć°‡æ‡‰ç”š**郚çœČ**戰é›Čç«Żçš„æ”çš‹äž­ă€‚đŸŽ‰ -FastAPI Cloud ä蟿˜Żă€ŒFastAPI èˆ‡ć…¶ć„œć‹ă€é€™äș›é–‹æșć°ˆæĄˆçš„äž»èŠèŽŠćŠ©èˆ‡èł‡é‡‘æäŸ›è€…ă€‚âœš +FastAPI Cloud ä蟿˜Ż *FastAPI èˆ‡ć…¶ć„œć‹* 這äș›é–‹æșć°ˆæĄˆçš„äž»èŠèŽŠćŠ©èˆ‡èł‡é‡‘æäŸ›è€…ă€‚âœš #### 郚çœČćˆ°ć…¶ä»–é›Čç«ŻäŸ›æ‡‰ć•† { #deploy-to-other-cloud-providers } @@ -415,7 +415,7 @@ FastAPI æ˜Żé–‹æșäžŠćŸș斌暙æș–çš„ă€‚äœ ćŻä»„把 FastAPI 應甚郚çœČćˆ°äœ éž * ćŒ•ć…„ `FastAPI`。 * ć»ș立䞀怋 `app` ćŻŠäŸ‹ă€‚ -* ćŻ«äž€ć€‹ă€Œè·ŻćŸ‘æ“äœœèŁéŁŸć™šă€ïŒŒćƒæ˜Ż `@app.get("/")`。 -* ćźšçŸ©äž€ć€‹ă€Œè·ŻćŸ‘æ“äœœć‡œćŒă€ïŒ›äŸ‹ćŠ‚ïŒŒ`def root(): ...`。 +* 毫䞀怋**è·ŻćŸ‘æ“äœœèŁéŁŸć™š**ïŒŒćƒæ˜Ż `@app.get("/")`。 +* ćźšçŸ©äž€ć€‹**è·ŻćŸ‘æ“äœœć‡œćŒ**ïŒ›äŸ‹ćŠ‚ïŒŒ`def root(): ...`。 * äœżç”šć‘œä»€ `fastapi dev` ćŸ·èĄŒé–‹ç™ŒäŒșæœć™šă€‚ * ćŻéžïŒšäœżç”š `fastapi deploy` 郚çœČäœ çš„æ‡‰ç”šçš‹ćŒă€‚ diff --git a/docs/zh-hant/docs/tutorial/handling-errors.md b/docs/zh-hant/docs/tutorial/handling-errors.md index b1ffd3e03..dc6d7a7cc 100644 --- a/docs/zh-hant/docs/tutorial/handling-errors.md +++ b/docs/zh-hant/docs/tutorial/handling-errors.md @@ -11,13 +11,13 @@ * ç”šæˆ¶ç«Żć˜—è©Šć­˜ć–çš„é …ç›źäžć­˜ćœšă€‚ * 等等。 -朹這äș›æƒ…æłäž‹ïŒŒé€šćžžæœƒć›žć‚łçŻ„ćœç‚ș 400400 戰 499的 HTTP ç‹€æ…‹çąŒă€‚ +朹這äș›æƒ…æłäž‹ïŒŒé€šćžžæœƒć›žć‚łçŻ„ćœç‚ș **400**400 戰 499的 **HTTP ç‹€æ…‹çąŒ**。 é€™éĄžäŒŒæ–Œ 200 範服的 HTTP ç‹€æ…‹çąŒïŒˆ200 戰 299ïŒ‰ă€‚é‚Łäș›ă€Œ200ă€ç‹€æ…‹çąŒèĄšç€șè«‹æ±‚ćœšæŸçšźçš‹ćșŠäžŠæ˜Żă€ŒæˆćŠŸă€çš„ă€‚ 400 çŻ„ćœçš„ç‹€æ…‹çąŒèĄšç€șç”šæˆ¶ç«ŻéŒŻèȘ€ă€‚ -é‚„èš˜ćŸ—é‚Łäș›ă€Œ404 Not Found」錯èȘ€ïŒˆć’Œæą—ïŒ‰ć—ŽïŒŸ +é‚„èš˜ćŸ—é‚Łäș› **「404 Not Found」** 錯èȘ€ïŒˆć’Œæą—ïŒ‰ć—ŽïŒŸ ## äœżç”š `HTTPException` { #use-httpexception } diff --git a/docs/zh-hant/docs/tutorial/index.md b/docs/zh-hant/docs/tutorial/index.md index e19121511..e20c9ca24 100644 --- a/docs/zh-hant/docs/tutorial/index.md +++ b/docs/zh-hant/docs/tutorial/index.md @@ -98,4 +98,4 @@ FastAPI 提䟛äș† [VS Code 柘æ–čæ“Žć……ćŠŸèƒœ](https://marketplace.visualstudio. äœ†éŠ–ć…ˆäœ æ‡‰è©Čé–±èź€**æ•™ć­ž - äœżç”šè€…æŒ‡ć—**ïŒˆäœ æ­Łćœšé–±èź€çš„ć…§ćźčïŒ‰ă€‚ -ćźƒèą«èš­èšˆæˆäœ ćŻä»„äœżç”š**æ•™ć­ž - äœżç”šè€…æŒ‡ć—**䟆ć»șç«‹äž€ć€‹ćźŒæ•Žçš„æ‡‰ç”šçš‹ćŒïŒŒç„¶ćŸŒæ čæ“šäœ çš„éœ€æ±‚ïŒŒäœżç”šäž€äș›éĄć€–çš„æƒłæł•äŸ†æ“Žć±•ćźƒă€‚ +ćźƒèą«èš­èšˆæˆäœ ćŻä»„äœżç”š**æ•™ć­ž - äœżç”šè€…æŒ‡ć—**䟆ć»șç«‹äž€ć€‹ćźŒæ•Žçš„æ‡‰ç”šçš‹ćŒïŒŒç„¶ćŸŒæ čæ“šäœ çš„éœ€æ±‚ïŒŒäœżç”š**é€ČéšŽäœżç”šè€…æŒ‡ć—**侭的侀äș›éĄć€–æƒłæł•ïŒŒä»„侍搌æ–čćŒæ“Žć±•ćźƒă€‚ diff --git a/docs/zh-hant/docs/tutorial/metadata.md b/docs/zh-hant/docs/tutorial/metadata.md index 6a54724a5..55fa4bdbf 100644 --- a/docs/zh-hant/docs/tutorial/metadata.md +++ b/docs/zh-hant/docs/tutorial/metadata.md @@ -1,6 +1,6 @@ # äž­çčŒèł‡æ–™èˆ‡æ–‡ä»¶ URL { #metadata-and-docs-urls } -äœ ćŻä»„ćœšäœ çš„ FastAPI æ‡‰ç”šçš‹ćŒäž­è‡Șèš‚ć€šé …äž­çčŒèł‡æ–™èš­ćźšă€‚ +äœ ćŻä»„ćœšäœ çš„ **FastAPI** æ‡‰ç”šçš‹ćŒäž­è‡Șèš‚ć€šé …äž­çčŒèł‡æ–™èš­ćźšă€‚ ## API 的侭çčŒèł‡æ–™ { #metadata-for-api } @@ -11,7 +11,7 @@ | `title` | `str` | API çš„æš™éĄŒă€‚ | | `summary` | `str` | API çš„ç°ĄçŸ­æ‘˜èŠă€‚è‡Ș OpenAPI 3.1.0、FastAPI 0.99.0 è”·ćŻç”šă€‚ | | `description` | `str` | API 的簡短èȘȘæ˜Žă€‚ćŻäœżç”š Markdown。 | -| `version` | `string` | API çš„ç‰ˆæœŹè™Ÿă€‚é€™æ˜Żäœ è‡Șć·±çš„æ‡‰ç”šçš‹ćŒç‰ˆæœŹïŒŒäžæ˜Ż OpenAPI çš„ç‰ˆæœŹïŒŒäŸ‹ćŠ‚ `2.5.0`。 | +| `version` | `str` | API çš„ç‰ˆæœŹè™Ÿă€‚é€™æ˜Żäœ è‡Șć·±çš„æ‡‰ç”šçš‹ćŒç‰ˆæœŹïŒŒäžæ˜Ż OpenAPI çš„ç‰ˆæœŹïŒŒäŸ‹ćŠ‚ `2.5.0`。 | | `terms_of_service` | `str` | æŒ‡ć‘ API æœć‹™æąæŹŸçš„ URLă€‚è‹„æäŸ›ïŒŒćż…é ˆæ˜Ż URL。 | | `contact` | `dict` | ć°ć€–ć…Źé–‹çš„ API èŻç”Ąèł‡èšŠă€‚ćŻćŒ…ć«ć€šć€‹æŹ„äœă€‚
contact æŹ„äœ
ćƒæ•žćž‹ćˆ„èȘȘ明
namestrèŻç”Ąäșș甄çč”çš„è­˜ćˆ„ćçš±ă€‚
urlstræŒ‡ć‘èŻç”Ąèł‡èšŠçš„ URLă€‚ćż…é ˆæ˜Ż URL æ ŒćŒă€‚
emailstrèŻç”Ąäșș甄çč”çš„é›»ć­éƒ”ä»¶ćœ°ć€ă€‚ćż…é ˆæ˜Żé›»ć­éƒ”ä»¶æ ŒćŒă€‚
| | `license_info` | `dict` | ć°ć€–ć…Źé–‹çš„ API æŽˆæŹŠèł‡èšŠă€‚ćŻćŒ…ć«ć€šć€‹æŹ„äœă€‚
license_info æŹ„äœ
ćƒæ•žćž‹ćˆ„èȘȘ明
namestrćż…ćĄ«ïŒˆè‹„æœ‰èš­ćźš license_infoïŒ‰ă€‚API äœżç”šçš„æŽˆæŹŠćçš±ă€‚
identifierstrAPI 的 [SPDX](https://spdx.org/licenses/) æŽˆæŹŠèĄšç€șćŒă€‚identifier æŹ„äœèˆ‡ url æŹ„äœäș’æ–„。è‡Ș OpenAPI 3.1.0、FastAPI 0.99.0 è”·ćŻç”šă€‚
urlstrAPI æ‰€æŽĄç”šæŽˆæŹŠçš„ URLă€‚ćż…é ˆæ˜Ż URL æ ŒćŒă€‚
| @@ -46,7 +46,7 @@ æŻć€‹ dictionary ćŻćŒ…ć«ïŒš -* `name`**濅楫**ïŒ‰ïŒšäž€ć€‹ `str`ïŒŒć…¶ć€Œéœ€èˆ‡äœ ćœšè·ŻćŸ‘æ“äœœèˆ‡ `APIRouter`s 的 `tags` ćƒæ•žäž­äœżç”šçš„æš™ç±€ćçš±ç›žćŒă€‚ +* `name`**濅楫**ïŒ‰ïŒšäž€ć€‹ `str`ïŒŒć…¶ć€Œéœ€èˆ‡äœ ćœš*è·ŻćŸ‘æ“äœœ*與 `APIRouter`s 的 `tags` ćƒæ•žäž­äœżç”šçš„æš™ç±€ćçš±ç›žćŒă€‚ * `description`ïŒšäž€ć€‹ `str`ç‚șè©Čæš™ç±€çš„ç°ĄçŸ­æèż°ă€‚ćŻäœżç”š MarkdownïŒŒäžŠæœƒéĄŻç€șćœšæ–‡ä»¶ä»‹éąäž­ă€‚ * `externalDocs`ïŒšäž€ć€‹ `dict`ïŒŒæèż°ć€–éƒšæ–‡ä»¶ïŒŒćŒ…ć«ïŒš * `description`ïŒšäž€ć€‹ `str`ïŒŒć€–éƒšæ–‡ä»¶çš„ç°ĄçŸ­æèż°ă€‚ @@ -70,7 +70,7 @@ ### äœżç”šäœ çš„æš™ç±€ { #use-your-tags } -ćœšäœ çš„è·ŻćŸ‘æ“äœœïŒˆä»„ćŠ `APIRouter`sïŒ‰äžŠäœżç”š `tags` ćƒæ•žïŒŒć°‡ćźƒć€‘æ­žéĄžćˆ°äžćŒæš™ç±€äž‹ïŒš +ćœšäœ çš„*è·ŻćŸ‘æ“äœœ*ïŒˆä»„ćŠ `APIRouter`sïŒ‰äžŠäœżç”š `tags` ćƒæ•žïŒŒć°‡ćźƒć€‘æ­žéĄžćˆ°äžćŒæš™ç±€äž‹ïŒš {* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *} @@ -108,10 +108,10 @@ äœ ćŻä»„èš­ćźšć…§ć»șçš„ć…©ć€‹æ–‡ä»¶äœżç”šè€…ä»‹éąïŒš -* Swagger UI提䟛斌 `/docs`。 +* **Swagger UI**提䟛斌 `/docs`。 * 揯甹 `docs_url` ćƒæ•žèš­ćźšć…¶ URL。 * èš­ćźš `docs_url=None` 揯恜甹。 -* ReDoc提䟛斌 `/redoc`。 +* **ReDoc**提䟛斌 `/redoc`。 * 揯甹 `redoc_url` ćƒæ•žèš­ćźšć…¶ URL。 * èš­ćźš `redoc_url=None` 揯恜甹。 diff --git a/docs/zh-hant/docs/tutorial/path-operation-configuration.md b/docs/zh-hant/docs/tutorial/path-operation-configuration.md index 8461f2521..edd10178c 100644 --- a/docs/zh-hant/docs/tutorial/path-operation-configuration.md +++ b/docs/zh-hant/docs/tutorial/path-operation-configuration.md @@ -1,5 +1,6 @@ # è·ŻćŸ‘æ“äœœèš­ćźš { #path-operation-configuration } + äœ ćŻä»„ćœšäœ çš„ă€Œè·ŻćŸ‘æ“äœœèŁéŁŸć™šă€äž­ć‚łć…„ć€šć€‹ćƒæ•žäŸ†é€ČèĄŒèš­ćźšă€‚ /// warning | è­Šć‘Š diff --git a/docs/zh-hant/docs/tutorial/query-params-str-validations.md b/docs/zh-hant/docs/tutorial/query-params-str-validations.md index 1c247b0f8..99690708e 100644 --- a/docs/zh-hant/docs/tutorial/query-params-str-validations.md +++ b/docs/zh-hant/docs/tutorial/query-params-str-validations.md @@ -1,6 +1,6 @@ # æŸ„è©ąćƒæ•žèˆ‡ć­—äžČ驗證 { #query-parameters-and-string-validations } -FastAPI ć…èš±äœ ç‚șćƒæ•žćźŁć‘ŠéĄć€–çš„èł‡èšŠèˆ‡é©—è­‰ă€‚ +**FastAPI** ć…èš±äœ ç‚șćƒæ•žćźŁć‘ŠéĄć€–çš„èł‡èšŠèˆ‡é©—è­‰ă€‚ ä»„äž‹éąé€™ć€‹æ‡‰ç”šç‚ș䟋 @@ -18,14 +18,14 @@ FastAPI æœƒć› ç‚șé èš­ć€Œæ˜Ż `= None` 而矄道 `q` äžæ˜Żćż…ćĄ«ă€‚ ## éĄć€–é©—è­‰ { #additional-validation } -æˆ‘ć€‘èŠćŒ·ćˆ¶ïŒšćłäœż `q` æ˜ŻćŻéžïŒŒćȘ芁提䟛äș†ïŒŒé•·ćșŠć°±äžèƒœè¶…過 50 怋歗慃。 +æˆ‘ć€‘èŠćŒ·ćˆ¶ïŒšćłäœż `q` æ˜ŻćŻéžïŒŒćȘ芁提䟛äș†ïŒŒ**長ćșŠć°±äžèƒœè¶…過 50 怋歗慃**。 ### ćŒŻć…„ `Query` 與 `Annotated` { #import-query-and-annotated } èŠé”æˆé€™é»žïŒŒć…ˆćŒŻć…„ïŒš -- ćŸž `fastapi` ćŒŻć…„ `Query` -- ćŸž `typing` ćŒŻć…„ `Annotated` +* ćŸž `fastapi` ćŒŻć…„ `Query` +* ćŸž `typing` ćŒŻć…„ `Annotated` {* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *} @@ -69,19 +69,19 @@ q: Annotated[str | None] = None æłšæ„é èš­ć€Œä»ç„¶æ˜Ż `None`ïŒŒæ‰€ä»„é€™ć€‹ćƒæ•žä»æ˜ŻćŻéžă€‚ -äžéŽïŒŒçŸćœšćœš `Annotated` èŁĄæœ‰ `Query(max_length=50)`ïŒŒæˆ‘ć€‘ć°±ć‘ŠèšŽ FastAPI èŠć°é€™ć€‹ć€Œćšă€ŒéĄć€–é©—è­‰ă€ïŒŒæœ€ć€š 50 怋歗慃捳揯。😎 +äžéŽïŒŒçŸćœšćœš `Annotated` èŁĄæœ‰ `Query(max_length=50)`ïŒŒæˆ‘ć€‘ć°±ć‘ŠèšŽ FastAPI èŠć°é€™ć€‹ć€Œćš**éĄć€–é©—è­‰**ïŒŒæœ€ć€š 50 怋歗慃捳揯。😎 /// tip | 提ç€ș -é€™èŁĄç”šçš„æ˜Ż `Query()`ïŒŒć› ç‚șé€™æ˜Żă€ŒæŸ„è©ąćƒæ•žă€ă€‚çšćŸŒäœ æœƒçœ‹ćˆ° `Path()`、`Body()`、`Header()`、`Cookie()` ç­‰ïŒŒćźƒć€‘ä蟿Ž„ć—èˆ‡ `Query()` ç›žćŒçš„ćƒæ•žă€‚ +é€™èŁĄç”šçš„æ˜Ż `Query()`ïŒŒć› ç‚șé€™æ˜Ż**æŸ„è©ąćƒæ•ž**ă€‚çšćŸŒäœ æœƒçœ‹ćˆ° `Path()`、`Body()`、`Header()`、`Cookie()` ç­‰ïŒŒćźƒć€‘ä蟿Ž„ć—èˆ‡ `Query()` ç›žćŒçš„ćƒæ•žă€‚ /// FastAPI çŸćœšæœƒïŒš -- é©—è­‰èł‡æ–™ïŒŒçąșäżé•·ćșŠæœ€ć€š 50 怋歗慃 -- ç•¶èł‡æ–™äžćˆæł•æ™‚ïŒŒć›žç”Šç”šæˆ¶ç«Żæž…æ„šçš„éŒŻèȘ€ -- 朹 OpenAPI çš„è·ŻćŸ‘æ“äœœäž­æ–‡ä»¶ćŒ–è©Čćƒæ•žïŒˆć› æ­€æœƒć‡șçŸćœšè‡Șć‹•æ–‡ä»¶ UI +* **驗證**èł‡æ–™ïŒŒçąșäżé•·ćșŠæœ€ć€š 50 怋歗慃 +* ç•¶èł‡æ–™äžćˆæł•æ™‚ïŒŒć›žç”Šç”šæˆ¶ç«Ż**æž…æ„šçš„éŒŻèȘ€** +* 朹 OpenAPI schema *è·ŻćŸ‘æ“äœœ*äž­**æ–‡ä»¶ćŒ–**è©Čćƒæ•žïŒˆć› æ­€æœƒć‡șçŸćœš**è‡Șć‹•æ–‡ä»¶ UI** ## æ›żä»Łæ–čćŒïŒˆèˆŠïŒ‰ïŒšć°‡ `Query` 䜜ç‚șé èš­ć€Œ { #alternative-old-query-as-the-default-value } @@ -105,7 +105,8 @@ FastAPI çŸćœšæœƒïŒš q: str | None = Query(default=None) ``` -â€Šæœƒèź“ćƒæ•žèźŠç‚șćŻéžă€é èš­ć€Œæ˜Ż `None`ïŒŒç­‰ćŒæ–ŒïŒš +...æœƒèź“ćƒæ•žèźŠç‚șćŻéžă€é èš­ć€Œæ˜Ż `None`ïŒŒç­‰ćŒæ–ŒïŒš + ```Python q: str | None = None @@ -119,7 +120,7 @@ q: str | None = None q: str | None = Query(default=None, max_length=50) ``` -é€™äž€æšŁæœƒé©—è­‰èł‡æ–™ă€ćœšèł‡æ–™äžćˆæł•æ™‚éĄŻç€șæž…æ„šéŒŻèȘ€ïŒŒäžŠćœš OpenAPI çš„è·ŻćŸ‘æ“äœœäž­æ–‡ä»¶ćŒ–è©Čćƒæ•žă€‚ +é€™äž€æšŁæœƒé©—è­‰èł‡æ–™ă€ćœšèł‡æ–™äžćˆæł•æ™‚éĄŻç€șæž…æ„šéŒŻèȘ€ïŒŒäžŠćœš OpenAPI schema *è·ŻćŸ‘æ“äœœ*äž­æ–‡ä»¶ćŒ–è©Čćƒæ•žă€‚ ### 氇 `Query` 䜜ç‚șé èš­ć€Œæˆ–æ”Ÿćœš `Annotated` äž­ { #query-as-the-default-value-or-in-annotated } @@ -133,7 +134,7 @@ q: str | None = Query(default=None, max_length=50) q: Annotated[str, Query(default="rick")] = "morty" ``` -
曠ç‚șäžæž…æ„šé èš­ć€Œćˆ°ćș•è©Čæ˜Ż `"rick"` é‚„æ˜Ż `"morty"`。 +...曠ç‚șäžæž…æ„šé èš­ć€Œćˆ°ćș•è©Čæ˜Ż `"rick"` é‚„æ˜Ż `"morty"`。 ć› æ­€ïŒŒäœ ćŻä»„ïŒˆäž”æ›ŽæŽšè–ŠïŒ‰é€™æšŁćŻ«ïŒš @@ -141,7 +142,7 @@ q: Annotated[str, Query(default="rick")] = "morty" q: Annotated[str, Query()] = "rick" ``` -â€Šæˆ–ćœšèŒƒèˆŠçš„çš‹ćŒçąŒäž­äœ æœƒçœ‹ćˆ°ïŒš +...æˆ–ćœšèŒƒèˆŠçš„çš‹ćŒçąŒäž­äœ æœƒçœ‹ćˆ°ïŒš ```Python q: str = Query(default="rick") @@ -149,13 +150,13 @@ q: str = Query(default="rick") ### `Annotated` 的ć„Ș點 { #advantages-of-annotated } -ć»șè­°äœżç”š `Annotated`ïŒŒè€Œäžæ˜Żćœšć‡œćŒćƒæ•žäžŠäœżç”šïŒˆèˆŠćŒçš„ïŒ‰é èš­ć€ŒćŻ«æł•ïŒŒç†ç”±ćŸˆć€šïŒŒäž”æ›Žć„œă€‚đŸ€“ +ć»șè­°**äœżç”š `Annotated`**ïŒŒè€Œäžæ˜Żćœšć‡œćŒćƒæ•žäžŠäœżç”šé èš­ć€ŒćŻ«æł•ïŒŒç†ç”±ćŸˆć€šïŒŒäž”**æ›Žć„œ**ă€‚đŸ€“ -ć‡œćŒćƒæ•žçš„ă€Œé èš­ć€Œă€ć°±æ˜Żă€ŒćŻŠéš›çš„é èš­ć€Œă€ïŒŒé€™ćœš Python 的目èŠșäžŠæ›Žäž€è‡Žă€‚đŸ˜Œ +ć‡œćŒćƒæ•žçš„**é èš­ć€Œ**ć°±æ˜Ż**ćŻŠéš›çš„é èš­ć€Œ**ïŒŒé€™ćœš Python 的目èŠșäžŠæ›Žäž€è‡Žă€‚đŸ˜Œ -䜠äčŸćŻä»„朹æČ’有 FastAPI çš„ć…¶ä»–ćœ°æ–čă€Œç›ŽæŽ„ć‘Œć«ă€ćŒäž€ć€‹ć‡œćŒïŒŒè€Œäž”èƒœă€ŒćŠ‚é æœŸă€é‹äœœă€‚è‹„æœ‰ă€Œćż…ćĄ«ă€ćƒæ•žïŒˆæČ’æœ‰é èš­ć€ŒïŒ‰ïŒŒäœ çš„ă€Œç·šèŒŻć™šă€æœƒæç€ș錯èȘ€ïŒŒă€ŒPythonă€ćœšćŸ·èĄŒæ™‚ä蟿œƒæŠ±æ€šäœ æœȘć‚łéžćż…ćĄ«ćƒæ•žă€‚ +䜠äčŸćŻä»„朹æČ’有 FastAPI 的**ć…¶ä»–ćœ°æ–č**「**ć‘Œć«**ă€ćŒäž€ć€‹ć‡œćŒïŒŒè€Œäž”èƒœă€Œ**ćŠ‚é æœŸ**ă€é‹äœœă€‚è‹„æœ‰**濅楫**ćƒæ•žïŒˆæČ’æœ‰é èš­ć€ŒïŒ‰ïŒŒäœ çš„**ç·šèŒŻć™š**會提ç€ș錯èȘ€ïŒŒ**Python** ćœšćŸ·èĄŒæ™‚ä蟿œƒæŠ±æ€šäœ æœȘć‚łéžćż…ćĄ«ćƒæ•žă€‚ -è‹„äžäœżç”š `Annotated`、æ”čç”šă€ŒïŒˆèˆŠćŒïŒ‰é èš­ć€Œă€ćŻ«æł•ïŒŒäœ ćœšæČ’有 FastAPI çš„ă€Œć…¶ä»–ćœ°æ–čă€ć‘Œć«è©Čć‡œćŒæ™‚ïŒŒć°±ćŸ—ă€Œèš˜ćŸ—ă€ć‚łć…„æ­Łçąșćƒæ•žïŒŒćŠć‰‡ć€Œæœƒć’Œé æœŸäžćŒïŒˆäŸ‹ćŠ‚æœƒćŸ—ćˆ° `QueryInfo` æˆ–éĄžäŒŒçš„æ±è„żïŒŒè€Œäžæ˜Ż `str`ïŒ‰ă€‚äœ çš„ç·šèŒŻć™šäžæœƒæç€șPython ćŸ·èĄŒè©Čć‡œćŒæ™‚äčŸäžæœƒæŠ±æ€šïŒŒćȘæœ‰ćœšć…§éƒšæ“äœœć€±æ•—æ™‚æ‰æœƒć‡ș錯。 +è‹„äžäœżç”š `Annotated`、æ”č甹**ïŒˆèˆŠćŒïŒ‰é èš­ć€Œ**ćŻ«æł•ïŒŒäœ ćœšæČ’有 FastAPI 的**ć…¶ä»–ćœ°æ–č**ć‘Œć«è©Čć‡œćŒæ™‚ïŒŒć°±ćŸ—**èš˜ćŸ—**ć‚łć…„æ­Łçąșćƒæ•žïŒŒćŠć‰‡ć€Œæœƒć’Œé æœŸäžćŒïŒˆäŸ‹ćŠ‚æœƒćŸ—ćˆ° `QueryInfo` æˆ–éĄžäŒŒçš„æ±è„żïŒŒè€Œäžæ˜Ż `str`ïŒ‰ă€‚äœ çš„ç·šèŒŻć™šäžæœƒæç€șPython ćŸ·èĄŒè©Čć‡œćŒæ™‚äčŸäžæœƒæŠ±æ€šïŒŒćȘæœ‰ćœšć…§éƒšæ“äœœć€±æ•—æ™‚æ‰æœƒć‡ș錯。 曠ç‚ș `Annotated` ćŻä»„æœ‰ć€šć€‹äž­çčŒèł‡æ–™èš»è§ŁïŒŒäœ ç”šè‡łćŻä»„ç”šćŒäž€ć€‹ć‡œćŒé…ćˆć…¶ä»–ć·„ć…·ïŒŒäŸ‹ćŠ‚ [Typer](https://typer.tiangolo.com/)。🚀 @@ -167,19 +168,19 @@ q: str = Query(default="rick") ## ćŠ ć…„æ­ŁèŠèĄšç€șćŒ { #add-regular-expressions } -äœ ćŻä»„ćźšçŸ©ćƒæ•žćż…é ˆçŹŠćˆçš„ æ­ŁèŠèĄšç€șćŒ `pattern` +äœ ćŻä»„ćźšçŸ©ćƒæ•žćż…é ˆçŹŠćˆçš„ æ­ŁèŠèĄšç€șćŒ `pattern` {* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *} 這怋ç‰čćźšçš„æ­ŁèŠèĄšç€șćŒæšŁćŒæœƒæȘ࿟„æ”¶ćˆ°çš„ćƒæ•žć€Œæ˜ŻćŠïŒš -- `^`ïŒšä»„ćŸŒçșŒçš„ć­—ć…ƒé–‹é ­ïŒŒć‰éąäžèƒœæœ‰ć…¶ä»–ć­—ć…ƒă€‚ -- `fixedquery`ïŒšćż…é ˆæ­Łć„œç­‰æ–Œ `fixedquery`。 -- `$`ïŒšćœšæ­€ç”æŸïŒŒ`fixedquery` ćŸŒéąäžèƒœć†æœ‰ć…¶ä»–ć­—ć…ƒă€‚ +* `^`ïŒšä»„ćŸŒçșŒçš„ć­—ć…ƒé–‹é ­ïŒŒć‰éąäžèƒœæœ‰ć…¶ä»–ć­—ć…ƒă€‚ +* `fixedquery`ïŒšćż…é ˆæ­Łć„œç­‰æ–Œ `fixedquery`。 +* `$`ïŒšćœšæ­€ç”æŸïŒŒ`fixedquery` ćŸŒéąäžèƒœć†æœ‰ć…¶ä»–ć­—ć…ƒă€‚ -ćŠ‚æžœäœ ć°ă€Œæ­ŁèŠèĄšç€șćŒă€æ„Ÿćˆ°ć›°æƒ‘ïŒŒćˆ„æ“”ćżƒă€‚é€™ć°ćŸˆć€šäșș䟆èȘȘ郜䞍ćźčæ˜“ă€‚äœ ä»ç„¶ćŻä»„ć…ˆäžäœżç”šæ­ŁèŠèĄšç€șćŒć°±ćźŒæˆćŸˆć€šäș‹æƒ…。 +ćŠ‚æžœäœ ć°æ‰€æœ‰é€™äș›**ă€Œæ­ŁèŠèĄšç€șćŒă€**æŠ‚ćż”æ„Ÿćˆ°ć›°æƒ‘ïŒŒćˆ„æ“”ćżƒă€‚é€™ć°ćŸˆć€šäșș䟆èȘȘ郜䞍ćźčæ˜“ă€‚äœ ä»ç„¶ćŻä»„ć…ˆäžäœżç”šæ­ŁèŠèĄšç€șćŒć°±ćźŒæˆćŸˆć€šäș‹æƒ…。 -çŸćœšäœ çŸ„é“ïŒŒç•¶äœ éœ€èŠćźƒć€‘æ™‚ïŒŒćŻä»„ćœš FastAPI äž­äœżç”šćźƒć€‘ă€‚ +çŸćœšäœ çŸ„é“ïŒŒç•¶äœ éœ€èŠćźƒć€‘æ™‚ïŒŒćŻä»„ćœš **FastAPI** äž­äœżç”šćźƒć€‘ă€‚ ## é èš­ć€Œ { #default-values } @@ -235,13 +236,13 @@ q: Annotated[str | None, Query(min_length=3)] = None {* ../../docs_src/query_params_str_validations/tutorial011_an_py310.py hl[9] *} -è‹„äœżç”šé€™æšŁçš„ URL +æŽ„è‘—ïŒŒè‹„äœżç”šé€™æšŁçš„ URL ``` http://localhost:8000/items/?q=foo&q=bar ``` -äœ æœƒćœšè·ŻćŸ‘æ“äœœć‡œćŒçš„ćƒæ•ž `q` äž­ïŒŒæ”¶ćˆ°ć€šć€‹ `q` æŸ„è©ąćƒæ•žçš„ć€ŒïŒˆ`foo` 與 `bar`仄 Python 的 `list` ćœąćŒă€‚ +äœ æœƒćœš*è·ŻćŸ‘æ“äœœć‡œćŒ*的*ć‡œćŒćƒæ•ž* `q` äž­ïŒŒæ”¶ćˆ°ć€šć€‹ `q` *æŸ„è©ąćƒæ•ž*çš„ć€ŒïŒˆ`foo` 與 `bar`仄 Python 的 `list` ćœąćŒă€‚ ć› æ­€ïŒŒć°è©Č URL çš„ć›žæ‡‰æœƒæ˜ŻïŒš @@ -276,7 +277,7 @@ http://localhost:8000/items/?q=foo&q=bar http://localhost:8000/items/ ``` -`q` çš„é èš­ć€Œæœƒæ˜ŻïŒš`["foo", "bar"]`ïŒŒè€Œć›žæ‡‰æœƒæ˜ŻïŒš +`q` çš„é èš­ć€Œæœƒæ˜ŻïŒš`["foo", "bar"]`ïŒŒè€Œäœ çš„ć›žæ‡‰æœƒæ˜ŻïŒš ```JSON { @@ -359,15 +360,15 @@ http://127.0.0.1:8000/items/?item-query=foobaritems ## ćŸž OpenAPI æŽ’é™€ćƒæ•ž { #exclude-parameters-from-openapi } -è‹„èŠæŠŠæŸć€‹æŸ„è©ąćƒæ•žćŸžç”ąç”Ÿçš„ OpenAPIïŒˆä»„ćŠè‡Șć‹•æ–‡ä»¶çł»ç”±ïŒ‰äž­æŽ’é™€ïŒŒć°‡ `Query` 的 `include_in_schema` èš­ç‚ș `False` +è‹„èŠæŠŠæŸć€‹æŸ„è©ąćƒæ•žćŸžç”ąç”Ÿçš„ OpenAPI schemaïŒˆä»„ćŠè‡Șć‹•æ–‡ä»¶çł»ç”±ïŒ‰äž­æŽ’é™€ïŒŒć°‡ `Query` 的 `include_in_schema` èš­ç‚ș `False` {* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *} ## è‡Ș蚂驗證 { #custom-validation } -æœ‰æ™‚äœ éœ€èŠćšäž€äș›äžŠèż°ćƒæ•žç„Ąæł•è™•ç†çš„ă€Œè‡Șèš‚é©—è­‰ă€ă€‚ +æœ‰æ™‚äœ éœ€èŠćšäž€äș›äžŠèż°ćƒæ•žç„Ąæł•處理的**è‡Ș蚂驗證**。 -é€™çšźæƒ…æłäž‹ïŒŒäœ ćŻä»„äœżç”šă€Œè‡Șèš‚é©—è­‰ć‡œćŒă€ïŒŒćźƒæœƒćœšäž€èˆŹé©—è­‰äč‹ćŸŒć„—ç”šïŒˆäŸ‹ćŠ‚ć…ˆçąșèȘć€Œæ˜Ż `str` äč‹ćŸŒïŒ‰ă€‚ +é€™çšźæƒ…æłäž‹ïŒŒäœ ćŻä»„äœżç”š**è‡Șèš‚é©—è­‰ć‡œćŒ**ïŒŒćźƒæœƒćœšäž€èˆŹé©—è­‰äč‹ćŸŒć„—ç”šïŒˆäŸ‹ćŠ‚ć…ˆçąșèȘć€Œæ˜Ż `str` äč‹ćŸŒïŒ‰ă€‚ äœ ćŻä»„ćœš `Annotated` äž­äœżç”š [Pydantic 的 `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) äŸ†é”æˆă€‚ @@ -389,15 +390,15 @@ Pydantic ä蟿œ‰ [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va /// tip | 提ç€ș -ćŠ‚æžœäœ éœ€èŠćšä»»äœ•éœ€èŠèˆ‡ă€Œć€–éƒšć…ƒä»¶ă€æșé€šçš„é©—è­‰ïŒˆäŸ‹ćŠ‚èł‡æ–™ćș«æˆ–ć…¶ä»– API應è©Čæ”č甹「FastAPI äŸèłŽă€ïŒˆFastAPI DependenciesïŒ‰ïŒŒäœ çšćŸŒæœƒć­žćˆ°ă€‚ +ćŠ‚æžœäœ éœ€èŠćšä»»äœ•éœ€èŠèˆ‡**ć€–éƒšć…ƒä»¶**æșé€šçš„é©—è­‰ïŒˆäŸ‹ćŠ‚èł‡æ–™ćș«æˆ–ć…¶ä»– API應è©Čæ”č甹 **FastAPI Dependencies**ïŒŒäœ çšćŸŒæœƒć­žćˆ°ă€‚ -這äș›è‡Șèš‚é©—è­‰ć™šé©ç”šæ–ŒćȘéœ€äœżç”šè«‹æ±‚äž­ă€ŒćŒäž€ä»œèł‡æ–™ă€ćłćŻćźŒæˆçš„æȘ࿟„。 +這äș›è‡Șèš‚é©—è­‰ć™šé©ç”šæ–ŒćȘéœ€äœżç”šè«‹æ±‚äž­**ćŒäž€ä»œèł‡æ–™**ćłćŻćźŒæˆçš„æȘ࿟„。 /// ### ç†è§Łé€™æź”çš‹ćŒçąŒ { #understand-that-code } -é‡é»žć°±æ˜Żćœš `Annotated` äž­äœżç”šă€Œ`AfterValidator` æ­é…ć‡œćŒă€ă€‚ćŠ‚æžœäœ éĄ˜æ„ïŒŒćŻä»„ç•„éŽé€™äž€çŻ€ă€‚đŸ€ž +é‡é»žć°±æ˜Żćœš `Annotated` äž­äœżç”š **`AfterValidator` æ­é…ć‡œćŒ**ă€‚ćŠ‚æžœäœ éĄ˜æ„ïŒŒćŻä»„ç•„éŽé€™äž€çŻ€ă€‚đŸ€ž --- @@ -415,13 +416,13 @@ Pydantic ä蟿œ‰ [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va æˆ‘ć€‘ç”š `list(data.items())` æŠŠé€™ć€‹ćŻç–Šä»Łç‰©ä»¶èœ‰æˆæ­ŁćŒçš„ `list`。 -掄著甚 `random.choice()` ćŸžæž…ć–źäž­ć–ćŸ—äž€ć€‹ă€Œéššæ©Ÿć€Œă€ïŒŒäčŸć°±æ˜Żäž€ć€‹ `(id, name)` 的 tupleă€‚ćŻèƒœćƒæ˜Ż `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`。 +掄著甚 `random.choice()` ćŸžæž…ć–źäž­ć–ćŸ—äž€ć€‹**éššæ©Ÿć€Œ**äčŸć°±æ˜Żäž€ć€‹ `(id, name)` 的 tupleă€‚ćŻèƒœćƒæ˜Ż `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`。 -ç„¶ćŸŒæŠŠé€™ć€‹ tuple çš„ć…©ć€‹ć€Œćˆ†ćˆ„æŒ‡ćźšç”ŠèźŠæ•ž `id` 撌 `name`。 +ç„¶ćŸŒæŠŠé€™ć€‹ tuple 的**ć…©ć€‹ć€Œćˆ†ćˆ„æŒ‡ćźš**ç”ŠèźŠæ•ž `id` 撌 `name`。 ć› æ­€ïŒŒćłäœżäœżç”šè€…æČ’有提䟛 item IDïŒŒä»ç„¶æœƒæ”¶ćˆ°äž€ć€‹éššæ©Ÿć»șè­°ă€‚ -â€Šâ€Šè€Œé€™ć…šéƒšćȘç”šäž€èĄŒç°Ąć–źçš„çš‹ćŒçąŒćźŒæˆă€‚đŸ€Ż 䜠䞍愛 Python ć—ŽïŒŸđŸ +...è€Œé€™ć…šéƒšćȘ甹**äž€èĄŒç°Ąć–źçš„çš‹ćŒçąŒ**ćźŒæˆă€‚đŸ€Ż 䜠䞍愛 Python ć—ŽïŒŸđŸ {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *} @@ -431,16 +432,16 @@ Pydantic ä蟿œ‰ [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va 通甚的驗證與䞭çčŒèł‡æ–™ïŒš -- `alias` -- `title` -- `description` -- `deprecated` +* `alias` +* `title` +* `description` +* `deprecated` 歗äžČć°ˆç”šçš„é©—è­‰ïŒš -- `min_length` -- `max_length` -- `pattern` +* `min_length` +* `max_length` +* `pattern` äœżç”š `AfterValidator` 的è‡Șèš‚é©—è­‰ă€‚ diff --git a/docs/zh-hant/docs/tutorial/query-params.md b/docs/zh-hant/docs/tutorial/query-params.md index 24b0cb404..86cf60a5a 100644 --- a/docs/zh-hant/docs/tutorial/query-params.md +++ b/docs/zh-hant/docs/tutorial/query-params.md @@ -67,7 +67,7 @@ http://127.0.0.1:8000/items/?skip=20 /// tip | 提ç€ș -ćŠć€–è«‹æłšæ„ïŒŒFastAPI 胜蟚識ć‡șè·ŻćŸ‘ćƒæ•ž `item_id` æ˜Żè·ŻćŸ‘ćƒæ•žïŒŒè€Œ `q` äžæ˜ŻïŒŒć› æ­€ `q` æœƒèą«ç•¶äœœæŸ„è©ąćƒæ•žă€‚ +ćŠć€–è«‹æłšæ„ïŒŒ**FastAPI** 胜蟚識ć‡șè·ŻćŸ‘ćƒæ•ž `item_id` æ˜Żè·ŻćŸ‘ćƒæ•žïŒŒè€Œ `q` äžæ˜ŻïŒŒć› æ­€ `q` æœƒèą«ç•¶äœœæŸ„è©ąćƒæ•žă€‚ /// @@ -109,9 +109,10 @@ http://127.0.0.1:8000/items/foo?short=yes æˆ–ä»»äœ•ć…¶ä»–ć€§ć°ćŻ«èźŠćŒ–ïŒˆć…šć€§ćŻ«ă€éŠ–ć­—æŻć€§ćŻ«ç­‰ïŒ‰ïŒŒäœ çš„ć‡œćŒæœƒć°‡ćƒæ•ž `short` 芖ç‚ș `bool` ć€Œ `True`。搩扇ç‚ș `False`。 + ## ć€šć€‹è·ŻćŸ‘èˆ‡æŸ„è©ąćƒæ•ž { #multiple-path-and-query-parameters } -äœ ćŻä»„ćŒæ™‚ćźŁć‘Šć€šć€‹è·ŻćŸ‘ćƒæ•žèˆ‡æŸ„è©ąćƒæ•žïŒŒFastAPI 會è‡Șć‹•ćˆ†èŸšă€‚ +äœ ćŻä»„ćŒæ™‚ćźŁć‘Šć€šć€‹è·ŻćŸ‘ćƒæ•žèˆ‡æŸ„è©ąćƒæ•žïŒŒ**FastAPI** 會è‡Șć‹•ćˆ†èŸšă€‚ è€Œäž”äžćż…æŒ‰ç‰č漚順ćșćźŁć‘Šă€‚ diff --git a/docs/zh-hant/docs/tutorial/request-files.md b/docs/zh-hant/docs/tutorial/request-files.md index 1d95bf0cd..979a579eb 100644 --- a/docs/zh-hant/docs/tutorial/request-files.md +++ b/docs/zh-hant/docs/tutorial/request-files.md @@ -1,5 +1,6 @@ # 請求䞭的æȘ”æĄˆ { #request-files } + äœ ćŻä»„äœżç”š `File` ćźšçŸ©ç”±ç”šæˆ¶ç«ŻäžŠć‚łçš„æȘ”æĄˆă€‚ /// note diff --git a/docs/zh-hant/docs/tutorial/request-forms.md b/docs/zh-hant/docs/tutorial/request-forms.md index 28d50c3af..590779168 100644 --- a/docs/zh-hant/docs/tutorial/request-forms.md +++ b/docs/zh-hant/docs/tutorial/request-forms.md @@ -1,5 +1,6 @@ # èĄšć–źèł‡æ–™ { #form-data } + ç•¶äœ éœ€èŠæŽ„æ”¶èĄšć–źæŹ„äœè€Œäžæ˜Ż JSON æ™‚ïŒŒćŻä»„äœżç”š `Form`。 /// note diff --git a/docs/zh-hant/docs/tutorial/response-status-code.md b/docs/zh-hant/docs/tutorial/response-status-code.md index 9ed047fa5..d649dc785 100644 --- a/docs/zh-hant/docs/tutorial/response-status-code.md +++ b/docs/zh-hant/docs/tutorial/response-status-code.md @@ -1,5 +1,6 @@ # ć›žæ‡‰ç‹€æ…‹çąŒ { #response-status-code } + ć°±ćƒäœ ćŻä»„æŒ‡ćźšć›žæ‡‰æšĄćž‹äž€æšŁïŒŒäœ äčŸćŻä»„ćœšä»»äž€ć€‹ă€Œè·ŻćŸ‘æ“äœœïŒˆpath operationïŒ‰ă€çš„ćƒæ•ž `status_code` äž­ćźŁć‘Šć›žæ‡‰æ‰€äœżç”šçš„ HTTP ç‹€æ…‹çąŒïŒš * `@app.get()` diff --git a/docs/zh-hant/docs/tutorial/schema-extra-example.md b/docs/zh-hant/docs/tutorial/schema-extra-example.md index 01c4a217a..8cca5003a 100644 --- a/docs/zh-hant/docs/tutorial/schema-extra-example.md +++ b/docs/zh-hant/docs/tutorial/schema-extra-example.md @@ -10,7 +10,7 @@ {* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *} -這äș›éĄć€–èł‡èšŠæœƒćŽŸć°äžć‹•ćŠ ć…„è©ČæšĄćž‹èŒžć‡ș的 JSON SchemaïŒŒäžŠäž”æœƒç”šćœš API æ–‡ä»¶èŁĄă€‚ +這äș›éĄć€–èł‡èšŠæœƒćŽŸć°äžć‹•ćŠ ć…„è©ČæšĄćž‹èŒžć‡ș的 **JSON Schema**ïŒŒäžŠäž”æœƒç”šćœš API æ–‡ä»¶èŁĄă€‚ äœ ćŻä»„äœżç”šć±Źæ€§ `model_config`ïŒˆæŽ„æ”¶äž€ć€‹ `dict`ïŒ‰ïŒŒè©łèŠ‹ [Pydantic 文件Configuration](https://docs.pydantic.dev/latest/api/config/)。 @@ -135,7 +135,7 @@ OpenAPI 3.1.0è‡Ș FastAPI 0.99.0 è”·äœżç”šïŒ‰æ–°ćąžäș†ć° `examples` çš„æ”ŻæŽ ä»„äž‹æ˜Żé—œæ–Œ **JSON Schema** 與 **OpenAPI** æš™æș–çš„æŠ€èĄ“çŽ°çŻ€ă€‚ -ćŠ‚æžœäžŠéąçš„ćšæł•ć°äœ ć·Čç¶“è¶łć€ ćŻç”šïŒŒć°±äžéœ€èŠé€™äș›çŽ°çŻ€ïŒŒć„˜çźĄç›ŽæŽ„è·łéŽă€‚ +ćŠ‚æžœäžŠéąçš„ćšæł•ć°äœ ć·Čç¶“è¶łć€ ćŻç”šïŒŒć°±äžéœ€èŠé€™äș›çŽ°çŻ€ïŒŒćŻä»„ç›ŽæŽ„è·łéŽă€‚ /// diff --git a/docs/zh-hant/docs/tutorial/security/first-steps.md b/docs/zh-hant/docs/tutorial/security/first-steps.md index b7db93b50..7640a4556 100644 --- a/docs/zh-hant/docs/tutorial/security/first-steps.md +++ b/docs/zh-hant/docs/tutorial/security/first-steps.md @@ -1,16 +1,16 @@ # ćź‰ć…šæ€§ - ć…„é–€ { #security-first-steps } -æƒłćƒäœ æœ‰äž€ć€‹éƒšçœČćœšæŸć€‹ç¶ČćŸŸçš„ćŸŒç«Ż API。 +æƒłćƒäœ æœ‰äž€ć€‹éƒšçœČćœšæŸć€‹ç¶Č柟的 **ćŸŒç«Ż** API。 -é‚„æœ‰äž€ć€‹ć‰ç«ŻćœšćŠäž€ć€‹ç¶ČćŸŸïŒŒæˆ–ćŒäž€ç¶ČćŸŸçš„äžćŒè·ŻćŸ‘ïŒˆæˆ–æ˜ŻèĄŒć‹•æ‡‰ç”šçš‹ćŒïŒ‰ă€‚ +é‚„æœ‰äž€ć€‹ **ć‰ç«Ż** 朹揩侀怋ç¶ČćŸŸïŒŒæˆ–ćŒäž€ç¶ČćŸŸçš„äžćŒè·ŻćŸ‘ïŒˆæˆ–æ˜ŻèĄŒć‹•æ‡‰ç”šçš‹ćŒïŒ‰ă€‚ -äœ ćžŒæœ›ć‰ç«Żèƒœç”šäœżç”šè€…ćçš±èˆ‡ćŻ†çąŒć‘ćŸŒç«Żé€ČèĄŒèș«ćˆ†é©—è­‰ă€‚ +äœ ćžŒæœ›ć‰ç«Żèƒœç”š**äœżç”šè€…ćçš±**與**ćŻ†çąŒ**ć‘ćŸŒç«Żé€ČèĄŒèș«ćˆ†é©—è­‰ă€‚ -æˆ‘ć€‘ćŻä»„ç”š OAuth2 搭配 FastAPI äŸ†ćŻŠäœœă€‚ +æˆ‘ć€‘ćŻä»„ç”š **OAuth2** 搭配 **FastAPI** äŸ†ćŻŠäœœă€‚ äœ†äžćż…é€šèź€æ•Žä»œć†—é•·èŠæ ŒćȘç‚șäș†æ‰Ÿć‡ș䜠需芁的ćčŸć€‹é‡é»žă€‚ -氱甚 FastAPI æäŸ›çš„ć·„ć…·è™•ç†ćź‰ć…šæ€§ă€‚ +氱甚 **FastAPI** æäŸ›çš„ć·„ć…·è™•ç†ćź‰ć…šæ€§ă€‚ ## çœ‹è”·äŸ†ćŠ‚äœ• { #how-it-looks } @@ -26,7 +26,7 @@ /// note -ç•¶äœ äœżç”š `pip install "fastapi[standard]"` æŒ‡ä»€ćź‰èŁæ™‚ïŒŒ[`python-multipart`](https://github.com/Kludex/python-multipart) ć„—ä»¶æœƒéšš FastAPI è‡Șć‹•ćź‰èŁă€‚ +ç•¶äœ äœżç”š `pip install "fastapi[standard]"` æŒ‡ä»€ćź‰èŁæ™‚ïŒŒ[`python-multipart`](https://github.com/Kludex/python-multipart) ć„—ä»¶æœƒéšš **FastAPI** è‡Șć‹•ćź‰èŁă€‚ 䞍過苄ćȘćŸ·èĄŒ `pip install fastapi`ïŒŒé èš­äžæœƒćŒ…ć« `python-multipart`。 @@ -36,7 +36,7 @@ $ pip install python-multipart ``` -曠ç‚ș OAuth2 æœƒä»„ă€Œform data」悳送 `username` 與 `password`。 +曠ç‚ș **OAuth2** æœƒä»„ă€Œform data」悳送 `username` 與 `password`。 /// @@ -62,9 +62,9 @@ $ fastapi dev /// tip | Authorize 按鈕 -äœ æœƒçœ‹ćˆ°äž€ć€‹æ–°çš„ă€ŒAuthorizeă€æŒ‰éˆ•ă€‚ +䜠ć·Čç¶“æœ‰äž€ć€‹äșźçœŒçš„ć…šæ–°ă€ŒAuthorizeă€æŒ‰éˆ•ă€‚ -è€Œäœ çš„ă€Œè·ŻćŸ‘æ“äœœă€ćłäžŠè§’ä蟿œƒć‡șçŸäž€ć€‹ć°éŽ–é ­ćŻä»„é»žæ“Šă€‚ +而䜠的 *è·ŻćŸ‘æ“äœœ* ćłäžŠè§’ä蟿œƒć‡șçŸäž€ć€‹ć°éŽ–é ­ćŻä»„é»žæ“Šă€‚ /// @@ -94,29 +94,29 @@ $ fastapi dev OAuth2 çš„èš­èšˆèź“ćŸŒç«Żæˆ– API ćŻä»„çšç«‹æ–ŒćŸ·èĄŒäœżç”šè€…é©—è­‰çš„äŒșæœć™šă€‚ -äœ†ćœšé€™ć€‹äŸ‹ć­äž­ïŒŒćŒäž€ć€‹ FastAPI æ‡‰ç”šæœƒćŒæ™‚è™•ç† API èˆ‡é©—è­‰ă€‚ +äœ†ćœšé€™ć€‹äŸ‹ć­äž­ïŒŒćŒäž€ć€‹ **FastAPI** æ‡‰ç”šæœƒćŒæ™‚è™•ç† API èˆ‡é©—è­‰ă€‚ ç°ĄćŒ–äŸ†çœ‹æ”çš‹ćŠ‚äž‹ïŒš - äœżç”šè€…ćœšć‰ç«ŻèŒžć…„ `username` 與 `password`按䞋 `Enter`。 - ć‰ç«ŻïŒˆćœšäœżç”šè€…çš„ç€èŠœć™šäž­ćŸ·èĄŒïŒ‰æŠŠ `username` 與 `password` ć‚łćˆ°æˆ‘ć€‘ API 的ç‰č漚 URLïŒˆćœšçš‹ćŒäž­ćźŁć‘Šç‚ș `tokenUrl="token"`ïŒ‰ă€‚ -- API æȘ࿟„ `username` 與 `password`ïŒŒäžŠć›žć‚łäž€ć€‹ă€ŒtokenïŒˆæŹŠæ–ïŒ‰ă€ïŒˆæˆ‘ć€‘é‚„æČ’ćŻŠäœœé€™éƒšćˆ†ïŒ‰ă€‚ +- API æȘ࿟„ `username` 與 `password`ïŒŒäžŠć›žæ‡‰äž€ć€‹ă€ŒtokenïŒˆæŹŠæ–ïŒ‰ă€ïŒˆæˆ‘ć€‘é‚„æČ’ćŻŠäœœé€™éƒšćˆ†ïŒ‰ă€‚ - 「tokenïŒˆæŹŠæ–ïŒ‰ă€ć°±æ˜Żäž€æź”ć­—äžČäč‹ćŸŒćŻç”šäŸ†è­˜ćˆ„äžŠé©—è­‰æ­€äœżç”šè€…ă€‚ - 通澾 token æœƒèš­ćźšäž€æź”æ™‚é–“ćŸŒć€±æ•ˆă€‚ - ć› æ­€äœżç”šè€…äč‹ćŸŒéœ€èŠé‡æ–°ç™»ć…„ă€‚ - è‹„ token èą«ç«Šć–ïŒŒéąšéšȘäčŸèŒƒäœŽïŒ›ćźƒäžćƒæ°žé æœ‰æ•ˆçš„èŹç”šé‘°ćŒ™ïŒˆć€šæ•žæƒ…æłäž‹ïŒ‰ă€‚ - ć‰ç«Żæœƒæš«ć­˜é€™ć€‹ token。 -- äœżç”šè€…ćœšć‰ç«Żé»žæ“Šć‰ćŸ€ć…¶ä»–é éą/ć€æź”ă€‚ +- äœżç”šè€…ćœšć‰ç«Żé»žæ“ŠïŒŒć‰ćŸ€ć‰ç«Żç¶Čé æ‡‰ç”šçš‹ćŒçš„ćŠäž€ć€‹ć€æź”ă€‚ - ć‰ç«Żéœ€èŠć†ć‘ API ć–ćŸ—èł‡æ–™ă€‚ - 䜆è©Čç«Żé»žéœ€èŠé©—è­‰ă€‚ - ć› æ­€ç‚șäș†ć‘ API é©—è­‰ïŒŒè«‹æ±‚æœƒćž¶äžŠäž€ć€‹ `Authorization` æš™é ­ïŒŒć€Œç‚ș `Bearer ` 抠侊 token。 - äŸ‹ćŠ‚ token æ˜Ż `foobar`ïŒŒć‰‡ `Authorization` æš™é ­ć…§ćźčç‚ș`Bearer foobar`。 -## FastAPI 的 `OAuth2PasswordBearer` { #fastapis-oauth2passwordbearer } +## **FastAPI** 的 `OAuth2PasswordBearer` { #fastapis-oauth2passwordbearer } -FastAPI æäŸ›ć€šć±€æŠœè±Ąçš„ć·„ć…·äŸ†ćŻŠäœœé€™äș›ćź‰ć…šæ©Ÿćˆ¶ă€‚ +**FastAPI** æäŸ›ć€šć±€æŠœè±Ąçš„ć·„ć…·äŸ†ćŻŠäœœé€™äș›ćź‰ć…šæ©Ÿćˆ¶ă€‚ -æœŹäŸ‹ć°‡äœżç”š OAuth2 的 Password 攁皋䞊仄 Bearer token é€ČèĄŒé©—è­‰ïŒ›æˆ‘ć€‘æœƒç”š `OAuth2PasswordBearer` éĄžćˆ„äŸ†ćźŒæˆă€‚ +æœŹäŸ‹ć°‡äœżç”š **OAuth2** 的 **Password** 攁皋䞊仄 **Bearer** token é€ČèĄŒé©—è­‰ïŒ›æˆ‘ć€‘æœƒç”š `OAuth2PasswordBearer` éĄžćˆ„äŸ†ćźŒæˆă€‚ /// note @@ -126,7 +126,7 @@ FastAPI æäŸ›ć€šć±€æŠœè±Ąçš„ć·„ć…·äŸ†ćŻŠäœœé€™äș›ćź‰ć…šæ©Ÿćˆ¶ă€‚ é€šćžžć°ć€šæ•žæƒ…ćąƒäčŸè¶łć€ ïŒŒé™€éžäœ æ˜Ż OAuth2 氈柶䞊çąșäżĄæœ‰æ›Žé©ćˆäœ çš„éžé …ă€‚ -ćœšé‚Łçšźæƒ…æłäž‹ïŒŒFastAPI ä蟿äŸ›ç›žæ‡‰ć·„ć…·èź“äœ è‡ȘèĄŒç”„ćˆă€‚ +ćœšé‚Łçšźæƒ…æłäž‹ïŒŒ**FastAPI** ä蟿äŸ›ç›žæ‡‰ć·„ć…·èź“äœ è‡ȘèĄŒç”„ćˆă€‚ /// @@ -144,7 +144,7 @@ FastAPI æäŸ›ć€šć±€æŠœè±Ąçš„ć·„ć…·äŸ†ćŻŠäœœé€™äș›ćź‰ć…šæ©Ÿćˆ¶ă€‚ /// -é€™ć€‹ćƒæ•žäžæœƒć»ș立è©Čç«Żé»žïŒă€Œè·ŻćŸ‘æ“äœœă€ïŒŒè€Œæ˜ŻćźŁć‘Š `/token` ć°‡æ˜Żćźąæˆ¶ç«Żç”šäŸ†ć–ćŸ— token 的 URL。這äș›èł‡èšŠæœƒć‡șçŸćœš OpenAPIïŒŒäžŠèą«äș’ć‹•ćŒ API æ–‡ä»¶çł»ç”±äœżç”šă€‚ +é€™ć€‹ćƒæ•žäžæœƒć»ș立è©Č端點 / *è·ŻćŸ‘æ“äœœ*ïŒŒè€Œæ˜ŻćźŁć‘Š `/token` ć°‡æ˜Żćźąæˆ¶ç«Żç”šäŸ†ć–ćŸ— token 的 URL。這äș›èł‡èšŠæœƒć‡șçŸćœš OpenAPIïŒŒäžŠèą«äș’ć‹•ćŒ API æ–‡ä»¶çł»ç”±äœżç”šă€‚ æˆ‘ć€‘ćŸˆćż«ä蟿œƒć»șç«‹ćŻŠéš›çš„è·ŻćŸ‘æ“äœœă€‚ @@ -172,15 +172,15 @@ oauth2_scheme(some, parameters) {* ../../docs_src/security/tutorial001_an_py310.py hl[12] *} -æ­€ç›žäŸæ€§æœƒæäŸ›äž€ć€‹ `str`ïŒŒæŒ‡æŽŸç”Šă€Œè·ŻćŸ‘æ“äœœć‡œćŒă€çš„ćƒæ•ž `token`。 +æ­€ç›žäŸæ€§æœƒæäŸ›äž€ć€‹ `str`指掟甊 *è·ŻćŸ‘æ“äœœć‡œćŒ* çš„ćƒæ•ž `token`。 -FastAPI æœƒçŸ„é“ćŻä»„äœżç”šé€™ć€‹ç›žäŸæ€§ïŒŒćœš OpenAPIïŒˆä»„ćŠè‡Ș拕由生的 API æ–‡ä»¶ïŒ‰äž­ćźšçŸ©äž€ć€‹ă€Œćź‰ć…šæ€§æ–čæĄˆă€ă€‚ +**FastAPI** æœƒçŸ„é“ćŻä»„äœżç”šé€™ć€‹ç›žäŸæ€§ïŒŒćœš OpenAPI schemaïŒˆä»„ćŠè‡Ș拕由生的 API æ–‡ä»¶ïŒ‰äž­ćźšçŸ©äž€ć€‹ă€Œćź‰ć…šæ€§æ–čæĄˆă€ă€‚ /// note | æŠ€èĄ“çŽ°çŻ€ -FastAPI ä苿‰€ä»„çŸ„é“ćŻä»„ç”šïŒˆç›žäŸæ€§äž­ćźŁć‘Šçš„ïŒ‰`OAuth2PasswordBearer` éĄžćˆ„ïŒŒćœš OpenAPI äž­ćźšçŸ©ćź‰ć…šæ€§æ–čæĄˆïŒŒæ˜Żć› ç‚ș柃çčŒæ‰żè‡Ș `fastapi.security.oauth2.OAuth2`ïŒŒè€ŒćŸŒè€…ćˆçčŒæ‰żè‡Ș `fastapi.security.base.SecurityBase`。 +**FastAPI** ä苿‰€ä»„çŸ„é“ćŻä»„ç”šïŒˆç›žäŸæ€§äž­ćźŁć‘Šçš„ïŒ‰`OAuth2PasswordBearer` éĄžćˆ„ïŒŒćœš OpenAPI äž­ćźšçŸ©ćź‰ć…šæ€§æ–čæĄˆïŒŒæ˜Żć› ç‚ș柃çčŒæ‰żè‡Ș `fastapi.security.oauth2.OAuth2`ïŒŒè€ŒćŸŒè€…ćˆçčŒæ‰żè‡Ș `fastapi.security.base.SecurityBase`。 -所有胜與 OpenAPIïŒˆä»„ćŠè‡Ș拕 API æ–‡ä»¶ïŒ‰æ•Žćˆçš„ćź‰ć…šć·„ć…·éƒœçčŒæ‰żè‡Ș `SecurityBase`FastAPI æ‰èƒœçŸ„é“ćŠ‚äœ•æŠŠćźƒć€‘æ•Žćˆé€Č OpenAPI。 +所有胜與 OpenAPIïŒˆä»„ćŠè‡Ș拕 API æ–‡ä»¶ïŒ‰æ•Žćˆçš„ćź‰ć…šć·„ć…·éƒœçčŒæ‰żè‡Ș `SecurityBase`**FastAPI** æ‰èƒœçŸ„é“ćŠ‚äœ•æŠŠćźƒć€‘æ•Žćˆé€Č OpenAPI。 /// @@ -188,7 +188,7 @@ FastAPI ä苿‰€ä»„çŸ„é“ćŻä»„ç”šïŒˆç›žäŸæ€§äž­ćźŁć‘Šçš„ïŒ‰`OAuth2PasswordBearer ćźƒæœƒćŸžè«‹æ±‚äž­ć°‹æ‰Ÿ `Authorization` 暙頭æȘ࿟„ć…¶ć€Œæ˜ŻćŠç‚ș `Bearer ` ćŠ äžŠäž€æź” tokenïŒŒäžŠć°‡è©Č token 仄 `str` 曞悳。 -è‹„æœȘæ‰Ÿćˆ° `Authorization` æš™é ­ïŒŒæˆ–ć…¶ć€Œäžæ˜Ż `Bearer ` tokenïŒŒć‰‡æœƒç›ŽæŽ„ć›žć‚ł 401`UNAUTHORIZED`ïŒ‰éŒŻèȘ€ă€‚ +è‹„æœȘæ‰Ÿćˆ° `Authorization` æš™é ­ïŒŒæˆ–ć…¶ć€Œäžæ˜Ż `Bearer ` tokenïŒŒć‰‡æœƒç›ŽæŽ„ć›žæ‡‰ 401 ç‹€æ…‹çąŒéŒŻèȘ€ïŒˆ`UNAUTHORIZED`ïŒ‰ă€‚ äœ äžćż…ć†è‡ȘèĄŒæȘ࿟„ token æ˜ŻćŠć­˜ćœšïŒ›äœ ćŻä»„çąș俥ćȘèŠäœ çš„ć‡œćŒèą«ćŸ·èĄŒïŒŒè©Č token ćƒæ•žć°±äž€ćźšæœƒæ˜Ż `str`。 diff --git a/docs/zh-hant/docs/tutorial/security/get-current-user.md b/docs/zh-hant/docs/tutorial/security/get-current-user.md index c17b6468e..5309d78c0 100644 --- a/docs/zh-hant/docs/tutorial/security/get-current-user.md +++ b/docs/zh-hant/docs/tutorial/security/get-current-user.md @@ -14,7 +14,7 @@ ć°±ćƒç”š Pydantic ćźŁć‘Šè«‹æ±‚é«”äž€æšŁïŒŒæˆ‘ć€‘äčŸćŻä»„ćœšć…¶ä»–ćœ°æ–čäœżç”šćźƒïŒš -{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *} +{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *} ## ć»ș立 `get_current_user` äŸèłŽ { #create-a-get-current-user-dependency } diff --git a/docs/zh-hant/docs/tutorial/security/oauth2-jwt.md b/docs/zh-hant/docs/tutorial/security/oauth2-jwt.md index dba108c74..dc75092b4 100644 --- a/docs/zh-hant/docs/tutorial/security/oauth2-jwt.md +++ b/docs/zh-hant/docs/tutorial/security/oauth2-jwt.md @@ -120,7 +120,7 @@ pwdlib ä蟿”ŻæŽ bcrypt 雜æčŠæŒ”çź—æł•ïŒŒäœ†äžćŒ…ć«ć‚łç”±ïŒˆlegacyïŒ‰æŒ”çź— ç•¶ä»„äžć­˜ćœšæ–Œèł‡æ–™ćș«çš„äœżç”šè€…ćçš±ć‘Œć« `authenticate_user` æ™‚ïŒŒæˆ‘ć€‘ä»ç„¶æœƒæ‹żäž€ć€‹ć‡çš„é›œæčŠćŽ»è·‘äž€æŹĄ `verify_password`。 -這揯çąșäżç„Ąè«–äœżç”šè€…ćçš±æ˜ŻćŠæœ‰æ•ˆïŒŒç«Żé»žçš„ć›žæ‡‰æ™‚é–“éƒœć€§è‡Žç›žćŒïŒŒéżć…ćŻç”šäŸ†æžšèˆ‰æ—ąæœ‰äœżç”šè€…ćçš±çš„ă€Œèšˆæ™‚æ”»æ“Šă€ïŒˆtiming attacksïŒ‰ă€‚ +這揯çąșäżç„Ąè«–äœżç”šè€…ćçš±æ˜ŻćŠæœ‰æ•ˆïŒŒç«Żé»žçš„ć›žæ‡‰æ™‚é–“éƒœć€§è‡Žç›žćŒïŒŒéżć…ćŻç”šäŸ†æžšèˆ‰æ—ąæœ‰äœżç”šè€…ćçš±çš„ **蚈時攻擊**timing attacksïŒ‰ă€‚ /// note | æłšæ„ @@ -168,7 +168,7 @@ $ openssl rand -hex 32 {* ../../docs_src/security/tutorial004_an_py310.py hl[93:110] *} -## 曎新 `/token` è·ŻćŸ‘æ“äœœ { #update-the-token-path-operation } +## 曎新 `/token` *è·ŻćŸ‘æ“äœœ* { #update-the-token-path-operation } ç”šæŹŠæ–æœ‰æ•ˆæœŸć»ș立䞀怋 `timedelta`。 diff --git a/docs/zh-hant/docs/tutorial/security/simple-oauth2.md b/docs/zh-hant/docs/tutorial/security/simple-oauth2.md index de0fe386d..2b29daa0d 100644 --- a/docs/zh-hant/docs/tutorial/security/simple-oauth2.md +++ b/docs/zh-hant/docs/tutorial/security/simple-oauth2.md @@ -132,7 +132,7 @@ OAuth2 èŠçŻ„äž­ïŒŒç•¶äœżç”šă€Œpassword flowă€ïŒˆæˆ‘ć€‘çŸćœšäœżç”šçš„ïŒ‰æ™‚ïŒŒ `UserInDB(**user_dict)` çš„æ„æ€æ˜ŻïŒš -把 `user_dict` çš„é”ć’Œć€Œç›ŽæŽ„ç•¶äœœć…·ććƒæ•žć‚łć…„ïŒŒç­‰ćŒæ–ŒïŒš +*把 `user_dict` çš„é”ć’Œć€Œç›ŽæŽ„ç•¶äœœć…·ććƒæ•žć‚łć…„ïŒŒç­‰ćŒæ–ŒïŒš* ```Python UserInDB( @@ -146,7 +146,7 @@ UserInDB( /// note -æƒłæ›ŽćźŒæ•Žćœ°äș†è§Ł `**user_dict`ïŒŒè«‹ć›žćˆ°[**éĄć€–æšĄćž‹** 的文件](../extra-models.md#about-user-in-dict)。 +æƒłæ›ŽćźŒæ•Žćœ°äș†è§Ł `**user_dict`ïŒŒè«‹ć›žćˆ°[**éĄć€–æšĄćž‹** 的文件](../extra-models.md#about-user-in-model-dump)。 /// diff --git a/docs/zh-hant/docs/tutorial/sql-databases.md b/docs/zh-hant/docs/tutorial/sql-databases.md index a37e16432..3a0e43d84 100644 --- a/docs/zh-hant/docs/tutorial/sql-databases.md +++ b/docs/zh-hant/docs/tutorial/sql-databases.md @@ -1,10 +1,10 @@ # SQLïŒˆé—œèŻćŒïŒ‰èł‡æ–™ćș« { #sql-relational-databases } -FastAPI äžćŒ·ćˆ¶äœ äœżç”š SQLïŒˆé—œèŻćŒïŒ‰èł‡æ–™ćș«ă€‚äœ ćŻä»„äœżç”šä»»äœ•äœ æƒłèŠçš„èł‡æ–™ćș«ă€‚ +**FastAPI** äžćŒ·ćˆ¶äœ äœżç”š SQLïŒˆé—œèŻćŒïŒ‰èł‡æ–™ćș«ă€‚äœ†äœ ćŻä»„äœżç”š**ä»»äœ•äœ æƒłèŠçš„èł‡æ–™ćș«**。 é€™èŁĄæˆ‘ć€‘æœƒç”š [SQLModel](https://sqlmodel.tiangolo.com/) 䜜ç‚șçŻ„äŸ‹ă€‚ -SQLModel ć»șç«‹ćœš [SQLAlchemy](https://www.sqlalchemy.org/) 與 Pydantic äč‹äžŠă€‚ćźƒç”± FastAPI çš„äœœè€…é–‹ç™ŒïŒŒéžćžžé©ćˆéœ€èŠäœżç”š SQL èł‡æ–™ćș«çš„ FastAPI æ‡‰ç”šă€‚ +**SQLModel** ć»șç«‹ćœš [SQLAlchemy](https://www.sqlalchemy.org/) 與 Pydantic äč‹äžŠă€‚ćźƒç”± **FastAPI** çš„äœœè€…é–‹ç™ŒïŒŒéžćžžé©ćˆéœ€èŠäœżç”š **SQL èł‡æ–™ćș«**的 FastAPI æ‡‰ç”šă€‚ /// tip | 提ç€ș @@ -12,7 +12,7 @@ SQLModel ć»șç«‹ćœš [SQLAlchemy](https://www.sqlalchemy.org/) 與 Pydantic äč‹äžŠ /// -曠ç‚ș SQLModel ć»șç«‹ćœš SQLAlchemy äč‹äžŠïŒŒäœ ćŻä»„èŒ•éŹ†äœżç”š SQLAlchemy æ‰€æ”ŻæŽçš„ä»»äœ•èł‡æ–™ćș«ïŒˆć› æ­€ SQLModel ä蟿”ŻæŽïŒ‰ïŒŒäŸ‹ćŠ‚ïŒš +曠ç‚ș SQLModel ć»șç«‹ćœš SQLAlchemy äč‹äžŠïŒŒäœ ćŻä»„èŒ•éŹ†äœżç”š SQLAlchemy æ‰€æ”ŻæŽçš„**ä»»äœ•èł‡æ–™ćș«**ïŒˆć› æ­€ SQLModel ä蟿”ŻæŽïŒ‰ïŒŒäŸ‹ćŠ‚ïŒš * PostgreSQL * MySQL @@ -20,17 +20,17 @@ SQLModel ć»șç«‹ćœš [SQLAlchemy](https://www.sqlalchemy.org/) 與 Pydantic äč‹äžŠ * Oracle * Microsoft SQL ServerïŒŒç­‰ç­‰ă€‚ -ćœšé€™ć€‹çŻ„äŸ‹äž­ïŒŒæˆ‘ć€‘æœƒäœżç”š SQLiteïŒŒć› ç‚ș柃ćȘ甹戰於侀æȘ”æĄˆïŒŒè€Œäž” Python 慧ć»șæ”ŻæŽă€‚äœ ćŻä»„ç›ŽæŽ„è€‡èŁœé€™ć€‹çŻ„äŸ‹äžŠćŽŸæšŁćŸ·èĄŒă€‚ +ćœšé€™ć€‹çŻ„äŸ‹äž­ïŒŒæˆ‘ć€‘æœƒäœżç”š **SQLite**ïŒŒć› ç‚ș柃ćȘ甹戰於侀æȘ”æĄˆïŒŒè€Œäž” Python 慧ć»șæ”ŻæŽă€‚äœ ćŻä»„ç›ŽæŽ„è€‡èŁœé€™ć€‹çŻ„äŸ‹äžŠćŽŸæšŁćŸ·èĄŒă€‚ -äč‹ćŸŒïŒŒćœšäœ çš„æ­ŁćŒç’°ćąƒæ‡‰ç”šäž­ïŒŒäœ ćŻèƒœæœƒæƒłäœżç”šćƒ PostgreSQL é€™éĄžçš„èł‡æ–™ćș«äŒșæœć™šă€‚ +äč‹ćŸŒïŒŒćœšäœ çš„æ­ŁćŒç’°ćąƒæ‡‰ç”šäž­ïŒŒäœ ćŻèƒœæœƒæƒłäœżç”šćƒ **PostgreSQL** é€™éĄžçš„èł‡æ–™ćș«äŒșæœć™šă€‚ /// tip | 提ç€ș -æœ‰äž€ć€‹ćŒ…ć« FastAPI 與 PostgreSQL 的漘æ–čć°ˆæĄˆè…łæ‰‹æž¶ïŒŒé‚„æœ‰ć‰ç«Żèˆ‡æ›Žć€šć·„ć…·ïŒš[https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) +æœ‰äž€ć€‹ćŒ…ć« **FastAPI** 與 **PostgreSQL** 的漘æ–čć°ˆæĄˆç”ąç”Ÿć™šïŒŒé‚„æœ‰ć‰ç«Żèˆ‡æ›Žć€šć·„ć…·ïŒš[https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) /// -é€™æ˜Żäž€ä»œéžćžžç°ĄçŸ­çš„æ•™ć­žïŒŒćŠ‚æžœäœ æƒłæ›Žć…šéąć­žçż’èł‡æ–™ćș«ă€SQL或曎é€ČéšŽçš„ćŠŸèƒœïŒŒè«‹ćƒè€ƒ [SQLModel 文件](https://sqlmodel.tiangolo.com/)。 +é€™æ˜Żäž€ä»œéžćžžç°Ąć–źäž”ç°ĄçŸ­çš„æ•™ć­žïŒŒćŠ‚æžœäœ æƒłæ›Žć…šéąć­žçż’èł‡æ–™ćș«ă€SQL或曎é€ČéšŽçš„ćŠŸèƒœïŒŒè«‹ćƒè€ƒ [SQLModel 文件](https://sqlmodel.tiangolo.com/)。 ## ćź‰èŁ `SQLModel` { #install-sqlmodel } @@ -47,9 +47,9 @@ $ pip install sqlmodel ## ć»ș立ćȘæœ‰ć–źäž€æšĄćž‹çš„æ‡‰ç”š { #create-the-app-with-a-single-model } -æˆ‘ć€‘ć…ˆç”šć–źäž€ SQLModel æšĄćž‹ć»șç«‹é€™ć€‹æ‡‰ç”šçš„æœ€ç°Ąç‰ˆă€‚ +æˆ‘ć€‘ć…ˆç”šć–źäž€ **SQLModel** æšĄćž‹ć»șç«‹é€™ć€‹æ‡‰ç”šçš„æœ€ç°Ąç‰ˆă€‚ -æŽ„è‘—æˆ‘ć€‘æœƒćœšäž‹æ–čç”šć€šć€‹æšĄćž‹äŸ†æć‡ćź‰ć…šæ€§èˆ‡ćœˆæ€§ă€‚đŸ€“ +æŽ„è‘—æˆ‘ć€‘æœƒćœšäž‹æ–č甹**ć€šć€‹æšĄćž‹**äŸ†æć‡ćź‰ć…šæ€§èˆ‡ćœˆæ€§ă€‚đŸ€“ ### ć»șç«‹æšĄćž‹ { #create-models } @@ -57,43 +57,43 @@ $ pip install sqlmodel {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[1:11] hl[7:11] *} -`Hero` éĄžćˆ„èˆ‡ Pydantic æšĄćž‹éžćžžç›žäŒŒïŒˆäș‹ćŻŠäžŠïŒŒćœšćș•ć±€ćźƒć°±æ˜Żäž€ć€‹ Pydantic æšĄćž‹ïŒ‰ă€‚ +`Hero` éĄžćˆ„èˆ‡ Pydantic æšĄćž‹éžćžžç›žäŒŒïŒˆäș‹ćŻŠäžŠïŒŒćœšćș•ć±€ćźƒć…¶ćŻŠ*ć°±æ˜Żäž€ć€‹ Pydantic æšĄćž‹*ïŒ‰ă€‚ 有ćčŸé»žć·źç•°ïŒš -* `table=True` ć‘ŠèšŽ SQLModel é€™æ˜Żäž€ć€‹ă€Œèł‡æ–™èĄšæšĄćž‹ă€ïŒˆtable modelïŒ‰ïŒŒćźƒæ‡‰è©Čä»ŁèĄš SQL èł‡æ–™ćș«äž­çš„äž€ć€‹èł‡æ–™èĄšïŒŒè€Œäžćƒ…ćƒ…æ˜Żă€Œèł‡æ–™æšĄćž‹ă€ïŒˆć°±ćƒäž€èˆŹçš„ Pydantic éĄžćˆ„ïŒ‰ă€‚ +* `table=True` ć‘ŠèšŽ SQLModel é€™æ˜Żäž€ć€‹*èł‡æ–™èĄšæšĄćž‹*table modelïŒ‰ïŒŒćźƒæ‡‰è©Čä»ŁèĄš SQL èł‡æ–™ćș«äž­çš„䞀怋**èł‡æ–™èĄš**ïŒŒè€Œäžćƒ…ćƒ…æ˜Ż*èł‡æ–™æšĄćž‹*ïŒˆć°±ćƒäž€èˆŹçš„ Pydantic éĄžćˆ„ïŒ‰ă€‚ -* `Field(primary_key=True)` ć‘ŠèšŽ SQLModel`id` æ˜Ż SQL èł‡æ–™ćș«äž­çš„ă€Œäž»é”」。 ïŒˆäœ ćŻä»„ćœš SQLModel 文件䞭é€Č䞀歄äș†è§Ł SQL 䞻鍔 +* `Field(primary_key=True)` ć‘ŠèšŽ SQLModel`id` æ˜Ż SQL èł‡æ–™ćș«äž­çš„**䞻鍔**ïŒˆäœ ćŻä»„ćœš SQLModel 文件䞭é€Č䞀歄äș†è§Ł SQL äž»é”ïŒ‰ă€‚ - æłšæ„ïŒšæˆ‘ć€‘ćœšäž»é”æŹ„äœäœżç”š `int | None`ïŒŒé€™æšŁćœš Python çš‹ćŒçąŒäž­æˆ‘ć€‘ćŻä»„ă€ŒćœšæČ’有 `id` çš„æƒ…æłäž‹ć»șç«‹ç‰©ä»¶ă€ïŒˆ`id=None`ïŒ‰ïŒŒć‡èš­èł‡æ–™ćș«ćœšć„Čć­˜æ™‚æœƒă€Œè‡Ș拕由生」。SQLModel çž­è§Łèł‡æ–™ćș«æœƒæäŸ› `id`ïŒŒäžŠäž”ćœšèł‡æ–™ćș«ç¶±èŠäž­ă€Œć°‡è©ČæŹ„äœćźšçŸ©ç‚ș非ç©ș的 `INTEGER`ă€ă€‚è©łæƒ…è«‹èŠ‹ [SQLModel 文件䞻鍔](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id)。 + **æłšæ„ïŒš** æˆ‘ć€‘ćœšäž»é”æŹ„äœäœżç”š `int | None`ïŒŒé€™æšŁćœš Python çš‹ćŒçąŒäž­æˆ‘ć€‘ćŻä»„*朹æČ’有 `id` çš„æƒ…æłäž‹ć»ș立物件*`id=None`ïŒ‰ïŒŒć‡èš­èł‡æ–™ćș«ćœšć„Čć­˜æ™‚æœƒ*è‡Ș拕由生*。SQLModel çž­è§Łèł‡æ–™ćș«æœƒæäŸ› `id`ïŒŒäžŠäž”ćœšèł‡æ–™ćș«ç¶±èŠäž­*氇è©ČæŹ„äœćźšçŸ©ç‚ș非ç©ș的 `INTEGER`*ă€‚è©łæƒ…è«‹èŠ‹ [SQLModel 文件䞻鍔](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id)。 -* `Field(index=True)` ć‘ŠèšŽ SQLModel 應ç‚șæ­€æŹ„äœć»șç«‹ă€ŒSQL çŽąćŒ•ă€ïŒŒä»„äŸżćœšç”šæ­€æŹ„äœéŽæżŸèź€ć–èł‡æ–™æ™‚æ›Žćż«æŸ„è©ąă€‚ +* `Field(index=True)` ć‘ŠèšŽ SQLModel 應ç‚șæ­€æŹ„äœć»ș立 **SQL çŽąćŒ•**ïŒŒä»„äŸżćœšç”šæ­€æŹ„äœéŽæżŸèź€ć–èł‡æ–™æ™‚æ›Žćż«æŸ„è©ąă€‚ SQLModel æœƒçŸ„é“ćźŁć‘Šç‚ș `str` çš„æŹ„äœćœš SQL äž­æœƒæ˜Ż `TEXT`或 `VARCHAR`ïŒŒäŸèł‡æ–™ćș«è€ŒćźšïŒ‰ă€‚ ### ć»șç«‹ćŒ•æ“Ž { #create-an-engine } -SQLModel 的 `engine`ćș•ć±€ćŻŠéš›äžŠæ˜Ż SQLAlchemy 的 `engine`ïŒ‰æ˜Żç”šäŸ†ă€Œç¶­è­·èˆ‡èł‡æ–™ćș«é€Łç·šă€çš„æ±è„żă€‚ +SQLModel 的 `engine`ćș•ć±€ćŻŠéš›äžŠæ˜Ż SQLAlchemy 的 `engine`ïŒ‰æ˜Żç”šäŸ†**ç¶­è­·èˆ‡èł‡æ–™ćș«é€Łç·š**çš„æ±è„żă€‚ -äœ çš„çš‹ćŒäž­æ‡‰è©ČćȘæœ‰ă€Œć–źäž€ `engine` ç‰©ä»¶ă€äŸ†é€Łćˆ°ćŒäž€ć€‹èł‡æ–™ćș«ă€‚ +äœ çš„çš‹ćŒäž­æ‡‰è©ČćȘ有**於侀 `engine` 物件**äŸ†é€Łćˆ°ćŒäž€ć€‹èł‡æ–™ćș«ă€‚ {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[14:18] hl[14:15,17:18] *} -äœżç”š `check_same_thread=False` ć…èš± FastAPI ćœšäžćŒćŸ·èĄŒç·’äž­äœżç”šćŒäž€ć€‹ SQLite èł‡æ–™ćș«ă€‚é€™æ˜Żćż…èŠçš„ïŒŒć› ç‚șă€Œć–źäž€è«‹æ±‚ă€ćŻèƒœæœƒäœżç”šă€Œć€šć€‹ćŸ·èĄŒç·’ă€ïŒˆäŸ‹ćŠ‚ćœšäŸèłŽé …äž­ïŒ‰ă€‚ +äœżç”š `check_same_thread=False` ć…èš± FastAPI ćœšäžćŒćŸ·èĄŒç·’äž­äœżç”šćŒäž€ć€‹ SQLite èł‡æ–™ćș«ă€‚é€™æ˜Żćż…èŠçš„ïŒŒć› ç‚ș**ć–źäž€è«‹æ±‚**ćŻèƒœæœƒäœżç”š**ć€šć€‹ćŸ·èĄŒç·’**ïŒˆäŸ‹ćŠ‚ćœšäŸèłŽé …äž­ïŒ‰ă€‚ -ćˆ„æ“”ćżƒïŒŒäŸç…§æˆ‘ć€‘çš„çš‹ćŒç”æ§‹ïŒŒçšćŸŒæˆ‘ć€‘æœƒçąșäżă€ŒæŻć€‹è«‹æ±‚ćȘäœżç”šć–źäž€ SQLModel 的 sessionă€ïŒŒé€™ć…¶ćŻŠć°±æ˜Ż `check_same_thread` æƒłèŠé”æˆçš„äș‹ă€‚ +ćˆ„æ“”ćżƒïŒŒäŸç…§æˆ‘ć€‘çš„çš‹ćŒç”æ§‹ïŒŒçšćŸŒæˆ‘ć€‘æœƒçąș保**æŻć€‹è«‹æ±‚ćȘäœżç”šć–źäž€ SQLModel 的 *session***ïŒŒé€™ć…¶ćŻŠć°±æ˜Ż `check_same_thread` æƒłèŠé”æˆçš„äș‹ă€‚ ### ć»șç«‹èł‡æ–™èĄš { #create-the-tables } -æŽ„è‘—æˆ‘ć€‘æ–°ćąžäž€ć€‹ć‡œćŒïŒŒäœżç”š `SQLModel.metadata.create_all(engine)` ç‚șæ‰€æœ‰ă€Œèł‡æ–™èĄšæšĄćž‹ă€ć»șç«‹èł‡æ–™èĄšă€‚ +æŽ„è‘—æˆ‘ć€‘æ–°ćąžäž€ć€‹ć‡œćŒïŒŒäœżç”š `SQLModel.metadata.create_all(engine)` ç‚ș所有*èł‡æ–™èĄšæšĄćž‹* **ć»șç«‹èł‡æ–™èĄš**。 {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[21:22] hl[21:22] *} ### ć»ș立 Session äŸèłŽ { #create-a-session-dependency } -「`Session`ă€æœƒćœšèš˜æ†¶é«”äž­äżć­˜ç‰©ä»¶äžŠèżœèč€èł‡æ–™éœ€èŠçš„ä»»äœ•èźŠæ›ŽïŒŒç„¶ćŸŒé€éŽă€Œ`engine`ă€èˆ‡èł‡æ–™ćș«æșé€šă€‚ +**`Session`** æœƒćœšèš˜æ†¶é«”äž­äżć­˜**物件**äžŠèżœèč€èł‡æ–™éœ€èŠçš„ä»»äœ•èźŠæ›ŽïŒŒç„¶ćŸŒé€éŽ **`engine`** èˆ‡èł‡æ–™ćș«æșé€šă€‚ -æˆ‘ć€‘æœƒç”š `yield` ć»ș立䞀怋 FastAPI çš„ă€ŒäŸèłŽă€ïŒŒç‚șæŻć€‹è«‹æ±‚æäŸ›äž€ć€‹æ–°çš„ `Session`。這揯çąșäżæŻć€‹è«‹æ±‚ćȘäœżç”šć–źäž€çš„ sessionă€‚đŸ€“ +æˆ‘ć€‘æœƒç”š `yield` ć»ș立䞀怋 FastAPI 的**äŸèłŽ**ç‚șæŻć€‹è«‹æ±‚æäŸ›äž€ć€‹æ–°çš„ `Session`。這揯çąșäżæŻć€‹è«‹æ±‚ćȘäœżç”šć–źäž€çš„ sessionă€‚đŸ€“ æŽ„è‘—æˆ‘ć€‘ć»ș立䞀怋 `Annotated` çš„äŸèłŽ `SessionDep`ïŒŒèź“ćŸŒçșŒäœżç”šé€™ć€‹äŸèłŽçš„çš‹ćŒçąŒæ›Žç°Ąæœ”ă€‚ @@ -117,11 +117,11 @@ SQLModel äč‹ćŸŒæœƒæäŸ›ćŒ…èŁ Alembic çš„é·ç§»ć·„ć…·ïŒŒäœ†ç›źć‰äœ ćŻä»„ç›Ž ### ć»ș立 Hero { #create-a-hero } -曠ç‚șæŻć€‹ SQLModel æšĄćž‹ćŒæ™‚ä蟿˜Żäž€ć€‹ Pydantic æšĄćž‹ïŒŒäœ ćŻä»„ćœšă€Œćž‹ćˆ„æš™èš»ă€äž­ćƒäœżç”š Pydantic æšĄćž‹äž€æšŁäœżç”šćźƒă€‚ +曠ç‚șæŻć€‹ SQLModel æšĄćž‹ćŒæ™‚ä蟿˜Żäž€ć€‹ Pydantic æšĄćž‹ïŒŒäœ ćŻä»„ćœšèˆ‡ Pydantic æšĄćž‹ç›žćŒçš„**ćž‹ćˆ„æš™èš»**äž­äœżç”šćźƒă€‚ -äŸ‹ćŠ‚ïŒŒćŠ‚æžœäœ ćźŁć‘Šäž€ć€‹ćƒæ•žćž‹ćˆ„ç‚ș `Hero`ïŒŒćźƒæœƒćŸžă€ŒJSON bodyă€äž­èź€ć–ă€‚ +äŸ‹ćŠ‚ïŒŒćŠ‚æžœäœ ćźŁć‘Šäž€ć€‹ćƒæ•žćž‹ćˆ„ç‚ș `Hero`ïŒŒćźƒæœƒćŸž **JSON body** äž­èź€ć–ă€‚ -ćŒæšŁćœ°ïŒŒäœ äčŸćŻä»„氇漃漣摊ç‚șć‡œćŒçš„ă€Œć›žć‚łćž‹ćˆ„ă€ïŒŒç„¶ćŸŒćœšè‡Ș拕由生的 API 文件 UI äž­ć°±æœƒéĄŻç€șć…¶èł‡æ–™ç”æ§‹ă€‚ +ćŒæšŁćœ°ïŒŒäœ äčŸćŻä»„氇漃漣摊ç‚șć‡œćŒçš„**ć›žć‚łćž‹ćˆ„**ïŒŒç„¶ćŸŒćœšè‡Ș拕由生的 API 文件 UI äž­ć°±æœƒéĄŻç€șć…¶èł‡æ–™ç”æ§‹ă€‚ {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[40:45] hl[40:45] *} @@ -129,19 +129,19 @@ SQLModel äč‹ćŸŒæœƒæäŸ›ćŒ…èŁ Alembic çš„é·ç§»ć·„ć…·ïŒŒäœ†ç›źć‰äœ ćŻä»„ç›Ž ### èź€ć–ć€šć€‹ Hero { #read-heroes } -æˆ‘ć€‘ćŻä»„ç”š `select()` ćŸžèł‡æ–™ćș«ă€Œèź€ć–ă€ć€šć€‹ `Hero`ă€‚ćŻä»„ćŠ ć…„ `limit` 與 `offset` äŸ†ćˆ†é ă€‚ +æˆ‘ć€‘ćŻä»„ç”š `select()` ćŸžèł‡æ–™ćș«**èź€ć–**怚怋 `Hero`ă€‚ćŻä»„ćŠ ć…„ `limit` 與 `offset` äŸ†ćˆ†é ă€‚ {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[48:55] hl[51:52,54] *} ### èź€ć–ć–źäž€ Hero { #read-one-hero } -æˆ‘ć€‘ćŻä»„ă€Œèź€ć–ă€ć–źäž€çš„ `Hero`。 +æˆ‘ć€‘ćŻä»„**èź€ć–**於侀的 `Hero`。 {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[58:63] hl[60] *} ### ćˆȘ陀 Hero { #delete-a-hero } -æˆ‘ć€‘äčŸćŻä»„「ćˆȘé™€ă€äž€ć€‹ `Hero`。 +æˆ‘ć€‘äčŸćŻä»„**ćˆȘ陀**侀怋 `Hero`。 {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[66:73] hl[71] *} @@ -159,7 +159,7 @@ $ fastapi dev
-ç„¶ćŸŒć‰ćŸ€ `/docs` 的 UIïŒŒäœ æœƒçœ‹ćˆ° FastAPI äœżç”šé€™äș›æšĄćž‹äŸ†ă€Œæ–‡ä»¶ćŒ–ă€APIä蟿œƒç”šćźƒć€‘äŸ†ă€Œćșćˆ—ćŒ–ă€èˆ‡ă€Œé©—è­‰ă€èł‡æ–™ă€‚ +ç„¶ćŸŒć‰ćŸ€ `/docs` 的 UIïŒŒäœ æœƒçœ‹ćˆ° **FastAPI** äœżç”šé€™äș›**æšĄćž‹**䟆**æ–‡ä»¶ćŒ–** APIä蟿œƒç”šćźƒć€‘䟆**ćșćˆ—ćŒ–**與**驗證**èł‡æ–™ă€‚
@@ -167,27 +167,27 @@ $ fastapi dev ## ç”šć€šć€‹æšĄćž‹æ›Žæ–°æ‡‰ç”š { #update-the-app-with-multiple-models } -çŸćœšæˆ‘ć€‘çšćŸźă€Œé‡æ§‹ă€äž€äž‹é€™ć€‹æ‡‰ç”šïŒŒä»„æć‡ă€Œćź‰ć…šæ€§ă€èˆ‡ă€Œćœˆæ€§ă€ă€‚ +çŸćœšæˆ‘ć€‘çšćŸź**重構**äž€äž‹é€™ć€‹æ‡‰ç”šïŒŒä»„æć‡**ćź‰ć…šæ€§**與**ćœˆæ€§**。 ćŠ‚æžœäœ æȘ࿟„ć‰äž€ç‰ˆçš„æ‡‰ç”šïŒŒćœš UI äž­äœ æœƒçœ‹ćˆ°ïŒŒćˆ°ç›źć‰ç‚șæ­ąćźƒèź“ç”šæˆ¶ç«Żè‡Șć·±æ±șćźšèŠć»ș立的 `Hero` 的 `id`ă€‚đŸ˜± -æˆ‘ć€‘äžè©Čć…èš±é€™æšŁïŒŒć› ç‚șä»–ć€‘ćŻèƒœæœƒèŠ†è“‹èł‡æ–™ćș«äž­æˆ‘怑ć·Č戆配的 `id`。æ±ș漚 `id` 應è©Čç”±ă€ŒćŸŒç«Żă€æˆ–ă€Œèł‡æ–™ćș«ă€äŸ†ćšïŒŒă€Œäžæ˜Żç”šæˆ¶ç«Żă€ă€‚ +æˆ‘ć€‘äžè©Čć…èš±é€™æšŁïŒŒć› ç‚șä»–ć€‘ćŻèƒœæœƒèŠ†è“‹èł‡æ–™ćș«äž­æˆ‘怑ć·Č戆配的 `id`。æ±ș漚 `id` 應è©Č由**ćŸŒç«Ż**或**èł‡æ–™ćș«**äŸ†ćšïŒŒ**äžæ˜Żç”šæˆ¶ç«Ż**。 -ćŠć€–ïŒŒæˆ‘ć€‘ç‚ș hero ć»ș立äș† `secret_name`ïŒŒäœ†ç›źć‰æˆ‘ć€‘ćœšć„è™•éƒœæŠŠćźƒć›žć‚łć‡șćŽ»ïŒŒé€™äž€é»žéƒœäžă€ŒäżćŻ†ă€... 😅 +ćŠć€–ïŒŒæˆ‘ć€‘ç‚ș hero ć»ș立äș† `secret_name`ïŒŒäœ†ç›źć‰æˆ‘ć€‘ćœšć„è™•éƒœæŠŠćźƒć›žć‚łć‡șćŽ»ïŒŒé€™äž€é»žéƒœäž**保毆**... 😅 -æˆ‘ć€‘æœƒé€éŽćŠ ć…„äž€äș›ă€ŒéĄć€–æšĄćž‹ă€äŸ†äżźæ­Łé€™äș›ć•éĄŒă€‚é€™æ­Łæ˜Ż SQLModel ć€§æ”Ÿç•°ćœ©çš„ćœ°æ–č。✹ +æˆ‘ć€‘æœƒé€éŽćŠ ć…„äž€äș›**éĄć€–æšĄćž‹**äŸ†äżźæ­Łé€™äș›ć•éĄŒă€‚é€™æ­Łæ˜Ż SQLModel ć€§æ”Ÿç•°ćœ©çš„ćœ°æ–č。✹ ### ć»șç«‹ć€šć€‹æšĄćž‹ { #create-multiple-models } -朹 SQLModel 䞭任䜕蚭äș† `table=True` çš„æšĄćž‹éĄžćˆ„éƒœæ˜Żă€Œèł‡æ–™èĄšæšĄćž‹ă€ă€‚ +朹 **SQLModel** 䞭任䜕蚭äș† `table=True` çš„æšĄćž‹éĄžćˆ„éƒœæ˜Ż**èł‡æ–™èĄšæšĄćž‹**。 -而æČ’有蚭 `table=True` çš„æšĄćž‹éĄžćˆ„ć°±æ˜Żă€Œèł‡æ–™æšĄćž‹ă€ïŒŒé€™äș›ć…¶ćŻŠć°±æ˜Ż Pydantic æšĄćž‹ïŒˆćȘæœ‰äž€é»žć°ćąžćŒ·ïŒ‰ă€‚đŸ€“ +而æČ’有蚭 `table=True` çš„æšĄćž‹éĄžćˆ„ć°±æ˜Ż**èł‡æ–™æšĄćž‹**這äș›ć…¶ćŻŠć°±æ˜Ż Pydantic æšĄćž‹ïŒˆćȘæœ‰äž€é»žć°ćąžćŒ·ïŒ‰ă€‚đŸ€“ -äœżç”š SQLModelïŒŒæˆ‘ć€‘ćŻä»„ćˆ©ç”šă€ŒçčŒæ‰żă€äŸ†ă€Œéżć…é‡è€‡ă€ćœšć„çšźæƒ…æłäž‹äž€ć†ćźŁć‘Šæ‰€æœ‰æŹ„äœă€‚ +äœżç”š SQLModelïŒŒæˆ‘ć€‘ćŻä»„ćˆ©ç”š**çčŒæ‰ż**䟆**éżć…é‡è€‡**ćœšć„çšźæƒ…æłäž‹äž€ć†ćźŁć‘Šæ‰€æœ‰æŹ„äœă€‚ #### `HeroBase` - ćŸșćș•éĄžćˆ„ { #herobase-the-base-class } -ć…ˆćŸž `HeroBase` æšĄćž‹é–‹ć§‹ïŒŒćźƒćŒ…ć«æ‰€æœ‰æšĄćž‹ă€Œć…±äș«ă€çš„æŹ„䜍 +ć…ˆćŸž `HeroBase` æšĄćž‹é–‹ć§‹ïŒŒćźƒćŒ…ć«æ‰€æœ‰æšĄćž‹**ć…±äș«**çš„æŹ„äœïŒš * `name` * `age` @@ -196,12 +196,12 @@ $ fastapi dev #### `Hero` - èł‡æ–™èĄšæšĄćž‹ { #hero-the-table-model } -掄著ć»ș立 `Hero`äčŸć°±æ˜ŻćŻŠéš›çš„ă€Œèł‡æ–™èĄšæšĄćž‹ă€ïŒŒćźƒćŒ…ć«äžäž€ćźšæœƒć‡șçŸćœšć…¶ä»–æšĄćž‹äž­çš„ă€ŒéĄć€–æŹ„äœă€ïŒš +掄著ć»ș立 `Hero`äčŸć°±æ˜ŻćŻŠéš›çš„*èł‡æ–™èĄšæšĄćž‹*ïŒŒćźƒćŒ…ć«äžäž€ćźšæœƒć‡șçŸćœšć…¶ä»–æšĄćž‹äž­çš„**éĄć€–æŹ„äœ** * `id` * `secret_name` -曠ç‚ș `Hero` çčŒæ‰żè‡Ș `HeroBase`ïŒŒćźƒă€ŒäčŸă€æ“æœ‰ `HeroBase` äž­ćźŁć‘Šçš„ă€ŒæŹ„äœă€ïŒŒć› æ­€ `Hero` çš„ćźŒæ•ŽæŹ„äœç‚ș +曠ç‚ș `Hero` çčŒæ‰żè‡Ș `HeroBase`ïŒŒćźƒ**äčŸ**擁有 `HeroBase` 侭漣摊的**æŹ„äœ**ïŒŒć› æ­€ `Hero` çš„ćźŒæ•ŽæŹ„äœç‚ș * `id` * `name` @@ -212,19 +212,19 @@ $ fastapi dev #### `HeroPublic` - ć…Źé–‹çš„èł‡æ–™æšĄćž‹ { #heropublic-the-public-data-model } -掄䞋䟆ć»ș立 `HeroPublic` æšĄćž‹ïŒŒćźƒæ˜ŻèŠă€Œć›žć‚łă€ç”Š API ç”šæˆ¶ç«Żçš„æšĄćž‹ă€‚ +掄䞋䟆ć»ș立 `HeroPublic` æšĄćž‹ïŒŒćźƒæ˜ŻèŠ**曞悳**甊 API ç”šæˆ¶ç«Żçš„æšĄćž‹ă€‚ ćźƒæ“æœ‰èˆ‡ `HeroBase` ç›žćŒçš„æŹ„äœïŒŒć› æ­€äžæœƒćŒ…ć« `secret_name`。 ç”‚æ–ŒïŒŒæˆ‘ć€‘è‹±é›„çš„çœŸćŻŠèș«ćˆ†ć—äżè­·äș†ïŒđŸ„· -柃äčŸé‡æ–°ćźŁć‘Šäș† `id: int`。這éșŒćšæ˜Żèˆ‡ API ç”šæˆ¶ç«Żèš‚ç«‹äž€ć€‹ă€Œć„‘çŽ„ă€ïŒŒèź“ä»–ć€‘ćŻä»„çąș漚 `id` äž€ćźšć­˜ćœšè€Œäž”æ˜Ż `int`ïŒˆäžæœƒæ˜Ż `None`ïŒ‰ă€‚ +柃äčŸé‡æ–°ćźŁć‘Šäș† `id: int`。這éșŒćšæ˜Żèˆ‡ API ç”šæˆ¶ç«Żèš‚ç«‹äž€ć€‹**愑玄**ïŒŒèź“ä»–ć€‘ćŻä»„çąș漚 `id` äž€ćźšć­˜ćœšè€Œäž”æ˜Ż `int`ïŒˆäžæœƒæ˜Ż `None`ïŒ‰ă€‚ /// tip | 提ç€ș èź“ć›žć‚łæšĄćž‹äżè­‰æŸć€‹ć€Œäž€ćźšć­˜ćœšă€è€Œäž”äž€ćźšæ˜Ż `int`ïŒˆäžæ˜Ż `None`ïŒ‰ïŒŒć° API ç”šæˆ¶ç«Żéžćžžæœ‰ćč«ćŠ©ă€‚ä»–ć€‘ćœšæœ‰é€™ć€‹çąșäżĄäž‹ćŻä»„ćŻ«ć‡șæ›Žç°Ąć–źçš„çš‹ćŒçąŒă€‚ -æ­€ć€–ïŒŒé€éŽă€Œè‡Șć‹•ç”ąç”Ÿçš„ćźąæˆ¶ç«Żă€ä蟿œƒæœ‰æ›Žç°Ąæœ”çš„ä»‹éąïŒŒèź“èŠäœżç”šäœ  API çš„é–‹ç™Œè€…èƒœæœ‰æ›Žć„œçš„é–‹ç™Œé«”é©—ă€‚đŸ˜Ž +æ­€ć€–ïŒŒé€éŽ**è‡Șć‹•ç”ąç”Ÿçš„ćźąæˆ¶ç«Ż**ä蟿œƒæœ‰æ›Žç°Ąæœ”çš„ä»‹éąïŒŒèź“èŠäœżç”šäœ  API çš„é–‹ç™Œè€…èƒœæœ‰æ›Žć„œçš„é–‹ç™Œé«”é©—ă€‚đŸ˜Ž /// @@ -238,17 +238,17 @@ $ fastapi dev #### `HeroCreate` - 甚斌ć»ș立 Hero çš„èł‡æ–™æšĄćž‹ { #herocreate-the-data-model-to-create-a-hero } -çŸćœšæˆ‘ć€‘ć»ș立 `HeroCreate` æšĄćž‹ïŒŒé€™æ˜Żç”šäŸ†ă€Œé©—è­‰ă€ç”šæˆ¶ç«Żé€äŸ†èł‡æ–™çš„æšĄćž‹ă€‚ +çŸćœšæˆ‘ć€‘ć»ș立 `HeroCreate` æšĄćž‹ïŒŒé€™æ˜Żç”šäŸ†**驗證**ç”šæˆ¶ç«Żé€äŸ†èł‡æ–™çš„æšĄćž‹ă€‚ ćźƒć…·æœ‰èˆ‡ `HeroBase` ç›žćŒçš„æŹ„äœïŒŒäžŠäž”é‚„æœ‰ `secret_name`。 -æŽ„äž‹äŸ†ïŒŒç•¶ç”šæˆ¶ç«Żă€Œć»ș立新 heroă€æ™‚ïŒŒä»–ć€‘æœƒé€äžŠ `secret_name`ïŒŒćźƒæœƒèą«ć„Čć­˜ćœšèł‡æ–™ćș«äž­ïŒŒäœ†é€™äș›ç„•ćŻ†ćçš±äžæœƒćœš API äž­ć›žć‚łç”Šç”šæˆ¶ç«Żă€‚ +æŽ„äž‹äŸ†ïŒŒç•¶ç”šæˆ¶ç«Ż**ć»ș立新 hero** æ™‚ïŒŒä»–ć€‘æœƒé€äžŠ `secret_name`ïŒŒćźƒæœƒèą«ć„Čć­˜ćœšèł‡æ–™ćș«äž­ïŒŒäœ†é€™äș›ç„•ćŻ†ćçš±äžæœƒćœš API äž­ć›žć‚łç”Šç”šæˆ¶ç«Żă€‚ /// tip | 提ç€ș -這äčŸć°±æ˜Żäœ è™•ç†ă€ŒćŻ†çąŒă€çš„æ–čćŒă€‚æŽ„æ”¶ćźƒć€‘ïŒŒäœ†äžèŠćœš API 侭曞悳。 +這äčŸć°±æ˜Żäœ è™•理**ćŻ†çąŒ**的æ–čćŒă€‚æŽ„æ”¶ćźƒć€‘ïŒŒäœ†äžèŠćœš API 侭曞悳。 -䜠ä蟿‡‰è©Č朹ć„Čć­˜ć‰ć…ˆć°ćŻ†çąŒćšă€Œé›œæčŠă€ïŒŒă€Œæ°žé äžèŠä»„æ˜Žæ–‡ć„Č歘」。 +䜠ä蟿‡‰è©Č朹ć„Čć­˜ć‰ć…ˆć°ćŻ†çąŒćš**雜æčŠ****氞遠䞍芁仄明文ć„Č歘**。 /// @@ -262,11 +262,11 @@ $ fastapi dev #### `HeroUpdate` - 甚斌曎新 Hero çš„èł‡æ–™æšĄćž‹ { #heroupdate-the-data-model-to-update-a-hero } -ćœšć‰äž€ç‰ˆçš„æ‡‰ç”šäž­ïŒŒæˆ‘ć€‘æČ’æœ‰ă€Œæ›Žæ–° hero」的æ–čćŒïŒŒäœ†çŸćœšæœ‰äș†ă€Œć€šć€‹æšĄćž‹ă€ïŒŒæˆ‘ć€‘ć°±èƒœćšćˆ°ă€‚đŸŽ‰ +ćœšć‰äž€ç‰ˆçš„æ‡‰ç”šäž­ïŒŒæˆ‘ć€‘æČ’有**曎新 hero** 的æ–čćŒïŒŒäœ†çŸćœšæœ‰äș†**ć€šć€‹æšĄćž‹**ïŒŒæˆ‘ć€‘ć°±èƒœćšćˆ°ă€‚đŸŽ‰ -`HeroUpdate` é€™ć€‹èł‡æ–™æšĄćž‹æœ‰é»žç‰čćˆ„ïŒŒćźƒćŒ…ć«ă€Œć»ș立新 hero æ‰€éœ€çš„æ‰€æœ‰æŹ„äœă€ïŒŒäœ†æ‰€æœ‰æŹ„äœéƒœæ˜Żă€ŒćŻéžçš„ă€ïŒˆéƒœæœ‰é èš­ć€ŒïŒ‰ă€‚é€™æšŁćœšæ›Žæ–°æ™‚ïŒŒäœ ćȘ需芁送ć‡șæƒłèŠæ›Žæ–°çš„æŹ„äœćłćŻă€‚ +`HeroUpdate` 這怋*èł‡æ–™æšĄćž‹*有點ç‰čćˆ„ïŒŒćźƒćŒ…ć«**ć»ș立新 hero æ‰€éœ€çš„æ‰€æœ‰æŹ„äœ**ïŒŒäœ†æ‰€æœ‰æŹ„äœéƒœæ˜Ż**揯遾的**ïŒˆéƒœæœ‰é èš­ć€ŒïŒ‰ă€‚é€™æšŁćœšæ›Žæ–°æ™‚ïŒŒäœ ćȘ需芁送ć‡șæƒłèŠæ›Žæ–°çš„æŹ„äœćłćŻă€‚ -曠ç‚șæ‰€æœ‰æŹ„äœçš„ă€Œćž‹ćˆ„ć…¶ćŻŠéƒœæ”čèźŠäș†ă€ïŒˆćž‹ćˆ„çŸćœšćŒ…ć« `None`ïŒŒè€Œäž”é èš­ć€Œç‚ș `None`ïŒ‰ïŒŒæˆ‘ć€‘éœ€èŠă€Œé‡æ–°ćźŁć‘Šă€ćźƒć€‘ă€‚ +曠ç‚ș所有**æŹ„äœć…¶ćŻŠéƒœæ”čèźŠäș†**ïŒˆćž‹ćˆ„çŸćœšćŒ…ć« `None`ïŒŒè€Œäž”é èš­ć€Œç‚ș `None`ïŒ‰ïŒŒæˆ‘ć€‘éœ€èŠ**é‡æ–°ćźŁć‘Š**漃怑。 ć…¶ćŻŠäžäž€ćźšèŠçčŒæ‰ż `HeroBase`ïŒŒć› ç‚șæˆ‘ć€‘æœƒé‡æ–°ćźŁć‘Šæ‰€æœ‰æŹ„äœă€‚æˆ‘é€™èŁĄäżç•™çčŒæ‰żćȘæ˜Żç‚șäș†äž€è‡Žæ€§ïŒŒäžŠéžćż…èŠă€‚é€™äž»èŠæ˜Żć€‹äșșćć„œçš„ć•éĄŒă€‚đŸ€· @@ -280,43 +280,43 @@ $ fastapi dev ### 甹 `HeroCreate` ć»ș立䞊曞悳 `HeroPublic` { #create-with-herocreate-and-return-a-heropublic } -çŸćœšæˆ‘ć€‘æœ‰äș†ă€Œć€šć€‹æšĄćž‹ă€ïŒŒćŻä»„æ›Žæ–°æ‡‰ç”šäž­äœżç”šćźƒć€‘çš„éƒšćˆ†ă€‚ +çŸćœšæˆ‘ć€‘æœ‰äș†**ć€šć€‹æšĄćž‹**ïŒŒćŻä»„æ›Žæ–°æ‡‰ç”šäž­äœżç”šćźƒć€‘çš„éƒšćˆ†ă€‚ -æˆ‘ć€‘ćœšè«‹æ±‚äž­æŽ„æ”¶ `HeroCreate`ïŒˆèł‡æ–™æšĄćž‹ïŒ‰ïŒŒäžŠç”±ćźƒć»ș立䞀怋 `Hero`ïŒˆèł‡æ–™èĄšæšĄćž‹ïŒ‰ă€‚ +æˆ‘ć€‘ćœšè«‹æ±‚äž­æŽ„æ”¶ `HeroCreate` *èł‡æ–™æšĄćž‹*ïŒŒäžŠç”±ćźƒć»ș立䞀怋 `Hero` *èł‡æ–™èĄšæšĄćž‹*。 -é€™ć€‹æ–°çš„èł‡æ–™èĄšæšĄćž‹ `Hero` æœƒæœ‰ç”šæˆ¶ç«Żć‚łäŸ†çš„æŹ„äœïŒŒäžŠäž”æœƒç”±èł‡æ–™ćș«ç”ąç”Ÿäž€ć€‹ `id`。 +é€™ć€‹æ–°çš„*èł‡æ–™èĄšæšĄćž‹* `Hero` æœƒæœ‰ç”šæˆ¶ç«Żć‚łäŸ†çš„æŹ„äœïŒŒäžŠäž”æœƒç”±èł‡æ–™ćș«ç”ąç”Ÿäž€ć€‹ `id`。 -ç„¶ćŸŒæˆ‘ć€‘ç›ŽæŽ„ćŸžć‡œćŒć›žć‚łé€™ć€‹èł‡æ–™èĄšæšĄćž‹ `Hero`ă€‚äœ†ć› ç‚șæˆ‘ć€‘ç”š `HeroPublic` 當䜜 `response_model`FastAPI 會甚 `HeroPublic` 䟆驗證與ćșćˆ—ćŒ–èł‡æ–™ă€‚ +ç„¶ćŸŒæˆ‘ć€‘ç›ŽæŽ„ćŸžć‡œćŒć›žć‚łé€™ć€‹*èł‡æ–™èĄšæšĄćž‹* `Hero`ă€‚äœ†ć› ç‚șæˆ‘ć€‘ç”š `HeroPublic` *èł‡æ–™æšĄćž‹*當䜜 `response_model`**FastAPI** 會甚 `HeroPublic` 䟆驗證與ćșćˆ—ćŒ–èł‡æ–™ă€‚ {* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[56:62] hl[56:58] *} /// tip | 提ç€ș -çŸćœšæˆ‘ć€‘ç”š `response_model=HeroPublic`ïŒŒè€Œäžæ˜Żç”šć›žć‚łćž‹ćˆ„æš™èš» `-> HeroPublic`ïŒŒć› ç‚șæˆ‘ć€‘ćŻŠéš›ć›žć‚łçš„ć€Œć…¶ćŻŠă€Œäžæ˜Żă€`HeroPublic`。 +çŸćœšæˆ‘ć€‘ç”š `response_model=HeroPublic`ïŒŒè€Œäžæ˜Żç”š**ć›žć‚łćž‹ćˆ„æš™èš»** `-> HeroPublic`ïŒŒć› ç‚șæˆ‘ć€‘ćŻŠéš›ć›žć‚łçš„ć€Œć…¶ćŻŠ*äžæ˜Ż* `HeroPublic`。 ćŠ‚æžœæˆ‘ć€‘ćźŁć‘Š `-> HeroPublic`ïŒŒäœ çš„ç·šèŒŻć™šèˆ‡ linter æœƒïŒˆç†æ‰€ç•¶ç„¶ćœ°ïŒ‰æŠ±æ€šäœ ć›žć‚łçš„æ˜Ż `Hero` è€Œäžæ˜Ż `HeroPublic`。 -朹 `response_model` äž­ćźŁć‘ŠïŒŒć°±æ˜ŻèŠèź“ FastAPI ćŽ»ćšćźƒè©Č恚的äș‹ïŒŒè€Œäžćœ±éŸżćž‹ćˆ„æš™èš»ïŒŒä»„ćŠäœ çš„ç·šèŒŻć™šèˆ‡ć…¶ä»–ć·„ć…·æäŸ›çš„ć”ćŠ©ă€‚ +朹 `response_model` äž­ćźŁć‘ŠïŒŒć°±æ˜ŻèŠèź“ **FastAPI** ćŽ»ćšćźƒè©Č恚的äș‹ïŒŒè€Œäžćœ±éŸżćž‹ćˆ„æš™èš»ïŒŒä»„ćŠäœ çš„ç·šèŒŻć™šèˆ‡ć…¶ä»–ć·„ć…·æäŸ›çš„ć”ćŠ©ă€‚ /// ### äœżç”š `HeroPublic` èź€ć–ć€šć€‹ Hero { #read-heroes-with-heropublic } -æˆ‘ć€‘ćŻä»„ćƒć…ˆć‰äž€æšŁă€Œèź€ć–ă€ć€šć€‹ `Hero`ă€‚ćŒæšŁćœ°ïŒŒæˆ‘ć€‘äœżç”š `response_model=list[HeroPublic]` 䟆çąșäżèł‡æ–™èą«æ­Łçąș驗證與ćșćˆ—ćŒ–ă€‚ +æˆ‘ć€‘ćŻä»„ćƒć…ˆć‰äž€æšŁ**èź€ć–**怚怋 `Hero`ă€‚ćŒæšŁćœ°ïŒŒæˆ‘ć€‘äœżç”š `response_model=list[HeroPublic]` 䟆çąșäżèł‡æ–™èą«æ­Łçąș驗證與ćșćˆ—ćŒ–ă€‚ {* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[65:72] hl[65] *} ### äœżç”š `HeroPublic` èź€ć–ć–źäž€ Hero { #read-one-hero-with-heropublic } -æˆ‘ć€‘ćŻä»„ă€Œèź€ć–ă€ć–źäž€ hero +æˆ‘ć€‘ćŻä»„**èź€ć–**於侀 hero {* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[75:80] hl[77] *} ### äœżç”š `HeroUpdate` 曎新 Hero { #update-a-hero-with-heroupdate } -æˆ‘ć€‘ćŻä»„ă€Œæ›Žæ–° hero」。ç‚șæ­€æˆ‘ć€‘äœżç”š HTTP 的 `PATCH` æ“äœœă€‚ +æˆ‘ć€‘ćŻä»„**曎新 hero**。ç‚șæ­€æˆ‘ć€‘äœżç”š HTTP 的 `PATCH` æ“äœœă€‚ -ćœšçš‹ćŒçąŒäž­ïŒŒæˆ‘ć€‘æœƒć–ćŸ—äž€ć€‹ćȘćŒ…ć«ç”šæˆ¶ç«Żæœ‰ć‚łé€çš„èł‡æ–™çš„ `dict`ïŒŒäžćŒ…ć«ćȘæ˜Żć› ç‚șæœ‰é èš­ć€Œè€Œć­˜ćœšçš„æŹ„äœă€‚ç‚șäș†é”æˆé€™é»žïŒŒæˆ‘ć€‘äœżç”š `exclude_unset=True`ă€‚é€™æ˜Żé—œé”ă€‚đŸȘ„ +ćœšçš‹ćŒçąŒäž­ïŒŒæˆ‘ć€‘æœƒć–ćŸ—äž€ć€‹ćȘćŒ…ć«ç”šæˆ¶ç«Żæœ‰ć‚łé€çš„èł‡æ–™çš„ `dict`**ćȘćŒ…ć«ç”šæˆ¶ç«Żć‚łé€çš„èł‡æ–™**ïŒŒäžćŒ…ć«ćȘæ˜Żć› ç‚șæœ‰é èš­ć€Œè€Œć­˜ćœšçš„æŹ„äœă€‚ç‚șäș†é”æˆé€™é»žïŒŒæˆ‘ć€‘äœżç”š `exclude_unset=True`ă€‚é€™æ˜Żé—œé”ă€‚đŸȘ„ ç„¶ćŸŒæˆ‘ć€‘äœżç”š `hero_db.sqlmodel_update(hero_data)` 仄 `hero_data` çš„èł‡æ–™æ›Žæ–° `hero_db`。 @@ -324,7 +324,7 @@ $ fastapi dev ### ć†æŹĄćˆȘ陀 Hero { #delete-a-hero-again } -「ćˆȘé™€ă€ hero ćŸșæœŹäžŠç¶­æŒäžèźŠă€‚ +**ćˆȘ陀** hero ćŸșæœŹäžŠç¶­æŒäžèźŠă€‚ æˆ‘ć€‘äžæœƒç‚șäș†é‡æ§‹è€Œé‡æ§‹äž€ćˆ‡ă€‚đŸ˜… @@ -352,6 +352,6 @@ $ fastapi dev ## 瞜甐 { #recap } -äœ ćŻä»„äœżç”š [SQLModel](https://sqlmodel.tiangolo.com/) 與 SQL èł‡æ–™ćș«äș’ć‹•ïŒŒäžŠç”šă€Œèł‡æ–™æšĄćž‹ă€èˆ‡ă€Œèł‡æ–™èĄšæšĄćž‹ă€èź“çš‹ćŒçąŒæ›Žç°Ąæœ”ă€‚ +äœ ćŻä»„äœżç”š [**SQLModel**](https://sqlmodel.tiangolo.com/) 與 SQL èł‡æ–™ćș«äș’ć‹•ïŒŒäžŠç”š*èł‡æ–™æšĄćž‹*與*èł‡æ–™èĄšæšĄćž‹*èź“çš‹ćŒçąŒæ›Žç°Ąæœ”ă€‚ -äœ ćŻä»„ćœš SQLModel æ–‡ä»¶ć­žćˆ°æ›Žć€šć…§ćźčïŒŒé€™èŁĄé‚„æœ‰äž€ä»œæ›Žé•·çš„ [äœżç”š SQLModel 與 FastAPI çš„æ•™ć­ž](https://sqlmodel.tiangolo.com/tutorial/fastapi/)。🚀 +äœ ćŻä»„ćœš **SQLModel** æ–‡ä»¶ć­žćˆ°æ›Žć€šć…§ćźčïŒŒé€™èŁĄé‚„æœ‰äž€ä»œæ›Žé•·çš„ [äœżç”š SQLModel 與 **FastAPI** çš„æ•™ć­ž](https://sqlmodel.tiangolo.com/tutorial/fastapi/)。🚀 diff --git a/docs/zh-hant/docs/tutorial/static-files.md b/docs/zh-hant/docs/tutorial/static-files.md index 1b9e92a1c..0d6369eef 100644 --- a/docs/zh-hant/docs/tutorial/static-files.md +++ b/docs/zh-hant/docs/tutorial/static-files.md @@ -2,6 +2,14 @@ äœ ćŻä»„äœżç”š `StaticFiles` ćŸžæŸć€‹ç›źéŒ„è‡Șć‹•æäŸ›éœæ…‹æȘ”æĄˆă€‚ +/// tip + +ćŠ‚æžœäœ éœ€èŠèš—çźĄć‰ç«ŻïŒŒè«‹æ”č甹 `app.frontend()`ïŒŒè«‹ćœš [ć‰ç«Ż](frontend.md) é–±èź€ç›žé—œć…§ćźč。 + +`app.frontend()` ćș•ć±€äœżç”š `StaticFiles`䞊ç‚șć‰ç«ŻæäŸ›ćčŸé …éĄć€–ć„Șć‹ąïŒŒäŸ‹ćŠ‚è™•ç†ćźąæˆ¶ç«Żè·Żç”±ă€‚ + +/// + ## äœżç”š `StaticFiles` { #use-staticfiles } - ćŒŻć…„ `StaticFiles`。 diff --git a/docs/zh-hant/docs/tutorial/testing.md b/docs/zh-hant/docs/tutorial/testing.md index ab9dac93c..09f6c0ec7 100644 --- a/docs/zh-hant/docs/tutorial/testing.md +++ b/docs/zh-hant/docs/tutorial/testing.md @@ -113,13 +113,13 @@ $ pip install httpx │   └── test_main.py ``` -ć‡èš­çŸćœšäœ çš„ **FastAPI** æ‡‰ç”šæ‰€ćœšçš„ `main.py` 有䞀äș›ć…¶ä»–çš„è·ŻćŸ‘æ“äœœïŒˆpath operationsïŒ‰ă€‚ +ć‡èš­çŸćœšäœ çš„ **FastAPI** æ‡‰ç”šæ‰€ćœšçš„ `main.py` 有䞀äș›ć…¶ä»–çš„ **è·ŻćŸ‘æ“äœœ**。 ćźƒæœ‰äž€ć€‹ćŻèƒœć›žć‚łéŒŻèȘ€çš„ `GET` æ“äœœă€‚ ćźƒæœ‰äž€ć€‹ćŻèƒœć›žć‚łć€šçšźéŒŻèȘ€çš„ `POST` æ“äœœă€‚ -ć…©ć€‹è·ŻćŸ‘æ“äœœéƒœéœ€èŠäž€ć€‹ `X-Token` 暙頭headerïŒ‰ă€‚ +慩怋 *è·ŻćŸ‘æ“äœœ* éƒœéœ€èŠäž€ć€‹ `X-Token` 暙頭headerïŒ‰ă€‚ {* ../../docs_src/app_testing/app_b_an_py310/main.py *} @@ -136,11 +136,11 @@ $ pip install httpx äŸ‹ćŠ‚ïŒš -* èŠć‚łéžè·ŻćŸ‘æˆ–æŸ„è©ąćƒæ•žïŒŒç›ŽæŽ„æŠŠćźƒćŠ ćœš URL 侊。 +* èŠć‚łéž *path* 或 *query* ćƒæ•žïŒŒç›ŽæŽ„æŠŠćźƒćŠ ćœš URL 侊。 * èŠć‚łéž JSON æœŹæ–‡ïŒŒć°‡ Python ç‰©ä»¶ïŒˆäŸ‹ćŠ‚ `dict`ïŒ‰ć‚łç”Š `json` ćƒæ•žă€‚ -* ćŠ‚æžœéœ€èŠé€ć‡șèĄšć–źèł‡æ–™ïŒˆForm DataïŒ‰è€Œäžæ˜Ż JSONæ”č甹 `data` ćƒæ•žă€‚ -* èŠć‚łéžæš™é ­ïŒˆheadersïŒ‰ïŒŒćœš `headers` ćƒæ•žäž­æ”Ÿäž€ć€‹ `dict`。 -* ć°æ–Œ CookiecookiesïŒ‰ïŒŒćœš `cookies` ćƒæ•žäž­æ”Ÿäž€ć€‹ `dict`。 +* ćŠ‚æžœéœ€èŠé€ć‡ș *Form Data* è€Œäžæ˜Ż JSONæ”č甹 `data` ćƒæ•žă€‚ +* èŠć‚łéž *headers*ïŒŒćœš `headers` ćƒæ•žäž­æ”Ÿäž€ć€‹ `dict`。 +* ć°æ–Œ *cookies*ïŒŒćœš `cookies` ćƒæ•žäž­æ”Ÿäž€ć€‹ `dict`。 é—œæ–ŒćŠ‚äœ•æŠŠèł‡æ–™ć‚łç”ŠćŸŒç«ŻïŒˆäœżç”š `httpx` 或 `TestClient`ïŒ‰ïŒŒæ›Žć€šèł‡èšŠè«‹ćƒè€ƒ [HTTPX 文件](https://www.python-httpx.org)。 diff --git a/docs/zh-hant/docs/virtual-environments.md b/docs/zh-hant/docs/virtual-environments.md index a4d649c13..550363413 100644 --- a/docs/zh-hant/docs/virtual-environments.md +++ b/docs/zh-hant/docs/virtual-environments.md @@ -73,7 +73,7 @@ $ python -m venv .venv
-/// details | äžŠèż°ć‘œä»€çš„ć«çŸ© +/// details | äžŠèż°æŒ‡ä»€çš„ć«çŸ© * `python`: äœżç”šćç‚ș `python` çš„çš‹ćŒ * `-m`: ä»„è…łæœŹçš„æ–čćŒć‘Œć«äž€ć€‹æšĄç”„ïŒŒæˆ‘ć€‘ć°‡ć‘ŠèšŽćźƒæŽ„äž‹äŸ†äœżç”šć“Șć€‹æšĄç”„ @@ -106,7 +106,7 @@ $ uv venv //// -é€™ć€‹ć‘œä»€æœƒćœšäž€ć€‹ćç‚ș `.venv` 的盼錄侭ć»șç«‹äž€ć€‹æ–°çš„è™›æ“Źç’°ćąƒă€‚ +é€™ć€‹æŒ‡ä»€æœƒćœšäž€ć€‹ćç‚ș `.venv` 的盼錄侭ć»șç«‹äž€ć€‹æ–°çš„è™›æ“Źç’°ćąƒă€‚ /// details | `.venv`ïŒŒæˆ–æ˜Żć…¶ä»–ćçš± @@ -164,7 +164,7 @@ $ source .venv/Scripts/activate /// tip -æŻæŹĄäœ ćœšé€™ć€‹ç’°ćąƒäž­ćź‰èŁäž€ć€‹**æ–°çš„ć„—ä»¶**時郜需芁**é‡æ–°ć•Ÿć‹•**這怋環汃。 +æŻæŹĄäœ ćœšé€™ć€‹ç’°ćąƒäž­ćź‰èŁäž€ć€‹**æ–°çš„ć„—ä»¶**時郜需芁**ć†æŹĄć•Ÿç”š**這怋環汃。 這éșŒćšçąș保äș†ç•¶äœ äœżç”šäž€ć€‹ç”±é€™ć€‹ć„—ä»¶ćź‰èŁçš„**ç”‚ç«ŻïŒˆCLIïŒ‰çš‹ćŒ**æ™‚ïŒŒäœ äœżç”šçš„æ˜Żäœ çš„è™›æ“Źç’°ćąƒäž­çš„çš‹ćŒïŒŒè€Œäžæ˜Żć…šćŸŸćź‰èŁă€ćŻèƒœç‰ˆæœŹäžćŒçš„çš‹ćŒă€‚ @@ -242,7 +242,7 @@ $ python -m pip install --upgrade pip
-/// tip | æłšæ„ +/// tip æœ‰æ™‚äœ ćœšć˜—è©Šć‡çŽš pip æ™‚ïŒŒćŻèƒœæœƒé‡ćˆ° **`No module named pip`** 的錯èȘ€ă€‚ @@ -544,7 +544,7 @@ Python ć„—ä»¶ćœšæŽšć‡ș**æ–°ç‰ˆæœŹ**æ™‚é€šćžžæœƒć„˜é‡**éżć…ç ŽćŁžæ€§æ›Žæ”č** çŸćœšïŒŒæƒłćƒäž€äž‹ćŠ‚æžœæœ‰**èš±ć€š**ć…¶ä»–**ć„—ä»¶**ïŒŒćźƒć€‘éƒœæ˜Żäœ çš„**ć°ˆæĄˆæ‰€äŸèłŽçš„**ă€‚é€™æšŁæ˜Żéžćžžé›Łä»„çźĄç†çš„ă€‚äœ ćŻèƒœæœƒç™ŒçŸæœ‰äș›ć°ˆæĄˆäœżç”šäș†äž€äș›**侍盾ćźčçš„ć„—ä»¶ç‰ˆæœŹ**ïŒŒè€Œç„Ąæł•ćŸ—çŸ„ç‚ș什éșŒæŸäș›çš‹ćŒç„Ąæł•æ­Łćžžé‹äœœă€‚ -æ­€ć€–ïŒŒć–æ±șæ–Œäœ çš„æ“äœœçł»ç”±ïŒˆäŸ‹ćŠ‚ Linux、Windows、macOSïŒ‰ïŒŒćźƒćŻèƒœć·Čç¶“é ć…ˆćź‰èŁäș† Pythonă€‚ćœšé€™çšźæƒ…æłäž‹ïŒŒćźƒćŻèƒœć·Č經有䞀äș›çł»ç”±æ‰€éœ€çš„ć„—ä»¶ć’Œç‰čćźšç‰ˆæœŹă€‚ćŠ‚æžœäœ ćœšć…šćŸŸ Python ç’°ćąƒäž­ćź‰èŁć„—ä»¶ïŒŒćŻèƒœæœƒ**砮棞**某äș›éššäœœæ„­çł»ç”±äž€è”·ćź‰èŁçš„çš‹ćŒă€‚ +æ­€ć€–ïŒŒć–æ±șæ–Œäœ çš„äœœæ„­çł»ç”±ïŒˆäŸ‹ćŠ‚ Linux、Windows、macOSïŒ‰ïŒŒćźƒćŻèƒœć·Čç¶“é ć…ˆćź‰èŁäș† Pythonă€‚ćœšé€™çšźæƒ…æłäž‹ïŒŒćźƒćŻèƒœć·Č經有䞀äș›çł»ç”±æ‰€éœ€çš„ć„—ä»¶ć’Œç‰čćźšç‰ˆæœŹă€‚ćŠ‚æžœäœ ćœšć…šćŸŸ Python ç’°ćąƒäž­ćź‰èŁć„—ä»¶ïŒŒćŻèƒœæœƒ**砮棞**某äș›éššäœœæ„­çł»ç”±äž€è”·ćź‰èŁçš„çš‹ćŒă€‚ ## ć„—ä»¶ćź‰èŁćœšć“ȘèŁĄ { #where-are-packages-installed } From 704927a066baaf3d680446bdee700b9b8e16c13e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 13:59:57 +0000 Subject: [PATCH 285/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 24f97509a..f6809c6fb 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for zh-hant (update-outdated). PR [#15896](https://github.com/fastapi/fastapi/pull/15896) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for de (update-outdated). PR [#15899](https://github.com/fastapi/fastapi/pull/15899) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for es (update-outdated). PR [#15892](https://github.com/fastapi/fastapi/pull/15892) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for tr (update-outdated). PR [#15891](https://github.com/fastapi/fastapi/pull/15891) by [@tiangolo](https://github.com/tiangolo). From 8dc852df4713efa998d126c5194302e9f06e7675 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 13:59:58 +0000 Subject: [PATCH 286/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index f6809c6fb..38f3ef0d5 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for ja (update-outdated). PR [#15895](https://github.com/fastapi/fastapi/pull/15895) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for zh-hant (update-outdated). PR [#15896](https://github.com/fastapi/fastapi/pull/15896) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for de (update-outdated). PR [#15899](https://github.com/fastapi/fastapi/pull/15899) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for es (update-outdated). PR [#15892](https://github.com/fastapi/fastapi/pull/15892) by [@tiangolo](https://github.com/tiangolo). From 9d7d7febd3a66844f948254c1ba4745b6cc16f40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 16:06:27 +0200 Subject: [PATCH 287/290] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20?= =?UTF-8?q?for=20fr=20(update-outdated)=20(#15897)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] Co-authored-by: Yurii Motov --- docs/fr/docs/_llm-test.md | 2 +- .../docs/advanced/additional-status-codes.md | 2 +- .../fr/docs/advanced/advanced-dependencies.md | 2 +- docs/fr/docs/advanced/dataclasses.md | 4 +- docs/fr/docs/advanced/events.md | 6 +- docs/fr/docs/advanced/generate-clients.md | 16 +- docs/fr/docs/advanced/json-base64-bytes.md | 8 +- docs/fr/docs/advanced/openapi-callbacks.md | 32 +-- .../advanced/response-change-status-code.md | 2 +- docs/fr/docs/advanced/response-cookies.md | 1 + docs/fr/docs/advanced/response-headers.md | 6 +- .../docs/advanced/security/oauth2-scopes.md | 14 +- docs/fr/docs/advanced/settings.md | 2 +- docs/fr/docs/advanced/stream-data.md | 8 +- docs/fr/docs/advanced/wsgi.md | 1 + docs/fr/docs/alternatives.md | 81 ++++--- docs/fr/docs/async.md | 200 +++++++++--------- docs/fr/docs/deployment/cloud.md | 4 +- docs/fr/docs/deployment/concepts.md | 1 + docs/fr/docs/deployment/docker.md | 4 +- docs/fr/docs/deployment/https.md | 6 +- docs/fr/docs/deployment/manually.md | 10 +- docs/fr/docs/editor-support.md | 2 +- docs/fr/docs/environment-variables.md | 28 +-- docs/fr/docs/features.md | 8 +- docs/fr/docs/help-fastapi.md | 1 + docs/fr/docs/how-to/configure-swagger-ui.md | 4 +- .../docs/how-to/custom-request-and-route.md | 2 +- docs/fr/docs/how-to/graphql.md | 6 +- ...migrate-from-pydantic-v1-to-pydantic-v2.md | 18 ++ .../docs/how-to/separate-openapi-schemas.md | 10 +- docs/fr/docs/index.md | 6 +- docs/fr/docs/project-generation.md | 1 + docs/fr/docs/python-types.md | 8 +- docs/fr/docs/tutorial/bigger-applications.md | 30 +-- docs/fr/docs/tutorial/body-nested-models.md | 8 +- docs/fr/docs/tutorial/body.md | 26 +-- docs/fr/docs/tutorial/debugging.md | 20 +- .../dependencies/dependencies-with-yield.md | 13 +- docs/fr/docs/tutorial/extra-data-types.md | 2 +- docs/fr/docs/tutorial/extra-models.md | 46 ++-- docs/fr/docs/tutorial/first-steps.md | 32 +-- docs/fr/docs/tutorial/handling-errors.md | 4 +- docs/fr/docs/tutorial/index.md | 1 + docs/fr/docs/tutorial/metadata.md | 2 +- .../tutorial/path-operation-configuration.md | 1 + .../tutorial/query-params-str-validations.md | 8 +- docs/fr/docs/tutorial/query-params.md | 3 +- docs/fr/docs/tutorial/request-files.md | 1 + docs/fr/docs/tutorial/request-forms.md | 2 +- docs/fr/docs/tutorial/response-status-code.md | 1 + docs/fr/docs/tutorial/schema-extra-example.md | 14 +- docs/fr/docs/tutorial/security/first-steps.md | 36 ++-- .../tutorial/security/get-current-user.md | 2 +- docs/fr/docs/tutorial/security/oauth2-jwt.md | 12 +- .../docs/tutorial/security/simple-oauth2.md | 18 +- docs/fr/docs/tutorial/sql-databases.md | 14 +- docs/fr/docs/tutorial/static-files.md | 8 + docs/fr/docs/tutorial/testing.md | 4 +- docs/fr/docs/virtual-environments.md | 104 ++++----- 60 files changed, 471 insertions(+), 447 deletions(-) diff --git a/docs/fr/docs/_llm-test.md b/docs/fr/docs/_llm-test.md index 9ee61126e..02092c89d 100644 --- a/docs/fr/docs/_llm-test.md +++ b/docs/fr/docs/_llm-test.md @@ -148,7 +148,7 @@ Du texte //// tab | Info -Les onglets et les blocs « Info »/« Note »/« Warning »/etc. doivent avoir la traduction de leur titre ajoutĂ©e aprĂšs une barre verticale (« | »). +Les onglets et les blocs « Info »/« Note »/« Warning »/etc. doivent avoir la traduction de leur titre ajoutĂ©e aprĂšs une barre verticale (`|`). Voir les sections `### Special blocks` et `### Tab blocks` dans l’invite gĂ©nĂ©rale dans `scripts/translate.py`. diff --git a/docs/fr/docs/advanced/additional-status-codes.md b/docs/fr/docs/advanced/additional-status-codes.md index 59e8c3eae..5d50666f5 100644 --- a/docs/fr/docs/advanced/additional-status-codes.md +++ b/docs/fr/docs/advanced/additional-status-codes.md @@ -1,6 +1,6 @@ # Codes HTTP supplĂ©mentaires { #additional-status-codes } -Par dĂ©faut, **FastAPI** renverra les rĂ©ponses Ă  l'aide d'une structure de donnĂ©es `JSONResponse`, en plaçant la rĂ©ponse de votre *chemin d'accĂšs* Ă  l'intĂ©rieur de cette `JSONResponse`. +Par dĂ©faut, **FastAPI** renverra les rĂ©ponses en utilisant une `JSONResponse`, en plaçant le contenu que vous renvoyez depuis votre *chemin d'accĂšs* Ă  l'intĂ©rieur de cette `JSONResponse`. Il utilisera le code HTTP par dĂ©faut ou celui que vous avez dĂ©fini dans votre *chemin d'accĂšs*. diff --git a/docs/fr/docs/advanced/advanced-dependencies.md b/docs/fr/docs/advanced/advanced-dependencies.md index 4ff72581c..e0003552d 100644 --- a/docs/fr/docs/advanced/advanced-dependencies.md +++ b/docs/fr/docs/advanced/advanced-dependencies.md @@ -36,7 +36,7 @@ Nous pouvons crĂ©er une instance de cette classe avec : {* ../../docs_src/dependencies/tutorial011_an_py310.py hl[18] *} -Et de cette façon, nous pouvons « paramĂ©trer » notre dĂ©pendance, qui contient maintenant « bar », en tant qu’attribut `checker.fixed_content`. +Et de cette façon, nous pouvons « paramĂ©trer » notre dĂ©pendance, qui contient maintenant `"bar"`, en tant qu’attribut `checker.fixed_content`. ## Utiliser l'instance comme dĂ©pendance { #use-the-instance-as-a-dependency } diff --git a/docs/fr/docs/advanced/dataclasses.md b/docs/fr/docs/advanced/dataclasses.md index 057e49df2..01d136910 100644 --- a/docs/fr/docs/advanced/dataclasses.md +++ b/docs/fr/docs/advanced/dataclasses.md @@ -6,7 +6,7 @@ Mais FastAPI prend aussi en charge l'utilisation de [`dataclasses`](https://docs {* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *} -Cela fonctionne grĂące Ă  **Pydantic**, qui offre une [prise en charge interne des `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel). +C'est toujours pris en charge grĂące Ă  **Pydantic**, qui offre une [prise en charge interne des `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel). Ainsi, mĂȘme avec le code ci‑dessus qui n'emploie pas explicitement Pydantic, FastAPI utilise Pydantic pour convertir ces dataclasses standard en la variante de dataclasses de Pydantic. @@ -20,7 +20,7 @@ Cela fonctionne de la mĂȘme maniĂšre qu'avec les modĂšles Pydantic. Et, en rĂ©al /// note | Remarque -Gardez Ă  l'esprit que les dataclasses ne peuvent pas tout ce que peuvent faire les modĂšles Pydantic. +Gardez Ă  l'esprit que les dataclasses ne peuvent pas faire tout ce que peuvent faire les modĂšles Pydantic. Vous pourriez donc avoir encore besoin d'utiliser des modĂšles Pydantic. diff --git a/docs/fr/docs/advanced/events.md b/docs/fr/docs/advanced/events.md index 5b90c7b2e..4ab175239 100644 --- a/docs/fr/docs/advanced/events.md +++ b/docs/fr/docs/advanced/events.md @@ -102,7 +102,7 @@ Ces fonctions peuvent ĂȘtre dĂ©clarĂ©es avec `async def` ou un `def` normal. ### ÉvĂ©nement `startup` { #startup-event } -Pour ajouter une fonction qui doit ĂȘtre exĂ©cutĂ©e avant le dĂ©marrage de l'application, dĂ©clarez-la avec l'Ă©vĂ©nement « startup » : +Pour ajouter une fonction qui doit ĂȘtre exĂ©cutĂ©e avant le dĂ©marrage de l'application, dĂ©clarez-la avec l'Ă©vĂ©nement `"startup"` : {* ../../docs_src/events/tutorial001_py310.py hl[8] *} @@ -114,11 +114,11 @@ Et votre application ne commencera pas Ă  recevoir des requĂȘtes avant que tous ### ÉvĂ©nement `shutdown` { #shutdown-event } -Pour ajouter une fonction qui doit ĂȘtre exĂ©cutĂ©e lorsque l'application s'arrĂȘte, dĂ©clarez-la avec l'Ă©vĂ©nement « shutdown » : +Pour ajouter une fonction qui doit ĂȘtre exĂ©cutĂ©e lorsque l'application s'arrĂȘte, dĂ©clarez-la avec l'Ă©vĂ©nement `"shutdown"` : {* ../../docs_src/events/tutorial002_py310.py hl[6] *} -Ici, la fonction gestionnaire de l'Ă©vĂ©nement `shutdown` Ă©crira une ligne de texte « Application shutdown » dans un fichier `log.txt`. +Ici, la fonction gestionnaire de l'Ă©vĂ©nement `shutdown` Ă©crira une ligne de texte `"Application shutdown"` dans un fichier `log.txt`. /// note | Remarque diff --git a/docs/fr/docs/advanced/generate-clients.md b/docs/fr/docs/advanced/generate-clients.md index 5625b0648..7aa0a5150 100644 --- a/docs/fr/docs/advanced/generate-clients.md +++ b/docs/fr/docs/advanced/generate-clients.md @@ -20,20 +20,6 @@ FastAPI gĂ©nĂšre automatiquement des spĂ©cifications **OpenAPI 3.1**, donc tout /// -## GĂ©nĂ©rateurs de SDK par les sponsors de FastAPI { #sdk-generators-from-fastapi-sponsors } - -Cette section met en avant des solutions **soutenues par des fonds** et **par des entreprises** qui sponsorisent FastAPI. Ces produits offrent **des fonctionnalitĂ©s supplĂ©mentaires** et **des intĂ©grations** en plus de SDK de haute qualitĂ© gĂ©nĂ©rĂ©s. - -En ✹ [**sponsorisant FastAPI**](../help-fastapi.md#sponsor-the-author) ✹, ces entreprises contribuent Ă  garantir que le framework et son **Ă©cosystĂšme** restent sains et **durables**. - -Leur sponsoring dĂ©montre Ă©galement un fort engagement envers la **communautĂ©** FastAPI (vous), montrant qu’elles se soucient non seulement d’offrir un **excellent service**, mais aussi de soutenir un **framework robuste et florissant**, FastAPI. 🙇 - -Par exemple, vous pourriez essayer : - -* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) - -Certaines de ces solutions peuvent aussi ĂȘtre open source ou proposer des niveaux gratuits, afin que vous puissiez les essayer sans engagement financier. D’autres gĂ©nĂ©rateurs de SDK commerciaux existent et peuvent ĂȘtre trouvĂ©s en ligne. đŸ€“ - ## CrĂ©er un SDK TypeScript { #create-a-typescript-sdk } Commençons par une application FastAPI simple : @@ -56,7 +42,7 @@ Ces mĂȘmes informations issues des modĂšles, incluses dans OpenAPI, peuvent ĂȘtr ### Hey API { #hey-api } -Une fois que vous avez une application FastAPI avec les modĂšles, vous pouvez utiliser Hey API pour gĂ©nĂ©rer un client TypeScript. Le moyen le plus rapide de le faire est via npx. +Une fois que nous avons une application FastAPI avec les modĂšles, nous pouvons utiliser Hey API pour gĂ©nĂ©rer un client TypeScript. Le moyen le plus rapide de le faire est via npx. ```sh npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client diff --git a/docs/fr/docs/advanced/json-base64-bytes.md b/docs/fr/docs/advanced/json-base64-bytes.md index 1b5acb081..4d9bdd602 100644 --- a/docs/fr/docs/advanced/json-base64-bytes.md +++ b/docs/fr/docs/advanced/json-base64-bytes.md @@ -4,7 +4,7 @@ Si votre application doit recevoir et envoyer des donnĂ©es JSON, mais que vous d ## Base64 vs fichiers { #base64-vs-files } -Envisagez d'abord d'utiliser [Fichiers de requĂȘte](../tutorial/request-files.md) pour tĂ©lĂ©verser des donnĂ©es binaires et [RĂ©ponse personnalisĂ©e - FileResponse](./custom-response.md#fileresponse--fileresponse-) pour envoyer des donnĂ©es binaires, plutĂŽt que de les encoder dans du JSON. +Envisagez d'abord d'utiliser [Fichiers de requĂȘte](../tutorial/request-files.md) pour tĂ©lĂ©verser des donnĂ©es binaires et [RĂ©ponse personnalisĂ©e - FileResponse](./custom-response.md#fileresponse) pour envoyer des donnĂ©es binaires, plutĂŽt que de les encoder dans du JSON. JSON ne peut contenir que des chaĂźnes encodĂ©es en UTF-8, il ne peut donc pas contenir d'octets bruts. @@ -14,7 +14,7 @@ N'utilisez base64 que si vous devez absolument inclure des donnĂ©es binaires dan ## Pydantic `bytes` { #pydantic-bytes } -Vous pouvez dĂ©clarer un modĂšle Pydantic avec des champs `bytes`, puis utiliser `val_json_bytes` dans la configuration du modĂšle pour lui indiquer d'utiliser base64 pour valider les donnĂ©es JSON en entrĂ©e ; dans le cadre de cette validation, il dĂ©codera la chaĂźne base64 en octets. +Vous pouvez dĂ©clarer un modĂšle Pydantic avec des champs `bytes`, puis utiliser `val_json_bytes` dans la configuration du modĂšle pour lui indiquer d'utiliser base64 pour *valider* les donnĂ©es JSON en entrĂ©e ; dans le cadre de cette validation, il dĂ©codera la chaĂźne base64 en octets. {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} @@ -52,12 +52,12 @@ Vous recevrez une rĂ©ponse comme : ## Pydantic `bytes` pour les donnĂ©es de sortie { #pydantic-bytes-for-output-data } -Vous pouvez Ă©galement utiliser des champs `bytes` avec `ser_json_bytes` dans la configuration du modĂšle pour les donnĂ©es de sortie ; Pydantic sĂ©rialisera alors les octets en base64 lors de la gĂ©nĂ©ration de la rĂ©ponse JSON. +Vous pouvez Ă©galement utiliser des champs `bytes` avec `ser_json_bytes` dans la configuration du modĂšle pour les donnĂ©es de sortie ; Pydantic *sĂ©rialisera* alors les octets en base64 lors de la gĂ©nĂ©ration de la rĂ©ponse JSON. {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *} ## Pydantic `bytes` pour les donnĂ©es d'entrĂ©e et de sortie { #pydantic-bytes-for-input-and-output-data } -Et bien sĂ»r, vous pouvez utiliser le mĂȘme modĂšle configurĂ© pour utiliser base64 afin de gĂ©rer Ă  la fois l'entrĂ©e (valider) avec `val_json_bytes` et la sortie (sĂ©rialiser) avec `ser_json_bytes` lors de la rĂ©ception et de l'envoi de donnĂ©es JSON. +Et bien sĂ»r, vous pouvez utiliser le mĂȘme modĂšle configurĂ© pour utiliser base64 afin de gĂ©rer Ă  la fois l'entrĂ©e (*valider*) avec `val_json_bytes` et la sortie (*sĂ©rialiser*) avec `ser_json_bytes` lors de la rĂ©ception et de l'envoi de donnĂ©es JSON. {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/fr/docs/advanced/openapi-callbacks.md b/docs/fr/docs/advanced/openapi-callbacks.md index e21254bc1..54f8e3ff7 100644 --- a/docs/fr/docs/advanced/openapi-callbacks.md +++ b/docs/fr/docs/advanced/openapi-callbacks.md @@ -1,10 +1,10 @@ # Callbacks OpenAPI { #openapi-callbacks } -Vous pourriez crĂ©er une API avec un *chemin d'accĂšs* qui dĂ©clenche une requĂȘte vers une *API externe* créée par quelqu'un d'autre (probablement la mĂȘme personne dĂ©veloppeuse qui utiliserait votre API). +Vous pourriez crĂ©er une API avec un *chemin d'accĂšs* qui dĂ©clenche une requĂȘte vers une *API externe* créée par quelqu'un d'autre (probablement la mĂȘme personne dĂ©veloppeuse qui *utiliserait* votre API). -Le processus qui se produit lorsque votre application API appelle l’*API externe* s’appelle un « callback ». Parce que le logiciel Ă©crit par la personne dĂ©veloppeuse externe envoie une requĂȘte Ă  votre API puis votre API « rappelle », en envoyant une requĂȘte Ă  une *API externe* (probablement créée par la mĂȘme personne dĂ©veloppeuse). +Le processus qui se produit lorsque votre application API appelle l’*API externe* s’appelle un « callback ». Parce que le logiciel Ă©crit par la personne dĂ©veloppeuse externe envoie une requĂȘte Ă  votre API puis votre API *rappelle*, en envoyant une requĂȘte Ă  une *API externe* (probablement créée par la mĂȘme personne dĂ©veloppeuse). -Dans ce cas, vous pourriez vouloir documenter Ă  quoi cette API externe devrait ressembler. Quel *chemin d'accĂšs* elle devrait avoir, quel corps elle devrait attendre, quelle rĂ©ponse elle devrait renvoyer, etc. +Dans ce cas, vous pourriez vouloir documenter Ă  quoi cette API externe *devrait* ressembler. Quel *chemin d'accĂšs* elle devrait avoir, quel corps elle devrait attendre, quelle rĂ©ponse elle devrait renvoyer, etc. ## Une application avec des callbacks { #an-app-with-callbacks } @@ -47,7 +47,7 @@ Le code rĂ©el du callback dĂ©pendra fortement de votre application API. Et il variera probablement beaucoup d’une application Ă  l’autre. -Cela pourrait ĂȘtre seulement une ou deux lignes de code, comme : +Cela pourrait ĂȘtre seulement une ou deux lignes de code, comme : ```Python callback_url = "https://example.com/api/v1/invoices/events/" @@ -96,35 +96,35 @@ Commencez par crĂ©er un nouveau `APIRouter` qui contiendra un ou plusieurs callb Pour crĂ©er le *chemin d'accĂšs* du callback, utilisez le mĂȘme `APIRouter` que vous avez créé ci-dessus. -Il devrait ressembler exactement Ă  un *chemin d'accĂšs* FastAPI normal : +Il devrait ressembler exactement Ă  un *chemin d'accĂšs* FastAPI normal : * Il devrait probablement dĂ©clarer le corps qu’il doit recevoir, par exemple `body: InvoiceEvent`. * Et il pourrait aussi dĂ©clarer la rĂ©ponse qu’il doit renvoyer, par exemple `response_model=InvoiceEventReceived`. {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *} -Il y a 2 principales diffĂ©rences par rapport Ă  un *chemin d'accĂšs* normal : +Il y a 2 principales diffĂ©rences par rapport Ă  un *chemin d'accĂšs* normal : * Il n’a pas besoin d’avoir de code rĂ©el, car votre application n’appellera jamais ce code. Il sert uniquement Ă  documenter l’*API externe*. La fonction peut donc simplement contenir `pass`. -* Le *chemin* peut contenir une [expression OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (voir plus bas) oĂč il peut utiliser des variables avec des paramĂštres et des parties de la requĂȘte originale envoyĂ©e Ă  *votre API*. +* Le *chemin* peut contenir une [expression OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (voir plus bas) oĂč il peut utiliser des variables avec des paramĂštres et des parties de la requĂȘte originale envoyĂ©e Ă  *votre API*. ### L’expression du chemin de callback { #the-callback-path-expression } -Le *chemin* du callback peut contenir une [expression OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) qui peut inclure des parties de la requĂȘte originale envoyĂ©e Ă  *votre API*. +Le *chemin* du callback peut contenir une [expression OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) qui peut inclure des parties de la requĂȘte originale envoyĂ©e Ă  *votre API*. -Dans ce cas, c’est la `str` : +Dans ce cas, c’est la `str` : ```Python "{$callback_url}/invoices/{$request.body.id}" ``` -Ainsi, si l’utilisateur de votre API (la personne dĂ©veloppeuse externe) envoie une requĂȘte Ă  *votre API* vers : +Ainsi, si l’utilisateur de votre API (la personne dĂ©veloppeuse externe) envoie une requĂȘte Ă  *votre API* vers : ``` https://yourapi.com/invoices/?callback_url=https://www.external.org/events ``` -avec un corps JSON : +avec un corps JSON : ```JSON { @@ -134,13 +134,13 @@ avec un corps JSON : } ``` -alors *votre API* traitera la facture et, Ă  un moment ultĂ©rieur, enverra une requĂȘte de callback Ă  `callback_url` (l’*API externe*) : +alors *votre API* traitera la facture et, Ă  un moment ultĂ©rieur, enverra une requĂȘte de callback Ă  `callback_url` (l’*API externe*) : ``` https://www.external.org/events/invoices/2expen51ve ``` -avec un corps JSON contenant quelque chose comme : +avec un corps JSON contenant quelque chose comme : ```JSON { @@ -149,7 +149,7 @@ avec un corps JSON contenant quelque chose comme : } ``` -et elle s’attendra Ă  une rĂ©ponse de cette *API externe* avec un corps JSON comme : +et elle s’attendrait Ă  une rĂ©ponse de cette *API externe* avec un corps JSON comme : ```JSON { @@ -167,7 +167,7 @@ Remarquez que l’URL de callback utilisĂ©e contient l’URL reçue en paramĂštr À ce stade, vous avez le(s) *chemin(s) d'accĂšs de callback* nĂ©cessaire(s) (celui/ceux que la *personne dĂ©veloppeuse externe* doit implĂ©menter dans l’*API externe*) dans le routeur de callback que vous avez créé ci-dessus. -Utilisez maintenant le paramĂštre `callbacks` dans *le dĂ©corateur de chemin d'accĂšs de votre API* pour passer l’attribut `.routes` depuis ce routeur de callback : +Utilisez maintenant le paramĂštre `callbacks` dans *le dĂ©corateur de chemin d'accĂšs de votre API* pour passer l’attribut `.routes` depuis ce routeur de callback : {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *} @@ -181,6 +181,6 @@ Remarquez que vous ne passez pas le routeur lui-mĂȘme (`invoices_callback_router Vous pouvez maintenant dĂ©marrer votre application et aller sur [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Vous verrez votre documentation incluant une section « Callbacks » pour votre *chemin d'accĂšs* qui montre Ă  quoi l’*API externe* devrait ressembler : +Vous verrez votre documentation incluant une section « Callbacks » pour votre *chemin d'accĂšs* qui montre Ă  quoi l’*API externe* devrait ressembler : diff --git a/docs/fr/docs/advanced/response-change-status-code.md b/docs/fr/docs/advanced/response-change-status-code.md index 222825702..317fcb03d 100644 --- a/docs/fr/docs/advanced/response-change-status-code.md +++ b/docs/fr/docs/advanced/response-change-status-code.md @@ -16,7 +16,7 @@ Pour ces cas, vous pouvez utiliser un paramĂštre `Response`. ## Utiliser un paramĂštre `Response` { #use-a-response-parameter } -Vous pouvez dĂ©clarer un paramĂštre de type `Response` dans votre fonction de chemin d'accĂšs (comme vous pouvez le faire pour les cookies et les en-tĂȘtes). +Vous pouvez dĂ©clarer un paramĂštre de type `Response` dans votre *fonction de chemin d'accĂšs* (comme vous pouvez le faire pour les cookies et les en-tĂȘtes). Vous pouvez ensuite dĂ©finir le `status_code` dans cet objet de rĂ©ponse *temporaire*. diff --git a/docs/fr/docs/advanced/response-cookies.md b/docs/fr/docs/advanced/response-cookies.md index 174c9a72d..9efa045b1 100644 --- a/docs/fr/docs/advanced/response-cookies.md +++ b/docs/fr/docs/advanced/response-cookies.md @@ -1,5 +1,6 @@ # Cookies de rĂ©ponse { #response-cookies } + ## Utiliser un paramĂštre `Response` { #use-a-response-parameter } Vous pouvez dĂ©clarer un paramĂštre de type `Response` dans votre *fonction de chemin d'accĂšs*. diff --git a/docs/fr/docs/advanced/response-headers.md b/docs/fr/docs/advanced/response-headers.md index b7568b51f..e319ffefb 100644 --- a/docs/fr/docs/advanced/response-headers.md +++ b/docs/fr/docs/advanced/response-headers.md @@ -2,9 +2,9 @@ ## Utiliser un paramĂštre `Response` { #use-a-response-parameter } -Vous pouvez dĂ©clarer un paramĂštre de type `Response` dans votre fonction de chemin d'accĂšs (comme vous pouvez le faire pour les cookies). +Vous pouvez dĂ©clarer un paramĂštre de type `Response` dans votre *fonction de chemin d'accĂšs* (comme vous pouvez le faire pour les cookies). -Vous pouvez ensuite dĂ©finir des en-tĂȘtes dans cet objet de rĂ©ponse temporaire. +Vous pouvez ensuite dĂ©finir des en-tĂȘtes dans cet objet de rĂ©ponse *temporaire*. {* ../../docs_src/response_headers/tutorial002_py310.py hl[1, 7:8] *} @@ -12,7 +12,7 @@ Ensuite, vous pouvez renvoyer n'importe quel objet dont vous avez besoin, comme Et si vous avez dĂ©clarĂ© un `response_model`, il sera toujours utilisĂ© pour filtrer et convertir l'objet que vous avez renvoyĂ©. -**FastAPI** utilisera cette rĂ©ponse temporaire pour extraire les en-tĂȘtes (ainsi que les cookies et le code de statut), et les placera dans la rĂ©ponse finale qui contient la valeur que vous avez renvoyĂ©e, filtrĂ©e par tout `response_model`. +**FastAPI** utilisera cette rĂ©ponse *temporaire* pour extraire les en-tĂȘtes (ainsi que les cookies et le code de statut), et les placera dans la rĂ©ponse finale qui contient la valeur que vous avez renvoyĂ©e, filtrĂ©e par tout `response_model`. Vous pouvez Ă©galement dĂ©clarer le paramĂštre `Response` dans des dĂ©pendances, et y dĂ©finir des en-tĂȘtes (et des cookies). diff --git a/docs/fr/docs/advanced/security/oauth2-scopes.md b/docs/fr/docs/advanced/security/oauth2-scopes.md index af63ce553..a193aeacd 100644 --- a/docs/fr/docs/advanced/security/oauth2-scopes.md +++ b/docs/fr/docs/advanced/security/oauth2-scopes.md @@ -2,11 +2,11 @@ Vous pouvez utiliser des scopes OAuth2 directement avec **FastAPI**, ils sont intĂ©grĂ©s pour fonctionner de maniĂšre transparente. -Cela vous permettrait d’avoir un systĂšme d’autorisations plus fin, conforme au standard OAuth2, intĂ©grĂ© Ă  votre application OpenAPI (et Ă  la documentation de l’API). +Cela vous permettrait d’avoir un systĂšme d’autorisations plus fin, conforme au standard OAuth2, intĂ©grĂ© Ă  votre application OpenAPI (et aux documents de l’API). OAuth2 avec scopes est le mĂ©canisme utilisĂ© par de nombreux grands fournisseurs d’authentification, comme Facebook, Google, GitHub, Microsoft, X (Twitter), etc. Ils l’utilisent pour fournir des permissions spĂ©cifiques aux utilisateurs et aux applications. -Chaque fois que vous « log in with » Facebook, Google, GitHub, Microsoft, X (Twitter), cette application utilise OAuth2 avec scopes. +Chaque fois que vous utilisez « se connecter avec » Facebook, Google, GitHub, Microsoft, X (Twitter), cette application utilise OAuth2 avec scopes. Dans cette section, vous verrez comment gĂ©rer l’authentification et l’autorisation avec le mĂȘme OAuth2 avec scopes dans votre application **FastAPI**. @@ -16,7 +16,7 @@ C’est une section plus ou moins avancĂ©e. Si vous dĂ©butez, vous pouvez la pas Vous n’avez pas nĂ©cessairement besoin des scopes OAuth2, et vous pouvez gĂ©rer l’authentification et l’autorisation comme vous le souhaitez. -Mais OAuth2 avec scopes peut s’intĂ©grer Ă©lĂ©gamment Ă  votre API (avec OpenAPI) et Ă  votre documentation d’API. +Mais OAuth2 avec scopes peut s’intĂ©grer Ă©lĂ©gamment Ă  votre API (avec OpenAPI) et Ă  vos documents d’API. NĂ©anmoins, c’est toujours Ă  vous de faire appliquer ces scopes, ou toute autre exigence de sĂ©curitĂ©/autorisation, selon vos besoins, dans votre code. @@ -34,7 +34,7 @@ Le contenu de chacune de ces chaĂźnes peut avoir n’importe quel format, mais n Ces scopes reprĂ©sentent des « permissions ». -Dans OpenAPI (par ex. la documentation de l’API), vous pouvez dĂ©finir des « schĂ©mas de sĂ©curitĂ© ». +Dans OpenAPI (par ex. les documents de l’API), vous pouvez dĂ©finir des « schĂ©mas de sĂ©curitĂ© ». Lorsqu’un de ces schĂ©mas de sĂ©curitĂ© utilise OAuth2, vous pouvez aussi dĂ©clarer et utiliser des scopes. @@ -74,7 +74,7 @@ Le paramĂštre `scopes` reçoit un `dict` avec chaque scope en clĂ© et la descrip {* ../../docs_src/security/tutorial005_an_py310.py hl[63:66] *} -Comme nous dĂ©clarons maintenant ces scopes, ils apparaĂźtront dans la documentation de l’API lorsque vous vous authentifiez/autorisez. +Comme nous dĂ©clarons maintenant ces scopes, ils apparaĂźtront dans les documents de l’API lorsque vous vous authentifiez/autorisez. Et vous pourrez sĂ©lectionner Ă  quels scopes vous souhaitez accorder l’accĂšs : `me` et `items`. @@ -235,11 +235,11 @@ Elles seront vĂ©rifiĂ©es indĂ©pendamment pour chaque *chemin d’accĂšs*. ## Tester { #check-it } -Si vous ouvrez la documentation de l’API, vous pouvez vous authentifier et spĂ©cifier quels scopes vous voulez autoriser. +Si vous ouvrez les documents de l’API, vous pouvez vous authentifier et spĂ©cifier quels scopes vous voulez autoriser. -Si vous ne sĂ©lectionnez aucun scope, vous serez « authenticated », mais lorsque vous essayerez d’accĂ©der Ă  `/users/me/` ou `/users/me/items/`, vous obtiendrez une erreur indiquant que vous n’avez pas suffisamment de permissions. Vous pourrez toujours accĂ©der Ă  `/status/`. +Si vous ne sĂ©lectionnez aucun scope, vous serez « authentifiĂ© », mais lorsque vous essayerez d’accĂ©der Ă  `/users/me/` ou `/users/me/items/`, vous obtiendrez une erreur indiquant que vous n’avez pas suffisamment de permissions. Vous pourrez toujours accĂ©der Ă  `/status/`. Et si vous sĂ©lectionnez le scope `me` mais pas le scope `items`, vous pourrez accĂ©der Ă  `/users/me/` mais pas Ă  `/users/me/items/`. diff --git a/docs/fr/docs/advanced/settings.md b/docs/fr/docs/advanced/settings.md index e6eb52a4e..722274d57 100644 --- a/docs/fr/docs/advanced/settings.md +++ b/docs/fr/docs/advanced/settings.md @@ -144,7 +144,7 @@ Pour l'instant, vous pouvez supposer que `get_settings()` est une fonction norma /// -Nous pouvons ensuite l'exiger depuis la fonction de chemin d'accĂšs comme dĂ©pendance et l'utiliser oĂč nous en avons besoin. +Nous pouvons ensuite l'exiger depuis la *fonction de chemin d'accĂšs* comme dĂ©pendance et l'utiliser oĂč nous en avons besoin. {* ../../docs_src/settings/app02_an_py310/main.py hl[17,19:21] *} diff --git a/docs/fr/docs/advanced/stream-data.md b/docs/fr/docs/advanced/stream-data.md index e4939f256..23884b2f0 100644 --- a/docs/fr/docs/advanced/stream-data.md +++ b/docs/fr/docs/advanced/stream-data.md @@ -2,7 +2,7 @@ Si vous voulez diffuser des donnĂ©es pouvant ĂȘtre structurĂ©es en JSON, vous devez [Diffuser des JSON Lines](../tutorial/stream-json-lines.md). -Mais si vous voulez diffuser des donnĂ©es binaires pures ou des chaĂźnes, voici comment procĂ©der. +Mais si vous voulez **diffuser des donnĂ©es binaires pures** ou des chaĂźnes, voici comment procĂ©der. /// note | Remarque @@ -14,7 +14,7 @@ AjoutĂ© dans FastAPI 0.134.0. Vous pouvez l'utiliser si vous souhaitez diffuser des chaĂźnes pures, par exemple directement depuis la sortie d'un service d'**IA LLM**. -Vous pouvez Ă©galement l'utiliser pour diffuser de gros fichiers binaires, en envoyant chaque bloc de donnĂ©es au fur et Ă  mesure de la lecture, sans tout charger en mĂ©moire d'un coup. +Vous pouvez Ă©galement l'utiliser pour diffuser de **gros fichiers binaires**, en envoyant chaque bloc de donnĂ©es au fur et Ă  mesure de la lecture, sans tout charger en mĂ©moire d'un coup. Vous pouvez aussi diffuser de la **vidĂ©o** ou de l'**audio** de cette maniĂšre ; cela peut mĂȘme ĂȘtre gĂ©nĂ©rĂ© au fil du traitement et de l'envoi. @@ -26,7 +26,7 @@ Si vous dĂ©clarez un `response_class=StreamingResponse` dans votre *fonction de FastAPI transmettra chaque bloc de donnĂ©es Ă  la `StreamingResponse` tel quel ; il n'essaiera pas de le convertir en JSON ni autre chose similaire. -### Fonctions de chemin d'accĂšs non async { #non-async-path-operation-functions } +### *Fonctions de chemin d'accĂšs* non async { #non-async-path-operation-functions } Vous pouvez Ă©galement utiliser des fonctions `def` classiques (sans `async`), et utiliser `yield` de la mĂȘme maniĂšre. @@ -40,7 +40,7 @@ Comme FastAPI n'essaiera pas de convertir les donnĂ©es en JSON avec Pydantic ni {* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} -Cela signifie aussi qu'avec `StreamingResponse` vous avez la libertĂ© — et la responsabilitĂ© — de produire et d'encoder les octets de donnĂ©es exactement comme vous avez besoin de les envoyer, indĂ©pendamment des annotations de type. đŸ€“ +Cela signifie aussi qu'avec `StreamingResponse` vous avez la **libertĂ©** et la **responsabilitĂ©** de produire et d'encoder les octets de donnĂ©es exactement comme vous avez besoin de les envoyer, indĂ©pendamment des annotations de type. đŸ€“ ### Diffuser des bytes { #stream-bytes } diff --git a/docs/fr/docs/advanced/wsgi.md b/docs/fr/docs/advanced/wsgi.md index a1e56a45d..6e6ce85c8 100644 --- a/docs/fr/docs/advanced/wsgi.md +++ b/docs/fr/docs/advanced/wsgi.md @@ -1,5 +1,6 @@ # Inclure WSGI - Flask, Django, autres { #including-wsgi-flask-django-others } + Vous pouvez monter des applications WSGI comme vous l'avez vu avec [Sous-applications - Montages](sub-applications.md), [DerriĂšre un proxy](behind-a-proxy.md). Pour cela, vous pouvez utiliser `WSGIMiddleware` et l'utiliser pour envelopper votre application WSGI, par exemple Flask, Django, etc. diff --git a/docs/fr/docs/alternatives.md b/docs/fr/docs/alternatives.md index b56d10481..91a81e2dc 100644 --- a/docs/fr/docs/alternatives.md +++ b/docs/fr/docs/alternatives.md @@ -39,19 +39,19 @@ premiĂšres idĂ©es qui a inspirĂ© « la recherche de » **FastAPI**. /// note | Remarque -Django REST Framework a Ă©tĂ© créé par Tom Christie. Le crĂ©ateur de Starlette et Uvicorn, sur lesquels **FastAPI** est basĂ©. +Django REST Framework a Ă©tĂ© créé par Tom Christie. Le mĂȘme crĂ©ateur de Starlette et Uvicorn, sur lesquels **FastAPI** est basĂ©. /// /// tip | A inspirĂ© **FastAPI** Ă  -Avoir une interface de documentation automatique de l'API. +Avoir une interface utilisateur web de documentation automatique de l'API. /// ### [Flask](https://flask.palletsprojects.com) { #flask } -Flask est un « micro‑framework », il ne comprend pas d'intĂ©grations de bases de donnĂ©es ni beaucoup de choses qui sont fournies par dĂ©faut dans Django. +Flask est un « microframework », il ne comprend pas d'intĂ©grations de bases de donnĂ©es ni beaucoup de choses qui sont fournies par dĂ©faut dans Django. Cette simplicitĂ© et cette flexibilitĂ© permettent d'utiliser des bases de donnĂ©es NoSQL comme principal systĂšme de stockage de donnĂ©es. @@ -60,22 +60,22 @@ technique par moments. Il est aussi couramment utilisĂ© pour d'autres applications qui n'ont pas nĂ©cessairement besoin d'une base de donnĂ©es, de gestion des utilisateurs ou de l'une des nombreuses fonctionnalitĂ©s prĂ©installĂ©es dans Django. Bien que beaucoup de ces fonctionnalitĂ©s puissent ĂȘtre ajoutĂ©es avec des plug-ins. -Ce dĂ©couplage des parties, et le fait d'ĂȘtre un « micro‑framework » qui puisse ĂȘtre Ă©tendu pour couvrir exactement ce +Ce dĂ©couplage des parties, et le fait d'ĂȘtre un « microframework » qui puisse ĂȘtre Ă©tendu pour couvrir exactement ce qui est nĂ©cessaire, Ă©tait une caractĂ©ristique clĂ© que je voulais conserver. Compte tenu de la simplicitĂ© de Flask, il semblait bien adaptĂ© Ă  la crĂ©ation d'API. La prochaine chose Ă  trouver Ă©tait un « Django REST Framework » pour Flask. /// tip | A inspirĂ© **FastAPI** Ă  -Être un micro‑framework. Il est donc facile de combiner les outils et les piĂšces nĂ©cessaires. +Être un micro-framework. Il est donc facile de combiner les outils et les piĂšces nĂ©cessaires. -Proposer un systĂšme de routage simple et facile Ă  utiliser. +Proposer un systĂšme de routing simple et facile Ă  utiliser. /// ### [Requests](https://requests.readthedocs.io) { #requests } -**FastAPI** n'est pas rĂ©ellement une alternative Ă  **Requests**. Leur cadre est trĂšs diffĂ©rent. +**FastAPI** n'est pas rĂ©ellement une alternative Ă  **Requests**. Leur portĂ©e est trĂšs diffĂ©rente. Il serait en fait plus courant d'utiliser Requests _Ă  l'intĂ©rieur_ d'une application FastAPI. @@ -85,7 +85,7 @@ Mais quand mĂȘme, FastAPI s'est inspirĂ© de Requests. Ils sont, plus ou moins, aux extrĂ©mitĂ©s opposĂ©es, se complĂ©tant l'un l'autre. -Requests a un design trĂšs simple et intuitif, il est trĂšs facile Ă  utiliser, avec des valeurs par dĂ©faut raisonnables, tout en Ă©tant trĂšs puissant et personnalisable. +Requests a un design trĂšs simple et intuitif, il est trĂšs facile Ă  utiliser, avec des valeurs par dĂ©faut raisonnables. Mais en mĂȘme temps, il est trĂšs puissant et personnalisable. C'est pourquoi, comme le dit le site officiel : @@ -97,7 +97,7 @@ La façon dont vous l'utilisez est trĂšs simple. Par exemple, pour faire une req response = requests.get("http://example.com/some/url") ``` -L’opĂ©ration de chemin d'accĂšs correspondante dans **FastAPI** pourrait ressembler Ă  ceci : +Le *chemin d'accĂšs* d'API correspondant dans **FastAPI** pourrait ressembler Ă  ceci : ```Python hl_lines="1" @app.get("/some/url") @@ -117,7 +117,7 @@ Notez les similitudes entre `requests.get(...)` et `@app.get(...)`. ### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi } -La principale fonctionnalitĂ© que j'ai empruntĂ© Ă  Django REST Framework Ă©tait la documentation automatique des API. +La principale fonctionnalitĂ© que j'ai empruntĂ©e Ă  Django REST Framework Ă©tait la documentation automatique des API. Puis j'ai dĂ©couvert qu'il existait une norme pour documenter les API, en utilisant JSON (ou YAML, une extension de JSON) appelĂ©e Swagger. @@ -132,12 +132,12 @@ C'est pourquoi, lorsqu'on parle de la version 2.0, il est courant de dire « Swa Adopter et utiliser une norme ouverte pour les spĂ©cifications des API, au lieu d'un schĂ©ma personnalisĂ©. -IntĂ©grer des outils d'interface utilisateur basĂ©s sur des normes : +Et intĂ©grer des outils d'interface utilisateur basĂ©s sur des normes : * [Swagger UI](https://github.com/swagger-api/swagger-ui) * [ReDoc](https://github.com/Rebilly/ReDoc) -Ces deux-lĂ  ont Ă©tĂ© choisis parce qu'ils sont populaires et stables, mais en faisant une recherche rapide, vous pourriez trouver des dizaines d'alternatives supplĂ©mentaires pour OpenAPI (que vous pouvez utiliser avec **FastAPI**). +Ces deux-lĂ  ont Ă©tĂ© choisis parce qu'ils sont populaires et stables, mais en faisant une recherche rapide, vous pourriez trouver des dizaines d'interfaces utilisateur alternatives pour OpenAPI (que vous pouvez utiliser avec **FastAPI**). /// @@ -149,14 +149,13 @@ permanents qui les rendent inadaptĂ©s. ### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow } -L'une des principales fonctionnalitĂ©s nĂ©cessaires aux systĂšmes API est la « sĂ©rialisation » des donnĂ©es, qui consiste Ă  prendre les donnĂ©es du code (Python) et Ă  +L'une des principales fonctionnalitĂ©s nĂ©cessaires aux systĂšmes API est la « sĂ©rialisation » des donnĂ©es, qui consiste Ă  prendre les donnĂ©es du code (Python) et Ă  les convertir en quelque chose qui peut ĂȘtre envoyĂ© sur le rĂ©seau. Par exemple, convertir un objet contenant des donnĂ©es provenant d'une base de donnĂ©es en un objet JSON. Convertir des objets `datetime` en strings, etc. La validation des donnĂ©es est une autre fonctionnalitĂ© importante dont ont besoin les API. Elle permet de s'assurer que les donnĂ©es sont valides, compte tenu de certains paramĂštres. Par exemple, qu'un champ est un `int`, et non un -string. -Ceci est particuliĂšrement utile pour les donnĂ©es entrantes. +string. Ceci est particuliĂšrement utile pour les donnĂ©es entrantes. Sans un systĂšme de validation des donnĂ©es, vous devriez effectuer toutes les vĂ©rifications Ă  la main, dans le code. @@ -182,7 +181,7 @@ C'est un outil formidable et je l'ai beaucoup utilisĂ© aussi, avant d'avoir **Fa /// note | Remarque -Webargs a Ă©tĂ© créé par les dĂ©veloppeurs de Marshmallow. +Webargs a Ă©tĂ© créé par les mĂȘmes dĂ©veloppeurs de Marshmallow. /// @@ -206,13 +205,13 @@ Et il gĂ©nĂšre des schĂ©mas OpenAPI. C'est ainsi que cela fonctionne dans Flask, Starlette, Responder, etc. -Mais alors, nous avons Ă  nouveau le problĂšme d'avoir une micro-syntaxe, dans une docstring Python (un gros morceau de YAML). +Mais alors, nous avons Ă  nouveau le problĂšme d'avoir une micro-syntaxe, dans une string Python (un gros morceau de YAML). L'Ă©diteur ne peut guĂšre aider en la matiĂšre. Et si nous modifions les paramĂštres ou les schĂ©mas Marshmallow et que nous oublions de modifier Ă©galement cette docstring YAML, le schĂ©ma gĂ©nĂ©rĂ© deviendrait obsolĂšte. /// note | Remarque -APISpec a Ă©tĂ© créé par les dĂ©veloppeurs de Marshmallow. +APISpec a Ă©tĂ© créé par les mĂȘmes dĂ©veloppeurs de Marshmallow. /// @@ -241,11 +240,11 @@ j'ai (ainsi que plusieurs Ă©quipes externes) utilisĂ©es jusqu'Ă  prĂ©sent : * [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase) * [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb) -Ces mĂȘmes gĂ©nĂ©rateurs full-stack ont servi de base aux [GĂ©nĂ©rateurs de projets pour **FastAPI**](project-generation.md). +Et ces mĂȘmes gĂ©nĂ©rateurs full-stack ont servi de base aux [GĂ©nĂ©rateurs de projets **FastAPI**](project-generation.md). /// note | Remarque -Flask-apispec a Ă©tĂ© créé par les dĂ©veloppeurs de Marshmallow. +Flask-apispec a Ă©tĂ© créé par les mĂȘmes dĂ©veloppeurs de Marshmallow. /// @@ -284,9 +283,9 @@ C'Ă©tait l'un des premiers frameworks Python extrĂȘmement rapides basĂ©s sur `as /// note | DĂ©tails techniques -Il utilisait [`uvloop`](https://github.com/MagicStack/uvloop) au lieu du systĂšme par dĂ©faut de Python `asyncio`. C'est ce qui l'a rendu si rapide. +Il utilisait [`uvloop`](https://github.com/MagicStack/uvloop) au lieu de la boucle par dĂ©faut de Python `asyncio`. C'est ce qui l'a rendu si rapide. -Il a clairement inspirĂ© Uvicorn et Starlette, qui sont actuellement plus rapides que Sanic dans les benchmarks. +Il a clairement inspirĂ© Uvicorn et Starlette, qui sont actuellement plus rapides que Sanic dans les benchmarks ouverts. /// @@ -304,7 +303,7 @@ Falcon est un autre framework Python haute performance, il est conçu pour ĂȘtre Il est conçu pour avoir des fonctions qui reçoivent deux paramĂštres, une « requĂȘte » et une « rĂ©ponse ». Ensuite, vous « lisez » des parties de la requĂȘte et « Ă©crivez » des parties dans la rĂ©ponse. En raison de cette conception, il n'est -pas possible de dĂ©clarer des paramĂštres de requĂȘte et des corps avec des indications de type Python standard comme paramĂštres de fonction. +pas possible de dĂ©clarer des paramĂštres de requĂȘte et des corps avec des annotations de type Python standard comme paramĂštres de fonction. Ainsi, la validation, la sĂ©rialisation et la documentation des donnĂ©es doivent ĂȘtre effectuĂ©es dans le code, et non pas automatiquement. Ou bien elles doivent ĂȘtre implĂ©mentĂ©es comme un framework au-dessus de Falcon, comme Hug. Cette mĂȘme distinction se retrouve dans d'autres frameworks qui s'inspirent de la conception de Falcon, qui consiste Ă  avoir un objet de requĂȘte et un objet de rĂ©ponse comme paramĂštres. @@ -326,7 +325,7 @@ J'ai dĂ©couvert Molten lors des premiĂšres Ă©tapes de dĂ©veloppement de **FastAP * Validation et documentation via ces types. * SystĂšme d'injection de dĂ©pendances. -Il n'utilise pas une librairie tiers de validation, sĂ©rialisation et de documentation tel que Pydantic, il utilise son propre systĂšme. Ainsi, ces dĂ©finitions de types de donnĂ©es ne sont pas rĂ©utilisables aussi facilement. +Il n'utilise pas une librairie tierce de validation, sĂ©rialisation et de documentation telle que Pydantic, il utilise son propre systĂšme. Ainsi, ces dĂ©finitions de types de donnĂ©es ne sont pas rĂ©utilisables aussi facilement. Il nĂ©cessite une configuration un peu plus verbeuse. Et comme il est basĂ© sur WSGI (au lieu d'ASGI), il n'est pas conçu pour profiter des hautes performances fournies par des outils comme Uvicorn, Starlette et Sanic. @@ -363,7 +362,7 @@ Comme il est basĂ© sur l'ancienne norme pour les frameworks web Python synchrone /// note | Remarque -Hug a Ă©tĂ© créé par Timothy Crosley, le crĂ©ateur de [`isort`](https://github.com/timothycrosley/isort), un excellent outil pour trier automatiquement les imports dans les fichiers Python. +Hug a Ă©tĂ© créé par Timothy Crosley, le mĂȘme crĂ©ateur de [`isort`](https://github.com/timothycrosley/isort), un excellent outil pour trier automatiquement les imports dans les fichiers Python. /// @@ -388,11 +387,11 @@ et les requĂȘtes que j'ai vues (avant NestJS et Molten). Je l'ai trouvĂ© plus ou Il disposait de la validation automatique, sĂ©rialisation des donnĂ©es et d'une gĂ©nĂ©ration de schĂ©ma OpenAPI basĂ©e sur les mĂȘmes annotations de type Ă  plusieurs endroits. -La dĂ©finition du schĂ©ma de corps de requĂȘte n'utilisait pas les mĂȘmes annotations de type Python que Pydantic, il Ă©tait un peu plus proche de Marshmallow, donc le support de l'Ă©diteur n'Ă©tait pas aussi bon, mais APIStar Ă©tait quand mĂȘme la meilleure option disponible. +Les dĂ©finitions de schĂ©ma de corps n'utilisaient pas les mĂȘmes annotations de type Python que Pydantic, c'Ă©tait un peu plus proche de Marshmallow, donc le support de l'Ă©diteur n'Ă©tait pas aussi bon, mais APIStar Ă©tait quand mĂȘme la meilleure option disponible. Il avait les meilleures performances d'aprĂšs les benchmarks de l'Ă©poque (seulement surpassĂ© par Starlette). -Au dĂ©part, il ne disposait pas d'une interface web de documentation automatique de l'API, mais je savais que je pouvais lui ajouter une interface Swagger. +Au dĂ©part, il ne disposait pas d'une interface utilisateur web de documentation automatique de l'API, mais je savais que je pouvais lui ajouter Swagger UI. Il avait un systĂšme d'injection de dĂ©pendances. Il nĂ©cessitait un prĂ©-enregistrement des composants, comme d'autres outils discutĂ©s ci-dessus. Mais c'Ă©tait quand mĂȘme une excellente fonctionnalitĂ©. @@ -422,7 +421,7 @@ L'idĂ©e de dĂ©clarer plusieurs choses (validation des donnĂ©es, sĂ©rialisation e Et aprĂšs avoir longtemps cherchĂ© un framework similaire et testĂ© de nombreuses alternatives, APIStar Ă©tait la meilleure option disponible. -Puis APIStar a cessĂ© d'exister en tant que serveur et Starlette a Ă©tĂ© créé, et a constituĂ© une meilleure base pour un tel systĂšme. Ce fut l'inspiration finale pour construire **FastAPI**. +Puis APIStar a cessĂ© d'exister en tant que serveur et Starlette a Ă©tĂ© créé, et a constituĂ© une nouvelle base meilleure pour un tel systĂšme. Ce fut l'inspiration finale pour construire **FastAPI**. Je considĂšre **FastAPI** comme un « successeur spirituel » d'APIStar, tout en amĂ©liorant et en augmentant les fonctionnalitĂ©s, le systĂšme de typage et d'autres parties, sur la base des enseignements tirĂ©s de tous ces outils prĂ©cĂ©dents. @@ -441,7 +440,7 @@ basĂ© sur les mĂȘmes annotations de type Python, le support de l'Ă©diteur est gr /// tip | **FastAPI** l'utilise pour -GĂ©rer toute la validation des donnĂ©es, leur sĂ©rialisation et la documentation automatique du modĂšle (basĂ©e sur le schĂ©ma JSON). +GĂ©rer toute la validation des donnĂ©es, leur sĂ©rialisation et la documentation automatique du modĂšle (basĂ©e sur JSON Schema). **FastAPI** prend ensuite ces donnĂ©es JSON Schema et les place dans OpenAPI, en plus de toutes les autres choses qu'il fait. @@ -455,20 +454,20 @@ Il est trĂšs simple et intuitif. Il est conçu pour ĂȘtre facilement extensible Il offre : -- Des performances vraiment impressionnantes. -- Le support des WebSockets. -- Les tĂąches d'arriĂšre-plan. -- Les Ă©vĂ©nements de dĂ©marrage et d'arrĂȘt. -- Un client de test basĂ© sur HTTPX. -- CORS, GZip, fichiers statiques, streaming des rĂ©ponses. -- Le support des sessions et des cookies. -- Une couverture de test Ă  100 %. -- 100 % de la base de code avec des annotations de type. -- Peu de dĂ©pendances strictes. +* Des performances vraiment impressionnantes. +* Le support de WebSocket. +* Les tĂąches d'arriĂšre-plan in-process. +* Les Ă©vĂ©nements de dĂ©marrage et d'arrĂȘt. +* Un client de test basĂ© sur HTTPX. +* CORS, GZip, fichiers statiques, streaming des rĂ©ponses. +* Le support des sessions et des cookies. +* Une couverture de test Ă  100 %. +* 100 % de la base de code avec des annotations de type. +* Peu de dĂ©pendances strictes. Starlette est actuellement le framework Python le plus rapide testĂ©. Seulement dĂ©passĂ© par Uvicorn, qui n'est pas un framework, mais un serveur. -Starlette fournit toutes les fonctionnalitĂ©s de base d'un micro‑framework web. +Starlette fournit toutes les fonctionnalitĂ©s de base d'un microframework web. Mais il ne fournit pas de validation automatique des donnĂ©es, de sĂ©rialisation ou de documentation. @@ -496,7 +495,7 @@ Ainsi, tout ce que vous pouvez faire avec Starlette, vous pouvez le faire direct Uvicorn est un serveur ASGI rapide comme l'Ă©clair, basĂ© sur uvloop et httptools. -Il ne s'agit pas d'un framework web, mais d'un serveur. Par exemple, il ne fournit pas d'outils pour le routing. C'est +Il ne s'agit pas d'un framework web, mais d'un serveur. Par exemple, il ne fournit pas d'outils pour le routing par chemins. C'est quelque chose qu'un framework comme Starlette (ou **FastAPI**) fournirait par-dessus. C'est le serveur recommandĂ© pour Starlette et **FastAPI**. diff --git a/docs/fr/docs/async.md b/docs/fr/docs/async.md index b3fc9169a..ccd176072 100644 --- a/docs/fr/docs/async.md +++ b/docs/fr/docs/async.md @@ -44,19 +44,19 @@ Si votre application (d'une certaine maniĂšre) n'a pas Ă  communiquer avec une a --- -Si vous ne savez pas, utilisez seulement `def`. +Si vous ne savez pas, utilisez un `def` normal. --- -Note : vous pouvez mĂ©langer `def` et `async def` dans vos *fonctions de chemin d'accĂšs* autant que nĂ©cessaire, et dĂ©finir chacune avec l’option la plus adaptĂ©e pour vous. FastAPI fera ce qu'il faut avec elles. +**Remarque** : vous pouvez mĂ©langer `def` et `async def` dans vos *fonctions de chemin d'accĂšs* autant que nĂ©cessaire, et dĂ©finir chacune avec l’option la plus adaptĂ©e pour vous. FastAPI fera ce qu'il faut avec elles. Au final, peu importe le cas parmi ceux ci-dessus, FastAPI fonctionnera de maniĂšre asynchrone et sera extrĂȘmement rapide. -Mais si vous suivez bien les instructions ci-dessus, il pourra effectuer quelques optimisations et ainsi amĂ©liorer les performances. +Mais si vous suivez bien les Ă©tapes ci-dessus, il pourra effectuer quelques optimisations de performance. ## DĂ©tails techniques { #technical-details } -Les versions modernes de Python supportent le **code asynchrone** grĂące aux **« coroutines »** avec les syntaxes **`async` et `await`**. +Les versions modernes de Python supportent le **« code asynchrone »** en utilisant quelque chose appelĂ© **« coroutines »**, avec la syntaxe **`async` et `await`**. Analysons les diffĂ©rentes parties de cette phrase dans les sections suivantes : @@ -70,7 +70,7 @@ Faire du code asynchrone signifie que le langage 💬 est capable de dire Ă  l'o Donc, pendant ce temps, l'ordinateur pourra effectuer d'autres tĂąches, pendant que « slow-file » 📝 se termine. -Ensuite l'ordinateur / le programme đŸ€– reviendra Ă  chaque fois qu'il en a la chance que ce soit parce qu'il attend Ă  nouveau, ou car il đŸ€– a fini tout le travail qu'il avait Ă  faire. Il đŸ€– regardera donc si les tĂąches qu'il attend ont terminĂ© d'ĂȘtre effectuĂ©es. +Ensuite l'ordinateur / le programme đŸ€– reviendra Ă  chaque fois qu'il en a la chance, parce qu'il attend Ă  nouveau, ou quand il đŸ€– a fini tout le travail qu'il avait Ă  faire Ă  ce moment-lĂ . Et il đŸ€– regardera si des tĂąches qu'il attendait ont dĂ©jĂ  terminĂ©, en faisant ce qu'il devait faire. Ensuite, il đŸ€– prendra la premiĂšre tĂąche Ă  finir (disons, notre « slow-file » 📝) et continuera Ă  faire avec cette derniĂšre ce qu'il Ă©tait censĂ©. @@ -80,18 +80,18 @@ Ce « attendre quelque chose d'autre » fait gĂ©nĂ©ralement rĂ©fĂ©rence Ă  des o * de la donnĂ©e envoyĂ©e depuis votre programme soit reçue par le client Ă  travers le rĂ©seau * le contenu d'un fichier sur le disque soit lu par le systĂšme et passĂ© Ă  votre programme * le contenu que votre programme a passĂ© au systĂšme soit Ă©crit sur le disque -* une opĂ©ration effectuĂ©e Ă  distance par une API se termine +* une opĂ©ration effectuĂ©e Ă  distance par une API * une opĂ©ration en base de donnĂ©es se termine * une requĂȘte Ă  une base de donnĂ©es renvoie un rĂ©sultat * etc. Le temps d'exĂ©cution Ă©tant consommĂ© majoritairement par l'attente d'opĂ©rations I/O, on appelle ceci des opĂ©rations « I/O bound ». -Ce concept se nomme « asynchrone » car l'ordinateur / le programme n'a pas besoin d'ĂȘtre « synchronisĂ© » avec la tĂąche, attendant le moment exact oĂč cette derniĂšre se terminera en ne faisant rien, pour ĂȘtre capable de rĂ©cupĂ©rer le rĂ©sultat de la tĂąche et l'utiliser dans la suite des opĂ©rations. +Ce concept se nomme « asynchrone » car l'ordinateur / le programme n'a pas besoin d'ĂȘtre « synchronisĂ© » avec la tĂąche lente, attendant le moment exact oĂč cette derniĂšre se terminera en ne faisant rien, pour ĂȘtre capable de rĂ©cupĂ©rer le rĂ©sultat de la tĂąche et l'utiliser dans la suite des opĂ©rations. -À la place, en Ă©tant « asynchrone », une fois terminĂ©e, une tĂąche peut lĂ©gĂšrement attendre (quelques microsecondes) que l'ordinateur / le programme finisse ce qu'il Ă©tait en train de faire, et revienne rĂ©cupĂ©rer le rĂ©sultat. +À la place, en Ă©tant un systĂšme « asynchrone », une fois terminĂ©e, la tĂąche peut attendre un peu dans la file (quelques microsecondes) que l'ordinateur / le programme finisse ce qu'il Ă©tait en train de faire, puis revienne rĂ©cupĂ©rer les rĂ©sultats et continue Ă  travailler avec eux. -Pour parler de tĂąches « synchrones » (en opposition Ă  « asynchrones »), on utilise souvent le terme « sĂ©quentiel », car l'ordinateur / le programme va effectuer toutes les Ă©tapes d'une tĂąche sĂ©quentiellement avant de passer Ă  une autre tĂąche, mĂȘme si ces Ă©tapes impliquent de l'attente. +Pour parler de tĂąches « synchrones » (en opposition Ă  « asynchrones »), on utilise souvent aussi le terme « sĂ©quentiel », car l'ordinateur / le programme va effectuer toutes les Ă©tapes d'une tĂąche sĂ©quentiellement avant de passer Ă  une autre tĂąche, mĂȘme si ces Ă©tapes impliquent de l'attente. ### Concurrence et Burgers { #concurrency-and-burgers } @@ -99,49 +99,49 @@ L'idĂ©e de code **asynchrone** dĂ©crite ci-dessus est parfois aussi appelĂ©e ** La **concurrence** et le **parallĂ©lisme** sont tous deux liĂ©s Ă  l'idĂ©e de « diffĂ©rentes choses arrivant plus ou moins au mĂȘme moment ». -Mais les dĂ©tails entre la **concurrence** et le **parallĂ©lisme** diffĂšrent sur de nombreux points. +Mais les dĂ©tails entre la *concurrence* et le *parallĂ©lisme* sont assez diffĂ©rents. -Pour expliquer la diffĂ©rence, voici une histoire de burgers : +Pour expliquer la diffĂ©rence, imaginez l'histoire suivante Ă  propos de burgers : ### Burgers concurrents { #concurrent-burgers } -Vous amenez votre crush 😍 dans votre fast food 🍔 favori, et faites la queue pendant que le serveur 💁 prend les commandes des personnes devant vous. +Vous allez avec votre crush chercher de la nourriture dans un fast food, vous faites la queue pendant que le caissier prend les commandes des personnes devant vous. 😍 -Puis vient votre tour, vous commandez alors 2 magnifiques burgers 🍔 pour votre crush 😍 et vous. +Puis vient votre tour, vous commandez alors 2 burgers trĂšs sophistiquĂ©s pour votre crush et vous. 🍔🍔 -Le serveur 💁 dit quelque chose Ă  son collĂšgue dans la cuisine 👹‍🍳 pour qu'il sache qu'il doit prĂ©parer vos burgers 🍔 (bien qu'il soit dĂ©jĂ  en train de prĂ©parer ceux des clients prĂ©cĂ©dents). +Le caissier dit quelque chose au cuisinier dans la cuisine pour qu'il sache qu'il doit prĂ©parer vos burgers (bien qu'il soit dĂ©jĂ  en train de prĂ©parer ceux des clients prĂ©cĂ©dents). -Vous payez 💾. +Vous payez. 💾 -Le serveur 💁 vous donne le numĂ©ro assignĂ© Ă  votre commande. +Le caissier vous donne le numĂ©ro de votre tour. -Pendant que vous attendez, vous allez choisir une table avec votre crush 😍, vous discutez avec votre crush 😍 pendant un long moment (les burgers Ă©tant « magnifiques » ils sont trĂšs longs Ă  prĂ©parer ✹🍔✹). +Pendant que vous attendez, vous allez choisir une table avec votre crush, vous vous asseyez et discutez avec votre crush pendant un long moment (vos burgers Ă©tant trĂšs sophistiquĂ©s, ils prennent du temps Ă  prĂ©parer). -Pendant que vous ĂȘtes assis Ă  table, en attendant que les burgers 🍔 soient prĂȘts, vous pouvez passer ce temps Ă  admirer Ă  quel point votre crush 😍 est gĂ©niale, mignonne et intelligente ✹😍✹. +Pendant que vous ĂȘtes assis Ă  table avec votre crush, en attendant les burgers, vous pouvez passer ce temps Ă  admirer Ă  quel point votre crush est gĂ©niale, mignonne et intelligente ✹😍✹. -Pendant que vous discutez avec votre crush 😍, de temps en temps vous jetez un coup d’Ɠil au nombre affichĂ© au-dessus du comptoir pour savoir si c'est Ă  votre tour d'ĂȘtre servis. +Pendant que vous attendez et discutez avec votre crush, de temps en temps, vous jetez un coup d’Ɠil au nombre affichĂ© au-dessus du comptoir pour savoir si c'est dĂ©jĂ  votre tour. -Jusqu'au moment oĂč c'est (enfin) votre tour. Vous allez au comptoir, rĂ©cupĂ©rez vos burgers 🍔 et revenez Ă  votre table. +Puis, Ă  un moment, c'est enfin votre tour. Vous allez au comptoir, rĂ©cupĂ©rez vos burgers et revenez Ă  votre table. -Vous et votre crush 😍 mangez les burgers 🍔 et passez un bon moment ✹. +Vous et votre crush mangez les burgers et passez un bon moment. ✹ /// note | Remarque -Illustrations proposĂ©es par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎹 +Belles illustrations par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎹 /// @@ -149,103 +149,103 @@ Illustrations proposĂ©es par [Ketrina Thompson](https://www.instagram.com/ketrin Imaginez que vous ĂȘtes l'ordinateur / le programme đŸ€– dans cette histoire. -Pendant que vous faites la queue, vous ĂȘtre simplement inactif 😮, attendant votre tour, ne faisant rien de « productif ». Mais la queue est rapide car le serveur 💁 prend seulement les commandes (et ne les prĂ©pare pas), donc tout va bien. +Pendant que vous faites la queue, vous ĂȘtes simplement inactif 😮, attendant votre tour, ne faisant rien de trĂšs « productif ». Mais la queue est rapide car le caissier prend seulement les commandes (et ne les prĂ©pare pas), donc tout va bien. -Ensuite, quand c'est votre tour, vous faites des actions « productives » đŸ€“, vous Ă©tudiez le menu, dĂ©cidez ce que vous voulez, demandez Ă  votre crush 😍 son choix, payez 💾, vĂ©rifiez que vous utilisez la bonne carte de crĂ©dit, vĂ©rifiez que le montant dĂ©bitĂ© sur la carte est correct, vĂ©rifiez que la commande contient les bons produits, etc. +Ensuite, quand c'est votre tour, vous faites du vrai travail « productif », vous Ă©tudiez le menu, dĂ©cidez ce que vous voulez, demandez Ă  votre crush son choix, payez, vĂ©rifiez que vous donnez le bon billet ou la bonne carte, vĂ©rifiez que le montant dĂ©bitĂ© est correct, vĂ©rifiez que la commande contient les bons produits, etc. -Mais ensuite, mĂȘme si vous n'avez pas encore vos burgers 🍔, votre travail avec le serveur 💁 est « en pause » ⏞, car vous devez attendre 🕙 que vos burgers soient prĂȘts. +Mais ensuite, mĂȘme si vous n'avez toujours pas vos burgers, votre travail avec le caissier est « en pause » ⏞, car vous devez attendre 🕙 que vos burgers soient prĂȘts. -AprĂšs vous ĂȘtre Ă©cartĂ© du comptoir et vous ĂȘtre assis Ă  votre table avec le numĂ©ro de votre commande, vous pouvez tourner 🔀 votre attention vers votre crush 😍, et « travailler » ⏯ đŸ€“ lĂ -dessus. Vous ĂȘtes donc Ă  nouveau en train de faire quelque chose de « productif » đŸ€“, vous flirtez avec votre crush 😍. +Mais lorsque vous vous Ă©cartez du comptoir et vous asseyez Ă  table avec un numĂ©ro pour votre tour, vous pouvez tourner 🔀 votre attention vers votre crush, et « travailler » ⏯ đŸ€“ lĂ -dessus. Vous ĂȘtes donc Ă  nouveau en train de faire quelque chose de trĂšs « productif », comme flirter avec votre crush 😍. -Puis le serveur 💁 dit « J'ai fini de prĂ©parer les burgers » 🍔 en mettant votre numĂ©ro sur l'affichage du comptoir, mais vous ne courez pas immĂ©diatement au moment oĂč votre numĂ©ro s'affiche. Vous savez que personne ne volera vos burgers 🍔 car vous avez votre numĂ©ro et les autres clients ont le leur. +Puis le caissier 💁 dit « J'ai fini de faire les burgers » en mettant votre numĂ©ro sur l'affichage du comptoir, mais vous ne sautez pas comme un fou immĂ©diatement quand le numĂ©ro affichĂ© change pour devenir votre numĂ©ro. Vous savez que personne ne volera vos burgers car vous avez le numĂ©ro de votre tour, et les autres ont le leur. -Vous attendez donc que votre crush 😍 finisse son histoire, souriez gentiment et dites que vous allez chercher les burgers ⏞. +Vous attendez donc que votre crush finisse son histoire (termine le travail actuel ⏯ / la tĂąche en cours de traitement đŸ€“), souriez gentiment et dites que vous allez chercher les burgers ⏞. -Pour finir vous allez au comptoir 🔀, vers la tĂąche initiale qui est dĂ©sormais terminĂ©e ⏯, rĂ©cupĂ©rez les burgers 🍔, remerciez le serveur et ramenez les burgers 🍔 Ă  votre table. Ceci termine l'Ă©tape / la tĂąche d'interaction avec le comptoir âč. Ce qui ensuite, crĂ©e une nouvelle tĂąche de « manger les burgers » 🔀 ⏯, mais la prĂ©cĂ©dente, « rĂ©cupĂ©rer les burgers » est terminĂ©e âč. +Puis vous allez au comptoir 🔀, vers la tĂąche initiale qui est dĂ©sormais terminĂ©e ⏯, rĂ©cupĂ©rez les burgers, remerciez et ramenez les burgers Ă  votre table. Ceci termine l'Ă©tape / la tĂąche d'interaction avec le comptoir âč. Ce qui ensuite crĂ©e une nouvelle tĂąche, « manger les burgers » 🔀 ⏯, mais la prĂ©cĂ©dente, « rĂ©cupĂ©rer les burgers », est terminĂ©e âč. ### Burgers parallĂšles { #parallel-burgers } -Imaginons dĂ©sormais que ce ne sont pas des « burgers concurrents » mais des « burgers parallĂšles ». +Imaginons dĂ©sormais que ce ne sont pas des « Burgers concurrents » mais des « Burgers parallĂšles ». -Vous allez avec votre crush 😍 dans un fast food 🍔 parallĂ©lisĂ©. +Vous allez avec votre crush chercher de la nourriture dans un fast food parallĂšle. -Vous attendez pendant que plusieurs (disons 8) serveurs qui sont aussi des cuisiniers 👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳 prennent les commandes des personnes devant vous. +Vous attendez pendant que plusieurs (disons 8) caissiers qui sont en mĂȘme temps cuisiniers prennent les commandes des personnes devant vous. -Chaque personne devant vous attend 🕙 que son burger 🍔 soit prĂȘt avant de quitter le comptoir car chacun des 8 serveurs va lui-mĂȘme prĂ©parer le burger directement avant de prendre la commande suivante. +Chaque personne devant vous attend que son burger soit prĂȘt avant de quitter le comptoir car chacun des 8 caissiers va prĂ©parer le burger directement avant de prendre la commande suivante. -Puis c'est enfin votre tour, vous commandez 2 magnifiques burgers 🍔 pour vous et votre crush 😍. +Puis c'est enfin votre tour, vous commandez 2 burgers trĂšs sophistiquĂ©s pour vous et votre crush. Vous payez 💾. -Le serveur va dans la cuisine 👹‍🍳. +Le caissier va dans la cuisine. -Vous attendez devant le comptoir afin que personne ne prenne vos burgers 🍔 avant vous, vu qu'il n'y a pas de numĂ©ro de commande. +Vous attendez, debout devant le comptoir 🕙, afin que personne d'autre ne prenne vos burgers avant vous, vu qu'il n'y a pas de numĂ©ros pour les tours. -Vous et votre crush 😍 Ă©tant occupĂ©s Ă  vĂ©rifier que personne ne passe devant vous prendre vos burgers au moment oĂč ils arriveront 🕙, vous ne pouvez pas vous prĂ©occuper de votre crush 😞. +Vous et votre crush Ă©tant occupĂ©s Ă  ne laisser personne passer devant vous et prendre vos burgers au moment oĂč ils arriveront, vous ne pouvez pas prĂȘter attention Ă  votre crush. 😞 -C'est du travail « synchrone », vous ĂȘtre « synchronisĂ©s » avec le serveur/cuisinier 👹‍🍳. Vous devez attendre 🕙 et ĂȘtre prĂ©sent au moment exact oĂč le serveur/cuisinier 👹‍🍳 finira les burgers 🍔 et vous les donnera, sinon quelqu'un risque de vous les prendre. +C'est du travail « synchrone », vous ĂȘtre « synchronisĂ©s » avec le caissier/cuisinier 👹‍🍳. Vous devez attendre 🕙 et ĂȘtre prĂ©sent au moment exact oĂč le caissier/cuisinier 👹‍🍳 finira les burgers et vous les donnera, sinon quelqu'un d'autre risque de vous les prendre. -Puis le serveur/cuisinier 👹‍🍳 revient enfin avec vos burgers 🍔, aprĂšs un long moment d'attente 🕙 devant le comptoir. +Puis votre caissier/cuisinier 👹‍🍳 revient enfin avec vos burgers, aprĂšs un long moment d'attente 🕙 devant le comptoir. -Vous prenez vos burgers 🍔 et allez Ă  une table avec votre crush 😍 +Vous prenez vos burgers et allez Ă  une table avec votre crush. -Vous les mangez, et vous avez terminĂ© 🍔 âč. +Vous les mangez simplement, et vous avez terminĂ©. âč -Durant tout ce processus, il n'y a presque pas eu de discussions ou de flirts car la plupart de votre temps Ă  Ă©tĂ© passĂ© Ă  attendre 🕙 devant le comptoir 😞. +Il n'y a pas eu beaucoup de discussions ou de flirts car la plupart du temps a Ă©tĂ© passĂ© Ă  attendre 🕙 devant le comptoir. 😞 /// note | Remarque -Illustrations proposĂ©es par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎹 +Belles illustrations par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎹 /// --- -Dans ce scĂ©nario de burgers parallĂšles, vous ĂȘtes un ordinateur / programme đŸ€– avec deux processeurs (vous et votre crush 😍) attendant 🕙 Ă  deux et dĂ©diant votre attention ⏯ Ă  « attendre devant le comptoir » 🕙 pour une longue durĂ©e. +Dans ce scĂ©nario de burgers parallĂšles, vous ĂȘtes un ordinateur / programme đŸ€– avec deux processeurs (vous et votre crush), tous deux attendant 🕙 et dĂ©diant leur attention ⏯ Ă  « attendre devant le comptoir » 🕙 pour une longue durĂ©e. -Le fast-food a 8 processeurs (serveurs/cuisiniers) 👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳. Alors que le fast-food de burgers concurrents en avait 2 (un serveur et un cuisinier). +Le fast food a 8 processeurs (caissiers/cuisiniers). Alors que le fast food de burgers concurrents aurait pu n'en avoir que 2 (un caissier et un cuisinier). -Et pourtant l'expĂ©rience finale n'est pas meilleure 😞. +Mais tout de mĂȘme, l'expĂ©rience finale n'est pas la meilleure. 😞 --- -C'est donc l'histoire Ă©quivalente parallĂšle pour les burgers 🍔. +Ce serait donc l'histoire Ă©quivalente parallĂšle pour les burgers. 🍔 -Pour un exemple plus courant dans la « vie rĂ©elle », imaginez une banque. +Pour un exemple plus « vie rĂ©elle », imaginez une banque. -Jusqu'Ă  rĂ©cemment, la plupart des banques avaient plusieurs caisses (et banquiers) đŸ‘šâ€đŸ’ŒđŸ‘šâ€đŸ’ŒđŸ‘šâ€đŸ’ŒđŸ‘šâ€đŸ’Œ et une unique file d'attente 🕙🕙🕙🕙🕙🕙🕙🕙. +Jusqu'Ă  rĂ©cemment, la plupart des banques avaient plusieurs caissiers đŸ‘šâ€đŸ’ŒđŸ‘šâ€đŸ’ŒđŸ‘šâ€đŸ’ŒđŸ‘šâ€đŸ’Œ et une grande file d'attente 🕙🕙🕙🕙🕙🕙🕙🕙. -Tous les banquiers faisaient l'intĂ©gralitĂ© du travail avec chaque client avant de passer au suivant đŸ‘šâ€đŸ’ŒâŻ. +Tous les caissiers faisaient tout le travail avec chaque client avant de passer au suivant đŸ‘šâ€đŸ’ŒâŻ. -Et vous deviez attendre 🕙 dans la file pendant un long moment ou vous perdiez votre place. +Et vous devez attendre 🕙 dans la file pendant un long moment ou vous perdez votre tour. -Vous n'auriez donc probablement pas envie d'amener votre crush 😍 avec vous Ă  la banque 🏩. +Vous n'auriez donc probablement pas envie d'amener votre crush 😍 avec vous pour faire des dĂ©marches Ă  la banque 🏩. ### Conclusion sur les burgers { #burger-conclusion } -Dans ce scĂ©nario des « burgers du fast-food avec votre crush », comme il y a beaucoup d'attente 🕙, il est trĂšs logique d'avoir un systĂšme concurrent ⏾🔀⏯. +Dans ce scĂ©nario des « burgers de fast food avec votre crush », comme il y a beaucoup d'attente 🕙, il est beaucoup plus logique d'avoir un systĂšme concurrent ⏾🔀⏯. -Et c'est le cas pour la plupart des applications web. +C'est le cas pour la plupart des applications web. -Vous aurez de nombreux, nombreux utilisateurs, mais votre serveur attendra 🕙 que leur connexion peu performante envoie des requĂȘtes. +De trĂšs, trĂšs nombreux utilisateurs, mais votre serveur attend 🕙 que leur connexion pas trĂšs bonne envoie leurs requĂȘtes. -Puis vous attendrez 🕙 de nouveau que leurs rĂ©ponses reviennent. +Puis attend 🕙 de nouveau que les rĂ©ponses reviennent. -Cette « attente » 🕙 se mesure en microsecondes, mais tout de mĂȘme, en cumulĂ© cela fait beaucoup d'attente. +Cette « attente » 🕙 se mesure en microsecondes, mais tout de mĂȘme, en les cumulant toutes, cela fait beaucoup d'attente au final. -C'est pourquoi il est logique d'utiliser du code asynchrone ⏾🔀⏯ pour des APIs web. +C'est pourquoi il est trĂšs logique d'utiliser du code asynchrone ⏾🔀⏯ pour des APIs web. Ce type d'asynchronicitĂ© est ce qui a rendu NodeJS populaire (bien que NodeJS ne soit pas parallĂšle) et c'est la force de Go en tant que langage de programmation. @@ -255,11 +255,11 @@ Et comme on peut avoir du parallĂ©lisme et de l'asynchronicitĂ© en mĂȘme temps, ### Est-ce que la concurrence est mieux que le parallĂ©lisme ? { #is-concurrency-better-than-parallelism } -Nope ! C'est ça la morale de l'histoire. +Nope ! Ce n'est pas la morale de l'histoire. -La concurrence est diffĂ©rente du parallĂ©lisme. C'est mieux sur des scĂ©narios **spĂ©cifiques** qui impliquent beaucoup d'attente. À cause de ça, c'est gĂ©nĂ©ralement bien meilleur que le parallĂ©lisme pour le dĂ©veloppement d'applications web. Mais pas pour tout. +La concurrence est diffĂ©rente du parallĂ©lisme. Et c'est mieux dans des scĂ©narios **spĂ©cifiques** qui impliquent beaucoup d'attente. À cause de ça, c'est gĂ©nĂ©ralement bien meilleur que le parallĂ©lisme pour le dĂ©veloppement d'applications web. Mais pas pour tout. -Donc pour Ă©quilibrer tout ça, imaginez l'histoire suivante : +Donc pour Ă©quilibrer tout ça, imaginez l'histoire courte suivante : > Vous devez nettoyer une grande et sale maison. @@ -269,42 +269,42 @@ Donc pour Ă©quilibrer tout ça, imaginez l'histoire suivante : Il n'y a plus d'attente 🕙 nulle part, juste beaucoup de travail Ă  effectuer, dans diffĂ©rentes piĂšces de la maison. -Vous pourriez diviser en diffĂ©rentes sections comme avec les burgers, d'abord le salon, puis la cuisine, etc. Mais vous n'attendez 🕙 rien, vous ne faites que nettoyer et nettoyer, la sĂ©paration en sections ne changerait rien au final. +Vous pourriez avoir des tours comme dans l'exemple des burgers, d'abord le salon, puis la cuisine, mais comme vous n'attendez 🕙 rien, vous ne faites que nettoyer et nettoyer, les tours ne changeraient rien. -Cela prendrait autant de temps pour finir avec ou sans sections (concurrence) et vous auriez effectuĂ© la mĂȘme quantitĂ© de travail. +Cela prendrait autant de temps pour finir avec ou sans tours (concurrence) et vous auriez effectuĂ© la mĂȘme quantitĂ© de travail. -Mais dans ce cas, si pouviez amener 8 ex-serveurs/cuisiniers/devenus-nettoyeurs 👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳, et que chacun d'eux (plus vous) pouvait prendre une zone de la maison pour la nettoyer, vous pourriez faire tout le travail en parallĂšle, et finir plus tĂŽt. +Mais dans ce cas, si vous pouviez amener les 8 ex-caissiers/cuisiniers/dĂ©sormais-nettoyeurs, et que chacun d'eux (plus vous) pouvait prendre une zone de la maison pour la nettoyer, vous pourriez faire tout le travail en **parallĂšle**, avec l'aide supplĂ©mentaire, et finir beaucoup plus tĂŽt. Dans ce scĂ©nario, chacun des nettoyeurs (vous y compris) serait un processeur, faisant sa partie du travail. -Et comme la plupart du temps d'exĂ©cution est pris par du « vrai » travail (et non de l'attente), et que le travail dans un ordinateur est fait par un CPU, ce sont des problĂšmes dits « CPU bound ». +Et comme la plupart du temps d'exĂ©cution est pris par du vrai travail (et non de l'attente), et que le travail dans un ordinateur est fait par un CPU, ce sont des problĂšmes dits « CPU bound ». --- -Des exemples communs d'opĂ©rations « CPU bound » sont les procĂ©dĂ©s qui requiĂšrent des traitements mathĂ©matiques complexes. +Des exemples communs d'opĂ©rations CPU bound sont les choses qui requiĂšrent des traitements mathĂ©matiques complexes. Par exemple : -* Traitements d'**audio** et d'**images**. -* La **vision par ordinateur** : une image est composĂ©e de millions de pixels, chaque pixel ayant 3 valeurs / couleurs, les traiter tous va nĂ©cessiter d'effectuer des traitements sur chaque pixel, et de prĂ©fĂ©rence tous en mĂȘme temps. -* L'apprentissage automatique (ou **Machine Learning**) : cela nĂ©cessite de nombreuses multiplications de matrices et vecteurs. Imaginez une Ă©norme feuille de calcul remplie de nombres que vous multiplierez entre eux tous au mĂȘme moment. -* L'apprentissage profond (ou **Deep Learning**) : est un sous-domaine du **Machine Learning**, donc les mĂȘmes raisons s'appliquent. Avec la diffĂ©rence qu'il n'y a pas une unique feuille de calcul de nombres Ă  multiplier, mais une Ă©norme quantitĂ© d'entre elles, et dans de nombreux cas, on utilise un processeur spĂ©cial pour construire et / ou utiliser ces modĂšles. +* Traitements d'**audio** ou d'**images**. +* **Computer vision** : une image est composĂ©e de millions de pixels, chaque pixel ayant 3 valeurs / couleurs, les traiter nĂ©cessite normalement d'effectuer des calculs sur ces pixels, tous en mĂȘme temps. +* **Machine Learning** : cela nĂ©cessite normalement de nombreuses multiplications de « matrices » et de « vecteurs ». Imaginez une Ă©norme feuille de calcul remplie de nombres et les multiplier tous ensemble au mĂȘme moment. +* **Deep Learning** : c'est un sous-domaine du Machine Learning, donc les mĂȘmes raisons s'appliquent. C'est juste qu'il n'y a pas une unique feuille de calcul de nombres Ă  multiplier, mais une Ă©norme quantitĂ© d'entre elles, et dans de nombreux cas, on utilise un processeur spĂ©cial pour construire et / ou utiliser ces modĂšles. ### Concurrence + ParallĂ©lisme : Web + Machine Learning { #concurrency-parallelism-web-machine-learning } -Avec **FastAPI** vous pouvez bĂ©nĂ©ficier de la concurrence qui est trĂšs courante en dĂ©veloppement web (c'est l'attrait principal de NodeJS). +Avec **FastAPI** vous pouvez bĂ©nĂ©ficier de la concurrence qui est trĂšs courante en dĂ©veloppement web (le mĂȘme attrait principal de NodeJS). -Mais vous pouvez aussi profiter du parallĂ©lisme et du multiprocessing (plusieurs processus s'exĂ©cutant en parallĂšle) afin de gĂ©rer des charges **CPU bound** qui sont rĂ©currentes dans les systĂšmes de *Machine Learning*. +Mais vous pouvez aussi profiter du parallĂ©lisme et du multiprocessing (plusieurs processus s'exĂ©cutant en parallĂšle) afin de gĂ©rer des charges **CPU bound** comme celles des systĂšmes de Machine Learning. -Ça, ajoutĂ© au fait que Python soit le langage le plus populaire pour la **Data Science**, le **Machine Learning** et surtout le **Deep Learning**, font de **FastAPI** un trĂšs bon choix pour les APIs et applications de **Data Science** / **Machine Learning**. +Ça, ajoutĂ© au simple fait que Python soit le langage principal pour la **Data Science**, le Machine Learning et surtout le Deep Learning, fait de FastAPI un trĂšs bon choix pour les APIs web et applications de Data Science / Machine Learning (entre autres). -Pour comprendre comment mettre en place ce parallĂ©lisme en production, allez lire la section [DĂ©ploiement](deployment/index.md). +Pour comprendre comment mettre en place ce parallĂ©lisme en production, consultez la section sur le [DĂ©ploiement](deployment/index.md). ## `async` et `await` { #async-and-await } -Les versions modernes de Python ont une maniĂšre trĂšs intuitive de dĂ©finir le code asynchrone, tout en gardant une apparence de code « sĂ©quentiel » classique en laissant Python faire l'attente pour vous au bon moment. +Les versions modernes de Python ont une maniĂšre trĂšs intuitive de dĂ©finir le code asynchrone. Cela le fait ressembler Ă  du code « sĂ©quentiel » normal et effectue l'« attente » pour vous aux bons moments. -Pour une opĂ©ration qui nĂ©cessite de l'attente avant de donner un rĂ©sultat et qui supporte ces nouvelles fonctionnalitĂ©s Python, vous pouvez l'utiliser comme tel : +Pour une opĂ©ration qui nĂ©cessite de l'attente avant de donner un rĂ©sultat et qui supporte ces nouvelles fonctionnalitĂ©s Python, vous pouvez l'Ă©crire comme ceci : ```Python burgers = await get_burgers(2) @@ -312,7 +312,7 @@ burgers = await get_burgers(2) Le mot-clĂ© important ici est `await`. Il informe Python qu'il faut attendre ⏞ que `get_burgers(2)` finisse d'effectuer ses opĂ©rations 🕙 avant de stocker les rĂ©sultats dans la variable `burgers`. GrĂące Ă  cela, Python saura qu'il peut aller effectuer d'autres opĂ©rations 🔀 ⏯ pendant ce temps (comme par exemple recevoir une autre requĂȘte). -Pour que `await` fonctionne, il doit ĂȘtre placĂ© dans une fonction qui supporte l'asynchronicitĂ©. Pour que ça soit le cas, il faut dĂ©clarer cette derniĂšre avec `async def` : +Pour que `await` fonctionne, il doit ĂȘtre placĂ© dans une fonction qui supporte cette asynchronicitĂ©. Pour que ça soit le cas, il faut dĂ©clarer cette derniĂšre avec `async def` : ```Python hl_lines="1" async def get_burgers(number: int): @@ -320,7 +320,7 @@ async def get_burgers(number: int): return burgers ``` -... et non `def` : +... au lieu de `def` : ```Python hl_lines="2" # Ceci n'est pas asynchrone @@ -331,16 +331,16 @@ def get_sequential_burgers(number: int): Avec `async def`, Python sait que dans cette fonction il doit prendre en compte les expressions `await`, et qu'il peut mettre en pause ⏞ l'exĂ©cution de la fonction pour aller faire autre chose 🔀 avant de revenir. -Pour appeler une fonction dĂ©finie avec `async def`, vous devez utiliser `await`. Donc ceci ne marche pas : +Lorsque vous voulez appeler une fonction `async def`, vous devez l'« attendre ». Donc ceci ne marche pas : ```Python -# Ceci ne fonctionne pas, car get_burgers a Ă©tĂ© dĂ©fini avec async def +# Ceci ne fonctionne pas, car get_burgers a Ă©tĂ© dĂ©fini avec : async def burgers = get_burgers(2) ``` --- -Donc, si vous utilisez une bibliothĂšque qui nĂ©cessite que ses fonctions soient appelĂ©es avec `await`, vous devez dĂ©finir la *fonction de chemin d'accĂšs* en utilisant `async def` comme dans : +Donc, si vous utilisez une bibliothĂšque qui vous indique que vous pouvez l'appeler avec `await`, vous devez crĂ©er les *fonctions de chemin d'accĂšs* qui l'utilisent avec `async def`, comme dans : ```Python hl_lines="2-3" @app.get('/burgers') @@ -351,13 +351,13 @@ async def read_burgers(): ### Plus de dĂ©tails techniques { #more-technical-details } -Vous avez donc compris que `await` peut seulement ĂȘtre utilisĂ© dans des fonctions dĂ©finies avec `async def`. +Vous avez peut-ĂȘtre remarquĂ© que `await` peut seulement ĂȘtre utilisĂ© dans des fonctions dĂ©finies avec `async def`. -Mais en mĂȘme temps, les fonctions dĂ©finies avec `async def` doivent ĂȘtre appelĂ©es avec `await` et donc dans des fonctions dĂ©finies elles aussi avec `async def`. +Mais en mĂȘme temps, les fonctions dĂ©finies avec `async def` doivent ĂȘtre « attendues ». Donc, les fonctions avec `async def` peuvent seulement ĂȘtre appelĂ©es Ă  l'intĂ©rieur de fonctions dĂ©finies elles aussi avec `async def`. -Vous avez donc remarquĂ© ce paradoxe d'Ɠuf et de la poule, comment appelle-t-on la premiĂšre fonction `async` ? +Donc, Ă  propos de l'Ɠuf et de la poule, comment appelle-t-on la premiĂšre fonction `async` ? -Si vous utilisez **FastAPI**, pas besoin de vous en inquiĂ©ter, car cette « premiĂšre » fonction sera votre *fonction de chemin d'accĂšs* ; et **FastAPI** saura comment arriver au rĂ©sultat attendu. +Si vous utilisez **FastAPI**, pas besoin de vous en inquiĂ©ter, car cette « premiĂšre » fonction sera votre *fonction de chemin d'accĂšs*, et FastAPI saura comment faire ce qu'il faut. Mais si vous souhaitez utiliser `async` / `await` sans FastAPI, vous pouvez Ă©galement le faire. @@ -367,7 +367,7 @@ Starlette (et **FastAPI**) s’appuie sur [AnyIO](https://anyio.readthedocs.io/e En particulier, vous pouvez utiliser directement [AnyIO](https://anyio.readthedocs.io/en/stable/) pour vos cas d’usage de concurrence avancĂ©s qui nĂ©cessitent des schĂ©mas plus Ă©laborĂ©s dans votre propre code. -Et mĂȘme si vous n’utilisiez pas FastAPI, vous pourriez aussi Ă©crire vos propres applications async avec [AnyIO](https://anyio.readthedocs.io/en/stable/) pour une grande compatibilitĂ© et pour bĂ©nĂ©ficier de ses avantages (par ex. la « structured concurrency »). +Et mĂȘme si vous n’utilisiez pas FastAPI, vous pourriez aussi Ă©crire vos propres applications async avec [AnyIO](https://anyio.readthedocs.io/en/stable/) pour une grande compatibilitĂ© et pour bĂ©nĂ©ficier de ses avantages (par ex. la *structured concurrency*). J’ai créé une autre bibliothĂšque au-dessus d’AnyIO, comme une fine surcouche, pour amĂ©liorer un peu les annotations de type et obtenir une meilleure **autocomplĂ©tion**, des **erreurs en ligne**, etc. Elle propose Ă©galement une introduction et un tutoriel accessibles pour vous aider Ă  **comprendre** et Ă©crire **votre propre code async** : [Asyncer](https://asyncer.tiangolo.com/). Elle sera particuliĂšrement utile si vous devez **combiner du code async avec du code classique** (bloquant/synchrone). @@ -377,25 +377,25 @@ L'utilisation d'`async` et `await` est relativement nouvelle dans ce langage. Mais cela rend la programmation asynchrone bien plus simple. -Cette mĂȘme syntaxe (ou presque) a aussi Ă©tĂ© incluse rĂ©cemment dans les versions modernes de JavaScript (dans les navigateurs et NodeJS). +Cette mĂȘme syntaxe (ou presque) a aussi Ă©tĂ© incluse rĂ©cemment dans les versions modernes de JavaScript (dans le navigateur et NodeJS). Mais avant ça, gĂ©rer du code asynchrone Ă©tait bien plus complexe et difficile. -Dans les versions prĂ©cĂ©dentes de Python, vous auriez utilisĂ© des threads ou [Gevent](https://www.gevent.org/). Mais le code aurait Ă©tĂ© bien plus difficile Ă  comprendre, dĂ©bugger, et concevoir. +Dans les versions prĂ©cĂ©dentes de Python, vous auriez pu utiliser des threads ou [Gevent](https://www.gevent.org/). Mais le code est bien plus difficile Ă  comprendre, dĂ©bugger, et concevoir. -Dans les versions prĂ©cĂ©dentes de JavaScript cĂŽtĂ© navigateur / NodeJS, vous auriez utilisĂ© des « callbacks ». Menant potentiellement Ă  ce que l'on appelle le « callback hell ». +Dans les versions prĂ©cĂ©dentes de NodeJS / JavaScript de navigateur, vous auriez utilisĂ© des « callbacks ». Ce qui mĂšne au « callback hell ». ## Coroutines { #coroutines } -« Coroutine » est juste un terme Ă©laborĂ© pour dĂ©signer ce qui est retournĂ© par une fonction dĂ©finie avec `async def`. Python sait que c'est comme une fonction classique qui va dĂ©marrer Ă  un moment et terminer Ă  un autre, mais qu'elle peut aussi ĂȘtre mise en pause ⏞, du moment qu'il y a un `await` dans son contenu. +**Coroutine** est juste un terme Ă©laborĂ© pour dĂ©signer ce qui est retournĂ© par une fonction dĂ©finie avec `async def`. Python sait que c'est comme une fonction, qui peut dĂ©marrer et qui se terminera Ă  un moment, mais qu'elle peut aussi ĂȘtre mise en pause ⏞ en interne, quand il y a un `await` Ă  l'intĂ©rieur. Mais toutes ces fonctionnalitĂ©s d'utilisation de code asynchrone avec `async` et `await` sont souvent rĂ©sumĂ©es comme l'utilisation des « coroutines ». On peut comparer cela Ă  la principale fonctionnalitĂ© clĂ© de Go, les « Goroutines ». ## Conclusion { #conclusion } -Reprenons la phrase du dĂ©but de la page : +Reprenons la mĂȘme phrase ci-dessus : -> Les versions modernes de Python supportent le **code asynchrone** grĂące aux **« coroutines »** avec les syntaxes **`async` et `await`**. +> Les versions modernes de Python supportent le **« code asynchrone »** en utilisant quelque chose appelĂ© **« coroutines »**, avec la syntaxe **`async` et `await`**. Ceci devrait ĂȘtre plus comprĂ©hensible dĂ©sormais. ✹ @@ -409,25 +409,25 @@ Vous pouvez probablement ignorer cela. Ce sont des dĂ©tails trĂšs poussĂ©s sur comment **FastAPI** fonctionne en arriĂšre-plan. -Si vous avez de bonnes connaissances techniques (coroutines, threads, code bloquant, etc.) et ĂȘtes curieux de comment **FastAPI** gĂšre `async def` versus le `def` classique, cette partie est faite pour vous. +Si vous avez de bonnes connaissances techniques (coroutines, threads, code bloquant, etc.) et ĂȘtes curieux de comment FastAPI gĂšre `async def` versus le `def` classique, cette partie est faite pour vous. /// ### Fonctions de chemin d'accĂšs { #path-operation-functions } -Quand vous dĂ©clarez une *fonction de chemin d'accĂšs* avec un `def` normal et non `async def`, elle est exĂ©cutĂ©e dans un groupe de threads (threadpool) externe qui est ensuite attendu, plutĂŽt que d'ĂȘtre appelĂ©e directement (car cela bloquerait le serveur). +Quand vous dĂ©clarez une *fonction de chemin d'accĂšs* avec un `def` normal et non `async def`, elle est exĂ©cutĂ©e dans une threadpool externe qui est ensuite attendue, plutĂŽt que d'ĂȘtre appelĂ©e directement (car cela bloquerait le serveur). -Si vous venez d'un autre framework asynchrone qui ne fonctionne pas comme de la façon dĂ©crite ci-dessus et que vous ĂȘtes habituĂ© Ă  dĂ©finir des *fonctions de chemin d'accĂšs* basiques et purement calculatoires avec un simple `def` pour un faible gain de performance (environ 100 nanosecondes), veuillez noter que dans **FastAPI**, l'effet serait plutĂŽt contraire. Dans ces cas-lĂ , il vaut mieux utiliser `async def` Ă  moins que votre *fonction de chemin d'accĂšs* utilise du code qui effectue des opĂ©rations I/O bloquantes. +Si vous venez d'un autre framework async qui ne fonctionne pas de la façon dĂ©crite ci-dessus et que vous ĂȘtes habituĂ© Ă  dĂ©finir des *fonctions de chemin d'accĂšs* triviales faisant uniquement du calcul avec un simple `def` pour un faible gain de performance (environ 100 nanosecondes), veuillez noter que dans **FastAPI**, l'effet serait plutĂŽt contraire. Dans ces cas-lĂ , il vaut mieux utiliser `async def` Ă  moins que vos *fonctions de chemin d'accĂšs* utilisent du code qui effectue des opĂ©rations I/O bloquantes. -Au final, dans les deux situations, il est fort probable que **FastAPI** soit tout de mĂȘme [plus rapide](index.md#performance) que (ou au moins de vitesse Ă©gale Ă ) votre framework prĂ©cĂ©dent. +Au final, dans les deux situations, il est fort probable que **FastAPI** soit [tout de mĂȘme plus rapide](index.md#performance) que (ou au moins comparable Ă ) votre framework prĂ©cĂ©dent. ### DĂ©pendances { #dependencies } -La mĂȘme chose s'applique aux [dĂ©pendances](tutorial/dependencies/index.md). Si une dĂ©pendance est dĂ©finie avec `def` plutĂŽt que `async def`, elle est exĂ©cutĂ©e dans la threadpool externe. +La mĂȘme chose s'applique aux [dĂ©pendances](tutorial/dependencies/index.md). Si une dĂ©pendance est une fonction standard `def` plutĂŽt qu'`async def`, elle est exĂ©cutĂ©e dans la threadpool externe. ### Sous-dĂ©pendances { #sub-dependencies } -Vous pouvez avoir de multiples dĂ©pendances et [sous-dĂ©pendances](tutorial/dependencies/sub-dependencies.md) dĂ©pendant les unes des autres (en tant que paramĂštres de la dĂ©finition de la *fonction de chemin d'accĂšs*), certaines créées avec `async def` et d'autres avec `def`. Cela fonctionnerait aussi, et celles dĂ©finies avec un simple `def` seraient exĂ©cutĂ©es sur un thread externe (venant de la threadpool) plutĂŽt que d'ĂȘtre « attendues ». +Vous pouvez avoir de multiples dĂ©pendances et [sous-dĂ©pendances](tutorial/dependencies/sub-dependencies.md) dĂ©pendant les unes des autres (en tant que paramĂštres des dĂ©finitions des fonctions), certaines créées avec `async def` et d'autres avec un `def` normal. Cela fonctionnerait aussi, et celles dĂ©finies avec un `def` normal seraient appelĂ©es sur un thread externe (venant de la threadpool) plutĂŽt que d'ĂȘtre « attendues ». ### Autres fonctions utilitaires { #other-utility-functions } @@ -435,10 +435,10 @@ Toute autre fonction utilitaire que vous appelez directement peut ĂȘtre créée Contrairement aux fonctions que FastAPI appelle pour vous : les *fonctions de chemin d'accĂšs* et dĂ©pendances. -Si votre fonction utilitaire est une fonction classique dĂ©finie avec `def`, elle sera appelĂ©e directement (telle qu'Ă©crite dans votre code), pas dans une threadpool ; si la fonction est dĂ©finie avec `async def` alors vous devrez attendre (avec `await`) que cette fonction se termine avant de passer Ă  la suite du code. +Si votre fonction utilitaire est une fonction classique dĂ©finie avec `def`, elle sera appelĂ©e directement (telle qu'Ă©crite dans votre code), pas dans une threadpool ; si la fonction est dĂ©finie avec `async def` alors vous devez `await` cette fonction lorsque vous l'appelez dans votre code. --- Encore une fois, ce sont des dĂ©tails trĂšs techniques qui peuvent ĂȘtre utiles si vous venez ici les chercher. -Sinon, les instructions de la section Vous ĂȘtes pressĂ©s ? ci-dessus sont largement suffisantes. +Sinon, les instructions de la section ci-dessus sont largement suffisantes : Vous ĂȘtes pressĂ©s ?. diff --git a/docs/fr/docs/deployment/cloud.md b/docs/fr/docs/deployment/cloud.md index 1ed030f0a..368966372 100644 --- a/docs/fr/docs/deployment/cloud.md +++ b/docs/fr/docs/deployment/cloud.md @@ -1,6 +1,6 @@ # DĂ©ployer FastAPI sur des fournisseurs cloud { #deploy-fastapi-on-cloud-providers } -Vous pouvez utiliser pratiquement n'importe quel fournisseur cloud pour dĂ©ployer votre application FastAPI. +Vous pouvez utiliser pratiquement **n'importe quel fournisseur cloud** pour dĂ©ployer votre application FastAPI. Dans la plupart des cas, les principaux fournisseurs cloud proposent des guides pour dĂ©ployer FastAPI avec leurs services. @@ -16,7 +16,7 @@ FastAPI Cloud est le sponsor principal et le financeur des projets open source * ## Fournisseurs cloud - Sponsors { #cloud-providers-sponsors } -D'autres fournisseurs cloud ✹ [**parrainent FastAPI**](../help-fastapi.md#sponsor-the-author) ✹ Ă©galement. 🙇 +Certains autres fournisseurs cloud ✹ [**parrainent FastAPI**](https://github.com/sponsors/tiangolo) ✹ Ă©galement. 🙇 Vous pouvez Ă©galement envisager ces fournisseurs pour suivre leurs guides et essayer leurs services : diff --git a/docs/fr/docs/deployment/concepts.md b/docs/fr/docs/deployment/concepts.md index 1d5497d93..d6940c683 100644 --- a/docs/fr/docs/deployment/concepts.md +++ b/docs/fr/docs/deployment/concepts.md @@ -1,5 +1,6 @@ # Concepts de dĂ©ploiement { #deployments-concepts } + Lorsque vous dĂ©ployez une application **FastAPI**, ou en fait n'importe quel type de web API, il existe plusieurs concepts qui vous importent probablement, et en les utilisant vous pouvez trouver la maniĂšre la **plus appropriĂ©e** de **dĂ©ployer votre application**. Parmi les concepts importants, on trouve : diff --git a/docs/fr/docs/deployment/docker.md b/docs/fr/docs/deployment/docker.md index 5184d51df..688f3b5d8 100644 --- a/docs/fr/docs/deployment/docker.md +++ b/docs/fr/docs/deployment/docker.md @@ -232,7 +232,7 @@ Passez en revue ce que fait chaque ligne en cliquant sur chaque bulle numĂ©rotĂ© /// warning | Alertes -Vous devez vous assurer d'utiliser **toujours** la **forme exec** de l'instruction `CMD`, comme expliquĂ© ci-dessous. +Vous devez **toujours** utiliser la **forme exec** de l'instruction `CMD`, comme expliquĂ© ci-dessous. /// @@ -254,7 +254,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] CMD fastapi run app/main.py --port 80 ``` -Assurez-vous d'utiliser toujours la forme **exec** pour garantir que FastAPI peut s'arrĂȘter proprement et que les [Ă©vĂ©nements de cycle de vie](../advanced/events.md) sont dĂ©clenchĂ©s. +Vous devez toujours utiliser la forme **exec** pour garantir que FastAPI peut s'arrĂȘter proprement et que les [Ă©vĂ©nements de cycle de vie](../advanced/events.md) sont dĂ©clenchĂ©s. Vous pouvez en lire davantage dans la [documentation Docker sur les formes shell et exec](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form). diff --git a/docs/fr/docs/deployment/https.md b/docs/fr/docs/deployment/https.md index 34922f168..5150ecdeb 100644 --- a/docs/fr/docs/deployment/https.md +++ b/docs/fr/docs/deployment/https.md @@ -10,9 +10,9 @@ Si vous ĂȘtes pressĂ© ou si cela ne vous intĂ©resse pas, continuez avec les sect /// -Pour apprendre les bases du HTTPS, du point de vue d'un utilisateur, consultez [https://howhttps.works/](https://howhttps.works/). +Pour **apprendre les bases du HTTPS**, du point de vue d'un utilisateur, consultez [https://howhttps.works/](https://howhttps.works/). -Maintenant, du point de vue d'un dĂ©veloppeur, voici plusieurs choses Ă  avoir en tĂȘte en pensant au HTTPS : +Maintenant, du **point de vue d'un dĂ©veloppeur**, voici plusieurs choses Ă  avoir en tĂȘte en pensant au HTTPS : * Pour le HTTPS, **le serveur** doit **disposer de « certificats »** gĂ©nĂ©rĂ©s par une **tierce partie**. * Ces certificats sont en rĂ©alitĂ© **acquis** auprĂšs de la tierce partie, et non « gĂ©nĂ©rĂ©s ». @@ -65,7 +65,7 @@ Voici un exemple de ce Ă  quoi pourrait ressembler une API HTTPS, Ă©tape par Ă©t Tout commencerait probablement par le fait que vous **acquĂ©riez** un **nom de domaine**. Ensuite, vous le configureriez dans un serveur DNS (possiblement le mĂȘme que votre fournisseur cloud). -Vous obtiendriez probablement un serveur cloud (une machine virtuelle) ou quelque chose de similaire, et il aurait une adresse IP publique fixe. +Vous obtiendriez probablement un serveur cloud (une machine virtuelle) ou quelque chose de similaire, et il aurait une **adresse IP publique** fixe. Dans le ou les serveurs DNS, vous configureriez un enregistrement (un « `A record` ») pour faire pointer **votre domaine** vers l'**adresse IP publique de votre serveur**. diff --git a/docs/fr/docs/deployment/manually.md b/docs/fr/docs/deployment/manually.md index 90dd31d85..2d9cc4f8f 100644 --- a/docs/fr/docs/deployment/manually.md +++ b/docs/fr/docs/deployment/manually.md @@ -40,7 +40,7 @@ $ fastapi run ASGI. FastAPI est un framework web ASGI. -La principale chose dont vous avez besoin pour exĂ©cuter une application **FastAPI** (ou toute autre application ASGI) sur une machine serveur distante est un programme serveur ASGI comme **Uvicorn**, c'est celui utilisĂ© par dĂ©faut par la commande `fastapi`. +La principale chose dont vous avez besoin pour exĂ©cuter une application **FastAPI** (ou toute autre application ASGI) sur une machine serveur distante est un programme serveur ASGI comme **Uvicorn**, c'est celui fourni par dĂ©faut avec la commande `fastapi`. Il existe plusieurs alternatives, notamment : @@ -61,9 +61,9 @@ Il existe plusieurs alternatives, notamment : Il y a un petit dĂ©tail sur les noms Ă  garder Ă  l'esprit. 💡 -Le mot « serveur » est couramment utilisĂ© pour dĂ©signer Ă  la fois l'ordinateur distant/cloud (la machine physique ou virtuelle) et Ă©galement le programme qui s'exĂ©cute sur cette machine (par exemple, Uvicorn). +Le mot « **serveur** » est couramment utilisĂ© pour dĂ©signer Ă  la fois l'ordinateur distant/cloud (la machine physique ou virtuelle) et Ă©galement le programme qui s'exĂ©cute sur cette machine (par exemple, Uvicorn). -Gardez cela Ă  l'esprit lorsque vous lisez « serveur » en gĂ©nĂ©ral, cela pourrait faire rĂ©fĂ©rence Ă  l'une de ces deux choses. +Gardez simplement Ă  l'esprit que lorsque vous lisez « serveur » en gĂ©nĂ©ral, cela pourrait faire rĂ©fĂ©rence Ă  l'une de ces deux choses. Lorsqu'on se rĂ©fĂšre Ă  la machine distante, il est courant de l'appeler **serveur**, mais aussi **machine**, **VM** (machine virtuelle), **nƓud**. Tout cela fait rĂ©fĂ©rence Ă  un type de machine distante, exĂ©cutant normalement Linux, sur laquelle vous exĂ©cutez des programmes. @@ -117,7 +117,7 @@ $ uvicorn main:app --host 0.0.0.0 --port 80 La commande `uvicorn main:app` fait rĂ©fĂ©rence à : -* `main` : le fichier `main.py` (le « module » Python). +* `main` : le fichier `main.py` (le « module » Python). * `app` : l'objet créé dans `main.py` avec la ligne `app = FastAPI()`. C'est Ă©quivalent à : diff --git a/docs/fr/docs/editor-support.md b/docs/fr/docs/editor-support.md index 59e0b3f15..a29b3b261 100644 --- a/docs/fr/docs/editor-support.md +++ b/docs/fr/docs/editor-support.md @@ -1,6 +1,6 @@ # Prise en charge des Ă©diteurs { #editor-support } -L’extension officielle [Extension FastAPI](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) amĂ©liore votre flux de dĂ©veloppement FastAPI grĂące Ă  la dĂ©couverte des chemins d'accĂšs, Ă  la navigation, ainsi qu’au dĂ©ploiement sur FastAPI Cloud et Ă  la diffusion en direct des journaux. +L’extension officielle [Extension FastAPI](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) amĂ©liore votre flux de dĂ©veloppement FastAPI grĂące Ă  la dĂ©couverte des *chemins d'accĂšs*, Ă  la navigation, ainsi qu’au dĂ©ploiement sur FastAPI Cloud et Ă  la diffusion en direct des journaux. Pour plus de dĂ©tails sur l’extension, reportez-vous au README sur le [rĂ©fĂ©rentiel GitHub](https://github.com/fastapi/fastapi-vscode). diff --git a/docs/fr/docs/environment-variables.md b/docs/fr/docs/environment-variables.md index 7f052f27f..065194700 100644 --- a/docs/fr/docs/environment-variables.md +++ b/docs/fr/docs/environment-variables.md @@ -6,13 +6,13 @@ Si vous savez dĂ©jĂ  ce que sont les « variables d'environnement » et comment /// -Une variable d'environnement (Ă©galement appelĂ©e « env var ») est une variable qui vit en dehors du code Python, dans le systĂšme d'exploitation, et qui peut ĂȘtre lue par votre code Python (ou par d'autres programmes Ă©galement). +Une variable d'environnement (Ă©galement appelĂ©e « **env var** ») est une variable qui vit **en dehors** du code Python, dans le **systĂšme d'exploitation**, et qui peut ĂȘtre lue par votre code Python (ou par d'autres programmes Ă©galement). Les variables d'environnement peuvent ĂȘtre utiles pour gĂ©rer des **paramĂštres** d'application, dans le cadre de l'**installation** de Python, etc. ## CrĂ©er et utiliser des variables d'environnement { #create-and-use-env-vars } -Vous pouvez crĂ©er et utiliser des variables d'environnement dans le **shell (terminal)**, sans avoir besoin de Python : +Vous pouvez **crĂ©er** et utiliser des variables d'environnement dans le **shell (terminal)**, sans avoir besoin de Python : //// tab | Linux, macOS, Windows Bash @@ -54,7 +54,7 @@ Hello Wade Wilson Vous pouvez Ă©galement crĂ©er des variables d'environnement **en dehors** de Python, dans le terminal (ou par tout autre moyen), puis les **lire en Python**. -Par exemple, vous pouvez avoir un fichier `main.py` contenant : +Par exemple, vous pouvez avoir un fichier `main.py` contenant : ```Python hl_lines="3" import os @@ -71,7 +71,7 @@ S'il n'est pas fourni, c'est `None` par dĂ©faut ; ici, nous fournissons `"World" /// -Vous pouvez ensuite exĂ©cuter ce programme Python : +Vous pouvez ensuite exĂ©cuter ce programme Python : //// tab | Linux, macOS, Windows Bash @@ -131,7 +131,7 @@ Comme les variables d'environnement peuvent ĂȘtre dĂ©finies en dehors du code, m Vous pouvez Ă©galement crĂ©er une variable d'environnement uniquement pour l'**invocation d'un programme spĂ©cifique**, qui ne sera disponible que pour ce programme et uniquement pendant sa durĂ©e d'exĂ©cution. -Pour cela, crĂ©ez-la juste avant le programme, sur la mĂȘme ligne : +Pour cela, crĂ©ez-la juste avant le programme, sur la mĂȘme ligne :
@@ -159,7 +159,7 @@ Vous pouvez en lire davantage sur [The Twelve-Factor App : Config](https://12fac ## GĂ©rer les types et la validation { #types-and-validation } -Ces variables d'environnement ne peuvent gĂ©rer que des **chaĂźnes de texte**, car elles sont externes Ă  Python et doivent ĂȘtre compatibles avec les autres programmes et le reste du systĂšme (et mĂȘme avec diffĂ©rents systĂšmes d'exploitation, comme Linux, Windows, macOS). +Ces variables d'environnement ne peuvent gĂ©rer que des **chaĂźnes de texte**, car elles sont externes Ă  Python et doivent ĂȘtre compatibles avec les autres programmes et le reste du systĂšme (et mĂȘme avec diffĂ©rents systĂšmes d'exploitation, comme Linux, Windows et macOS). Cela signifie que **toute valeur** lue en Python Ă  partir d'une variable d'environnement **sera une `str`**, et que toute conversion vers un autre type ou toute validation doit ĂȘtre effectuĂ©e dans le code. @@ -167,11 +167,11 @@ Vous en apprendrez davantage sur l'utilisation des variables d'environnement pou ## Variable d'environnement `PATH` { #path-environment-variable } -Il existe une **variable d'environnement spĂ©ciale** appelĂ©e **`PATH`** qui est utilisĂ©e par les systĂšmes d'exploitation (Linux, macOS, Windows) pour trouver les programmes Ă  exĂ©cuter. +Il existe une variable d'environnement **spĂ©ciale** appelĂ©e **`PATH`** qui est utilisĂ©e par les systĂšmes d'exploitation (Linux, macOS, Windows) pour trouver les programmes Ă  exĂ©cuter. La valeur de la variable `PATH` est une longue chaĂźne composĂ©e de rĂ©pertoires sĂ©parĂ©s par deux-points `:` sous Linux et macOS, et par point-virgule `;` sous Windows. -Par exemple, la variable d'environnement `PATH` peut ressembler Ă  ceci : +Par exemple, la variable d'environnement `PATH` peut ressembler Ă  ceci : //// tab | Linux, macOS @@ -179,7 +179,7 @@ Par exemple, la variable d'environnement `PATH` peut ressembler Ă  ceci : /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin ``` -Cela signifie que le systĂšme doit rechercher les programmes dans les rĂ©pertoires : +Cela signifie que le systĂšme doit rechercher les programmes dans les rĂ©pertoires : * `/usr/local/bin` * `/usr/bin` @@ -195,7 +195,7 @@ Cela signifie que le systĂšme doit rechercher les programmes dans les rĂ©pertoir C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32 ``` -Cela signifie que le systĂšme doit rechercher les programmes dans les rĂ©pertoires : +Cela signifie que le systĂšme doit rechercher les programmes dans les rĂ©pertoires : * `C:\Program Files\Python312\Scripts` * `C:\Program Files\Python312` @@ -219,7 +219,7 @@ Supposons que vous installiez Python et qu'il se retrouve dans un rĂ©pertoire `/ Si vous acceptez de mettre Ă  jour la variable d'environnement `PATH`, l'installateur ajoutera `/opt/custompython/bin` Ă  la variable d'environnement `PATH`. -Cela pourrait ressembler Ă  ceci : +Cela pourrait ressembler Ă  ceci : ```plaintext /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin @@ -243,7 +243,7 @@ Ainsi, lorsque vous tapez `python` dans le terminal, le systĂšme trouvera le pro //// -Ainsi, si vous tapez : +Ainsi, si vous tapez :
@@ -257,7 +257,7 @@ $ python Le systÚme va **trouver** le programme `python` dans `/opt/custompython/bin` et l'exécuter. -Cela reviendrait à peu prÚs à taper : +Cela reviendrait à peu prÚs à taper :
@@ -273,7 +273,7 @@ $ /opt/custompython/bin/python Le systÚme va **trouver** le programme `python` dans `C:\opt\custompython\bin\python` et l'exécuter. -Cela reviendrait à peu prÚs à taper : +Cela reviendrait à peu prÚs à taper :
diff --git a/docs/fr/docs/features.md b/docs/fr/docs/features.md index 0bb16b343..4ded18206 100644 --- a/docs/fr/docs/features.md +++ b/docs/fr/docs/features.md @@ -17,7 +17,7 @@ Documentation d'API interactive et interfaces web d'exploration. Comme le framew * [**Swagger UI**](https://github.com/swagger-api/swagger-ui), avec exploration interactive, appelez et testez votre API directement depuis le navigateur. -![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) +![interaction avec Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * Documentation d'API alternative avec [**ReDoc**](https://github.com/Rebilly/ReDoc). @@ -85,11 +85,11 @@ Voici comment votre Ă©diteur peut vous aider : * dans [Visual Studio Code](https://code.visualstudio.com/) : -![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) +![support de l'Ă©diteur](https://fastapi.tiangolo.com/img/vscode-completion.png) * dans [PyCharm](https://www.jetbrains.com/pycharm/) : -![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) +![support de l'Ă©diteur](https://fastapi.tiangolo.com/img/pycharm-completion.png) Vous obtiendrez de l'autocomplĂ©tion dans du code que vous auriez pu considĂ©rer impossible auparavant. Par exemple, la clĂ© `price` Ă  l'intĂ©rieur d'un corps JSON (qui aurait pu ĂȘtre imbriquĂ©) provenant d'une requĂȘte. @@ -105,7 +105,7 @@ Mais par dĂ©faut, tout **« just works »**. * Validation pour la plupart (ou tous ?) des **types de donnĂ©es** Python, y compris : * objets JSON (`dict`). - * tableaux JSON (`list`) dĂ©finissant les types d'Ă©lĂ©ments. + * tableau JSON (`list`) dĂ©finissant les types d'Ă©lĂ©ments. * champs String (`str`), dĂ©finition des longueurs minimale et maximale. * nombres (`int`, `float`) avec valeurs minimale et maximale, etc. diff --git a/docs/fr/docs/help-fastapi.md b/docs/fr/docs/help-fastapi.md index 7a6da3c08..db46bcbc1 100644 --- a/docs/fr/docs/help-fastapi.md +++ b/docs/fr/docs/help-fastapi.md @@ -1,5 +1,6 @@ # Aider { #help } + Souhaitez-vous aider FastAPI ou obtenir de l'aide Ă  propos de FastAPI ? Il existe des moyens trĂšs simples d'aider et d'obtenir de l'aide. diff --git a/docs/fr/docs/how-to/configure-swagger-ui.md b/docs/fr/docs/how-to/configure-swagger-ui.md index 34db05558..e4f876323 100644 --- a/docs/fr/docs/how-to/configure-swagger-ui.md +++ b/docs/fr/docs/how-to/configure-swagger-ui.md @@ -50,11 +50,11 @@ Par exemple, pour dĂ©sactiver `deepLinking`, vous pourriez passer ces paramĂštre ## Autres paramĂštres de Swagger UI { #other-swagger-ui-parameters } -Pour voir toutes les autres configurations possibles que vous pouvez utiliser, lisez les [documents officiels pour les paramĂštres de Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). +Pour voir toutes les autres configurations possibles que vous pouvez utiliser, lisez les documents officiels [pour les paramĂštres de Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). ## ParamĂštres JavaScript uniquement { #javascript-only-settings } -Swagger UI permet Ă©galement d'autres configurations qui sont des objets rĂ©servĂ©s Ă  JavaScript (par exemple, des fonctions JavaScript). +Swagger UI permet Ă©galement d'autres configurations qui sont des objets **rĂ©servĂ©s Ă  JavaScript** (par exemple, des fonctions JavaScript). FastAPI inclut aussi ces paramĂštres `presets` rĂ©servĂ©s Ă  JavaScript : diff --git a/docs/fr/docs/how-to/custom-request-and-route.md b/docs/fr/docs/how-to/custom-request-and-route.md index 4acb6464f..0b3ab88b9 100644 --- a/docs/fr/docs/how-to/custom-request-and-route.md +++ b/docs/fr/docs/how-to/custom-request-and-route.md @@ -66,7 +66,7 @@ Le `dict` `scope` et la fonction `receive` font tous deux partie de la spĂ©cific Et ces deux Ă©lĂ©ments, `scope` et `receive`, sont ce dont on a besoin pour crĂ©er une nouvelle instance de `Request`. -Pour en savoir plus sur `Request`, consultez [la documentation de Starlette sur les requĂȘtes](https://www.starlette.dev/requests/). +Pour en savoir plus sur `Request`, consultez [les documents de Starlette sur les requĂȘtes](https://www.starlette.dev/requests/). /// diff --git a/docs/fr/docs/how-to/graphql.md b/docs/fr/docs/how-to/graphql.md index 912608a98..10fa6be8a 100644 --- a/docs/fr/docs/how-to/graphql.md +++ b/docs/fr/docs/how-to/graphql.md @@ -19,9 +19,9 @@ Assurez-vous d'Ă©valuer si les **bĂ©nĂ©fices** pour votre cas d'utilisation comp Voici quelques bibliothĂšques **GraphQL** qui prennent en charge **ASGI**. Vous pouvez les utiliser avec **FastAPI** : * [Strawberry](https://strawberry.rocks/) 🍓 - * Avec [la documentation pour FastAPI](https://strawberry.rocks/docs/integrations/fastapi) + * Avec [les documents pour FastAPI](https://strawberry.rocks/docs/integrations/fastapi) * [Ariadne](https://ariadnegraphql.org/) - * Avec [la documentation pour FastAPI](https://ariadnegraphql.org/docs/fastapi-integration) + * Avec [les documents pour FastAPI](https://ariadnegraphql.org/docs/fastapi-integration) * [Tartiflette](https://tartiflette.io/) * Avec [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) pour fournir l'intĂ©gration ASGI * [Graphene](https://graphene-python.org/) @@ -39,7 +39,7 @@ Voici un petit aperçu de la maniĂšre dont vous pouvez intĂ©grer Strawberry avec Vous pouvez en apprendre davantage sur Strawberry dans la [documentation de Strawberry](https://strawberry.rocks/). -Et Ă©galement la documentation sur [Strawberry avec FastAPI](https://strawberry.rocks/docs/integrations/fastapi). +Et Ă©galement les documents sur [Strawberry avec FastAPI](https://strawberry.rocks/docs/integrations/fastapi). ## Ancien `GraphQLApp` de Starlette { #older-graphqlapp-from-starlette } diff --git a/docs/fr/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/fr/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md index 99d68ba81..48d4b3f2e 100644 --- a/docs/fr/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md +++ b/docs/fr/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -8,6 +8,8 @@ FastAPI version 0.119.0 a introduit une prise en charge partielle de Pydantic v1 FastAPI 0.126.0 a supprimĂ© la prise en charge de Pydantic v1, tout en continuant Ă  prendre en charge `pydantic.v1` pendant un certain temps. +FastAPI 0.128.0 a Ă©galement supprimĂ© la prise en charge de `pydantic.v1`, donc les derniĂšres versions de FastAPI nĂ©cessitent Pydantic v2. + /// warning | Alertes L'Ă©quipe Pydantic a arrĂȘtĂ© la prise en charge de Pydantic v1 pour les derniĂšres versions de Python, Ă  partir de **Python 3.14**. @@ -54,6 +56,16 @@ Cela signifie que vous pouvez installer la derniĂšre version de Pydantic v2 et i ### Prise en charge de FastAPI pour Pydantic v1 dans v2 { #fastapi-support-for-pydantic-v1-in-v2 } +/// warning | Alertes + +Cette prise en charge FastAPI des modĂšles `pydantic.v1` a Ă©tĂ© ajoutĂ©e dans **FastAPI 0.119.0** et supprimĂ©e dans **FastAPI 0.128.0**. Elle Ă©tait destinĂ©e Ă  ĂȘtre une aide temporaire pour la migration vers Pydantic v2. + +Dans les versions actuelles de FastAPI, l'utilisation d'un modĂšle `pydantic.v1` dans votre application lĂšvera une erreur. + +Le reste de cette section dĂ©crit la prise en charge temporaire disponible uniquement dans ces anciennes versions. + +/// + Depuis FastAPI 0.119.0, il existe Ă©galement une prise en charge partielle de Pydantic v1 depuis l'intĂ©rieur de Pydantic v2, pour faciliter la migration vers v2. Vous pouvez donc mettre Ă  niveau Pydantic vers la derniĂšre version 2 et modifier les imports pour utiliser le sous-module `pydantic.v1`, et dans de nombreux cas cela fonctionnera tel quel. @@ -122,6 +134,12 @@ Si vous devez utiliser certains des outils spĂ©cifiques Ă  FastAPI pour les para ### Migrer par Ă©tapes { #migrate-in-steps } +/// warning | Alertes + +La migration progressive utilisant Ă  la fois des modĂšles Pydantic v1 et v2 dans la mĂȘme application dĂ©crite ci-dessous ne fonctionne que dans **FastAPI 0.119.0 Ă  0.127.x**. Elle a Ă©tĂ© supprimĂ©e dans **FastAPI 0.128.0**, les derniĂšres versions nĂ©cessitent des modĂšles **Pydantic v2**. + +/// + /// tip | Astuce Essayez d'abord avec `bump-pydantic` ; si vos tests passent et que cela fonctionne, vous avez tout terminĂ© en une seule commande. ✹ diff --git a/docs/fr/docs/how-to/separate-openapi-schemas.md b/docs/fr/docs/how-to/separate-openapi-schemas.md index aef467ed6..4cb92c1df 100644 --- a/docs/fr/docs/how-to/separate-openapi-schemas.md +++ b/docs/fr/docs/how-to/separate-openapi-schemas.md @@ -34,7 +34,7 @@ Mais si vous utilisez le mĂȘme modĂšle en sortie, comme ici : {* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py hl[19] *} -... alors, comme `description` a une valeur par dĂ©faut, si vous ne retournez rien pour ce champ, il aura tout de mĂȘme cette **valeur par dĂ©faut**. +... alors, comme `description` a une valeur par dĂ©faut, si vous **ne retournez rien** pour ce champ, il aura tout de mĂȘme cette **valeur par dĂ©faut**. ### ModĂšle pour les donnĂ©es de rĂ©ponse en sortie { #model-for-output-response-data } @@ -52,8 +52,8 @@ La maniĂšre de dĂ©crire cela dans OpenAPI est de marquer ce champ comme **requis Pour cette raison, le schĂ©ma JSON d'un modĂšle peut ĂȘtre diffĂ©rent selon qu'il est utilisĂ© pour **l'entrĂ©e ou la sortie** : -- pour **l'entrĂ©e**, `description` ne sera **pas requis** -- pour **la sortie**, il sera **requis** (et Ă©ventuellement `None`, ou en termes JSON, `null`) +* pour **l'entrĂ©e**, `description` ne sera **pas requis** +* pour **la sortie**, il sera **requis** (et Ă©ventuellement `None`, ou en termes JSON, `null`) ### ModĂšle de sortie dans les documents { #model-for-output-in-docs } @@ -79,7 +79,7 @@ Avec cette fonctionnalitĂ© de **Pydantic v2**, la documentation de votre API est ## Ne pas sĂ©parer les schĂ©mas { #do-not-separate-schemas } -Il existe des cas oĂč vous pourriez vouloir avoir le **mĂȘme schĂ©ma pour l'entrĂ©e et la sortie**. +Maintenant, il existe des cas oĂč vous pourriez vouloir avoir le **mĂȘme schĂ©ma pour l'entrĂ©e et la sortie**. Le cas d'usage principal est probablement que vous avez dĂ©jĂ  du code client/SDKs gĂ©nĂ©rĂ©s automatiquement et que vous ne souhaitez pas encore mettre Ă  jour tout ce code client/ces SDKs gĂ©nĂ©rĂ©s automatiquement ; vous le ferez sans doute Ă  un moment donnĂ©, mais peut‑ĂȘtre pas tout de suite. @@ -95,7 +95,7 @@ La prise en charge de `separate_input_output_schemas` a Ă©tĂ© ajoutĂ©e dans Fast ### Utiliser le mĂȘme schĂ©ma pour les modĂšles d'entrĂ©e et de sortie dans les documents { #same-schema-for-input-and-output-models-in-docs } -DĂ©sormais, il n'y aura qu'un seul schĂ©ma pour l'entrĂ©e et la sortie du modĂšle, uniquement `Item`, et `description` ne sera pas requis : +DĂ©sormais, il n'y aura qu'un seul schĂ©ma pour l'entrĂ©e et la sortie du modĂšle, uniquement `Item`, et `description` sera **non requis** :
diff --git a/docs/fr/docs/index.md b/docs/fr/docs/index.md index 3cfcdfd29..ccc00236a 100644 --- a/docs/fr/docs/index.md +++ b/docs/fr/docs/index.md @@ -45,7 +45,7 @@ Les principales fonctionnalitĂ©s sont : * **Rapide** : trĂšs hautes performances, au niveau de **NodeJS** et **Go** (grĂące Ă  Starlette et Pydantic). [L'un des frameworks Python les plus rapides](#performance). * **Rapide Ă  coder** : augmente la vitesse de dĂ©veloppement des fonctionnalitĂ©s d'environ 200 % Ă  300 %. * * **Moins de bugs** : rĂ©duit d'environ 40 % les erreurs induites par le dĂ©veloppeur. * -* **Intuitif** : excellente compatibilitĂ© avec les Ă©diteurs. AutocomplĂ©tion partout. Moins de temps passĂ© Ă  dĂ©boguer. +* **Intuitif** : excellente compatibilitĂ© avec les Ă©diteurs. AutocomplĂ©tion partout. Moins de temps passĂ© Ă  dĂ©boguer. * **Facile** : conçu pour ĂȘtre facile Ă  utiliser et Ă  apprendre. Moins de temps passĂ© Ă  lire les documents. * **Concis** : diminue la duplication de code. Plusieurs fonctionnalitĂ©s Ă  partir de chaque dĂ©claration de paramĂštre. Moins de bugs. * **Robuste** : obtenez un code prĂȘt pour la production. Avec une documentation interactive automatique. @@ -192,7 +192,7 @@ $ pip install "fastapi[standard]"
-**Remarque** : Vous devez vous assurer de mettre « fastapi[standard] » entre guillemets pour garantir que cela fonctionne dans tous les terminaux. +**Remarque** : Vous devez vous assurer de mettre `"fastapi[standard]"` entre guillemets pour garantir que cela fonctionne dans tous les terminaux. ## Exemple { #example } @@ -239,7 +239,7 @@ async def read_item(item_id: int, q: str | None = None): **Remarque** : -Si vous ne savez pas, consultez la section « Vous ĂȘtes pressĂ©s ? » Ă  propos de [`async` et `await` dans la documentation](https://fastapi.tiangolo.com/fr/async/#in-a-hurry). +Si vous ne savez pas, consultez la section « Vous ĂȘtes pressĂ©s ? » Ă  propos de [`async` et `await` dans les documents](https://fastapi.tiangolo.com/fr/async/#in-a-hurry).
diff --git a/docs/fr/docs/project-generation.md b/docs/fr/docs/project-generation.md index e0636bfe5..b1f3f6cc4 100644 --- a/docs/fr/docs/project-generation.md +++ b/docs/fr/docs/project-generation.md @@ -1,5 +1,6 @@ # ModĂšle Full Stack FastAPI { #full-stack-fastapi-template } + Les modĂšles, bien qu'ils soient gĂ©nĂ©ralement livrĂ©s avec une configuration spĂ©cifique, sont conçus pour ĂȘtre flexibles et personnalisables. Cela vous permet de les modifier et de les adapter aux exigences de votre projet, ce qui en fait un excellent point de dĂ©part. 🏁 Vous pouvez utiliser ce modĂšle pour dĂ©marrer, car il inclut une grande partie de la configuration initiale, la sĂ©curitĂ©, la base de donnĂ©es et quelques endpoints d'API dĂ©jĂ  prĂȘts pour vous. diff --git a/docs/fr/docs/python-types.md b/docs/fr/docs/python-types.md index 55bc8bdc9..8e9dbc598 100644 --- a/docs/fr/docs/python-types.md +++ b/docs/fr/docs/python-types.md @@ -44,7 +44,7 @@ C'est un programme trĂšs simple. Mais maintenant imaginez que vous l'Ă©criviez de zĂ©ro. -À un certain moment, vous auriez commencĂ© la dĂ©finition de la fonction, vous aviez les paramĂštres prĂȘts ... +À un moment donnĂ©, vous commencez Ă  dĂ©finir la fonction, et vous avez les paramĂštres prĂȘts ... Mais ensuite vous devez appeler « cette mĂ©thode qui convertit la premiĂšre lettre en majuscule ». @@ -279,13 +279,13 @@ Ensuite, vous crĂ©ez une instance de cette classe avec certaines valeurs et elle Et vous obtenez tout le support de l'Ă©diteur avec cet objet rĂ©sultant. -Un exemple tirĂ© de la documentation officielle de Pydantic : +Un exemple tirĂ© des documents officiels de Pydantic : {* ../../docs_src/python_types/tutorial011_py310.py *} /// note | Remarque -Pour en savoir plus Ă  propos de [Pydantic, consultez sa documentation](https://docs.pydantic.dev/). +Pour en savoir plus Ă  propos de [Pydantic, consultez ses documents](https://docs.pydantic.dev/). /// @@ -305,7 +305,7 @@ Python lui-mĂȘme ne fait rien avec ce `Annotated`. Et pour les Ă©diteurs et autr Mais vous pouvez utiliser cet espace dans `Annotated` pour fournir Ă  **FastAPI** des mĂ©tadonnĂ©es supplĂ©mentaires sur la façon dont vous voulez que votre application se comporte. -L'important Ă  retenir est que **le premier « paramĂštre de type »** que vous passez Ă  `Annotated` est le **type rĂ©el**. Le reste n'est que des mĂ©tadonnĂ©es pour d'autres outils. +L'important Ă  retenir est que **le premier *paramĂštre de type*** que vous passez Ă  `Annotated` est le **type rĂ©el**. Le reste n'est que des mĂ©tadonnĂ©es pour d'autres outils. Pour l'instant, vous avez juste besoin de savoir que `Annotated` existe, et que c'est du Python standard. 😎 diff --git a/docs/fr/docs/tutorial/bigger-applications.md b/docs/fr/docs/tutorial/bigger-applications.md index 0e331e139..92976bca0 100644 --- a/docs/fr/docs/tutorial/bigger-applications.md +++ b/docs/fr/docs/tutorial/bigger-applications.md @@ -17,16 +17,16 @@ Supposons que vous ayez une structure de fichiers comme ceci : ``` . ├── app -│   ├── __init__.py -│   ├── main.py -│   ├── dependencies.py -│   └── routers -│   │ ├── __init__.py -│   │ ├── items.py -│   │ └── users.py -│   └── internal -│   ├── __init__.py -│   └── admin.py +│ ├── __init__.py +│ ├── main.py +│ ├── dependencies.py +│ └── routers +│ │ ├── __init__.py +│ │ ├── items.py +│ │ └── users.py +│ └── internal +│ ├── __init__.py +│ └── admin.py ``` /// tip | Astuce @@ -283,7 +283,7 @@ Mais nous pouvons toujours ajouter _davantage_ de `tags` qui seront appliquĂ©s /// tip | Astuce -Ce dernier *chemin d'accĂšs* aura la combinaison de tags : `["items", "custom"]`. +Ce dernier chemin d'accĂšs aura la combinaison de tags : `["items", "custom"]`. Et il aura Ă©galement les deux rĂ©ponses dans la documentation, une pour `404` et une pour `403`. @@ -453,7 +453,7 @@ et cela fonctionnera correctement, avec tous les autres *chemins d'accĂšs* ajout /// note | DĂ©tails trĂšs techniques -Note : c'est un dĂ©tail trĂšs technique que vous pouvez probablement **simplement ignorer**. +**Remarque** : c'est un dĂ©tail trĂšs technique que vous pouvez probablement **simplement ignorer**. --- @@ -490,13 +490,13 @@ Vous pourriez aussi passer le chemin Ă  la commande, comme : $ fastapi dev app/main.py ``` -Mais vous devriez vous rappeler de passer le bon chemin Ă  chaque fois que vous appelez la commande `fastapi`. +Mais vous devez vous rappeler de passer le bon chemin Ă  chaque fois que vous appelez la commande `fastapi`. En outre, d'autres outils pourraient ne pas ĂȘtre en mesure de la trouver, par exemple l'[Extension VS Code](../editor-support.md) ou [FastAPI Cloud](https://fastapicloud.com), il est donc recommandĂ© d'utiliser l'`entrypoint` dans `pyproject.toml`. /// -## Consulter la documentation API automatique { #check-the-automatic-api-docs } +## Consulter les documents d'API automatiques { #check-the-automatic-api-docs } Maintenant, exĂ©cutez votre application : @@ -512,7 +512,7 @@ $ fastapi dev Et ouvrez les documents Ă  [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Vous verrez la documentation API automatique, incluant les chemins de tous les sous-modules, utilisant les bons chemins (et prĂ©fixes) et les bons tags : +Vous verrez les documents d'API automatiques, incluant les chemins de tous les sous-modules, utilisant les bons chemins (et prĂ©fixes) et les bons tags : diff --git a/docs/fr/docs/tutorial/body-nested-models.md b/docs/fr/docs/tutorial/body-nested-models.md index 014551bc7..051317a8c 100644 --- a/docs/fr/docs/tutorial/body-nested-models.md +++ b/docs/fr/docs/tutorial/body-nested-models.md @@ -1,6 +1,6 @@ # Corps - ModĂšles imbriquĂ©s { #body-nested-models } -Avec FastAPI, vous pouvez dĂ©finir, valider, documenter et utiliser des modĂšles imbriquĂ©s Ă  n'importe quelle profondeur (grĂące Ă  Pydantic). +Avec **FastAPI**, vous pouvez dĂ©finir, valider, documenter et utiliser des modĂšles imbriquĂ©s Ă  n'importe quelle profondeur (grĂące Ă  Pydantic). ## DĂ©clarer des champs de liste { #list-fields } @@ -69,7 +69,7 @@ Nous pouvons ensuite l'utiliser comme type d'un attribut : {* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *} -Cela signifie que FastAPI attendrait un corps similaire Ă  : +Cela signifie que **FastAPI** attendrait un corps similaire Ă  : ```JSON { @@ -85,7 +85,7 @@ Cela signifie que FastAPI attendrait un corps similaire Ă  : } ``` -LĂ  encore, avec cette simple dĂ©claration, avec FastAPI vous obtenez : +LĂ  encore, avec cette simple dĂ©claration, avec **FastAPI** vous obtenez : - Prise en charge par l'Ă©diteur (autocomplĂ©tion, etc.), mĂȘme pour les modĂšles imbriquĂ©s - Conversion des donnĂ©es @@ -209,7 +209,7 @@ Et le `dict` que vous recevez dans `weights` aura en rĂ©alitĂ© des clĂ©s `int` e ## RĂ©capitulatif { #recap } -Avec FastAPI, vous bĂ©nĂ©ficiez de la flexibilitĂ© maximale fournie par les modĂšles Pydantic, tout en gardant votre code simple, concis et Ă©lĂ©gant. +Avec **FastAPI**, vous bĂ©nĂ©ficiez de la flexibilitĂ© maximale fournie par les modĂšles Pydantic, tout en gardant votre code simple, concis et Ă©lĂ©gant. Mais avec tous les avantages : diff --git a/docs/fr/docs/tutorial/body.md b/docs/fr/docs/tutorial/body.md index 55d184259..2ff716125 100644 --- a/docs/fr/docs/tutorial/body.md +++ b/docs/fr/docs/tutorial/body.md @@ -1,18 +1,18 @@ # Corps de la requĂȘte { #request-body } -Quand vous avez besoin d'envoyer de la donnĂ©e depuis un client (comme un navigateur) vers votre API, vous l'envoyez en tant que **corps de requĂȘte**. +Quand vous avez besoin d'envoyer de la donnĂ©e depuis un client (comme un navigateur) vers votre API, vous l'envoyez en tant que **corps de la requĂȘte**. Le corps d'une **requĂȘte** est de la donnĂ©e envoyĂ©e par le client Ă  votre API. Le corps d'une **rĂ©ponse** est la donnĂ©e envoyĂ©e par votre API au client. -Votre API aura presque toujours Ă  envoyer un corps de **rĂ©ponse**. Mais un client n'a pas toujours Ă  envoyer un **corps de requĂȘte** : parfois il demande seulement un chemin, peut-ĂȘtre avec quelques paramĂštres de requĂȘte, mais n'envoie pas de corps. +Votre API aura presque toujours Ă  envoyer un corps de **rĂ©ponse**. Mais un client n'a pas toujours Ă  envoyer un **corps de la requĂȘte** : parfois il demande seulement un chemin, peut-ĂȘtre avec quelques paramĂštres de requĂȘte, mais n'envoie pas de corps. Pour dĂ©clarer un corps de **requĂȘte**, on utilise les modĂšles de [Pydantic](https://docs.pydantic.dev/) en profitant de tous leurs avantages et fonctionnalitĂ©s. /// note | Remarque -Pour envoyer de la donnĂ©e, vous devez utiliser : `POST` (le plus populaire), `PUT`, `DELETE` ou `PATCH`. +Pour envoyer de la donnĂ©e, vous devez utiliser l'une de ces mĂ©thodes : `POST` (le plus populaire), `PUT`, `DELETE` ou `PATCH`. -Envoyer un corps dans une requĂȘte `GET` a un comportement non dĂ©fini dans les spĂ©cifications, cela est nĂ©anmoins supportĂ© par **FastAPI**, seulement pour des cas d'utilisation trĂšs complexes/extrĂȘmes. +Envoyer un corps dans une requĂȘte `GET` a un comportement non dĂ©fini dans les spĂ©cifications, cela est nĂ©anmoins supportĂ© par FastAPI, seulement pour des cas d'utilisation trĂšs complexes/extrĂȘmes. Ceci Ă©tant dĂ©couragĂ©, la documentation interactive gĂ©nĂ©rĂ©e par Swagger UI ne montrera pas de documentation pour le corps d'une requĂȘte `GET`, et les proxys intermĂ©diaires risquent de ne pas le supporter. @@ -32,6 +32,7 @@ Utilisez les types Python standard pour tous les attributs : {* ../../docs_src/body/tutorial001_py310.py hl[5:9] *} + Tout comme pour la dĂ©claration de paramĂštres de requĂȘte, quand un attribut de modĂšle a une valeur par dĂ©faut, il n'est pas nĂ©cessaire. Sinon, il est requis. Utilisez `None` pour le rendre simplement optionnel. Par exemple, le modĂšle ci-dessus dĂ©clare un JSON « `object` » (ou `dict` Python) tel que : @@ -73,7 +74,7 @@ En utilisant uniquement les dĂ©clarations de type Python, **FastAPI** rĂ©ussit * Passer la donnĂ©e reçue dans le paramĂštre `item`. * Ce paramĂštre ayant Ă©tĂ© dĂ©clarĂ© dans la fonction comme Ă©tant de type `Item`, vous aurez aussi tout le support offert par l'Ă©diteur (autocomplĂ©tion, etc.) pour tous les attributs de ce paramĂštre et les types de ces attributs. * GĂ©nĂ©rer des dĂ©finitions [JSON Schema](https://json-schema.org) pour votre modĂšle ; vous pouvez Ă©galement les utiliser partout ailleurs si cela a du sens pour votre projet. -* Ces schĂ©mas participeront Ă  la constitution du schĂ©ma gĂ©nĂ©rĂ© OpenAPI, et seront utilisĂ©s par les documentations automatiques UIs. +* Ces schĂ©mas feront partie du schĂ©ma OpenAPI gĂ©nĂ©rĂ©, et seront utilisĂ©s par les UIs de la documentation automatique. ## Documentation automatique { #automatic-docs } @@ -97,11 +98,11 @@ Et vous obtenez aussi des vĂ©rifications d'erreurs pour les opĂ©rations de types Ce n'est pas un hasard, ce framework entier a Ă©tĂ© bĂąti avec ce design comme objectif. -Et cela a Ă©tĂ© rigoureusement testĂ© durant la phase de design, avant toute implĂ©mentation, pour vous assurer que cela fonctionnerait avec tous les Ă©diteurs. +Et cela a Ă©tĂ© rigoureusement testĂ© durant la phase de design, avant toute implĂ©mentation, pour s'assurer que cela fonctionnerait avec tous les Ă©diteurs. Des changements sur Pydantic ont mĂȘme Ă©tĂ© faits pour supporter cela. -Les captures d'Ă©cran prĂ©cĂ©dentes ont Ă©tĂ© prises sur [Visual Studio Code](https://code.visualstudio.com). +Les captures d'Ă©cran prĂ©cĂ©dentes ont Ă©tĂ© prises avec [Visual Studio Code](https://code.visualstudio.com). Mais vous auriez le mĂȘme support de l'Ă©diteur avec [PyCharm](https://www.jetbrains.com/pycharm/) et la majoritĂ© des autres Ă©diteurs de code Python : @@ -129,15 +130,16 @@ Dans la fonction, vous pouvez accĂ©der Ă  tous les attributs de l'objet du modĂš ## Corps de la requĂȘte + paramĂštres de chemin { #request-body-path-parameters } -Vous pouvez dĂ©clarer des paramĂštres de chemin et un corps de requĂȘte pour la mĂȘme *chemin d'accĂšs*. +Vous pouvez dĂ©clarer des paramĂštres de chemin et le corps de la requĂȘte en mĂȘme temps. -**FastAPI** est capable de reconnaĂźtre que les paramĂštres de la fonction qui correspondent aux paramĂštres de chemin doivent ĂȘtre **rĂ©cupĂ©rĂ©s depuis le chemin**, et que les paramĂštres de fonctions dĂ©clarĂ©s comme modĂšles Pydantic devraient ĂȘtre **rĂ©cupĂ©rĂ©s depuis le corps de la requĂȘte**. +**FastAPI** est capable de reconnaĂźtre que les paramĂštres de la fonction qui correspondent aux paramĂštres de chemin doivent ĂȘtre **rĂ©cupĂ©rĂ©s depuis le chemin**, et que les paramĂštres de la fonction dĂ©clarĂ©s comme modĂšles Pydantic devraient ĂȘtre **rĂ©cupĂ©rĂ©s depuis le corps de la requĂȘte**. {* ../../docs_src/body/tutorial003_py310.py hl[15:16] *} + ## Corps de la requĂȘte + paramĂštres de chemin et de requĂȘte { #request-body-path-query-parameters } -Vous pouvez aussi dĂ©clarer un **corps**, et des paramĂštres de **chemin** et de **requĂȘte** dans la mĂȘme *chemin d'accĂšs*. +Vous pouvez aussi dĂ©clarer un **corps**, et des paramĂštres de **chemin** et de **requĂȘte**, tous en mĂȘme temps. **FastAPI** saura reconnaĂźtre chacun d'entre eux et rĂ©cupĂ©rer la bonne donnĂ©e au bon endroit. @@ -151,9 +153,9 @@ Les paramĂštres de la fonction seront reconnus comme tel : /// note | Remarque -**FastAPI** saura que la valeur de `q` n'est pas requise grĂące Ă  la valeur par dĂ©faut `= None`. +FastAPI saura que la valeur de `q` n'est pas requise grĂące Ă  la valeur par dĂ©faut `= None`. -L'annotation de type `str | None` n'est pas utilisĂ©e par **FastAPI** pour dĂ©terminer que la valeur n'est pas requise, il le saura parce qu'elle a une valeur par dĂ©faut `= None`. +L'annotation de type `str | None` n'est pas utilisĂ©e par FastAPI pour dĂ©terminer que la valeur n'est pas requise, il le saura parce qu'elle a une valeur par dĂ©faut `= None`. Mais ajouter ces annotations de type permettra Ă  votre Ă©diteur de vous offrir un meilleur support et de dĂ©tecter des erreurs. diff --git a/docs/fr/docs/tutorial/debugging.md b/docs/fr/docs/tutorial/debugging.md index 1a3e9c509..cdcfe702e 100644 --- a/docs/fr/docs/tutorial/debugging.md +++ b/docs/fr/docs/tutorial/debugging.md @@ -74,7 +74,7 @@ ne sera pas exĂ©cutĂ©e. /// note | Remarque -Pour plus d'informations, consultez [la documentation officielle de Python](https://docs.python.org/3/library/__main__.html). +Pour plus d'informations, consultez [les documents officiels de Python](https://docs.python.org/3/library/__main__.html). /// @@ -86,10 +86,10 @@ Parce que vous exĂ©cutez le serveur Uvicorn directement depuis votre code, vous Par exemple, dans Visual Studio Code, vous pouvez : -- Allez dans le panneau « Debug ». -- « Add configuration ... ». -- SĂ©lectionnez « Python ». -- Lancez le dĂ©bogueur avec l'option « Python: Current File (Integrated Terminal) ». +* Allez dans le panneau « Debug ». +* « Add configuration... ». +* SĂ©lectionnez « Python ». +* Lancez le dĂ©bogueur avec l'option « `Python: Current File (Integrated Terminal)` ». Il dĂ©marrera alors le serveur avec votre code **FastAPI**, s'arrĂȘtera Ă  vos points d'arrĂȘt, etc. @@ -99,12 +99,12 @@ Voici Ă  quoi cela pourrait ressembler : --- -Si vous utilisez Pycharm, vous pouvez : +Si vous utilisez PyCharm, vous pouvez : -- Ouvrez le menu « Run ». -- SĂ©lectionnez l'option « Debug ... ». -- Un menu contextuel s'affiche alors. -- SĂ©lectionnez le fichier Ă  dĂ©boguer (dans ce cas, `main.py`). +* Ouvrez le menu « Run ». +* SĂ©lectionnez l'option « Debug... ». +* Un menu contextuel s'affiche alors. +* SĂ©lectionnez le fichier Ă  dĂ©boguer (dans ce cas, `main.py`). Il dĂ©marrera alors le serveur avec votre code **FastAPI**, s'arrĂȘtera Ă  vos points d'arrĂȘt, etc. diff --git a/docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md index 8da931d11..23114c0cb 100644 --- a/docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md @@ -1,6 +1,6 @@ # Utiliser des dĂ©pendances avec `yield` { #dependencies-with-yield } -FastAPI prend en charge des dĂ©pendances qui effectuent des Ă©tapes supplĂ©mentaires aprĂšs l'exĂ©cution. +FastAPI prend en charge des dĂ©pendances qui effectuent des Ă©tapes supplĂ©mentaires aprĂšs l'exĂ©cution. Pour cela, utilisez `yield` au lieu de `return`, et Ă©crivez les Ă©tapes supplĂ©mentaires (code) aprĂšs. @@ -194,16 +194,16 @@ Mais si vous savez que vous n'aurez pas besoin d'utiliser la dĂ©pendance aprĂšs `Depends()` reçoit un paramĂštre `scope` qui peut ĂȘtre : -* « function » : dĂ©marrer la dĂ©pendance avant la *fonction de chemin d'accĂšs* qui gĂšre la requĂȘte, terminer la dĂ©pendance aprĂšs la fin de la *fonction de chemin d'accĂšs*, mais **avant** que la rĂ©ponse ne soit renvoyĂ©e au client. Ainsi, la fonction de dĂ©pendance sera exĂ©cutĂ©e **autour** de la *fonction de chemin d'accĂšs*. -* « request » : dĂ©marrer la dĂ©pendance avant la *fonction de chemin d'accĂšs* qui gĂšre la requĂȘte (similaire Ă  l'utilisation de « function »), mais terminer **aprĂšs** que la rĂ©ponse a Ă©tĂ© renvoyĂ©e au client. Ainsi, la fonction de dĂ©pendance sera exĂ©cutĂ©e **autour** du cycle **requĂȘte** et rĂ©ponse. +* `"function"` : dĂ©marrer la dĂ©pendance avant la *fonction de chemin d'accĂšs* qui gĂšre la requĂȘte, terminer la dĂ©pendance aprĂšs la fin de la *fonction de chemin d'accĂšs*, mais **avant** que la rĂ©ponse ne soit renvoyĂ©e au client. Ainsi, la fonction de dĂ©pendance sera exĂ©cutĂ©e **autour** de la *fonction de chemin d'accĂšs*. +* `"request"` : dĂ©marrer la dĂ©pendance avant la *fonction de chemin d'accĂšs* qui gĂšre la requĂȘte (similaire Ă  l'utilisation de `"function"`), mais terminer **aprĂšs** que la rĂ©ponse a Ă©tĂ© renvoyĂ©e au client. Ainsi, la fonction de dĂ©pendance sera exĂ©cutĂ©e **autour** du cycle **requĂȘte** et rĂ©ponse. -S'il n'est pas spĂ©cifiĂ© et que la dĂ©pendance utilise `yield`, le `scope` sera par dĂ©faut « request ». +S'il n'est pas spĂ©cifiĂ© et que la dĂ©pendance utilise `yield`, le `scope` sera par dĂ©faut `"request"`. ### DĂ©finir `scope` pour les sous-dĂ©pendances { #scope-for-sub-dependencies } -Lorsque vous dĂ©clarez une dĂ©pendance avec un `scope="request"` (par dĂ©faut), toute sous-dĂ©pendance doit Ă©galement avoir un `scope` de « request ». +Lorsque vous dĂ©clarez une dĂ©pendance avec un `scope="request"` (par dĂ©faut), toute sous-dĂ©pendance doit Ă©galement avoir un `scope` de `"request"`. -Mais une dĂ©pendance avec un `scope` de « function » peut avoir des dĂ©pendances avec un `scope` de « function » et un `scope` de « request ». +Mais une dĂ©pendance avec un `scope` de `"function"` peut avoir des dĂ©pendances avec un `scope` de `"function"` et un `scope` de `"request"`. Cela vient du fait que toute dĂ©pendance doit pouvoir exĂ©cuter son code de sortie avant ses sous-dĂ©pendances, car elle pourrait encore avoir besoin de les utiliser pendant son code de sortie. @@ -234,6 +234,7 @@ participant operation as Path Operation Les dĂ©pendances avec `yield` ont Ă©voluĂ© au fil du temps pour couvrir diffĂ©rents cas d'utilisation et corriger certains problĂšmes. Si vous souhaitez voir ce qui a changĂ© dans diffĂ©rentes versions de FastAPI, vous pouvez en savoir plus dans le guide avancĂ©, dans [DĂ©pendances avancĂ©es - DĂ©pendances avec `yield`, `HTTPException`, `except` et Background Tasks](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks). + ## Gestionnaires de contexte { #context-managers } ### Que sont les « Context Managers » { #what-are-context-managers } diff --git a/docs/fr/docs/tutorial/extra-data-types.md b/docs/fr/docs/tutorial/extra-data-types.md index 7ee6816c8..c0c4df137 100644 --- a/docs/fr/docs/tutorial/extra-data-types.md +++ b/docs/fr/docs/tutorial/extra-data-types.md @@ -36,7 +36,7 @@ Voici quelques types de donnĂ©es supplĂ©mentaires que vous pouvez utiliser : * `datetime.timedelta` : * Un `datetime.timedelta` Python. * Dans les requĂȘtes et les rĂ©ponses, il sera reprĂ©sentĂ© sous forme de `float` de secondes totales. - * Pydantic permet aussi de le reprĂ©senter sous la forme d'un « encodage de diffĂ©rence de temps ISO 8601 », [voir la documentation pour plus d'informations](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). + * Pydantic permet aussi de le reprĂ©senter sous la forme d'un « encodage de diffĂ©rence de temps ISO 8601 », [voir les documents pour plus d'informations](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). * `frozenset` : * Dans les requĂȘtes et les rĂ©ponses, traitĂ© de la mĂȘme maniĂšre qu'un `set` : * Dans les requĂȘtes, une liste sera lue, les doublons Ă©liminĂ©s, puis convertie en `set`. diff --git a/docs/fr/docs/tutorial/extra-models.md b/docs/fr/docs/tutorial/extra-models.md index 24a3fa31b..7d542955b 100644 --- a/docs/fr/docs/tutorial/extra-models.md +++ b/docs/fr/docs/tutorial/extra-models.md @@ -4,9 +4,9 @@ En poursuivant l'exemple prĂ©cĂ©dent, il est courant d'avoir plusieurs modĂšles C'est particuliĂšrement vrai pour les modĂšles d'utilisateur, car : -* Le modĂšle d'entrĂ©e doit pouvoir contenir un mot de passe. -* Le modĂšle de sortie ne doit pas avoir de mot de passe. -* Le modĂšle de base de donnĂ©es devra probablement avoir un mot de passe hachĂ©. +* Le **modĂšle d'entrĂ©e** doit pouvoir contenir un mot de passe. +* Le **modĂšle de sortie** ne doit pas avoir de mot de passe. +* Le **modĂšle de base de donnĂ©es** aurait probablement besoin d'avoir un mot de passe hachĂ©. /// danger | Danger @@ -30,13 +30,13 @@ Voici une idĂ©e gĂ©nĂ©rale de l'apparence des modĂšles avec leurs champs de mot Les modĂšles Pydantic ont une mĂ©thode `.model_dump()` qui renvoie un `dict` avec les donnĂ©es du modĂšle. -Ainsi, si nous crĂ©ons un objet Pydantic `user_in` comme : +Ainsi, si nous crĂ©ons un objet Pydantic `user_in` comme : ```Python user_in = UserIn(username="john", password="secret", email="john.doe@example.com") ``` -et que nous appelons ensuite : +et que nous appelons ensuite : ```Python user_dict = user_in.model_dump() @@ -44,13 +44,13 @@ user_dict = user_in.model_dump() nous avons maintenant un `dict` avec les donnĂ©es dans la variable `user_dict` (c'est un `dict` au lieu d'un objet modĂšle Pydantic). -Et si nous appelons : +Et si nous appelons : ```Python print(user_dict) ``` -nous obtiendrions un `dict` Python contenant : +nous obtiendrions un `dict` Python contenant : ```Python { @@ -63,15 +63,15 @@ nous obtiendrions un `dict` Python contenant : #### DĂ©baller un `dict` { #unpacking-a-dict } -Si nous prenons un `dict` comme `user_dict` et que nous le passons Ă  une fonction (ou une classe) avec `**user_dict`, Python va « dĂ©baller » ce `dict`. Il passera les clĂ©s et valeurs de `user_dict` directement comme arguments nommĂ©s. +Si nous prenons un `dict` comme `user_dict` et que nous le passons Ă  une fonction (ou une classe) avec `**user_dict`, Python va « dĂ©baller » ce `dict`. Il passera les clĂ©s et valeurs de `user_dict` directement comme arguments clĂ©-valeur. -Ainsi, en reprenant `user_dict` ci-dessus, Ă©crire : +Ainsi, en reprenant `user_dict` ci-dessus, Ă©crire : ```Python UserInDB(**user_dict) ``` -aurait pour rĂ©sultat quelque chose d'Ă©quivalent à : +aurait pour rĂ©sultat quelque chose d'Ă©quivalent Ă  : ```Python UserInDB( @@ -82,7 +82,7 @@ UserInDB( ) ``` -Ou plus exactement, en utilisant `user_dict` directement, quels que soient ses contenus futurs : +Ou plus exactement, en utilisant `user_dict` directement, quels que soient ses contenus futurs : ```Python UserInDB( @@ -95,14 +95,14 @@ UserInDB( #### CrĂ©er un modĂšle Pydantic Ă  partir du contenu d'un autre { #a-pydantic-model-from-the-contents-of-another } -Comme dans l'exemple ci-dessus nous avons obtenu `user_dict` depuis `user_in.model_dump()`, ce code : +Comme dans l'exemple ci-dessus nous avons obtenu `user_dict` depuis `user_in.model_dump()`, ce code : ```Python user_dict = user_in.model_dump() UserInDB(**user_dict) ``` -serait Ă©quivalent à : +serait Ă©quivalent Ă  : ```Python UserInDB(**user_in.model_dump()) @@ -114,13 +114,13 @@ Ainsi, nous obtenons un modĂšle Pydantic Ă  partir des donnĂ©es d'un autre modĂš #### DĂ©baller un `dict` et ajouter des mots-clĂ©s supplĂ©mentaires { #unpacking-a-dict-and-extra-keywords } -Et en ajoutant ensuite l'argument nommĂ© supplĂ©mentaire `hashed_password=hashed_password`, comme ici : +Et en ajoutant ensuite l'argument nommĂ© supplĂ©mentaire `hashed_password=hashed_password`, comme ici : ```Python UserInDB(**user_in.model_dump(), hashed_password=hashed_password) ``` -... revient à : +... revient Ă  : ```Python UserInDB( @@ -152,7 +152,7 @@ Nous pouvons dĂ©clarer un modĂšle `UserBase` qui sert de base Ă  nos autres mod Toutes les conversions de donnĂ©es, validations, documentation, etc., fonctionneront comme d'habitude. -De cette façon, nous pouvons ne dĂ©clarer que les diffĂ©rences entre les modĂšles (avec `password` en clair, avec `hashed_password` et sans mot de passe) : +De cette façon, nous pouvons ne dĂ©clarer que les diffĂ©rences entre les modĂšles (avec `password` en clair, avec `hashed_password` et sans mot de passe) : {* ../../docs_src/extra_models/tutorial002_py310.py hl[7,13:14,17:18,21:22] *} @@ -162,7 +162,7 @@ Vous pouvez dĂ©clarer qu'une rĂ©ponse est l'`Union` de deux types ou plus, ce qu Cela sera dĂ©fini dans OpenAPI avec `anyOf`. -Pour ce faire, utilisez l'annotation de type Python standard [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union) : +Pour ce faire, utilisez l'annotation de type Python standard [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union) : /// note | Remarque @@ -176,21 +176,21 @@ Lors de la dĂ©finition d'une [`Union`](https://docs.pydantic.dev/latest/concepts Dans cet exemple, nous passons `Union[PlaneItem, CarItem]` comme valeur de l'argument `response_model`. -Comme nous le passons comme valeur d'un argument au lieu de l'utiliser dans une annotation de type, nous devons utiliser `Union` mĂȘme en Python 3.10. +Comme nous le passons comme **valeur Ă  un argument** au lieu de l'utiliser dans une **annotation de type**, nous devons utiliser `Union` mĂȘme en Python 3.10. -S'il s'agissait d'une annotation de type, nous pourrions utiliser la barre verticale, comme : +S'il s'agissait d'une annotation de type, nous pourrions utiliser la barre verticale, comme : ```Python some_variable: PlaneItem | CarItem ``` -Mais si nous Ă©crivons cela dans l'affectation `response_model=PlaneItem | CarItem`, nous obtiendrons une erreur, car Python essaierait d'effectuer une « opĂ©ration invalide » entre `PlaneItem` et `CarItem` au lieu de l'interprĂ©ter comme une annotation de type. +Mais si nous Ă©crivons cela dans l'affectation `response_model=PlaneItem | CarItem`, nous obtiendrons une erreur, car Python essaierait d'effectuer une **opĂ©ration invalide** entre `PlaneItem` et `CarItem` au lieu de l'interprĂ©ter comme une annotation de type. ## Liste de modĂšles { #list-of-models } De la mĂȘme maniĂšre, vous pouvez dĂ©clarer des rĂ©ponses contenant des listes d'objets. -Pour cela, utilisez le `list` Python standard : +Pour cela, utilisez le `list` Python standard : {* ../../docs_src/extra_models/tutorial004_py310.py hl[18] *} @@ -200,7 +200,7 @@ Vous pouvez Ă©galement dĂ©clarer une rĂ©ponse en utilisant un simple `dict` arbi C'est utile si vous ne connaissez pas Ă  l'avance les noms de champs/attributs valides (qui seraient nĂ©cessaires pour un modĂšle Pydantic). -Dans ce cas, vous pouvez utiliser `dict` : +Dans ce cas, vous pouvez utiliser `dict` : {* ../../docs_src/extra_models/tutorial005_py310.py hl[6] *} @@ -208,4 +208,4 @@ Dans ce cas, vous pouvez utiliser `dict` : Utilisez plusieurs modĂšles Pydantic et hĂ©ritez librement selon chaque cas. -Vous n'avez pas besoin d'avoir un seul modĂšle de donnĂ©es par entitĂ© si cette entitĂ© doit pouvoir avoir diffĂ©rents « Ă©tats ». Comme pour l'« entitĂ© » utilisateur, avec un Ă©tat incluant `password`, `password_hash` et sans mot de passe. +Vous n'avez pas besoin d'avoir un seul modĂšle de donnĂ©es par entitĂ© si cette entitĂ© doit pouvoir avoir diffĂ©rents « Ă©tats ». L'« entitĂ© » **utilisateur** est un exemple, avec des Ă©tats qui incluent `password`, `password_hash`, ou aucun mot de passe. diff --git a/docs/fr/docs/tutorial/first-steps.md b/docs/fr/docs/tutorial/first-steps.md index 3d88fe5a9..9e31e2b55 100644 --- a/docs/fr/docs/tutorial/first-steps.md +++ b/docs/fr/docs/tutorial/first-steps.md @@ -145,20 +145,20 @@ Vous pourriez Ă©galement l’utiliser pour gĂ©nĂ©rer du code automatiquement, po ### Configurer le `entrypoint` de l’application dans `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml } -Vous pouvez configurer l’emplacement de votre application dans un fichier `pyproject.toml` comme : +Vous pouvez configurer l’emplacement de votre application dans un fichier `pyproject.toml` comme : ```toml [tool.fastapi] entrypoint = "main:app" ``` -Ce `entrypoint` indiquera Ă  la commande `fastapi` qu’elle doit importer l’application comme : +Ce `entrypoint` indiquera Ă  la commande `fastapi` qu’elle doit importer l’application comme : ```python from main import app ``` -Si votre code est structurĂ© comme : +Si votre code est structurĂ© comme : ``` . @@ -167,14 +167,14 @@ Si votre code est structurĂ© comme : │   ├── __init__.py ``` -Alors vous dĂ©finiriez le `entrypoint` comme : +Alors vous dĂ©finiriez le `entrypoint` comme : ```toml [tool.fastapi] entrypoint = "backend.main:app" ``` -ce qui Ă©quivaudrait à : +ce qui Ă©quivaudrait Ă  : ```python from backend.main import app @@ -182,19 +182,19 @@ from backend.main import app ### `fastapi dev` avec un chemin ou avec l’option CLI `--entrypoint` { #fastapi-dev-with-path-or-with-entrypoint-cli-option } -Vous pouvez Ă©galement passer le chemin du fichier Ă  la commande `fastapi dev`, et elle devinera l’objet d’application FastAPI Ă  utiliser : +Vous pouvez Ă©galement passer le chemin du fichier Ă  la commande `fastapi dev`, et elle devinera l’objet d’application FastAPI Ă  utiliser : ```console $ fastapi dev main.py ``` -Ou bien, vous pouvez aussi passer l’option `--entrypoint` Ă  la commande `fastapi dev` : +Ou bien, vous pouvez aussi passer l’option `--entrypoint` Ă  la commande `fastapi dev` : ```console $ fastapi dev --entrypoint main:app ``` -Mais vous devrez vous souvenir de passer le chemin\entrypoint correct Ă  chaque exĂ©cution de la commande `fastapi`. +Mais vous devez vous souvenir de passer le chemin\entrypoint correct Ă  chaque exĂ©cution de la commande `fastapi`. De plus, d’autres outils pourraient ne pas ĂȘtre capables de le trouver, par exemple l’[Extension VS Code](../editor-support.md) ou [FastAPI Cloud](https://fastapicloud.com), il est donc recommandĂ© d’utiliser le `entrypoint` dans `pyproject.toml`. @@ -244,7 +244,7 @@ Ici, la variable `app` sera une « instance » de la classe `FastAPI`. Ce sera le point principal d’interaction pour crĂ©er toute votre API. -### Étape 3 : crĂ©er un « chemin d’accĂšs » { #step-3-create-a-path-operation } +### Étape 3 : crĂ©er un *chemin d’accĂšs* { #step-3-create-a-path-operation } #### Chemin { #path } @@ -305,11 +305,11 @@ Donc, dans OpenAPI, chacune des mĂ©thodes HTTP est appelĂ©e une « opĂ©ration » Nous allons donc aussi les appeler « opĂ©rations ». -#### DĂ©finir un « dĂ©corateur de chemin d’accĂšs » { #define-a-path-operation-decorator } +#### DĂ©finir un *dĂ©corateur de chemin d’accĂšs* { #define-a-path-operation-decorator } {* ../../docs_src/first_steps/tutorial001_py310.py hl[6] *} -Le `@app.get("/")` indique Ă  **FastAPI** que la fonction juste en dessous est chargĂ©e de gĂ©rer les requĂȘtes qui vont vers : +Le `@app.get("/")` indique Ă  **FastAPI** que la fonction juste en dessous est chargĂ©e de gĂ©rer les requĂȘtes qui vont vers : * le chemin `/` * en utilisant une get opĂ©ration @@ -318,13 +318,13 @@ Le `@app.get("/")` indique Ă  **FastAPI** que la fonction juste en dessous est c Cette syntaxe `@something` en Python est appelĂ©e un « dĂ©corateur ». -Vous la mettez au-dessus d’une fonction. Comme un joli chapeau dĂ©coratif (j’imagine que c’est de lĂ  que vient le terme đŸ€·đŸ»â€â™‚). +Vous la mettez au-dessus d’une fonction. Comme un joli chapeau dĂ©coratif (j’imagine que c’est de lĂ  que vient le terme). Un « dĂ©corateur » prend la fonction en dessous et fait quelque chose avec. Dans notre cas, ce dĂ©corateur indique Ă  **FastAPI** que la fonction en dessous correspond au **chemin** `/` avec une **opĂ©ration** `get`. -C’est le « dĂ©corateur de chemin d’accĂšs ». +C’est le **« dĂ©corateur de chemin d’accĂšs »**. /// @@ -355,7 +355,7 @@ Par exemple, lorsque vous utilisez GraphQL, vous effectuez normalement toutes le ### Étape 4 : dĂ©finir la **fonction de chemin d’accĂšs** { #step-4-define-the-path-operation-function } -Voici notre « fonction de chemin d’accĂšs » : +Voici notre **« fonction de chemin d’accĂšs »** : * **chemin** : `/`. * **opĂ©ration** : `get`. @@ -365,7 +365,7 @@ Voici notre « fonction de chemin d’accĂšs » : C’est une fonction Python. -Elle sera appelĂ©e par **FastAPI** chaque fois qu’il recevra une requĂȘte vers l’URL « / » en utilisant une opĂ©ration `GET`. +Elle sera appelĂ©e par **FastAPI** chaque fois qu’il recevra une requĂȘte vers l’URL « `/` » en utilisant une opĂ©ration `GET`. Dans ce cas, c’est une fonction `async`. @@ -377,7 +377,7 @@ Vous pouvez aussi la dĂ©finir comme une fonction normale au lieu de `async def` /// note | Remarque -Si vous ne connaissez pas la diffĂ©rence, consultez [Asynchrone : « PressĂ© ? »](../async.md#in-a-hurry). +Si vous ne connaissez pas la diffĂ©rence, consultez [Asynchrone : *« PressĂ© ? »*](../async.md#in-a-hurry). /// diff --git a/docs/fr/docs/tutorial/handling-errors.md b/docs/fr/docs/tutorial/handling-errors.md index a697571f3..5c52e7be1 100644 --- a/docs/fr/docs/tutorial/handling-errors.md +++ b/docs/fr/docs/tutorial/handling-errors.md @@ -43,7 +43,7 @@ Dans cet exemple, lorsque le client demande un Ă©lĂ©ment par un ID qui n'existe ### RĂ©ponse rĂ©sultante { #the-resulting-response } -Si le client demande `http://example.com/items/foo` (un `item_id` « foo »), il recevra un code d'Ă©tat HTTP 200 et une rĂ©ponse JSON : +Si le client demande `http://example.com/items/foo` (un `item_id` `"foo"`), il recevra un code d'Ă©tat HTTP 200 et une rĂ©ponse JSON : ```JSON { @@ -51,7 +51,7 @@ Si le client demande `http://example.com/items/foo` (un `item_id` « foo »), il } ``` -Mais si le client demande `http://example.com/items/bar` (un `item_id` inexistant « bar »), il recevra un code d'Ă©tat HTTP 404 (l'erreur « not found ») et une rĂ©ponse JSON : +Mais si le client demande `http://example.com/items/bar` (un `item_id` inexistant `"bar"`), il recevra un code d'Ă©tat HTTP 404 (l'erreur « not found ») et une rĂ©ponse JSON : ```JSON { diff --git a/docs/fr/docs/tutorial/index.md b/docs/fr/docs/tutorial/index.md index 2fc177ed9..1e28cfc6d 100644 --- a/docs/fr/docs/tutorial/index.md +++ b/docs/fr/docs/tutorial/index.md @@ -1,5 +1,6 @@ # Tutoriel - Guide utilisateur { #tutorial-user-guide } + Ce tutoriel vous montre comment utiliser **FastAPI** avec la plupart de ses fonctionnalitĂ©s, Ă©tape par Ă©tape. Chaque section s'appuie progressivement sur les prĂ©cĂ©dentes, mais elle est structurĂ©e de maniĂšre Ă  sĂ©parer les sujets, afin que vous puissiez aller directement Ă  l'un d'entre eux pour rĂ©pondre Ă  vos besoins spĂ©cifiques d'API. diff --git a/docs/fr/docs/tutorial/metadata.md b/docs/fr/docs/tutorial/metadata.md index 75a8542f8..1f1859eed 100644 --- a/docs/fr/docs/tutorial/metadata.md +++ b/docs/fr/docs/tutorial/metadata.md @@ -11,7 +11,7 @@ Vous pouvez dĂ©finir les champs suivants qui sont utilisĂ©s dans la spĂ©cificati | `title` | `str` | Le titre de l’API. | | `summary` | `str` | Un court rĂ©sumĂ© de l’API. Disponible depuis OpenAPI 3.1.0, FastAPI 0.99.0. | | `description` | `str` | Une brĂšve description de l’API. Elle peut utiliser Markdown. | -| `version` | `string` | La version de l’API. C’est la version de votre propre application, pas d’OpenAPI. Par exemple `2.5.0`. | +| `version` | `str` | La version de l’API. C’est la version de votre propre application, pas d’OpenAPI. Par exemple `2.5.0`. | | `terms_of_service` | `str` | Une URL vers les Conditions d’utilisation de l’API. Le cas Ă©chĂ©ant, il doit s’agir d’une URL. | | `contact` | `dict` | Les informations de contact pour l’API exposĂ©e. Cela peut contenir plusieurs champs.
champs de contact
ParamĂštreTypeDescription
namestrLe nom identifiant de la personne/organisation de contact.
urlstrL’URL pointant vers les informations de contact. DOIT ĂȘtre au format d’une URL.
emailstrL’adresse e-mail de la personne/organisation de contact. DOIT ĂȘtre au format d’une adresse e-mail.
| | `license_info` | `dict` | Les informations de licence pour l’API exposĂ©e. Cela peut contenir plusieurs champs.
champs de license_info
ParamĂštreTypeDescription
namestrOBLIGATOIRE (si un license_info est dĂ©fini). Le nom de la licence utilisĂ©e pour l’API.
identifierstrUne expression de licence [SPDX](https://spdx.org/licenses/) pour l’API. Le champ identifier est mutuellement exclusif du champ url. Disponible depuis OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrUne URL vers la licence utilisĂ©e pour l’API. DOIT ĂȘtre au format d’une URL.
| diff --git a/docs/fr/docs/tutorial/path-operation-configuration.md b/docs/fr/docs/tutorial/path-operation-configuration.md index 572d38e01..bd9aed879 100644 --- a/docs/fr/docs/tutorial/path-operation-configuration.md +++ b/docs/fr/docs/tutorial/path-operation-configuration.md @@ -1,5 +1,6 @@ # Configurer les chemins d'accĂšs { #path-operation-configuration } + Vous pouvez passer plusieurs paramĂštres Ă  votre *dĂ©corateur de chemin d'accĂšs* pour le configurer. /// warning | Alertes diff --git a/docs/fr/docs/tutorial/query-params-str-validations.md b/docs/fr/docs/tutorial/query-params-str-validations.md index fc979334e..1b0fa88b3 100644 --- a/docs/fr/docs/tutorial/query-params-str-validations.md +++ b/docs/fr/docs/tutorial/query-params-str-validations.md @@ -81,7 +81,7 @@ FastAPI va maintenant : - **Valider** les donnĂ©es en s’assurant que la longueur maximale est de 50 caractĂšres - Afficher une **erreur claire** au client quand les donnĂ©es ne sont pas valides -- **Documenter** le paramĂštre dans la *chemin d'accĂšs* du schĂ©ma OpenAPI (il apparaĂźtra donc dans l’**interface de documentation automatique**) +- **Documenter** le paramĂštre dans le *chemin d'accĂšs* du schĂ©ma OpenAPI (il apparaĂźtra donc dans l’**interface de documentation automatique**) ## Alternative (ancienne) : `Query` comme valeur par dĂ©faut { #alternative-old-query-as-the-default-value } @@ -89,7 +89,7 @@ Les versions prĂ©cĂ©dentes de FastAPI (avant 0.95.0MDN web docs pour `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). +Si vous voulez en savoir plus sur ces encodages et les champs de formulaire, consultez les [documents web de la MDN pour `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// diff --git a/docs/fr/docs/tutorial/response-status-code.md b/docs/fr/docs/tutorial/response-status-code.md index e4a666ebf..398d1f1a1 100644 --- a/docs/fr/docs/tutorial/response-status-code.md +++ b/docs/fr/docs/tutorial/response-status-code.md @@ -1,5 +1,6 @@ # Code d'Ă©tat de la rĂ©ponse { #response-status-code } + De la mĂȘme maniĂšre que vous pouvez spĂ©cifier un modĂšle de rĂ©ponse, vous pouvez Ă©galement dĂ©clarer le code d'Ă©tat HTTP utilisĂ© pour la rĂ©ponse avec le paramĂštre `status_code` dans n'importe lequel des chemins d'accĂšs : * `@app.get()` diff --git a/docs/fr/docs/tutorial/schema-extra-example.md b/docs/fr/docs/tutorial/schema-extra-example.md index 6f254aafe..85905f5f5 100644 --- a/docs/fr/docs/tutorial/schema-extra-example.md +++ b/docs/fr/docs/tutorial/schema-extra-example.md @@ -1,6 +1,6 @@ # DĂ©clarer des exemples de donnĂ©es de requĂȘte { #declare-request-example-data } -Vous pouvez dĂ©clarer des exemples des donnĂ©es que votre application peut recevoir. +Vous pouvez dĂ©clarer des exemples de donnĂ©es que votre application peut recevoir. Voici plusieurs façons de le faire. @@ -10,9 +10,9 @@ Vous pouvez dĂ©clarer `examples` pour un modĂšle Pydantic qui seront ajoutĂ©s au {* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *} -Ces informations supplĂ©mentaires seront ajoutĂ©es telles quelles au **JSON Schema** de sortie pour ce modĂšle, et elles seront utilisĂ©es dans la documentation de l'API. +Ces informations supplĂ©mentaires seront ajoutĂ©es telles quelles au **JSON Schema** de sortie pour ce modĂšle, et elles seront utilisĂ©es dans les documents de l'API. -Vous pouvez utiliser l'attribut `model_config` qui accepte un `dict` comme dĂ©crit dans [Documentation de Pydantic : Configuration](https://docs.pydantic.dev/latest/api/config/). +Vous pouvez utiliser l'attribut `model_config` qui accepte un `dict` comme dĂ©crit dans [documents de Pydantic : Configuration](https://docs.pydantic.dev/latest/api/config/). Vous pouvez dĂ©finir `"json_schema_extra"` avec un `dict` contenant toutes les donnĂ©es supplĂ©mentaires que vous souhaitez voir apparaĂźtre dans le JSON Schema gĂ©nĂ©rĂ©, y compris `examples`. @@ -28,7 +28,7 @@ Par exemple, vous pourriez l'utiliser pour ajouter des mĂ©tadonnĂ©es pour une in OpenAPI 3.1.0 (utilisĂ© depuis FastAPI 0.99.0) a ajoutĂ© la prise en charge de `examples`, qui fait partie du standard **JSON Schema**. -Avant cela, seule la clĂ© `example` avec un exemple unique Ă©tait prise en charge. Elle l'est toujours par OpenAPI 3.1.0, mais elle est dĂ©prĂ©ciĂ©e et ne fait pas partie du standard JSON Schema. Vous ĂȘtes donc encouragĂ© Ă  migrer de `example` vers `examples`. đŸ€“ +Avant cela, seul le mot-clĂ© `example` avec un exemple unique Ă©tait pris en charge. Il l'est toujours par OpenAPI 3.1.0, mais il est dĂ©prĂ©ciĂ© et ne fait pas partie du standard JSON Schema. Vous ĂȘtes donc encouragĂ© Ă  migrer de `example` vers `examples`. đŸ€“ Vous pouvez en lire davantage Ă  la fin de cette page. @@ -173,7 +173,7 @@ Ce nouveau champ `examples` dans JSON Schema est **juste une `list`** d'exemples /// note | Remarque -MĂȘme aprĂšs la sortie d'OpenAPI 3.1.0 avec cette nouvelle intĂ©gration plus simple avec JSON Schema, pendant un temps, Swagger UI, l'outil qui fournit la documentation automatique, ne prenait pas en charge OpenAPI 3.1.0 (il le fait depuis la version 5.0.0 🎉). +MĂȘme aprĂšs la sortie d'OpenAPI 3.1.0 avec cette nouvelle intĂ©gration plus simple avec JSON Schema, pendant un temps, Swagger UI, l'outil qui fournit les documents automatiques, ne prenait pas en charge OpenAPI 3.1.0 (il le fait depuis la version 5.0.0 🎉). À cause de cela, les versions de FastAPI antĂ©rieures Ă  0.99.0 utilisaient encore des versions d'OpenAPI infĂ©rieures Ă  3.1.0. @@ -183,7 +183,7 @@ MĂȘme aprĂšs la sortie d'OpenAPI 3.1.0 avec cette nouvelle intĂ©gration plus sim Lorsque vous ajoutez `examples` dans un modĂšle Pydantic, en utilisant `schema_extra` ou `Field(examples=["something"])`, cet exemple est ajoutĂ© au **JSON Schema** de ce modĂšle Pydantic. -Et ce **JSON Schema** du modĂšle Pydantic est inclus dans l'**OpenAPI** de votre API, puis il est utilisĂ© dans l'interface de la documentation. +Et ce **JSON Schema** du modĂšle Pydantic est inclus dans l'**OpenAPI** de votre API, puis il est utilisĂ© dans l'interface des documents. Dans les versions de FastAPI antĂ©rieures Ă  0.99.0 (0.99.0 et supĂ©rieures utilisent le nouveau OpenAPI 3.1.0), lorsque vous utilisiez `example` ou `examples` avec l'une des autres utilitaires (`Query()`, `Body()`, etc.), ces exemples n'Ă©taient pas ajoutĂ©s au JSON Schema qui dĂ©crit ces donnĂ©es (pas mĂȘme Ă  la version de JSON Schema propre Ă  OpenAPI), ils Ă©taient ajoutĂ©s directement Ă  la dĂ©claration du *chemin d'accĂšs* dans OpenAPI (en dehors des parties d'OpenAPI qui utilisent JSON Schema). @@ -191,7 +191,7 @@ Mais maintenant que FastAPI 0.99.0 et supĂ©rieures utilisent OpenAPI 3.1.0, qui ### Swagger UI et `examples` spĂ©cifiques Ă  OpenAPI { #swagger-ui-and-openapi-specific-examples } -Comme Swagger UI ne prenait pas en charge plusieurs exemples JSON Schema (au 2023-08-26), les utilisateurs n'avaient pas de moyen d'afficher plusieurs exemples dans les documents. +Maintenant, comme Swagger UI ne prenait pas en charge plusieurs exemples JSON Schema (au 2023-08-26), les utilisateurs n'avaient pas de moyen d'afficher plusieurs exemples dans les documents. Pour rĂ©soudre cela, FastAPI `0.103.0` a **ajoutĂ© la prise en charge** de la dĂ©claration du mĂȘme ancien champ `examples` **spĂ©cifique Ă  OpenAPI** avec le nouveau paramĂštre `openapi_examples`. đŸ€“ diff --git a/docs/fr/docs/tutorial/security/first-steps.md b/docs/fr/docs/tutorial/security/first-steps.md index 73cf4f38c..66005d907 100644 --- a/docs/fr/docs/tutorial/security/first-steps.md +++ b/docs/fr/docs/tutorial/security/first-steps.md @@ -54,7 +54,7 @@ $ fastapi dev ## VĂ©rifier { #check-it } -Allez Ă  la documentation interactive Ă  l'adresse : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). +Allez aux documents interactifs Ă  l'adresse : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Vous verrez quelque chose comme ceci : @@ -98,19 +98,19 @@ Mais dans ce cas, la mĂȘme application **FastAPI** gĂ©rera l'API et l'authentifi Voyons cela selon ce point de vue simplifié : -- L'utilisateur saisit le `username` et le `password` dans le frontend, puis appuie sur EntrĂ©e. -- Le frontend (exĂ©cutĂ© dans le navigateur de l'utilisateur) envoie ce `username` et ce `password` vers une URL spĂ©cifique de notre API (dĂ©clarĂ©e avec `tokenUrl="token"`). -- L'API vĂ©rifie ce `username` et ce `password`, et rĂ©pond avec un « token » (nous n'avons encore rien implĂ©mentĂ© de tout cela). - - Un « token » n'est qu'une chaĂźne contenant des informations que nous pouvons utiliser plus tard pour vĂ©rifier cet utilisateur. - - Normalement, un token est configurĂ© pour expirer aprĂšs un certain temps. - - Ainsi, l'utilisateur devra se reconnecter Ă  un moment donnĂ©. - - Et si le token est volĂ©, le risque est moindre. Ce n'est pas une clĂ© permanente qui fonctionnerait indĂ©finiment (dans la plupart des cas). -- Le frontend stocke ce token temporairement quelque part. -- L'utilisateur clique dans le frontend pour aller vers une autre section de l'application web frontend. -- Le frontend doit rĂ©cupĂ©rer d'autres donnĂ©es depuis l'API. - - Mais cela nĂ©cessite une authentification pour cet endpoint spĂ©cifique. - - Donc, pour s'authentifier auprĂšs de notre API, il envoie un en-tĂȘte `Authorization` avec une valeur `Bearer ` suivie du token. - - Si le token contient `foobar`, le contenu de l'en-tĂȘte `Authorization` serait : `Bearer foobar`. +* L'utilisateur saisit le `username` et le `password` dans le frontend, puis appuie sur EntrĂ©e. +* Le frontend (exĂ©cutĂ© dans le navigateur de l'utilisateur) envoie ce `username` et ce `password` vers une URL spĂ©cifique de notre API (dĂ©clarĂ©e avec `tokenUrl="token"`). +* L'API vĂ©rifie ce `username` et ce `password`, et rĂ©pond avec un « token » (nous n'avons encore rien implĂ©mentĂ© de tout cela). + * Un « token » n'est qu'une chaĂźne contenant des informations que nous pouvons utiliser plus tard pour vĂ©rifier cet utilisateur. + * Normalement, un token est configurĂ© pour expirer aprĂšs un certain temps. + * Ainsi, l'utilisateur devra se reconnecter Ă  un moment donnĂ©. + * Et si le token est volĂ©, le risque est moindre. Ce n'est pas une clĂ© permanente qui fonctionnerait indĂ©finiment (dans la plupart des cas). +* Le frontend stocke ce token temporairement quelque part. +* L'utilisateur clique dans le frontend pour aller vers une autre section de l'application web frontend. +* Le frontend doit rĂ©cupĂ©rer d'autres donnĂ©es depuis l'API. + * Mais cela nĂ©cessite une authentification pour cet endpoint spĂ©cifique. + * Donc, pour s'authentifier auprĂšs de notre API, il envoie un en-tĂȘte `Authorization` avec une valeur `Bearer ` suivie du token. + * Si le token contient `foobar`, le contenu de l'en-tĂȘte `Authorization` serait : `Bearer foobar`. ## Le `OAuth2PasswordBearer` de **FastAPI** { #fastapis-oauth2passwordbearer } @@ -172,15 +172,15 @@ Vous pouvez maintenant passer ce `oauth2_scheme` en dĂ©pendance avec `Depends`. {* ../../docs_src/security/tutorial001_an_py310.py hl[12] *} -Cette dĂ©pendance fournira une `str` qui est affectĂ©e au paramĂštre `token` de la fonction de *chemin d'accĂšs*. +Cette dĂ©pendance fournira une `str` qui est affectĂ©e au paramĂštre `token` de la *fonction de chemin d'accĂšs*. -**FastAPI** saura qu'il peut utiliser cette dĂ©pendance pour dĂ©finir un « schĂ©ma de sĂ©curitĂ© » dans le schĂ©ma OpenAPI (et la documentation API automatique). +**FastAPI** saura qu'il peut utiliser cette dĂ©pendance pour dĂ©finir un « schĂ©ma de sĂ©curitĂ© » dans le schĂ©ma OpenAPI (et les documents automatiques de l'API). /// note | DĂ©tails techniques **FastAPI** saura qu'il peut utiliser la classe `OAuth2PasswordBearer` (dĂ©clarĂ©e dans une dĂ©pendance) pour dĂ©finir le schĂ©ma de sĂ©curitĂ© dans OpenAPI parce qu'elle hĂ©rite de `fastapi.security.oauth2.OAuth2`, qui hĂ©rite Ă  son tour de `fastapi.security.base.SecurityBase`. -Tous les utilitaires de sĂ©curitĂ© qui s'intĂšgrent Ă  OpenAPI (et Ă  la documentation API automatique) hĂ©ritent de `SecurityBase`, c'est ainsi que **FastAPI** sait comment les intĂ©grer dans OpenAPI. +Tous les utilitaires de sĂ©curitĂ© qui s'intĂšgrent Ă  OpenAPI (et aux documents automatiques de l'API) hĂ©ritent de `SecurityBase`, c'est ainsi que **FastAPI** sait comment les intĂ©grer dans OpenAPI. /// @@ -192,7 +192,7 @@ S'il ne voit pas d'en-tĂȘte `Authorization`, ou si la valeur n'a pas de token `B Vous n'avez mĂȘme pas Ă  vĂ©rifier si le token existe pour renvoyer une erreur. Vous pouvez ĂȘtre sĂ»r que si votre fonction est exĂ©cutĂ©e, elle aura une `str` dans ce token. -Vous pouvez dĂ©jĂ  l'essayer dans la documentation interactive : +Vous pouvez dĂ©jĂ  l'essayer dans les documents interactifs : diff --git a/docs/fr/docs/tutorial/security/get-current-user.md b/docs/fr/docs/tutorial/security/get-current-user.md index 97cffc666..664814bc3 100644 --- a/docs/fr/docs/tutorial/security/get-current-user.md +++ b/docs/fr/docs/tutorial/security/get-current-user.md @@ -14,7 +14,7 @@ Commençons par crĂ©er un modĂšle d'utilisateur Pydantic. De la mĂȘme maniĂšre que nous utilisons Pydantic pour dĂ©clarer des corps de requĂȘte, nous pouvons l'utiliser ailleurs : -{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *} +{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *} ## CrĂ©er une dĂ©pendance `get_current_user` { #create-a-get-current-user-dependency } diff --git a/docs/fr/docs/tutorial/security/oauth2-jwt.md b/docs/fr/docs/tutorial/security/oauth2-jwt.md index 810f1eef1..f92fd75a6 100644 --- a/docs/fr/docs/tutorial/security/oauth2-jwt.md +++ b/docs/fr/docs/tutorial/security/oauth2-jwt.md @@ -58,7 +58,7 @@ Chaque fois que vous fournissez exactement le mĂȘme contenu (exactement le mĂȘme Mais vous ne pouvez pas convertir le charabia en sens inverse vers le mot de passe. -### Pourquoi utiliser le hachage de mot passe { #why-use-password-hashing } +### Pourquoi utiliser le hachage de mot de passe { #why-use-password-hashing } Si votre base de donnĂ©es est volĂ©e, le voleur n'aura pas les mots de passe en clair de vos utilisateurs, seulement les hachages. @@ -120,7 +120,7 @@ Et une autre pour authentifier et renvoyer un utilisateur. Lorsque `authenticate_user` est appelĂ©e avec un nom d'utilisateur qui n'existe pas dans la base de donnĂ©es, nous exĂ©cutons tout de mĂȘme `verify_password` contre un hachage factice. -Cela garantit que le point de terminaison met approximativement le mĂȘme temps Ă  rĂ©pondre que le nom d'utilisateur soit valide ou non, empĂȘchant des **attaques temporelles** qui pourraient ĂȘtre utilisĂ©es pour Ă©numĂ©rer les noms d'utilisateur existants. +Cela garantit que l'endpoint met approximativement le mĂȘme temps Ă  rĂ©pondre que le nom d'utilisateur soit valide ou non, empĂȘchant des **attaques temporelles** qui pourraient ĂȘtre utilisĂ©es pour Ă©numĂ©rer les noms d'utilisateur existants. /// note | Remarque @@ -152,7 +152,7 @@ CrĂ©ez une variable `ALGORITHM` avec l'algorithme utilisĂ© pour signer le jeton CrĂ©ez une variable pour l'expiration du jeton. -DĂ©finissez un modĂšle Pydantic qui sera utilisĂ© dans le point de terminaison du jeton pour la rĂ©ponse. +DĂ©finissez un modĂšle Pydantic qui sera utilisĂ© dans l'endpoint du jeton pour la rĂ©ponse. CrĂ©ez une fonction utilitaire pour gĂ©nĂ©rer un nouveau jeton d'accĂšs. @@ -200,7 +200,7 @@ L'important Ă  garder Ă  l'esprit est que la clĂ© `sub` doit contenir un identif ## VĂ©rifier { #check-it } -Lancez le serveur et allez Ă  la documentation : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). +Lancez le serveur et accĂ©dez aux documents : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Vous verrez l'interface utilisateur suivante : @@ -215,13 +215,13 @@ Mot de passe : `secret` /// tip | Astuce -Remarquez qu'Ă  aucun endroit du code le mot de passe en clair « secret » n'apparaĂźt, nous n'avons que la version hachĂ©e. +Remarquez qu'Ă  aucun endroit du code le mot de passe en clair « `secret` » n'apparaĂźt, nous n'avons que la version hachĂ©e. /// -Appelez le point de terminaison `/users/me/`, vous obtiendrez la rĂ©ponse suivante : +Appelez l'endpoint `/users/me/`, vous obtiendrez la rĂ©ponse suivante : ```JSON { diff --git a/docs/fr/docs/tutorial/security/simple-oauth2.md b/docs/fr/docs/tutorial/security/simple-oauth2.md index b0f974f0d..1ee9e61ec 100644 --- a/docs/fr/docs/tutorial/security/simple-oauth2.md +++ b/docs/fr/docs/tutorial/security/simple-oauth2.md @@ -14,13 +14,13 @@ Mais ne vous inquiĂ©tez pas, vous pouvez l'afficher comme vous le souhaitez Ă  v Et vos modĂšles de base de donnĂ©es peuvent utiliser les noms que vous voulez. -Mais pour le chemin d'accĂšs de connexion, nous devons utiliser ces noms pour ĂȘtre compatibles avec la spĂ©cification (et pouvoir, par exemple, utiliser le systĂšme de documentation API intĂ©grĂ©). +Mais pour le *chemin d'accĂšs* de connexion, nous devons utiliser ces noms pour ĂȘtre compatibles avec la spĂ©cification (et pouvoir, par exemple, utiliser le systĂšme de documentation API intĂ©grĂ©). La spĂ©cification prĂ©cise Ă©galement que `username` et `password` doivent ĂȘtre envoyĂ©s en donnĂ©es de formulaire (donc pas de JSON ici). ### `scope` { #scope } -La spĂ©cification indique aussi que le client peut envoyer un autre champ de formulaire « scope ». +La spĂ©cification indique aussi que le client peut envoyer un autre champ de formulaire « `scope` ». Le nom du champ de formulaire est `scope` (au singulier), mais il s'agit en fait d'une longue chaĂźne contenant des « scopes » sĂ©parĂ©s par des espaces. @@ -50,7 +50,7 @@ Utilisons maintenant les utilitĂ©s fournies par **FastAPI** pour gĂ©rer cela. ### `OAuth2PasswordRequestForm` { #oauth2passwordrequestform } -Tout d'abord, importez `OAuth2PasswordRequestForm`, et utilisez-la en tant que dĂ©pendance avec `Depends` dans le chemin d'accĂšs pour `/token` : +Tout d'abord, importez `OAuth2PasswordRequestForm`, et utilisez-la en tant que dĂ©pendance avec `Depends` dans le *chemin d'accĂšs* pour `/token` : {* ../../docs_src/security/tutorial003_an_py310.py hl[4,78] *} @@ -63,7 +63,7 @@ Tout d'abord, importez `OAuth2PasswordRequestForm`, et utilisez-la en tant que d /// tip | Astuce -La spĂ©cification OAuth2 exige en rĂ©alitĂ© un champ `grant_type` avec la valeur fixe `password`, mais `OAuth2PasswordRequestForm` ne l'impose pas. +La spĂ©cification OAuth2 *exige* en rĂ©alitĂ© un champ `grant_type` avec la valeur fixe `password`, mais `OAuth2PasswordRequestForm` ne l'impose pas. Si vous avez besoin de l'imposer, utilisez `OAuth2PasswordRequestFormStrict` au lieu de `OAuth2PasswordRequestForm`. @@ -132,7 +132,7 @@ Ainsi, il ne pourra pas essayer d'utiliser ces mĂȘmes mots de passe dans un autr `UserInDB(**user_dict)` signifie : -Passez les clĂ©s et valeurs de `user_dict` directement comme arguments clé‑valeur, Ă©quivalent Ă  : +*Passez les clĂ©s et valeurs de `user_dict` directement comme arguments clé‑valeur, Ă©quivalent Ă  :* ```Python UserInDB( @@ -146,7 +146,7 @@ UserInDB( /// note | Remarque -Pour une explication plus complĂšte de `**user_dict`, consultez [la documentation pour **ModĂšles supplĂ©mentaires**](../extra-models.md#about-user-in-dict). +Pour une explication plus complĂšte de `**user_dict`, consultez [la documentation pour **ModĂšles supplĂ©mentaires**](../extra-models.md#about-user-in-model-dump). /// @@ -154,7 +154,7 @@ Pour une explication plus complĂšte de `**user_dict`, consultez [la documentatio La rĂ©ponse de l'endpoint `token` doit ĂȘtre un objet JSON. -Il doit contenir un `token_type`. Dans notre cas, comme nous utilisons des jetons « Bearer », le type de jeton doit ĂȘtre « bearer ». +Il doit contenir un `token_type`. Dans notre cas, comme nous utilisons des jetons « Bearer », le type de jeton doit ĂȘtre « `bearer` ». Et il doit contenir un `access_token`, avec une chaĂźne contenant notre jeton d'accĂšs. @@ -186,7 +186,7 @@ Pour le reste, **FastAPI** s'en charge pour vous. Nous allons maintenant mettre Ă  jour nos dĂ©pendances. -Nous voulons obtenir `current_user` uniquement si cet utilisateur est actif. +Nous voulons obtenir `current_user` *uniquement* si cet utilisateur est actif. Nous crĂ©ons donc une dĂ©pendance supplĂ©mentaire `get_current_active_user` qui utilise Ă  son tour `get_current_user` comme dĂ©pendance. @@ -216,7 +216,7 @@ C'est l'avantage des standards ... ## Voir en action { #see-it-in-action } -Ouvrez la documentation interactive : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). +Ouvrez les documents interactifs : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). ### S'authentifier { #authenticate } diff --git a/docs/fr/docs/tutorial/sql-databases.md b/docs/fr/docs/tutorial/sql-databases.md index 70e5b1dba..2f6aad3a9 100644 --- a/docs/fr/docs/tutorial/sql-databases.md +++ b/docs/fr/docs/tutorial/sql-databases.md @@ -30,7 +30,7 @@ Il existe un gĂ©nĂ©rateur de projet officiel avec **FastAPI** et **PostgreSQL**, /// -Il s'agit d'un tutoriel trĂšs simple et court ; si vous souhaitez apprendre sur les bases de donnĂ©es en gĂ©nĂ©ral, sur SQL, ou des fonctionnalitĂ©s plus avancĂ©es, allez voir la [documentation SQLModel](https://sqlmodel.tiangolo.com/). +Il s'agit d'un tutoriel trĂšs simple et court ; si vous souhaitez apprendre sur les bases de donnĂ©es en gĂ©nĂ©ral, sur SQL, ou des fonctionnalitĂ©s plus avancĂ©es, allez voir les [documents de SQLModel](https://sqlmodel.tiangolo.com/). ## Installer `SQLModel` { #install-sqlmodel } @@ -57,15 +57,15 @@ Importez `SQLModel` et crĂ©ez un modĂšle de base de donnĂ©es : {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[1:11] hl[7:11] *} -La classe `Hero` est trĂšs similaire Ă  un modĂšle Pydantic (en fait, en dessous, c'est rĂ©ellement un modĂšle Pydantic). +La classe `Hero` est trĂšs similaire Ă  un modĂšle Pydantic (en fait, en dessous, c'est rĂ©ellement *un modĂšle Pydantic*). Il y a quelques diffĂ©rences : * `table=True` indique Ă  SQLModel qu'il s'agit d'un *modĂšle de table*, il doit reprĂ©senter une **table** dans la base SQL, ce n'est pas seulement un *modĂšle de donnĂ©es* (comme le serait n'importe quelle autre classe Pydantic classique). -* `Field(primary_key=True)` indique Ă  SQLModel que `id` est la **clĂ© primaire** dans la base SQL (vous pouvez en savoir plus sur les clĂ©s primaires SQL dans la documentation SQLModel). +* `Field(primary_key=True)` indique Ă  SQLModel que `id` est la **clĂ© primaire** dans la base SQL (vous pouvez en savoir plus sur les clĂ©s primaires SQL dans les documents de SQLModel). - Remarque : nous utilisons `int | None` pour le champ clĂ© primaire afin qu'en Python nous puissions *crĂ©er un objet sans `id`* (`id=None`), en supposant que la base *le gĂ©nĂšre Ă  l'enregistrement*. SQLModel comprend que la base fournira l'`id` et *dĂ©finit la colonne comme un `INTEGER` non nul* dans le schĂ©ma de base. Voir la [documentation SQLModel sur les clĂ©s primaires](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) pour plus de dĂ©tails. + **Remarque :** nous utilisons `int | None` pour le champ clĂ© primaire afin qu'en Python nous puissions *crĂ©er un objet sans `id`* (`id=None`), en supposant que la base *le gĂ©nĂšre Ă  l'enregistrement*. SQLModel comprend que la base fournira l'`id` et *dĂ©finit la colonne comme un `INTEGER` non nul* dans le schĂ©ma de base. Voir les [documents de SQLModel sur les clĂ©s primaires](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) pour plus de dĂ©tails. * `Field(index=True)` indique Ă  SQLModel qu'il doit crĂ©er un **index SQL** pour cette colonne, ce qui permettra des recherches plus rapides dans la base lors de la lecture de donnĂ©es filtrĂ©es par cette colonne. @@ -121,7 +121,7 @@ Comme chaque modĂšle SQLModel est aussi un modĂšle Pydantic, vous pouvez l'utili Par exemple, si vous dĂ©clarez un paramĂštre de type `Hero`, il sera lu depuis le **corps JSON**. -De la mĂȘme maniĂšre, vous pouvez le dĂ©clarer comme **type de retour** de la fonction, et alors la forme des donnĂ©es apparaĂźtra dans l'UI automatique de documentation de l'API. +De la mĂȘme maniĂšre, vous pouvez le dĂ©clarer comme **type de retour** de la fonction, et alors la forme des donnĂ©es apparaĂźtra dans l'UI automatique des documents de l'API. {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[40:45] hl[40:45] *} @@ -173,7 +173,7 @@ Si vous vĂ©rifiez l'application prĂ©cĂ©dente, dans l'UI vous pouvez voir que, ju Nous ne devrions pas laisser cela se produire, ils pourraient Ă©craser un `id` que nous avons dĂ©jĂ  attribuĂ© dans la base. DĂ©cider de l'`id` doit ĂȘtre fait par le **backend** ou la **base**, **pas par le client**. -De plus, nous crĂ©ons un `secret_name` pour le hĂ©ros, mais jusqu'ici, nous le renvoyons partout, ce n'est pas trĂšs « secret » ... 😅 +De plus, nous crĂ©ons un `secret_name` pour le hĂ©ros, mais jusqu'ici, nous le renvoyons partout, ce n'est pas trĂšs **secret** ... 😅 Nous allons corriger ces choses en ajoutant quelques **modĂšles supplĂ©mentaires**. C'est lĂ  que SQLModel brille. ✹ @@ -354,4 +354,4 @@ Si vous allez sur l'UI `/docs` de l'API, vous verrez qu'elle est maintenant Ă  j Vous pouvez utiliser [**SQLModel**](https://sqlmodel.tiangolo.com/) pour interagir avec une base SQL et simplifier le code avec des *modĂšles de donnĂ©es* et des *modĂšles de table*. -Vous pouvez en apprendre beaucoup plus dans la documentation **SQLModel**, il y a un mini [tutoriel plus long sur l'utilisation de SQLModel avec **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/). 🚀 +Vous pouvez en apprendre beaucoup plus dans les documents de **SQLModel**, il y a un mini [tutoriel plus long sur l'utilisation de SQLModel avec **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/). 🚀 diff --git a/docs/fr/docs/tutorial/static-files.md b/docs/fr/docs/tutorial/static-files.md index 6a54840af..cfbbe86b9 100644 --- a/docs/fr/docs/tutorial/static-files.md +++ b/docs/fr/docs/tutorial/static-files.md @@ -2,6 +2,14 @@ Vous pouvez servir des fichiers statiques automatiquement Ă  partir d'un rĂ©pertoire en utilisant `StaticFiles`. +/// tip | Astuce + +Si vous devez hĂ©berger un frontend, utilisez plutĂŽt `app.frontend()`, lisez-en davantage dans [Frontend](frontend.md). + +`app.frontend()` utilise `StaticFiles` en interne, avec plusieurs avantages supplĂ©mentaires pour les frontends, comme la gestion du routing cĂŽtĂ© client. + +/// + ## Utiliser `StaticFiles` { #use-staticfiles } - Importer `StaticFiles`. diff --git a/docs/fr/docs/tutorial/testing.md b/docs/fr/docs/tutorial/testing.md index 517603425..883a61155 100644 --- a/docs/fr/docs/tutorial/testing.md +++ b/docs/fr/docs/tutorial/testing.md @@ -12,7 +12,7 @@ Avec cela, vous pouvez utiliser [pytest](https://docs.pytest.org/) directement a Pour utiliser `TestClient`, installez d’abord [`httpx`](https://www.python-httpx.org). -Vous devez crĂ©er un [environnement virtuel](../virtual-environments.md), l’activer, puis y installer le paquet, par exemple : +Vous devez vous assurer de crĂ©er un [environnement virtuel](../virtual-environments.md), de l’activer, puis d’y installer le paquet, par exemple : ```console $ pip install httpx @@ -156,7 +156,7 @@ Si vous avez un modĂšle Pydantic dans votre test et que vous souhaitez envoyer s AprĂšs cela, vous avez simplement besoin d’installer `pytest`. -Vous devez crĂ©er un [environnement virtuel](../virtual-environments.md), l’activer, puis y installer le paquet, par exemple : +Vous devez vous assurer de crĂ©er un [environnement virtuel](../virtual-environments.md), de l’activer, puis d’y installer le paquet, par exemple :
diff --git a/docs/fr/docs/virtual-environments.md b/docs/fr/docs/virtual-environments.md index c9eefb37b..f2a9f47da 100644 --- a/docs/fr/docs/virtual-environments.md +++ b/docs/fr/docs/virtual-environments.md @@ -1,6 +1,6 @@ # Environnements virtuels { #virtual-environments } -Lorsque vous travaillez sur des projets Python, vous devriez probablement utiliser un environnement virtuel (ou un mĂ©canisme similaire) pour isoler les packages que vous installez pour chaque projet. +Lorsque vous travaillez sur des projets Python, vous devriez probablement utiliser un **environnement virtuel** (ou un mĂ©canisme similaire) pour isoler les packages que vous installez pour chaque projet. /// note | Remarque @@ -10,19 +10,19 @@ Si vous connaissez dĂ©jĂ  les environnements virtuels, comment les crĂ©er et les /// tip | Astuce -Un environnement virtuel est diffĂ©rent d’une variable d’environnement. +Un **environnement virtuel** est diffĂ©rent d’une **variable d’environnement**. -Une variable d’environnement est une variable du systĂšme qui peut ĂȘtre utilisĂ©e par des programmes. +Une **variable d’environnement** est une variable du systĂšme qui peut ĂȘtre utilisĂ©e par des programmes. -Un environnement virtuel est un rĂ©pertoire contenant certains fichiers. +Un **environnement virtuel** est un rĂ©pertoire contenant certains fichiers. /// /// note | Remarque -Cette page vous apprendra Ă  utiliser les environnements virtuels et Ă  comprendre leur fonctionnement. +Cette page vous apprendra Ă  utiliser les **environnements virtuels** et Ă  comprendre leur fonctionnement. -Si vous ĂȘtes prĂȘt Ă  adopter un outil qui gĂšre tout pour vous (y compris l’installation de Python), essayez [uv](https://github.com/astral-sh/uv). +Si vous ĂȘtes prĂȘt Ă  adopter un **outil qui gĂšre tout** pour vous (y compris l’installation de Python), essayez [uv](https://github.com/astral-sh/uv). /// @@ -53,11 +53,11 @@ $ cd awesome-project ## CrĂ©er un environnement virtuel { #create-a-virtual-environment } -Lorsque vous commencez Ă  travailler sur un projet Python pour la premiĂšre fois, crĂ©ez un environnement virtuel dans votre projet. +Lorsque vous commencez Ă  travailler sur un projet Python **pour la premiĂšre fois**, crĂ©ez un environnement virtuel **dans votre projet**. /// tip | Astuce -Vous n’avez besoin de faire cela qu’une seule fois par projet, pas Ă  chaque fois que vous travaillez. +Vous n’avez besoin de faire cela qu’**une seule fois par projet**, pas Ă  chaque fois que vous travaillez. /// @@ -120,7 +120,7 @@ Activez le nouvel environnement virtuel afin que toute commande Python que vous /// tip | Astuce -Faites cela Ă  chaque fois que vous dĂ©marrez une nouvelle session de terminal pour travailler sur le projet. +Faites cela **chaque fois** que vous dĂ©marrez une **nouvelle session de terminal** pour travailler sur le projet. /// @@ -164,9 +164,9 @@ $ source .venv/Scripts/activate /// tip | Astuce -Chaque fois que vous installez un nouveau package dans cet environnement, activez de nouveau l’environnement. +Chaque fois que vous installez un **nouveau package** dans cet environnement, **activez** de nouveau l’environnement. -Vous vous assurez ainsi que si vous utilisez un programme de terminal (CLI) installĂ© par ce package, vous utilisez celui de votre environnement virtuel et non un autre qui pourrait ĂȘtre installĂ© globalement, probablement avec une version diffĂ©rente de celle dont vous avez besoin. +Vous vous assurez ainsi que si vous utilisez un **programme de terminal (CLI)** installĂ© par ce package, vous utilisez celui de votre environnement virtuel et non un autre qui pourrait ĂȘtre installĂ© globalement, probablement avec une version diffĂ©rente de celle dont vous avez besoin. /// @@ -176,7 +176,7 @@ VĂ©rifiez que l’environnement virtuel est actif (la commande prĂ©cĂ©dente a fo /// tip | Astuce -C’est facultatif, mais c’est une bonne maniĂšre de vĂ©rifier que tout fonctionne comme prĂ©vu et que vous utilisez l’environnement virtuel voulu. +C’est **facultatif**, mais c’est une bonne maniĂšre de **vĂ©rifier** que tout fonctionne comme prĂ©vu et que vous utilisez l’environnement virtuel voulu. /// @@ -220,13 +220,13 @@ Si vous utilisez [`uv`](https://github.com/astral-sh/uv), vous l’utiliserez po /// -Si vous utilisez `pip` pour installer des packages (il est fourni par dĂ©faut avec Python), vous devez le mettre Ă  niveau vers la derniĂšre version. +Si vous utilisez `pip` pour installer des packages (il est fourni par dĂ©faut avec Python), vous devez le **mettre Ă  niveau** vers la derniĂšre version. Beaucoup d’erreurs exotiques lors de l’installation d’un package se rĂ©solvent simplement en mettant d’abord `pip` Ă  niveau. /// tip | Astuce -Vous feriez normalement cela une seule fois, juste aprĂšs avoir créé l’environnement virtuel. +Vous feriez normalement cela **une seule fois**, juste aprĂšs avoir créé l’environnement virtuel. /// @@ -264,7 +264,7 @@ Cette commande installera pip s’il n’est pas dĂ©jĂ  installĂ© et garantit au ## Ajouter `.gitignore` { #add-gitignore } -Si vous utilisez Git (vous devriez), ajoutez un fichier `.gitignore` pour exclure tout ce qui se trouve dans votre `.venv` de Git. +Si vous utilisez **Git** (vous devriez), ajoutez un fichier `.gitignore` pour exclure tout ce qui se trouve dans votre `.venv` de Git. /// tip | Astuce @@ -274,7 +274,7 @@ Si vous avez utilisĂ© [`uv`](https://github.com/astral-sh/uv) pour crĂ©er l’en /// tip | Astuce -Faites cela une seule fois, juste aprĂšs avoir créé l’environnement virtuel. +Faites cela **une seule fois**, juste aprĂšs avoir créé l’environnement virtuel. /// @@ -308,19 +308,19 @@ AprĂšs avoir activĂ© l’environnement, vous pouvez y installer des packages. /// tip | Astuce -Faites cela une seule fois lorsque vous installez ou mettez Ă  niveau les packages nĂ©cessaires Ă  votre projet. +Faites cela **une seule fois** lorsque vous installez ou mettez Ă  niveau les packages nĂ©cessaires Ă  votre projet. -Si vous devez mettre Ă  niveau une version ou ajouter un nouveau package, vous le referez. +Si vous devez mettre Ă  niveau une version ou ajouter un nouveau package, vous le **referez**. /// ### Installer des packages directement { #install-packages-directly } -Si vous ĂȘtes pressĂ© et ne souhaitez pas utiliser un fichier pour dĂ©clarer les dĂ©pendances de votre projet, vous pouvez les installer directement. +Si vous ĂȘtes pressĂ© et ne souhaitez pas utiliser un fichier pour dĂ©clarer les dĂ©pendances de packages de votre projet, vous pouvez les installer directement. /// tip | Astuce -C’est une trĂšs bonne idĂ©e de placer les packages et leurs versions nĂ©cessaires Ă  votre programme dans un fichier (par exemple `requirements.txt` ou `pyproject.toml`). +C’est une (trĂšs) bonne idĂ©e de placer les packages et leurs versions nĂ©cessaires Ă  votre programme dans un fichier (par exemple `requirements.txt` ou `pyproject.toml`). /// @@ -421,13 +421,13 @@ Par exemple : /// tip | Astuce -Vous devez normalement faire cela une seule fois, lorsque vous crĂ©ez l’environnement virtuel. +Vous devez normalement faire cela seulement **une fois**, lorsque vous crĂ©ez l’environnement virtuel. /// ## DĂ©sactiver l’environnement virtuel { #deactivate-the-virtual-environment } -Une fois que vous avez fini de travailler sur votre projet, vous pouvez dĂ©sactiver l’environnement virtuel. +Une fois que vous avez fini de travailler sur votre projet, vous pouvez **dĂ©sactiver** l’environnement virtuel.
@@ -457,17 +457,17 @@ Continuez la lecture. đŸ‘‡đŸ€“ Pour travailler avec FastAPI, vous devez installer [Python](https://www.python.org/). -Ensuite, vous devrez installer FastAPI et tout autre package que vous souhaitez utiliser. +Ensuite, vous devez **installer** FastAPI et tout autre **package** que vous souhaitez utiliser. Pour installer des packages, vous utiliseriez normalement la commande `pip` fournie avec Python (ou des alternatives similaires). -NĂ©anmoins, si vous utilisez simplement `pip` directement, les packages seraient installĂ©s dans votre environnement Python global (l’installation globale de Python). +NĂ©anmoins, si vous utilisez simplement `pip` directement, les packages seraient installĂ©s dans votre **environnement Python global** (l’installation globale de Python). ### Le problĂšme { #the-problem } Alors, quel est le problĂšme d’installer des packages dans l’environnement Python global ? -À un moment donnĂ©, vous finirez probablement par Ă©crire de nombreux programmes diffĂ©rents qui dĂ©pendent de packages diffĂ©rents. Et certains de ces projets sur lesquels vous travaillez dĂ©pendront de versions diffĂ©rentes du mĂȘme package. đŸ˜± +À un moment donnĂ©, vous finirez probablement par Ă©crire de nombreux programmes diffĂ©rents qui dĂ©pendent de **packages diffĂ©rents**. Et certains de ces projets sur lesquels vous travaillez dĂ©pendront de **versions diffĂ©rentes** du mĂȘme package. đŸ˜± Par exemple, vous pourriez crĂ©er un projet appelĂ© `philosophers-stone`, ce programme dĂ©pend d’un autre package appelĂ© **`harry`, en version `1`**. Vous devez donc installer `harry`. @@ -483,7 +483,7 @@ flowchart LR azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3] ``` -Mais maintenant, le problĂšme est que, si vous installez les packages globalement (dans l’environnement global) au lieu de dans un environnement virtuel local, vous devrez choisir quelle version de `harry` installer. +Mais maintenant, le problĂšme est que, si vous installez les packages globalement (dans l’environnement global) au lieu de dans un **environnement virtuel** local, vous devrez choisir quelle version de `harry` installer. Si vous voulez exĂ©cuter `philosophers-stone`, vous devrez d’abord installer `harry` en version `1`, par exemple avec : @@ -519,7 +519,7 @@ $ pip install "harry==3" Et vous vous retrouverez alors avec `harry` version `3` installĂ© dans votre environnement Python global. -Et si vous essayez d’exĂ©cuter Ă  nouveau `philosophers-stone`, il y a une chance que cela ne fonctionne pas car il a besoin de `harry` version `1`. +Et si vous essayez d’exĂ©cuter Ă  nouveau `philosophers-stone`, il y a une chance que cela **ne fonctionne pas** car il a besoin de `harry` version `1`. ```mermaid flowchart LR @@ -538,13 +538,13 @@ flowchart LR /// tip | Astuce -Il est trĂšs courant que les packages Python fassent de leur mieux pour Ă©viter les changements cassants dans les nouvelles versions, mais il vaut mieux jouer la sĂ©curitĂ© et installer de nouvelles versions intentionnellement et lorsque vous pouvez exĂ©cuter les tests pour vĂ©rifier que tout fonctionne correctement. +Il est trĂšs courant que les packages Python fassent de leur mieux pour **Ă©viter les changements cassants** dans les **nouvelles versions**, mais il vaut mieux jouer la sĂ©curitĂ© et installer de nouvelles versions intentionnellement et lorsque vous pouvez exĂ©cuter les tests pour vĂ©rifier que tout fonctionne correctement. /// -Maintenant, imaginez cela avec beaucoup d’autres packages dont tous vos projets dĂ©pendent. C’est trĂšs difficile Ă  gĂ©rer. Et vous finiriez probablement par exĂ©cuter certains projets avec des versions incompatibles des packages, sans savoir pourquoi quelque chose ne fonctionne pas. +Maintenant, imaginez cela avec **beaucoup** d’autres **packages** dont tous vos **projets dĂ©pendent**. C’est trĂšs difficile Ă  gĂ©rer. Et vous finiriez probablement par exĂ©cuter certains projets avec des **versions incompatibles** des packages, sans savoir pourquoi quelque chose ne fonctionne pas. -De plus, selon votre systĂšme d’exploitation (par exemple Linux, Windows, macOS), il se peut qu’il soit livrĂ© avec Python dĂ©jĂ  installĂ©. Et dans ce cas, il avait probablement des packages prĂ©installĂ©s avec des versions spĂ©cifiques nĂ©cessaires Ă  votre systĂšme. Si vous installez des packages dans l’environnement Python global, vous pourriez finir par casser certains des programmes fournis avec votre systĂšme d’exploitation. +De plus, selon votre systĂšme d’exploitation (par exemple Linux, Windows, macOS), il se peut qu’il soit livrĂ© avec Python dĂ©jĂ  installĂ©. Et dans ce cas, il avait probablement des packages prĂ©installĂ©s avec des versions spĂ©cifiques **nĂ©cessaires Ă  votre systĂšme**. Si vous installez des packages dans l’environnement Python global, vous pourriez finir par **casser** certains des programmes fournis avec votre systĂšme d’exploitation. ## OĂč les packages sont-ils installĂ©s { #where-are-packages-installed } @@ -566,17 +566,17 @@ $ pip install "fastapi[standard]" Cela tĂ©lĂ©chargera un fichier compressĂ© avec le code de FastAPI, normalement depuis [PyPI](https://pypi.org/project/fastapi/). -Il tĂ©lĂ©chargera Ă©galement des fichiers pour d’autres packages dont FastAPI dĂ©pend. +Il **tĂ©lĂ©chargera** Ă©galement des fichiers pour d’autres packages dont FastAPI dĂ©pend. -Ensuite, il extraira tous ces fichiers et les placera dans un rĂ©pertoire de votre ordinateur. +Ensuite, il **extraira** tous ces fichiers et les placera dans un rĂ©pertoire de votre ordinateur. -Par dĂ©faut, il placera ces fichiers tĂ©lĂ©chargĂ©s et extraits dans le rĂ©pertoire fourni avec votre installation de Python, c’est l’environnement global. +Par dĂ©faut, il placera ces fichiers tĂ©lĂ©chargĂ©s et extraits dans le rĂ©pertoire fourni avec votre installation de Python, c’est l’**environnement global**. ## Qu’est-ce qu’un environnement virtuel { #what-are-virtual-environments } -La solution aux problĂšmes posĂ©s par le fait d’avoir tous les packages dans l’environnement global est d’utiliser un environnement virtuel pour chaque projet sur lequel vous travaillez. +La solution aux problĂšmes posĂ©s par le fait d’avoir tous les packages dans l’environnement global est d’utiliser un **environnement virtuel pour chaque projet** sur lequel vous travaillez. -Un environnement virtuel est un rĂ©pertoire, trĂšs similaire Ă  celui global, oĂč vous pouvez installer les packages pour un projet. +Un environnement virtuel est un **rĂ©pertoire**, trĂšs similaire Ă  celui global, oĂč vous pouvez installer les packages pour un projet. De cette maniĂšre, chaque projet aura son propre environnement virtuel (rĂ©pertoire `.venv`) avec ses propres packages. @@ -730,7 +730,7 @@ et utilisera celui-ci. //// -Un dĂ©tail important est qu’il placera le chemin de l’environnement virtuel au dĂ©but de la variable `PATH`. Le systĂšme le trouvera avant de trouver tout autre Python disponible. Ainsi, lorsque vous exĂ©cutez `python`, il utilisera le Python de l’environnement virtuel au lieu de tout autre `python` (par exemple, un `python` d’un environnement global). +Un dĂ©tail important est qu’il placera le chemin de l’environnement virtuel au **dĂ©but** de la variable `PATH`. Le systĂšme le trouvera **avant** de trouver tout autre Python disponible. Ainsi, lorsque vous exĂ©cutez `python`, il utilisera le Python **de l’environnement virtuel** au lieu de tout autre `python` (par exemple, un `python` d’un environnement global). Activer un environnement virtuel change aussi deux ou trois autres choses, mais c’est l’un des points les plus importants. @@ -766,11 +766,11 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python //// -Cela signifie que le programme `python` qui sera utilisĂ© est celui dans l’environnement virtuel. +Cela signifie que le programme `python` qui sera utilisĂ© est celui **dans l’environnement virtuel**. Vous utilisez `which` sous Linux et macOS et `Get-Command` sous Windows PowerShell. -La façon dont cette commande fonctionne est qu’elle va vĂ©rifier la variable d’environnement `PATH`, en parcourant chaque chemin dans l’ordre, Ă  la recherche du programme nommĂ© `python`. Une fois trouvĂ©, elle vous affichera le chemin vers ce programme. +La façon dont cette commande fonctionne est qu’elle va vĂ©rifier la variable d’environnement `PATH`, en parcourant **chaque chemin dans l’ordre**, Ă  la recherche du programme nommĂ© `python`. Une fois trouvĂ©, elle vous **affichera le chemin** vers ce programme. La partie la plus importante est que lorsque vous appelez `python`, c’est exactement « `python` » qui sera exĂ©cutĂ©. @@ -778,9 +778,9 @@ Ainsi, vous pouvez confirmer si vous ĂȘtes dans le bon environnement virtuel. /// tip | Astuce -Il est facile d’activer un environnement virtuel, d’obtenir un Python, puis d’aller vers un autre projet. +Il est facile d’activer un environnement virtuel, d’obtenir un Python, puis d’**aller vers un autre projet**. -Et le second projet ne fonctionnerait pas parce que vous utilisez le Python incorrect, provenant d’un environnement virtuel d’un autre projet. +Et le second projet **ne fonctionnerait pas** parce que vous utilisez le **Python incorrect**, provenant d’un environnement virtuel d’un autre projet. Il est utile de pouvoir vĂ©rifier quel `python` est utilisĂ©. đŸ€“ @@ -788,9 +788,9 @@ Il est utile de pouvoir vĂ©rifier quel `python` est utilisĂ©. đŸ€“ ## Pourquoi dĂ©sactiver un environnement virtuel { #why-deactivate-a-virtual-environment } -Par exemple, vous pourriez travailler sur un projet `philosophers-stone`, activer cet environnement virtuel, installer des packages et travailler avec cet environnement. +Par exemple, vous pourriez travailler sur un projet `philosophers-stone`, **activer cet environnement virtuel**, installer des packages et travailler avec cet environnement. -Puis vous souhaitez travailler sur un autre projet `prisoner-of-azkaban`. +Puis vous souhaitez travailler sur **un autre projet** `prisoner-of-azkaban`. Vous allez vers ce projet : @@ -842,23 +842,23 @@ I solemnly swear đŸș ## Alternatives { #alternatives } -Ceci est un guide simple pour vous lancer et vous montrer comment tout fonctionne en dessous. +Ceci est un guide simple pour vous lancer et vous montrer comment tout fonctionne **en dessous**. -Il existe de nombreuses alternatives pour gĂ©rer les environnements virtuels, les dĂ©pendances de packages (requirements), les projets. +Il existe de nombreuses **alternatives** pour gĂ©rer les environnements virtuels, les dĂ©pendances de packages (requirements), les projets. -Lorsque vous ĂȘtes prĂȘt et souhaitez utiliser un outil pour gĂ©rer l’ensemble du projet, les dĂ©pendances, les environnements virtuels, etc., je vous suggĂšre d’essayer [uv](https://github.com/astral-sh/uv). +Lorsque vous ĂȘtes prĂȘt et souhaitez utiliser un outil pour **gĂ©rer l’ensemble du projet**, les dĂ©pendances de packages, les environnements virtuels, etc., je vous suggĂšre d’essayer [uv](https://github.com/astral-sh/uv). `uv` peut faire beaucoup de choses, il peut : -* Installer Python pour vous, y compris diffĂ©rentes versions -* GĂ©rer l’environnement virtuel pour vos projets -* Installer des packages -* GĂ©rer les dĂ©pendances de packages et leurs versions pour votre projet -* Vous assurer d’avoir un ensemble exact de packages et de versions Ă  installer, y compris leurs dĂ©pendances, afin que vous puissiez ĂȘtre certain d’exĂ©cuter votre projet en production exactement comme sur votre ordinateur pendant le dĂ©veloppement, cela s’appelle le locking +* **Installer Python** pour vous, y compris diffĂ©rentes versions +* GĂ©rer l’**environnement virtuel** pour vos projets +* Installer des **packages** +* GĂ©rer les **dĂ©pendances et versions** de packages pour votre projet +* Vous assurer d’avoir un ensemble **exact** de packages et de versions Ă  installer, y compris leurs dĂ©pendances, afin que vous puissiez ĂȘtre certain d’exĂ©cuter votre projet en production exactement comme sur votre ordinateur pendant le dĂ©veloppement, cela s’appelle le **locking** * Et bien d’autres choses ## Conclusion { #conclusion } -Si vous avez lu et compris tout cela, vous en savez maintenant bien plus sur les environnements virtuels que beaucoup de dĂ©veloppeurs. đŸ€“ +Si vous avez lu et compris tout cela, vous en savez maintenant **bien plus** sur les environnements virtuels que beaucoup de dĂ©veloppeurs. đŸ€“ -ConnaĂźtre ces dĂ©tails vous sera trĂšs probablement utile Ă  l’avenir lorsque vous dĂ©boguerez quelque chose qui semble complexe, mais vous saurez comment tout fonctionne en dessous. 😎 +ConnaĂźtre ces dĂ©tails vous sera trĂšs probablement utile Ă  l’avenir lorsque vous dĂ©boguerez quelque chose qui semble complexe, mais vous saurez **comment tout fonctionne en dessous**. 😎 From ec2a6adaf14c440bdcd0fd3f4ca203daa8c3ba6a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 14:07:01 +0000 Subject: [PATCH 288/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 38f3ef0d5..e72483955 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Update translations for fr (update-outdated). PR [#15897](https://github.com/fastapi/fastapi/pull/15897) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for ja (update-outdated). PR [#15895](https://github.com/fastapi/fastapi/pull/15895) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for zh-hant (update-outdated). PR [#15896](https://github.com/fastapi/fastapi/pull/15896) by [@tiangolo](https://github.com/tiangolo). * 🌐 Update translations for de (update-outdated). PR [#15899](https://github.com/fastapi/fastapi/pull/15899) by [@tiangolo](https://github.com/tiangolo). From fd6ece32eeb27c9ce164bd9170f9d8e1db1dacff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 1 Jul 2026 16:23:18 +0200 Subject: [PATCH 289/290] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20GitHu?= =?UTF-8?q?b=20topic=20repositories=20(#15906)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] --- docs/en/data/topic_repos.yml | 370 +++++++++++++++++------------------ 1 file changed, 185 insertions(+), 185 deletions(-) diff --git a/docs/en/data/topic_repos.yml b/docs/en/data/topic_repos.yml index 9013ebc1c..ecfad6cb4 100644 --- a/docs/en/data/topic_repos.yml +++ b/docs/en/data/topic_repos.yml @@ -1,186 +1,191 @@ +- name: headroom + html_url: https://github.com/headroomlabs-ai/headroom + stars: 55017 + owner_login: headroomlabs-ai + owner_html_url: https://github.com/headroomlabs-ai - name: full-stack-fastapi-template html_url: https://github.com/fastapi/full-stack-fastapi-template - stars: 43447 + stars: 43994 owner_login: fastapi owner_html_url: https://github.com/fastapi - name: Hello-Python html_url: https://github.com/mouredev/Hello-Python - stars: 35831 + stars: 36226 owner_login: mouredev owner_html_url: https://github.com/mouredev - name: serve html_url: https://github.com/jina-ai/serve - stars: 21864 + stars: 21862 owner_login: jina-ai owner_html_url: https://github.com/jina-ai - name: HivisionIDPhotos html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos - stars: 21144 + stars: 21212 owner_login: Zeyi-Lin owner_html_url: https://github.com/Zeyi-Lin - name: Douyin_TikTok_Download_API html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API - stars: 18122 + stars: 18599 owner_login: Evil0ctal owner_html_url: https://github.com/Evil0ctal - name: sqlmodel html_url: https://github.com/fastapi/sqlmodel - stars: 17987 + stars: 18156 owner_login: fastapi owner_html_url: https://github.com/fastapi - name: fastapi-best-practices html_url: https://github.com/zhanymkanov/fastapi-best-practices - stars: 17401 + stars: 17608 owner_login: zhanymkanov owner_html_url: https://github.com/zhanymkanov - name: SurfSense html_url: https://github.com/MODSetter/SurfSense - stars: 14374 + stars: 15161 owner_login: MODSetter owner_html_url: https://github.com/MODSetter - name: machine-learning-zoomcamp html_url: https://github.com/DataTalksClub/machine-learning-zoomcamp - stars: 13169 + stars: 13445 owner_login: DataTalksClub owner_html_url: https://github.com/DataTalksClub +- name: peewee + html_url: https://github.com/coleifer/peewee + stars: 11976 + owner_login: coleifer + owner_html_url: https://github.com/coleifer - name: fastapi_mcp html_url: https://github.com/tadata-org/fastapi_mcp - stars: 11885 + stars: 11932 owner_login: tadata-org owner_html_url: https://github.com/tadata-org -- name: awesome-fastapi - html_url: https://github.com/mjhea0/awesome-fastapi - stars: 11406 - owner_login: mjhea0 - owner_html_url: https://github.com/mjhea0 - name: XHS-Downloader html_url: https://github.com/JoeanAmier/XHS-Downloader - stars: 11375 + stars: 11768 owner_login: JoeanAmier owner_html_url: https://github.com/JoeanAmier +- name: awesome-fastapi + html_url: https://github.com/mjhea0/awesome-fastapi + stars: 11478 + owner_login: mjhea0 + owner_html_url: https://github.com/mjhea0 - name: polar html_url: https://github.com/polarsource/polar - stars: 9894 + stars: 9999 owner_login: polarsource owner_html_url: https://github.com/polarsource - name: pycaret html_url: https://github.com/pycaret/pycaret - stars: 9801 + stars: 9818 owner_login: pycaret owner_html_url: https://github.com/pycaret - name: FastUI html_url: https://github.com/pydantic/FastUI - stars: 8966 + stars: 8970 owner_login: pydantic owner_html_url: https://github.com/pydantic - name: FileCodeBox html_url: https://github.com/vastsa/FileCodeBox - stars: 8305 + stars: 8376 owner_login: vastsa owner_html_url: https://github.com/vastsa - name: nonebot2 html_url: https://github.com/nonebot/nonebot2 - stars: 7544 + stars: 7593 owner_login: nonebot owner_html_url: https://github.com/nonebot - name: hatchet html_url: https://github.com/hatchet-dev/hatchet - stars: 7258 + stars: 7441 owner_login: hatchet-dev owner_html_url: https://github.com/hatchet-dev - name: fastapi-users html_url: https://github.com/fastapi-users/fastapi-users - stars: 6152 + stars: 6182 owner_login: fastapi-users owner_html_url: https://github.com/fastapi-users -- name: serge - html_url: https://github.com/serge-chat/serge - stars: 5726 - owner_login: serge-chat - owner_html_url: https://github.com/serge-chat - name: Yuxi html_url: https://github.com/xerrors/Yuxi - stars: 5323 + stars: 5926 owner_login: xerrors owner_html_url: https://github.com/xerrors +- name: serge + html_url: https://github.com/serge-chat/serge + stars: 5723 + owner_login: serge-chat + owner_html_url: https://github.com/serge-chat +- name: honcho + html_url: https://github.com/plastic-labs/honcho + stars: 5680 + owner_login: plastic-labs + owner_html_url: https://github.com/plastic-labs - name: Kokoro-FastAPI html_url: https://github.com/remsky/Kokoro-FastAPI - stars: 4936 + stars: 5085 owner_login: remsky owner_html_url: https://github.com/remsky - name: devpush html_url: https://github.com/hunvreus/devpush - stars: 4664 + stars: 4693 owner_login: hunvreus owner_html_url: https://github.com/hunvreus - name: strawberry html_url: https://github.com/strawberry-graphql/strawberry - stars: 4663 + stars: 4677 owner_login: strawberry-graphql owner_html_url: https://github.com/strawberry-graphql -- name: honcho - html_url: https://github.com/plastic-labs/honcho - stars: 4606 - owner_login: plastic-labs - owner_html_url: https://github.com/plastic-labs - name: poem html_url: https://github.com/poem-web/poem - stars: 4398 + stars: 4415 owner_login: poem-web owner_html_url: https://github.com/poem-web -- name: dynaconf - html_url: https://github.com/dynaconf/dynaconf - stars: 4302 - owner_login: dynaconf - owner_html_url: https://github.com/dynaconf - name: logfire html_url: https://github.com/pydantic/logfire - stars: 4276 + stars: 4340 owner_login: pydantic owner_html_url: https://github.com/pydantic +- name: dynaconf + html_url: https://github.com/dynaconf/dynaconf + stars: 4310 + owner_login: dynaconf + owner_html_url: https://github.com/dynaconf - name: chatgpt-web-share html_url: https://github.com/chatpire/chatgpt-web-share - stars: 4273 + stars: 4269 owner_login: chatpire owner_html_url: https://github.com/chatpire - name: huma html_url: https://github.com/danielgtaylor/huma - stars: 4133 + stars: 4203 owner_login: danielgtaylor owner_html_url: https://github.com/danielgtaylor - name: atrilabs-engine html_url: https://github.com/Atri-Labs/atrilabs-engine - stars: 4073 + stars: 4071 owner_login: Atri-Labs owner_html_url: https://github.com/Atri-Labs +- name: mcp-context-forge + html_url: https://github.com/IBM/mcp-context-forge + stars: 3989 + owner_login: IBM + owner_html_url: https://github.com/IBM - name: datamodel-code-generator html_url: https://github.com/koxudaxi/datamodel-code-generator - stars: 3918 + stars: 3952 owner_login: koxudaxi owner_html_url: https://github.com/koxudaxi - name: LitServe html_url: https://github.com/Lightning-AI/LitServe - stars: 3886 + stars: 3901 owner_login: Lightning-AI owner_html_url: https://github.com/Lightning-AI -- name: mcp-context-forge - html_url: https://github.com/IBM/mcp-context-forge - stars: 3797 - owner_login: IBM - owner_html_url: https://github.com/IBM - name: fastapi-admin html_url: https://github.com/fastapi-admin/fastapi-admin - stars: 3784 + stars: 3799 owner_login: fastapi-admin owner_html_url: https://github.com/fastapi-admin -- name: headroom - html_url: https://github.com/chopratejas/headroom - stars: 3701 - owner_login: chopratejas - owner_html_url: https://github.com/chopratejas - name: tracecat html_url: https://github.com/TracecatHQ/tracecat - stars: 3624 + stars: 3703 owner_login: TracecatHQ owner_html_url: https://github.com/TracecatHQ - name: farfalle @@ -188,139 +193,159 @@ stars: 3535 owner_login: rashadphz owner_html_url: https://github.com/rashadphz +- name: Rapid-MLX + html_url: https://github.com/raullenchai/Rapid-MLX + stars: 3155 + owner_login: raullenchai + owner_html_url: https://github.com/raullenchai - name: opyrator html_url: https://github.com/ml-tooling/opyrator - stars: 3136 + stars: 3133 owner_login: ml-tooling owner_html_url: https://github.com/ml-tooling - name: docarray html_url: https://github.com/docarray/docarray - stars: 3119 + stars: 3121 owner_login: docarray owner_html_url: https://github.com/docarray - name: fastapi-realworld-example-app html_url: https://github.com/nsidnev/fastapi-realworld-example-app - stars: 3110 + stars: 3109 owner_login: nsidnev owner_html_url: https://github.com/nsidnev - name: uvicorn-gunicorn-fastapi-docker html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker - stars: 2910 + stars: 2914 owner_login: tiangolo owner_html_url: https://github.com/tiangolo +- name: any-auto-register + html_url: https://github.com/lxf746/any-auto-register + stars: 2832 + owner_login: lxf746 + owner_html_url: https://github.com/lxf746 - name: FastAPI-template html_url: https://github.com/s3rius/FastAPI-template - stars: 2800 + stars: 2810 owner_login: s3rius owner_html_url: https://github.com/s3rius - name: YC-Killer html_url: https://github.com/sahibzada-allahyar/YC-Killer - stars: 2770 + stars: 2779 owner_login: sahibzada-allahyar owner_html_url: https://github.com/sahibzada-allahyar - name: sqladmin html_url: https://github.com/smithyhq/sqladmin - stars: 2739 + stars: 2759 owner_login: smithyhq owner_html_url: https://github.com/smithyhq - name: best-of-web-python html_url: https://github.com/ml-tooling/best-of-web-python - stars: 2723 + stars: 2731 owner_login: ml-tooling owner_html_url: https://github.com/ml-tooling -- name: Rapid-MLX - html_url: https://github.com/raullenchai/Rapid-MLX - stars: 2640 - owner_login: raullenchai - owner_html_url: https://github.com/raullenchai +- name: NoteDiscovery + html_url: https://github.com/gamosoft/NoteDiscovery + stars: 2595 + owner_login: gamosoft + owner_html_url: https://github.com/gamosoft - name: fastapi-react html_url: https://github.com/Buuntu/fastapi-react stars: 2588 owner_login: Buuntu owner_html_url: https://github.com/Buuntu -- name: any-auto-register - html_url: https://github.com/lxf746/any-auto-register - stars: 2542 - owner_login: lxf746 - owner_html_url: https://github.com/lxf746 -- name: NoteDiscovery - html_url: https://github.com/gamosoft/NoteDiscovery - stars: 2531 - owner_login: gamosoft - owner_html_url: https://github.com/gamosoft - name: supabase-py html_url: https://github.com/supabase/supabase-py - stars: 2518 + stars: 2530 owner_login: supabase owner_html_url: https://github.com/supabase - name: 30-Days-of-Python html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python - stars: 2470 + stars: 2483 owner_login: codingforentrepreneurs owner_html_url: https://github.com/codingforentrepreneurs - name: RasaGPT html_url: https://github.com/paulpierre/RasaGPT - stars: 2466 + stars: 2462 owner_login: paulpierre owner_html_url: https://github.com/paulpierre -- name: AIstudioProxyAPI - html_url: https://github.com/CJackHwang/AIstudioProxyAPI - stars: 2396 - owner_login: CJackHwang - owner_html_url: https://github.com/CJackHwang - name: fastapi-langgraph-agent-production-ready-template html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template - stars: 2338 + stars: 2456 owner_login: wassim249 owner_html_url: https://github.com/wassim249 +- name: AIstudioProxyAPI + html_url: https://github.com/CJackHwang/AIstudioProxyAPI + stars: 2445 + owner_login: CJackHwang + owner_html_url: https://github.com/CJackHwang - name: nextpy html_url: https://github.com/dot-agent/nextpy - stars: 2336 + stars: 2341 owner_login: dot-agent owner_html_url: https://github.com/dot-agent - name: langserve html_url: https://github.com/langchain-ai/langserve - stars: 2330 + stars: 2329 owner_login: langchain-ai owner_html_url: https://github.com/langchain-ai -- name: fastapi-utils - html_url: https://github.com/fastapiutils/fastapi-utils - stars: 2310 - owner_login: fastapiutils - owner_html_url: https://github.com/fastapiutils - name: fastapi-best-architecture html_url: https://github.com/fastapi-practices/fastapi-best-architecture - stars: 2256 + stars: 2318 owner_login: fastapi-practices owner_html_url: https://github.com/fastapi-practices -- name: solara - html_url: https://github.com/widgetti/solara - stars: 2162 - owner_login: widgetti - owner_html_url: https://github.com/widgetti +- name: fastapi-utils + html_url: https://github.com/fastapiutils/fastapi-utils + stars: 2308 + owner_login: fastapiutils + owner_html_url: https://github.com/fastapiutils - name: vue-fastapi-admin html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin - stars: 2148 + stars: 2184 owner_login: mizhexiaoxiao owner_html_url: https://github.com/mizhexiaoxiao +- name: solara + html_url: https://github.com/widgetti/solara + stars: 2166 + owner_login: widgetti + owner_html_url: https://github.com/widgetti - name: mangum html_url: https://github.com/Kludex/mangum - stars: 2119 + stars: 2125 owner_login: Kludex owner_html_url: https://github.com/Kludex +- name: codex-lb + html_url: https://github.com/Soju06/codex-lb + stars: 2122 + owner_login: Soju06 + owner_html_url: https://github.com/Soju06 +- name: kiro-gateway + html_url: https://github.com/jwadow/kiro-gateway + stars: 2068 + owner_login: jwadow + owner_html_url: https://github.com/jwadow +- name: open-wearables + html_url: https://github.com/the-momentum/open-wearables + stars: 2036 + owner_login: the-momentum + owner_html_url: https://github.com/the-momentum - name: slowapi html_url: https://github.com/laurentS/slowapi - stars: 2000 + stars: 2022 owner_login: laurentS owner_html_url: https://github.com/laurentS - name: xhs_ai_publisher html_url: https://github.com/BetaStreetOmnis/xhs_ai_publisher - stars: 1980 + stars: 2004 owner_login: BetaStreetOmnis owner_html_url: https://github.com/BetaStreetOmnis +- name: FastAPI-boilerplate + html_url: https://github.com/benavlabs/FastAPI-boilerplate + stars: 1984 + owner_login: benavlabs + owner_html_url: https://github.com/benavlabs - name: openapi-python-client html_url: https://github.com/openapi-generators/openapi-python-client - stars: 1960 + stars: 1967 owner_login: openapi-generators owner_html_url: https://github.com/openapi-generators - name: agentkit @@ -328,34 +353,24 @@ stars: 1944 owner_login: BCG-X-Official owner_html_url: https://github.com/BCG-X-Official -- name: FastAPI-boilerplate - html_url: https://github.com/benavlabs/FastAPI-boilerplate - stars: 1931 - owner_login: benavlabs - owner_html_url: https://github.com/benavlabs - name: piccolo html_url: https://github.com/piccolo-orm/piccolo - stars: 1904 + stars: 1922 owner_login: piccolo-orm owner_html_url: https://github.com/piccolo-orm - name: manage-fastapi html_url: https://github.com/ycd/manage-fastapi - stars: 1903 + stars: 1905 owner_login: ycd owner_html_url: https://github.com/ycd - name: fastapi-cache html_url: https://github.com/long2ice/fastapi-cache - stars: 1865 + stars: 1866 owner_login: long2ice owner_html_url: https://github.com/long2ice -- name: kiro-gateway - html_url: https://github.com/jwadow/kiro-gateway - stars: 1853 - owner_login: jwadow - owner_html_url: https://github.com/jwadow - name: ormar html_url: https://github.com/ormar-orm/ormar - stars: 1809 + stars: 1806 owner_login: ormar-orm owner_html_url: https://github.com/ormar-orm - name: python-week-2022 @@ -363,39 +378,29 @@ stars: 1806 owner_login: rochacbruno owner_html_url: https://github.com/rochacbruno -- name: open-wearables - html_url: https://github.com/the-momentum/open-wearables - stars: 1782 - owner_login: the-momentum - owner_html_url: https://github.com/the-momentum +- name: WebRPA + html_url: https://github.com/pmh1314520/WebRPA + stars: 1781 + owner_login: pmh1314520 + owner_html_url: https://github.com/pmh1314520 - name: termpair html_url: https://github.com/cs01/termpair stars: 1735 owner_login: cs01 owner_html_url: https://github.com/cs01 -- name: WebRPA - html_url: https://github.com/pmh1314520/WebRPA - stars: 1718 - owner_login: pmh1314520 - owner_html_url: https://github.com/pmh1314520 -- name: codex-lb - html_url: https://github.com/Soju06/codex-lb - stars: 1709 - owner_login: Soju06 - owner_html_url: https://github.com/Soju06 - name: fastapi-crudrouter html_url: https://github.com/awtkns/fastapi-crudrouter - stars: 1692 + stars: 1694 owner_login: awtkns owner_html_url: https://github.com/awtkns - name: bracket html_url: https://github.com/evroon/bracket - stars: 1682 + stars: 1694 owner_login: evroon owner_html_url: https://github.com/evroon - name: fastapi-pagination html_url: https://github.com/uriyyo/fastapi-pagination - stars: 1658 + stars: 1670 owner_login: uriyyo owner_html_url: https://github.com/uriyyo - name: langchain-serve @@ -405,91 +410,86 @@ owner_html_url: https://github.com/jina-ai - name: awesome-fastapi-projects html_url: https://github.com/Kludex/awesome-fastapi-projects - stars: 1603 + stars: 1608 owner_login: Kludex owner_html_url: https://github.com/Kludex - name: coronavirus-tracker-api html_url: https://github.com/ExpDev07/coronavirus-tracker-api - stars: 1567 + stars: 1568 owner_login: ExpDev07 owner_html_url: https://github.com/ExpDev07 - name: fastapi-amis-admin html_url: https://github.com/amisadmin/fastapi-amis-admin - stars: 1554 + stars: 1559 owner_login: amisadmin owner_html_url: https://github.com/amisadmin - name: fastcrud html_url: https://github.com/benavlabs/fastcrud - stars: 1519 + stars: 1531 owner_login: benavlabs owner_html_url: https://github.com/benavlabs - name: tavily-key-generator html_url: https://github.com/skernelx/tavily-key-generator - stars: 1507 + stars: 1526 owner_login: skernelx owner_html_url: https://github.com/skernelx - name: fastapi-boilerplate html_url: https://github.com/teamhide/fastapi-boilerplate - stars: 1490 + stars: 1491 owner_login: teamhide owner_html_url: https://github.com/teamhide +- name: full-stack-ai-agent-template + html_url: https://github.com/vstorm-co/full-stack-ai-agent-template + stars: 1484 + owner_login: vstorm-co + owner_html_url: https://github.com/vstorm-co - name: prometheus-fastapi-instrumentator html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator - stars: 1458 + stars: 1471 owner_login: trallnag owner_html_url: https://github.com/trallnag - name: awesome-python-resources html_url: https://github.com/DjangoEx/awesome-python-resources - stars: 1448 + stars: 1451 owner_login: DjangoEx owner_html_url: https://github.com/DjangoEx -- name: fastapi-tutorial - html_url: https://github.com/liaogx/fastapi-tutorial - stars: 1404 - owner_login: liaogx - owner_html_url: https://github.com/liaogx -- name: fastapi-code-generator - html_url: https://github.com/koxudaxi/fastapi-code-generator - stars: 1397 - owner_login: koxudaxi - owner_html_url: https://github.com/koxudaxi - name: aktools html_url: https://github.com/akfamily/aktools - stars: 1394 + stars: 1431 owner_login: akfamily owner_html_url: https://github.com/akfamily - name: RuoYi-Vue3-FastAPI html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI - stars: 1364 + stars: 1419 owner_login: insistence owner_html_url: https://github.com/insistence +- name: fastapi-tutorial + html_url: https://github.com/liaogx/fastapi-tutorial + stars: 1418 + owner_login: liaogx + owner_html_url: https://github.com/liaogx +- name: fastapi-code-generator + html_url: https://github.com/koxudaxi/fastapi-code-generator + stars: 1396 + owner_login: koxudaxi + owner_html_url: https://github.com/koxudaxi +- name: yubal + html_url: https://github.com/guillevc/yubal + stars: 1388 + owner_login: guillevc + owner_html_url: https://github.com/guillevc - name: budgetml html_url: https://github.com/ebhy/budgetml - stars: 1345 + stars: 1343 owner_login: ebhy owner_html_url: https://github.com/ebhy -- name: full-stack-ai-agent-template - html_url: https://github.com/vstorm-co/full-stack-ai-agent-template - stars: 1316 - owner_login: vstorm-co - owner_html_url: https://github.com/vstorm-co -- name: bolt-python - html_url: https://github.com/slackapi/bolt-python - stars: 1308 - owner_login: slackapi - owner_html_url: https://github.com/slackapi -- name: bedrock-chat - html_url: https://github.com/aws-samples/bedrock-chat - stars: 1304 - owner_login: aws-samples - owner_html_url: https://github.com/aws-samples +- name: Chatterbox-TTS-Server + html_url: https://github.com/devnen/Chatterbox-TTS-Server + stars: 1328 + owner_login: devnen + owner_html_url: https://github.com/devnen - name: restish html_url: https://github.com/rest-sh/restish - stars: 1303 + stars: 1321 owner_login: rest-sh owner_html_url: https://github.com/rest-sh -- name: yubal - html_url: https://github.com/guillevc/yubal - stars: 1302 - owner_login: guillevc - owner_html_url: https://github.com/guillevc From 122f1b58f4e0fabfefef3710a8c8247bb2bd820b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jul 2026 14:23:45 +0000 Subject: [PATCH 290/290] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index e72483955..eb72ce6f7 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -34,6 +34,7 @@ hide: ### Internal +* đŸ‘„ Update FastAPI GitHub topic repositories. PR [#15906](https://github.com/fastapi/fastapi/pull/15906) by [@tiangolo](https://github.com/tiangolo). * đŸ‘„ Update FastAPI People - Contributors and Translators. PR [#15878](https://github.com/fastapi/fastapi/pull/15878) by [@tiangolo](https://github.com/tiangolo). * đŸ‘· Remove not needed `allow-unsafe-pr-checkout: true`. PR [#15876](https://github.com/fastapi/fastapi/pull/15876) by [@YuriiMotov](https://github.com/YuriiMotov). * ⬆ Bump the github-actions group with 5 updates. PR [#15872](https://github.com/fastapi/fastapi/pull/15872) by [@dependabot[bot]](https://github.com/apps/dependabot).