From 016d5bb36f2e9eaa30c462b6767a8a516bd58228 Mon Sep 17 00:00:00 2001 From: Marcus Kammer Date: Tue, 1 Feb 2022 20:40:22 +0100 Subject: [PATCH] Update werkzeug docs --- info/werkzeug-figures/debug-screenshot.png | Bin 0 -> 209112 bytes info/werkzeug-figures/shortly.png | Bin 0 -> 67757 bytes info/werkzeug.info | 18508 ++++++++++++------- 3 files changed, 11376 insertions(+), 7132 deletions(-) create mode 100644 info/werkzeug-figures/debug-screenshot.png create mode 100644 info/werkzeug-figures/shortly.png diff --git a/info/werkzeug-figures/debug-screenshot.png b/info/werkzeug-figures/debug-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..14326468943bf6fbf00d73b4acb0ae11d041ae05 GIT binary patch literal 209112 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

E4g1Mq(p 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�}-1{mpa*y1(chCqsxAHvBb1=F#`pX8Uh>nBT+~0<#;X7mICT`!qCKXbe_6% z=i|hSR`9*WFT*=J!r>i(G8=|d7TPGRnFO47Sw-dQLTa*T!^DUsf^K!ddDKLIn+2t1nZ4vgJ?u-RVWU2#&G{91cX#=q}b90{j|Jry=re#3P2W3S@B9q|7q zOxI{bR>c5^h8fb3J`hQ-x86XK5%nN#h6L;XsCB9;J*2TGsH|nf!{=ek%odZKHR&f7 z{qv{uv37UoYrnPmN|vk#tBa!2;5sIE)sZsYQlJ5f@^=s%wkVt)2m)7&6FEWRd_XG- zrZxs&H{ar{*~?XF7j{pYw59+JH<^K3D9iaG1Z3u^2wjKhOA!QeBzF>8q8g*3YuK7ZXeU974l6`M?Nfq!^H<8Lgdhh2h=q6)WG z;73zuL+NC=BkYipo!!9tbjOL!z0MOay3ba(akU7dO<(bie~~l5-ZMEs+r(0mCDgKA z?zf&SFIW>0RYy&2b|`vK#5ilo#pinZ!yH?s^Exvc7&l!0HJ!W%vBZ4C^nEfiFbl9Wq}zAyO$d$1=s+tOJPDUL?O?n!qi@Y;NW5Tqpf98qh< z4$G(I#`F=T>8o{|4^2qKbnt8ICdX+}njt3M+AhcXS98l#NMogTtn_Hr!0zmQ7n9y*5j5-_JEd#|_;tWz7FRosZnR=W_Gi z1Ta)`9FvwPomxuP-Q-kqpbVH#RSai$Pr{zI-QX)PZGDE1?Rf<{GxafVL|S#Hk74cd z*fXg$eT54pACois9wH9;sarL3*vYOMU*kNokRUeuoygvHGZ|M9%*CrGIH*DJeC6Sq zIe}u=pLjUukY75bZe%tK#oBjpRG{gx0S#6h)N{(1$=;sb7Imb57zONhbAO~@bTryX zt22Y*k6eE8$;Bg{@85Q1E?qCn8v6q7IH_8npPlL(w&#%My61uVdaqNt!O{lA0-~gW zJhd$HG-(Or=K~FAQ|nzbbpVP{F|0L>q|+JiyoGaet!b!*Fjfgok$#1%fc`Yd;od|! zm%o5+FkYi#V0CJ^9r_$=$$x8!Cit)M;0S!OLO@_8THu@W(5(mKOp*gRWjtpfwpLrZ zW+4m?m+R1W+(a=XS9|kQVTT(3%oN4 zmphRuQZ#iUw*2a~*-DkXW@zVnd_=T_a^#{S*XA*C;Jk$ zTHBYO4Hy}CSKAVRbxIfdVjV@zhG90nIp~$+M+k>zG#{&t1LehYEkTW-u&pxvuOtRQ z4x{5lRM?Tjg;%?C`Ly*+zDnEtA1SU*?1Pg^$*{0)ai8S)CmqgNij|J=3X8Bt>4QCv zEq|Jm^)`~n&J}(`FGN@X8gPfk4*%g(3F)w7L67jq+M{Yt@Xb3U+Nkh{K{vwr3Uj<) zmA)}MSD|>r9qMtx2i(Z8u;|X3*xCUY8$>}->I$L#lmvJv&Xzm?0yL)vo1kODx}u1s z`%ZPv&jr4b7?F^|CFz7s3kz&UWSgMu3)!jC!&ac9U~wPLmk{*WP*zXJ%2afl zAnZ%=siGCrsc=3n!(~PZ@vB&JU_EGcr3aXpq4~&2R?BaNNe=VbsBYn`ru|qS*Evv3 zNS%%pSvlKiY`A{sclmnjP(scH)0*a~t`J%o>W6UZ>E^Wj#!- zxVIF=+V(IjVJ8z|he{vC);>X_4bw(?2gCS{lEvxn&kge%k%) z)CPqthHSP1I<#XKo2MuGa}~cjVvHCe42p{;&GKqvSQG+ElGx4h?8i zoLpJf^l&Q;M0N5-Yd@W)HN!Svh&rax{77T*mh1#*zV*T`(%Bom$-ojIF?E=3h65vC zP7P0MuXuZ|cyd(KsPbBS>`81>>R|okFU&B~>M=bI zXO{k|PG>aZ?eex6?LzKL-L@{0E;T-AvXDNR4{X%xJ~X$CaSOrv3Spe{_F%H}GK;ZY z5%$m^xiYvUkKvh~=}4IwDU7*R^9r9xTdykhR+raF>px4bTyZ#Ij~`wZhj7k6wt+(5 zq!3;p3T4aHo7hlWVrmM0N7>$a3e`RSnELv_^E3m%TbymaHDkfu6AVKDLJa5tc8!pt z5Lug3G>=SH%wwk+(rjwAn&l4=j)Ny6CV)WriC5FewR2%}JJIrdf3!LNwvue{yv}Yj zoBHcM^><@4dcAhX_2r(xSepJ3z3Y&_z0legER>iB z{3_h0GP$9nmOAQj*wol}7`9?ZJHv1j4tsMv*xQXbm2$cR!ANNExAf=}s%RC1q3?LG!~=EQxCG1~Vd z%WGCvHw^#=9sl3dqy6XA1KU>ilB`tvN(Z@3ykJOqXQ zz8%r8{aFnm;At;-$inN+S;HNU`E($}hp04*@*C)VhQIO!wVlj(!{5a$I-rP>o zM?4hll*(XUB{h#CZ@h2MPp*1>KRCj3Y0q(w8jy?^N1NQgQUTWT?FHbCgIpGS79r)j z&+srnYRZ8E!rnxKeqF^CJ2|iW*HBciI|{PU_GY~UHl#_mpdSta`w1R%s^;ZkzmWXh zfT7)&1?$-5CBL%>mPjnRPt0kv?ybY)<3#{Pm2VViq=|#nryEeTpZY>Vfi1i{80m;k zFL-Z8soo z=(S@G7mTQ=@Gw6+6B6Q|NR5;qU-T;vAEIh5t1JsjiGz9+YlF(Os|Z94N9ObbczA%I zY?ZBBE`BDq^b05iQ^G+zairweT=6HP0g0`A^~z8uMe-YQf4xU6E{h+-C;B<#HE0t6 zQltvRu$87AGIB5zYd^Wm|9dIWe=&X~ly>4>=tjl^spefDhuZ%>gf^d7JVg1?UT}s+ z-AdjOzmbu?Jk8@|y}dGk#^eA1{X`{vSz)W2_m)Dbyo*=ThFI>7vA;U-UuE(XYE%%B zm`G$8n*`Cj;08&TJWd}_Ekrzr_1wMMvb!A^k_TsLN;)4mFY^qV*&%<)Q4d`gQIy6m z&=sA6ehdih;&IsySI|?|kIdivz0ACIo6*(S+>wzmdKJjC6<-)f935`s_3 zf<)M+d2Kas6pP&!aWb+iKBdN&WwcxZhLXfEYGJ6s)zJ4SG(PN}AW91VlmYRq zl{boj7TUo%99{Jucd)JN{eYC}^}OhK+zagNyi%hW)y)k93lmT?FslpR*=?!Z3WT>YzHu(X9$a4TMnQ2Tula31b+ zy;*yVXP^F;=VzlK6h7&*3hlGhorM667uqf4FJ3N#p>B(~|LjS*y?k#Sozd%XBO#lS z4sR!v8@vS|jjVV(H~nMZ8NWmT0_sV90{No;&dzkxXr86&U;fd8&rzLw zsrYr}%|*m^^Q#57Jp>ZL3jd$x^>B5fP^nfWO&kK!&{XqzF~m!Qf)LCgKFT=v1?%nZvRE~e*Zl*-%)CRU`zVL zn-F9w*s_@TpSJCP2U5m^zhz+VbRXVhSXo&W`=%@I&vAk`u@J;lJWKE{H!9mg=7|`` zQ5sLj9y+qP__czcbSbjKJ3BAS2h zNk#8%ynalFMj}GUss?4%qXn!MX*O}G7{m=7;PY&u{&WRz-tc7b@8|kn*6;bg7bE|f z!>DiEo})^%)p^?gy1)mFl=M&fe@(Eo{6DRyPs=m@PeJp^Ff;Y zQ}BnAKHTAdRr0^<`={@H`T+_5m`Wco$v-w0_`i}6lK-)Xe_7uDw=e&zTi<{J65y|5 zSQ_rWJ@2T=WEI~=A24eo&Qp4Nv%dLo@H@5GXkU0E_<;RyKRertD}nVYy zK~IwM+c3Gw@A)DBR($AO-*)u+!*A-yzqgWU|EGS!biQpp3yE1J@} zooLN--vxgpDd7Ug4{7tV%6$jkt2&o zqWVXE0B&|$+*RwX0D5#9ptWLSzUA>uh=A}3S$^9{SVPVtH<7Ke9>pe5gbZeD$Ka#! z6~HPkhJX!H-;LOi>^)GKu-m=!C-~IaJjjiIaza|iRx~4MoQ4aY!_r$%kRoQdmTwl{ z6YFoxXSRD)ibo|S`E`R&+TdFsF3r??w!dBV82Ct#;r0q{w0;YVxG)n68D?5fV0kVZ zPPwZ2s&S>7l@d}k)>(`RAwhhLxmpnBzieY@5HGsD5d$P6zBXDTL(DRa(v*9jQ+$=O z8D1R`oe5KN;lL5jWj@XSDeWAU`w=IewUa<_BcG5Ie3{1{b^8`s)qFr_;>(DR11$a% z9*>O`81+Hv3}Xp}@QM$t0z-|@fF9)=n3tqBaJ+%BcoDfAv+qWWc6j)5o7uMVdkIa& z8BzS)sqSWTRo#~w7_m*bS(w}gUWg#Eu$voC1Z8o?^(0Wq%r&nAgh#I=>wGpaB?P`8 zg3#C$P3TFQh|;*M7KIOP#<3n92Ij0SU%XZbo!1AYfKielo&{H6f@(^lc(3VV2u2bM zAC*&ob2roNfgX4_KK{j88E(|1sYa3FQ!OYfz%cBTg_!U$OjlVstYK~VRX7-XNCQJ$ zW?FdQJ_149T&JjMXwcZO>>=o}s3SQl{@7Bq4W?EHT#htQShaL-zF0??F(k=@{DX#$^ z$O0qyhc?_@C)B3_q_11;c0T@orON=-%NtOBP51_K?H(aT$17;M?B(H^J23H>2O%Ba z-){Tz?IW$dg0QHlsG#*|h`L#jw)n}sNyh~hQnE7lPkO*wn}FasVY!fj3uwgnnVxfH zyQ6VQaY0e%?jr?G(u`GcNpYc~aII=?qzaVTZf~{y!oreZ{*J+3g^oIt?`WilxK(^| zd_+~i92#N#D1qv#hJV8x;K2b3Uu|Z7HP+up>b!5(+qBfcqy=VWw$24vY=R)nkcA3D z<5JUtvto1cg*eKZQ-jwauLpN*U>zKP4mVMdY= z@b(t6jnB3nRkm&O#`3b>+yy*X&xRPGy?uFLy;#I_Tsdt|EUg4&;U>qW#Vj77d=n*w z7fLaY!%iIvK;u1z(@2H+sy=`-eV@ckY`QA6lc$$d6}3w9TWd~P0GWWC)GcoXFtKDw zYt)j{MbA~J5b<$14F_7~!~?W;?viP&`=E230Wv z;6-HzZ>kwB&<-8?nOT7m@#vt&|9qT%)3UJq0PH3v2Yd?H?g8q5E+kcbdLo+YT8P$d zk1BNK+L|+0W_B0qBf--D7_zKBZl(_UeQowH`Fk}T!6QsqjeQ;F#zQ2U#cgG0jb>fP z#uZ$M8BYbJ6E_IE2YWHvsq@X5^%^r)BooapwGhsuSrarr;7CjXF`6Dg-?b{|Q=Wg# zvKSBV=@iN83LZWE$tPk7eZb?1$G#6Qy^a`5L1_%H?0|BxoQ<#IwAXN!wdo{tn6Z_U z4NmTMKaj*76n?0a#^m09vw_BU37`%l*wv;BCdB1 z8odh`6WiY+iWdnI&fOLVUYL5q@kk7&ibX)+d7ATI9PG+Qa;SG9YfSm%uh6p-b|+bV zyJerV9WG(pF1)1g&W1YWFNPi+55nMRPomXjwD=g?Dn2ZmCd>QgM(to>!4Dl3l5pM^e0JYJICh}0DM4j9&~h~} z7M;etcn(8RZ@l@?H@Gz%++=kw+|79*)h}B`BKqL7{)8*ctJ58RpfWKwt%VvlA8DgQ@X(OFq}oOjYlABHNN3rl6;#D8NdWDUpS95f+(9mHu+diuitl z>cDV>Xyj?eXtLyypi1Id%n766QzWA$#&|tHEq=TNJ2<$IbkU7l;X%i90_grn4r{K> zh-y##@+&cR?FweK@8I5HAk5R#b#KE0uq{*d(KI*aiMS9{mQZghS4wl8P3>{@K3}5Z zS(t*s_%*0|Fy97jZg?|ZTC>&vV4=sNB0yb_u_G7jbZs%YsmVg3yXQmv@Se|$RkOTE zJk&>NG=9Q$>=tHT*|)>>LQoa^foLyaUgKYoou>2N|bmrr{3Oh8<86<)kB`r0Eo#!c=o0}?XpLfc zfh!kgJixpflFCY@9N9IT-Oo?1PH6{f3keAuVnwCp7#L4OtcuDtNx{y>iyH#KqS>PW zJ>rTQbfhG=%Mxg*UxRdd?*52BT#PUlEcTQTl4C>&YCgm%sHVmvK%Dw$FY!w_8)KW? zfVW63k@KbkRNoc9>@j+o*f_h%AkpE`qE^;B)iB0`=i zd=_vrb0yQ@jP4iUj9#m-39@=qon5JEGXmaodv+3zwhRc%#qqZxlj4yr1L1nY%m}ka zwl;5J=V zj(G>QFw`oMM&G;E5~o{oNKlv!4?{0Y1shOaDX4RmO*TkzaInWvd#s)N9^H+%&s-(` zxJ(Jpx8rc&tqXfDlg3@);EV;#E66N$QC?A7m=(*QUVHGb>j>A>WQ(}bc*5rbYSuF2 z?NuSe8SxT3fM^&`gbIZX`Jq(sYoa(ZGqI`2+bSoyFO!<;f3 zVI}V&I_i&s?{V6)d`8D*=Ry+-o_7y&(WWY=9>zy?QWBQ7V9jmDP_G_~Ku#nT@QXhE z#gH!Xan~f#Uy`vFScBFSY_LiuTuN-RuoW!9F4z;z5nk&^LjX#ZIM5ZQY0Ls zEdx0lZD|__J3p{f31EG@0W_>-iW5!^6L+@-D7TI4bjTH9C@rs>#rHntNKcnIsHCVK zJ4pspx&FK{@HO1_MwFmNNgTJvV_aDZdPNK9nXDoNDE zt5Vis+dHu=fHJxpS|TE53-)BNJf^y zI}P5*mRE}|LxkyeDPnz*+i ztw^8}*E*q<@c>q#CUG?Y1kA0&_!^l=d~X4tK8pa%ihHo~DU9f23FFX$E^e4Kp#P<_ zw>BI7au_DzoI&R>%Sg<`ic3_CviLCd;}hBU)sz2fC%JCGzlf0%tgiV5K=7<@G&Zp5 z_baGK0)Pf9Ei;{eyB{zGl#{-`AykJ+37zwIXnKB(rHW1)G0Wk($%~u381p=0KxLj0 zeJBvEShG}Ix1E3N5se7l$k7S2EoumQM(;9R!Z0VyB16`&C3rCA4!j5L=jQ4#Ca7rj z&dwgB4KKV0DXIzugF2r#yJ`oH&gMYSQbgVOc>8o_yufT3d~4HKk;oDPLQ2H3WMIX5 zc%u^9z78O+fercCC2=Tk(ikDF%0F~kx6n8{4Ao$;)tG@6de%bj`;3Nyzu`ATV}#|n zgqW>PV=R<9_~i=AH;u4wa#w|>fkoSg>DgTU0lG$juhEeYi}nZS%F$VzVD2RSpudN~ zvV(@vIXYUh6VVV1n^=kU&$JyBU$V+7~x9&Pss-B6EZ%1}3<=*7qt@H=U?q^v` zv2P)Q<0eGt>z;e3vfpIFZWn7pRdZW#YPF z)4p)~JA&bRAu7cq;YFMlf*RaP=-p%@EJz*PY^VA?*`V$wBIx8*oBhf}oy^a-_@yKS z#B6m0jOAe`xK-JlC_zl$>@*l-w7z>}4d+ae`*!QBMd(lS-&{2N4pe7c5TP!VA3-I_r= zD%jkV2YBKrR?tB51IrWhu}U+qff6kQb?Z`OTv31PZ@U8Mm5y0mZxxb1O=t*E+*`D%xl1usI<^;AaH}gm@nZZ6c>f8r+D5C?qjb9mWolLq9z$k zuDJi++52masM0f+JjRv3*EEETdz`Iu^r~)Slge)DTj!1Nc0~VRVnjRN8G%<{UZ^CB zI?xM~z4^Hb1k9&k>vNf{Cul*uu%86Q0CHa+{s0JrkQhO9-q4|UY}uregwx-(BEbne zudl_*EEpP@Gybih*tBr{!#fH|36QY0&PH)IevC!DSWzqw$mX)=4bL08=4$gdv5R4y|;P3!jr5r_$=d|T51 z5z~`El^^vq->^><*S%a%s4qAk<-vi?P4(y0Ye1{AH&pmwivXA3YK1IqSv0Xan>^(w z0Am)WzK&xH4+3%My{p{_WJq5cEEm{piAW+q#mjDXZ!+ao1phe>Q!+TmYuK+Nfj+j7cu)#ZT%)( z3)9R{CSTx7gme^7QqUe%`a?A-`QW@DryV9-AZqdTWHW>*h@-qH|D8}-0U@DNEqQQi zewQb2e=5Z}JzZN?8`?XJycYdjQ4<%p#Q+D|WxD&fPou2T)-ObsX+?2&--uYKiydlw zGlK4VGfA9eVL8($LhH4{?+HSO#@Q%xh|ohWqk^ZcqbDc)@+;-0^NVNWx0D0EL=B?% zTaAzd9rG_VS?uA2T2cZXFP!&dSg*(Shki-DrCI9-yYRFpfM%FhZH|gFy$d{QI+~J^ z^-hC7joZ^hbNh_i?cG>inuyjnh~>|bl1$_$RW7d63@>xn%wvIyW7 zdY(ty1?`rUtPn51$>UVVPF9`IIN28RTYpt7t9T1i`wPyghxn1^%?N$NE${EV+sJE@ z1jpnvJZvcz@JmH@tA!PC9u6=r_4MNbFW{XZaD%vwdmx_SVbf@ql+7+5EW(}V?x{CL=JV|V$;MqpOipYEN1>$L(M$KVb9P#f4kykJmgt%G&+@I_!^wmw2f z+3(#s2ay^V2-yBwK5{JDei9P2EvBR=2a^r|7}_b%^PMOQ*sIVj=u=CJo(zR0Jh9-c zvDFAJGXyb>JrNF!24q25ylFcNR>I=zU0$~p5E3ere2K2k9O$G6<>k#UE8;Xfn0r>x z#Et=azY37gPEASjtJ?FpX$sm=KE!`HW7+8XIh{{eg3D0_WkL3XmJ6c5FC;7S3;PmJ z=km_p1oaK?%RscJ^Cyn9p*nPU1XLq||g}u^_ard+ns4871-#Dn~twqdw@Es4e zVXvUH6x1q(|Kr6IudN&^do5Q&*a^7Krp=FoA|I?F;g(TcBPDnvvjG_{pvy}0{UXcV zY!`?+ne14CEXA81#b8xSahz1=FzI!$y%~;>cs#(yjSEpf%l`I>ZQY3(O`AAe&^BfC zSJwxg;uK=#>(EfSLtS4VjVbJ$xB@KYAlgt#6sV_Db&H(3tW`N;TC}<-PN6SfUJ{on zN`nD96&81>>qguD03|F;(k}>d-JmOkzaN+ zO2EVJOFsN?*2q`~gtEMN9420%AqLpKsx2?ceLOB6IzKMS2+ax1ersfckB8sJ{T z){7fOK^0SV-Gc^R!E>S4u;{Crj4dU0N4mcjLb%mdP8c1vV7YiqnO3U9nm91bS#kzDps$|7*yikRQcn!vzt4%D_1nQopICp>Nv%%yk{crR&y#8fjJ!e@+ z>oqJvwfKPZ)G5N6R`3cqH~5n|53&9J!*%kCn!w%_Oxld0u$%VC56tHJu!5YoAt{(y zH@ynr_=r~WX`U6A7tDnHK>F|X#u*0>u$bS2jCT3arLnNR?^iO^SuA)4O#@J^XS>o; zJs2^1ogtxer|L!92oqvlgfIOB+~SobuNDx9iSy-YR_&XQIvoZ(9o09JRdNnnY|sG9 zbcDoRh(agcY^QK7$|s6HZ0XTwCGoQk)wm7Elf)`K_QmF%Y{lDSNkB0rAevZ9_*cU? zMJUP*(q zTdZPMu*~ckxq)bL_vt$mA*S>=q51gq#|N)QC1L}+WxyU>tjc4wU{ppWCAx? zB4OtPgif4C5$uN;xqfH=iuW++J<3v1(@^5tU4;~E@u+zi)13b&yp2hgE zdXUoqafdvI)HvQn5DCe;5oUqG21d56p{ibj_D-q?=y3V;Pp$))Gx;z)`Fs=n28KK! zEfzA^g8gh?V-by|)L!uf<$m@z-`=B{*m`tl|6|1Sl+zWE#*N#(*#N?G5w&x&1r;%8 zj?L)^P57CTwxR`f`q+}jR6|zOY!W6xH!>PeWRO=TV5-f_8G{Z=#Y4lqthDpAY7{0u zHq51TYD+ zHfJ*&&ZIMb1+9>-CP{lNCLoh#d&2?y0XpaIra^X@h9rDuwZFl>hfpl&XTZXbyg+lm zUyiK#vK8>f0m6#w4t{5+Em7;#FCx%K{#5_K8O=&)F}W=N@9cN+Md!YS?(7}Y;^>`7 zF?)h)0G@XRz0t`4_0<%ei<#nYaC^iLd;M>K4OrT~zjm+Wo;uIw4EM9(=s`V5Zt1cm-9Uw7RuMnv<9zqi~*fF?UzdS0*$0YeBSRS*LeKoH$ z?eV&>*HvXgK*7SEo`r?GNVa@Su{4|Tez`V!Tzojd+3G%*jHw`iMqvYa9`l|U5%scU zWa&KJ3$Unx4S+re7A8{^*kz9tulu938~m`%(eVz55>yQDm$spEdqFqTftkEwkSm}Y zG>NG-&CK{s&m!GKj17*SGR?%{MzQN+{oWrkTwkhYcQ|CF=9C?dt>g{JAFg~YENcgb zSY<)yFl2wQaBx2jkHcWsw?|WJeZ&HkQUG_k;0o7zCZso=Wv$9(`)DSCfvqa@gW~Z9 zVOte4fRe&dQdbnDH^9VuAh{NqmTtP)=8wZ`0tC;Z? z_HCL`i=_(IpeRF8H*~v}Et{4R%2LMSOcr2w+aWyDCfm7?qcRYLYi@An?_6fl?tF*m zDVgH80y1j4V)$jFg_+kJjbLb((^np5z4k4(zv((6n1LF$=?S+Vl8Q#`k%GR`aj%tP z+O*4H4vake#qRtFc?AkKP&@+vPyi7V+VP6@r7!TAU(yLb7Hk-W%K*%YP0Og5F!Q$t zihGSqKv&KG#25jzlL=llOOrcdvcEUK(BQ|Bw||8B^7=sl403L`Q6w83koE)FezBET zS0_6r!5#i6TH6p25t+vKK=@>m?pB7ygtc~J`!0#?BOG4DYS+BIr0WGLlY+&TYUl6! z4`dvmjYZ4(N&keCL7C!L4lr(fxqvc3{tNs4VnIemUTExmu?tIS!&z%(8OeR+n7}>+ zBI;3;rbM`L-(h5UtrUk^i-;Er-K`%4IX{Xq0sR*mKHLM#Dm145ArK}Qu*QiHl+iw; zZL=aA87sq2&A|Oa2GBhUW?@2$&#d6 z$XFbHPU_5O7e62>O*=sYYA-f9t{ zm<5lN9l?ukxqCAV0tPN9dy3U92Vm%Xj#rld#RV2CkbJ`%#&tlkDU?4@4)b|z zMj3a3DOfvT%evQ6SV$%yCWj8D{`IXXpb^^0XWQQo5?S{!L3ewo_*VGgdMik+*#Q)r zQ?eKGtierD_34But{h_pCQC%xe1`^>HN(YrbN`v->rIqmGO{zH;hV(FT#N#4%s9mN zFohB~VImLz$WKfa-k$+ub=!I%CuuEA!rtvbQX^*iMRVOvyah(}=Tb~G`t3TP%yXsg zfJ!*EEU=)A8zGbRQbgMYmixJSI90E9Frqd^e{tBzjrCy}W!PvWq_+Ox-0tS`ty%qH zmAh)q3vgVyhLz|SmhVPjRr|LKJ>4M6v{D$QJf}T~k9H3(TK}DoUR)AY&O4B?$V$5l z4>um#=c!7~SoDxoy-JIWncMn^pix>e#Jxf83ha2B+sQ2N0E>9`3fRl-F&!QN;q=-HmMckJ$$)#q4OK z(prN0m!By?%|WZ((e<)G!XW{BU#<%BHQZf4H19*w=J3XLhv~8AQq=mD+xU)IU@dgJa zVOK+2I*SJ_clsT?Fyz56n82TLIfYFbKRaU93nOxCbOb=?G+ea{N~_|M4SsaxI0piOz-q!V0g#GoK!$!o|JCt>0 zl(+VW!KvhXR=~jb{&GH!x_}V_fy|&`H|RxHwthk7EtDCRja=nDm31xW72BW}EY1MP zL%WPc_*;}dHlGJ3OV46s(a=hVHy-XVa`yq(_!|>V|F?4}#LiYD-iAsK+HQ^A56uv6 zkdKbcqMaIFvFuc6CpU~*EC^wnq@RHiS$=kQxW^GO18~lt0Qp*j2m+&#LYsS2nTH$5 z7wz^SGWW$grv{PasM-aIvl`8m=n1u2qDt)$*iTUdH?>E<$wSBdiAtfkZ4lrfv)-CQ zFjDAqSQ&R5+?Nf1pYv{WJ3GJjJ>?e=;)3-XgSv&o!hCXwR9eqMb>m-P@22<}B_~|H zK*I~ikqLqh$xA9VW{_r{PGJz$_q|i{Aw`4qcy3_Be%pUxkxHcfnt9=x-Q^I_m4KD9 zIfc0=hkDEL`o?w^a}<(L0czI;$ZL~(=Zb+yqi~|$j5T9?(J9YS>RitK83sJ~r8Grs zuzuaUeD1CZ!Y#haIgk+}b&0_Sm!qbppoB`P*%fM=LW61Xz}rYcF!9?r)P!M`xxXBJb z*_aC}sTH}okMu8(<~0n&&6BT@^EQWETeaN(YL0Y+&jRSK0o;6x4HC1$VP5`|7od2_ zzITSL-QxvxO43Zy#XO3=tKo1ywwrOsILET0AbI#>?0(9roJYi zruEv69RKy4N8c!-Gc3d{O(|0PRY>0&IYCu=AhIc@4~s@5`W(#rqshGZdUFRO*0Fot zE14n2^m;y8RTdIo%{3g01uH}VHg^ZT0WB_48y{#Oh(p7527qV@%}`~hg-j}fPpSr~ zBmi(#?7-l>hpv8F4n~W^r1sEKC2XpTIWva-s$l_t8#EeG;``hna4_(j+4Tg(#~V7V z7ni5K$)9&^=0IL&ISdOej`+{uUb0?(Y2q54<_ZT-PpV@^5jZel#!lDjSzEZlO~IFz z5}kjum0c9h7LKNNKx-aX*$h1xMYz~ZqV5?GkQfX&G$@{m ztV#qoF5pScH6pSzT*LdJ8*~l;9?d^5Bog5ciKRPNGLMia<{DhcH zzEk%t!r;7w_VIVm3(tF9cXpSwA3cJ;VVKi?3+F!3l$p~7^vDrsy+em|)$hP4Bz?T# zdI1^Yr%>(8SaAC9@b4&6VP+4B5Z~%xV`{dNG2NuQu=GF z+u?-6n4J3IRUEP>uvO7}?MTNwucogHi=9s)@I(!B=wlvzjT==X<=Od zcnQfUsyeB1dK zDA$}D(Tu2$4u?Kj{{fz(PaGIcf`j}?KIBc!%4S5d8OEE<~<7s%=mNDNU^wNy;Ul3(wK{Q znhQCn4E{H8&|=Nv09tHtm}>21hG=0)Z<{P@Wb*_m76to$3@7`9MGUH|&#jbPyzLIS z8kp4#KJsGRk@`h7z<<01cUH{cvt*p(gc29Rs1ZV5he8R-Zvf7I z<1qM)t2fcZcc!~Jx=)V~X_&y)=spOG24i2EUtq2Y@t{(f=iYU@fs7p@uFM~_$`wn4J!tuDin)Fuync6TCU}6>k_*CzXd1^%WU%0s@stBocy;BC(2P=_ zXxBu6a<8IzAhiVJSVK2xw*7&mIwR<%@dp8)`_~b0&`8l2o7W4dMlH8r@P0(ic09pZ zQqTAWd%exotr%(Fd9blD_~8VlVh|t@PZT1R2;Q!Fio&C(i<41#-OqYKMa;=q3we48 zTfWdOy|V^oG+~Q9x}3X`_^|-t?&s5Rd3E`ie=0z|r*pV_bIOxta^RG4ZIld>uqYs` zkYy>a&oR4GC9H_cm!(ECm>bW5I<}pig<)gP%V!O~SLaUzx7^N{l#9lo15txVWPoM$ zS4mT5B!Z=oT>5WcGeV~@ZuGQMI$}(%y9Q^Ozhx0<2}#h=mpZc0T*IE+X%_?)lJLe6 zgy~CsZ89dj$ZCt-BXFHi$#{WUoXipqNXk*cinHgi6;}C*Jb^TRwY5M_(B>7kfIqdc z5W;)?^?{f_#*0q2h_@s1T_8+>=Za*{TKGp%Ga6jCCm%3Tb;nVKT1Kl`RC?V@XAMZm zWD1u&<+F7jalh#klvhQ41wLN#KcYp8Dz>MUe*Py13h&N5mG3QX0;Sg-n>dFAp^TGA zd$!qx_*KPYKg@f3HSy~l??59onht*l?yB5I;6KkAnM#84q6&zZeF7J6uyqb0iGGMk zKJDn`Qjj#@<9qa_hEoEAx^&NLIF5V8GbiOERFN&ty{jR<&AX5 zl(E^P3qO8<@N8GxelXn8F4*vd!g+aTt)Q)ZeKcH01}I4NS*R5;jH}ppv;icwV*ZT6 zpr)&p;W-rkv^Sg|xo;&_ha&-f92a_{zOJ0W=PHNJ0w%VuXPM_WuaSMPfa(o!B5z`Cn-_ns8jPFB@E6z0ZvcF#PYz);XmQJTjvUZ1xmYX3-S@bse&$e*7-Se|H zu~~far}{R*~03 zr-rcDQ(ja=B&QU#e;*yWa5i5e1ig@*af-aU5#|-=!y*Pi6LLJEDCF+sp{3S(kWf}j zk;C!&YXu3n7?tN)!W-_RS82Cl%8wpv^j8c2>Nc&?X@iw7OH)be-&u+<9{NCDt!X^> zHX8Wz?_V8XV68e~Xk8y=^to}R7sJ3I%EHB8DBDW4x)R^hD|ec0+~is`7v%D~2j7I+ z3qdx|R)=w7OH+G#9{x@@f>U+^5t7aCat|ecqAWj2F&igKx|cQ(kzR~cb7QC#V@uJf zDQgY;B9lG-=)nfCqQfBPhzaHIA;xE1abjqz(f2L?_OP&?-@Q3DZbervIe9$v(+N@j zdhB3zh@|-;T&33pZwXcnZ}lR`FCR(2bb8X`j_wt5t|?M|<4sz9hX zDW%?ToL|BfF~79OlhjQlgg>;#)w+=#aw3=W%VrX^g(X~G&mu%_>>!@cM`b0)9Ws@y z3X~5$AvRlHab@w1JW&fCATC?-m{Eg=Jnzb@8sw4YI&ZWjR+w6b(`WYC*Ii$P>ZM>iH# zudu8BNUBZeiFFcJF@#%or7)MyFb@0iUQNB1M`AY1mxy*O)=O+0!8$9yMoS8E+5a@u zFtt4FuI7>&7+At?(6IOz^#|+pG=-&CFkMaD=l*M4W(l7tWV4q5N5FF^P|p9(uY&d) zY~Hog`gYIf+95%&o}(1-ijDk(UcYU)1P#XBraS*MUxk&YulH9NMTC<>8=gg(6$!-rA#syU(MCN!bI!`Vu}m6foIl`X>MuJ-o3N}Fg6^dN^_?|2$7C+7+& z3+s1Hw24fX$+=FS6JnvSG4Vnq!75iN6fnlSk+zgOnFVw)_3mG)CO@WnjRN`?t!ks#ho=olzXIHMOt5_m>-~nL{gPoOcUaIl`vRJZ66MMVM zD}lx^iXuykO%OVBApO=L`pIjp3}RmopSI(!B6H(7ZBIE>Nxijz8!;#v+LrX_N~E=Q z7eA{t6GGhG{ZFsB2IvN+XucvPZ|l^X=+vK63Y~04j61_W6?f#bvH15dF^?lYPx?-r zMbtLr`}%D&)Ff{k<-m^kQuAOt2qGvIhxq9F=O_BWRG@nUsA)YFb;0hl{hreTDtBckWCj=_v?i=VIHLn3sZFWSmaeJ6=w- zzxL?AZ=)4&0 zuOS;qHB~ire1*BBDQj2hW4J=aBsQBWNzaK-XAd+gDD%ic)UJWRJ8(+_dVKR*It3YK zcsKT0rnwHzBu5!uCn&q)@xiF24|`<1VNhg1xf(H5QzC}X)#uJ-IB=RCm_ zlnp>xyVD0Eg5@Yn_aI5Zl!&mMF8&?HtLTuCXjf<0qT zqQKOmEkhelk7iQKy4~Jzw}xOw;-tx=7`@rlf8}VxiA#-da(q3F$XIz@z<4RnjmOB| zGV;}HL;uu6!Hb>{9uJ*@Ah!$x3&*>o-`JsL(N>%*Q-X1D2lca^y?YmGWej)Si@+{H zpAVHgA~po<%TXq`H-yIKnb0amcpp58r^f22KD%A2yLyKnrAC(RywXA{HHOuYv^C4C zyz_~|WAf&Nl-;Hbu@M&F_3`FbDf zYiP{$Z%MLDlK>!Lnc^+Xeu#PbQEk~tLXyDHamVzGV9u)e&IGi7(QA}nNSxRj>OW%j zfJm9dljLhh$g*G9nTU~y&az+Bz*79ju?!(eT_I$fZbkVM)dR#boH#w~Rq^*);6Mp(;XGtT z6#>WOhWKN>Gn2WMK=K!C^{T$)+pjpQhG@3h891zR>6EGTo~(I}n`wenViMuR2rsgO zFO%Y33D1*Hd%}A~B|ke!5FrG~nIkKwdy*niYEULXVTR*@k}4g+Kdde+SIo=Pni+jf zLlcA(8PE^;S$j0#q^k)`Wc1?-I+Q4BcOBWpB9Xf?;tUDPWdAnzXSiUV(OE@=NXIC_@_{lDBhkM@veCamgl{1_TDoAj(hW11 zQQ)|Ti;xITIp?kO*)L_ZVVxYDJ&R9ELHgI*jj;MIOE3btWv$iVi#mYO8ITZ?(+Bv-!JDl0K}x z#3tLI%SYp?_UGH571EZ3&o5~o%c(dQW&y8n5Krp+l@H_$k)El>G9OmhxK$p2fT%NQESYN@ezFWa6i?of5^* zq(gJT?&VbxjaVC~gLb zZj~X@^#IR_M@&(;5XbJzQp595<_qh7;Qy?_9Ed*q3a?eC@iVNx4OOdg%G!ymwJ5NA zXbQosLp}9z(rz=N)r($7d$l5kF?b|g=rqs6bVXxI!=7t|`ZOP<(Zi1rDfg9@U*TF5 zc#c)$P|v0u!BU_w^{RBq8ZTvfXFs#YpB`FJ%9_X>N)SM|7A;bN`}M0l=#6A{DhQ;l zo*Xnp_BlAA`H#7!_x{Pla(Zz=FUfu(_ZDcu1Z!qr&BsFsgFl9(^lUaeC|{q9F-ocuWzk;{3b>kA6;j;mxy$@xY1&)@4R z`XsJZ8L*3MKi@?D6(KtlpVTB&Pck-%)<-b^@SVO;Y2H1`h28Zv1(3WCL3=S2x2~~eR|r* zosj%}k|Nph_WZS3ywRzS?~gtb{_lMiii~apoptY{%=Q^r6o9?W(Xahg=d+@V>>kHD zz1B)emmQ*1so=}x!!Lb>yAh81!-u)5C@gzkGoeVm*M+V=fA@IGBkf66K!;L_kQ7%U zBMvny59D1Rr|SJh6p7RmjpgU8<2qsbm-kNW)jLuD=mS27-y#-?GgNJizzHqO>W3qL zMEt)hgXuGFx#3%RDQLVx7ss)%1K)kU@6X8H?uzO_=RXPcT^foB`dpjx+@1RbXm4hg zmkWH~jzO+Zp%kb)wmqs`%)qv4(L3@FJ2hP^L9j$NVVchRHNy9!eUc3im~T>!tJEck zXzSJzgjsGx|0HZ`J?1t`ArFZL%Hky(T@Xp>yYGF>+vQHd-#4#rp?HVJVGiZipV_#w z@o|*30P26^L_IC~MRbhj$o>ZEJPoK z(m1}VSEuymG0*e)Bg2_O2n6D{&MtnC!mjN@%s zzGke8-Cguwd9U9DR4YXn75Rc2+Y1SSVX6I9pU-LccaMc~J#2yCFhU8LsOQHRxzEwi zlVtkho~c7;`OPnL6zXDn98p}(2h6uA*5B_tTz;u@jm*Md4-eBP{YV|*aOPRQ$6EbU z=`R8C(J;~~sLrJA_Zi@AHZ3r-iParB%9fm!FX_oWwlorfPVVvDpRRk>Pr0ViH!i(ejL}&;)B)HtSQch;oi=XyLLcM()bE`s#yJ zgKI+WH&pa3fE@7=0!~@U z4<eMO@u;k^-#RVnO2zl2RuUeB6uH-XI??zyr{-GzI2x%>3q$$*MaYmMXHe zYR;cV90o~;h0z>?ISC~n`>!hP3_m*B);vdD3cMjF$&&p<1t(|U zV&=`uS)ozRP8rB_f(nnSUmI?ek8NngWe` zuh16#yNWa8*&38wqVXgXny#}v#xSdup_~(EWVuH~C&01)?wC>QHGY9j3uXGz z{mayo6qi)lR#eqjmHd7@TgX87n8T#5KQWTsaZpiNTp`;xoFT=$;1txUxL}0&<*i=u zeV{_w=iQcnam|B)r8K5T6{l{wiW`|y)|89&)Z6&Rq@0dIR~4>RyS$=iP^?lba+nGm zjkl_6e6b4q_uiWYVvnSV^tG$OErpiMh_H~Z%P|z-!L~?ow=WBD!1$91Cy0#E+1}8) z9?#-}-0qORxFHR*B(Sz7Crg=69??B%-|4}H4RVIm8_Rb8=UYQg=3aeF2my~%(n!ey zF_Zw%_Uf}>5K=ej2)p>uVnK0r_U5Q^n0{iAyt$Od7**T7iFLTS=}faJz)Q31cE5je zUKK4u0A|5HzeBY4Ey18Db}bQRsjfQc)qK)?qz+@QIqiJ;w-Ux<#4@piHE`KMQn>pk z&H)}?n7K6ksjC ze^&@%(35oY;hk?}E6FD%z*(y8*c`siPzKLRvU^~o)IPbbhu!uOQ@^$l^~}O{R%vs} z(=ea92da-th7q0s&+#gnY-N>D{SwEn%RScMQ>O-(1T);MgRP>njWUI-dT)tDIAL@meA{X|f|CC+;@3YB5YaD5#M|f@ zbYAWal#_1n50?yYm=Fla?Ye_|7q0NQNM%s+3K7}PWx_y?=$q_XmhH;_CpF+kklfyB zt}VxtXtS;{n|vE`uVZQx51}J$;einlkX*Iti13Zbh0wNnQHl!KEQP+O^Q2iV@PLu0 zTC@L4#DtSyDLkxH-eBU*bFA~xO$;e!K-2-K441sd0(R1-6Gy%vtJQSf537d4c0p6N z)#ZD*MMT)TtEY|Bs%mDt+{_gPPD5UfigV3RaHiiM-Gxdg#O5!$*H!E9C{1yY&%;C| za;UF65j!7_n=ja^qv9R;X%b;h>}&!SQj6TW0s5#s7)M?kdk55K1eyq z<({Xj((_6S`a$Bp|MZ?sJ(9NPt!+Q3;6=)%6*7OZ{Jt+RmEZWiS+ciYi~cJm=w|u( zSMy3zHGwB`hau7I#9OSu`-|mEsmQd#Opk3GgPF)$NTKpzIEfCABL;EjCo`BQX#a7J z(^K-EMD7@kKV|TOZz7l9C%Nh!O+g4vxm2LPib>K!WV#s8d^4Cz<516k!pH?~gdk=-!6{!iV(0qQzKf8tl5`tiOJa^8?C%EqY%=S9K z`ug5PxxdPB_}(2BPmWUCK+vfAf);IGdr^Raa`70 zIm=DgvCszOcbg-<78sr(SABkde?%Z%nij55hLuS~%MQIA7AE22ww8zbHdtC{w=^u> zR`s^2}S+gYm)^nQmE1FS^@mDV3S?S`m_b{zyoIHX_&(lGNnE(&)cTOR^I`F5@ctT>|>@V5C}%j{Gg0it?QZ=khohmA}~7j zip50P|JAwp4@dTwyb}U<#i8QsNV1V1L+%&%7SPw0`>LdTstqFtw+A#PHm<)KRPG@; zwHyQUjRAKqrZ2MF`POk)&#Mg1v>UlBp2-MZZtSFis%6|iVO80#r)ef73KCA%Xuha2 zXq021eL`BFhIl7HLc-ov0P6jt&m|~4f3d#I>fJ@f)_psCsO2}2mZLewt)JT`02my3 zl*C4WH|Y`vFUk)=#kGn4jRKaaM0-RdVwVEF&!YL_clm*r5OmNMD5*Dn`2 z2|psoTh>cq1d3XfeKfiJRlrw6r0!Rz0<~M|rA}Aq0y5c7Jc;Bz=?ng&m7n*#c3yNB zLKt0I&6%6y_+mmTKlD59y=CrqKg{us?MFcj z?Y^e{%blIJHQw<)QVV-EWx&K)=f3V9E&KN!j)_K6w)l8fSYfq7f7X+C5jMYRU+B>V zYm+a!Mg1e>qzdO`BlmFDPE(sI$= z<)At--L9!EBD`PoR)X@+$14o9wXTCi0Y3SQ>f3Yj!@o3bpBL>m*+!sa9l;Y(Cn-4m)at!u z{p|kf89859Bz-@D@K^iX(WF4^=PQmb1N%snujcw@pKph6XYraHR|g!tFHyS%_>i&j zxU?D0FtNR{QozTXLG?zc%1kN?RhGkaTqw^}^zH2-4*SlbuLA1-N{BG*H6~7<;u;-K zL^;0aG!cbDfpca%;_`=J^Vfzreno&Ylgp z$QqjOL%ur4XZQmmnJV$ew%@PD^nK0#%2b}Pxp;fRkZZa%C+${&JygM zPE~z*aPVz%1y3s#ts6(o+ynSB%5hwgIS#2z#(r-mbGX3JS$IWk3X^!DJrtj+cjzwQ zAAOgEGLosX#`j1PI;iWicaBHloj#g***Te*AYQmmCQxqVdD8|%_NZx7YPAp*DFC|Y z1!Y0Nz=g)`RnK24d2^?PM*ie|oiurwLNV=rR??$T=jz;L$@v)RcGvF`>d4*g%2KE( ziacr{+1jLowxT|DyoMiGtacadU8uA^y}m;38x>8ew9T&>|0N+&cfK@MbXrtY_8aApH%aN(5P5**#2**&4Q8d^9N=nMSfI zwF>ROuqpmL@4vbh^Q?;*yMpCFuw7FUJ3ob{*isVJm4bl&tlRw5aPTzY=K^1lzYYch zJ#nB^b_yYnZR`dacp8CYrl6GWDT6H0>S{!` z#!TG^xa)c@MO{mhV%PEhq9XLObH`ytXJ1t+@P2hLcu;c3I=^9ELa58+u4!H>6WL$h zT*j--&o)d)0P2y(rU8^6**hbpy^n)|B`VX(Q@nrg@l70ctE5@grh1;774B#t6t-MV z6G~>ZtgHh2%7v7IAJ%`La%oA_QIX_+TuTS!3zk>9I^zT^cZY!yGZ%{5zH!$$n%rx-IMtyGkjwFUZM zg=Q9_JTyaRG^z;+1<~V5sQ)!VWMkue3a=eS#6PX5`}>4?bZ+Kt)T-oif`Zz^3YRG4-{h%;eBL0w!^Qsixr858^KWp9K2St{B11YJRM;kEln*UG?OK)@iADko zE1aP5xL{47jBGreBtfl>_>T;OmPj;$OC+uD7uhgWzQ)L_#uY$8LMI7_dpLR}OwO-K zTEwm3GdV2gp=C8ng*7I)FJw?R%zx~oU;7a%H4gK&^W)LA?c?`js>HBy-!B+8zjC{B6sucbmcGM zx6^`SyUT7CMh(V#dmC5Q1tl#tlKufy`|Is~2V%SmDN1U45?Xq-Ar~6Vz{=})CB}t$ z1II@|_o!xM1rl||Dl7v0IXdt>#?=LOFAUm)I?h#@Dx@NFt1b7&1oY%%Yx%XfsX8HC zSVAtkw+XwF2g;sjEH+pYfo47XZzMCpyU^9`StftXsCsk}feekQUS64|S znpDNfWJzTZPPcE|q~dFh_%_=uRyixCj!yxHU;K}5%yDlQBjEC^z1 zWS^=+2Zcf15ftg9v`_4pYfTGl+QLutrY9s6I4T>dZOb;fwmye$t@8{n&a27G0wc=G z6jm#7Kfwj>FyHq-ou*T-PR%#EF)-xAOLE=;r)_=O-*9w(i8ovFL@Iol?AuMfMlWM+TEc)Z0jErIFX z>Z5c&x)MHvf|ab^-_QpsDeb$Dg%a!D+wo2mPaY!2t*Ns~BS4CY%C7!AH3D}McC zNwJ-Gd{{!2s>m>1M-l;;Gg5NxeEK`%uG-W}!ph@I)P?nZMv|XuS#!p#O3hpuKDBed zJB>m6Ff32fS{ongbu*Ls#_`j@zXa4u-f2@Tp|I6?HI{5#w=E-mT?->3k zod1{a)X$!R=lfd!_pG<$r(J#E%=)~jyE}(h5NhIZuwbot>0&-hnu0aKbeXEaHZ$Fk z3wM@(VBvFan|PGwThH$i!62>T7k$H&$SOh`E-hglrM*qKX5!7i&5@X!HNuz) zlz!(=i8ar6HLhng3yFC6Z!Li_bfYPX)kqZFQ@i>daFF8cwLja3(}TZv5idjyQ!bf^ zk@DyF(tly4*MRwqZcHLF-Y?k= z22gAtTutg$K7}9cy1>K2ZtDzTQOMbBcBhBhS;?6z*E>=i}BRnk* zR5mAEcIpQ82m~lh(l7Xdvgj{ygnV@vVfC4`;yWH{AMj|r+L~jCsX8P|2W=F$_nwG{ za#PrwYjk9TlyOk~YW}7F_@8p)ZrAgt4A($#-1Q!MRJwpY5xjqM8i3e88rR<8=S(>ABCMt9iMkD=*Amh`spy z3N<65txRgG`{Im$*dLK?qRRf!m#Xu)UCDdBP}23x=bL(zr%SVaHygQ}S6tkNsC*go zSNh?4G>mxHB=I8`8p76_=3MtBcTENn6R@1)8tMNahb2s-?M|5AI(?N`+s1kOC5%P7 zMq{g~rE#X5CFd3jiHLXXdZszo0F&Zo@?zJ(5gg}NX|U_fd%u?1_(9iyYFAocf8W9I zPRc*Kz9FM*eJFqN_^Do0{Xn}KOWgNktl;C0!c5?WI;2{lYW=2n)`njt`neQlk^e~{ zw>`B_Jl60ntfsW!$1SHhwKnC*<$AnDfOXjx!m^1XkO`kbC)5&KTO=U^nw0Mh3@j>1D7bRJsbc|5%9iq+;}ni z?4tU_w|(x?UCl(M)g|C-4m!&?_>`di%)XDHS={7EW#WdHTj1XCyS3h_>CD6p3Or&h zhedXOwp2gH=|6WL?*oj8Qwcup1U)i-lQ)`vFZ5^iASBRnaC}+K(yVqI0PlAxS7>r} z+}OhT3@|^Izrsg`s;oPeZD|QY9sXB1R!0_~f>I*Du*h&Qj>@LNlP1$4SF?J zsVwJjPkdZVakzYY4S#4faJ>ef0w7fPO$MijkM(EXRaR}>xx_fPw=N=n+<|+q`Mbl<~n_KS@Pt4nyIZ-EHq$@SmpaT6WWd`>K+*yx$7;g!Gb$ZN5TyG2g_W zY?kF}(p%E}1SbgAujn)vL=M*e^lYf+*7-c*R>=jdalMj=6+9j_JBvvj2=MCg5?6&X`c6KC#=LPJa(k z;LfWaGa4r5Ck58UJI-G2*PM#4M(g^Su;kKiiWH)R^ek>pf|Q}}90ONo2&Bd%qR)sW zjVI_+h|7M?36EZ6hbh1y8BXus!g6G7joPy-pSy*oO2;~kpWou9=b3@XR>#Go9IwI+ zFM6Mg#9Ng!L5Zrb)K_YY()%VRA1w0It?$-q=Mx3(+VUQsmFYZ(6h0!`)y074y{KXg z4wr2-ltGZY{NWXcHK*RxcqSbtLi>TAS&=5Eu7a3?5Nl?NPt4*{dn*&^Sn~tqDE~nc zb;!3CWW(Lm%iDKUQ@ZIfO~zcm_|z9;+Xwni?IwI*2}HzF^tSsPPfqMwb7MP>l)n%s zV?DH54t$xNPc(p0Ehfv3*6oRB8A5{TSxlb#7=|ug`AWGEcMINIB7KpfzX8R>{=FMO z)z+8No2x!x1fqjd!;gv!?uGYzIwV5A5b?2J2Yfe-jyYCxHlMM{+RVo@$JbGW;EoV? z)HB*2W%efHsk!y1CR7wzxUBnf7wsFhFu|&D25!KccLC)KuB@=j&PeGW{Yyhi*Q>&9 zm}&P`p_?Aq?)og>eaETlKbg?bK+8Z^d^#)t3(q4(F)}F0Vmi$CnK+GP&0h*K1feq& zbB?~im1A4${v3b zc$vcy3$A)69nnfY6Ag%TRIXdslF7t_BxM2=Fj@UaK+TRkM^cLHqNV6 zb?vt2W^bI7z0nkVexuzF7K=6E*4OQC2$2uwpEq4~g)?#D{aAht5qSsE?DvWSMf%-(n-d2*Rs6JeEd zPLI2{R~BR2iO2%Q9ev?ow&?cDuH1asfX2Pc-P?0jqs#QC%5egndoEEsNLxQgPov9< ziESW5Cq-!mA)xk)UG^3BixogYC6o^7#U(>crQbUA6 z@2598Ltg0^6iOpGpFrwBN*+XT69q3X1OJ)2|t|3 z6CHUxBRXtte{W#&$?MSa&WjWkvXuF==JYycYL-3q=9q{0&nkl92c8!9eKW+qQ+YXM z{>W(NM}%S4$_=47zU~zZMm_m0ts*XZIztv%UPn!v{QCCVe2>Etb|P&g@YSwc{km)1)6S+z0K<5Q_J!SH|Ts1&RPuusOeU57^hVeXa z5)fV!k<4=rU&ub-@b?I77?sPc9{&cBak-twpA3%U@6QYVu9K~6Il4X?5J*k+VZGdL zipb+;Q&6NGxHo2pWV(oUR(tSt47n#=2Nf)edUP72F9Lx+h|n{;GBDHPKi*JyujBp- zx#qrTOBU*3++?Aksl8OU+e&KyhJ~2@;pqT zDgVvB>xE){TK&55i|c7mu}|j-l;5@GT@>6;TKe?z#poV!-NAu%aT{^Qw$g_NyIU-` zEQQ#q%%w(aWa_S8PVBy8gR9b>2GfaabCV(RpEqBd;7~W;zg^aHff3t&8s!QUn59zca_J6r$PAC~SyauTQFQdBZ-c4k4k0@z|%^#Ona_s!9>AX8XL+Q-h zMY~uSF)t1Knn^jK#S@coBz}qfM6c~kNwPq8^ZUTEmOJ*m8!pAco*N0f^p`6=PiqcU zJymzC8qT(ytpW6d|4mh=Te2KB9QB+I@wKL~h2fKbIC(rTs}C~;J3X$ot@({p`mBS( zrQrqvKf>b^Ym6;EDG{nwv-s*_=*>CSzysEuYctM!Gs%M$wlLQSh{m5S_6^L^i@=mE z_Ejw{`qgrG0~{u%&R{UI!HsI-cX)?9(9ba0Q?pfWfKis0KR~@gjs?@9vkCIlOo(qxlDtP(_Pk}bM?rLVv2Tz8XwzLD# zou3~(+RU8~DYza@Sq9(<(lWll@MyTf`Pp2iT`_d@Gr@%w_a`TR!bkpR1ZCy%j@usW zxrm<7SOVeOp8bx;XS16)`vcHEj7e8eI2szt)@7Ky1p@j20(f>`={p@?V~YBQj?`L_ zwkG4H9fCQ>RhWCHkf1bhYqdgkv+mdfpJSa}m-&u=!Q@~?;^@X*|4>1hF^=yRzMx(H z`hjQE#_v`b4dq1kU}Zjw>V!*f4d}}E?VrGbOX|Pka95!UspvZ?JTBoHm{`v@1pQu3 z#pzQSY;H0CnAI>hx9`yWw|UaHDjWQE{hZ1JxFX^ z6o+xWNe2YCXzqA}Z)%rPs!a!MIgDtR$zfSaCo|fu<*#;t{(qW8oiBxjwrWz+92<<9 zH6{V1w%&-Vu^3ZS#FnGT*E{|ovG&PdL}@HxxU*t;4k|!!V0$T#Et}@s!@WG?V65Sh zsR^1g{3Yn^r})a-zlj$n^~XoE;mWSvUm;KdD-v=&f*bD+l@#rUW4F7_Zt zqP)M8rW^A1JnueLq&qnqw;_HX%kcE@I@>&vxx5@zY0lr@=PtWH_u^`jW7o?b`Je%C-VYoC4>$7#Y1UAX6#>~8vQOOzcvXjCM z0e5g#p0?=qNs3?7YwMCzJb;CVqt0;`dcl542AJ=z12|>e^r?sIx~ta_;0y=pcZ};V z=I*bwA6##p8*_G?F?6)E0s;ILlMR0NP8q&4t@j2poE4fvvAEs5h5Ad)dPP z>rGs{yD7zd>po!wkeM(4N;5lNutOOybUfZg(6T^!z`HUmdz|5Tb2SEbvIBQZ?1!+D zC6{+X2_-U~wr?6ocTAK2aK38gcK1QkQKr>&#{Hao8s$bJ-LFm2g$qOtZhUe^e9Fmk z0P9?&u>>~|n-84EX`e+S7w?<5kixi5ujSjjmH*UkOU`e~8T_b{Qpnf@j;0S-^>Z)TUF%uwNo(+6> zqPPj>&4Vk__oCgmt&b+6c4JKeUdrI=>VCD+Z%Ju>p;)=cIuYHbH$%@a7uIaFAgKr8 za9sK+Z(X5HSZ8Rv2i!q$RhfK8Ap0& zans{xq%RQ2kTd!NpWSmF6C)rEHm4zz*qe7xh-^vi+uex3!>(W8iQ1y3oPA1J!uYtF zl&*Pzmg8P+`ZTg7RvFcBq5QXLT<8k{F2C{DxUnn=?{Sh&?FX)P-SZ?40#fxe%q&o59r7wdApX(9$L1N`XUa)Eh!ifDSA|G_F(;82z7wT1A_i15+2LO>_ zTB<}>m#8F5Lm~s!0uy1b$LxuByZm11yVmx{`_rRZ^Sc5~`TIkImA2Wk9D`~DeM3Lma}DhH?D!>Q?uYO}tJMT$dY2HP8#Dg#(LAG(kdz@jvgl#r zy?Z{JaPy5E-?^8}a=}ftv+W_()-%Vb5#O1u;AV`|`O%Dz#kU=e4jkDoMR02?^*NnX z6}A$imZCIrAoCtxOrn6%hyWcq@2sG>R!?MPDmP7XVAs9_6ts3=u)5MA5YTaQKcrN{pXO&XM*dx0Dx*P1zbUu!s1(sox_owKW=Vvr=_tse z(%6Ne^b~6aH}vf-)K}%p&-yWB%oL6t+{eD$T-44EI5-Q*Y%bwcmX=w+yM>J8P%^?S z>^fN_7+|(Fi!N=7I^n2s>^&+rl05Eu77J0=DK{YkDF zsyK5hcb&~<&6%TOt&z4hr4Ls+qSMh-=d$O!T}*gz5!Va|BB(lt^2|nC{&%_P#>qp5 z;^VT1r1XhoBnVoVYHS7CRrf65fm?^7D|KW`!ERJm6PY`*#UC`6_(Nq;1F;!_|Fa0C zUT?zU;K{kM7meB#HvvkE`LYOg3gY3XUm|hscdT3U5&I8hOZB{fjPwk)EZM<|ZdYQ) z-b%l&Lu_9CmF>uH^aI0{lDU_eD>u;D5{6aP^NCdwq0ywq#aZ2F@YgCyF2uhl*;v?t(2$%yi13)Wo@&B)p$ZC(Pa-91 zDc`PIhSn4-gea9|U##ZimF{>AoJ6pPBL)FoN0%@L3`|GYox&);Ad-ZjWpx{HarYr@ zz(Ca9i3}O#LwceQT47>ppAh_gyn7qNMoF4ZeP>RLT8y$#%SE+|^0%O<9wM(ig>RLr zMfp9m0JqB7jfAv*ggS}y4jC^*H1P+!_&xeH6+1n|#wjPyFako?|nN>yYO zow#|0lQAfruA~&M3JygXudOzk@$hoRy*D>mnsfP`RH0^{AxytEos-A%QDV6KPqw$yTRLbY>q64Sih*O>b)Ht}J>8j?fKmU;mQzEzDGLW!SXCz6e6=T`D z(W=X4VHMRY6=+Ah*xmL-q4IEAUqV@NY%PCye?5s)C7u!^$tr6>IR&!lt+;r&;uq|B z-amS-sgPbP9tN63&5?{19I^!P_+w*sW{=A=#g4{Kv z3>r;LT4Y~;vq}sLAw0JewUbNFslMvm?5Lw{e)`ilUgTJ%KX=|aj_CX|v|X|aYp)qZ z*FGM22RPVvp;z|ksOnA9dWjX6UV3U0A2#6;5J+18ffCe7jGE*p{?ucAH&J8Dw!$9NupE{__c+*{@9(X)01O+4Lg?qxJ6r#j*r{$65;G7FHY4baivSW9$=f@? z8xPN(>l!59uQVKI6~A#1Cv@dBq8}zWAWnP=L(4ca2J3QR*FwRoSf8D59U>i=u5#(k6zrgw&d~RtAD}ZHJF>GrIU3$*QT2uy^6hDoi16s zUT4JBE7+D>RN5p)jPtdfB(>!maq{-Tx%asN2f-qhY{JRKk=)H6^7@L?jKAeJ$!UQU z7O8BwVHO=Yi4L8dE}wr@qwmturZ&=2-)if`|2@-tN{j|X1onJa;y}4Ry*Ol5I}(+g zMn8#@&()zlLVOXs*iW&)I`zI7r;+wQV#SJ@Gh)lUDlJ(t3rzS;Rm5 z!~AVUpMaSZv^}w?{H{W5!^Dmm!H$yi2ND_?^W%H6_V~q!8}8!X5fPXCK=EJCfROXe zD~rUUhx>)AdAO@(+ZG!hDff1BcD0QO>BP4U8b1Qv-FiE^!mFgvx}3jQCI6cQJggU= zGss5H=YPqO)^k{=SNtKUk3alpkGyTbV7bI-X#)~*=sM2w-FcYIU1V-pPe+J1k>UQA zhNm$9{NftM-aelNcZ{Xs*jZ}ZA!+?~tVbfk`yw4n?e(T}{N8_DlZU}T)HEm2#o zmR_Z~WWJr7{ zhW1u`qWUvw{3ybGz0QNF$*6!v&)?gsOQ>&XV#3Vp2y-;h($Yqk=)f;29jAtRRxMpg zLwg$)rA5@Y7;yD)r@E@1;^O+=cj%Lcp{&KxGAs1ED%l?OrN~N>o1j|+* zq)n>5;zFgvl)&&@-G%II?fm*BmQuq`9V&;?i1M@zCWO$URTL$X!!|dHI=N zuq(Ik5%SqnxzsiWbL-TxsEh{NQ-Fr<9`a~5DFAvQ$txAD()IBQ4dVE&OmZq~$=bh$ zbw>*^IXYhXK^c{vf|44#&-tg>Z1dOifGtVFXpv$peh{%P?X;Ra88KlZ1CwI85}!~W zvZ$#p_R=s-ewvc{I9^5EqZ}^hOTmh^@LC`EKPABQjb!5JfdqK;bXyzF?q%ioTdBXoL;XWXj3UG}k0sw^ zGJfJX8_5ZaNhHFfm~S^9mZW6l)aH#;2)@N7g`tvrwYRiWBX&Ew?i$GeF=_dM{BTYJCB9Wv zm8|-1JxvlzWyOUwwHa-s)YAJ4ia)9pyb@fBO&(4_pP(aJUR5AWqjRvY7n#`h$8xrfpLyx<=S zIsE(a!E_EQ#W%&I1V$wgm+VPZt&x5s$1!qHDn34L|Ba-|`J?|!3KY@nIX>G~Q%YTZ zqu}QCggYB(RdBPj9pA(>oEw{1_3d)%&*5gPhLIDKX%)P8_KRcEyTrx@ar+1%R_$5GS+jmW?Om-D z78KcD?_|_RimCXY5{u3eaRh0c<@!2OMowh(;AA|Vdx%`YfmN*DeUv`$mr?SO zl5$T-O zbKm^0cJPwIvy1xr`ktRD`QLJR{#Tk4E({-=)W;tj9R9VhQ2IOHLwRv&(aE9R#|arQ zlJu}1cIy@rN1$65%fI@L!$%Hq3RQ}wu^)Sg}Z{fb{2I1i3PkKxM2R42y&s~A3h3<0v>($hyM=F&cmCM+{!2oU73g3dGHkOk^LEz5l#7_?QGq(k1DrhMg$4)9VsS#;$%YH9PkPWAZOQp zN&dGpZFqvM!%2hYsMv(a7+V577dF%)$^GZk>F^NgT z5-H8vEk!fNRYO`6kd@o6(#}VXy zVRL>iRXDhG z^-HJg_#4yGYy^o60?y_T1xC8r_-s;B1KnrM?UyI>MC=OP6u*&_Q+`Eak=r=5xcaXh}XA z@(*lh`>wqdwYm`#>y4vdJfqTMFDbUvZo#BSd2x8_O12$5%Ku~UyaS`En!o?qnoVz{ zkOW8|bO^n7P*Fhv#e!n*iUqr(V(((b1_&xxP`XI(H3=;cNbkLE`fj$r=iW_18mQ0X z)81dkKTN{zz2}^n`OeHab7uA(IwmGIm?=Hg>^QiS0|$*}?_RtniZoI=D(yh$7|4{~X^u|YB zBi3p!`}W0R_X!b(CzU*nACo6vL03&Nn>KC~cIqg*kLS>5@L-f>37jj_G3|=W84>Bt z*7d)TAe_^2{lYHhM38#=C>6R0@wo`FR&p>pjxJGS=@!<7KApVS_uG$b-G7ulTlZ3> z3}DoRp%fh7#m?RPgsd3}4ATnzilP6dSJEfcg{^DXv3LJ5s;wHiUUkHPQABmpa%|6W zLZU{|E5x1jV~45q>cPnV;p8O7l4}iQ!r)%090p>J9>c%Ka3S}d>DR3zG24FPHxXR# z-@b=}8h1tx?#`)opYdCoRp{?9A?Hn}Q%mg8XnZ3_(Lbyyu8Dx|Kn$MUge{KnmE|d- zM;|IqZe#sUA(Ojzqv@q{fm1nlv3A3HW2-IZ@R3CNjupOz5QviGQzYnJ z1s?`Bv;PW>7mliAHtyI-YNo5OTVcY#IEr_-5%llmi@7qFgYo$c9W{|Y0|(&9i)T#} zdFaw-Afdj0TfIt)LPTb@Ez8V@Y{&HZhGs*L*sVWyDpcBvZYF3uTCPFm5zEX@? zhnKe}+WIjXMRZtGXT#6m50%0>Mpb=|lC&c#zpq(wa62^>dhs1Q?%rN(+OY{5wz9eEYvI=sYsEISRYMW5ruRFD%Qhf(~7Zsh+nPpO+LBUyoj8v zVjxoKm4@Rp8&ls36W;d#C}s1tHgZBgRq=Yz4T0;@uekC%s24r?k!6fdO4(+dxsvkZpA zZlO}I$7EOGCDy=Is}XBz#$pq4XsJbCZN}HnU;JHFKTNY+XH)CxEu3^H6Hc0&r>|H~ zmHfTRib}x`jgUPr!G9s^Lar5Rr!GiQw{%%T<>P^5V!t+_pQS>N+`N48l-Aj%XuA-ww6>Mf5tjx(A1|j|D9_8Bbo8%M zs~h!5s{dGCQH$EmL+EE~nLE4w1HOxM;i>2E0Wp6Mu|7IYeIBo^Ugjj;ifCKf#g&eg zz1=lJFDuZx`{1Efim}$qm@M;-#vC>mtTkuc0<+XUvRR=O%PrV4dK5wU8NKU%?ZVqLsm{5ppNtlaHToW9hP% z7-W;@rD|LYhs`49rpN41%e;1V(NKDB6AQmO#^Z0lLbq19U&+@CUL@OhDz85|tp)F^ zDHk~FD(2(mu4{(B`pQ~7L~!KlJP2vjDgVLZgE$7uLMXFZlx4|gl5=p<^oLJYAcPdq5S(`c`yHYJkH#bk*g;RyR zj*7ONtJQxI9~|=0x>ORZp)`%n zVx&~ar&25C=Hb~W!+*SCC+$Evnib}ETm(0DUOu>KY?L;`&02w*hGw`a$zpY-UdXBq zPaz9Z8i!J93?a=|Si7>aN@0uq@pRKRv*S|UWCuTQOcmwSi2%~a(^Vdqu}a{b$%01c zv8RwLg~W>{cqyg0)L9imhqQliumCzYPr!h#Qe<@#4XW=fa#RcohqYN!7wwL6sU z)K2a6pC@x|1r-J*0Rdj^trPzwnZ%lvRhS713H&>E8QQ6x+Nqt|9m;lUr*>+mc50_~ zYNvMk_dArz_BCjycKZL19FF!*)9utw{{qdTUA5Y&o!X}VlMZEd<`F*od?op&fBH$R z`TA3SJD&T0X6=d+_wmu^KT=ZHt~~#Zlzw6tPd|7kcii&~hm%X18Nw=kA;lGcy){C0 zc_~>LnWU$sk(!!HdS({2mj9qhHttl>JdPi zmyt!ev2ANqTV6;`e(6P9j{O~Eswv`R`dRrV+doGZ&LySErEmVPP)%hCN8@v-HUAe6 z(qbShJ)0V<{l9uGYs(7B$}8n>+widE^TX<2(Du2UTdu#7Ku=9GS>5v8o4mbxulzn^ zWg#i4IgRy2FJ?#&{JMk(?z)SGZ@h@*+6J)KcAT>Fi>bkbuAyyRTky~8x&u?@joFg^i;`}WyO(QNV6U%=wPUI&> zQ&9G2aluMbN;(PoweoK#ep$qupRLApk;vI6whZbWriTPGn*HCA2_CQcc9ZwooQ7WWfSBI@-M;D7l?t0MbZw(Hv7(-1> zZL`9*j`~8TjdPRB201PWpcZ+|)flDjH4S4G&#kU8$R%7FKPeSQwM)k~Rt#dDto92# zT~nttCXr`vRTJYn%%+=!zWTsp;k;rDX9yLt5=3yR~Hd?;)a%9(9-d?m$E_iOY|ABL; zRL~*vGTwUYP2PI@9bSHRK0UnZi%{4s^7=RDi^Exj*CCaaGGH>d4dGI09_hOVllgpS zCP|(oxiOkr@k#14Eb+$dP~oD}pl(vO%p~MrDw%Sz7(yz&A?rxv+B)QJPc~aqy>oVy zXdI8tDPN|RSRinvPSUUHS}{N8ze(jf8dD7%&V~Roo|Go@{o;2xmQgIPiNduLPdzuE ziQT==%Z;^Oj+?HPR6j`0K~~vh9%E5*f#N`K+y%&x@N5VPmSQWPd~>c&k<` znvCD##Nj4-t568saB-HFGS&(lX)-^lq*qg0=$yZ!IaW!w)aGcW7p-Pwa^kY7iOxCf z&b5@VLE^c|VsEkb0z)P264AX@>n?CjbrIb$$okgkf2hxwBu?BT{`z}AFyw~&nLVyIl_|S5oA(&TgPS>!n8lgJACWVD8n@jv zrE&76!V~=T%N}wxfxKOKj>~U(lA(^He6sEouF6^x(@i}6>OA7se$B3PdI2(Z^cZ&& zkKQr~sr+F|+#bGJx(dC+9j#K!+~?k4L_js`mVd>Tlet0&+_~nq2bn%PLM*BVg{gwy zm%c~BsZ-P{y}9m@=b0WAMoP>kmVN&_2C0pnq62g1KgpPGe!_bwX44PfvSDumIxjc8 zJ5S){r>EhpMke=fVv~5@{<09Bef$pm8@Xy@=ZbgO?-<65_fC~t`X%pN%Zj5_JiA~H zXVxv}yWh^>>TX68GMxMFxRuCY9jS+Y<>xqfY~J;FP{Z0UKgHO07Pn07)zSrG?}nAE z{_PNUl@9;#emwfjgVgT(o<-}9p|BXS`1a+ohaaG4unQ-*e$Tc<6M@PC4xC8Dzv~bl ze)2KGJ)4U{MaB`{`uG=&4gr$Y8saf3%lLk0JnlLNKK*C#%KcZcbJZ8b zl_`Ym#Ns~sIv%_EQhxjTBX*rgN9sm0^S*gpJ|vQg+!K8E;WrcuMXalJF!k;yxpq`% zwr%*0VJnrOcpW(zOq8&((u5<(}ljuf8R(LI8wC!}OaU z;o5OsvDIYr-IC?Rq?O72rf+@zZTi*3^7D?9gYy|3>B*+=zvpyPG0BS-Qan|x`J79e%+W^T zksYLYjU-rC#I}t)C@NR-+FLcuzVQym_Um{N;C7&P4I-?AUvn8rJIRt|-;iFb#xB5r z(hc`=?UaFNtd;z_ufGVov8)U=efcGio~b-RjgCePRrsf4ziUt2@Ddo@CW17+h~aGGf;8$*Nt#IkwQL z?^K?6=o&m*%35^}-!EIj!DQ(K#E;t_c!Y8NJFr9O=B}cSJo|)rzlVtpAH6}c|9GCh z?Gow=(^>xcXPhak1@CZfeee-RhPh)G&-(G3Z`gA(8;z?god-_msryFp*vY4$YrSq`Rt2dDK-j2 ztkyE|ng_XlVh@Zt$65Tt9(??D#2qLjP4bPp(2YFpM5TZts1$LQU9@5bMMWU;9|()qYr*y%xw=d zsmXKCdiMxLn?tc7H z`UG99e36M=zkbX5?Z!AEJ}Cf}h@dgUpUISRmHblyihd zOHXk9-Ba29!`GY=xNa0d)TrtA3fvn6RVjS@@f!TQ1d$kfh^%rev+jGE>&A8B_aB5@ z>-Bu~>06Au;x^`7*8lvj;)$KCJ&=IGO;2fh9uGf%FTVOTmVf;@CrfN7M8H1y@;Tf* zYogo`qnQ&{qi4<6AFwsCl%S5m7;_8o>OayM9F&~n3xUJ&c~vM~I`h!{c|>*bl)E08 zh0HE{>m^Q~OTs0%FZVw26oZ0YIVSvy-DO>Q=Dw-Id#qr^8}HycW-d2f(wE%hoA_Yq z@0eV@2=s9kft?5Uh=8!0dvnLH;OtJ`{o*$f)SJcn_;9DNtE0LHl5%7NtM}&+(NV#! zy|Liam3!wu#mFumSjvPBEndp0f;s{NJgLmAW@1~lOHE~LUHu)uZaFw zYn`<=>pzlx`XIZC19>ze1czDA>TkYe$FU4FBJhqJKU4ThQ{{Tuiu%Hr8yCODvAXWU zU%8>NZT7!yhcc|+2u4K)(QniwZW9XX$cX0iFIF@7rpI~bwfiZE-Nee>nYecu!R154 zSpC_j>=sJ>>C&HZ>pPAioxJHccm#br`ZHzLwM?5bw3#<6wF4SGx;ug0qPY3a`xw#F zQ!Xf-6n6+)zyRhyGmkJ&op4;Q;MrH+&=(wA5h7v&Bx{O?fQ8sD>j~E=KW9c;)17{J97jYDK-+`zPFo$=nY@6EXK&S zH_mF}Ogeq`@b2LxZCOuhv9uXo$<|%F@#xZnoV~00Wc5jAKJ+9DUwn?x@@PI;`h(n? z)?q0lr@YV^xd{`fugRyVx^=oi>dx=^bmdlt%(#bF7QV>s*Ij`G6T0AD%zfZ#UVZTi zJagmObI6%DVYchpx@{M={v%lM{gW7&T$ueD&fcHoNHckssRuQD~fmfyB)lgH9f zgjM4LH|4?NH73m;{8q|~#tjtxr}u`AD$`Ohun`S~}H{QI{oUwgRKJC1Gs znh$?G$&|Sd@X|{!F!!<{LLkjl8S~kE;0*m|-p8F+P2ki|AG7(KnaAJ$fO}^|3ddk2 zY1LwmI$tKuxRux6e1n;z1NmkBPRea+Mvom$x4;fuJ$DXMM)#*U{&zn6=>SvievvmG zzm>H0U$G;)b)Jf6hpx;O{C)HFXM}T;$xqwkTl-c@3kfGq5T9%1&iT)A*OgK1UGXu8 z@=U1Rd>A+LPF{WUEvEJIV#}|48rY34-J`hk zft%^-Db{V-2gDe{S@_;3%;=@!+mFAbqQ%BfW%4fG`}|kBU2-e$zP*qsJr#WN+6San zD4Bfam2~Uu%jg+5F=NUQTw0{8lnG}dt)vVO|8V*b?1Q^^H*UJ=dir+uxj0Cu)EEk4 zSuC8#FTWH4T3nF;xLm&a@FNO+hO_YHmw9l`2sSNV#MTq}Qcq553*tGRSj06CKFU?& zhcqh%ly!79Z!Z3g9+%$4!dGABzUwZUJp$g`7+s5P{8Nl?$ia^{09F%Z&`1HII*9eF#(BM%EljY?ZFF{@X7(P#nY? zZ@AZ#l%4<%~d316^YLZ=2~+2;O)hjBgXUUyYF!OWqsK2#oHXnH=`1PP4>A1#OA8G z^QjjY8(PWsZM)kzva?fe$Pu`5l0MV!=I$xI*!}$?wx_x9@YBySz`cJh{>8MD|<)tJF+az@mn*a1egu3g9966om zUU`d$t{qG4#%*LvC%FnMc_m5gI-JR+w?EG8J}#^jdXl2-!_!Ycf^XR=q7$bwbEBsl38x7-;^?voL4Lt0dGpa9mA+fI8IVVDaO(a_8*Mp*#09( zhp8tH9-_eEL9mY(QB$txr8nN@)(Jh?^XoPdan<^B`K%k6G9Aj>61z+Bz)Ic!Y4x-1~X+wU-#-mCeQ-`<#z+SUI+3BWEjpc=Cn$bWs$rZc~i> zZ$EwcIcJQWcv0ZsZBvH`Z^72)F8P6VEBJc#38vls1TQRjM%ekWA{c7E(`+nGqa-g! z{(1km@A1Ro9In0hDPDeQ0W&6vXWLD3yJr_6lRH-|V#D!DX5TywH|2j|htfqvSi!}th9L|K>AEl_~b>0z%rpu@sdH>eQ@-uvb zg79^7rBl~PLV~=Tzd-9tm++409R76g79#JgR9H;}g!JX++h-A49}I-~=CEh;Po$+M zqV({_O@xxEF^T9)LRoOfwRG{6ytx1&bH$ua%ce^2VC9z|W3DMi;i{FIaL_?Snm(Pn zas92=)6)z5#$CeRou7-y%E-9xy(!qei=S4dky>iOU5c0;r5sPrBI2@JnLfI=JdPlF zL#F~ahnbyAUT0&CCy$G$Ze+N3tF`MjXe`6RerL;(Oai;+i%8$j6HoRa{>OE=4!Dxb zhIEy8I&Ypmk^7gOCAruk_Y7Altc`xZMy+YpnMhKsnEi=_gpK3I>7$VL(t;Wo8yZ2f zQ0nh9b11Po=;NxY&uOWn@8oIRaqH#6@hl=ZB%s;RMgw^XJ_qL<;HU5Rkt+CX4YSC( z8H$EZ0%B<1!Qpi6?aoh&-zWd_>$v`^P6Fhz$;{7T;&l(uJH!t{rf~g)oovfY7T+J; z#L2Ocm2`&iOQ$h&(ja;40Zz4$k9Ee)yn*X48ztb-$hzn>990fhfAtX-gD}zp?~5}_ z>DE7jV9$KkfBz%t*?JKugvot{gF^!Gc6Fy~j~;aJaUo&fSt?Z~4sKY%aRGi7>6qN0 z7w_uQY|dT#_U7pJUHrH&hx{4`!Rppwo5N~G)3FD$=ibGju0l%v%zBNMj<+{p7M7BdJd(7+eyCr>?5XLHCs4)ohA2`us{z1gu(Rb9Dt&>fc)ZI z%BvN8{ox`EWktAHbd*c2o|^>1g~@SfBYJYR;J1gE>$Iz9b3A4d8G0k#x^~9L(}keO zo`eMYwRQ}Z&Mq7ZT|D?ut1-i4u#AtLDrm z*w>Zd3A4Fu$9}T1b78PAR*Ra;ueqK}Mn<)IUS7f}yao;Dx~nG=B-ATNFy2;^&Y`15 zu6%eVJ%fc(22WyK)IJWzq);_DkYbCGsne#@QD9H-C0DU`(=qHe2Sr(D$f~g5y=yg@ z2kat9G*MOCBDbgtq3A_W(jlNf&pmZFFTCxLna4@6hw}Ipm*el@hX18k5_K?|Jx9_RHPnjE zJ&ao(6tWiNg1uiS^0J-jLz-4c-gYL>xt-}_`%tVrNr$j-uD|nk`i3aTjr8WUQX%9% zpQFbtT=m2ZA_GO(8913Sz4sAw_#9k15S7$jqkjAvjaL3$LWY3QzKr(T&x%h!V9Kmp zm^C>Jb6GwKr$xZqBZkEvCQx2tqPn60TU|BVHhstTm>hx48u@rt?G?!F^B?BqkyOIE zU&i#|5%N2(m@$<-ug73i&tdY+0erao2)B(5BYOW~23`FW4t+k^8G3w=|Hj8>Rpiww zaXp<5H}t`#)`=kEX0Dk$vbC-9?m|aDe+;@F^z1BxT!#T;t%ZqK&E?t&g9NKgYz`Fi zE*{wx6P!hPEU_;H@S;TMQ#=u zDW$l2?&PEF{S-3Ac86tw(lC$KLmU7vBFVQtn{2q8Uvxe{DWLCP6`KZRW znpkT{PmL#X^8E}74;1eSWL)1J?3WayE`>9~F|5{{!NJZg+_%|qmsMxl%<~{Qy0lSlP2Kntzy#nVeCDYCu2`b z>d+}1ubh3X{63lF3Ne41S$1R{!jJKen##O;ZY9LcN~o_N2{i^`0@FF3ZzSsKtB42? zeDj&WkZoJ*kEfd@@NzOKmC(s^nKi)~JO#<(S=IdLUGCJQlX|;xXipAf#OJRV-oyEM z`8h^h+*GVv@d+BO50Ah3K2a@B;Qnn6rQ|j{^N5_1D0K%?s&tH>b{!F}4(tMae0=NO z8A~OFH5Odmv;v@nBO-YsF3x-pDOct~yQ}6pGd7E(S#E|xArzpV&*?{g<&DMLxa{ux znGq34?$Q%-evC>;wNhooV6uZ}VbRM2`5_~fh+U48>jZ4E@ zq{Jq7-0W4XTJ#}@iaPV~gI9~+%Q-10J*i}+G*!1wmX&hWe1*WeI5UYPinC< zgnV2!N!PK5MVwQwS32AK>3^eSZ| z)FN~if}s%KGs?S%?oABnTTj1=wbyuVnK27X@+U%@>T}-2eB6Z7AsZyCO>SAHXd`)d z&4(|rIo*SMAG(PUTPoWGn5&xQ`iLbC?8!54yurS0n_0X5V-kyNcD-KM5`h;P(sd&CDCGLuIJuCKnGPx_EQo=XY4TyGD%h zb|S*me0Rk894Y@u&WEXgrrcW4vjdZ-&n8?bv_+vKD73|~VO;^Ayzv^jnqfR}=T$<4 z3n+86sRja+g|XGTG)A+MTzk4%*t6n2R>f3s`y=-fuBa6ev{TkS!bkJ|JDu6G@i#Vo z{Vs_a_weG~6Xo2eriTSmj#zM?VcdA>068~O=k86Ywk5}pYnA0Jplywd$!R?vKEe2^ zoVO@V)h#X(*d?q|$~r5nY-Obwm%`~_O7bY>$|+iAM2YXHw1S_C^Ld;OJ9hCoO}#fF z;h%>~!@M2N^|*l3?^1sR=Mc|Sh!?9hPQ{Xra^>&IYbdSp`MhG91c}oBHT80>&o7aM zT@oet&Leo`{m$(C{a4n1{wldekMY2aE`s}ZA_tA<%8|X~K-I-fYBQ;0z{shD^fo!$ z+DSRbN-d#c4lzX{yIIB*v-y0EtWwBT!|7z|!Jm2S%UxW4?*q)}5?#)_ju!D= zXKtrO;J;4JZBxkX7%=W~Mt2L4<;BgzpOzY=4IIMs!S3wb_8muy@)$J!b~?F=U_qW! z^WzMstT@XYNdbba_f?g0+eKANDN=dSedq|e&$`~t#+V!DV>z^xUzUE3y)J+!289#% z`w~9-!_@AAfMYv?I0zflEF$vv0iEmY(v>92(M-N>(3Bf8^QheT#Zk4 zJjbN~tsXzso_;vHQCs9(ZmI33lt*h-I?m5e$b+fQ*82EaJVz}BpVj3T$gFJolS9U3 zt;UYgS|>ZS>ZXVzWY{-A=umYTCr&3asPhp1&g*4=ezQ|bXw_IaedZiFRW`Z}8bnB# zmLmtw;3gE%U1g@U!YC{A>UTfjbXf@Re)tN38Ncz~S8L^~`cnU4g`Z_zy2x6b)7@E zhkUkbYnx>W#!ecG)_RVu(dAq*ez3gseS7u5adtf$4<}NT6VF#a?Wc1{FCsf2I~T=S zIh;Oznx7Vb#@-W|a@5q)y%=-pP|6CTS^nK-GSX9tiH)bYsEBN_XaNyXD9X}EDaa=; zFSRk3&fIwEKuW~7G)s1OQVj|5di?yt33WAdGPP95Ujp-6p!@;u^ zOu2d*Jw-%bU7&Z$yI8}_%v4Tg37~NIr&sqV^e2vzY0wZH=t-rBu1zh1)sFp!VaYnj zx?grsT9(g-UwcU)gQ1A|Zsf!ng`XX4KuW9e64 zaH7m48<3#xBN-M@NpxHaF1`YXFi~FJqUwUS6XT;IsL4G|n%+T3pf85Xa+$Xk$-8;! zn;ne3eF2YN)1T#Uz0QGT;Vk-fp=X!w1CLHh@~yV1rrPHfxR zBpchdZR2cg+Z&v4V|zEYot)UVar3_ax9+!Fb*tuE&vf_HbU!`a&kuFiHAkfBGtKB% zIvUqERVqbP11{{(1e`H2+Fu`~29X@EFE8ky+zBa-E=_$%yqsdKV~GT0LZ**hi7B42 zh$@Ole?VK;FSU80Kbe`Gu5<*b4AWA^9nu=eCb-Xz--p68V{QFfVjR+u>6}=y4b<4b zNsB3p!kDS**2eF7Owj-H;zoGY3L+<58Owh(Eua)1uKV=!lH&HyPOlV#AGELV{VH7N zvzI}&jBU{KSW#67{6YAsWNr!OWwCZfmM0Vx4(Sge7Sb3Q842kqhdsxT`tbKV0=IK@ zzTBd6W7BLyQ;ky0!PI&oX%G6-t}cxCi<1qFvDxddJsrXTo!riUkjZgWKCt-C>D|bt9Z>%p7DT z`XTR^_7iF+>Ety^D`FY!wQMi$w!4PLf~^)0^>z=a-U@h|u8e)6pO*0ZKi8B5KTK(O zQaJ3~)sJWE0rq0G^M;2C*=T(6Y`~2I9Go>6_I;{XkZN7*IDROMs9K^$)2UCVkm6{{1pEjTm zZ)4B1DXtNx%WJg@hu=?EQqsq>c!*DTni^%E?kq{oL7s)hFi9^^iAm0xJ-mefx`RINzzV9J6?R?Fs7k+K|=e8u4CGdnJ$VMtSfCJ>1u7aE}9oq%tp zER&6tvG8uA=5F-k7@Wv90yoPn`H63cS33%cBOgkLo#J&p-l1e14HK*bMYyAA2@*y1 zfj!iE*=#!F&dGvS-azArKL-bPET)vXB+sg>SS$dO#)R5Wci82ys;#M+#hz}A6G3CZ)#y}NiF0psGcWQPC_~T zWoYO2f*eoU6+-Zr@2VYHa z`Aty>F~n?_8gkHUC8Wk^3LY+}AGITSGSns2tOUb6&L}rf|ALV>SQat|O{?t-jCXuLS+4YmIR#R6EpVPA0ph@4JI}y$nTMCZWjKH}iFFU`GD7 z+d>=1n?eVW#CNeUcO#^e$!vVaq&PZ=_WOdu;^^@#4-~rKRW$ZMuZPM0NwtUxaL(&& z*fPKmT5agd^X+9XRRi){J0$z$3;YQcfe{;w`}y|caMG?u1`ewk-aAJb!3v$H+IOYi zHds+qy6l9nEt$8;Jg+#I^P;~ZLw5UAU&+Fz=vu5Am@uXX`x17-c>HN|s@}r3hqxug zesHzDln+g?u~@(U81u5wWQcxUKg5x?C0TP?<#0uVTdQ{f(&J9sF8e9^3I*t^IPBjq zo9LW{LAjw{7tGiDJm|~!=WOfNM%I!&D{8Vi=41k6NIPaad7q;xz>mvo%CCfa9=NEpyR_&rH07%s?~Mxmsqys)A>B+p-S{5^@Qq(t)wVojF;~x9`U=cQjH)hFC%)HEqkkzclO_8&~0?m=}OKILrH+{h{05K5p0>~ z9gb}E)PlrCu5iLFth%G;g}t#t_NJ*hhhJE%>FuLYGKF}(-r+`V3&OKPS37$;TT_Jtn2Jlz%h7f2}hStVw!KPdzp{y8Tl`W zG6yls!8uytO8tG*4-b^U}L_n{@0ur_J#e^x=!b2BxXF!a_aP!MpE7halfuM0A zr~w)#D8%-T2qmPAHc8JX_{MV^0XhWG3nQ^rxZtw+*B_0o{E*9)n73A3G!(gSwijQ* zEFpgIOqGt~r`R3oPV(Q zL|Gp20aez^kZx0R@fOo8ZUcA09#gRGhhiV^osxVVF?wOK;f7C;A&_k9kT6~mu!kc3 zzU@!VPgP%p8vo`7k!sRlP1rG6N7XBZ-lEIfptzfae1D8Q!*Ks(tW>88;#Q{q9-}y8zW>}k;;b$G0L%?VI*(8@MsGr;iFm0}pa}6h6 znv^wmM(UM7Ag5yqiC^zMqU5(Q5fju>>!BfFAy7z3iFT3lbd4#{(3E%)v_hxs= ztdNljm#OaS4i0(v$-H6l)y36~FoU4)i78lua)ZRtk3pa&`nWM#M6yt^t+TzDd{Q~? z7KsoDz}PRWv=9C@y>N71m+dv4=h)6<7KoPuq4qetmsm$y!I=E|bK{A zMdUQ0U>{`V$~zOo#UK14-psO)K7P>1ztx9M9dsU?WjAdS#6~xT{mRghoQ#DjC~#p3 zFl_!DvPOmh(qqE31Ay^N!%j{FF+2gqDgaVH4#+#4A0I?uTmk1V{XN3tY%Q!-J;af- z^@n_WXo0#}miawNU*c%D;0d=~MFa&x?C}$~nM06&M>WNEuwoX9-;0%?wPmJxlE%`|)z4?GB|2uQ zc`xdO0O06!^Bz;Pe)5QlWLVL$H?m&j+8Al%f~D@t(3MS=t@5{Ak$KzEHY@$#t_}Ih zz55vX{TiQ{%kZ$1T)VDW&a>v5`;*6voqXZOU(Wl!37d6BsZ@IQoL>Vn_U$R<)tm2f_KaPYN@P z(V`&h-N}#&p>PgNbPd`R?3@x+IFUp|?3gC0Wi&b@kg~i~`~lrTEe*bm9(Bjqyf*A3$M&Oof^Wp6`fWgfiQd#SU0HBNgG)=*imLAzr32%7 zD_+`;8h>|TOsR z$L1}w3y}9BiT*}M{`jjR>ZjXoY|kPw=xG)=9;P%o`3(X#o0eiVWo7& zngghh4B53DA~oC4;zyH)>_n}TOjkR?$5hT~x?UEC{Z~M0kzqzD9V;ag$kW(4faF!8 zvap9`l3XJ;!;vCBJ5Vn>b2SU4La@?v4)yrN?vn>tQsi7 zMD9uk3a!j+Q{)~it^d8K*L{-WPn@r~${2fm4mNaQU9f!<(2LkBP1Q&SmM$4+`bFo1 z0d@hcklYLvKZinZ6#iuF=Rw1=Q0@smAxIrGtN>3dus7THzlksfG@J*HP(^1)jRH<0 zHjfMlE2U>Sg;r)FqKvYnE4#R>tUefi0~0vZhw2tNvoP&=lO`-$U(Ix%Y@p>yqPx!l zC~{_5vEr+FYOp$&3RT@xAaOl=qpbId*4!8#NP%MJ1{*{C$D-EXev0pe&0bl%G16I# zK=;`4sLkkPl}h^%8sLO`i|(!q_RK2$)k;J^1NN}=SggTPrY)(W-M`ye+MgM& zj1k97tGY*>+G#>z(!i8B?1#p8|L4(9;?Zqfg4)lV8T(ZE5-Wq~53|Hbxu{ajGPft0 z_RjyXlIG-rFjD>Xgfo;8ZJj!k-9be;6PeEy5l3JWI{4jx6yDCGa==x50=4DW z%VE;kJ=NELFm|fg#fn;5%g=e%GCY3Q^o>BHv{miwzgz%65fLrD6D^$zp0peZFHkEX z;s1DEWjXI0pXp;fKh&eLvR&-7*-eS%N;g$?+}ez2j9t@2gCd7|O>?(%Ty?)YK_7Vv zB`va)62*cA%cusxL+1;oEkOlUf$B|W*Y^bzz9jm0wq_~0FA~Ur# z{EejC`0t{ErYp@A9(4##7s8NM<3Ay0a?kMGrC2vIGBRY%zj2}ppEh!Csw}gcUGe2W zGtOPKF&RCl2(0~{Cybk$x42wUi~Hk!^;_T4!Lm}qNJmGw+d1BNx;7>$xzV?-b=Q$r zwiAXNDr#yGs8j+Wo{#d4H*XFaITmZCnm#tJLR}W&nb>&Ox~C)NvG*b@EL4<~gvHEKlDOb#+@_&&qOc0{v&Y5=5bnlR zUF0temlvaWQuKew+3Df?*JfDA_&PZGV`cD&ydVEL zWIv{)p#KvnG}GZ+%F@J_@xK8&CvP`x&_L7OO2v2*K1E1yhY5OTrfV zkY+1>a3<}pj7HJewRUxwq{~rd!v;fTenGVDJUXP?nmv-8vF4=$Si_{;_Mks-{N%ca zczf%+W5b_kMowrCFR10!Q?`8pfnulpXT6T6E1c|DitCc!e6NS4ucK)jtQnNj#<$*W z#Opp@CNenP zydf6q#c2G%KKFAL)a!#+L8{s>#B87T<~g}GY5Hl-c& zGdgGB%|ky(Vw8iwDMW3Mo!-}<@jO&yp;C7slTZp0wq&Fr-0)v}+;48b_{lWJ63x}G zK3ZS(2K7e4&0~KHSp%94-a>!p=1B3nq}I{0722myny`g7Y|m$G08NKObErFC%NQ6; z*0R0UT$c^!)RyUA4(ZBueW~RX$h#3J^<0E*_G9hu-x`+uP8Dc{)#`FrI^c3WxAE5I zq*)d0ckjra$cy*3RzKkMJzp6`z^B z#3z9a06hse1tugh8W~!C(E$5nbBz;(t=RV~>C2j{LvaaR!A-9F;99t!f@((O&Bre2 z!FqiH3iP`%pI}z(8~Ap#QEgi<%$xZz1EtfIytMU~Umok;37>$QpZcfPUC#osbm#uD z$k?5uZYH8yPwyo~i&7l-goigtrMHLUJ;;JvEB~wukO@-(9`=*o&Z_xiz$ZN{es`{% z5H>4X{^6IX#o3$d)m<+k{~gHK*JoHCXNH)wG0W(G+1D?wfT0~stQC zVog<}P(*^H^5o4cx#BwRS&+w1gi80-ET%WX(q+(Denw!41Q3*vKnP(fz%k~F=+R>!UduA0AwPHx6L2yMn5ne4Ths#n0unB}|P-4Q~&(uG73@@njwxHDU=yMe-ZAKey^S4p~wXA3wasAPbdOwZZ=G57&Ki z75@}`2YTho8yp5UQO7X3)+c{Y2tUF=ZW-4aaj7Md5yTy5!Y$DI<%w}J(DPU@)5U{3SYgIH(`7xQ6@U0%tWz=p`BbrY z4!167-y+$m7Zm8|VxzS3k1d=;r8uemg)i58Pi5PM?nD&-Do>ei-G+jK20m%@Q~rj3 zv%dWN2J~k;@`glgGhWPYtRzo zzrw->1fL4z3A`V8p>cLMHNAaUzqIG2h3u=F!=Z&>}O``oJ~vA$b#4Hl}P>|Fy}3FIX((n4!VRPqS>RSCP<2(?`Ks zRuggBGjrMR>RK^Z2~wfF8aOHYTm*9V;15jV-!hh`yEJWg7M2DWB<&O~TKuYGSFM4V zps2&bdWkQ{ug7ta!|b2*pw>3;HTBfaZDrVRyV43$xO(Q7s=6fE&OYsOgc?M8Ci%6s zFkUrhG`CI7)ur)wo!(RT#-6J$NDf$yXECHr8ZwRU#y$*O;*|jl>I_C2d3~SF3n*_COzjfMK?G6;c_Lp8lc&%J(y^$ zKR=vsAS5jC0s*9OOFZzrc)j<`v75tSKA+i`%n9jyFr_Ff4#8V_e=J9D9z>M$zF_e* zoGf3u3qD<|%ZqGN=M!cLzmfHu{{Qo$UkP^Vr| zFLd{=ZGh-5jB%kid7o|FQ`qa6z(+|@j!wdu&ikW z^$*m-DBuJ|nNS&2FU#ur@EyQ8(^Oh_ib0z@#Y$zHpxjy>ZYDgk1NKt5gmz5tVL2-| zq?!%rX;>0Y^`EiAZYJt%?nv+F_!6^M091uoG2&6J4!qO0GlfT-D;CF9VZdue5y&#V z=3Rm7s3^_mZ9i$f#3KNvakrFM^{jrU)evWI>FklcUuv;#ME#2N!oS|#-0Iq_NGSq~ z!*<*OYmR(Oh{fYdPl{+`ADm>is%A@A*@du zNK{%Ac$q`?XZYn!^YUkpClzvivm1Ui664`%HzJWE%MR+%h|W%jj*-ct1P|fkRuod5 zBRNZ7*B_Rx%ZWx6^)c|c z9?|7px?50vrnx2}sSsUUaZm7qL|AgE%K>X*;XD}~z&(=F-|{l6N;;5}q<|g3e>plR z1zQuNv&wfKt;*loJ9LWub2%ev7c&P`(3JIe$+Y0xntgns)NG8@mYDU2Wk;ZiROEf} zsqR-ZY{mkX)BQ&WysNV0;U`aRL(^_e`6@8X zwu(a2lP8SZn-nYICFg5a^03Qpe2_PnJ3>@iw_401nL2krLFOoj=fO&|Vrla^bJ3;* z4yrB0F8aERf}&3MB!21~LnenAw%}-5xFJ;5^3slI z16??l0IrFBT<^BS1fQhT+$A4|`h2-Hv0i|c!nzDtr)s4caZ2NPLy9Ey3l=nj)_ zT}W8GnY@>g(v+N^p6l_VGHD_HWk-+DP}@^rVc~bHxd5ZSP~EJu)M43V?Ci~{X#y5# zo>|~CdgwsJjTq|mnh^yjNGO1W<>w=>l6o?eEkbB4Q9xXrkQGgYXRA-76NQq&ClWE6 zO;uG5eTgZE8i>u9nwIbJ-B?qceTK9J@;}4uQ3$EIAF|ivLEh;0ul-4=`iy)3Y3Sh>yC}`pi~9CZ{3tms&40on8u=@qu=ifre{cA2 zgp5#>{=Z21pSA8g=>JCnELwi@e`D)^S4ULo|C>Ait^NPAfL!E%&Hv}cNR$8jlqtj;3xX5W- z^NKiVy~3Ra%v>wD`S|wq1`M5-HPIui)O+ssE>)V9my-i;kh8&V0B}AxK1HhUZT^XgsH%=(|79hlEJk4qbZ{xy7st{;fGHRX{l$ zI-#Z*wLE%@r)x9cx@(uZ$wlM0tjUGz`D+Sar=sl_DUVgg8sjZ~XB)nceV3JTc&(dp zeQno|p_E47`fX7`A>S<@in#NrL9LEUKSrC6$k6dKTfO%9v<=oySc{Y7wSeY=;>@&P*#MqkCxnk*`IBk&zV{I=!DdF zHN?+yKP{{+3{ipMym_9z;n7xn5So9(AY761_d1*ZR;=StB=hq2=V(tI9m_5axkLC+2oyWdrCFuV5p1K z|9(b9z2k*6Ln-&e2+84J!AYNS+x$jM4Cr*l=@*^LsCh-kf;~EA8P11+u#O&$fnRId zL@rQv6DulL-UPY$Vlxm+lxrZj>OxTw7-x96xpt(&?s{U!{+nwf{hc+7(}s`bsIfVA z(OTFB?EwG7ozvdFYHM?0M;3T&CirIgbw?%W{XD;6A=#y^VY_;Qu{q76{=xA6!9`qa z_U}JCzS5I(Idb*-(4K4&YrZZ3TXW>6I{uN?RrPT-;UOR?xXF}j6|O-xFI{T7DQ?+c zd^|7rgNH~u14k1ZYME-7i58^BG`O(=k3V^8TUt=i1p{#4GKv!~mzEX-?MH{z_cAO_ zJ+LQb<;V#;!7_lMUjtuj8Wt0i{2~hy;k@bLUj6vR_|&z_8E589`qz}C79#k)|Hwc3 zw6EH}W4X?yy3n6Ms*Usde*5OAs@bBOI0{07>RPXIR|hM3By7XWJwiV(y?`BS)Bhy3 z&cTX7LA^MIuz579C%MpOZPy=&0aYKLT9mZhkt){+xf;<#J=hMUE1Yg_@+%*iFPL;b zH53S`rY#%{95D8YCU&!TU4?nnEj)a|ISz*5ivHmU&pFOB>bbUatQ_EK@i-1EWp_sl)Y~R}2 z4ycZUPoXfw!E|QC$lI@*2r)#az}$W~?GRyHY~I4%j7w4`30L7W3p~_f0AuW%t1Pa` z$4Nyrhehcv6rWQ@PH5~LpG5V#^#}o70eIc6xjy?`vH)=2S`0o5H1zgq(ExZA!tCNl z8Fl*)6+5UC4Tk(8(U7n#WMTgaQ-ENks4B10wKq~8{lMvAXthM%pJ+Vk>$>3yrh?W_ z=YVl+kYYhsVJ>_lA+?-cHm`f)3TILc$racxx~IU3!T@rlryis_e>buuY(MJ*J6Nxv z;?#<3G5KXJ`eA#5o-S{MjSr@K=t$@Sh$;*44 z(Nf#mZNM&#?>xMo4q}PCxl7aTH-R35x8RSF7fE|BC&7}CQzrF=O)R{C^2Y4mz-XjQ zZd?bL&UiUgJ6=q|T&@-Ot!V**5t?2;(#$X2%xim<$&0Q9c9kSd)jxfSLaSO6(YM<` z2TVqej?E{!p&6qGGE<}TB0^9ElT4z;Sk9@9j_fBbmo^N7oG<uHX=n*gSr@AVY_M z_nthn&K*IZc=Ss&j)y4nJ4wJAxxH-9!sPB=yn$otJ|p^iPnGSUE2r+Za}-hvD9J=Z zL2=QFlK4`(UEO*D`#Y zWp{DJm_q&oNHaI^Bh>TO)G9SYnhcLOY1pwk;n#ofo$njk3Sw?qm#w_lKeOGgkg+q5 z$S;YRY6QTyE;lueuQaO-s~^ zE{sB1Dk1=A5d6D-RWlt)DJ{dMs(qILkr!;Ydd2SjB;91r*6xunBbWQukI*%GuNpRlWHsN7hYiH&kvgPk=0p9Sf!(pC3S+g_9#=qYfP_qWg?BFIJTtqqguo};h~G;_T#De5qu zs_e#y$H*?_HiN}i7jnI!H+sBXzy5cby`C60w%*Uf#I2i^*4#mh6T5YJ2A^dsc>{ z>rc$7Wuq_td_8w=oMI3FYW4AIOh1U!g`Csc=s2Nz^@;7WWz0zFGNlep8MarNMYNn^ z2_@b#EAZkmxoGe1C)Pz-GE9(iJ*A9K=rVoA%%lsgMB!B+k?s z30>|!t%{cQjikH`)`7lj4hbGw6D0RUj5UL}LK}*KzIrt{tHXS5fo%O|4OwcCkKRjm zC7s2}eZGWXHwp}WYYa~J!npR9M>KRSxtdK_0Xa2Q&bv+Og4J5G!7?i@I3aXzj8>16 zm4_wY0tD>5AHKoWcse#^_6y(hI_Y1FsumUK@viF?9NTJwkvf%c$LpDh!XI6(=&9;m zsN2c6+knJXNa~C!$%ScJt-9HA`c@RI7JvjQf@(;jNV}&~*@zlGjaPx{$Lw&Qy?zlY z3+n39o?*WD;vO))UTrFo1&}`ne0hIE!OtCkSYtTX1ZlgVr0=NxX#Vw%5Zd?cRWTwK zS1gyY+FID`Z2Q&;l`RVr8}7P!RAN=1YNZ<6Yx$s@@S~Fr9mtmd^IXy~9zU#0UqLP{ zGzjJz_wG<7I{Fr4oW1rqNbJvsw>FL;mrnPZB>XvoZ1nbP{yaU{BSEPU=KG#oo%_`{ zX-pP`*t_mps!Grpa0k)d6w?G{er<1`@flgV#COnH-9oQtPO~QyQR`6*iJW#Q{d#`OVBO|C&rLf_WTbS`*s0iD9t=B}r#Q&Qp1%&S+9_ z0%Okvkw7~0`dgIHOJ=G(qQrweMfFU|Rj+X^d)^jE1N&1Mh!GPr&C*_QG*dt=nn(ar z!-#{bOMf^KkwP|GP&R(whFYL5YZOc9949FPbjG^sL4f{`V8Nb0Tw~18_%+*-fp3_O zsapKpw)k)jYQ?7kr$OG-binES(%<>Uwy*tHPe<>m!0eCX-&>ERjiit1zmAV(Y~k zi(&vGG7IYK+K*r7#VOKU-0M!}yn2#gP&doTeRh24HC?{sl!d(}g;7`6Gh45)i>x93 zdD(^N;#D=z3t4eFgxty?yVBU;wlnas2UPod{u;X~yqeRvy6WM2^1hIYjGRnt1a?!m z%|#QfUxXGZ<^a2P(d$%!Hr|2pJP3IC>-BCCsn(JOP8KGU^?ZlZvi$iKZvgU31 zykPA_VY9eS$$W<_1HqNHIuEE9ey>o3&>@mPC_L{0a`Eqh#E~h{xqdJpeDxa3WqCAl zuyFdMTkyh6|GC40)3!4_1EIF?E&7%1Khqcn{dBJoQI`}!oW10Vg|o8P$Nb0csp{r#X2FJU`y6tE{XxF3YrFgPMqth zy0x)zGbsCZMIEd^YQ|UcqXIaJ%qi?{^3iBxP#`W1@cF z9XxtokvfNrtHJ`f{fncv3RMnigvM^FnR<5kh*(@qAFZ?W# z53^8YJ&y@{yjdOPrhto% zmnbk_)ZZGu))9?W|7bhOWja5M%gT;hQWZt-Zz5P1Jlz+8cXSvK)G`o9Dliu!2k0KH zy@_cs7_*o?NB5*cCYu>eSg9XeN=cD1+TxkO+^=yv5PpS;CZ5sx2aCF>hRP{&BsvkQ z@MH>Rye&{%?Q#*q>c&75U9;EZ8D6Q&eKT`waEqv05J*hs=8@UZ{=45PMr?Di>Xvn= z4inEfVBl-XP~G(r5^qOjhb5s5Q@rJzqX>8Zc|?%FOBp-%o7ID_y8DTRr+}N0TZi2D z`Ag{Ee?{%=H+RiGrRRsmD&NVh6!98Mns4@3N5$3zM6^okH@|J2>c8^l0T|F4m0@1E zs&^7O((@yX8glr03b@jg9TJpi;CwcU5JUtxe4p3({w(|cc=Um_h`lfZ3Uf?b1%+%- zbJx8Ss-M#T+)yL)J;xC)gMhtq{&Xbb=xBAsEm$aeGNy_Ajk6MB8;7AWGjH~Ho-H|@ zm;vZ-MUzWo5`LfHav0^I`S_$HJkLR}(H)|KZ5mCG`m5>{$D!*+&?jzBMOk@hf&nJM zt1pq(*u-yIe_huyxE}D!u2y!%J<2QGYRJe1&Zg&$DA>ju=w|^xwKZJn(Y|wE$gzIQVaAPd zAGqLnVbLe3C@cXbwrOCid?Gd;zjh6&ifiA=^FQ^$BOqJt^&h;`m%nm`hOXnhx>r78 z#He7zy`M_3n*n?A^UijW5{i^dgocnS@SnENo-l4*3M4t>xrovYH>m3FN9|lak@nME zE;dgm6g2%T@n`oD_Lm~#ES-)f^9)`gwhF?Twf+pb-K8U{V=T~(00 zCDdVMaW=p6PR+^pSQCl*7B(w99v@CJ8KS>np$_;8VwBK)7cbKh6dz`G+}rd&MEuWT z2j964uA&At9Ba!XemCg~uKQ=?bw9!-sRWgdF8AfF>y3An?ckC&|Hgjn-We1+cxPex z<8|c}IXb~+W4ng<^Xzt-!PiH5&?T@4A@=rflgW>1myG6a{ixB>Ft58USdlQdj`zNc zpT;~QGk!|+tB#>p$Zrua7vUw1w_mC!4eapAV_JQd>dEqkyM1Ew1Hc_uGd{K}&Y`<` z=Ig5Q!^}e%eyL2oZ%<6P_*UCNQ1DC6+w@ZP&|pdEpFeD{ zi>@MG{H3GQ!u-^E9Ip|!IS;luEvsq@Ywvd`$NU1Pc^T}~EG&H<7@WmE5sWHK-yV^~ zg?RD?DT@tRaK*ls{jOIVQphK_0plS#jGLST@+>^F7v*+5Oh!(5c6S+!7IqX^Nf>{P z!aTrv4Yi(3Ti|STd(hZSh<^05=f4!s6n1o*;__hQNe$g%E!G*jBOGV|p9ypA!aQ$> z<1W1qoB8>uVyf4HnIggq%x*P)vv{sov#k$ZPP@R?aEFEJ?RP7OSw(G;u;DN(A>VjQ z1rGw%<_VvEgw8Oor1PJP;Aj;;5}uI$S4UeoX;5O-0#UKx6~aU8_ieC6F2#i=%LB5< z&MedYw$QEr`|A*Q^!R}m@u{*yn^o;3LwrV3s7n_^orjU9#eIT^p8 z%l8d>{|pA08$)w`{LceeS~XUt@f_j#gvqDFORVBC!l1Mf*(|By?7a8Xc4!Hwr$=%3 zQ)<%{K(1N50nClQ_Sk+U6#2X7-?ym9lbJ2N$~sVv+A0LUpMm?jMsquE!&`e7C`-A^^+^oLXcwU_BHKewv*xzmq=Z*KvVR(3qwIrDUFs>e%fTFs;=+f>V3{kJH zV7edCO%lJIF>Krn0ohcR^mkf&JDOE7P%!2CkiWND#ifVD%G0Tw1Cs$Uafai8LW;`E z-!lYlS6i@5dg#wF+eWk=IJ3HS``2jTt0r{s?$^WBkNVbN{6{}iCA4!(JA231A=`|Z^9;!bL~E<|3Le9D3OZ{MJx#9ENwDUc%w%(9N! z+!izFgx;%#@~3gFs)c&#F8-j`)}#OwG9(`+Km?;z7Wc#{)NMCI**7}Iq$-bZbkzl1 zI733^o1HmkOXn3=D8aI390d*9)p^%gLdk1yQ5!7tO&n#Q;KdDXsjCpIfuHS0obFo$ z1mh~eR|qA>GvCMK`af^9QMJI+aTjM8ss!`NI-@~OU-7p57(R|otE-A7lCip#*fkKC6*@%r0-At&z*SbyGEM)No+VV8vfA^s0Y zB6o4af_9aGH-+wzoU*MR_te@gT`GmHj$fz=jLAgL*&5jXB3DI5E%OHZ%8dbG{x=Yz z{g7Mqz7Q@D;;l&4eGwhEqwS6}sW+zzd0T(;XK%Ag_Y24SquVZ6_Dx%At+()P1)M_P ziBN6P+);&Ita9I{H8ISS4!h9`H#}o^Rhgg4N^nrmWAa5&l$8Ez?e(zQ#MYUbz&^a+ zQ=AiFN!eTx<$8T$U8K(q>zGl3n!=)&6|SOaaBZ_cWaRUhu*hUc=f%=~MkJ zsJmCUVr8@06YW9}qq8`Z=;kWR+q5*-6`_Og@2RO7L%xHZ+ITryhA{)b>$yn4kYIG4 zF2pqNVdC|Cn~{P)<)8vdn^h}byW5*NRF#U)A+h5?@i?EJ)hSsJ+pXcSnuLtR|T9!-Viv?1ppK?~`U@ICl92IK#?>$K#_JCCV)(gy*E&v#*6q((k- zAIh)ps~jM#OC>-70jiCefsf~F!_}J z`81JZ(5{bNgTSW|s`|T&D`q`Z8ETM{H=at^e&p<0n4eFW7ObCvgGkw9T!@>ByLv#P zZYq*%)eF6CThYhg8*z;}Gk3zQvqu^~>>ZJO7$i$6SuN}4R-HE7FEivo`+mGWsr?hG z!K@eBx>DZqq+GETp$R`si`NN6A$*H~zRjxt24uxGh@2U4j(nsh z#VA=>gS$mvD2~)C!(g%v?)CDQBeEC}uf1{Q+X3K4)EjcBSBTwCZdotQ(-25yI09h1 zVl6XOOHG}9m>tlOY!G9}c4holB(eP9kIxmfxZqnjPr(Fe$vR%;kE=4e~2Xe8rP zLPuN7V+(;T5_uE0bar^IlsK&1wGWV*e$6L%Ql7i(f0Jp>HR;IKa}+uvDH34-6iJhdL`i=(sf7H$uf_?cqy@uRlM zqxlX9B8<)w&l^sF2!9cUacR|_?o+9%MtKxmhGn1b{p>>GDnXV$==C-U7MFY7$aW$0 zfHMu#=)4ICq1HGwcS7<>!%lsWVKJ>@ar zdbptbR{hvrCj2nMow^@K4Ok6d5r`hI1Rz`2(nIklhz#GVR1WFkj`2CTC8$piGG)Cx zSSi`8Bs=_s>ZJ4QMrF9+VtOW7pYK+>N5J?%1q&yz&Ruoc+FWk&m{#t${+< zctOwhcef6=I71&%8Uz2@DECSzJq5z5iFfx6PCUd%1f0pKqMG$HExX3sbi`zWjfq4N zOz|+oMAC2e%kbDj?sy&x>~)98-ISC!NJL)SN`bC{e%vk0#{+QLH!F{{-dyH-e*Xg<`b{OkhsHx)d~{{Q23DZ786n@%YZHC zHUOpfmmq5daYxC6gXu*E?^Y6?k}q}j)5)C*v$p_=R77;+APym|g+)G}6XI2?QZ(pj zTT0!J8m+NEq2V@NCp>rAbbyOI{k^P{6&VhpSHmwl);@;%H$#K^-t}^r8L9uM43S$#fs=+0d=D80IJfWGF_qGR+^f>w{=d^!xl4R4e>jr ziaXz)`sdQ}$Qw>T*9&s+TQ*fiVSHs90lQ}-JF#4u5|;ItHZAESz_w;K;?X z7q2S3R&3|Ca#<6kdK1rhglSf~mCsj=tH#PZ+H7sm{I?liO*NezUN6pV$(Tt4i-z=} zG4j$SZ4bX@uCkLybg;Tih^cqH;x|#nY;O$`krgS*?}AJ6;V zs`u8dd%ypt&g_{vr)E!g&vgH~^K^ z5R;~KE?PJAC$BrY0^7~5V@Rl4nF0OOsJO=pGBO`k$@gIEuu5g*+Nja_JMhn`^2C+{yrCJofMZNsz@oK~zojQkM<7nfght@l`&I44Pm!71XypJZZ3 z#}aidjLc+#Sv;6ow%`5$qVw`F22Pn;`S^|-mzU?H|?>-x!23y{r1=j*Oo+8l%@CtiWBhJny=juph;c%GnU9eMz({|l9w;1&Fx$xzyz zP3Ji_DYrebZYKS3$CR`%2zYe6eB^i$zH>2%!P{(0Sr+io!$oD;)=sNtnbRxSe)z!; z?1Ug^dhvc;zc~d2?)W+F*U)~gQu9{K#JsBGg$aXt3B9i6Y!^p|b%vYKZoz;5=di%t zR2CUp+9z7HPwKiFL}?SMlLZd$-TK*j)sf7-u;)j#jtiy_+UwrVyo!ORd-n!_?TiJv zp*Y%O-{S@eYtY=IiQOaVP}p~hj0v+9RqOx>y%l*|F_epNof~`dG^(dq zZpA44B;AdZoY5bA#4(%iuC3E0PxJ?YIQgy<+v=CS+tVbnX@;~9A_VX5GCQd=)-hCfew{czy;PL5B z(=d3%2-%EkhiV1mf_?EJ75#C6B#+;VwCZ;0Pkk;GPQMm!-a{BsZyDRti|TXF8qcYU zscvpKoBJT7(i!cOr{y%_@|-%KEVCVi0SXFeoi_D*oS{19cj4fhhh}h0b=`yt(-Fz) z@GVEeC`Xu)=t*(yAX-nm7Q{#eZ;LI>5^|AHZ*2&-nlV!`8Vlp^`X>c?3pq_R?|_b9(aHM(eo5QQ1d zJ$N!I`-0^zGOXdTdOX>6-u(Qcl)R}uB<}e`rQ8>?Xt>9^p~{_M`j+0|S-@Q0poOJn z;5*{$s2dj`WJ|Q;!ot|qSNmOCQ1_UhP$Y|m`R zz}y4278YaKQj$tGctxVkgeyHv>+}+y`ZQXMZ1gWv-(pC#H3HftX9G`@b8J}qEL2m}nW&zIWMG`+V_i}fGrHU@|+6Jy3E*09L zcKB&IR@yGIW~=Tf>_iV}u=@HFa?Dn^1P9>*g6YH%Uuv1*XdCFR>T>X7gI2eHP6K_%y*LLIa0k^;oC5l!h$Ep%J&~C_na3yC?7n zbuTWI&c{ap7c7wez8u3;Z!htm+y+?+E;nvPluemP*6PY>AZ7yb!ODcaG+ZVzW9z+E z{&ez?CMJ;EmGsg+WOzbUS-qofY_@;w;gavLG5!3Q z%I}>BJ7quCok{oRPA{69dueD!y0}_NU@_2@)w8ay*<%p7uh&iQu3(P*UCb09}UFzCU#r1@K*N66wj%BZc2Ev(kUtUP5D=@0lLe*SkFk=QjH@bbjgP78tZsXNKiAv}FW)LnMU3|xDu@()9jhM<Q+$D*zXDM3zM0?!P5t?lR5!b?{lQ<0lMg;gFoRvJxr6kzBNrPV9~p%c>XP& zi*xqC-)rDho5NQ&Bb3Zw{Vr~dv@7IY{kfMY3PujJuzw?Z)+4Fx$?7?y*WPCI*&a7t z8YNLxuV}jnFlKc3c&3~KPqtnr7s(&{4U%EU7017^Rle)9gV(94#Tc%WLwq9>zEZfP zN$_CTJFl6C(K&lU0}n5O$ez%vb$_qZuF9R*c=;jRilc9R*Ug>V-oIYKltHUL+(3Y1 zg$bvl`WL;fX4T2t7G}67sm**{=3vI&!%hT+e6!v1kcH(wRJfMecljAyHC{|=jLRnw zW6BJczd63Z)h=~J#P41Wqvalp^bT+SqpUkn$gHjs=Nc5vgc6N8w`s|dv#?*;ScFVC zkT-i*V{~HFnsM5tx~ngk1Bp$-J2l&aI;?|HuC10W>hBL4c+66Y6j?qE$`fTJj6Fj9D11ymkk%q2 zc3zBSvmLfl+J7b=0Bp^r-Fdz=NXQdrf0I*S6g&0BJwsUW@Z6!@g$H+Xi}d;nUvONl z-|j~35tDFGU<=Q}2jzvbg>opdD2qLxHQNccb} zRwDO_yQbGx!XCRZt`U$$-1hV^nI028ld)k!cpUC)(^|k!akiF+Fv2zUYSm6BUYMlM z(+iCoICy~z3fwJxJf)5`7QDVL_}}@Nlr;<_ZfmyWCsJiRE?Go`giVdpU}F@BX01U? zO#9+vi#3j%QM^(IcG$r~VR8bob{$OWOP4m>d?MK21Jqha5w}5$64vU1-#L@&K?0JG z)h#?Uwsi&V6d8G6yn6yXrp4u^L3) zdLM$uVC3Gk6t^*ZX4(T(BkRe9yKb-9qq{>5F{L2Ez|^J(DoV>UJU^Ppq8|n;$5QQ0 zy&uaK`kJOF_RXZ8qdPK*;AF%ldEBuPvr;!9emxQ(FV^hJH& zGo5~fU&B)zCMQd^IC>HSFF-{m|0xjpIyy%l#EB$qj>nWOBpxKSc|;#?WP;m4FW{8f z*PQT39X66r6zorSx5k}5$G3SzC~cEzA;;ri9h)>VMeDL7ZzKOfztT>8u>bGb zh6TzDDXB7)-(sJmh1Kp*elu`Q2~HFP3qK~M*ymyC+Se44HWobc@v#O51vSVEY8xfR z_(4rmmu-6E7x#GD(A4*2Rkhp=^Vetgr{j;x=(t3Iby}a0(=wZbOxpEy!+=qwi-Y~0 z+nZ>p@~?@SXgq7uip1e%EmkTqH={9Z}AF?{lbDCA-Ic)$Xrgi^13!Oin5dwMDP1< zBl=Y3(giLg5A&rDoE;xU4c7+=S zO~R~$luV}t5UtY4r+aJr+}{1JV*WF;fmj-TMue~!QCghKeHRkrp>OdIurt$tWR$?~ z$8fm`f|Uc!SHBG)Do{`L%AjTtW%@kH95Fvo08=yUX*PO<^5WTn2rj*)E+i}*1Pzy7 zc*W<~4>Gc+p=Eg=f=BQ`u@**TV#ixWO7m@fI zEM&0g5c3yW;yz|lEB$GMOlZv~v^o$#Lu!P$OeFHIC+`aqV$Y<`;?FfA6COBlq`V>p z(<;v0U%&i21hHAFhn0eUZiaxMMd>*@5wDLuVKHzg9p2v$WDBbWQHq3CoUbYPM21Gr zBv-Cb&O#%G&DxkE(|9ws-+k801xm{SDR_7y_u*bUef^w_9#F_ubwr%AY#}M(sX-KN zx>Y*om~KWjgR|^k1+puaMCt#EZGtPS!jY?aY8k zwS({(Crb-@L2vm-mu#vsntzd}2~a4Y!eRVk4dY%dCTYU*)Nmm&N=g8-ZuH#tJPDjf zC{VFJgrA5gHILu+IU@H=h#7}Pz!kPN0=JU1B_nag0jlgZy=D%OIkX;_PjO+g6ud%e z+l5|yUSrTu$plp5=)7}`GgKX9_=d+Y`GTI@vz*ROyaIEEyJr{VxK3`N>F#d+RFXH# zpa@x%eUR1Fgp4mM`1cfzz?y`C82Nq*M?C8RsoT;+NdFcoh8O2sEQ%{v8rp-+o8EZg-d}E9n4V=$?AzX6 zx0RgmLsSG*uk8Y?L$hD<%$?54zbu|+slf5VBG{o}9Q(hyD(DDxkGEowzjP_1p8ou1 z2&*h|Tfw8qWY?EZfq``#rsKfzLgsJ-cS-Oyg~X^h<@}W;F2(yZt* zvcC|KYED%#;hZ<2Cr)$2nY6Pf1w&Q*_(FVkKB{L;^*o2-N#X?stI=khlxwE(r`T*tf%{dCSVxQ=WptmfwMgaNNr;VG2 z$^LYLc3=#0-O7frlWO#sRl_nD<_kunu`Cq)VZ1=>X}5nT@}b}7l=y`ZgkWZ4G#mjg z64;k&e=g&03mSZriAi_VS~XrnCcTiD7=StLptwbP8Hk zoAOtu&qda4F9!>jRRaCaRZJT`W%takA>)v8iX+i0MgzFXy$4341 zRn;fDgTf6i&+jn>pQ&BOmqsxR?3>P9qAL#&=@>_@qi8;G8Fv1m+jK`xj|kz-pr*+2ovzDzw6h>;jyu& zh`}S*H5ab=sbx#DIYns(3r?!J31m%1GZz?g#lLFU+X_a zO{bL?mIIsYNvuNkRr0EYh7T2_pi5N{is{Me7p?8TmaD==z=ksQ_{+_z3+HB}_m-VQ ze=6EaPUg^fEzsFRDS-e}o?k^_e%<#sBC7Tce6@6NOel)$9-Rq;IsQGER(crph{NTDwVpD}4 zxjFKQ7*4EgyEVU#J295i0vc}0aJ@{gBNnzZDR+cd1b%5Wx>K8Ii@7+@^H$)6lgi>G zGhb_274rn*SN`CfFw)y2`lQ_F2|1fbBiMp*GfDZ(;n<+R>m!nW6$TG~thnsg6u)N# z|1vIOV`5x=@w_S!Z9EndEt>LOhT=skM72tAS9V`~!uPGY$S>=8kgHP2~WzTz!kNeMP~U~@K8=o)2m!&rK3 zbgHjLKLc`{rgLI9Wh@%a1{-gu=!%||ZXQ+8Ng@Go*!TlAQkn0IYA*ceTNRKKGG&)zNpZaQF z=drvdZnvS8`N3HEPWSH#x4LQ>+I+xeRhh;{{&ruhtIdk*@=H_Bi-5I|mP8$ihH1Zf z^J)nd(^%j~dYl@;qE$cngER(gf!7a5?&eEjKLA_zuY>EJ?*^1JpC4QNikxOj?(}V1 zhC1-^b-OTCMZW~4f4HY6B}JMUk|N3Xr9~A*|6ut|nkL6M65&*$(Nw3AL963PO_49@ z=tkH(z6_BxIM!z@0awPot?sP->U7M0nF;Kt4ficHw-J`C5qAbY%!%tNfmn!kMyZvl zCt2wyceYP@;7J}2AM*JuNMLN8i<+ue6D*krr)WS75O^YyfR}i50(NAPu}7Qv zz3!uwI7=p^WCJJnwsb!NqgFszWFC*H@30o2(aCN56|N5|lv98ggeM$ox;54w7EO~Opvojw0k_jC); zp<3KFtx|IxA0DLgF&-sXkACT7$Gt|yi>`_4NT0Fm+JOv zPDsbogE?di#h$2-y6@D$@7eeCVL6bX&U>G?@fY!no39BUxXDUT*!TDV2x<_7^@PF# zfJ2GW6zE~wViYuYr)&84csMwr<7RoStq-fP(Q}uN!uCHdkPJ4vVZp=4p9I&HQooT5 zO*xRTonv3NIiSR#!h1Qu-Y^(6;5yUv9e$_BwX(_e_kass>+fkG-g|s?#wk4%R3m5# zXV;s%xn{N0zwbNxI+Lb_tpIAcA&?A)LqQTD5r2#8{!^LB$@LBw9vu#!=j>tfVxHMQ z3833X@ObVZu0*tWO)%Dy$?W?;RoSw`WT(d(_00U7w0LkOEr(p&WcHIhG&(n|fyL+~ z-*2eDa;-w1(LhmB?dLigO6k6MvYr=GLINU&0-L$x7WLV7z=3Cef$0zU=)dsi>r{{% zJYCN<6F1`3K!r?IgL|qD%ZOC|mY<$D`jdN=28vEb@U+8zU-`TSfdj7DDmQ1~dUstin+1ce&w&#|npSzo2^Th|DLNt)E^Vgez7Dc^ z%Iuf+*^|~~j*iRad~-!=TH8rFoHZdOui(&wvcsJ5c`Us#z?1CNlAURLpiDghyJ&#k z$oOS>@;s{zJaC_26qa2d&}P?`yjm{rlrSb56wSB;_xYK^BpHZ2#SNX=6Y5n{{kciG za9L616Q{$Z6WrONwfd2%@nli4jym}G6T24g@bw+x@4^*kYmP8+vN#`)PdoWC32-oh z9s)$Ud3nR5qx^f0r``JX!w2R1iHzFX7<^fLWK)SHx)tgetooFFKy{k9ZzS?w>RfW8 z7_4}ssYyw}`b(?FcSdPkAk#gC?$pHo#HFxB!d^5(X-%n8E%#{pBcOs@*8#D>AdMz^ z6Xae3Te}rH{Sor_5v8Lm)=7y+UM(}tvW_Yy>iWw@nQ|HV(Ye5SEGjXrcubL!T4JQk zUhtw%VL_1+_`tPs!L{acAV#&6$OJOrI``QqwZ#H`xUO;&fm?s*Wshj5%m5tYnuH;x zAjKDRG1LU^SFN%ybeD#sY9M-s)FjrKbW5c2BP-XuzROs*F*&%GlVJ^7x*P*QC&>MO zmlj|YaWgy#Q_X!4t)@;ICuKiW`&tStoI~HQidekdw(h|uEuN-nEGBzVM({VmGL0gv z;!40|7B58I97!#syJU_W<)sk1nw`~``tHjeT&Gb-BK+RyvUw}wE_S9VGK|AYh1vo^FP7>E8{-9Z}rtL-QI23Z9<4?yHWla>)$5dyd*2$b&+$+oKKSi6~}(} z{FjwiJ6cOmE6!3|K|xbgSMh6uPfz<;`(yJWf_Omju&<>@1SV~>`hHBu^p_jLL4$U`7& zd_R-+2^QrNYEPfqcFZT_`AkXiWgZhT3ogaM1oI4YM4bYQ?|W*&D z0v=35#?0V%%he=4;jpA*LC6)0ni9f909-81k55gH;Vn0Ph^L2+nG1~)f|`@GJY_!l z>c=}5UPTc<1x!|D^)w2%i>Ekma@j~Eh73Aa?vH%y@=u4I=opnmdkGX{I=;O?6Ure8 zG<+?|>t{9uqh={%>la!=ulJJ<2l2e(;LtW{ts{KIOldGEYGwTgk3W+8 zx*LM&7qftgjfA%ngoq#lYed+K(7{VQbhlv4IIG&&q{K*N&=}T&fBYomo>$0izCbjn z)Fg^3PMRVfB?!etRZ&e1vuWMy2qK`EqC8Q5&Ful@Hy~Ht8pJ7M@I){gW+I)t!bVxW zv&|G#-<&A|N^%Dc9$`f};>M7XiGMuB=~1=kU|m+~Hx_u*-ZQvI$AULfl_{D>(Q+mAAsh%t< z_OAZmJEctA-4AIAZIQI<9T~qDU&DyQAjV0Dvpsb<##6&*kpHklFO#GWa;}~esdX|A zdgCe8@#WvUU?7wBL>95&7&+MEXD@$I_YWM^%GQKYXFY+-E6Crd;jZaFef3FYGW>%; z-L5K|nXd@};XkiDeW?oyA$t)%{#?7q!zMwXy_(l&;&dT5e9BxYbSG~>sSIc#kb1L; z$L@8GQvkYe(0p|yMavN}A!mfv4 zV$<%ZJBO>w+=RS@s+VJao7$A~=SO=XUIpKWeN!oC@{=szVpmp7`83H=Ex_X5@0Plh z#4#TuB&*C@A}<0%r@C44(ly>iF$D#|%IfIj++oc8!I-0@cWX#d#Te|;avT^A$g_X! zC<}^HHM3yAd7$N1s^jQ)$@Kz-NoHBjbMB1~@oo557Dl|_5e==WJH_=n;cGQf_DKr(JiHAd0o$w&WO8r(?-?2?+qURtvwbg94glER z92zG!bVo$(1Lsn4y!;$eU_%~~k%~-{Ji~WyjgJi#>WFEoG<87-jj%)G3SwpOGi%Es zld01B+Pd3|ah>W`huXnIY6;l}-wf^kXbIM_eAGMP;c(n840A&EwzNJZ;}XmW+GmA4 zW__HSpJT&C_oErkFUuhkbHZNwBKZ*dVH;>&7D%+L!xucvOVM}u##_wN8u4=r(_aD$ zfA$X4Eb|@b`Hj)iCMu#E>C@A5{$sN|tvEgpB8>PaceYkM9Rre9Js~N>JcDy4&&k4< z=lJ8Ro|7H&vVUee_dJPSW)VJCT0xm&f zo)mKX2AR8%wCuVJYX1usZ|#>lgKQk9#)~7+bLL0Fkvjh8a{oh(_WGh1`|Q1ap|M^R zLB%>jC`!uobkl3!Gm7wJ@m&YO+0Hn%|FA*hpXa-v9P^)hepd*MbGJSuDekuf8+$0v zAp_lAkFg&3VDD`-WSXie0sg`#yH@^IhlhZFJsSMT9q4yx;7X&a`PGYD!VNOl`PJad z&@|B`KasJm;7D}uO}nbx;#}8nZwzNWa|UOcE-2P`ozyv-cUq*b%6R zOk|y7E`A{%`w{}*TJDPxa}_zWyc*5Var-0=G6z1-+b*u1=~=*b^wu}HZQ}X6Yz_UO z{?6zN?LAYN;%=x{ndQBNI8%oRxXd5tm^(lXTzjV=OQJe={4Odz`mNeJc$bk$VGwqP zk>Vr~jeP@9)6azTh-ql?5{-79_|twqUXmg*1x|y3Xsg-{cHU+KbvZL;>(<$ z;U>X7EL}b!5S+TaAXGS9UiZeRa^ou4#a|G{SP9l8;D=TSdAfFd4xNm*+4{=lU zBg5B+lG_uU_}(#m7Kr5Yg$7t%w_4QG-9Y!chjf$&2(Zw#P@)C*wV#OKqqR2NS{%Fw z*I6)B)(N&Qh|5wcPT^l~dMKD^bj%X+Y-MqZRAneT zGB%yf_0CA8yIoyTzeopO1~{sv8exQ~5OwmrtlCvcWwNsc47#7*X;}9))LY%i5Yr99 zV*c_@M-dE15q#fMgolCM>BuAL(A>TS3jG4y3M}g2k_uay3Iiv(H$Q%iAT2lXU z%QE^hbdU&xFk@uM!xL&lDzw^j27-R($A=l1K{G8|IGVQL90`=5PE_V0=%Y0n*txi{ zOBcGtrl+(EdR3gvP%rEKJ&S(H=SXu;^tzg=(xZp6+IxMRs`|i=j-t46H}$5^nz3ps z6MsXzf((RS@S|PY#HB~?Qs2J9Vc22VOWf`5Zjo%i2TN^jZOwWMG!1=EQ}NsJ%&W6##Ik zO%w3x0*1InoxO<*u9Df>DEKcO&Tnn2oGp}kQ~VqlcP~cyVOp2kjH%b6S^Dd+>#7+L zjMWh7?%uU=gC%0d`&X|tR5FcnPp9mn8<2tZY|x%@)4sHUnW6NKkV(J%^g+-ALLK<( z^Nc*k73WNA3`pRCV~vP0>_Qvn!FOyLzmHo?;9^#4Sl1UnWn$<@y(hJ>XJP!x=?huf z#8AtFSt8&z-x`BR=xBvF6R zs6g%?4W8!;#6yqUpH>DJb=SfM^R_ktJ|Xlt*dWWywm>OAvLLrt7X7vit(5gH^GZFx zO{^tzIbdB#=5hPwj1GaFMd95FWUCb4&d^brBcwWT1PQ!_(&lD-mC^i^V6d?qe9x0{ zcfK|FI`)&iOS-G;dy`*M!xfUi<5(HTpGD8jM+4(^O70q#f}fmn^?ebW_KS~X;Fr-q zzqFwC%u#STLl=4TmhD`u+h(uJbO4&6;joIMD3^gubY$@gwGP z<9=$P@kk3s!Ulei?P+0lvLHX%3j(3XU_iW;8vCLHkopDcZ6&eP*C$@H8?th7<`drywO4XEr^ z9O>0i>OPIDw`&JcLp1%shVY_noxxb|*g?O0e0?8l41mxJyZ%~z*q*_Xyp9HYjL)OB zz{LZTZeYdJLtBi}T0x{)(4v-S;&B0S&Us&i>S~9;P1kd|@LZHOM-Sj>+waz8DJ&`~ z&+ZwaysCUqy)7%W^A%IkAGOJv;&PHinBArux&sWOrs|z*!(;Krw-f|OHv~s-raIvWBgR~ zYtZkSX1zUW^|2ts!Tog0A%i@=={8xCj*ef`cXki@K)5i~uyNO}y)>b8#JcWtfQkco z;q3H()zH+8=b9Eu`jxh)H_&k>JY>G0h$ecj6&+?We|UFZX^|I9DYqM!l0Lu*YEP4x zbyg1k{z)fVNy~bxka=xfV%Esxz9ot#0+C}nti1hpR^YtjtcGo&E5m<{PDsJzpf-)d z)XZr~0kqN6(vLaT{u7@`7?3DOY%lZ(n_3?Z>wisN33k}Ps~Q(b`%G%IX*8z>e)cBv zE6b7-dQhGTuD%Nn;5c3Bza~voa2OjxjYXJOcaD-06s2A z*m=8=e%q0sori|y%%+!hnlCPQQuACtC9;(s>=+xgXULiLT^u@RC=CeRwLf4^5?@|4 zoIS<1Rc4M^1B6A^mM}h(;xG$d>Xiy;`P_FBUyiRZ=UA=Td)oMZ+;8v*hT0!YJB+`+ z@w07)csfM>nYM$lN@W2q^NpJq2#=ZL0xwe-Cgl%2!f(F1X&v{7$HuQuSx=YL!UY2w zLmHhojHmZKMYNOSCbzk1`DO*xhpqh0W;X=ea@3UnoZ@ncE-f#AO^a76Tnq^fJvcn% z+jA5;GNfCPYQE|`V_}?#IvINQ2tJ>&FlIU2BD<7JbBkh!mqCMz)nQADSeW>+#va;Y zb3&kxYSgvkn80U>#tpe*9Kn#f@PA$*u(mhXHlqs^El^;R;q~mO+@*^SVsCz=caI~+ z|F-wQW#8coq_0~uVQh(SJ9}Y}d6t6i`T~^Laetg{%B9ud+Q2r=+{)hI={VMheKFaF zIUrOn#AGzzIl}#(r>xttDXOxyC8O7#c!KY~g%lYk+kh%YU7w*2hg4x!UV`}O8_O4F zZTILuMibqwr6GO##AbItM3*aol)7akfg+-eEea#9rRg|dq{&4t1*J*|UePaV7?gBz zWTKp96nHIrE%4s?uG@6m?hNcPk*(!hg7$zct*yGMzHg``yAKqvtKOUCQ=?f&7I-+Z zUPyA@ir~D=S^7NPPO?%n!`z`6&c+!kC!?k$MigAwX8W44BN1{%9vEM;RI%U~%j2{Z ze5S|}da{Vb*mOdBQ{ZC&$%mHvLhB)cP$cEtvij#VQ1!g!HU^{p;5MUUL%q1r|c{L^72t3pB;a zlv>#EvMMU&*_GXs+euK?%3#4{+KpZjmaxoCmLx5X;X;z&6D)$5Xse=sZn?1WJe?GU zHiTc!=Y;{gNrbAh5vn@kC1%47(}QJ>kf&U#(btsN!?bYD<0y^u0&w&^zZ{({eY^WP z6roPPDaQH2r`RA3!1n~T^KpSp>OQ+0(FSXkU_2$HW=QG!AXJ9XKTW7@*# zVRl9sgGPr%cNrF;mIuypG_l#-U5pu{Na*90U=vp7D5Duq7g1!|7iV?Ais|}I?qE_3 ze!G;#R#=|s7Hp_Cg4Z_2Oj*Bn+*ODsjWspfB8KF*fk8h?t05$Z9|*6*kj>092={(1 zcob_Zq=<>hE5J^)Alrx#r>y%Rs5)%|@PAEE@^OWf$E(D_YNh>S*@fB#In9@TM-#DZ zS{WW0F?xBr-xFZkzcS>=kdae*Ip4ev4Yp8~_-bH!kUf(b+#^D^6_u+T9UV^1OZQDF zK{^xFlrAa!8;f+J#p*0NXB-vHKshN-Czl-M%$LuK!(BhV=`ynh7w@xHRB#S%Tzn3i zx=K)q1#Bx!NHR+1g-=-?Es7dKEUk|f5#ua_STGmh6?Elr;2*yfCvh5XIOgCE(9g|> z(V9vS?Yo2wow-^2n?z+^X4Rfz28wWW8AEc)*D!K*IbXb$@OA{^fag`q7JRG>*uxpJ zP$l!>-H113P+`66;PPD6a#oYV>s=;(GXQbE>i~Caw*Hh$Q6!hWXmBh4B76gJm%Q-Y zum9{~nBy>~oQv@zoCwF&Pfb)>qU^c-a`fzK${8!sz=3xUFd@a=c{_E4CWJ)e2Fhv` zfs3d*Ut@*@m~O+}`R#~AyC~>tl;s;u3{eYC18z3p38-z*I+ecY$QRaddK>m*SD5L> zmYjpsb%hK_*bdDjX^kCaV{ZULic$OtI`$oj&>Y$9hhBOL0ArCf5D&Bv!$+m);!+=n zW@L&~CYzUbzJBvZaMI!KV@%E{Xmlrqfl~dNKrJ0Ze;(ejfH&Z_4^_Uq^qR=PLTiz^kVm<`4dkdEPQ1i*s zRq)XJu>Ix`#iegaZ*yW?(0_ibe4EsEziG~_^ntDxW^Rj*UB#Eke|sISvnfmapWXaD zn2LtE{am#3<)-TDe$qeN`?Te)&ThOjk$Ek}R{c%2-6)!y&@07bg&3|xULICdWkXv= zZ5gc>Y)9{8Dn$ebE*v=?J z_#7_1lKbT66m&eDul)F|+-kh784>mrMXA5;XYZQvdE2&Mtd7=OT+&DjG=zP#WSGQ8 ze%}^#s?ThBA%g+?PBoksd3mYx^mDWt@#Zk(`Bz|toy#)obQxUbgIH+E>ciI7gBUAxJtg z?9We}3^Z~@^L&wK4AXzsS3?IAh7!j#qvzeHg!g|8anUi+P&7A((D}&zd=$mNcQ(}u zSeYL^73A~~GY;scK1PmOAyhkd3ngoFX_I__D@=*Y#mgxy3107nDJN3q6CJzL@m>Vq zp^D`do%r1WeQehvxgF`OnYDkG+QX%|Z-yWitpHAIk6K>+g%odezhkK_sGQ6W_9KRJNTP&Ml)sH?C>m0 zs!a{pO?Tu5M^=c#w=ep3aVYgbG);9)0!Z$SzqtohG~>S+_xnAZ1onXQ&{#{h{J>PM>5DT~Bw1Z$fKsIL>Eg{rlO zsP%3%Dyyg@oFk$9JK@1P7VKrr&$Xu&Bttyivl=Da1aH+iT%i1TobSzdbTsjI)f zt~CyXS~C4`G9*g>?JwX)TGJdUvm6wQ(H+^qc=2>;!pAyVW=8ELh>!U07mFABx zFyYC%{ZVCRxhS4*iL{vc-A{h6;14o_UN9xTgd~_DH*i;1c*RnV?l~Gk#C9_L%^oeN z77Q9V*q*&$mU#+y2c11u%-jeqzk!s+?VJ$rXU*cWVuPmb^PC1(2#(=c?C;60b1y)G z-b9Xcut=`H@@f1jbDBsW*BBAwy5g7mEqd(Y29Ym|n8~=;slT4AMZ)K-=`{q}O0{Zv z+??pvH3K(pjoYvH_JVPjL+3NbDw=eql%1~eb_*yardQo!8CU38_Y|nc`DHWchqg;7 zuLjS=RdHbpCCC1hll$*^3Eluxdi9YK@YT>2* z>W8#C2dbI}mbGzLp4=-QfBk8^tSApT0VFKg#Rhxf!#N}Pypv;l_*w@m>_59OnflzJ zbdAo{g&;Y*2mkW)_yAgCwk1b9uJ+F8@Ml=ZG%Cl1tfn~h0&*@cY@I>UMjL)06EA3H z3={o|S~VLat`ZRLo5a5eo>aU)F6m2Eyo%?_hW-ZDW!cyHf1A9{b=g4hrf7^0Hh^hM z-@m1HSdT9;!B(K`wb=XaNc{b@?04gu>_H|a#aF;+nyi$}y^BqQ_foSZ0&I*Mi~IQa zs+%J(9R#icsUng`vKT%0NxCg?)czH54~u#egRtr(_oGJpwm@w{LMopv8>2V(`E6y# zv9JSBKVC~$f1n(%;5wqdNrPbfZ=6?;Oz>DHTT=0~ncEqvWh)~?dUB{bCB5rEy5!yY zt490iW8YA3T3aLlQL5b=VP>H^m{_m@)OOmDQU0aYGf1k_oB3o~4mz<{smwK%Ezkc} zShUhxNuZaYf;U=7=$G%L@Brxv0nyW?lrmLXTTI0sEQ-)zzrl+T&bXrQp3mn%Xz>0l zKGmV;&NLfo5_ZJ{u?4Bvn$L5DaN+TTceAC4lgTHQs_&qUwjs54X@fj3YEUS->coge zHJd3RB3%sP!=ufYPXTdKpPwrjXkuvK;g$+927;0-wQs_tFuvd?9ypQWOs*SNM&{E7 zT56wwy<+urXNiFfcvHm?(EFz$@{k_m7%q5PF#Us~uk0}``5bB7UfosUww9+!oT9s1 zdk`6Ueav?)(?)Us1BSk_qI{_x=!?3Ef=8T(#jePFvlnCg<{}-9r92`dQt!53kJo zQWWAiJ~HAsZXSF)k;+KDs)+%YrAF#XET!hZ)zndIu#kT>q_cqnb z-8B*7z!=f05OiOP*}2bz0Bcpi&b*xwj8^mB5d4b1vQt3YKQw*zcf{CnYcge6Q|7#Y4=zKNbG2NU*) zbg=tRF+7QD51;)=s_Ch0E;DpQ2}uiR7mR$*rzBWE>m)QHUMuo@07cNsMi+(>hIO{L4A=x!|9b`KJjl`_E(lk0xf~KQ`AtS7~Y9w!{Bw zswn;A75pE~w}jvS9`JvkCNALrJL7+*3Hwj;f1B}to#tOJ_7Vse@k;ypdREKLfN%k6kH+5H z!Qta|REd9G10(O>g+gBT?5Lo&-~C_XoBo!1-rCxY$uqLF3>%TRd#D(qOg!pD81)3{#2Z!$oWLUe5u~lP17GG8Ca0YKxoBkDTG3lFNQ;X)Qy(~O)b%(iEzCvp0rVXFAn&#q0|(B;lxdQ1l|?`mLS=^*Zr9&AFFXhZ_4u>l)G zBDFb7E}$&YINk`l*ex2dI_oG}aa>SsV8--W%*aa~6FdDKY}~mI(x&o}g{6_tyrVWY zZ{CW&bUrI5XGetZf$dvy#uc)xJcoUo-oP50&8qp+i4p?oc-4M(9q%Np(V_~4h>lO^ zlGTfd{Q%0#B}7J5-3S+~UPinrD&m*Z)Hp{E9Hwk(5*Fh>+SG;U=%7? z$!ZIybC9O)5Q}FPpYge^r-MOaC{DASS^obtKAJn)i7lM1i`-f2(V=2f;L9bEa8n)wB8Avoo;d2f% z=+ls9iHV5B?(R{ zPEyQC+uE9{*-+WWPt^Ak{eQyQ7e|4B!uU<=Xz)MGa8;1u2B*$IJq$KDSwj1I~ z(I)8#2;mr=kVaa(iBzwH{Z&U8Ql+qBb`fD;h&cUe(mO0{wRX^Hk7f0oT#g<*#D<+t zEU8zKYYNlaP(?*uE3t!qrcWuRSd>x7@1;xlxTD8SQruO{$cVybwK5z?izL}61XYXh zdq~((wRpc%1l_~Z&2776`v?#JS6-% zB>FjVm?t$N+79 zc2wGE@`Nzf3E|#58X`S84wWdw?g1xBDM=z90eVIL%!x^8TtW=?45E)sBrnw>d>m$I zaICC`2i>IQWMEQxXzS?4r;Q>vOZ=_emZ2cM)-LS+5F?|040^+vVHS3Apy~iEp;WZ9 zrji-2WyIx28**cHYbi>N5$E?XB>WYhkVICZIdXnbiFqZ)-2w5r5NpDA$6z0AHpPEw z<)0KeE)?)Y z;yoDfOpo<>2j*_e-wBv=Mx$nOFzA1j{WHT#~d^oVS)X*1>B|-1wc=rHPrp+Qz-OE$Y zzD{kAP(4EUS@a{k^4c~AL?zi=UqeejOvz8-_`dDzw5pk&mqb_1E;iOUm{F3!(LLK) zzyG*se7#ic-AAWK%anpFI%*D4-O(k4o|S`#juVrbk40@`TV;z72cl6l#FLkHVsz9? z?Xeo_x<~K_v}C6z&~#uoZy#wBe-E>#vYyzabdt@+lfC!d8(*fzX<$lLGK1C{{<6J} zg1ii>wrpZws|}a4m%UXTWaZ^!banIm=EGzZ7i0EWdHKy{OA z<7;iHr@C{Hg7jE6Y~ILVbPfdxChGU?U}NnFGbd-CTr*_rY^G(z&*J5)gm1Da%}k=R zv6{wFJt+nUTPy0AbHSyonwo<}Gz7V+(bOC~z_2Nu!Z3F6;dDXi;do;s9z#A?pFaazdlMbb zAXBGI#S-e{)m;rtnp7l&mkqBvma?owf}(*qUe_Qx1ESHhxhO6vV5p@5Pjo6}xk)tF zR52VSe$R|y!}^_=i)QlCmGgzbjT7Q8RS3K^A>hv)YwgE&@y4N6%F2q+`v-Y$-8M8r zB(@)~U|Vf3L3b~^YTAiUE5PDzMs|c(-`GMpwS+Xal_#HF7m3Y4D4HT+ zQ{-}f7e{NWY3dsik)s#BN#xkJH+b!cvP8f`c1kQew(KH0vj}s*#!JHX0iTWK87)~gmk@|&70P7xYv!Nw}a-sVG1VCAjRK9jWtMlVGOUV z-+=uc;z4cH3h~gwus#)?r(4)JEJU=4LQ$60#~Ub~HJ>DR2d@g-27ErMYwJ-b6_Ds^ z<1g#CP}|bYuqKAAIK;Vb%JPzV>#etFbw@KjH<|jQho~3AvA3g!*S8%dCM}0ly`2}{ z-p{DV&5^1)qEfO+Ho8SeW;;5Or&N=R4eK@%wB(T<<>KWR*3mTLWw^JEO?!`$Tp*5# z)}JglcW)!lZFrm7jsekWYiDn5JC@7>;$7|hb<P))N#MVeNW)%Hqqr%qzD zW*>jtxDQLgG?Lx*ys*87jI=m*Z`&fy@ljV-hdU~R9E*nSo8My7p=0z9g~`b@Q@LXo z$NER;Yp&%rtz&OWwRwUCruM54*Zw)N}S-q3|tr0c~%yxPvXZF?9NotCQF zMoh{1q(ld)sS@$kE;^U?es+rbCn_OBbZWKi+r5WQmxsE;mDocG6lKJ5aN7pnIxO-R z2ntafjC6cz>srVxD5AG|CvP0-W2(5fqI9QjmX?D%*wq$bdSNOR8(wAoktS?Hz#TqZ zgW8-$R*Zu!`xooWYftY6RWnpSLnEjh_Xw!FEX z{jJuB@ZEK=kvI_}$p$-5i#q<8wV#kGmPCV-*EUs%PPdEdn&X%=atYeo*jL*l>RYf_ z(y#=(d1cGqF~8I_5|vR*%;0hUw0;MT9acs(W=cglX~weTmun~`k`EbL(F?Y=HSqe@ zU5tu`D|<|B2j$Bz=JE?xuyRJW=&g^fH1mjxFtcDfAG>@l<%vO>dwVb@7BE>v8jA%{Fo;Q~~Q<$cfX8J@i>C_?o+9Xyio=teT zkqs4b&y~mcLc+w<7t^tmAdFihg!a$!wreTo74Z~b|*+s0q z@G{CxBkZrL#i!Pw)rQ7Jx>}TtW_%+?P{d{e%U4{)#Y-ohTKKPvW>!(Y5Vkq2T{f5G z7!AWN$SN%7hKpB_W)vP2@uv?5M2u9?7Bn%lYzj$6F9#dD2!+*zyiQWY@wZ&DmZ=%h z^b8Ks(R`dEb_>_6xsWT?TtH4jj40Q!wW3N{X`@n@l5TmIc!(z3Y@xroJ~EOtwR{E% zssMGO(e`4Y)S~9V5k-teGkfY}V!b0m^wbklmNJOT%sKBOu3a#RSiOdj!zRSSMn=q~ zT(zW3l!=5$Wk8BgbPKS;8XT zmHRbJd(&aML`UYT%P!=~)r%-h*5M5V&bkl8-vJ$q&%1z|KXMgQgwN{h8rdgA_h`&y zZd!dl*Iu%O-ntq(!*RsvLNr^4Y3v)sDLN*$ZX2!5-NdBlGSqsEDx0{6rj(HwS(925 zxnF!DzA`5*;Fhb-Bg)-Qh3LE$7EWfeP}0Xl2diInbhaJrps;*7SFKpVd9zAUl+Nk5 ztRXgoNhMk26i;W>tU`>U-U*9xU2y&-Ts^m#gv4}~FPzKVDW#%Q;Sn7TA0E;1+}9Ui z)#|lebKwe>PtRiizQc6;6PPo#1nqD?6++l4HU@y-LO$J}`f zIB(`uvSU?r_gQg{wy{gpRdbhJ%C)O6;GzZ7#8E-S?ofpo-3ATB?a$QO+x8=F?Djh;AVUXO)#<);KxXY!&`c z6Bfd_c*YWLSvi+O&spo&mbJWDTF!V(F$jT@nH{Qs+^Og$X9?#DGRl+Y8;g?eMqrxv$!Y>-7ZqTskf=jq&ehK>1 zvLpqiMDiiS@AZ*aGM!I<>?UT$jj+C=3P(tT$!sPm!5EoJR;EjmQ{y8eLHf8@j6y+p z{6SPg=x8*W@kU2cFX9NFAGKaD&K;W)GZ};!iinX=q|wjF%!*VsLN7$b&e&w7XyDWn zhqaW?l~a{tm8n==jEN-6n3}RAn}uEe$Q1AiQnMyg$dG8Hc2YI0WlCu=TCW3Rd<^lC z*>N55Nzsu8Q_+fw?PI2iE2&P{d8VL@vZRuzC?;XM!C=7U4l{LH5o%96>vkLvVk?O` zxd{_2SBb`6qZyMGF1M4u5iije3kK0BslzVOqd&C)%I&pd^M**Um?Az6`c;&a%;K{0 z9BTLN1kV$!2a^EDeWuv!%X= z+_G{^9+&WwSqMIDq|r``)rvbr3h$4teIp>)Wq}^1*RON8Y=^I zMp9EVPBv_cZzH?2LqX99`lxMe7B*!uJ3m#FiBII+!nDlHNasYSH%3H&%j?CfHIFrv zY9j`{?zEl%;m9;?`P6rhhk~3$9Mj{uAVl?0AV)ucgXw&l|tLdB~h*d)T96#Pf zRC*3`3R8rQe)OhPN>ax<9%^x~1YDzZ_SnfxPB=9R9CWkk%{Lh|WpnkK1(<|QPG zUs-C=f;PE?DcPwJ@v9a$l9CRQ^|oVv@_PfA6XS?d(i7hsbgGFRE8z#dA&G*>5)%z+ zW+R$_H&X5zO$JPS}lsZI(wY!zhQ62Lqmk=FtGAKl?!7#SW#S{}Q%537U z>98tDp4%qv+ByR--BVL6g?ah(T+~ZP8(N7<%4de? zG%KCrQ`ZaN66LLm_@$YIT;Z48MEpTNQNqVX$)*YUk%Cep`H-QE_>7DWV;$&a(CNh& z3`ZL6fT$G52EGhfVq$5mZp7vh0z&j|T}}<@@uI&iDkaB=onC7TJ8Ro;DV3Kgp4ecJ zeY^K^;P8IlI?x(v$RZV>Nb|%_;6NZKDx+|u@irJW4BCf9MR#WNU@#g91icIlc+f<} zp?0{as_iD=9iqCXlN56trqgwnF^*|vnH<`G5S1m9GK;7}qZ9D-+Nf!<;~ni44Ou^# z31-pgfX6X{&DKxlp+hu}1|y%HUBQobH_|caW}vf)QID6LR3Vh(3Mm!s{Pv3DWKAu@ ztexOgJT524j#Z1a_w&NWtu%XLnLo3bg6td$GUM4N8lgRP?V^Ec;I%Egv71EWT9koS zh$4T$heu_geC}e((&F&Ay#(LkF*rdXjsu~0+FdQ0RHbp&#W5v6_vD(>-nu&4hE!a3 z=^CzCy^3pAo-gv_WLH%qBW^`(2T-;P70+74jGQEKeUC_I?E1>6t6yAGZ%km$lx(^h zkMYu`9n^JNX=tov^X?<_mMOt5ImtjP?vR8u!%U|wMyaS2MpXQQ&+hS%B8 zzAhIr@oB{CH4KUJY3b;rvZ8{PQEz0_Pif$kwY}%cveE!5adpB|L4QE}3!W^KfQZYG zN{czhg5IlQ%Jg|$x@-aYNwK2y5R4q_A5YgW{N@X5Fh|8=a9P8cSjdLk;!ptg7MdZF{KiaiiC1&bkkD_ZD8|$*^5cy7Y<2Xxd~~-SrC*~XHN`?fQ3~yi_4qBxl$Dg?>1?FU8%uF~ zESZ*gqV-`)%I2_k`68y}CPl=WQZ~xWNaVhcNg&o2CN;B^OIIvsW-B_*7 zqCV(h|AATpLg=W^(WmI|AHZ`W{!jB^ZS^tK3Hhv?T}aUDX2>~;DIpD`t(T)U&7vM0 z#U?s_Il^BCosL;^7IWEo!hfmeNLoIpgO=7d{GMSdtNX}GNh3T^M}s}U@JT)oZgudbn~FTlJ-=TVYi!l(<03bvlw9tUxvv9QD?Q=FYnXgfX zWdqLCf-L&1J;Z0^kQS@O-q#~4_e{~4$6-*1I97ce>#&y6NCPuIiy0e*qoZbIJSV*i)IjY*2tY%<)^v5o5>3=AU95rE-Hx>gO7uU4{@Zai`dNR ztejPdNmTw$dsieauQr;*I5UO0*`l#K)tI^!p)G_&r?rD)tv!^?Sipk3u@Q=B{U}vE zYT>V$#2L?QfSp4F*qm-5wui9V1_(x_vUb%4Oiwo}Te>OE%Op6|No{L8%|eLzw29*T z6%;2$;dhVHJ>a6SD3_S1XtENG^bWhp%FZP_DR#oNvtpkrDw*j8spn8w0ebrS2^$lc zR+u)vfgwOcb0c0$2^UPsA!7XMD*pB0Rz)$rD2uB7yJ_$yF!QX@I=$9_y|os7 z;XLN&B%n4~NH&G3I8;SVa~t}!QZ8OFNeI?x{Qcb=t#8I>iX%1JL`F_72|5o}yNJ#F zY|ff7B;X#Q*QKJQATuJ&`+E9_5yB@^*@zSJiLw|WIV+ExEOD;8huw#(MEatGWVDbc z8si?@5UE+YSfWG+M|7}M(dkSTdC@w0si>}FNVMWH(J^G_6_BiQVjWdeQkW4LMS8b* zKx4!$Ixg{Pd6Z>{_)!JubsCsIrI;9lhJ^HVjIJKG9jX@gG-2~cQJi8B_h69!&)(HM zrFBK|-@Q)|DWEWlsA!2&Kcd#JX$_nrGYhx74!*P$V&)*V&SXM}?+W@o1{ zLOJ-;)gUaLZ3yi}#25g_(J=f0(Q&n5V)Qm}dWe-(FTB6+A!9JZ<)Gvz8N)j1KUVbU z63JapKb*bvV^*AG0 z9pD%54)&r6%-xwMjGMr8tvIFMM<&MMBK)M}IIOoOFw)%)OP2$d>}&kIwu#L^5U~7(uoS}rT11GWy_fVhqpa?-7FM>hrh7;)QkPs#ujeIbUVJbY=saWs^50O+2 z@Z6aNKRKZN@M|5rGng?%$y4-?2o(Ym_{gS;sUHjTAHqhqkA=h7+})>mM#by#Da>{k zJi~TMU^lQqm_APCD7N$<9*vW2r*U_T-t%umhDmz>t2h>)OIEn4pom4IXtO)fZ#5u6 z39n+Z!|kxaNO%!+iM<$b*E0j193~ulHQc1%>w>GpKnZLDJp%)mEIfAF#M{p0mpJA%13c8H3`8C^=rZlBud@4ABVr*74 z8rBZ$RYf7pF1um}TRS*u(ZR$sc=qg9bWeVXdsDr&b&FD2>o~BAZl4(Kh%P6)n5_%m zW?|G`F1s6#vFuOd;nD)kEyd$&s-jgfqURM|0nT}yF0QJLj-|`bWwEmS2qEJj9(+Fi zj-wq_>)0x^CcR$Q;3H1{<1V-8exK!8zl+zIM^IXH`04jl)CU2gG_L-k7`9dsW0YiR*+NS#@8|cU|+Zg)OeqtL=xNu9V!Ds;!ChB220m z|FD7QxzifwmtCwwWewZU;yo09pb&>^;y4|{w~tov+5N9EW??`bPpYOXD<~p`_m`$gdn^f_xxb;d_u=E=;eWvsBAq(@|8l-&qea-( zP|}sl!ae0dhpqBFy;MrU=*%1j9mX;n^9ssA!S*+~?(1r=nfNpW4>f$Cf%?kv&bf+{ zqcAo?K`LxaxVJE0l1vI|HFsldSPw=S8mp4Da7lUx+w=O^uj1?1zOIHZSAAVYZ}t6P zka%T`DgddFpkA)y2H;!1hc$7`jhMPM2%D~cGI^CQsmu=7z^PbZ@~r>^09d(zrDn7y Q&j0`b07*qoM6N<$f+XSUEdT%j literal 0 HcmV?d00001 diff --git a/info/werkzeug-figures/shortly.png b/info/werkzeug-figures/shortly.png new file mode 100644 index 0000000000000000000000000000000000000000..96c8525dc4fd613598e2d6ffb4b5bf531cd51ebd GIT binary patch literal 67757 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 Y?bIRN^-rAc#f~eNOfQyRaD4Fp0iT0Fr2qf` literal 0 HcmV?d00001 diff --git a/info/werkzeug.info b/info/werkzeug.info index 853c432f..0378ae52 100644 --- a/info/werkzeug.info +++ b/info/werkzeug.info @@ -1,17 +1,19 @@ This is werkzeug.info, produced by makeinfo version 6.7 from werkzeug.texi. - Werkzeug 1.0.1, Apr 19, 2021 + Werkzeug 2.1.0.dev0, Feb 01, 2022 + + Pallets Copyright © 2007 Pallets -INFO-DIR-SECTION Python +INFO-DIR-SECTION Miscellaneous START-INFO-DIR-ENTRY -* Werkzeug: (werkzeug.info). The Werkzeug reference manual. +* werkzeug: (werkzeug.info). One line description of project END-INFO-DIR-ENTRY - Generated by Sphinx 1.8.5. + Generated by Sphinx 4.3.2.  File: werkzeug.info, Node: Top, Next: Getting Started, Up: (dir) @@ -19,7 +21,9 @@ File: werkzeug.info, Node: Top, Next: Getting Started, Up: (dir) Werkzeug ******** - Werkzeug 1.0.1, Apr 19, 2021 + Werkzeug 2.1.0.dev0, Feb 01, 2022 + + Pallets Copyright © 2007 Pallets @@ -30,9 +34,9 @@ Werkzeug is a comprehensive WSGI(1) web application library. It began as a simple collection of various utilities for WSGI applications and has become one of the most advanced WSGI utility libraries. -Werkzeug is Unicode aware and doesn’t enforce any dependencies. It is -up to the developer to choose a template engine, database adapter, and -even how to handle requests. +Werkzeug doesn’t enforce any dependencies. It is up to the developer to +choose a template engine, database adapter, and even how to handle +requests. * Menu: @@ -52,6 +56,10 @@ Getting Started * Werkzeug Tutorial:: * API Levels:: * Quickstart:: +* WSGI Environment:: +* Enter Request:: +* Header Parsing:: +* Responses:: Installation @@ -59,21 +67,17 @@ Installation * Dependencies:: * Virtual environments:: * Install Werkzeug:: -* Install virtualenv:: Dependencies * Optional dependencies:: +* greenlet:: Virtual environments * Create an environment:: * Activate the environment:: -Install Werkzeug - -* Living on the edge:: - Werkzeug Tutorial * Introducing Shortly:: @@ -95,17 +99,10 @@ API Levels * Example:: * High or Low?:: -Quickstart - -* WSGI Environment:: -* Enter Request:: -* Header Parsing:: -* Responses:: - Serving and Testing * Serving WSGI Applications:: -* Test Utilities:: +* Testing WSGI Applications:: * Debugging Applications:: Serving WSGI Applications @@ -125,11 +122,12 @@ SSL * Generating Certificates:: * Adhoc Certificates:: -Test Utilities +Testing WSGI Applications -* Diving In:: -* Environment Building:: -* Testing API:: +* Test Client:: +* Request Body:: +* Environment Builder:: +* API:: Debugging Applications @@ -143,7 +141,6 @@ Reference * Request / Response Objects:: * URL Routing:: * WSGI Helpers:: -* Filesystem Utilities:: * HTTP Utilities:: * Data Structures:: * Utilities:: @@ -156,23 +153,7 @@ Request / Response Objects * How they Work:: * Mutability and Reusability of Wrappers:: -* Base Wrappers:: -* Mixin Classes:: -* Extra Mixin Classes:: - -Mixin Classes - -* Common Descriptors:: -* Response Stream:: -* Accept:: -* Authentication:: -* CORS:: -* ETag:: -* User Agent:: - -Extra Mixin Classes - -* JSON:: +* Wrapper Classes:: URL Routing @@ -196,7 +177,7 @@ WSGI Helpers HTTP Utilities -* Date Functions:: +* Datetime Functions:: * Header Parsing: Header Parsing<2>. * Header Utilities:: * Cookies:: @@ -212,17 +193,12 @@ Data Structures Utilities -* HTML Helpers:: * General Helpers:: * URL Helpers:: -* UserAgent Parsing:: +* User Agent API:: * Security Helpers:: * Logging:: -URL Helpers - -* werkzeug.urls: werkzeug urls. - Middleware * X-Forwarded-For Proxy Fix:: @@ -234,17 +210,13 @@ Middleware HTTP Exceptions -* werkzeug.exceptions: werkzeug exceptions. +* Usage Example:: * Error Classes:: * Baseclass:: * Special HTTP Exceptions:: * Simple Aborting:: * Custom Errors:: -werkzeug.exceptions - -* Usage Example:: - Deployment * Application Deployment:: @@ -284,7 +256,8 @@ Additional Information * Important Terms:: * Unicode:: * Dealing with Request Data:: -* Changelog:: +* BSD-3-Clause License:: +* Changes:: Important Terms @@ -298,7 +271,6 @@ Unicode * Unicode in HTTP:: * Error Handling:: * Request and Response Objects:: -* The Filesystem:: Dealing with Request Data @@ -308,8 +280,13 @@ Dealing with Request Data * Limiting Request Data:: * How to extend Parsing?:: -Changelog +Changes +* Version 2.1.0: Version 2 1 0. +* Version 2.0.3: Version 2 0 3. +* Version 2.0.2: Version 2 0 2. +* Version 2.0.1: Version 2 0 1. +* Version 2.0.0: Version 2 0 0. * Version 1.0.1: Version 1 0 1. * Version 1.0.0: Version 1 0 0. * Version 0.16.1: Version 0 16 1. @@ -396,6 +373,10 @@ File: werkzeug.info, Node: Getting Started, Next: Serving and Testing, Prev: * Werkzeug Tutorial:: * API Levels:: * Quickstart:: +* WSGI Environment:: +* Enter Request:: +* Header Parsing:: +* Responses::  File: werkzeug.info, Node: Installation, Next: Werkzeug Tutorial, Up: Getting Started @@ -409,7 +390,6 @@ File: werkzeug.info, Node: Installation, Next: Werkzeug Tutorial, Up: Getting * Dependencies:: * Virtual environments:: * Install Werkzeug:: -* Install virtualenv::  File: werkzeug.info, Node: Python Version, Next: Dependencies, Up: Installation @@ -417,8 +397,8 @@ File: werkzeug.info, Node: Python Version, Next: Dependencies, Up: Installati 1.1.1 Python Version -------------------- -We recommend using the latest version of Python 3. Werkzeug supports -Python 3.5 and newer and Python 2.7. +We recommend using the latest version of Python. Werkzeug supports +Python 3.7 and newer.  File: werkzeug.info, Node: Dependencies, Next: Virtual environments, Prev: Python Version, Up: Installation @@ -431,9 +411,10 @@ Werkzeug does not have any direct dependencies. * Menu: * Optional dependencies:: +* greenlet::  -File: werkzeug.info, Node: Optional dependencies, Up: Dependencies +File: werkzeug.info, Node: Optional dependencies, Next: greenlet, Up: Dependencies 1.1.2.1 Optional dependencies ............................. @@ -441,23 +422,32 @@ File: werkzeug.info, Node: Optional dependencies, Up: Dependencies These distributions will not be installed automatically. Werkzeug will detect and use them if you install them. - * SimpleJSON(1) is a fast JSON implementation that is compatible with - Python’s ‘json’ module. It is preferred for JSON operations if it - is installed. + * Colorama(1) provides request log highlighting when using the + development server on Windows. This works automatically on other + systems. - * Click(2) provides request log highlighting when using the - development server. - - * Watchdog(3) provides a faster, more efficient reloader for the + * Watchdog(2) provides a faster, more efficient reloader for the development server. ---------- Footnotes ---------- - (1) https://simplejson.readthedocs.io/en/latest/ + (1) https://pypi.org/project/colorama/ - (2) https://pypi.org/project/click/ + (2) https://pypi.org/project/watchdog/ - (3) https://pypi.org/project/watchdog/ + +File: werkzeug.info, Node: greenlet, Prev: Optional dependencies, Up: Dependencies + +1.1.2.2 greenlet +................ + +You may choose to use gevent or eventlet with your application. In this +case, greenlet>=1.0 is required. When using PyPy, PyPy>=7.3.7 is +required. + +These are not minimum supported versions, they only indicate the first +versions that added necessary features. You should use the latest +versions of each.  File: werkzeug.info, Node: Virtual environments, Next: Install Werkzeug, Prev: Dependencies, Up: Installation @@ -477,11 +467,8 @@ Virtual environments are independent groups of Python libraries, one for each project. Packages installed for one project will not affect other projects or the operating system’s packages. -Python 3 comes bundled with the venv(1) module to create virtual -environments. If you’re using a modern version of Python, you can -continue on to the next section. - -If you’re using Python 2, see *note Install virtualenv: 23. first. +Python comes bundled with the venv(1) module to create virtual +environments. * Menu: @@ -508,15 +495,6 @@ On Windows: py -3 -m venv venv -If you needed to install virtualenv because you are on an older version -of Python, use the following command instead: - - virtualenv venv - -On Windows: - - \Python27\Scripts\virtualenv.exe venv -  File: werkzeug.info, Node: Activate the environment, Prev: Create an environment, Up: Virtual environments @@ -535,7 +513,7 @@ Your shell prompt will change to show the name of the activated environment.  -File: werkzeug.info, Node: Install Werkzeug, Next: Install virtualenv, Prev: Virtual environments, Up: Installation +File: werkzeug.info, Node: Install Werkzeug, Prev: Virtual environments, Up: Installation 1.1.4 Install Werkzeug ---------------------- @@ -545,59 +523,6 @@ Werkzeug: pip install Werkzeug -* Menu: - -* Living on the edge:: - - -File: werkzeug.info, Node: Living on the edge, Up: Install Werkzeug - -1.1.4.1 Living on the edge -.......................... - -If you want to work with the latest Werkzeug code before it’s released, -install or update the code from the master branch: - - pip install -U https://github.com/pallets/werkzeug/archive/master.tar.gz - - -File: werkzeug.info, Node: Install virtualenv, Prev: Install Werkzeug, Up: Installation - -1.1.5 Install virtualenv ------------------------- - -If you are using Python 2, the venv module is not available. Instead, -install virtualenv(1). - -On Linux, virtualenv is provided by your package manager: - - # Debian, Ubuntu - sudo apt-get install python-virtualenv - - # CentOS, Fedora - sudo yum install python-virtualenv - - # Arch - sudo pacman -S python-virtualenv - -If you are on Mac OS X or Windows, download get-pip.py(2), then: - - sudo python2 Downloads/get-pip.py - sudo python2 -m pip install virtualenv - -On Windows, as an administrator: - - \Python27\python.exe Downloads\get-pip.py - \Python27\python.exe -m pip install virtualenv - -Now you can continue to *note Create an environment: 25. - - ---------- Footnotes ---------- - - (1) https://virtualenv.pypa.io/en/latest/ - - (2) https://bootstrap.pypa.io/get-pip.py -  File: werkzeug.info, Node: Werkzeug Tutorial, Next: API Levels, Prev: Installation, Up: Getting Started @@ -670,7 +595,7 @@ redis(2) excels at. The final result will look something like this: -[image src="shortly.png" alt="a screenshot of shortly"] +[image src="werkzeug-figures/shortly.png" alt="a screenshot of shortly"] ---------- Footnotes ---------- @@ -723,7 +648,7 @@ And here an expanded version that looks at the query string in the URL def application(environ, start_response): request = Request(environ) - text = 'Hello %s!' % request.args.get('name', 'World') + text = f"Hello {request.args.get('name', 'World')}!" response = Response(text, mimetype='text/plain') return response(environ, start_response) @@ -764,7 +689,7 @@ confusing: import os import redis - import urlparse + from werkzeug.urls import url_parse from werkzeug.wrappers import Request, Response from werkzeug.routing import Map, Rule from werkzeug.exceptions import HTTPException, NotFound @@ -779,7 +704,9 @@ middleware that exports all the files on the ‘static’ folder on the web: class Shortly(object): def __init__(self, config): - self.redis = redis.Redis(config['redis_host'], config['redis_port']) + self.redis = redis.Redis( + config['redis_host'], config['redis_port'], decode_responses=True + ) def dispatch_request(self, request): return Response('Hello World!') @@ -879,7 +806,7 @@ File: werkzeug.info, Node: Step 4 The Routing, Next: Step 5 The First View, P Next up is routing. Routing is the process of matching and parsing the URL to something we can use. Werkzeug provides a flexible integrated routing system which we can use for that. The way it works is that you -create a *note Map: 35. instance and add a bunch of *note Rule: 36. +create a *note Map: 2f. instance and add a bunch of *note Rule: 30. objects. Each rule has a pattern it will try to match the URL against and an “endpoint”. The endpoint is typically a string and can be used to uniquely identify the URL. We could also use this to automatically @@ -907,8 +834,8 @@ you. The way we will do it in this tutorial is by calling the method adapter = self.url_map.bind_to_environ(request.environ) try: endpoint, values = adapter.match() - return getattr(self, 'on_' + endpoint)(request, **values) - except HTTPException, e: + return getattr(self, f'on_{endpoint}')(request, **values) + except HTTPException as e: return e We bind the URL map to the current environment and get back a @@ -919,10 +846,10 @@ dictionary of values in the URL. For instance the rule for to ‘http://localhost:5000/foo’ we will get the following values back: endpoint = 'follow_short_link' - values = {'short_id': u'foo'} + values = {'short_id': 'foo'} -If it does not match anything, it will raise a *note NotFound: 37. -exception, which is an *note HTTPException: 38. All HTTP exceptions are +If it does not match anything, it will raise a *note NotFound: 31. +exception, which is an *note HTTPException: 32. All HTTP exceptions are also WSGI applications by themselves which render a default error page. So we just catch all of them down and return the error itself. @@ -947,7 +874,7 @@ Let’s start with the first view: the one for new URLs: error = 'Please enter a valid URL' else: short_id = self.insert_url(url) - return redirect('/%s+' % short_id) + return redirect(f"/{short_id}+") return self.render_template('new_url.html', error=error, url=url) This logic should be easy to understand. Basically we are checking that @@ -957,19 +884,19 @@ we need to write a function and a helper method. For URL validation this is good enough: def is_valid_url(url): - parts = urlparse.urlparse(url) + parts = url_parse(url) return parts.scheme in ('http', 'https') For inserting the URL, all we need is this little method on our class: def insert_url(self, url): - short_id = self.redis.get('reverse-url:' + url) + short_id = self.redis.get(f'reverse-url:{url}') if short_id is not None: return short_id url_num = self.redis.incr('last-url-id') short_id = base36_encode(url_num) - self.redis.set('url-target:' + short_id, url) - self.redis.set('reverse-url:' + url, short_id) + self.redis.set(f'url-target:{short_id}', url) + self.redis.set(f'reverse-url:{url}', short_id) return short_id ‘reverse-url:’ + the URL will store the short id. If the URL was @@ -1003,13 +930,13 @@ redis and redirect to it. Additionally we will also increment a counter so that we know how often a link was clicked: def on_follow_short_link(self, request, short_id): - link_target = self.redis.get('url-target:' + short_id) + link_target = self.redis.get(f'url-target:{short_id}') if link_target is None: raise NotFound() - self.redis.incr('click-count:' + short_id) + self.redis.incr(f'click-count:{short_id}') return redirect(link_target) -In this case we will raise a *note NotFound: 37. exception by hand if +In this case we will raise a *note NotFound: 31. exception by hand if the URL does not exist, which will bubble up to the ‘dispatch_request’ function and be converted into a default 404 response. @@ -1025,10 +952,10 @@ of times the link was clicked and let it default to zero if such a key does not yet exist: def on_short_link_details(self, request, short_id): - link_target = self.redis.get('url-target:' + short_id) + link_target = self.redis.get(f'url-target:{short_id}') if link_target is None: raise NotFound() - click_count = int(self.redis.get('click-count:' + short_id) or 0) + click_count = int(self.redis.get(f'click-count:{short_id}') or 0) return self.render_template('short_link_details.html', link_target=link_target, short_id=short_id, @@ -1139,7 +1066,7 @@ such as a custom 404 page. ---------- Footnotes ---------- - (1) https://github.com/pallets/werkzeug/tree/master/examples/shortly + (1) https://github.com/pallets/werkzeug/tree/main/examples/shortly  File: werkzeug.info, Node: API Levels, Next: Quickstart, Prev: Werkzeug Tutorial, Up: Getting Started @@ -1166,16 +1093,16 @@ File: werkzeug.info, Node: Example, Next: High or Low?, Up: API Levels ------------- This example implements a small ‘Hello World’ application that greets -the user with the name entered: +the user with the name entered. - from werkzeug.utils import escape + from html import escape from werkzeug.wrappers import Request, Response @Request.application def hello_world(request): result = ['Greeter'] if request.method == 'POST': - result.append('

Hello %s!

' % escape(request.form['name'])) + result.append(f"

Hello {escape(request.form['name'])}!

") result.append('''

Name: @@ -1188,14 +1115,14 @@ Alternatively the same application could be used without request and response objects but by taking advantage of the parsing functions werkzeug provides: + from html import escape from werkzeug.formparser import parse_form_data - from werkzeug.utils import escape def hello_world(environ, start_response): result = ['Greeter'] if environ['REQUEST_METHOD'] == 'POST': form = parse_form_data(environ)[1] - result.append('

Hello %s!

' % escape(form['name'])) + result.append(f"

Hello {escape(form['name'])}!

") result.append('''

Name: @@ -1226,41 +1153,26 @@ CGI/mod_python application to WSGI as well as WSGI middlewares where you want to keep the overhead low.  -File: werkzeug.info, Node: Quickstart, Prev: API Levels, Up: Getting Started +File: werkzeug.info, Node: Quickstart, Next: WSGI Environment, Prev: API Levels, Up: Getting Started 1.4 Quickstart ============== This part of the documentation shows how to use the most important parts of Werkzeug. It’s intended as a starting point for developers with -basic understanding of PEP 333(1) (WSGI) and RFC 2616(2) (HTTP). - - Warning: Make sure to import all objects from the places the - documentation suggests. It is theoretically possible in some - situations to import objects from different locations but this is - not supported. - - For example ‘MultiDict’ is a member of the ‘werkzeug’ module but - internally implemented in a different one. - -* Menu: - -* WSGI Environment:: -* Enter Request:: -* Header Parsing:: -* Responses:: +basic understanding of PEP 3333(1) (WSGI) and RFC 2616(2) (HTTP). ---------- Footnotes ---------- - (1) https://www.python.org/dev/peps/pep-0333 + (1) https://www.python.org/dev/peps/pep-3333 (2) https://tools.ietf.org/html/rfc2616.html  -File: werkzeug.info, Node: WSGI Environment, Next: Enter Request, Up: Quickstart +File: werkzeug.info, Node: WSGI Environment, Next: Enter Request, Prev: Quickstart, Up: Getting Started -1.4.1 WSGI Environment ----------------------- +1.5 WSGI Environment +==================== The WSGI environment contains all the information the user request transmits to the application. It is passed to the WSGI application but @@ -1279,15 +1191,15 @@ Now we have an environment to play around: >>> environ['SERVER_NAME'] 'localhost' -Usually nobody wants to work with the environ directly because it is -limited to bytestrings and does not provide any way to access the form -data besides parsing that data by hand. +Usually nobody wants to work with the environ directly because it uses a +confusing string encoding scheme, and it does not provide any way to +access the form data besides parsing that data by hand.  -File: werkzeug.info, Node: Enter Request, Next: Header Parsing, Prev: WSGI Environment, Up: Quickstart +File: werkzeug.info, Node: Enter Request, Next: Header Parsing, Prev: WSGI Environment, Up: Getting Started -1.4.2 Enter Request -------------------- +1.6 Enter Request +================= For access to the request data the ‘Request’ object is much more fun. It wraps the ‘environ’ and provides a read-only access to the data from @@ -1302,9 +1214,9 @@ requests is set to ‘utf-8’ but you can change that by subclassing ‘Request’. >>> request.path - u'/foo' + '/foo' >>> request.script_root - u'' + '' >>> request.host 'localhost:8080' >>> request.url @@ -1321,7 +1233,7 @@ that was transmitted in a POST/PUT request. For testing purposes we can create a request object from supplied data using the ‘from_values()’ method: - >>> from cStringIO import StringIO + >>> from io import StringIO >>> data = "name=this+is+encoded+form+data&another_key=another+one" >>> request = Request.from_values(query_string='foo=bar&blah=blafasel', ... content_length=len(data), input_stream=StringIO(data), @@ -1336,12 +1248,12 @@ Now we can access the URL parameters easily: >>> request.args.keys() ['blah', 'foo'] >>> request.args['blah'] - u'blafasel' + 'blafasel' Same for the supplied form data: >>> request.form['name'] - u'this is encoded form data' + 'this is encoded form data' Handling for uploaded files is not much harder as you can see from this example: @@ -1366,10 +1278,10 @@ Request headers can be accessed by using the ‘headers’ attribute: The keys for the headers are of course case insensitive.  -File: werkzeug.info, Node: Header Parsing, Next: Responses, Prev: Enter Request, Up: Quickstart +File: werkzeug.info, Node: Header Parsing, Next: Responses, Prev: Enter Request, Up: Getting Started -1.4.3 Header Parsing --------------------- +1.7 Header Parsing +================== There is more. Werkzeug provides convenient access to often used HTTP headers and other request data. @@ -1379,7 +1291,6 @@ transmits so that we can play with it: >>> environ = create_environ() >>> environ.update( - ... HTTP_USER_AGENT='Mozilla/5.0 (Macintosh; U; Mac OS X 10.5; en-US; ) Firefox/3.1', ... HTTP_ACCEPT='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', ... HTTP_ACCEPT_LANGUAGE='de-at,en-us;q=0.8,en;q=0.5', ... HTTP_ACCEPT_ENCODING='gzip,deflate', @@ -1391,21 +1302,9 @@ transmits so that we can play with it: ... >>> request = Request(environ) -Let’s start with the most useless header: the user agent: - - >>> request.user_agent.browser - 'firefox' - >>> request.user_agent.platform - 'macos' - >>> request.user_agent.version - '3.1' - >>> request.user_agent.language - 'en-US' - -A more useful header is the accept header. With this header the browser -informs the web application what mimetypes it can handle and how well. -All accept headers are sorted by the quality, the best item being the -first: +With the accept header the browser informs the web application what +mimetypes it can handle and how well. All accept headers are sorted by +the quality, the best item being the first: >>> request.accept_mimetypes.best 'text/html' @@ -1442,7 +1341,7 @@ E-tags and other conditional headers are available in parsed form as well: >>> request.if_modified_since - datetime.datetime(2009, 2, 20, 10, 10, 25) + datetime.datetime(2009, 2, 20, 10, 10, 25, tzinfo=datetime.timezone.utc) >>> request.if_none_match >>> request.cache_control @@ -1453,10 +1352,10 @@ well: True  -File: werkzeug.info, Node: Responses, Prev: Header Parsing, Up: Quickstart +File: werkzeug.info, Node: Responses, Prev: Header Parsing, Up: Getting Started -1.4.4 Responses ---------------- +1.8 Responses +============= Response objects are the opposite of request objects. They are used to send data back to the client. In reality, response objects are nothing @@ -1512,8 +1411,8 @@ retrieve them: >>> response.content_length 12 - >>> from datetime import datetime - >>> response.date = datetime(2009, 2, 20, 17, 42, 51) + >>> from datetime import datetime, timezone + >>> response.date = datetime(2009, 2, 20, 17, 42, 51, tzinfo=timezone.utc) >>> response.headers['Date'] 'Fri, 20 Feb 2009 17:42:51 GMT' @@ -1580,11 +1479,11 @@ File: werkzeug.info, Node: Serving and Testing, Next: Reference, Prev: Gettin * Menu: * Serving WSGI Applications:: -* Test Utilities:: +* Testing WSGI Applications:: * Debugging Applications::  -File: werkzeug.info, Node: Serving WSGI Applications, Next: Test Utilities, Up: Serving and Testing +File: werkzeug.info, Node: Serving WSGI Applications, Next: Testing WSGI Applications, Up: Serving and Testing 2.1 Serving WSGI Applications ============================= @@ -1597,9 +1496,6 @@ Because of that Werkzeug comes with a builtin development server. The easiest way is creating a small ‘start-myproject.py’ file that runs the application using the builtin server: - #!/usr/bin/env python - # -*- coding: utf-8 -*- - from werkzeug.serving import run_simple from myproject import make_app @@ -1611,95 +1507,132 @@ additional files (like configuration files) you want to observe. -- Function: werkzeug.serving.run_simple (hostname, port, application, use_reloader=False, use_debugger=False, use_evalex=True, - extra_files=None, reloader_interval=1, reloader_type='auto', - threaded=False, processes=1, request_handler=None, - static_files=None, passthrough_errors=False, ssl_context=None) + extra_files=None, exclude_patterns=None, reloader_interval=1, + reloader_type='auto', threaded=False, processes=1, + request_handler=None, static_files=None, + passthrough_errors=False, ssl_context=None) - Start a WSGI application. Optional features include a reloader, - multithreading and fork support. + Start a development server for a WSGI application. Various + optional features can be enabled. - This function has a command-line interface too: - - python -m werkzeug.serving --help - - Changed in version 0.15: Bind to a Unix socket by passing a path - that starts with ‘unix://’ as the ‘hostname’. - - New in version 0.10: Improved the reloader and added support for - changing the backend through the ‘reloader_type’ parameter. See - *note Reloader: 4d. for more information. - - New in version 0.9: Added command-line interface. - - New in version 0.8: Added support for automatically loading a SSL - context from certificate file and private key. - - New in version 0.6: support for SSL was added. - - New in version 0.5: ‘static_files’ was added to simplify serving of - static files as well as ‘passthrough_errors’. + Warning: Do not use the development server when deploying to + production. It is intended for use only during local + development. It is not designed to be particularly efficient, + stable, or secure. Parameters: - * ‘hostname’ – The host to bind to, for example ‘'localhost'’. - If the value is a path that starts with ‘unix://’ it will bind - to a Unix socket instead of a TCP socket.. + * ‘hostname’ (str(1)) – The host to bind to, for example + ‘'localhost'’. Can be a domain, IPv4 or IPv6 address, or file + path starting with ‘unix://’ for a Unix socket. - * ‘port’ – The port for the server. eg: ‘8080’ + * ‘port’ (int(2)) – The port to bind to, for example ‘8080’. + Using ‘0’ tells the OS to pick a random free port. - * ‘application’ – the WSGI application to execute + * ‘application’ (‘WSGIApplication’) – The WSGI application to + run. - * ‘use_reloader’ – should the server automatically restart the - python process if modules were changed? + * ‘use_reloader’ (bool(3)) – Use a reloader process to restart + the server process when files are changed. - * ‘use_debugger’ – should the werkzeug debugging system be used? + * ‘use_debugger’ (bool(4)) – Use Werkzeug’s debugger, which will + show formatted tracebacks on unhandled exceptions. - * ‘use_evalex’ – should the exception evaluation feature be - enabled? + * ‘use_evalex’ (bool(5)) – Make the debugger interactive. A + Python terminal can be opened for any frame in the traceback. + Some protection is provided by requiring a PIN, but this + should never be enabled on a publicly visible server. - * ‘extra_files’ – a list of files the reloader should watch - additionally to the modules. For example configuration files. + * ‘extra_files’ (‘Optional’‘[’‘Iterable’‘[’str(6)‘]’‘]’) – The + reloader will watch these files for changes in addition to + Python modules. For example, watch a configuration file. - * ‘reloader_interval’ – the interval for the reloader in - seconds. + * ‘exclude_patterns’ (‘Optional’‘[’‘Iterable’‘[’str(7)‘]’‘]’) – + The reloader will ignore changes to any files matching these + fnmatch(8) patterns. For example, ignore cache files. - * ‘reloader_type’ – the type of reloader to use. The default is - auto detection. Valid values are ‘'stat'’ and ‘'watchdog'’. - See *note Reloader: 4d. for more information. + * ‘reloader_interval’ (int(9)) – How often the reloader tries to + check for changes. - * ‘threaded’ – should the process handle each request in a - separate thread? + * ‘reloader_type’ (str(10)) – The reloader to use. The ‘'stat'’ + reloader is built in, but may require significant CPU to watch + files. The ‘'watchdog'’ reloader is much more efficient but + requires installing the ‘watchdog’ package first. - * ‘processes’ – if greater than 1 then handle each request in a - new process up to this maximum number of concurrent processes. + * ‘threaded’ (bool(11)) – Handle concurrent requests using + threads. Cannot be used with ‘processes’. - * ‘request_handler’ – optional parameter that can be used to - replace the default one. You can use this to replace it with - a different ‘BaseHTTPRequestHandler’ subclass. + * ‘processes’ (int(12)) – Handle concurrent requests using up to + this number of processes. Cannot be used with ‘threaded’. - * ‘static_files’ – a list or dict of paths for static files. - This works exactly like ‘SharedDataMiddleware’, it’s actually - just wrapping the application in that middleware before - serving. + * ‘request_handler’ + (‘Optional’‘[’‘Type’‘[’‘werkzeug.serving.WSGIRequestHandler’‘]’‘]’) + – Use a different ‘BaseHTTPRequestHandler’ subclass to handle + requests. - * ‘passthrough_errors’ – set this to ‘True’ to disable the error - catching. This means that the server will die on errors but - it can be useful to hook debuggers in (pdb etc.) + * ‘static_files’ (‘Optional’‘[’‘Dict’‘[’str(13)‘, + ’‘Union’‘[’str(14)‘, ’‘Tuple’‘[’str(15)‘, + ’str(16)‘]’‘]’‘]’‘]’) – A dict mapping URL prefixes to + directories to serve static files from using + ‘SharedDataMiddleware’. - * ‘ssl_context’ – an SSL context for the connection. Either an - ssl.SSLContext(1), a tuple in the form ‘(cert_file, - pkey_file)’, the string ‘'adhoc'’ if the server should - automatically create one, or ‘None’ to disable SSL (which is - the default). + * ‘passthrough_errors’ (bool(17)) – Don’t catch unhandled + exceptions at the server level, let the serve crash instead. + If ‘use_debugger’ is enabled, the debugger will still catch + such errors. + + * ‘ssl_context’ (‘Optional’‘[’‘Union’‘[’ssl.SSLContext(18)‘, + ’‘Tuple’‘[’str(19)‘, ’‘Optional’‘[’str(20)‘]’‘]’‘, + ’‘te.Literal’‘[’‘'adhoc'’‘]’‘]’‘]’) – Configure TLS to serve + over HTTPS. Can be an ssl.SSLContext(21) object, a + ‘(cert_file, key_file)’ tuple to create a typical context, or + the string ‘'adhoc'’ to generate a temporary self-signed + certificate. + + + Return type: None(22) + + Changed in version 2.1: Instructions are shown for dealing with an + “address already in use” error. + + Changed in version 2.1: Running on ‘0.0.0.0’ or ‘::’ shows the + loopback IP in addition to a real IP. + + Changed in version 2.1: The command-line interface was removed. + + Changed in version 2.0: Running on ‘0.0.0.0’ or ‘::’ shows a real + IP address that was bound as well as a warning not to run the + development server in production. + + Changed in version 2.0: The ‘exclude_patterns’ parameter was added. + + Changed in version 0.15: Bind to a Unix socket by passing a + ‘hostname’ that starts with ‘unix://’. + + Changed in version 0.10: Improved the reloader and added support + for changing the backend through the ‘reloader_type’ parameter. + + Changed in version 0.9: A command-line interface was added. + + Changed in version 0.8: ‘ssl_context’ can be a tuple of paths to + the certificate and private key files. + + Changed in version 0.6: The ‘ssl_context’ parameter was added. + + Changed in version 0.5: The ‘static_files’ and ‘passthrough_errors’ + parameters were added. -- Function: werkzeug.serving.is_running_from_reloader () - Checks if the application is running from within the Werkzeug - reloader subprocess. + Check if the server is running as a subprocess within the Werkzeug + reloader. New in version 0.10. + + Return type: bool(23) + -- Function: werkzeug.serving.make_ssl_devcert (base_path, host=None, cn=None) @@ -1709,26 +1642,29 @@ additional files (like configuration files) you want to observe. either a host or CN. If a host is given it will use the CN ‘*.host/CN=host’. - For more information see *note run_simple(): 4c. + For more information see *note run_simple(): 46. New in version 0.9. Parameters: - * ‘base_path’ – the path to the certificate and key. The - extension ‘.crt’ is added for the certificate, ‘.key’ is added - for the key. + * ‘base_path’ (str(24)) – the path to the certificate and key. + The extension ‘.crt’ is added for the certificate, ‘.key’ is + added for the key. - * ‘host’ – the name of the host. This can be used as an - alternative for the ‘cn’. + * ‘host’ (‘Optional’‘[’str(25)‘]’) – the name of the host. This + can be used as an alternative for the ‘cn’. - * ‘cn’ – the ‘CN’ to use. + * ‘cn’ (‘Optional’‘[’str(26)‘]’) – the ‘CN’ to use. + + + Return type: Tuple[str(27), str(28)] Information: The development server is not intended to be used on production systems. It was designed especially for development purposes and performs poorly under high load. For deployment - setups have a look at the *note Application Deployment: 50. pages. + setups have a look at the *note Application Deployment: 49. pages. * Menu: @@ -1742,7 +1678,61 @@ additional files (like configuration files) you want to observe. ---------- Footnotes ---------- - (1) https://docs.python.org/3/library/ssl.html#ssl.SSLContext + (1) https://docs.python.org/3/library/stdtypes.html#str + + (2) https://docs.python.org/3/library/functions.html#int + + (3) https://docs.python.org/3/library/functions.html#bool + + (4) https://docs.python.org/3/library/functions.html#bool + + (5) https://docs.python.org/3/library/functions.html#bool + + (6) https://docs.python.org/3/library/stdtypes.html#str + + (7) https://docs.python.org/3/library/stdtypes.html#str + + (8) https://docs.python.org/3/library/fnmatch.html#module-fnmatch + + (9) https://docs.python.org/3/library/functions.html#int + + (10) https://docs.python.org/3/library/stdtypes.html#str + + (11) https://docs.python.org/3/library/functions.html#bool + + (12) https://docs.python.org/3/library/functions.html#int + + (13) https://docs.python.org/3/library/stdtypes.html#str + + (14) https://docs.python.org/3/library/stdtypes.html#str + + (15) https://docs.python.org/3/library/stdtypes.html#str + + (16) https://docs.python.org/3/library/stdtypes.html#str + + (17) https://docs.python.org/3/library/functions.html#bool + + (18) https://docs.python.org/3/library/ssl.html#ssl.SSLContext + + (19) https://docs.python.org/3/library/stdtypes.html#str + + (20) https://docs.python.org/3/library/stdtypes.html#str + + (21) https://docs.python.org/3/library/ssl.html#ssl.SSLContext + + (22) https://docs.python.org/3/library/constants.html#None + + (23) https://docs.python.org/3/library/functions.html#bool + + (24) https://docs.python.org/3/library/stdtypes.html#str + + (25) https://docs.python.org/3/library/stdtypes.html#str + + (26) https://docs.python.org/3/library/stdtypes.html#str + + (27) https://docs.python.org/3/library/stdtypes.html#str + + (28) https://docs.python.org/3/library/stdtypes.html#str  File: werkzeug.info, Node: Reloader, Next: Colored Logging, Up: Serving WSGI Applications @@ -1772,7 +1762,7 @@ If ‘watchdog’ is installed and available it will automatically be used instead of the builtin ‘stat’ reloader. To switch between the backends you can use the ‘reloader_type’ parameter -of the *note run_simple(): 4c. function. ‘'stat'’ sets it to the +of the *note run_simple(): 46. function. ‘'stat'’ sets it to the default stat based polling and ‘'watchdog'’ forces it to the watchdog backend. @@ -1790,13 +1780,13 @@ File: werkzeug.info, Node: Colored Logging, Next: Virtual Hosts, Prev: Reload 2.1.2 Colored Logging --------------------- -The development server can optionally highlight the request logs in -different colors based on the status code. Install Click(1) to enable -this feature. +The development server highlights the request logs in different colors +based on the status code. On Windows, Colorama(1) must be installed as +well to enable this. ---------- Footnotes ---------- - (1) https://pypi.org/project/click/ + (1) https://pypi.org/project/colorama/  File: werkzeug.info, Node: Virtual Hosts, Next: Shutting Down The Server, Prev: Colored Logging, Up: Serving WSGI Applications @@ -1827,7 +1817,7 @@ after ‘localhost’: Save the changes and after a while you should be able to access the development server on these host names as well. You can use the *note -URL Routing: 55. system to dispatch between different hosts or parse +URL Routing: 4f. system to dispatch between different hosts or parse ‘request.host’ yourself. ---------- Footnotes ---------- @@ -1840,18 +1830,47 @@ File: werkzeug.info, Node: Shutting Down The Server, Next: Troubleshooting, P 2.1.4 Shutting Down The Server ------------------------------ -New in version 0.7. +In some cases it can be useful to shut down a server after handling a +request. For example, a local command line tool that needs OAuth +authentication could temporarily start a server to listen for a +response, record the user’s token, then stop the server. -Starting with Werkzeug 0.7 the development server provides a way to shut -down the server after a request. This currently only works with Python -2.6 and later and will only work with the development server. To -initiate the shutdown you have to call a function named -‘'werkzeug.server.shutdown'’ in the WSGI environment: +One method to do this could be to start a server in a multiprocessing(1) +process, then terminate the process after a value is passed back to the +parent. - def shutdown_server(environ): - if not 'werkzeug.server.shutdown' in environ: - raise RuntimeError('Not running the development server') - environ['werkzeug.server.shutdown']() + import multiprocessing + from werkzeug import Request, Response, run_simple + + def get_token(q: multiprocessing.Queue) -> None: + @Request.application + def app(request: Request) -> Response: + q.put(request.args["token"]) + return Response("", 204) + + run_simple("localhost", 5000, app) + + if __name__ == "__main__": + q = multiprocessing.Queue() + p = multiprocessing.Process(target=get_token, args=(q,)) + p.start() + print("waiting") + token = q.get(block=True) + p.terminate() + print(token) + +That example uses Werkzeug’s development server, but any production +server that can be started as a Python process could use the same +technique and should be preferred for security. Another method could be +to start a subprocess(2) process and send the value back over ‘stdout’. + + ---------- Footnotes ---------- + + (1) +https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing + + (2) +https://docs.python.org/3/library/subprocess.html#module-subprocess  File: werkzeug.info, Node: Troubleshooting, Next: SSL, Prev: Shutting Down The Server, Up: Serving WSGI Applications @@ -1928,7 +1947,7 @@ provide the name of your server on generation or a ‘CN’. ('/path/to/the/key.crt', '/path/to/the/key.key') 2. Now this tuple can be passed as ‘ssl_context’ to the *note - run_simple(): 4c. method: + run_simple(): 46. method: run_simple('localhost', 4000, application, ssl_context=('/path/to/the/key.crt', @@ -1942,12 +1961,11 @@ File: werkzeug.info, Node: Loading Contexts by Hand, Next: Generating Certific 2.1.6.2 Loading Contexts by Hand ................................ -In Python 2.7.9 and 3+ you also have the option to use a -‘ssl.SSLContext’ object instead of a simple tuple. This way you have -better control over the SSL behavior of Werkzeug’s builtin server: +You can use a ‘ssl.SSLContext’ object instead of a tuple for full +control over the TLS configuration. import ssl - ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ctx.load_cert_chain('ssl.cert', 'ssl.key') run_simple('localhost', 4000, application, ssl_context=ctx) @@ -1958,7 +1976,7 @@ File: werkzeug.info, Node: Generating Certificates, Next: Adhoc Certificates, ............................... A key and certificate can be created in advance using the openssl tool -instead of the *note make_ssl_devcert(): 4f. This requires that you +instead of the *note make_ssl_devcert(): 48. This requires that you have the ‘openssl’ command installed on your system: $ openssl genrsa 1024 > ssl.key @@ -1990,128 +2008,424 @@ File: werkzeug.info, Node: Unix Sockets, Prev: SSL, Up: Serving WSGI Applicat ------------------ The dev server can bind to a Unix socket instead of a TCP socket. *note -run_simple(): 4c. will bind to a Unix socket if the ‘hostname’ parameter +run_simple(): 46. will bind to a Unix socket if the ‘hostname’ parameter starts with ‘'unix://'’. from werkzeug.serving import run_simple run_simple('unix://example.sock', 0, app)  -File: werkzeug.info, Node: Test Utilities, Next: Debugging Applications, Prev: Serving WSGI Applications, Up: Serving and Testing +File: werkzeug.info, Node: Testing WSGI Applications, Next: Debugging Applications, Prev: Serving WSGI Applications, Up: Serving and Testing -2.2 Test Utilities -================== - -Quite often you want to unittest your application or just check the -output from an interactive python session. In theory that is pretty -simple because you can fake a WSGI environment and call the application -with a dummy ‘start_response’ and iterate over the application iterator -but there are argumentably better ways to interact with an application. +2.2 Testing WSGI Applications +============================= * Menu: -* Diving In:: -* Environment Building:: -* Testing API:: +* Test Client:: +* Request Body:: +* Environment Builder:: +* API::  -File: werkzeug.info, Node: Diving In, Next: Environment Building, Up: Test Utilities +File: werkzeug.info, Node: Test Client, Next: Request Body, Up: Testing WSGI Applications -2.2.1 Diving In ---------------- +2.2.1 Test Client +----------------- -Werkzeug provides a ‘Client’ object which you can pass a WSGI -application (and optionally a response wrapper) which you can use to -send virtual requests to the application. - -A response wrapper is a callable that takes three arguments: the -application iterator, the status and finally a list of headers. The -default response wrapper returns a tuple. Because response objects have -the same signature, you can use them as response wrapper, ideally by -subclassing them and hooking in test functionality. +Werkzeug provides a *note Client: 5c. to simulate requests to a WSGI +application without starting a server. The client has methods for +making different types of requests, as well as managing cookies across +requests. >>> from werkzeug.test import Client >>> from werkzeug.testapp import test_app - >>> from werkzeug.wrappers import BaseResponse - >>> c = Client(test_app, BaseResponse) - >>> resp = c.get('/') - >>> resp.status_code + >>> c = Client(test_app) + >>> response = c.get("/") + >>> response.status_code 200 >>> resp.headers Headers([('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '6658')]) - >>> resp.data.splitlines()[0] - b'>> response.get_data(as_text=True) + '>> c = Client(test_app) - >>> app_iter, status, headers = c.get('/') - >>> status - '200 OK' - >>> headers - Headers([('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '6658')]) - >>> b''.join(app_iter).splitlines()[0] - b'>> from werkzeug.test import EnvironBuilder - >>> from io import BytesIO - >>> builder = EnvironBuilder(method='POST', data={'foo': 'this is some text', - ... 'file': (BytesIO('my file contents'.encode("utf8")), 'test.txt')}) - >>> env = builder.get_environ() +Pass a string, bytes, or file-like object to ‘data’ to use that as the +raw request body. In that case, you should set the content type +appropriately. For example, to post YAML: -The resulting environment is a regular WSGI environment that can be used -for further processing: + response = client.post( + data="a: value\nb: 1\n", content_type="application/yaml" + ) - >>> from werkzeug.wrappers import Request - >>> req = Request(env) - >>> req.form['foo'] - 'this is some text' - >>> req.files['file'] - - >>> req.files['file'].read() - b'my file contents' +A shortcut when testing JSON APIs is to pass a dict to ‘json’ instead of +using ‘data’. This will automatically call ‘json.dumps()’ and set the +content type to ‘application/json’. Additionally, if the app returns +JSON, ‘response.json’ will automatically call ‘json.loads()’. -The *note EnvironBuilder: 63. figures out the content type automatically -if you pass a dict to the constructor as ‘data’. If you provide a -string or an input stream you have to do that yourself. - -By default it will try to use ‘application/x-www-form-urlencoded’ and -only use ‘multipart/form-data’ if files are uploaded: - - >>> builder = EnvironBuilder(method='POST', data={'foo': 'bar'}) - >>> builder.content_type - 'application/x-www-form-urlencoded' - >>> builder.files['foo'] = BytesIO('contents'.encode("utf8")) - >>> builder.content_type - 'multipart/form-data' - -If a string is provided as data (or an input stream) you have to specify -the content type yourself: - - >>> builder = EnvironBuilder(method='POST', data='{"json": "this is"}') - >>> builder.content_type - >>> builder.content_type = 'application/json' + response = client.post("/api", json={"a": "value", "b": 1}) + obj = response.json()  -File: werkzeug.info, Node: Testing API, Prev: Environment Building, Up: Test Utilities +File: werkzeug.info, Node: Environment Builder, Next: API, Prev: Request Body, Up: Testing WSGI Applications -2.2.3 Testing API ------------------ +2.2.3 Environment Builder +------------------------- + +*note EnvironBuilder: 61. is used to construct a WSGI environ dict. The +test client uses this internally to prepare its requests. The arguments +passed to the client request methods are the same as the builder. + +Sometimes, it can be useful to construct a WSGI environment manually. +An environ builder or dict can be passed to the test client request +methods in place of other arguments to use a custom environ. + + from werkzeug.test import EnvironBuilder + builder = EnvironBuilder(...) + # build an environ dict + environ = builder.get_environ() + # build an environ dict wrapped in a request + request = builder.get_request() + +The test client responses make this available through *note +TestResponse.request: 62. and ‘response.request.environ’. + + +File: werkzeug.info, Node: API, Prev: Environment Builder, Up: Testing WSGI Applications + +2.2.4 API +--------- + + -- Class: werkzeug.test.Client (application, response_wrapper=None, + use_cookies=True, allow_subdomain_redirects=False) + + This class allows you to send requests to a wrapped application. + + The use_cookies parameter indicates whether cookies should be + stored and sent for subsequent requests. This is True by default, + but passing False will disable this behaviour. + + If you want to request some subdomain of your application you may + set ‘allow_subdomain_redirects’ to ‘True’ as if not no external + redirects are allowed. + + Changed in version 2.1: Removed deprecated behavior of treating the + response as a tuple. All data is available as properties on the + returned response object. + + Changed in version 2.0: ‘response_wrapper’ is always a subclass of + :class:‘TestResponse’. + + Changed in version 0.5: Added the ‘use_cookies’ parameter. + + + Parameters: + + * ‘application’ (‘WSGIApplication’) – + + * ‘response_wrapper’ (‘Optional’‘[’‘Type’‘[’*note Response: + 5e.‘]’‘]’) – + + * ‘use_cookies’ (bool(1)) – + + * ‘allow_subdomain_redirects’ (bool(2)) – + + + Return type: None(3) + + -- Method: set_cookie (server_name, key, value='', max_age=None, + expires=None, path='/', domain=None, secure=False, + httponly=False, samesite=None, charset='utf-8') + + Sets a cookie in the client’s cookie jar. The server name is + required and has to match the one that is also passed to the + open call. + + + Parameters: + + * ‘server_name’ (str(4)) – + + * ‘key’ (str(5)) – + + * ‘value’ (str(6)) – + + * ‘max_age’ (‘Optional’‘[’‘Union’‘[’datetime.timedelta(7)‘, + ’int(8)‘]’‘]’) – + + * ‘expires’ (‘Optional’‘[’‘Union’‘[’str(9)‘, + ’datetime.datetime(10)‘, ’int(11)‘, ’float(12)‘]’‘]’) – + + * ‘path’ (str(13)) – + + * ‘domain’ (‘Optional’‘[’str(14)‘]’) – + + * ‘secure’ (bool(15)) – + + * ‘httponly’ (bool(16)) – + + * ‘samesite’ (‘Optional’‘[’str(17)‘]’) – + + * ‘charset’ (str(18)) – + + + Return type: None(19) + + -- Method: delete_cookie (server_name, key, path='/', domain=None, + secure=False, httponly=False, samesite=None) + + Deletes a cookie in the test client. + + + Parameters: + + * ‘server_name’ (str(20)) – + + * ‘key’ (str(21)) – + + * ‘path’ (str(22)) – + + * ‘domain’ (‘Optional’‘[’str(23)‘]’) – + + * ‘secure’ (bool(24)) – + + * ‘httponly’ (bool(25)) – + + * ‘samesite’ (‘Optional’‘[’str(26)‘]’) – + + + Return type: None(27) + + -- Method: open (*args, buffered=False, follow_redirects=False, + **kwargs) + + Generate an environ dict from the given arguments, make a + request to the application using it, and return the response. + + + Parameters: + + * ‘args’ (‘Any’) – Passed to *note EnvironBuilder: 61. to + create the environ for the request. If a single arg is + passed, it can be an existing *note EnvironBuilder: 61. + or an environ dict. + + * ‘buffered’ (bool(28)) – Convert the iterator returned by + the app into a list. If the iterator has a ‘close()’ + method, it is called automatically. + + * ‘follow_redirects’ (bool(29)) – Make additional requests + to follow HTTP redirects until a non-redirect status is + returned. *note TestResponse.history: 67. lists the + intermediate responses. + + * ‘kwargs’ (‘Any’) – + + + Return type: *note werkzeug.test.TestResponse: 5d. + + Changed in version 2.1: Removed the ‘as_tuple’ parameter. + + Changed in version 2.0: ‘as_tuple’ is deprecated and will be + removed in Werkzeug 2.1. Use *note TestResponse.request: 62. + and ‘request.environ’ instead. + + Changed in version 2.0: The request input stream is closed + when calling ‘response.close()’. Input streams for redirects + are automatically closed. + + Changed in version 0.5: If a dict is provided as file in the + dict for the ‘data’ parameter the content type has to be + called ‘content_type’ instead of ‘mimetype’. This change was + made for consistency with ‘werkzeug.FileWrapper’. + + Changed in version 0.5: Added the ‘follow_redirects’ + parameter. + + -- Method: get (*args, **kw) + + Call *note open(): 66. with ‘method’ set to ‘GET’. + + + Parameters: + + * ‘args’ (‘Any’) – + + * ‘kw’ (‘Any’) – + + + Return type: *note werkzeug.test.TestResponse: 5d. + + -- Method: post (*args, **kw) + + Call *note open(): 66. with ‘method’ set to ‘POST’. + + + Parameters: + + * ‘args’ (‘Any’) – + + * ‘kw’ (‘Any’) – + + + Return type: *note werkzeug.test.TestResponse: 5d. + + -- Method: put (*args, **kw) + + Call *note open(): 66. with ‘method’ set to ‘PUT’. + + + Parameters: + + * ‘args’ (‘Any’) – + + * ‘kw’ (‘Any’) – + + + Return type: *note werkzeug.test.TestResponse: 5d. + + -- Method: delete (*args, **kw) + + Call *note open(): 66. with ‘method’ set to ‘DELETE’. + + + Parameters: + + * ‘args’ (‘Any’) – + + * ‘kw’ (‘Any’) – + + + Return type: *note werkzeug.test.TestResponse: 5d. + + -- Method: patch (*args, **kw) + + Call *note open(): 66. with ‘method’ set to ‘PATCH’. + + + Parameters: + + * ‘args’ (‘Any’) – + + * ‘kw’ (‘Any’) – + + + Return type: *note werkzeug.test.TestResponse: 5d. + + -- Method: options (*args, **kw) + + Call *note open(): 66. with ‘method’ set to ‘OPTIONS’. + + + Parameters: + + * ‘args’ (‘Any’) – + + * ‘kw’ (‘Any’) – + + + Return type: *note werkzeug.test.TestResponse: 5d. + + -- Method: head (*args, **kw) + + Call *note open(): 66. with ‘method’ set to ‘HEAD’. + + + Parameters: + + * ‘args’ (‘Any’) – + + * ‘kw’ (‘Any’) – + + + Return type: *note werkzeug.test.TestResponse: 5d. + + -- Method: trace (*args, **kw) + + Call *note open(): 66. with ‘method’ set to ‘TRACE’. + + + Parameters: + + * ‘args’ (‘Any’) – + + * ‘kw’ (‘Any’) – + + + Return type: *note werkzeug.test.TestResponse: 5d. + + -- Class: werkzeug.test.TestResponse (response, status, headers, + request, history=(), **kwargs) + + *note Response: 5e. subclass that provides extra information about + requests made with the test *note Client: 5c. + + Test client requests will always return an instance of this class. + If a custom response class is passed to the client, it is + subclassed along with this to support test information. + + If the test request included large files, or if the application is + serving a file, call ‘close()’ to close any open files and prevent + Python showing a ‘ResourceWarning’. + + Changed in version 2.1: Removed deprecated behavior for treating + the response instance as a tuple. + + New in version 2.0: Test client methods always return instances of + this class. + + + Parameters: + + * ‘response’ (‘Union’‘[’‘Iterable’‘[’str(30)‘]’‘, + ’‘Iterable’‘[’bytes(31)‘]’‘]’) – + + * ‘status’ (str(32)) – + + * ‘headers’ (*note werkzeug.datastructures.Headers: 70.) – + + * ‘request’ (*note werkzeug.wrappers.request.Request: 71.) – + + * ‘history’ (‘Tuple’‘[’*note werkzeug.test.TestResponse: 5d.‘, + ’‘...’‘]’) – + + * ‘kwargs’ (‘Any’) – + + + Return type: None(33) + + -- Attribute: request: *note werkzeug.wrappers.request.Request: + 71. + + A request object with the environ used to make the request + that resulted in this response. + + -- Attribute: history: Tuple[*note werkzeug.test.TestResponse: 5d, + ...] + + A list of intermediate responses. Populated when the test + request is made with ‘follow_redirects’ enabled. -- Class: werkzeug.test.EnvironBuilder (path='/', base_url=None, query_string=None, method='GET', input_stream=None, @@ -2119,28 +2433,27 @@ File: werkzeug.info, Node: Testing API, Prev: Environment Building, Up: Test multithread=False, multiprocess=False, run_once=False, headers=None, data=None, environ_base=None, environ_overrides=None, charset='utf-8', mimetype=None, - json=None) + json=None, auth=None) This class can be used to conveniently create a WSGI environment for testing purposes. It can be used to quickly create WSGI environments or request objects from arbitrary data. The signature of this class is also used in some other places as of - Werkzeug 0.5 (*note create_environ(): 65, - ‘BaseResponse.from_values()’, *note Client.open(): 66.). Because - of this most of the functionality is available through the - constructor alone. + Werkzeug 0.5 (*note create_environ(): 72, ‘Response.from_values()’, + *note Client.open(): 66.). Because of this most of the + functionality is available through the constructor alone. Files and regular form data can be manipulated independently of - each other with the *note form: 67. and *note files: 68. + each other with the *note form: 73. and *note files: 74. attributes, but are passed with the same argument to the constructor: ‘data’. ‘data’ can be any of these values: - a ‘str’ or ‘bytes’ object: The object is converted into an - *note input_stream: 69, the *note content_length: 6a. is set - and you have to provide a *note content_type: 6b. + *note input_stream: 75, the *note content_length: 76. is set + and you have to provide a *note content_type: 77. - a ‘dict’ or ‘MultiDict’: The keys have to be strings. The values have to be either any of the following objects, or a @@ -2161,211 +2474,102 @@ File: werkzeug.info, Node: Testing API, Prev: Environment Building, Up: Test Parameters: - * ‘path’ – the path of the request. In the WSGI environment - this will end up as ‘PATH_INFO’. If the ‘query_string’ is not - defined and there is a question mark in the ‘path’ everything - after it is used as query string. + * ‘path’ (str(34)) – the path of the request. In the WSGI + environment this will end up as ‘PATH_INFO’. If the + ‘query_string’ is not defined and there is a question mark in + the ‘path’ everything after it is used as query string. - * ‘base_url’ – the base URL is a URL that is used to extract the - WSGI URL scheme, host (server name + server port) and the - script root (‘SCRIPT_NAME’). + * ‘base_url’ (‘Optional’‘[’str(35)‘]’) – the base URL is a URL + that is used to extract the WSGI URL scheme, host (server name + + server port) and the script root (‘SCRIPT_NAME’). - * ‘query_string’ – an optional string or dict with URL - parameters. + * ‘query_string’ (‘Optional’‘[’‘Union’‘[’‘Mapping’‘[’str(36)‘, + ’str(37)‘]’‘, ’str(38)‘]’‘]’) – an optional string or dict + with URL parameters. - * ‘method’ – the HTTP method to use, defaults to ‘GET’. + * ‘method’ (str(39)) – the HTTP method to use, defaults to + ‘GET’. - * ‘input_stream’ – an optional input stream. Do not specify - this and ‘data’. As soon as an input stream is set you can’t - modify *note args: 6c. and *note files: 68. unless you set the - *note input_stream: 69. to ‘None’ again. + * ‘input_stream’ (‘Optional’‘[’‘IO’‘[’bytes(40)‘]’‘]’) – an + optional input stream. Do not specify this and ‘data’. As + soon as an input stream is set you can’t modify *note args: + 78. and *note files: 74. unless you set the *note + input_stream: 75. to ‘None’ again. - * ‘content_type’ – The content type for the request. As of 0.5 - you don’t have to provide this when specifying files and form - data via ‘data’. + * ‘content_type’ (‘Optional’‘[’str(41)‘]’) – The content type + for the request. As of 0.5 you don’t have to provide this + when specifying files and form data via ‘data’. - * ‘content_length’ – The content length for the request. You - don’t have to specify this when providing data via ‘data’. + * ‘content_length’ (‘Optional’‘[’int(42)‘]’) – The content + length for the request. You don’t have to specify this when + providing data via ‘data’. - * ‘errors_stream’ – an optional error stream that is used for - ‘wsgi.errors’. Defaults to ‘stderr’. + * ‘errors_stream’ (‘Optional’‘[’‘IO’‘[’str(43)‘]’‘]’) – an + optional error stream that is used for ‘wsgi.errors’. + Defaults to ‘stderr’. - * ‘multithread’ – controls ‘wsgi.multithread’. Defaults to + * ‘multithread’ (bool(44)) – controls ‘wsgi.multithread’. + Defaults to ‘False’. + + * ‘multiprocess’ (bool(45)) – controls ‘wsgi.multiprocess’. + Defaults to ‘False’. + + * ‘run_once’ (bool(46)) – controls ‘wsgi.run_once’. Defaults to ‘False’. - * ‘multiprocess’ – controls ‘wsgi.multiprocess’. Defaults to - ‘False’. + * ‘headers’ (‘Optional’‘[’‘Union’‘[’*note + werkzeug.datastructures.Headers: 70.‘, + ’‘Iterable’‘[’‘Tuple’‘[’str(47)‘, ’str(48)‘]’‘]’‘]’‘]’) – an + optional list or ‘Headers’ object of headers. - * ‘run_once’ – controls ‘wsgi.run_once’. Defaults to ‘False’. + * ‘data’ (‘Optional’‘[’‘Union’‘[’‘IO’‘[’bytes(49)‘]’‘, + ’str(50)‘, ’bytes(51)‘, ’‘Mapping’‘[’str(52)‘, + ’‘Any’‘]’‘]’‘]’) – a string or dict of form data or a + file-object. See explanation above. - * ‘headers’ – an optional list or ‘Headers’ object of headers. + * ‘json’ (‘Optional’‘[’‘Mapping’‘[’str(53)‘, ’‘Any’‘]’‘]’) – An + object to be serialized and assigned to ‘data’. Defaults the + content type to ‘"application/json"’. Serialized with the + function assigned to *note json_dumps: 79. - * ‘data’ – a string or dict of form data or a file-object. See - explanation above. + * ‘environ_base’ (‘Optional’‘[’‘Mapping’‘[’str(54)‘, + ’‘Any’‘]’‘]’) – an optional dict of environment defaults. - * ‘json’ – An object to be serialized and assigned to ‘data’. - Defaults the content type to ‘"application/json"’. Serialized - with the function assigned to *note json_dumps: 6d. + * ‘environ_overrides’ (‘Optional’‘[’‘Mapping’‘[’str(55)‘, + ’‘Any’‘]’‘]’) – an optional dict of environment overrides. - * ‘environ_base’ – an optional dict of environment defaults. + * ‘charset’ (str(56)) – the charset used to encode string data. - * ‘environ_overrides’ – an optional dict of environment - overrides. + * ‘auth’ (‘Optional’‘[’‘Union’‘[’*note + werkzeug.datastructures.Authorization: 7a.‘, + ’‘Tuple’‘[’str(57)‘, ’str(58)‘]’‘]’‘]’) – An authorization + object to use for the ‘Authorization’ header value. A + ‘(username, password)’ tuple is a shortcut for ‘Basic’ + authorization. - * ‘charset’ – the charset used to encode unicode data. + * ‘mimetype’ (‘Optional’‘[’str(59)‘]’) – - New in version 0.15: The ‘json’ param and *note json_dumps(): 6d. + + Return type: None(60) + + Changed in version 2.0: ‘REQUEST_URI’ and ‘RAW_URI’ is the full raw + URI including the query string, not only the path. + + Changed in version 2.0: The default *note request_class: 7b. is + ‘Request’ instead of ‘BaseRequest’. + + New in version 2.0: Added the ‘auth’ parameter. + + New in version 0.15: The ‘json’ param and *note json_dumps(): 79. method. New in version 0.15: The environ has keys ‘REQUEST_URI’ and - ‘RAW_URI’ containing the path before perecent-decoding. This is - not part of the WSGI PEP, but many WSGI servers include it. + ‘RAW_URI’ containing the path before percent-decoding. This is not + part of the WSGI PEP, but many WSGI servers include it. Changed in version 0.6: ‘path’ and ‘base_url’ can now be unicode strings that are encoded with ‘iri_to_uri()’. - -- Attribute: path - - The path of the application. (aka ‘PATH_INFO’) - - -- Attribute: charset - - The charset used to encode unicode data. - - -- Attribute: headers - - A ‘Headers’ object with the request headers. - - -- Attribute: errors_stream - - The error stream used for the ‘wsgi.errors’ stream. - - -- Attribute: multithread - - The value of ‘wsgi.multithread’ - - -- Attribute: multiprocess - - The value of ‘wsgi.multiprocess’ - - -- Attribute: environ_base - - The dict used as base for the newly create environ. - - -- Attribute: environ_overrides - - A dict with values that are used to override the generated - environ. - - -- Attribute: input_stream - - The optional input stream. This and *note form: 67. / *note - files: 68. is mutually exclusive. Also do not provide this - stream if the request method is not ‘POST’ / ‘PUT’ or - something comparable. - - -- Attribute: args - - The URL arguments as ‘MultiDict’. - - -- Attribute: base_url - - The base URL is used to extract the URL scheme, host name, - port, and root path. - - -- Method: close () - - Closes all files. If you put real ‘file’ objects into the - *note files: 68. dict you can call this method to - automatically close them all in one go. - - -- Attribute: content_length - - The content length as integer. Reflected from and to the - *note headers: 70. Do not set if you set *note files: 68. or - *note form: 67. for auto detection. - - -- Attribute: content_type - - The content type for the request. Reflected from and to the - *note headers: 70. Do not set if you set *note files: 68. or - *note form: 67. for auto detection. - - -- Attribute: files - - A ‘FileMultiDict’ of uploaded files. Use ‘add_file()’ to add - new files. - - -- Attribute: form - - A ‘MultiDict’ of form values. - - -- Class Method: from_environ (environ, **kwargs) - - Turn an environ dict back into a builder. Any extra kwargs - override the args extracted from the environ. - - New in version 0.15. - - -- Method: get_environ () - - Return the built environ. - - Changed in version 0.15: The content type and length headers - are set based on input stream detection. Previously this only - set the WSGI keys. - - -- Method: get_request (cls=None) - - Returns a request with the data. If the request class is not - specified *note request_class: 7b. is used. - - - Parameters: ‘cls’ – The request wrapper to use. - - -- Attribute: input_stream - - An optional input stream. If you set this it will clear *note - form: 67. and *note files: 68. - - -- Static Method: json_dumps (obj, *, skipkeys=False, - ensure_ascii=True, check_circular=True, allow_nan=True, - cls=None, indent=None, separators=None, default=None, - sort_keys=False, **kw) - - The serialization function used when ‘json’ is passed. - - -- Attribute: mimetype - - The mimetype (content type without charset etc.) - - New in version 0.14. - - -- Attribute: mimetype_params - - The mimetype parameters as dict. For example if the content - type is ‘text/html; charset=utf-8’ the params would be - ‘{'charset': 'utf-8'}’. - - New in version 0.14. - - -- Attribute: query_string - - The query string. If you set this to a string *note args: 6c. - will no longer be available. - - -- Attribute: request_class - - alias of ‘werkzeug.wrappers.base_request.BaseRequest’ - - -- Attribute: server_name - - The server name (read-only, use ‘host’ to set) - - -- Attribute: server_port - - The server port as integer (read-only, use ‘host’ to set) - -- Attribute: server_protocol = 'HTTP/1.1' the server protocol to use. defaults to HTTP/1.1 @@ -2374,105 +2578,136 @@ File: werkzeug.info, Node: Testing API, Prev: Environment Building, Up: Test the wsgi version to use. defaults to (1, 0) - -- Class: werkzeug.test.Client (application, response_wrapper=None, - use_cookies=True, allow_subdomain_redirects=False) + -- Attribute: request_class - This class allows you to send requests to a wrapped application. + alias of *note werkzeug.wrappers.request.Request: 71. - The response wrapper can be a class or factory function that takes - three arguments: app_iter, status and headers. The default - response wrapper just returns a tuple. + -- Method: static json_dumps (obj, *, skipkeys=False, + ensure_ascii=True, check_circular=True, allow_nan=True, + cls=None, indent=None, separators=None, default=None, + sort_keys=False, **kw) - Example: + The serialization function used when ‘json’ is passed. - class ClientResponse(BaseResponse): - ... + -- Method: classmethod from_environ (environ, **kwargs) - client = Client(MyApplication(), response_wrapper=ClientResponse) + Turn an environ dict back into a builder. Any extra kwargs + override the args extracted from the environ. - The use_cookies parameter indicates whether cookies should be - stored and sent for subsequent requests. This is True by default, - but passing False will disable this behaviour. + Changed in version 2.0: Path and query values are passed + through the WSGI decoding dance to avoid double encoding. - If you want to request some subdomain of your application you may - set ‘allow_subdomain_redirects’ to ‘True’ as if not no external - redirects are allowed. - - New in version 0.15: The ‘json’ parameter. - - New in version 0.14: The ‘mimetype’ parameter was added. - - New in version 0.5: ‘use_cookies’ is new in this version. Older - versions did not provide builtin cookie support. - - -- Method: open (*args, **kwargs) - - Takes the same arguments as the *note EnvironBuilder: 63. - class with some additions: You can provide a *note - EnvironBuilder: 63. or a WSGI environment as only argument - instead of the *note EnvironBuilder: 63. arguments and two - optional keyword arguments (‘as_tuple’, ‘buffered’) that - change the type of the return value or the way the application - is executed. - - Changed in version 0.5: If a dict is provided as file in the - dict for the ‘data’ parameter the content type has to be - called ‘content_type’ now instead of ‘mimetype’. This change - was made for consistency with ‘werkzeug.FileWrapper’. - - The ‘follow_redirects’ parameter was added to *note - open(): 66. - - Additional parameters: + New in version 0.15. Parameters: - * ‘as_tuple’ – Returns a tuple in the form ‘(environ, - result)’ + * ‘environ’ (‘WSGIEnvironment’) – - * ‘buffered’ – Set this to True to buffer the application - run. This will automatically close the application for - you as well. + * ‘kwargs’ (‘Any’) – - * ‘follow_redirects’ – Set this to True if the ‘Client’ - should follow HTTP redirects. - Shortcut methods are available for many HTTP methods: + Return type: *note EnvironBuilder: 61. - -- Method: get (*args, **kw) + -- Property: base_url: str(61) - Like open but method is enforced to GET. + The base URL is used to extract the URL scheme, host name, + port, and root path. - -- Method: patch (*args, **kw) + -- Property: content_type: Optional[str(62)] - Like open but method is enforced to PATCH. + The content type for the request. Reflected from and to the + ‘headers’. Do not set if you set *note files: 74. or *note + form: 73. for auto detection. - -- Method: post (*args, **kw) + -- Property: mimetype: Optional[str(63)] - Like open but method is enforced to POST. + The mimetype (content type without charset etc.) - -- Method: head (*args, **kw) + New in version 0.14. - Like open but method is enforced to HEAD. + -- Property: mimetype_params: Mapping[str(64), str(65)] - -- Method: put (*args, **kw) + The mimetype parameters as dict. For example if the content + type is ‘text/html; charset=utf-8’ the params would be + ‘{'charset': 'utf-8'}’. - Like open but method is enforced to PUT. + New in version 0.14. - -- Method: delete (*args, **kw) + -- Property: content_length: Optional[int(66)] - Like open but method is enforced to DELETE. + The content length as integer. Reflected from and to the + ‘headers’. Do not set if you set *note files: 74. or *note + form: 73. for auto detection. - -- Method: options (*args, **kw) + -- Property: form: *note werkzeug.datastructures.MultiDict: 82. - Like open but method is enforced to OPTIONS. + A ‘MultiDict’ of form values. - -- Method: trace (*args, **kw) + -- Property: files: *note werkzeug.datastructures.FileMultiDict: + 83. - Like open but method is enforced to TRACE. + A ‘FileMultiDict’ of uploaded files. Use ‘add_file()’ to add + new files. - -- Function: werkzeug.test.create_environ ([options]) + -- Property: input_stream: Optional[IO[bytes(67)]] + + An optional input stream. This is mutually exclusive with + setting *note form: 73. and *note files: 74, setting it will + clear those. Do not provide this if the method is not ‘POST’ + or another method that has a body. + + -- Property: query_string: str(68) + + The query string. If you set this to a string *note args: 78. + will no longer be available. + + -- Property: args: *note werkzeug.datastructures.MultiDict: 82. + + The URL arguments as ‘MultiDict’. + + -- Property: server_name: str(69) + + The server name (read-only, use ‘host’ to set) + + -- Property: server_port: int(70) + + The server port as integer (read-only, use ‘host’ to set) + + -- Method: close () + + Closes all files. If you put real ‘file’ objects into the + *note files: 74. dict you can call this method to + automatically close them all in one go. + + + Return type: None(71) + + -- Method: get_environ () + + Return the built environ. + + Changed in version 0.15: The content type and length headers + are set based on input stream detection. Previously this only + set the WSGI keys. + + + Return type: WSGIEnvironment + + -- Method: get_request (cls=None) + + Returns a request with the data. If the request class is not + specified *note request_class: 7b. is used. + + + Parameters: ‘cls’ (‘Optional’‘[’‘Type’‘[’*note + werkzeug.wrappers.request.Request: 71.‘]’‘]’) – The request + wrapper to use. + + + Return type: *note werkzeug.wrappers.request.Request: 71. + + -- Function: werkzeug.test.create_environ (*args, **kwargs) Create a new WSGI environ dict based on the values passed. The first parameter should be the path of the request which defaults to @@ -2480,14 +2715,24 @@ File: werkzeug.info, Node: Testing API, Prev: Environment Building, Up: Test the host is localhost:80) or a full path to the request with scheme, netloc port and the path to the script. - This accepts the same arguments as the *note EnvironBuilder: 63. + This accepts the same arguments as the *note EnvironBuilder: 61. constructor. Changed in version 0.5: This function is now a thin wrapper over - *note EnvironBuilder: 63. which was added in 0.5. The ‘headers’, + *note EnvironBuilder: 61. which was added in 0.5. The ‘headers’, ‘environ_base’, ‘environ_overrides’ and ‘charset’ parameters were added. + + Parameters: + + * ‘args’ (‘Any’) – + + * ‘kwargs’ (‘Any’) – + + + Return type: WSGIEnvironment + -- Function: werkzeug.test.run_wsgi_app (app, environ, buffered=False) Return a tuple in the form (app_iter, status, headers) of the @@ -2506,15 +2751,173 @@ File: werkzeug.info, Node: Testing API, Prev: Environment Building, Up: Test Parameters: - * ‘app’ – the application to execute. + * ‘app’ (‘WSGIApplication’) – the application to execute. - * ‘buffered’ – set to ‘True’ to enforce buffering. + * ‘buffered’ (bool(72)) – set to ‘True’ to enforce buffering. + + * ‘environ’ (‘WSGIEnvironment’) – Returns: tuple in the form ‘(app_iter, status, headers)’ + + Return type: Tuple[Iterable[bytes(73)], str(74), *note + werkzeug.datastructures.Headers: 70.] + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3/library/functions.html#bool + + (2) https://docs.python.org/3/library/functions.html#bool + + (3) https://docs.python.org/3/library/constants.html#None + + (4) https://docs.python.org/3/library/stdtypes.html#str + + (5) https://docs.python.org/3/library/stdtypes.html#str + + (6) https://docs.python.org/3/library/stdtypes.html#str + + (7) +https://docs.python.org/3/library/datetime.html#datetime.timedelta + + (8) https://docs.python.org/3/library/functions.html#int + + (9) https://docs.python.org/3/library/stdtypes.html#str + + (10) +https://docs.python.org/3/library/datetime.html#datetime.datetime + + (11) https://docs.python.org/3/library/functions.html#int + + (12) https://docs.python.org/3/library/functions.html#float + + (13) https://docs.python.org/3/library/stdtypes.html#str + + (14) https://docs.python.org/3/library/stdtypes.html#str + + (15) https://docs.python.org/3/library/functions.html#bool + + (16) https://docs.python.org/3/library/functions.html#bool + + (17) https://docs.python.org/3/library/stdtypes.html#str + + (18) https://docs.python.org/3/library/stdtypes.html#str + + (19) https://docs.python.org/3/library/constants.html#None + + (20) https://docs.python.org/3/library/stdtypes.html#str + + (21) https://docs.python.org/3/library/stdtypes.html#str + + (22) https://docs.python.org/3/library/stdtypes.html#str + + (23) https://docs.python.org/3/library/stdtypes.html#str + + (24) https://docs.python.org/3/library/functions.html#bool + + (25) https://docs.python.org/3/library/functions.html#bool + + (26) https://docs.python.org/3/library/stdtypes.html#str + + (27) https://docs.python.org/3/library/constants.html#None + + (28) https://docs.python.org/3/library/functions.html#bool + + (29) https://docs.python.org/3/library/functions.html#bool + + (30) https://docs.python.org/3/library/stdtypes.html#str + + (31) https://docs.python.org/3/library/stdtypes.html#bytes + + (32) https://docs.python.org/3/library/stdtypes.html#str + + (33) https://docs.python.org/3/library/constants.html#None + + (34) https://docs.python.org/3/library/stdtypes.html#str + + (35) https://docs.python.org/3/library/stdtypes.html#str + + (36) https://docs.python.org/3/library/stdtypes.html#str + + (37) https://docs.python.org/3/library/stdtypes.html#str + + (38) https://docs.python.org/3/library/stdtypes.html#str + + (39) https://docs.python.org/3/library/stdtypes.html#str + + (40) https://docs.python.org/3/library/stdtypes.html#bytes + + (41) https://docs.python.org/3/library/stdtypes.html#str + + (42) https://docs.python.org/3/library/functions.html#int + + (43) https://docs.python.org/3/library/stdtypes.html#str + + (44) https://docs.python.org/3/library/functions.html#bool + + (45) https://docs.python.org/3/library/functions.html#bool + + (46) https://docs.python.org/3/library/functions.html#bool + + (47) https://docs.python.org/3/library/stdtypes.html#str + + (48) https://docs.python.org/3/library/stdtypes.html#str + + (49) https://docs.python.org/3/library/stdtypes.html#bytes + + (50) https://docs.python.org/3/library/stdtypes.html#str + + (51) https://docs.python.org/3/library/stdtypes.html#bytes + + (52) https://docs.python.org/3/library/stdtypes.html#str + + (53) https://docs.python.org/3/library/stdtypes.html#str + + (54) https://docs.python.org/3/library/stdtypes.html#str + + (55) https://docs.python.org/3/library/stdtypes.html#str + + (56) https://docs.python.org/3/library/stdtypes.html#str + + (57) https://docs.python.org/3/library/stdtypes.html#str + + (58) https://docs.python.org/3/library/stdtypes.html#str + + (59) https://docs.python.org/3/library/stdtypes.html#str + + (60) https://docs.python.org/3/library/constants.html#None + + (61) https://docs.python.org/3/library/stdtypes.html#str + + (62) https://docs.python.org/3/library/stdtypes.html#str + + (63) https://docs.python.org/3/library/stdtypes.html#str + + (64) https://docs.python.org/3/library/stdtypes.html#str + + (65) https://docs.python.org/3/library/stdtypes.html#str + + (66) https://docs.python.org/3/library/functions.html#int + + (67) https://docs.python.org/3/library/stdtypes.html#bytes + + (68) https://docs.python.org/3/library/stdtypes.html#str + + (69) https://docs.python.org/3/library/stdtypes.html#str + + (70) https://docs.python.org/3/library/functions.html#int + + (71) https://docs.python.org/3/library/constants.html#None + + (72) https://docs.python.org/3/library/functions.html#bool + + (73) https://docs.python.org/3/library/stdtypes.html#bytes + + (74) https://docs.python.org/3/library/stdtypes.html#str +  -File: werkzeug.info, Node: Debugging Applications, Prev: Test Utilities, Up: Serving and Testing +File: werkzeug.info, Node: Debugging Applications, Prev: Testing WSGI Applications, Up: Serving and Testing 2.3 Debugging Applications ========================== @@ -2551,7 +2954,7 @@ File: werkzeug.info, Node: Enabling the Debugger, Next: Using the Debugger, U --------------------------- Enable the debugger by wrapping the application with the *note -DebuggedApplication: 90. middleware. Alternatively, you can pass +DebuggedApplication: 8e. middleware. Alternatively, you can pass ‘use_debugger=True’ to ‘run_simple()’ and it will do that for you. -- Class: werkzeug.debug.DebuggedApplication (app, evalex=False, @@ -2571,29 +2974,54 @@ DebuggedApplication: 90. middleware. Alternatively, you can pass Parameters: - * ‘app’ – the WSGI application to run debugged. + * ‘app’ (‘WSGIApplication’) – the WSGI application to run + debugged. - * ‘evalex’ – enable exception evaluation feature (interactive - debugging). This requires a non-forking server. + * ‘evalex’ (bool(1)) – enable exception evaluation feature + (interactive debugging). This requires a non-forking server. - * ‘request_key’ – The key that points to the request object in - ths environment. This parameter is ignored in current - versions. + * ‘request_key’ (str(2)) – The key that points to the request + object in ths environment. This parameter is ignored in + current versions. - * ‘console_path’ – the URL for a general purpose console. + * ‘console_path’ (str(3)) – the URL for a general purpose + console. - * ‘console_init_func’ – the function that is executed before - starting the general purpose console. The return value is - used as initial namespace. + * ‘console_init_func’ (‘Optional’‘[’‘Callable’‘[’‘[’‘]’‘, + ’‘Dict’‘[’str(4)‘, ’‘Any’‘]’‘]’‘]’) – the function that is + executed before starting the general purpose console. The + return value is used as initial namespace. - * ‘show_hidden_frames’ – by default hidden traceback frames are - skipped. You can show them by setting this parameter to - ‘True’. + * ‘show_hidden_frames’ (bool(5)) – by default hidden traceback + frames are skipped. You can show them by setting this + parameter to ‘True’. - * ‘pin_security’ – can be used to disable the pin based security + * ‘pin_security’ (bool(6)) – can be used to disable the pin + based security system. + + * ‘pin_logging’ (bool(7)) – enables the logging of the pin system. - * ‘pin_logging’ – enables the logging of the pin system. + + Return type: None(8) + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3/library/functions.html#bool + + (2) https://docs.python.org/3/library/stdtypes.html#str + + (3) https://docs.python.org/3/library/stdtypes.html#str + + (4) https://docs.python.org/3/library/stdtypes.html#str + + (5) https://docs.python.org/3/library/functions.html#bool + + (6) https://docs.python.org/3/library/functions.html#bool + + (7) https://docs.python.org/3/library/functions.html#bool + + (8) https://docs.python.org/3/library/constants.html#None  File: werkzeug.info, Node: Using the Debugger, Next: Debugger PIN, Prev: Enabling the Debugger, Up: Debugging Applications @@ -2615,7 +3043,7 @@ frame in the traceback by hovering over a frame and clicking the console icon that appears at the right. Once clicked a console opens where you can execute Python code in: -[image src="debug-screenshot.png" alt="a screenshot of the interactive debugger"] +[image src="werkzeug-figures/debug-screenshot.png" alt="a screenshot of the interactive debugger"] Inside the interactive consoles you can execute any kind of Python code. Unlike regular Python consoles the output of the object reprs is colored @@ -2660,12 +3088,9 @@ File: werkzeug.info, Node: Pasting Errors, Prev: Debugger PIN, Up: Debugging -------------------- If you click on the “Traceback (most recent call last)” header, the view -switches to a tradition text-based traceback. The text can be copied, -or automatically pasted to gist.github.com(1) with one click. - - ---------- Footnotes ---------- - - (1) https://gist.github.com +switches to a traditional text-based traceback. You can copy and paste +this in order to provide information when asking a question or reporting +an issue.  File: werkzeug.info, Node: Reference, Next: Deployment, Prev: Serving and Testing, Up: Top @@ -2678,7 +3103,6 @@ File: werkzeug.info, Node: Reference, Next: Deployment, Prev: Serving and Tes * Request / Response Objects:: * URL Routing:: * WSGI Helpers:: -* Filesystem Utilities:: * HTTP Utilities:: * Data Structures:: * Utilities:: @@ -2701,9 +3125,7 @@ value from a WSGI application so that it is another WSGI application * How they Work:: * Mutability and Reusability of Wrappers:: -* Base Wrappers:: -* Mixin Classes:: -* Extra Mixin Classes:: +* Wrapper Classes::  File: werkzeug.info, Node: How they Work, Next: Mutability and Reusability of Wrappers, Up: Request / Response Objects @@ -2713,11 +3135,11 @@ File: werkzeug.info, Node: How they Work, Next: Mutability and Reusability of Your WSGI application is always passed two arguments. The WSGI “environment” and the WSGI ‘start_response’ function that is used to -start the response phase. The *note Request: 99. class wraps the +start the response phase. The *note Request: 71. class wraps the ‘environ’ for easier access to request variables (form data, request headers etc.). -The *note Response: 9a. on the other hand is a standard WSGI application +The *note Response: 5e. on the other hand is a standard WSGI application that you can create. The simple hello world in Werkzeug looks like this: @@ -2731,23 +3153,23 @@ processing: def application(environ, start_response): request = Request(environ) - response = Response("Hello %s!" % request.args.get('name', 'World!')) + response = Response(f"Hello {request.args.get('name', 'World!')}!") return response(environ, start_response) -Because this is a very common task the *note Request: 99. object +Because this is a very common task the *note Request: 71. object provides a helper for that. The above code can be rewritten like this: from werkzeug.wrappers import Request, Response @Request.application def application(request): - return Response("Hello %s!" % request.args.get('name', 'World!')) + return Response(f"Hello {request.args.get('name', 'World!')}!") The ‘application’ is still a valid WSGI application that accepts the environment and ‘start_response’ callable.  -File: werkzeug.info, Node: Mutability and Reusability of Wrappers, Next: Base Wrappers, Prev: How they Work, Up: Request / Response Objects +File: werkzeug.info, Node: Mutability and Reusability of Wrappers, Next: Wrapper Classes, Prev: How they Work, Up: Request / Response Objects 3.1.2 Mutability and Reusability of Wrappers -------------------------------------------- @@ -2782,71 +3204,54 @@ For the response object the following rules apply: 4. It’s possible to create copies using ‘copy.deepcopy’.  -File: werkzeug.info, Node: Base Wrappers, Next: Mixin Classes, Prev: Mutability and Reusability of Wrappers, Up: Request / Response Objects +File: werkzeug.info, Node: Wrapper Classes, Prev: Mutability and Reusability of Wrappers, Up: Request / Response Objects -3.1.3 Base Wrappers -------------------- +3.1.3 Wrapper Classes +--------------------- -These objects implement a common set of operations. They are missing -fancy addon functionality like user agent parsing or etag handling. -These features are available by mixing in various mixin classes or using -*note Request: 99. and *note Response: 9a. + -- Class: werkzeug.wrappers.Request (environ, populate_request=True, + shallow=False) - -- Class: werkzeug.wrappers.BaseRequest (environ, - populate_request=True, shallow=False) + Represents an incoming WSGI HTTP request, with headers and body + taken from the WSGI environment. Has properties and methods for + using the functionality defined by various HTTP specs. The data in + requests object is read-only. - Very basic request object. This does not implement advanced stuff - like entity tag parsing or cache controls. The request object is - created with the WSGI environment as first argument and will add - itself to the WSGI environment as ‘'werkzeug.request'’ unless it’s - created with ‘populate_request’ set to False. + Text data is assumed to use UTF-8 encoding, which should be true + for the vast majority of modern clients. Using an encoding set by + the client is unsafe in Python due to extra encodings it provides, + such as ‘zip’. To change the assumed encoding, subclass and + replace ‘charset’. - There are a couple of mixins available that add additional - functionality to the request object, there is also a class called - ‘Request’ which subclasses ‘BaseRequest’ and all the important - mixins. - It’s a good idea to create a custom subclass of the *note - BaseRequest: 9d. and add missing functionality either via mixins or - direct implementation. Here an example for such subclasses: + Parameters: - from werkzeug.wrappers import BaseRequest, ETagRequestMixin + * ‘environ’ (‘WSGIEnvironment’) – The WSGI environ is generated + by the WSGI server and contains information about the server + configuration and client request. - class Request(BaseRequest, ETagRequestMixin): - pass + * ‘populate_request’ (bool(1)) – Add this request object to the + WSGI environ as ‘environ['werkzeug.request']’. Can be useful + when debugging. - Request objects are `read only'. As of 0.5 modifications are not - allowed in any place. Unlike the lower level parsing functions the - request object will use immutable objects everywhere possible. + * ‘shallow’ (bool(2)) – Makes reading from *note stream: 98. + (and any method that would read from it) raise a + RuntimeError(3). Useful to prevent consuming the form data in + middleware, which would make it unavailable to the final + application. - Per default the request object will assume all the text data is - ‘utf-8’ encoded. Please refer to *note the unicode chapter: 9e. - for more details about customizing the behavior. - Per default the request object will be added to the WSGI - environment as ‘werkzeug.request’ to support the debugging system. - If you don’t want that, set ‘populate_request’ to ‘False’. + Return type: None(4) - If ‘shallow’ is ‘True’ the environment is initialized as shallow - object around the environ. Every operation that would modify the - environ in any way (such as consuming form data) raises an - exception unless the ‘shallow’ attribute is explicitly set to - ‘False’. This is useful for middlewares where you don’t want to - consume the form data by accident. A shallow request is not - populated to the WSGI environment. + Changed in version 2.1: Remove the ‘disable_data_descriptor’ + attribute. - Changed in version 0.5: read-only mode was enforced by using - immutables classes for all data. + Changed in version 2.0: Combine ‘BaseRequest’ and mixins into a + single ‘Request’ class. Using the old classes is deprecated and + will be removed in Werkzeug 2.1. - -- Attribute: environ - - The WSGI environment that the request object uses for data - retrival. - - -- Attribute: shallow - - ‘True’ if this request object is shallow (does not modify - *note environ: 9f.), ‘False’ otherwise. + Changed in version 0.5: Read-only mode is enforced with immutable + classes for all data. -- Method: _get_file_stream (total_content_length, content_type, filename=None, content_length=None) @@ -2865,25 +3270,68 @@ These features are available by mixing in various mixin classes or using Parameters: - * ‘total_content_length’ – the total content length of all - the data in the request combined. This value is - guaranteed to be there. + * ‘total_content_length’ (‘Optional’‘[’int(5)‘]’) – the + total content length of all the data in the request + combined. This value is guaranteed to be there. - * ‘content_type’ – the mimetype of the uploaded file. + * ‘content_type’ (‘Optional’‘[’str(6)‘]’) – the mimetype of + the uploaded file. - * ‘filename’ – the filename of the uploaded file. May be - ‘None’. + * ‘filename’ (‘Optional’‘[’str(7)‘]’) – the filename of the + uploaded file. May be ‘None’. - * ‘content_length’ – the length of this file. This value - is usually not provided because webbrowsers do not - provide this value. + * ‘content_length’ (‘Optional’‘[’int(8)‘]’) – the length of + this file. This value is usually not provided because + webbrowsers do not provide this value. - -- Attribute: access_route + + Return type: IO[bytes(9)] + + -- Property: accept_charsets: *note + werkzeug.datastructures.CharsetAccept: 9b. + + List of charsets this client supports as *note CharsetAccept: + 9b. object. + + -- Property: accept_encodings: *note + werkzeug.datastructures.Accept: 9d. + + List of encodings this client accepts. Encodings in a HTTP + term are compression encodings such as gzip. For charsets + have a look at ‘accept_charset’. + + -- Property: accept_languages: *note + werkzeug.datastructures.LanguageAccept: 9f. + + List of languages this client accepts as *note LanguageAccept: + 9f. object. + + -- Property: accept_mimetypes: *note + werkzeug.datastructures.MIMEAccept: a1. + + List of mimetypes this client supports as *note MIMEAccept: + a1. object. + + -- Attribute: access_control_request_headers + + Sent with a preflight request to indicate which headers will + be sent with the cross origin request. Set + ‘access_control_allow_headers’ on the response to indicate + which headers are allowed. + + -- Attribute: access_control_request_method + + Sent with a preflight request to indicate which method will be + used for the cross origin request. Set + ‘access_control_allow_methods’ on the response to indicate + which methods are allowed. + + -- Property: access_route: List[str(10)] If a forwarded header exists this is a list of all ip addresses from the client ip to the last proxy server. - -- Class Method: application (f) + -- Method: classmethod application (f) Decorate a function as responder that accepts the request as the last argument. This works like the ‘responder()’ @@ -2899,29 +3347,39 @@ These features are available by mixing in various mixin classes or using and converted to responses instead of failing. - Parameters: ‘f’ – the WSGI callable to decorate + Parameters: ‘f’ (‘Callable’‘[’‘[’*note Request: 71.‘]’‘, + ’‘WSGIApplication’‘]’) – the WSGI callable to decorate Returns: a new WSGI callable - -- Attribute: args + + Return type: WSGIApplication + + -- Property: args: MultiDict[str(11), str(12)] The parsed URL parameters (the part in the URL after the question mark). - By default an *note ImmutableMultiDict: a5. is returned from + By default an *note ImmutableMultiDict: a7. is returned from this function. This can be changed by setting *note - parameter_storage_class: a6. to a different type. This might + parameter_storage_class: a8. to a different type. This might be necessary if the order of the form data is important. - -- Attribute: base_url + -- Property: authorization: Optional[*note + werkzeug.datastructures.Authorization: 7a.] - Like *note url: a8. but without the querystring See also: - *note trusted_hosts: a9. + The ‘Authorization’ object in parsed form. - -- Attribute: charset = 'utf-8' + -- Property: base_url: str(13) - the charset for the request, defaults to utf-8 + Like *note url: ab. but without the query string. + + -- Property: cache_control: *note + werkzeug.datastructures.RequestCacheControl: ad. + + A *note RequestCacheControl: ad. object for the incoming cache + control headers. -- Method: close () @@ -2932,843 +3390,8 @@ These features are available by mixing in various mixin classes or using New in version 0.9. - -- Attribute: cookies - A dict(1) with the contents of all cookies transmitted with - the request. - - -- Attribute: data - - Contains the incoming request data as string in case it came - with a mimetype Werkzeug does not handle. - - -- Attribute: dict_storage_class - - alias of *note werkzeug.datastructures.ImmutableMultiDict: a5. - - -- Attribute: disable_data_descriptor = False - - Indicates whether the data descriptor should be allowed to - read and buffer up the input stream. By default it’s enabled. - - New in version 0.9. - - -- Attribute: encoding_errors = 'replace' - - the error handling procedure for errors, defaults to ‘replace’ - - -- Attribute: files - - *note MultiDict: b2. object containing all uploaded files. - Each key in *note files: b1. is the name from the ‘’. Each value in *note files: b1. is a - Werkzeug *note FileStorage: b3. object. - - It basically behaves like a standard file object you know from - Python, with the difference that it also has a *note save(): - b4. function that can store the file on the filesystem. - - Note that *note files: b1. will only contain data if the - request method was POST, PUT or PATCH and the ‘’ that - posted to the request had ‘enctype="multipart/form-data"’. It - will be empty otherwise. - - See the *note MultiDict: b2. / *note FileStorage: b3. - documentation for more details about the used data structure. - - -- Attribute: form - - The form parameters. By default an *note ImmutableMultiDict: - a5. is returned from this function. This can be changed by - setting *note parameter_storage_class: a6. to a different - type. This might be necessary if the order of the form data - is important. - - Please keep in mind that file uploads will not end up here, - but instead in the *note files: b1. attribute. - - Changed in version 0.9: Previous to Werkzeug 0.9 this would - only contain form data for POST and PUT requests. - - -- Attribute: form_data_parser_class - - alias of *note werkzeug.formparser.FormDataParser: b7. - - -- Class Method: from_values (*args, **kwargs) - - Create a new request object based on the values provided. If - environ is given missing values are filled from there. This - method is useful for small scripts when you need to simulate a - request from an URL. Do not use this method for unittesting, - there is a full featured client object (‘Client’) that allows - to create multipart requests, support for cookies etc. - - This accepts the same options as the *note EnvironBuilder: 63. - - Changed in version 0.5: This method now accepts the same - arguments as *note EnvironBuilder: 63. Because of this the - ‘environ’ parameter is now called ‘environ_overrides’. - - - Returns: request object - - -- Attribute: full_path - - Requested path as unicode, including the query string. - - -- Method: get_data (cache=True, as_text=False, - parse_form_data=False) - - This reads the buffered incoming data from the client into one - bytestring. By default this is cached but that behavior can - be changed by setting ‘cache’ to ‘False’. - - Usually it’s a bad idea to call this method without checking - the content length first as a client could send dozens of - megabytes or more to cause memory problems on the server. - - Note that if the form data was already parsed this method will - not return anything as form data parsing does not cache the - data like this method does. To implicitly invoke form data - parsing function set ‘parse_form_data’ to ‘True’. When this - is done the return value of this method will be an empty - string if the form parser handles the data. This generally is - not necessary as if the whole data is cached (which is the - default) the form parser will used the cached data to parse - the form data. Please be generally aware of checking the - content length first in any case before calling this method to - avoid exhausting server memory. - - If ‘as_text’ is set to ‘True’ the return value will be a - decoded unicode string. - - New in version 0.9. - - -- Attribute: headers - - The headers from the WSGI environ as immutable *note - EnvironHeaders: bc. - - -- Attribute: host - - Just the host including the port if available. See also: - *note trusted_hosts: a9. - - -- Attribute: host_url - - Just the host with scheme as IRI. See also: *note - trusted_hosts: a9. - - -- Attribute: is_multiprocess - - boolean that is ‘True’ if the application is served by a WSGI - server that spawns multiple processes. - - -- Attribute: is_multithread - - boolean that is ‘True’ if the application is served by a - multithreaded WSGI server. - - -- Attribute: is_run_once - - boolean that is ‘True’ if the application will be executed - only once in a process lifetime. This is the case for CGI for - example, but it’s not guaranteed that the execution only - happens one time. - - -- Attribute: is_secure - - ‘True’ if the request is secure. - - -- Attribute: list_storage_class - - alias of *note werkzeug.datastructures.ImmutableList: c4. - - -- Method: make_form_data_parser () - - Creates the form data parser. Instantiates the *note - form_data_parser_class: b6. with some parameters. - - New in version 0.8. - - -- Attribute: max_content_length = None - - the maximum content length. This is forwarded to the form - data parsing function (‘parse_form_data()’). When set and the - *note form: b5. or *note files: b1. attribute is accessed and - the parsing fails because more than the specified value is - transmitted a *note RequestEntityTooLarge: c7. exception is - raised. - - Have a look at *note Dealing with Request Data: c8. for more - details. - - New in version 0.5. - - -- Attribute: max_form_memory_size = None - - the maximum form field size. This is forwarded to the form - data parsing function (‘parse_form_data()’). When set and the - *note form: b5. or *note files: b1. attribute is accessed and - the data in memory for post data is longer than the specified - value a *note RequestEntityTooLarge: c7. exception is raised. - - Have a look at *note Dealing with Request Data: c8. for more - details. - - New in version 0.5. - - -- Attribute: method - - The request method. (For example ‘'GET'’ or ‘'POST'’). - - -- Attribute: parameter_storage_class - - alias of *note werkzeug.datastructures.ImmutableMultiDict: a5. - - -- Attribute: path - - Requested path as unicode. This works a bit like the regular - path info in the WSGI environment but will always include a - leading slash, even if the URL root is accessed. - - -- Attribute: query_string - - The URL parameters as raw bytestring. - - -- Attribute: remote_addr - - The remote address of the client. - - -- Attribute: remote_user - - If the server supports user authentication, and the script is - protected, this attribute contains the username the user has - authenticated as. - - -- Attribute: scheme - - URL scheme (http or https). - - New in version 0.7. - - -- Attribute: script_root - - The root path of the script without the trailing slash. - - -- Attribute: stream - - If the incoming form data was not encoded with a known - mimetype the data is stored unmodified in this stream for - consumption. Most of the time it is a better idea to use - *note data: ad. which will give you that data as a string. - The stream only returns the data once. - - Unlike ‘input_stream’ this stream is properly guarded that you - can’t accidentally read past the length of the input. - Werkzeug will internally always refer to this stream to read - data which makes it possible to wrap this object with a stream - that does filtering. - - Changed in version 0.9: This stream is now always available - but might be consumed by the form parser later on. Previously - the stream was only set if no parsing happened. - - -- Attribute: trusted_hosts = None - - Optionally a list of hosts that is trusted by this request. - By default all hosts are trusted which means that whatever the - client sends the host is will be accepted. - - Because ‘Host’ and ‘X-Forwarded-Host’ headers can be set to - any value by a malicious client, it is recommended to either - set this property or implement similar validation in the proxy - (if application is being run behind one). - - New in version 0.9. - - -- Attribute: url - - The reconstructed current URL as IRI. See also: *note - trusted_hosts: a9. - - -- Attribute: url_charset - - The charset that is assumed for URLs. Defaults to the value - of *note charset: aa. - - New in version 0.6. - - -- Attribute: url_root - - The full URL root (with hostname), this is the application - root as IRI. See also: *note trusted_hosts: a9. - - -- Attribute: values - - A *note werkzeug.datastructures.CombinedMultiDict: d5. that - combines *note args: a4. and *note form: b5. - - -- Attribute: want_form_data_parsed - - Returns True if the request method carries content. As of - Werkzeug 0.9 this will be the case if a content type is - transmitted. - - New in version 0.8. - - -- Class: werkzeug.wrappers.BaseResponse (response=None, status=None, - headers=None, mimetype=None, content_type=None, - direct_passthrough=False) - - Base response class. The most important fact about a response - object is that it’s a regular WSGI application. It’s initialized - with a couple of response parameters (headers, body, status code - etc.) and will start a valid WSGI response when called with the - environ and start response callable. - - Because it’s a WSGI application itself processing usually ends - before the actual response is sent to the server. This helps - debugging systems because they can catch all the exceptions before - responses are started. - - Here a small example WSGI application that takes advantage of the - response objects: - - from werkzeug.wrappers import BaseResponse as Response - - def index(): - return Response('Index page') - - def application(environ, start_response): - path = environ.get('PATH_INFO') or '/' - if path == '/': - response = index() - else: - response = Response('Not Found', status=404) - return response(environ, start_response) - - Like *note BaseRequest: 9d. which object is lacking a lot of - functionality implemented in mixins. This gives you a better - control about the actual API of your response objects, so you can - create subclasses and add custom functionality. A full featured - response object is available as *note Response: 9a. which - implements a couple of useful mixins. - - To enforce a new type of already existing responses you can use the - *note force_type(): d8. method. This is useful if you’re working - with different subclasses of response objects and you want to post - process them with a known interface. - - Per default the response object will assume all the text data is - ‘utf-8’ encoded. Please refer to *note the unicode chapter: 9e. - for more details about customizing the behavior. - - Response can be any kind of iterable or string. If it’s a string - it’s considered being an iterable with one item which is the string - passed. Headers can be a list of tuples or a *note Headers: d9. - object. - - Special note for ‘mimetype’ and ‘content_type’: For most mime types - ‘mimetype’ and ‘content_type’ work the same, the difference affects - only ‘text’ mimetypes. If the mimetype passed with ‘mimetype’ is a - mimetype starting with ‘text/’, the charset parameter of the - response object is appended to it. In contrast the ‘content_type’ - parameter is always added as header unmodified. - - Changed in version 0.5: the ‘direct_passthrough’ parameter was - added. - - - Parameters: - - * ‘response’ – a string or response iterable. - - * ‘status’ – a string with a status or an integer with the - status code. - - * ‘headers’ – a list of headers or a *note Headers: d9. object. - - * ‘mimetype’ – the mimetype for the response. See notice above. - - * ‘content_type’ – the content type for the response. See - notice above. - - * ‘direct_passthrough’ – if set to ‘True’ *note iter_encoded(): - da. is not called before iteration which makes it possible to - pass special iterators through unchanged (see ‘wrap_file()’ - for more details.) - - -- Attribute: response - - The application iterator. If constructed from a string this - will be a list, otherwise the object provided as application - iterator. (The first argument passed to *note BaseResponse: - d7.) - - -- Attribute: headers - - A ‘Headers’ object representing the response headers. - - -- Attribute: status_code - - The response status as integer. - - -- Attribute: direct_passthrough - - If ‘direct_passthrough=True’ was passed to the response object - or if this attribute was set to ‘True’ before using the - response object as WSGI application, the wrapped iterator is - returned unchanged. This makes it possible to pass a special - ‘wsgi.file_wrapper’ to the response object. See ‘wrap_file()’ - for more details. - - -- Method: __call__ (environ, start_response) - - Process this response as WSGI application. - - - Parameters: - - * ‘environ’ – the WSGI environment. - - * ‘start_response’ – the response callable provided by the - WSGI server. - - - Returns: an application iterator - - -- Method: _ensure_sequence (mutable=False) - - This method can be called by methods that need a sequence. If - ‘mutable’ is true, it will also ensure that the response - sequence is a standard Python list. - - New in version 0.6. - - -- Attribute: autocorrect_location_header = True - - Should this response object correct the location header to be - RFC conformant? This is true by default. - - New in version 0.8. - - -- Attribute: automatically_set_content_length = True - - Should this response object automatically set the - content-length header if possible? This is true by default. - - New in version 0.8. - - -- Method: calculate_content_length () - - Returns the content length if available or ‘None’ otherwise. - - -- Method: call_on_close (func) - - Adds a function to the internal list of functions that should - be called as part of closing down the response. Since 0.7 - this function also returns the function that was passed so - that this can be used as a decorator. - - New in version 0.6. - - -- Attribute: charset = 'utf-8' - - the charset of the response. - - -- Method: close () - - Close the wrapped response if possible. You can also use the - object in a with statement which will automatically close it. - - New in version 0.9: Can now be used in a with statement. - - -- Attribute: data - - A descriptor that calls *note get_data(): e8. and *note - set_data(): e9. - - -- Attribute: default_mimetype = 'text/plain' - - the default mimetype if none is provided. - - -- Attribute: default_status = 200 - - the default status if none is provided. - - -- Method: delete_cookie (key, path='/', domain=None) - - Delete a cookie. Fails silently if key doesn’t exist. - - - Parameters: - - * ‘key’ – the key (name) of the cookie to be deleted. - - * ‘path’ – if the cookie that should be deleted was limited - to a path, the path has to be defined here. - - * ‘domain’ – if the cookie that should be deleted was - limited to a domain, that domain has to be defined here. - - -- Class Method: force_type (response, environ=None) - - Enforce that the WSGI response is a response object of the - current type. Werkzeug will use the *note BaseResponse: d7. - internally in many situations like the exceptions. If you - call ‘get_response()’ on an exception you will get back a - regular *note BaseResponse: d7. object, even if you are using - a custom subclass. - - This method can enforce a given response type, and it will - also convert arbitrary WSGI callables into response objects if - an environ is provided: - - # convert a Werkzeug response object into an instance of the - # MyResponseClass subclass. - response = MyResponseClass.force_type(response) - - # convert any WSGI application into a response object - response = MyResponseClass.force_type(response, environ) - - This is especially useful if you want to post-process - responses in the main dispatcher and use functionality - provided by your subclass. - - Keep in mind that this will modify response objects in place - if possible! - - - Parameters: - - * ‘response’ – a response object or wsgi application. - - * ‘environ’ – a WSGI environment object. - - - Returns: a response object. - - -- Method: freeze () - - Call this method if you want to make your response object - ready for being pickled. This buffers the generator if there - is one. It will also set the ‘Content-Length’ header to the - length of the body. - - Changed in version 0.6: The ‘Content-Length’ header is now - set. - - -- Class Method: from_app (app, environ, buffered=False) - - Create a new response object from an application output. This - works best if you pass it an application that returns a - generator all the time. Sometimes applications may use the - ‘write()’ callable returned by the ‘start_response’ function. - This tries to resolve such edge cases automatically. But if - you don’t get the expected output you should set ‘buffered’ to - ‘True’ which enforces buffering. - - - Parameters: - - * ‘app’ – the WSGI application to execute. - - * ‘environ’ – the WSGI environment to execute against. - - * ‘buffered’ – set to ‘True’ to enforce buffering. - - - Returns: a response object. - - -- Method: get_app_iter (environ) - - Returns the application iterator for the given environ. - Depending on the request method and the current status code - the return value might be an empty response rather than the - one from the response. - - If the request method is ‘HEAD’ or the status code is in a - range where the HTTP specification requires an empty response, - an empty iterable is returned. - - New in version 0.6. - - - Parameters: ‘environ’ – the WSGI environment of the request. - - - Returns: a response iterable. - - -- Method: get_data (as_text=False) - - The string representation of the request body. Whenever you - call this property the request iterable is encoded and - flattened. This can lead to unwanted behavior if you stream - big data. - - This behavior can be disabled by setting *note - implicit_sequence_conversion: f0. to ‘False’. - - If ‘as_text’ is set to ‘True’ the return value will be a - decoded unicode string. - - New in version 0.9. - - -- Method: get_wsgi_headers (environ) - - This is automatically called right before the response is - started and returns headers modified for the given - environment. It returns a copy of the headers from the - response with some modifications applied if necessary. - - For example the location header (if present) is joined with - the root URL of the environment. Also the content length is - automatically set to zero here for certain status codes. - - Changed in version 0.6: Previously that function was called - ‘fix_headers’ and modified the response object in place. Also - since 0.6, IRIs in location and content-location headers are - handled properly. - - Also starting with 0.6, Werkzeug will attempt to set the - content length if it is able to figure it out on its own. - This is the case if all the strings in the response iterable - are already encoded and the iterable is buffered. - - - Parameters: ‘environ’ – the WSGI environment of the request. - - - Returns: returns a new *note Headers: d9. object. - - -- Method: get_wsgi_response (environ) - - Returns the final WSGI response as tuple. The first item in - the tuple is the application iterator, the second the status - and the third the list of headers. The response returned is - created specially for the given environment. For example if - the request method in the WSGI environment is ‘'HEAD'’ the - response will be empty and only the headers and status code - will be present. - - New in version 0.6. - - - Parameters: ‘environ’ – the WSGI environment of the request. - - - Returns: an ‘(app_iter, status, headers)’ tuple. - - -- Attribute: implicit_sequence_conversion = True - - if set to ‘False’ accessing properties on the response object - will not try to consume the response iterator and convert it - into a list. - - New in version 0.6.2: That attribute was previously called - ‘implicit_seqence_conversion’. (Notice the typo). If you did - use this feature, you have to adapt your code to the name - change. - - -- Attribute: is_sequence - - If the iterator is buffered, this property will be ‘True’. A - response object will consider an iterator to be buffered if - the response attribute is a list or tuple. - - New in version 0.6. - - -- Attribute: is_streamed - - If the response is streamed (the response is not an iterable - with a length information) this property is ‘True’. In this - case streamed means that there is no information about the - number of iterations. This is usually ‘True’ if a generator - is passed to the response object. - - This is useful for checking before applying some sort of post - filtering that should not take place for streamed responses. - - -- Method: iter_encoded () - - Iter the response encoded with the encoding of the response. - If the response object is invoked as WSGI application the - return value of this method is used as application iterator - unless *note direct_passthrough: de. was activated. - - -- Method: make_sequence () - - Converts the response iterator in a list. By default this - happens automatically if required. If - ‘implicit_sequence_conversion’ is disabled, this method is not - automatically called and some properties might raise - exceptions. This also encodes all the items. - - New in version 0.6. - - -- Attribute: max_cookie_size = 4093 - - Warn if a cookie header exceeds this size. The default, 4093, - should be safely supported by most browsers(2). A cookie - larger than this size will still be sent, but it may be - ignored or handled incorrectly by some browsers. Set to 0 to - disable this check. - - New in version 0.13. - - -- Method: set_cookie (key, value='', max_age=None, expires=None, - path='/', domain=None, secure=False, httponly=False, - samesite=None) - - Sets a cookie. The parameters are the same as in the cookie - ‘Morsel’ object in the Python standard library but it accepts - unicode data, too. - - A warning is raised if the size of the cookie header exceeds - *note max_cookie_size: f6, but the header will still be set. - - - Parameters: - - * ‘key’ – the key (name) of the cookie to be set. - - * ‘value’ – the value of the cookie. - - * ‘max_age’ – should be a number of seconds, or ‘None’ - (default) if the cookie should last only as long as the - client’s browser session. - - * ‘expires’ – should be a ‘datetime’ object or UNIX - timestamp. - - * ‘path’ – limits the cookie to a given path, per default - it will span the whole domain. - - * ‘domain’ – if you want to set a cross-domain cookie. For - example, ‘domain=".example.com"’ will set a cookie that - is readable by the domain ‘www.example.com’, - ‘foo.example.com’ etc. Otherwise, a cookie will only be - readable by the domain that set it. - - * ‘secure’ – If ‘True’, the cookie will only be available - via HTTPS - - * ‘httponly’ – disallow JavaScript to access the cookie. - This is an extension to the cookie standard and probably - not supported by all browsers. - - * ‘samesite’ – Limits the scope of the cookie such that it - will only be attached to requests if those requests are - “same-site”. - - -- Method: set_data (value) - - Sets a new string as response. The value set must be either a - unicode or bytestring. If a unicode string is set it’s - encoded automatically to the charset of the response (utf-8 by - default). - - New in version 0.9. - - -- Attribute: status - - The HTTP status code as a string. - - -- Attribute: status_code - - The HTTP status code as a number. - - ---------- Footnotes ---------- - - (1) https://docs.python.org/3/library/stdtypes.html#dict - - (2) http://browsercookielimits.squawky.net/ - - -File: werkzeug.info, Node: Mixin Classes, Next: Extra Mixin Classes, Prev: Base Wrappers, Up: Request / Response Objects - -3.1.4 Mixin Classes -------------------- - -Werkzeug also provides helper mixins for various HTTP related -functionality such as etags, cache control, user agents etc. When -subclassing you can mix those classes in to extend the functionality of -the *note BaseRequest: 9d. or *note BaseResponse: d7. object. Here a -small example for a request object that parses accept headers: - - from werkzeug.wrappers import AcceptMixin, BaseRequest - - class Request(BaseRequest, AcceptMixin): - pass - -The *note Request: 99. and *note Response: 9a. classes subclass the -*note BaseRequest: 9d. and *note BaseResponse: d7. classes and implement -all the mixins Werkzeug provides: - - -- Class: werkzeug.wrappers.Request (environ, populate_request=True, - shallow=False) - - Full featured request object implementing the following mixins: - - - *note AcceptMixin: fa. for accept header parsing - - - *note ETagRequestMixin: fb. for etag and cache control - handling - - - *note UserAgentMixin: fc. for user agent introspection - - - *note AuthorizationMixin: fd. for http auth handling - - - *note CORSRequestMixin: fe. for Cross Origin Resource Sharing - headers - - - *note CommonRequestDescriptorsMixin: ff. for common headers - - -- Class: werkzeug.wrappers.Response (response=None, status=None, - headers=None, mimetype=None, content_type=None, - direct_passthrough=False) - - Full featured response object implementing the following mixins: - - - *note ETagResponseMixin: 100. for etag and cache control - handling - - - *note WWWAuthenticateMixin: 101. for HTTP authentication - support - - - *note CORSResponseMixin: 102. for Cross Origin Resource - Sharing headers - - - *note ResponseStreamMixin: 103. to add support for the - ‘stream’ property - - - *note CommonResponseDescriptorsMixin: 104. for various HTTP - descriptors - -* Menu: - -* Common Descriptors:: -* Response Stream:: -* Accept:: -* Authentication:: -* CORS:: -* ETag:: -* User Agent:: - - -File: werkzeug.info, Node: Common Descriptors, Next: Response Stream, Up: Mixin Classes - -3.1.4.1 Common Descriptors -.......................... - - -- Class: werkzeug.wrappers.CommonRequestDescriptorsMixin - - A mixin for *note BaseRequest: 9d. subclasses. Request objects - that mix this class in will automatically get descriptors for a - couple of HTTP headers with automatic type conversion. - - New in version 0.5. + Return type: None(14) -- Attribute: content_encoding @@ -3781,7 +3404,7 @@ File: werkzeug.info, Node: Common Descriptors, Next: Response Stream, Up: Mix New in version 0.9. - -- Attribute: content_length + -- Property: content_length: Optional[int(15)] The Content-Length entity-header field indicates the size of the entity-body in bytes or, in the case of the HEAD method, @@ -3806,12 +3429,305 @@ File: werkzeug.info, Node: Common Descriptors, Next: Response Stream, Up: Mix the HEAD method, the media type that would have been sent had the request been a GET. + -- Property: cookies: ImmutableMultiDict[str(16), str(17)] + + A dict(18) with the contents of all cookies transmitted with + the request. + + -- Property: data: bytes(19) + + Contains the incoming request data as string in case it came + with a mimetype Werkzeug does not handle. + -- Attribute: date The Date general-header field represents the date and time at which the message was originated, having the same semantics as orig-date in RFC 822. + Changed in version 2.0: The datetime object is timezone-aware. + + -- Attribute: dict_storage_class + + alias of *note werkzeug.datastructures.ImmutableMultiDict: a7. + + -- Attribute: environ: WSGIEnvironment + + The WSGI environment containing HTTP headers and information + from the WSGI server. + + -- Property: files: ImmutableMultiDict[str(20), FileStorage] + + *note MultiDict: 82. object containing all uploaded files. + Each key in *note files: b8. is the name from the ‘’. Each value in *note files: b8. is a + Werkzeug *note FileStorage: b9. object. + + It basically behaves like a standard file object you know from + Python, with the difference that it also has a *note save(): + ba. function that can store the file on the filesystem. + + Note that *note files: b8. will only contain data if the + request method was POST, PUT or PATCH and the ‘’ that + posted to the request had ‘enctype="multipart/form-data"’. It + will be empty otherwise. + + See the *note MultiDict: 82. / *note FileStorage: b9. + documentation for more details about the used data structure. + + -- Property: form: ImmutableMultiDict[str(21), str(22)] + + The form parameters. By default an *note ImmutableMultiDict: + a7. is returned from this function. This can be changed by + setting *note parameter_storage_class: a8. to a different + type. This might be necessary if the order of the form data + is important. + + Please keep in mind that file uploads will not end up here, + but instead in the *note files: b8. attribute. + + Changed in version 0.9: Previous to Werkzeug 0.9 this would + only contain form data for POST and PUT requests. + + -- Attribute: form_data_parser_class + + alias of *note werkzeug.formparser.FormDataParser: bd. + + -- Method: classmethod from_values (*args, **kwargs) + + Create a new request object based on the values provided. If + environ is given missing values are filled from there. This + method is useful for small scripts when you need to simulate a + request from an URL. Do not use this method for unittesting, + there is a full featured client object (‘Client’) that allows + to create multipart requests, support for cookies etc. + + This accepts the same options as the *note EnvironBuilder: 61. + + Changed in version 0.5: This method now accepts the same + arguments as *note EnvironBuilder: 61. Because of this the + ‘environ’ parameter is now called ‘environ_overrides’. + + + Returns: request object + + + Parameters: + + * ‘args’ (‘Any’) – + + * ‘kwargs’ (‘Any’) – + + + Return type: *note werkzeug.wrappers.request.Request: 71. + + -- Property: full_path: str(23) + + Requested path, including the query string. + + -- Method: get_data (cache=True, as_text=False, + parse_form_data=False) + + This reads the buffered incoming data from the client into one + bytes object. By default this is cached but that behavior can + be changed by setting ‘cache’ to ‘False’. + + Usually it’s a bad idea to call this method without checking + the content length first as a client could send dozens of + megabytes or more to cause memory problems on the server. + + Note that if the form data was already parsed this method will + not return anything as form data parsing does not cache the + data like this method does. To implicitly invoke form data + parsing function set ‘parse_form_data’ to ‘True’. When this + is done the return value of this method will be an empty + string if the form parser handles the data. This generally is + not necessary as if the whole data is cached (which is the + default) the form parser will used the cached data to parse + the form data. Please be generally aware of checking the + content length first in any case before calling this method to + avoid exhausting server memory. + + If ‘as_text’ is set to ‘True’ the return value will be a + decoded string. + + New in version 0.9. + + + Parameters: + + * ‘cache’ (bool(24)) – + + * ‘as_text’ (bool(25)) – + + * ‘parse_form_data’ (bool(26)) – + + + Return type: Union[bytes(27), str(28)] + + -- Method: get_json (force=False, silent=False, cache=True) + + Parse *note data: b4. as JSON. + + If the mimetype does not indicate JSON (‘application/json’, + see *note is_json: c2.), this returns ‘None’. + + If parsing fails, *note on_json_loading_failed(): c3. is + called and its return value is used as the return value. + + + Parameters: + + * ‘force’ (bool(29)) – Ignore the mimetype and always try + to parse JSON. + + * ‘silent’ (bool(30)) – Silence parsing errors and return + ‘None’ instead. + + * ‘cache’ (bool(31)) – Store the parsed JSON to return for + subsequent calls. + + + Return type: Optional[Any] + + -- Attribute: headers + + The headers received with the request. + + -- Property: host: str(32) + + The host name the request was made to, including the port if + it’s non-standard. Validated with ‘trusted_hosts’. + + -- Property: host_url: str(33) + + The request URL scheme and host only. + + -- Property: if_match: *note werkzeug.datastructures.ETags: c8. + + An object containing all the etags in the ‘If-Match’ header. + + + Return type: *note ETags: c8. + + -- Property: if_modified_since: Optional[datetime.datetime(34)] + + The parsed ‘If-Modified-Since’ header as a datetime object. + + Changed in version 2.0: The datetime object is timezone-aware. + + -- Property: if_none_match: *note werkzeug.datastructures.ETags: + c8. + + An object containing all the etags in the ‘If-None-Match’ + header. + + + Return type: *note ETags: c8. + + -- Property: if_range: *note werkzeug.datastructures.IfRange: cc. + + The parsed ‘If-Range’ header. + + Changed in version 2.0: ‘IfRange.date’ is timezone-aware. + + New in version 0.7. + + -- Property: if_unmodified_since: Optional[datetime.datetime(35)] + + The parsed ‘If-Unmodified-Since’ header as a datetime object. + + Changed in version 2.0: The datetime object is timezone-aware. + + -- Attribute: input_stream + + The WSGI input stream. + + In general it’s a bad idea to use this one because you can + easily read past the boundary. Use the *note stream: 98. + instead. + + -- Property: is_json: bool(36) + + Check if the mimetype indicates JSON data, either + ‘application/json’ or ‘application/*+json’. + + -- Attribute: is_multiprocess + + boolean that is ‘True’ if the application is served by a WSGI + server that spawns multiple processes. + + -- Attribute: is_multithread + + boolean that is ‘True’ if the application is served by a + multithreaded WSGI server. + + -- Attribute: is_run_once + + boolean that is ‘True’ if the application will be executed + only once in a process lifetime. This is the case for CGI for + example, but it’s not guaranteed that the execution only + happens one time. + + -- Property: is_secure: bool(37) + + ‘True’ if the request was made with a secure protocol (HTTPS + or WSS). + + -- Property: json: Optional[Any] + + The parsed JSON data if *note mimetype: d4. indicates JSON + (‘application/json’, see *note is_json: c2.). + + Calls *note get_json(): c1. with default arguments. + + -- Attribute: json_module = + + A module or other object that has ‘dumps’ and ‘loads’ + functions that match the API of the built-in json(38) module. + + -- Attribute: list_storage_class + + alias of *note werkzeug.datastructures.ImmutableList: d7. + + -- Method: make_form_data_parser () + + Creates the form data parser. Instantiates the *note + form_data_parser_class: bc. with some parameters. + + New in version 0.8. + + + Return type: *note werkzeug.formparser.FormDataParser: bd. + + -- Attribute: max_content_length: Optional[int(39)] = None + + the maximum content length. This is forwarded to the form + data parsing function (‘parse_form_data()’). When set and the + *note form: bb. or *note files: b8. attribute is accessed and + the parsing fails because more than the specified value is + transmitted a *note RequestEntityTooLarge: da. exception is + raised. + + Have a look at *note Dealing with Request Data: db. for more + details. + + New in version 0.5. + + -- Attribute: max_form_memory_size: Optional[int(40)] = None + + the maximum form field size. This is forwarded to the form + data parsing function (‘parse_form_data()’). When set and the + *note form: bb. or *note files: b8. attribute is accessed and + the data in memory for post data is longer than the specified + value a *note RequestEntityTooLarge: da. exception is raised. + + Have a look at *note Dealing with Request Data: db. for more + details. + + New in version 0.5. + -- Attribute: max_forwards The Max-Forwards request-header field provides a mechanism @@ -3819,20 +3735,52 @@ File: werkzeug.info, Node: Common Descriptors, Next: Response Stream, Up: Mix proxies or gateways that can forward the request to the next inbound server. - -- Attribute: mimetype + -- Attribute: method - Like *note content_type: 109, but without parameters (eg, + The method the request was made with, such as ‘GET’. + + -- Property: mimetype: str(41) + + Like *note content_type: b2, but without parameters (eg, without charset, type etc.) and always lowercase. For example if the content type is ‘text/HTML; charset=utf-8’ the mimetype would be ‘'text/html'’. - -- Attribute: mimetype_params + -- Property: mimetype_params: Dict[str(42), str(43)] The mimetype parameters as dict. For example if the content type is ‘text/html; charset=utf-8’ the params would be ‘{'charset': 'utf-8'}’. - -- Attribute: pragma + -- Method: on_json_loading_failed (e) + + Called if *note get_json(): c1. parsing fails and isn’t + silenced. If this method returns a value, it is used as the + return value for *note get_json(): c1. The default + implementation raises *note BadRequest: e0. + + + Parameters: ‘e’ (ValueError(44)) – + + + Return type: Any + + -- Attribute: origin + + The host that the request originated from. Set + ‘access_control_allow_origin’ on the response to indicate + which origins are allowed. + + -- Attribute: parameter_storage_class + + alias of *note werkzeug.datastructures.ImmutableMultiDict: a7. + + -- Attribute: path + + The path part of the URL after *note root_path: e3. This is + the path used for routing within the application. + + -- Property: pragma: *note werkzeug.datastructures.HeaderSet: e5. The Pragma general-header field is used to include implementation-specific directives that might apply to any @@ -3841,6 +3789,21 @@ File: werkzeug.info, Node: Common Descriptors, Next: Response Stream, Up: Mix protocol; however, some systems MAY require that behavior be consistent with the directives. + -- Attribute: query_string + + The part of the URL after the “?”. This is the raw value, use + *note args: a6. for the parsed values. + + -- Property: range: Optional[*note werkzeug.datastructures.Range: + e8.] + + The parsed ‘Range’ header. + + New in version 0.7. + + + Return type: *note Range: e8. + -- Attribute: referrer The Referer[sic] request-header field allows the client to @@ -3848,11 +3811,282 @@ File: werkzeug.info, Node: Common Descriptors, Next: Response Stream, Up: Mix resource from which the Request-URI was obtained (the “referrer”, although the header field is misspelled). - -- Class: werkzeug.wrappers.CommonResponseDescriptorsMixin + -- Attribute: remote_addr - A mixin for *note BaseResponse: d7. subclasses. Response objects - that mix this class in will automatically get descriptors for a - couple of HTTP headers with automatic type conversion. + The address of the client sending the request. + + -- Attribute: remote_user + + If the server supports user authentication, and the script is + protected, this attribute contains the username the user has + authenticated as. + + -- Attribute: root_path + + The prefix that the application is mounted under, without a + trailing slash. *note path: e2. comes after this. + + -- Property: root_url: str(45) + + The request URL scheme, host, and root path. This is the root + that the application is accessed from. + + -- Attribute: scheme + + The URL scheme of the protocol the request used, such as + ‘https’ or ‘wss’. + + -- Property: script_root: str(46) + + Alias for ‘self.root_path’. ‘environ["SCRIPT_ROOT"]’ without + a trailing slash. + + -- Attribute: server + + The address of the server. ‘(host, port)’, ‘(path, None)’ for + unix sockets, or ‘None’ if not known. + + -- Attribute: shallow: bool(47) + + Set when creating the request object. If ‘True’, reading from + the request body will cause a ‘RuntimeException’. Useful to + prevent modifying the stream from middleware. + + -- Property: stream: IO[bytes(48)] + + If the incoming form data was not encoded with a known + mimetype the data is stored unmodified in this stream for + consumption. Most of the time it is a better idea to use + *note data: b4. which will give you that data as a string. + The stream only returns the data once. + + Unlike *note input_stream: ce. this stream is properly guarded + that you can’t accidentally read past the length of the input. + Werkzeug will internally always refer to this stream to read + data which makes it possible to wrap this object with a stream + that does filtering. + + Changed in version 0.9: This stream is now always available + but might be consumed by the form parser later on. Previously + the stream was only set if no parsing happened. + + -- Property: url: str(49) + + The full request URL with the scheme, host, root path, path, + and query string. + + -- Property: url_charset: str(50) + + The charset that is assumed for URLs. Defaults to the value + of ‘charset’. + + New in version 0.6. + + -- Property: url_root: str(51) + + Alias for *note root_url: ec. The URL with scheme, host, and + root path. For example, ‘https://example.com/app/’. + + -- Property: user_agent: *note werkzeug.user_agent.UserAgent: f4. + + The user agent. Use ‘user_agent.string’ to get the header + value. Set *note user_agent_class: f5. to a subclass of *note + UserAgent: f4. to provide parsing for the other properties or + other extended data. + + Changed in version 2.0: The built in parser is deprecated and + will be removed in Werkzeug 2.1. A ‘UserAgent’ subclass must + be set to parse data from the string. + + -- Attribute: user_agent_class + + alias of *note werkzeug.user_agent.UserAgent: f4. + + -- Property: values: CombinedMultiDict[str(52), str(53)] + + A *note werkzeug.datastructures.CombinedMultiDict: f7. that + combines *note args: a6. and *note form: bb. + + For GET requests, only ‘args’ are present, not ‘form’. + + Changed in version 2.0: For GET requests, only ‘args’ are + present, not ‘form’. + + -- Property: want_form_data_parsed: bool(54) + + ‘True’ if the request method carries content. By default this + is true if a ‘Content-Type’ is sent. + + New in version 0.8. + + -- Class: werkzeug.wrappers.Response (response=None, status=None, + headers=None, mimetype=None, content_type=None, + direct_passthrough=False) + + Represents an outgoing WSGI HTTP response with body, status, and + headers. Has properties and methods for using the functionality + defined by various HTTP specs. + + The response body is flexible to support different use cases. The + simple form is passing bytes, or a string which will be encoded as + UTF-8. Passing an iterable of bytes or strings makes this a + streaming response. A generator is particularly useful for + building a CSV file in memory or using SSE (Server Sent Events). A + file-like object is also iterable, although the *note send_file(): + f9. helper should be used in that case. + + The response object is itself a WSGI application callable. When + called (*note __call__(): fa.) with ‘environ’ and ‘start_response’, + it will pass its status and headers to ‘start_response’ then return + its body as an iterable. + + from werkzeug.wrappers.response import Response + + def index(): + return Response("Hello, World!") + + def application(environ, start_response): + path = environ.get("PATH_INFO") or "/" + + if path == "/": + response = index() + else: + response = Response("Not Found", status=404) + + return response(environ, start_response) + + + Parameters: + + * ‘response’ (‘Union’‘[’‘Iterable’‘[’str(55)‘]’‘, + ’‘Iterable’‘[’bytes(56)‘]’‘]’) – The data for the body of the + response. A string or bytes, or tuple or list of strings or + bytes, for a fixed-length response, or any other iterable of + strings or bytes for a streaming response. Defaults to an + empty body. + + * ‘status’ (‘Optional’‘[’‘Union’‘[’int(57)‘, ’str(58)‘, + ’http.HTTPStatus(59)‘]’‘]’) – The status code for the + response. Either an int, in which case the default status + message is added, or a string in the form ‘{code} {message}’, + like ‘404 Not Found’. Defaults to 200. + + * ‘headers’ (*note werkzeug.datastructures.Headers: 70.) – A + *note Headers: 70. object, or a list of ‘(key, value)’ tuples + that will be converted to a ‘Headers’ object. + + * ‘mimetype’ (‘Optional’‘[’str(60)‘]’) – The mime type (content + type without charset or other parameters) of the response. If + the value starts with ‘text/’ (or matches some other special + cases), the charset will be added to create the + ‘content_type’. + + * ‘content_type’ (‘Optional’‘[’str(61)‘]’) – The full content + type of the response. Overrides building the value from + ‘mimetype’. + + * ‘direct_passthrough’ (bool(62)) – Pass the response body + directly through as the WSGI iterable. This can be used when + the body is a binary file or other iterator of bytes, to skip + some unnecessary checks. Use *note send_file(): f9. instead + of setting this manually. + + + Return type: None(63) + + Changed in version 2.0: Combine ‘BaseResponse’ and mixins into a + single ‘Response’ class. Using the old classes is deprecated and + will be removed in Werkzeug 2.1. + + Changed in version 0.5: The ‘direct_passthrough’ parameter was + added. + + -- Method: __call__ (environ, start_response) + + Process this response as WSGI application. + + + Parameters: + + * ‘environ’ (‘WSGIEnvironment’) – the WSGI environment. + + * ‘start_response’ (‘StartResponse’) – the response + callable provided by the WSGI server. + + + Returns: an application iterator + + + Return type: Iterable[bytes(64)] + + -- Method: _ensure_sequence (mutable=False) + + This method can be called by methods that need a sequence. If + ‘mutable’ is true, it will also ensure that the response + sequence is a standard Python list. + + New in version 0.6. + + + Parameters: ‘mutable’ (bool(65)) – + + + Return type: None(66) + + -- Attribute: accept_ranges + + The ‘Accept-Ranges’ header. Even though the name would + indicate that multiple values are supported, it must be one + string token only. + + The values ‘'bytes'’ and ‘'none'’ are common. + + New in version 0.7. + + -- Property: access_control_allow_credentials: bool(67) + + Whether credentials can be shared by the browser to JavaScript + code. As part of the preflight request it indicates whether + credentials can be used on the cross origin request. + + -- Attribute: access_control_allow_headers + + Which headers can be sent with the cross origin request. + + -- Attribute: access_control_allow_methods + + Which methods can be used for the cross origin request. + + -- Attribute: access_control_allow_origin + + The origin or ‘*’ for any origin that may make cross origin + requests. + + -- Attribute: access_control_expose_headers + + Which headers can be shared by the browser to JavaScript code. + + -- Attribute: access_control_max_age + + The maximum age in seconds the access control settings can be + cached for. + + -- Method: add_etag (overwrite=False, weak=False) + + Add an etag for the current response if there is none yet. + + Changed in version 2.0: SHA-1 is used to generate the value. + MD5 may not be available in some environments. + + + Parameters: + + * ‘overwrite’ (bool(68)) – + + * ‘weak’ (bool(69)) – + + + Return type: None(70) -- Attribute: age @@ -3863,7 +4097,7 @@ File: werkzeug.info, Node: Common Descriptors, Next: Response Stream, Up: Mix Age values are non-negative decimal integers, representing time in seconds. - -- Attribute: allow + -- Property: allow: *note werkzeug.datastructures.HeaderSet: e5. The Allow entity-header field lists the set of methods supported by the resource identified by the Request-URI. The @@ -3871,6 +4105,59 @@ File: werkzeug.info, Node: Common Descriptors, Next: Response Stream, Up: Mix valid methods associated with the resource. An Allow header field MUST be present in a 405 (Method Not Allowed) response. + -- Attribute: autocorrect_location_header = True + + Should this response object correct the location header to be + RFC conformant? This is true by default. + + New in version 0.8. + + -- Attribute: automatically_set_content_length = True + + Should this response object automatically set the + content-length header if possible? This is true by default. + + New in version 0.8. + + -- Property: cache_control: *note + werkzeug.datastructures.ResponseCacheControl: 109. + + The Cache-Control general-header field is used to specify + directives that MUST be obeyed by all caching mechanisms along + the request/response chain. + + -- Method: calculate_content_length () + + Returns the content length if available or ‘None’ otherwise. + + + Return type: Optional[int(71)] + + -- Method: call_on_close (func) + + Adds a function to the internal list of functions that should + be called as part of closing down the response. Since 0.7 + this function also returns the function that was passed so + that this can be used as a decorator. + + New in version 0.6. + + + Parameters: ‘func’ (‘Callable’‘[’‘[’‘]’‘, ’‘Any’‘]’) – + + + Return type: Callable[[], Any] + + -- Method: close () + + Close the wrapped response if possible. You can also use the + object in a with statement which will automatically close it. + + New in version 0.9: Can now be used in a with statement. + + + Return type: None(72) + -- Attribute: content_encoding The Content-Encoding entity-header field is used as a modifier @@ -3880,7 +4167,8 @@ File: werkzeug.info, Node: Common Descriptors, Next: Response Stream, Up: Mix in order to obtain the media-type referenced by the Content-Type header field. - -- Attribute: content_language + -- Property: content_language: *note + werkzeug.datastructures.HeaderSet: e5. The Content-Language entity-header field describes the natural language(s) of the intended audience for the enclosed entity. @@ -3911,12 +4199,30 @@ File: werkzeug.info, Node: Common Descriptors, Next: Response Stream, Up: Mix modification of the entity-body in transit, but is not proof against malicious attacks.) - -- Attribute: content_security_policy + -- Property: content_range: *note + werkzeug.datastructures.ContentRange: 113. + + The ‘Content-Range’ header as a *note ContentRange: 113. + object. Available even if the header is not set. + + New in version 0.7. + + -- Property: content_security_policy: + werkzeug.datastructures.ContentSecurityPolicy + + The ‘Content-Security-Policy’ header as a + ‘ContentSecurityPolicy’ object. Available even if the header + is not set. The Content-Security-Policy header adds an additional layer of security to help detect and mitigate certain types of attacks. - -- Attribute: content_security_policy_report_only + -- Property: content_security_policy_report_only: + werkzeug.datastructures.ContentSecurityPolicy + + The ‘Content-Security-policy-report-only’ header as a + ‘ContentSecurityPolicy’ object. Available even if the header + is not set. The Content-Security-Policy-Report-Only header adds a csp policy that is not enforced but is reported thereby helping @@ -3929,308 +4235,371 @@ File: werkzeug.info, Node: Common Descriptors, Next: Response Stream, Up: Mix the HEAD method, the media type that would have been sent had the request been a GET. + -- Attribute: cross_origin_embedder_policy + + Prevents a document from loading any cross-origin resources + that do not explicitly grant the document permission. Values + must be a member of the ‘werkzeug.http.COEP’ enum. + + -- Attribute: cross_origin_opener_policy + + Allows control over sharing of browsing context group with + cross-origin documents. Values must be a member of the + ‘werkzeug.http.COOP’ enum. + + -- Property: data: Union[bytes(73), str(74)] + + A descriptor that calls *note get_data(): 11a. and *note + set_data(): 11b. + -- Attribute: date The Date general-header field represents the date and time at which the message was originated, having the same semantics as orig-date in RFC 822. + Changed in version 2.0: The datetime object is timezone-aware. + + -- Method: delete_cookie (key, path='/', domain=None, + secure=False, httponly=False, samesite=None) + + Delete a cookie. Fails silently if key doesn’t exist. + + + Parameters: + + * ‘key’ (str(75)) – the key (name) of the cookie to be + deleted. + + * ‘path’ (str(76)) – if the cookie that should be deleted + was limited to a path, the path has to be defined here. + + * ‘domain’ (‘Optional’‘[’str(77)‘]’) – if the cookie that + should be deleted was limited to a domain, that domain + has to be defined here. + + * ‘secure’ (bool(78)) – If ‘True’, the cookie will only be + available via HTTPS. + + * ‘httponly’ (bool(79)) – Disallow JavaScript access to the + cookie. + + * ‘samesite’ (‘Optional’‘[’str(80)‘]’) – Limit the scope of + the cookie to only be attached to requests that are + “same-site”. + + + Return type: None(81) + + -- Attribute: direct_passthrough + + Pass the response body directly through as the WSGI iterable. + This can be used when the body is a binary file or other + iterator of bytes, to skip some unnecessary checks. Use *note + send_file(): f9. instead of setting this manually. + -- Attribute: expires The Expires entity-header field gives the date/time after which the response is considered stale. A stale cache entry may not normally be returned by a cache. + Changed in version 2.0: The datetime object is timezone-aware. + + -- Method: classmethod force_type (response, environ=None) + + Enforce that the WSGI response is a response object of the + current type. Werkzeug will use the *note Response: 5e. + internally in many situations like the exceptions. If you + call ‘get_response()’ on an exception you will get back a + regular *note Response: 5e. object, even if you are using a + custom subclass. + + This method can enforce a given response type, and it will + also convert arbitrary WSGI callables into response objects if + an environ is provided: + + # convert a Werkzeug response object into an instance of the + # MyResponseClass subclass. + response = MyResponseClass.force_type(response) + + # convert any WSGI application into a response object + response = MyResponseClass.force_type(response, environ) + + This is especially useful if you want to post-process + responses in the main dispatcher and use functionality + provided by your subclass. + + Keep in mind that this will modify response objects in place + if possible! + + + Parameters: + + * ‘response’ (*note Response: 5e.) – a response object or + wsgi application. + + * ‘environ’ (‘Optional’‘[’‘WSGIEnvironment’‘]’) – a WSGI + environment object. + + + Returns: a response object. + + + Return type: *note Response: 5e. + + -- Method: freeze () + + Make the response object ready to be pickled. Does the + following: + + * Buffer the response into a list, ignoring + ‘implicity_sequence_conversion’ and *note + direct_passthrough: 11e. + + * Set the ‘Content-Length’ header. + + * Generate an ‘ETag’ header if one is not already set. + + Changed in version 2.1: Removed the ‘no_etag’ parameter. + + Changed in version 2.0: An ‘ETag’ header is added, the + ‘no_etag’ parameter is deprecated and will be removed in + Werkzeug 2.1. + + Changed in version 0.6: The ‘Content-Length’ header is set. + + + Return type: None(82) + + -- Method: classmethod from_app (app, environ, buffered=False) + + Create a new response object from an application output. This + works best if you pass it an application that returns a + generator all the time. Sometimes applications may use the + ‘write()’ callable returned by the ‘start_response’ function. + This tries to resolve such edge cases automatically. But if + you don’t get the expected output you should set ‘buffered’ to + ‘True’ which enforces buffering. + + + Parameters: + + * ‘app’ (‘WSGIApplication’) – the WSGI application to + execute. + + * ‘environ’ (‘WSGIEnvironment’) – the WSGI environment to + execute against. + + * ‘buffered’ (bool(83)) – set to ‘True’ to enforce + buffering. + + + Returns: a response object. + + + Return type: *note Response: 5e. + + -- Method: get_app_iter (environ) + + Returns the application iterator for the given environ. + Depending on the request method and the current status code + the return value might be an empty response rather than the + one from the response. + + If the request method is ‘HEAD’ or the status code is in a + range where the HTTP specification requires an empty response, + an empty iterable is returned. + + New in version 0.6. + + + Parameters: ‘environ’ (‘WSGIEnvironment’) – the WSGI + environment of the request. + + + Returns: a response iterable. + + + Return type: Iterable[bytes(84)] + + -- Method: get_data (as_text=False) + + The string representation of the response body. Whenever you + call this property the response iterable is encoded and + flattened. This can lead to unwanted behavior if you stream + big data. + + This behavior can be disabled by setting *note + implicit_sequence_conversion: 124. to ‘False’. + + If ‘as_text’ is set to ‘True’ the return value will be a + decoded string. + + New in version 0.9. + + + Parameters: ‘as_text’ (bool(85)) – + + + Return type: Union[bytes(86), str(87)] + + -- Method: get_etag () + + Return a tuple in the form ‘(etag, is_weak)’. If there is no + ETag the return value is ‘(None, None)’. + + + Return type: Union[Tuple[str(88), bool(89)], Tuple[None(90), + None(91)]] + + -- Method: get_json (force=False, silent=False) + + Parse *note data: 119. as JSON. Useful during testing. + + If the mimetype does not indicate JSON (‘application/json’, + see *note is_json: 127.), this returns ‘None’. + + Unlike *note Request.get_json(): c1, the result is not cached. + + + Parameters: + + * ‘force’ (bool(92)) – Ignore the mimetype and always try + to parse JSON. + + * ‘silent’ (bool(93)) – Silence parsing errors and return + ‘None’ instead. + + + Return type: Optional[Any] + + -- Method: get_wsgi_headers (environ) + + This is automatically called right before the response is + started and returns headers modified for the given + environment. It returns a copy of the headers from the + response with some modifications applied if necessary. + + For example the location header (if present) is joined with + the root URL of the environment. Also the content length is + automatically set to zero here for certain status codes. + + Changed in version 0.6: Previously that function was called + ‘fix_headers’ and modified the response object in place. Also + since 0.6, IRIs in location and content-location headers are + handled properly. + + Also starting with 0.6, Werkzeug will attempt to set the + content length if it is able to figure it out on its own. + This is the case if all the strings in the response iterable + are already encoded and the iterable is buffered. + + + Parameters: ‘environ’ (‘WSGIEnvironment’) – the WSGI + environment of the request. + + + Returns: returns a new *note Headers: 70. object. + + + Return type: *note werkzeug.datastructures.Headers: 70. + + -- Method: get_wsgi_response (environ) + + Returns the final WSGI response as tuple. The first item in + the tuple is the application iterator, the second the status + and the third the list of headers. The response returned is + created specially for the given environment. For example if + the request method in the WSGI environment is ‘'HEAD'’ the + response will be empty and only the headers and status code + will be present. + + New in version 0.6. + + + Parameters: ‘environ’ (‘WSGIEnvironment’) – the WSGI + environment of the request. + + + Returns: an ‘(app_iter, status, headers)’ tuple. + + + Return type: Tuple[Iterable[bytes(94)], str(95), + List[Tuple[str(96), str(97)]]] + + -- Attribute: implicit_sequence_conversion = True + + if set to ‘False’ accessing properties on the response object + will not try to consume the response iterator and convert it + into a list. + + New in version 0.6.2: That attribute was previously called + ‘implicit_seqence_conversion’. (Notice the typo). If you did + use this feature, you have to adapt your code to the name + change. + + -- Property: is_json: bool(98) + + Check if the mimetype indicates JSON data, either + ‘application/json’ or ‘application/*+json’. + + -- Property: is_sequence: bool(99) + + If the iterator is buffered, this property will be ‘True’. A + response object will consider an iterator to be buffered if + the response attribute is a list or tuple. + + New in version 0.6. + + -- Property: is_streamed: bool(100) + + If the response is streamed (the response is not an iterable + with a length information) this property is ‘True’. In this + case streamed means that there is no information about the + number of iterations. This is usually ‘True’ if a generator + is passed to the response object. + + This is useful for checking before applying some sort of post + filtering that should not take place for streamed responses. + + -- Method: iter_encoded () + + Iter the response encoded with the encoding of the response. + If the response object is invoked as WSGI application the + return value of this method is used as application iterator + unless *note direct_passthrough: 11e. was activated. + + + Return type: Iterator[bytes(101)] + + -- Property: json: Optional[Any] + + The parsed JSON data if *note mimetype: 12e. indicates JSON + (‘application/json’, see *note is_json: 127.). + + Calls *note get_json(): 126. with default arguments. + + -- Attribute: json_module = + + A module or other object that has ‘dumps’ and ‘loads’ + functions that match the API of the built-in json(102) module. + -- Attribute: last_modified The Last-Modified entity-header field indicates the date and time at which the origin server believes the variant was last modified. + Changed in version 2.0: The datetime object is timezone-aware. + -- Attribute: location The Location response-header field is used to redirect the recipient to a location other than the Request-URI for completion of the request or identification of a new resource. - -- Attribute: mimetype - - The mimetype (content type without charset etc.) - - -- Attribute: mimetype_params - - The mimetype parameters as dict. For example if the content - type is ‘text/html; charset=utf-8’ the params would be - ‘{'charset': 'utf-8'}’. - - New in version 0.5. - - -- Attribute: retry_after - - The Retry-After response-header field can be used with a 503 - (Service Unavailable) response to indicate how long the - service is expected to be unavailable to the requesting - client. - - Time in seconds until expiration or date. - - -- Attribute: vary - - The Vary field value indicates the set of request-header - fields that fully determines, while the response is fresh, - whether a cache is permitted to use the response to reply to a - subsequent request without revalidation. - - -File: werkzeug.info, Node: Response Stream, Next: Accept, Prev: Common Descriptors, Up: Mixin Classes - -3.1.4.2 Response Stream -....................... - - -- Class: werkzeug.wrappers.ResponseStreamMixin - - Mixin for *note BaseResponse: d7. subclasses. Classes that inherit - from this mixin will automatically get a *note stream: 123. - property that provides a write-only interface to the response - iterable. - - -- Attribute: stream - - The response iterable as write-only stream. - - -File: werkzeug.info, Node: Accept, Next: Authentication, Prev: Response Stream, Up: Mixin Classes - -3.1.4.3 Accept -.............. - - -- Class: werkzeug.wrappers.AcceptMixin - - A mixin for classes with an ‘environ’ attribute to get all the HTTP - accept headers as *note Accept: 125. objects (or subclasses - thereof). - - -- Attribute: accept_charsets - - List of charsets this client supports as *note CharsetAccept: - 127. object. - - -- Attribute: accept_encodings - - List of encodings this client accepts. Encodings in a HTTP - term are compression encodings such as gzip. For charsets - have a look at ‘accept_charset’. - - -- Attribute: accept_languages - - List of languages this client accepts as *note LanguageAccept: - 12a. object. - - -- Attribute: accept_mimetypes - - List of mimetypes this client supports as *note MIMEAccept: - 12c. object. - - -File: werkzeug.info, Node: Authentication, Next: CORS, Prev: Accept, Up: Mixin Classes - -3.1.4.4 Authentication -...................... - - -- Class: werkzeug.wrappers.AuthorizationMixin - - Adds an *note authorization: 12e. property that represents the - parsed value of the ‘Authorization’ header as *note Authorization: - 12f. object. - - -- Attribute: authorization - - The ‘Authorization’ object in parsed form. - - -- Class: werkzeug.wrappers.WWWAuthenticateMixin - - Adds a *note www_authenticate: 130. property to a response object. - - -- Attribute: www_authenticate - - The ‘WWW-Authenticate’ header in a parsed form. - - -File: werkzeug.info, Node: CORS, Next: ETag, Prev: Authentication, Up: Mixin Classes - -3.1.4.5 CORS -............ - - -- Class: werkzeug.wrappers.cors.CORSRequestMixin - - A mixin for *note BaseRequest: 9d. subclasses that adds descriptors - for Cross Origin Resource Sharing (CORS) headers. - - New in version 1.0. - - -- Attribute: access_control_request_headers - - Sent with a preflight request to indicate which headers will - be sent with the cross origin request. Set *note - access_control_allow_headers: 133. on the response to indicate - which headers are allowed. - - -- Attribute: access_control_request_method - - Sent with a preflight request to indicate which method will be - used for the cross origin request. Set *note - access_control_allow_methods: 135. on the response to indicate - which methods are allowed. - - -- Attribute: origin - - The host that the request originated from. Set *note - access_control_allow_origin: 137. on the response to indicate - which origins are allowed. - - -- Class: werkzeug.wrappers.cors.CORSResponseMixin - - A mixin for *note BaseResponse: d7. subclasses that adds - descriptors for Cross Origin Resource Sharing (CORS) headers. - - New in version 1.0. - - -- Attribute: access_control_allow_credentials - - Whether credentials can be shared by the browser to JavaScript - code. As part of the preflight request it indicates whether - credentials can be used on the cross origin request. - - -- Attribute: access_control_allow_headers - - Which headers can be sent with the cross origin request. - - -- Attribute: access_control_allow_methods - - Which methods can be used for the cross origin request. - - -- Attribute: access_control_allow_origin - - The origin or ‘*’ for any origin that may make cross origin - requests. - - -- Attribute: access_control_expose_headers - - Which headers can be shared by the browser to JavaScript code. - - -- Attribute: access_control_max_age - - The maximum age in seconds the access control settings can be - cached for. - - -File: werkzeug.info, Node: ETag, Next: User Agent, Prev: CORS, Up: Mixin Classes - -3.1.4.6 ETag -............ - - -- Class: werkzeug.wrappers.ETagRequestMixin - - Add entity tag and cache descriptors to a request object or object - with a WSGI environment available as *note environ: 9f. This not - only provides access to etags but also to the cache control header. - - -- Attribute: cache_control - - A *note RequestCacheControl: 13d. object for the incoming - cache control headers. - - -- Attribute: if_match - - An object containing all the etags in the ‘If-Match’ header. - - - Return type: *note ETags: 13f. - - -- Attribute: if_modified_since - - The parsed ‘If-Modified-Since’ header as datetime object. - - -- Attribute: if_none_match - - An object containing all the etags in the ‘If-None-Match’ - header. - - - Return type: *note ETags: 13f. - - -- Attribute: if_range - - The parsed ‘If-Range’ header. - - New in version 0.7. - - - Return type: *note IfRange: 143. - - -- Attribute: if_unmodified_since - - The parsed ‘If-Unmodified-Since’ header as datetime object. - - -- Attribute: range - - The parsed ‘Range’ header. - - New in version 0.7. - - - Return type: *note Range: 146. - - -- Class: werkzeug.wrappers.ETagResponseMixin - - Adds extra functionality to a response object for etag and cache - handling. This mixin requires an object with at least a ‘headers’ - object that implements a dict like interface similar to *note - Headers: d9. - - If you want the *note freeze(): 147. method to automatically add an - etag, you have to mixin this method before the response base class. - The default response class does not do that. - - -- Attribute: accept_ranges - - The ‘Accept-Ranges’ header. Even though the name would - indicate that multiple values are supported, it must be one - string token only. - - The values ‘'bytes'’ and ‘'none'’ are common. - - New in version 0.7. - - -- Method: add_etag (overwrite=False, weak=False) - - Add an etag for the current response if there is none yet. - - -- Attribute: cache_control - - The Cache-Control general-header field is used to specify - directives that MUST be obeyed by all caching mechanisms along - the request/response chain. - - -- Attribute: content_range - - The ‘Content-Range’ header as a *note ContentRange: 14c. - object. Available even if the header is not set. - - New in version 0.7. - - -- Method: freeze (no_etag=False) - - Call this method if you want to make your response object - ready for pickeling. This buffers the generator if there is - one. This also sets the etag unless ‘no_etag’ is set to - ‘True’. - - -- Method: get_etag () - - Return a tuple in the form ‘(etag, is_weak)’. If there is no - ETag the return value is ‘(None, None)’. - -- Method: make_conditional (request_or_environ, accept_ranges=False, complete_length=None) @@ -4245,11 +4614,12 @@ File: werkzeug.info, Node: ETag, Next: User Agent, Prev: CORS, Up: Mixin Cla For optimal performance when handling range requests, it’s recommended that your response data object implements ‘seekable’, ‘seek’ and ‘tell’ methods as described by - io.IOBase(1). Objects returned by *note wrap_file(): 14f. + io.IOBase(103). Objects returned by *note wrap_file(): 133. automatically implement those methods. It does not remove the body of the response because that’s - something the ‘__call__()’ function does for us automatically. + something the *note __call__(): fa. function does for us + automatically. Returns self so that you can do ‘return resp.make_conditional(req)’ but modifies the object in-place. @@ -4257,136 +4627,460 @@ File: werkzeug.info, Node: ETag, Next: User Agent, Prev: CORS, Up: Mixin Cla Parameters: - * ‘request_or_environ’ – a request object or WSGI + * ‘request_or_environ’ (‘Union’‘[’‘WSGIEnvironment’‘, + ’*note Request: 71.‘]’) – a request object or WSGI environment to be used to make the response conditional against. - * ‘accept_ranges’ – This parameter dictates the value of - ‘Accept-Ranges’ header. If ‘False’ (default), the header - is not set. If ‘True’, it will be set to ‘"bytes"’. If - ‘None’, it will be set to ‘"none"’. If it’s a string, it - will use this value. + * ‘accept_ranges’ (‘Union’‘[’bool(104)‘, ’str(105)‘]’) – + This parameter dictates the value of ‘Accept-Ranges’ + header. If ‘False’ (default), the header is not set. If + ‘True’, it will be set to ‘"bytes"’. If ‘None’, it will + be set to ‘"none"’. If it’s a string, it will use this + value. - * ‘complete_length’ – Will be used only in valid Range - Requests. It will set ‘Content-Range’ complete length - value and compute ‘Content-Length’ real value. This - parameter is mandatory for successful Range Requests - completion. + * ‘complete_length’ (‘Optional’‘[’int(106)‘]’) – Will be + used only in valid Range Requests. It will set + ‘Content-Range’ complete length value and compute + ‘Content-Length’ real value. This parameter is mandatory + for successful Range Requests completion. - Raises: *note RequestedRangeNotSatisfiable: 150. if ‘Range’ + Raises: *note RequestedRangeNotSatisfiable: 134. if ‘Range’ header could not be parsed or satisfied. + + Return type: *note Response: 5e. + + Changed in version 2.0: Range processing is skipped if length + is 0 instead of raising a 416 Range Not Satisfiable error. + + -- Method: make_sequence () + + Converts the response iterator in a list. By default this + happens automatically if required. If + ‘implicit_sequence_conversion’ is disabled, this method is not + automatically called and some properties might raise + exceptions. This also encodes all the items. + + New in version 0.6. + + + Return type: None(107) + + -- Property: mimetype: Optional[str(108)] + + The mimetype (content type without charset etc.) + + -- Property: mimetype_params: Dict[str(109), str(110)] + + The mimetype parameters as dict. For example if the content + type is ‘text/html; charset=utf-8’ the params would be + ‘{'charset': 'utf-8'}’. + + New in version 0.5. + + -- Attribute: response: Union[Iterable[str(111)], + Iterable[bytes(112)]] + + The response body to send as the WSGI iterable. A list of + strings or bytes represents a fixed-length response, any other + iterable is a streaming response. Strings are encoded to + bytes as UTF-8. + + Do not set to a plain string or bytes, that will cause sending + the response to be very inefficient as it will iterate one + byte at a time. + + -- Property: retry_after: Optional[datetime.datetime(113)] + + The Retry-After response-header field can be used with a 503 + (Service Unavailable) response to indicate how long the + service is expected to be unavailable to the requesting + client. + + Time in seconds until expiration or date. + + Changed in version 2.0: The datetime object is timezone-aware. + + -- Method: set_cookie (key, value='', max_age=None, expires=None, + path='/', domain=None, secure=False, httponly=False, + samesite=None) + + Sets a cookie. + + A warning is raised if the size of the cookie header exceeds + ‘max_cookie_size’, but the header will still be set. + + + Parameters: + + * ‘key’ (str(114)) – the key (name) of the cookie to be + set. + + * ‘value’ (str(115)) – the value of the cookie. + + * ‘max_age’ + (‘Optional’‘[’‘Union’‘[’datetime.timedelta(116)‘, + ’int(117)‘]’‘]’) – should be a number of seconds, or + ‘None’ (default) if the cookie should last only as long + as the client’s browser session. + + * ‘expires’ (‘Optional’‘[’‘Union’‘[’str(118)‘, + ’datetime.datetime(119)‘, ’int(120)‘, ’float(121)‘]’‘]’) + – should be a ‘datetime’ object or UNIX timestamp. + + * ‘path’ (‘Optional’‘[’str(122)‘]’) – limits the cookie to + a given path, per default it will span the whole domain. + + * ‘domain’ (‘Optional’‘[’str(123)‘]’) – if you want to set + a cross-domain cookie. For example, + ‘domain=".example.com"’ will set a cookie that is + readable by the domain ‘www.example.com’, + ‘foo.example.com’ etc. Otherwise, a cookie will only be + readable by the domain that set it. + + * ‘secure’ (bool(124)) – If ‘True’, the cookie will only be + available via HTTPS. + + * ‘httponly’ (bool(125)) – Disallow JavaScript access to + the cookie. + + * ‘samesite’ (‘Optional’‘[’str(126)‘]’) – Limit the scope + of the cookie to only be attached to requests that are + “same-site”. + + + Return type: None(127) + + -- Method: set_data (value) + + Sets a new string as response. The value must be a string or + bytes. If a string is set it’s encoded to the charset of the + response (utf-8 by default). + + New in version 0.9. + + + Parameters: ‘value’ (‘Union’‘[’bytes(128)‘, ’str(129)‘]’) – + + + Return type: None(130) + -- Method: set_etag (etag, weak=False) Set the etag, and override the old one if there was one. - ---------- Footnotes ---------- - - (1) https://docs.python.org/3/library/io.html#io.IOBase - - -File: werkzeug.info, Node: User Agent, Prev: ETag, Up: Mixin Classes - -3.1.4.7 User Agent -.................. - - -- Class: werkzeug.wrappers.UserAgentMixin - - Adds a ‘user_agent’ attribute to the request object which contains - the parsed user agent of the browser that triggered the request as - a *note UserAgent: 153. object. - - -- Attribute: user_agent - - The current user agent. - - -File: werkzeug.info, Node: Extra Mixin Classes, Prev: Mixin Classes, Up: Request / Response Objects - -3.1.5 Extra Mixin Classes -------------------------- - -These mixins are not included in the default *note Request: 99. and -*note Response: 9a. classes. They provide extra behavior that needs to -be opted into by creating your own subclasses: - - class Response(JSONMixin, BaseResponse): - pass - -* Menu: - -* JSON:: - - -File: werkzeug.info, Node: JSON, Up: Extra Mixin Classes - -3.1.5.1 JSON -............ - - -- Class: werkzeug.wrappers.json.JSONMixin - - Mixin to parse ‘data’ as JSON. Can be mixed in for both *note - Request: 99. and *note Response: 9a. classes. - - If simplejson(1) is installed it is preferred over Python’s - built-in json(2) module. - - -- Method: get_json (force=False, silent=False, cache=True) - - Parse ‘data’ as JSON. - - If the mimetype does not indicate JSON (‘application/json’, - see *note is_json(): 159.), this returns ‘None’. - - If parsing fails, *note on_json_loading_failed(): 15a. is - called and its return value is used as the return value. - Parameters: - * ‘force’ – Ignore the mimetype and always try to parse - JSON. + * ‘etag’ (str(131)) – - * ‘silent’ – Silence parsing errors and return ‘None’ - instead. + * ‘weak’ (bool(132)) – - * ‘cache’ – Store the parsed JSON to return for subsequent - calls. - -- Attribute: is_json + Return type: None(133) - Check if the mimetype indicates JSON data, either - ‘application/json’ or ‘application/*+json’. + -- Property: status: str(134) - -- Attribute: json + The HTTP status code as a string. - The parsed JSON data if ‘mimetype’ indicates JSON - (‘application/json’, see *note is_json(): 159.). + -- Property: status_code: int(135) - Calls *note get_json(): 158. with default arguments. + The HTTP status code as a number. - -- Attribute: json_module + -- Property: stream: werkzeug.wrappers.response.ResponseStream - A module or other object that has ‘dumps’ and ‘loads’ - functions that match the API of the built-in json(3) module. + The response iterable as write-only stream. - alias of ‘_JSONModule’ + -- Property: vary: *note werkzeug.datastructures.HeaderSet: e5. - -- Method: on_json_loading_failed (e) + The Vary field value indicates the set of request-header + fields that fully determines, while the response is fresh, + whether a cache is permitted to use the response to reply to a + subsequent request without revalidation. - Called if *note get_json(): 158. parsing fails and isn’t - silenced. If this method returns a value, it is used as the - return value for *note get_json(): 158. The default - implementation raises *note BadRequest: 15d. + -- Property: www_authenticate: *note + werkzeug.datastructures.WWWAuthenticate: 140. + + The ‘WWW-Authenticate’ header in a parsed form. ---------- Footnotes ---------- - (1) https://simplejson.readthedocs.io/en/latest/ + (1) https://docs.python.org/3/library/functions.html#bool - (2) https://docs.python.org/3/library/json.html#module-json + (2) https://docs.python.org/3/library/functions.html#bool - (3) https://docs.python.org/3/library/json.html#module-json + (3) https://docs.python.org/3/library/exceptions.html#RuntimeError + + (4) https://docs.python.org/3/library/constants.html#None + + (5) https://docs.python.org/3/library/functions.html#int + + (6) https://docs.python.org/3/library/stdtypes.html#str + + (7) https://docs.python.org/3/library/stdtypes.html#str + + (8) https://docs.python.org/3/library/functions.html#int + + (9) https://docs.python.org/3/library/stdtypes.html#bytes + + (10) https://docs.python.org/3/library/stdtypes.html#str + + (11) https://docs.python.org/3/library/stdtypes.html#str + + (12) https://docs.python.org/3/library/stdtypes.html#str + + (13) https://docs.python.org/3/library/stdtypes.html#str + + (14) https://docs.python.org/3/library/constants.html#None + + (15) https://docs.python.org/3/library/functions.html#int + + (16) https://docs.python.org/3/library/stdtypes.html#str + + (17) https://docs.python.org/3/library/stdtypes.html#str + + (18) https://docs.python.org/3/library/stdtypes.html#dict + + (19) https://docs.python.org/3/library/stdtypes.html#bytes + + (20) https://docs.python.org/3/library/stdtypes.html#str + + (21) https://docs.python.org/3/library/stdtypes.html#str + + (22) https://docs.python.org/3/library/stdtypes.html#str + + (23) https://docs.python.org/3/library/stdtypes.html#str + + (24) https://docs.python.org/3/library/functions.html#bool + + (25) https://docs.python.org/3/library/functions.html#bool + + (26) https://docs.python.org/3/library/functions.html#bool + + (27) https://docs.python.org/3/library/stdtypes.html#bytes + + (28) https://docs.python.org/3/library/stdtypes.html#str + + (29) https://docs.python.org/3/library/functions.html#bool + + (30) https://docs.python.org/3/library/functions.html#bool + + (31) https://docs.python.org/3/library/functions.html#bool + + (32) https://docs.python.org/3/library/stdtypes.html#str + + (33) https://docs.python.org/3/library/stdtypes.html#str + + (34) +https://docs.python.org/3/library/datetime.html#datetime.datetime + + (35) +https://docs.python.org/3/library/datetime.html#datetime.datetime + + (36) https://docs.python.org/3/library/functions.html#bool + + (37) https://docs.python.org/3/library/functions.html#bool + + (38) https://docs.python.org/3/library/json.html#module-json + + (39) https://docs.python.org/3/library/functions.html#int + + (40) https://docs.python.org/3/library/functions.html#int + + (41) https://docs.python.org/3/library/stdtypes.html#str + + (42) https://docs.python.org/3/library/stdtypes.html#str + + (43) https://docs.python.org/3/library/stdtypes.html#str + + (44) https://docs.python.org/3/library/exceptions.html#ValueError + + (45) https://docs.python.org/3/library/stdtypes.html#str + + (46) https://docs.python.org/3/library/stdtypes.html#str + + (47) https://docs.python.org/3/library/functions.html#bool + + (48) https://docs.python.org/3/library/stdtypes.html#bytes + + (49) https://docs.python.org/3/library/stdtypes.html#str + + (50) https://docs.python.org/3/library/stdtypes.html#str + + (51) https://docs.python.org/3/library/stdtypes.html#str + + (52) https://docs.python.org/3/library/stdtypes.html#str + + (53) https://docs.python.org/3/library/stdtypes.html#str + + (54) https://docs.python.org/3/library/functions.html#bool + + (55) https://docs.python.org/3/library/stdtypes.html#str + + (56) https://docs.python.org/3/library/stdtypes.html#bytes + + (57) https://docs.python.org/3/library/functions.html#int + + (58) https://docs.python.org/3/library/stdtypes.html#str + + (59) https://docs.python.org/3/library/http.html#http.HTTPStatus + + (60) https://docs.python.org/3/library/stdtypes.html#str + + (61) https://docs.python.org/3/library/stdtypes.html#str + + (62) https://docs.python.org/3/library/functions.html#bool + + (63) https://docs.python.org/3/library/constants.html#None + + (64) https://docs.python.org/3/library/stdtypes.html#bytes + + (65) https://docs.python.org/3/library/functions.html#bool + + (66) https://docs.python.org/3/library/constants.html#None + + (67) https://docs.python.org/3/library/functions.html#bool + + (68) https://docs.python.org/3/library/functions.html#bool + + (69) https://docs.python.org/3/library/functions.html#bool + + (70) https://docs.python.org/3/library/constants.html#None + + (71) https://docs.python.org/3/library/functions.html#int + + (72) https://docs.python.org/3/library/constants.html#None + + (73) https://docs.python.org/3/library/stdtypes.html#bytes + + (74) https://docs.python.org/3/library/stdtypes.html#str + + (75) https://docs.python.org/3/library/stdtypes.html#str + + (76) https://docs.python.org/3/library/stdtypes.html#str + + (77) https://docs.python.org/3/library/stdtypes.html#str + + (78) https://docs.python.org/3/library/functions.html#bool + + (79) https://docs.python.org/3/library/functions.html#bool + + (80) https://docs.python.org/3/library/stdtypes.html#str + + (81) https://docs.python.org/3/library/constants.html#None + + (82) https://docs.python.org/3/library/constants.html#None + + (83) https://docs.python.org/3/library/functions.html#bool + + (84) https://docs.python.org/3/library/stdtypes.html#bytes + + (85) https://docs.python.org/3/library/functions.html#bool + + (86) https://docs.python.org/3/library/stdtypes.html#bytes + + (87) https://docs.python.org/3/library/stdtypes.html#str + + (88) https://docs.python.org/3/library/stdtypes.html#str + + (89) https://docs.python.org/3/library/functions.html#bool + + (90) https://docs.python.org/3/library/constants.html#None + + (91) https://docs.python.org/3/library/constants.html#None + + (92) https://docs.python.org/3/library/functions.html#bool + + (93) https://docs.python.org/3/library/functions.html#bool + + (94) https://docs.python.org/3/library/stdtypes.html#bytes + + (95) https://docs.python.org/3/library/stdtypes.html#str + + (96) https://docs.python.org/3/library/stdtypes.html#str + + (97) https://docs.python.org/3/library/stdtypes.html#str + + (98) https://docs.python.org/3/library/functions.html#bool + + (99) https://docs.python.org/3/library/functions.html#bool + + (100) https://docs.python.org/3/library/functions.html#bool + + (101) https://docs.python.org/3/library/stdtypes.html#bytes + + (102) https://docs.python.org/3/library/json.html#module-json + + (103) https://docs.python.org/3/library/io.html#io.IOBase + + (104) https://docs.python.org/3/library/functions.html#bool + + (105) https://docs.python.org/3/library/stdtypes.html#str + + (106) https://docs.python.org/3/library/functions.html#int + + (107) https://docs.python.org/3/library/constants.html#None + + (108) https://docs.python.org/3/library/stdtypes.html#str + + (109) https://docs.python.org/3/library/stdtypes.html#str + + (110) https://docs.python.org/3/library/stdtypes.html#str + + (111) https://docs.python.org/3/library/stdtypes.html#str + + (112) https://docs.python.org/3/library/stdtypes.html#bytes + + (113) +https://docs.python.org/3/library/datetime.html#datetime.datetime + + (114) https://docs.python.org/3/library/stdtypes.html#str + + (115) https://docs.python.org/3/library/stdtypes.html#str + + (116) +https://docs.python.org/3/library/datetime.html#datetime.timedelta + + (117) https://docs.python.org/3/library/functions.html#int + + (118) https://docs.python.org/3/library/stdtypes.html#str + + (119) +https://docs.python.org/3/library/datetime.html#datetime.datetime + + (120) https://docs.python.org/3/library/functions.html#int + + (121) https://docs.python.org/3/library/functions.html#float + + (122) https://docs.python.org/3/library/stdtypes.html#str + + (123) https://docs.python.org/3/library/stdtypes.html#str + + (124) https://docs.python.org/3/library/functions.html#bool + + (125) https://docs.python.org/3/library/functions.html#bool + + (126) https://docs.python.org/3/library/stdtypes.html#str + + (127) https://docs.python.org/3/library/constants.html#None + + (128) https://docs.python.org/3/library/stdtypes.html#bytes + + (129) https://docs.python.org/3/library/stdtypes.html#str + + (130) https://docs.python.org/3/library/constants.html#None + + (131) https://docs.python.org/3/library/stdtypes.html#str + + (132) https://docs.python.org/3/library/functions.html#bool + + (133) https://docs.python.org/3/library/constants.html#None + + (134) https://docs.python.org/3/library/stdtypes.html#str + + (135) https://docs.python.org/3/library/functions.html#int  File: werkzeug.info, Node: URL Routing, Next: WSGI Helpers, Prev: Request / Response Objects, Up: Reference @@ -4401,7 +5095,7 @@ registered callback functions that return the value. Werkzeug provides a much more powerful system, similar to Routes(1). All the objects mentioned on this page must be imported from *note -werkzeug.routing: e, not from ‘werkzeug’! +werkzeug.routing: d, not from ‘werkzeug’! * Menu: @@ -4448,13 +5142,13 @@ Here is a simple example which could be the URL definition for a blog: except HTTPException, e: return e(environ, start_response) start_response('200 OK', [('Content-Type', 'text/plain')]) - return ['Rule points to %r with arguments %r' % (endpoint, args)] + return [f'Rule points to {endpoint!r} with arguments {args!r}'] -So what does that do? First of all we create a new *note Map: 35. which -stores a bunch of URL rules. Then we pass it a list of *note Rule: 36. +So what does that do? First of all we create a new *note Map: 2f. which +stores a bunch of URL rules. Then we pass it a list of *note Rule: 30. objects. -Each *note Rule: 36. object is instantiated with a string that +Each *note Rule: 30. object is instantiated with a string that represents a rule and an endpoint which will be the alias for what view the rule represents. Multiple rules can have the same endpoint, but should have different arguments to allow URL construction. @@ -4463,14 +5157,14 @@ The format for the URL rules is straightforward, but explained in detail below. Inside the WSGI application we bind the url_map to the current request -which will return a new *note MapAdapter: 162. This url_map adapter can +which will return a new *note MapAdapter: 144. This url_map adapter can then be used to match or build domains for the current request. -The *note MapAdapter.match(): 163. method can then either return a tuple +The *note MapAdapter.match(): 145. method can then either return a tuple in the form ‘(endpoint, args)’ or raise one of the three exceptions -*note NotFound: 37, *note MethodNotAllowed: 164, or ‘RequestRedirect’. +*note NotFound: 31, *note MethodNotAllowed: 146, or ‘RequestRedirect’. For more details about those exceptions have a look at the documentation -of the *note MapAdapter.match(): 163. method. +of the *note MapAdapter.match(): 145. method.  File: werkzeug.info, Node: Rule Format, Next: Built-in Converters, Prev: Quickstart<3>, Up: URL Routing @@ -4492,8 +5186,8 @@ Many HTTP servers merge consecutive slashes into one when receiving requests. If ‘merge_slashes’ is enabled (the default), rules will merge slashes in non-variable parts when matching and building. Visiting a URL with consecutive slashes will redirect to the URL with slashes -merged. If you want to disable ‘merge_slashes’ for a *note Rule: 36. or -*note Map: 35, you’ll also need to configure your web server +merged. If you want to disable ‘merge_slashes’ for a *note Rule: 30. or +*note Map: 2f, you’ll also need to configure your web server appropriately.  @@ -4504,7 +5198,7 @@ File: werkzeug.info, Node: Built-in Converters, Next: Maps Rules and Adapters, Converters for common types of URL variables are built-in. The available converters can be overridden or extended through *note -Map.converters: 167. +Map.converters: 149. -- Class: werkzeug.routing.UnicodeConverter (map, minlength=1, maxlength=None, length=None) @@ -4522,25 +5216,39 @@ Map.converters: 167. Parameters: - * ‘map’ – the *note Map: 35. + * ‘map’ (*note Map: 2f.) – the *note Map: 2f. - * ‘minlength’ – the minimum length of the string. Must be - greater or equal 1. + * ‘minlength’ (int(1)) – the minimum length of the string. Must + be greater or equal 1. - * ‘maxlength’ – the maximum length of the string. + * ‘maxlength’ (‘Optional’‘[’int(2)‘]’) – the maximum length of + the string. - * ‘length’ – the exact length of the string. + * ‘length’ (‘Optional’‘[’int(3)‘]’) – the exact length of the + string. - -- Class: werkzeug.routing.PathConverter (map) - Like the default *note UnicodeConverter: 168, but it also matches + Return type: None(4) + + -- Class: werkzeug.routing.PathConverter (map, *args, **kwargs) + + Like the default *note UnicodeConverter: 14a, but it also matches slashes. This is useful for wikis and similar applications: Rule('/') Rule('//edit') - Parameters: ‘map’ – the *note Map: 35. + Parameters: + + * ‘map’ (*note Map: 2f.) – the *note Map: 2f. + + * ‘args’ (‘Any’) – + + * ‘kwargs’ (‘Any’) – + + + Return type: None(5) -- Class: werkzeug.routing.AnyConverter (map, *items) @@ -4552,11 +5260,14 @@ Map.converters: 167. Parameters: - * ‘map’ – the *note Map: 35. + * ‘map’ (*note Map: 2f.) – the *note Map: 2f. - * ‘items’ – this function accepts the possible items as + * ‘items’ (str(6)) – this function accepts the possible items as positional arguments. + + Return type: None(7) + -- Class: werkzeug.routing.IntegerConverter (map, fixed_digits=0, min=None, max=None, signed=False) @@ -4572,17 +5283,21 @@ Map.converters: 167. Parameters: - * ‘map’ – The *note Map: 35. + * ‘map’ (*note Map: 2f.) – The *note Map: 2f. - * ‘fixed_digits’ – The number of fixed digits in the URL. If you - set this to ‘4’ for example, the rule will only match if the - URL looks like ‘/0001/’. The default is variable length. + * ‘fixed_digits’ (int(8)) – The number of fixed digits in the + URL. If you set this to ‘4’ for example, the rule will only + match if the URL looks like ‘/0001/’. The default is variable + length. - * ‘min’ – The minimal value. + * ‘min’ (‘Optional’‘[’int(9)‘]’) – The minimal value. - * ‘max’ – The maximal value. + * ‘max’ (‘Optional’‘[’int(10)‘]’) – The maximal value. - * ‘signed’ – Allow signed (negative) values. + * ‘signed’ (bool(11)) – Allow signed (negative) values. + + + Return type: None(12) New in version 0.15: The ‘signed’ parameter. @@ -4601,17 +5316,20 @@ Map.converters: 167. Parameters: - * ‘map’ – The *note Map: 35. + * ‘map’ (*note Map: 2f.) – The *note Map: 2f. - * ‘min’ – The minimal value. + * ‘min’ (‘Optional’‘[’float(13)‘]’) – The minimal value. - * ‘max’ – The maximal value. + * ‘max’ (‘Optional’‘[’float(14)‘]’) – The maximal value. - * ‘signed’ – Allow signed (negative) values. + * ‘signed’ (bool(15)) – Allow signed (negative) values. + + + Return type: None(16) New in version 0.15: The ‘signed’ parameter. - -- Class: werkzeug.routing.UUIDConverter (map) + -- Class: werkzeug.routing.UUIDConverter (map, *args, **kwargs) This converter only accepts UUID strings: @@ -4620,7 +5338,52 @@ Map.converters: 167. New in version 0.10. - Parameters: ‘map’ – the *note Map: 35. + Parameters: + + * ‘map’ (*note Map: 2f.) – the *note Map: 2f. + + * ‘args’ (‘Any’) – + + * ‘kwargs’ (‘Any’) – + + + Return type: None(17) + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3/library/functions.html#int + + (2) https://docs.python.org/3/library/functions.html#int + + (3) https://docs.python.org/3/library/functions.html#int + + (4) https://docs.python.org/3/library/constants.html#None + + (5) https://docs.python.org/3/library/constants.html#None + + (6) https://docs.python.org/3/library/stdtypes.html#str + + (7) https://docs.python.org/3/library/constants.html#None + + (8) https://docs.python.org/3/library/functions.html#int + + (9) https://docs.python.org/3/library/functions.html#int + + (10) https://docs.python.org/3/library/functions.html#int + + (11) https://docs.python.org/3/library/functions.html#bool + + (12) https://docs.python.org/3/library/constants.html#None + + (13) https://docs.python.org/3/library/functions.html#float + + (14) https://docs.python.org/3/library/functions.html#float + + (15) https://docs.python.org/3/library/functions.html#bool + + (16) https://docs.python.org/3/library/constants.html#None + + (17) https://docs.python.org/3/library/constants.html#None  File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Prev: Built-in Converters, Up: URL Routing @@ -4643,40 +5406,51 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre Parameters: - * ‘rules’ – sequence of url rules for this map. + * ‘rules’ (‘Optional’‘[’‘Iterable’‘[’*note + werkzeug.routing.RuleFactory: 151.‘]’‘]’) – sequence of url + rules for this map. - * ‘default_subdomain’ – The default subdomain for rules without - a subdomain defined. + * ‘default_subdomain’ (str(1)) – The default subdomain for rules + without a subdomain defined. - * ‘charset’ – charset of the url. defaults to ‘"utf-8"’ + * ‘charset’ (str(2)) – charset of the url. defaults to + ‘"utf-8"’ - * ‘strict_slashes’ – If a rule ends with a slash but the matched - URL does not, redirect to the URL with a trailing slash. + * ‘strict_slashes’ (bool(3)) – If a rule ends with a slash but + the matched URL does not, redirect to the URL with a trailing + slash. - * ‘merge_slashes’ – Merge consecutive slashes when matching or - building URLs. Matches will redirect to the normalized URL. - Slashes in variable parts are not merged. + * ‘merge_slashes’ (bool(4)) – Merge consecutive slashes when + matching or building URLs. Matches will redirect to the + normalized URL. Slashes in variable parts are not merged. - * ‘redirect_defaults’ – This will redirect to the default rule - if it wasn’t visited that way. This helps creating unique - URLs. + * ‘redirect_defaults’ (bool(5)) – This will redirect to the + default rule if it wasn’t visited that way. This helps + creating unique URLs. - * ‘converters’ – A dict of converters that adds additional - converters to the list of converters. If you redefine one - converter this will override the original one. + * ‘converters’ (‘Optional’‘[’‘Mapping’‘[’str(6)‘, + ’‘Type’‘[’‘werkzeug.routing.BaseConverter’‘]’‘]’‘]’) – A dict + of converters that adds additional converters to the list of + converters. If you redefine one converter this will override + the original one. - * ‘sort_parameters’ – If set to ‘True’ the url parameters are - sorted. See ‘url_encode’ for more details. + * ‘sort_parameters’ (bool(7)) – If set to ‘True’ the url + parameters are sorted. See ‘url_encode’ for more details. - * ‘sort_key’ – The sort key function for ‘url_encode’. + * ‘sort_key’ (‘Optional’‘[’‘Callable’‘[’‘[’‘Any’‘]’‘, + ’‘Any’‘]’‘]’) – The sort key function for ‘url_encode’. - * ‘encoding_errors’ – the error method to use for decoding + * ‘encoding_errors’ (str(8)) – the error method to use for + decoding - * ‘host_matching’ – if set to ‘True’ it enables the host - matching feature and disables the subdomain one. If enabled - the ‘host’ parameter to rules is used instead of the + * ‘host_matching’ (bool(9)) – if set to ‘True’ it enables the + host matching feature and disables the subdomain one. If + enabled the ‘host’ parameter to rules is used instead of the ‘subdomain’ one. + + Return type: None(10) + Changed in version 1.0: If ‘url_scheme’ is ‘ws’ or ‘wss’, only WebSocket rules will match. @@ -4701,14 +5475,17 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre that the rule is not bound to another map. - Parameters: ‘rulefactory’ – a *note Rule: 36. or *note - RuleFactory: 170. + Parameters: ‘rulefactory’ (*note werkzeug.routing.RuleFactory: + 151.) – a *note Rule: 30. or *note RuleFactory: 151. + + + Return type: None(11) -- Method: bind (server_name, script_name=None, subdomain=None, url_scheme='http', default_method='GET', path_info=None, query_args=None) - Return a new *note MapAdapter: 162. with the details specified + Return a new *note MapAdapter: 144. with the details specified to the call. Note that ‘script_name’ will default to ‘'/'’ if not further specified or ‘None’. The ‘server_name’ at least is a requirement because the HTTP RFC requires absolute URLs @@ -4734,10 +5511,32 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre Changed in version 0.7: Added ‘query_args’. + + Parameters: + + * ‘server_name’ (str(12)) – + + * ‘script_name’ (‘Optional’‘[’str(13)‘]’) – + + * ‘subdomain’ (‘Optional’‘[’str(14)‘]’) – + + * ‘url_scheme’ (str(15)) – + + * ‘default_method’ (str(16)) – + + * ‘path_info’ (‘Optional’‘[’str(17)‘]’) – + + * ‘query_args’ + (‘Optional’‘[’‘Union’‘[’‘Mapping’‘[’str(18)‘, ’‘Any’‘]’‘, + ’str(19)‘]’‘]’) – + + + Return type: *note werkzeug.routing.MapAdapter: 144. + -- Method: bind_to_environ (environ, server_name=None, subdomain=None) - Like *note bind(): 171. but you can pass it an WSGI + Like *note bind(): 153. but you can pass it an WSGI environment and it will fetch the information from that dictionary. Note that because of limitations in the protocol there is no way to get the current subdomain and real @@ -4756,7 +5555,7 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre If the object passed as environ has an environ attribute, the value of this attribute is used instead. This allows you to pass request objects. Additionally ‘PATH_INFO’ added as a - default of the *note MapAdapter: 162. so that you don’t have + default of the *note MapAdapter: 144. so that you don’t have to pass the path info to the match method. Changed in version 1.0.0: If the passed server name specifies @@ -4776,12 +5575,17 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre Parameters: - * ‘environ’ – a WSGI environment. + * ‘environ’ (‘Union’‘[’‘WSGIEnvironment’‘, ’*note Request: + 71.‘]’) – a WSGI environment. - * ‘server_name’ – an optional server name hint (see above). + * ‘server_name’ (‘Optional’‘[’str(20)‘]’) – an optional + server name hint (see above). - * ‘subdomain’ – optionally the current subdomain (see - above). + * ‘subdomain’ (‘Optional’‘[’str(21)‘]’) – optionally the + current subdomain (see above). + + + Return type: *note MapAdapter: 144. -- Attribute: default_converters = {'any': , 'default': >> urls.build("index", {'q': 'My Searchstring'}) @@ -4885,7 +5726,7 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre When processing those additional values, lists are furthermore interpreted as multiple values (as per *note - werkzeug.datastructures.MultiDict: b2.): + werkzeug.datastructures.MultiDict: 82.): >>> urls.build("index", {'q': ['a', 'b', 'c']}) '/?q=a&q=b&q=c' @@ -4903,27 +5744,37 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre for if you have different methods for the same endpoint specified. - New in version 0.6: the ‘append_unknown’ parameter was added. - Parameters: - * ‘endpoint’ – the endpoint of the URL to build. + * ‘endpoint’ (str(37)) – the endpoint of the URL to build. - * ‘values’ – the values for the URL to build. Unhandled - values are appended to the URL as query parameters. + * ‘values’ (‘Optional’‘[’‘Mapping’‘[’str(38)‘, + ’‘Any’‘]’‘]’) – the values for the URL to build. + Unhandled values are appended to the URL as query + parameters. - * ‘method’ – the HTTP method for the rule if there are - different URLs for different methods on the same - endpoint. + * ‘method’ (‘Optional’‘[’str(39)‘]’) – the HTTP method for + the rule if there are different URLs for different + methods on the same endpoint. - * ‘force_external’ – enforce full canonical external URLs. - If the URL scheme is not provided, this will generate a - protocol-relative URL. + * ‘force_external’ (bool(40)) – enforce full canonical + external URLs. If the URL scheme is not provided, this + will generate a protocol-relative URL. - * ‘append_unknown’ – unknown parameters are appended to the - generated URL as query string argument. Disable this if - you want the builder to ignore those. + * ‘append_unknown’ (bool(41)) – unknown parameters are + appended to the generated URL as query string argument. + Disable this if you want the builder to ignore those. + + * ‘url_scheme’ (‘Optional’‘[’str(42)‘]’) – Scheme to use in + place of the bound ‘url_scheme’. + + + Return type: str(43) + + Changed in version 2.0: Added the ‘url_scheme’ parameter. + + New in version 0.6: Added the ‘append_unknown’ parameter. -- Method: dispatch (view_func, path_info=None, method=None, catch_http_exceptions=False) @@ -4963,27 +5814,25 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre Parameters: - * ‘view_func’ – a function that is called with the endpoint - as first argument and the value dict as second. Has to - dispatch to the actual view function with this - information. (see above) + * ‘view_func’ (‘Callable’‘[’‘[’str(44)‘, + ’‘Mapping’‘[’str(45)‘, ’‘Any’‘]’‘]’‘, + ’‘WSGIApplication’‘]’) – a function that is called with + the endpoint as first argument and the value dict as + second. Has to dispatch to the actual view function with + this information. (see above) - * ‘path_info’ – the path info to use for matching. - Overrides the path info specified on binding. + * ‘path_info’ (‘Optional’‘[’str(46)‘]’) – the path info to + use for matching. Overrides the path info specified on + binding. - * ‘method’ – the HTTP method used for matching. Overrides - the method specified on binding. + * ‘method’ (‘Optional’‘[’str(47)‘]’) – the HTTP method used + for matching. Overrides the method specified on binding. - * ‘catch_http_exceptions’ – set to ‘True’ to catch any of - the werkzeug ‘HTTPException’s. - - -- Method: get_default_redirect (rule, method, values, query_args) - - A helper that returns the URL to redirect to if it finds one. - This is used for default redirecting only. + * ‘catch_http_exceptions’ (bool(48)) – set to ‘True’ to + catch any of the werkzeug ‘HTTPException’s. - Internal: + Return type: WSGIApplication -- Method: get_host (domain_part) @@ -4991,18 +5840,33 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre domain part is a subdomain in case host matching is disabled or a full host name. + + Parameters: ‘domain_part’ (‘Optional’‘[’str(49)‘]’) – + + + Return type: str(50) + -- Method: make_alias_redirect_url (path, endpoint, values, method, query_args) Internally called to make an alias redirect URL. - -- Method: make_redirect_url (path_info, query_args=None, - domain_part=None) - Creates a redirect URL. + Parameters: + + * ‘path’ (str(51)) – + + * ‘endpoint’ (str(52)) – + + * ‘values’ (‘Mapping’‘[’str(53)‘, ’‘Any’‘]’) – + + * ‘method’ (str(54)) – + + * ‘query_args’ (‘Union’‘[’‘Mapping’‘[’str(55)‘, ’‘Any’‘]’‘, + ’str(56)‘]’) – - Internal: + Return type: str(57) -- Method: match (path_info=None, method=None, return_rule=False, query_args=None, websocket=None) @@ -5074,23 +5938,30 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre Parameters: - * ‘path_info’ – the path info to use for matching. - Overrides the path info specified on binding. + * ‘path_info’ (‘Optional’‘[’str(58)‘]’) – the path info to + use for matching. Overrides the path info specified on + binding. - * ‘method’ – the HTTP method used for matching. Overrides - the method specified on binding. + * ‘method’ (‘Optional’‘[’str(59)‘]’) – the HTTP method used + for matching. Overrides the method specified on binding. - * ‘return_rule’ – return the rule that matched instead of - just the endpoint (defaults to ‘False’). + * ‘return_rule’ (bool(60)) – return the rule that matched + instead of just the endpoint (defaults to ‘False’). - * ‘query_args’ – optional query arguments that are used for - automatic redirects as string or dictionary. It’s + * ‘query_args’ + (‘Optional’‘[’‘Union’‘[’‘Mapping’‘[’str(61)‘, ’‘Any’‘]’‘, + ’str(62)‘]’‘]’) – optional query arguments that are used + for automatic redirects as string or dictionary. It’s currently not possible to use the query arguments for URL matching. - * ‘websocket’ – Match WebSocket instead of HTTP requests. - A websocket request has a ‘ws’ or ‘wss’ ‘url_scheme’. - This overrides that detection. + * ‘websocket’ (‘Optional’‘[’bool(63)‘]’) – Match WebSocket + instead of HTTP requests. A websocket request has a ‘ws’ + or ‘wss’ ‘url_scheme’. This overrides that detection. + + + Return type: Tuple[Union[str(64), *note werkzeug.routing.Rule: + 30.], Mapping[str(65), Any]] New in version 1.0: Added ‘websocket’. @@ -5108,11 +5979,15 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre Parameters: - * ‘path_info’ – the path info to use for matching. - Overrides the path info specified on binding. + * ‘path_info’ (‘Optional’‘[’str(66)‘]’) – the path info to + use for matching. Overrides the path info specified on + binding. - * ‘method’ – the HTTP method used for matching. Overrides - the method specified on binding. + * ‘method’ (‘Optional’‘[’str(67)‘]’) – the HTTP method used + for matching. Overrides the method specified on binding. + + + Return type: bool(68) -- Class: werkzeug.routing.Rule (string, defaults=None, subdomain=None, methods=None, build_only=False, endpoint=None, @@ -5159,7 +6034,7 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre Rule('/all/page/', endpoint='all_entries') ]) - If a user now visits ‘http://example.com/all/page/1’ he will + If a user now visits ‘http://example.com/all/page/1’ they will be redirected to ‘http://example.com/all/’. If ‘redirect_defaults’ is disabled on the ‘Map’ instance this will only affect the URL generation. @@ -5218,7 +6093,7 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre def foo_with_slug(adapter, id): # ask the database for the slug for the old id. this of # course has nothing to do with werkzeug. - return 'foo/' + Foo.get_slug_for_id(id) + return f'foo/{Foo.get_slug_for_id(id)}' url_map = Map([ Rule('/foo/', endpoint='foo'), @@ -5259,6 +6134,37 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre Changed in version 0.6.1: ‘HEAD’ is added to ‘methods’ if ‘GET’ is present. + + Parameters: + + * ‘string’ (str(69)) – + + * ‘defaults’ (‘Optional’‘[’‘Mapping’‘[’str(70)‘, ’‘Any’‘]’‘]’) – + + * ‘subdomain’ (‘Optional’‘[’str(71)‘]’) – + + * ‘methods’ (‘Optional’‘[’‘Iterable’‘[’str(72)‘]’‘]’) – + + * ‘build_only’ (bool(73)) – + + * ‘endpoint’ (‘Optional’‘[’str(74)‘]’) – + + * ‘strict_slashes’ (‘Optional’‘[’bool(75)‘]’) – + + * ‘merge_slashes’ (‘Optional’‘[’bool(76)‘]’) – + + * ‘redirect_to’ (‘Optional’‘[’‘Union’‘[’str(77)‘, + ’‘Callable’‘[’‘[’‘...’‘]’‘, ’str(78)‘]’‘]’‘]’) – + + * ‘alias’ (bool(79)) – + + * ‘host’ (‘Optional’‘[’str(80)‘]’) – + + * ‘websocket’ (bool(81)) – + + + Return type: None(82) + -- Method: empty () Return an unbound copy of this rule. @@ -5267,6 +6173,175 @@ File: werkzeug.info, Node: Maps Rules and Adapters, Next: Rule Factories, Pre another map. See ‘get_empty_kwargs’ to override what keyword arguments are provided to the new copy. + + Return type: *note werkzeug.routing.Rule: 30. + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3/library/stdtypes.html#str + + (2) https://docs.python.org/3/library/stdtypes.html#str + + (3) https://docs.python.org/3/library/functions.html#bool + + (4) https://docs.python.org/3/library/functions.html#bool + + (5) https://docs.python.org/3/library/functions.html#bool + + (6) https://docs.python.org/3/library/stdtypes.html#str + + (7) https://docs.python.org/3/library/functions.html#bool + + (8) https://docs.python.org/3/library/stdtypes.html#str + + (9) https://docs.python.org/3/library/functions.html#bool + + (10) https://docs.python.org/3/library/constants.html#None + + (11) https://docs.python.org/3/library/constants.html#None + + (12) https://docs.python.org/3/library/stdtypes.html#str + + (13) https://docs.python.org/3/library/stdtypes.html#str + + (14) https://docs.python.org/3/library/stdtypes.html#str + + (15) https://docs.python.org/3/library/stdtypes.html#str + + (16) https://docs.python.org/3/library/stdtypes.html#str + + (17) https://docs.python.org/3/library/stdtypes.html#str + + (18) https://docs.python.org/3/library/stdtypes.html#str + + (19) https://docs.python.org/3/library/stdtypes.html#str + + (20) https://docs.python.org/3/library/stdtypes.html#str + + (21) https://docs.python.org/3/library/stdtypes.html#str + + (22) https://docs.python.org/3/library/stdtypes.html#str + + (23) https://docs.python.org/3/library/stdtypes.html#str + + (24) https://docs.python.org/3/library/functions.html#bool + + (25) https://docs.python.org/3/library/stdtypes.html#str + + (26) https://docs.python.org/3/library/constants.html#None + + (27) https://docs.python.org/3/library/stdtypes.html#str + + (28) https://docs.python.org/3/library/stdtypes.html#str + + (29) https://docs.python.org/3/library/stdtypes.html#str + + (30) https://docs.python.org/3/library/stdtypes.html#str + + (31) https://docs.python.org/3/library/stdtypes.html#str + + (32) https://docs.python.org/3/library/stdtypes.html#str + + (33) https://docs.python.org/3/library/stdtypes.html#str + + (34) https://docs.python.org/3/library/stdtypes.html#str + + (35) https://docs.python.org/3/library/stdtypes.html#str + + (36) https://docs.python.org/3/library/stdtypes.html#str + + (37) https://docs.python.org/3/library/stdtypes.html#str + + (38) https://docs.python.org/3/library/stdtypes.html#str + + (39) https://docs.python.org/3/library/stdtypes.html#str + + (40) https://docs.python.org/3/library/functions.html#bool + + (41) https://docs.python.org/3/library/functions.html#bool + + (42) https://docs.python.org/3/library/stdtypes.html#str + + (43) https://docs.python.org/3/library/stdtypes.html#str + + (44) https://docs.python.org/3/library/stdtypes.html#str + + (45) https://docs.python.org/3/library/stdtypes.html#str + + (46) https://docs.python.org/3/library/stdtypes.html#str + + (47) https://docs.python.org/3/library/stdtypes.html#str + + (48) https://docs.python.org/3/library/functions.html#bool + + (49) https://docs.python.org/3/library/stdtypes.html#str + + (50) https://docs.python.org/3/library/stdtypes.html#str + + (51) https://docs.python.org/3/library/stdtypes.html#str + + (52) https://docs.python.org/3/library/stdtypes.html#str + + (53) https://docs.python.org/3/library/stdtypes.html#str + + (54) https://docs.python.org/3/library/stdtypes.html#str + + (55) https://docs.python.org/3/library/stdtypes.html#str + + (56) https://docs.python.org/3/library/stdtypes.html#str + + (57) https://docs.python.org/3/library/stdtypes.html#str + + (58) https://docs.python.org/3/library/stdtypes.html#str + + (59) https://docs.python.org/3/library/stdtypes.html#str + + (60) https://docs.python.org/3/library/functions.html#bool + + (61) https://docs.python.org/3/library/stdtypes.html#str + + (62) https://docs.python.org/3/library/stdtypes.html#str + + (63) https://docs.python.org/3/library/functions.html#bool + + (64) https://docs.python.org/3/library/stdtypes.html#str + + (65) https://docs.python.org/3/library/stdtypes.html#str + + (66) https://docs.python.org/3/library/stdtypes.html#str + + (67) https://docs.python.org/3/library/stdtypes.html#str + + (68) https://docs.python.org/3/library/functions.html#bool + + (69) https://docs.python.org/3/library/stdtypes.html#str + + (70) https://docs.python.org/3/library/stdtypes.html#str + + (71) https://docs.python.org/3/library/stdtypes.html#str + + (72) https://docs.python.org/3/library/stdtypes.html#str + + (73) https://docs.python.org/3/library/functions.html#bool + + (74) https://docs.python.org/3/library/stdtypes.html#str + + (75) https://docs.python.org/3/library/functions.html#bool + + (76) https://docs.python.org/3/library/functions.html#bool + + (77) https://docs.python.org/3/library/stdtypes.html#str + + (78) https://docs.python.org/3/library/stdtypes.html#str + + (79) https://docs.python.org/3/library/functions.html#bool + + (80) https://docs.python.org/3/library/stdtypes.html#str + + (81) https://docs.python.org/3/library/functions.html#bool + + (82) https://docs.python.org/3/library/constants.html#None +  File: werkzeug.info, Node: Rule Factories, Next: Rule Templates, Prev: Maps Rules and Adapters, Up: URL Routing @@ -5285,6 +6360,12 @@ File: werkzeug.info, Node: Rule Factories, Next: Rule Templates, Prev: Maps R Subclasses of ‘RuleFactory’ have to override this method and return an iterable of rules. + + Parameters: ‘map’ (*note werkzeug.routing.Map: 2f.) – + + + Return type: Iterable[*note werkzeug.routing.Rule: 30.] + -- Class: werkzeug.routing.Subdomain (subdomain, rules) All URLs provided by this factory have the subdomain set to a @@ -5304,6 +6385,17 @@ File: werkzeug.info, Node: Rule Factories, Next: Rule Templates, Prev: Maps R listen on a two letter long subdomain that holds the language code for the current request. + + Parameters: + + * ‘subdomain’ (str(1)) – + + * ‘rules’ (‘Iterable’‘[’*note werkzeug.routing.RuleFactory: + 151.‘]’) – + + + Return type: None(2) + -- Class: werkzeug.routing.Submount (path, rules) Like ‘Subdomain’ but prefixes the URL rule with a given string: @@ -5318,6 +6410,17 @@ File: werkzeug.info, Node: Rule Factories, Next: Rule Templates, Prev: Maps R Now the rule ‘'blog/show'’ matches ‘/blog/entry/’. + + Parameters: + + * ‘path’ (str(3)) – + + * ‘rules’ (‘Iterable’‘[’*note werkzeug.routing.RuleFactory: + 151.‘]’) – + + + Return type: None(4) + -- Class: werkzeug.routing.EndpointPrefix (prefix, rules) Prefixes all endpoints (which must be strings for this factory) @@ -5331,6 +6434,31 @@ File: werkzeug.info, Node: Rule Factories, Next: Rule Templates, Prev: Maps R ])]) ]) + + Parameters: + + * ‘prefix’ (str(5)) – + + * ‘rules’ (‘Iterable’‘[’*note werkzeug.routing.RuleFactory: + 151.‘]’) – + + + Return type: None(6) + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3/library/stdtypes.html#str + + (2) https://docs.python.org/3/library/constants.html#None + + (3) https://docs.python.org/3/library/stdtypes.html#str + + (4) https://docs.python.org/3/library/constants.html#None + + (5) https://docs.python.org/3/library/stdtypes.html#str + + (6) https://docs.python.org/3/library/constants.html#None +  File: werkzeug.info, Node: Rule Templates, Next: Custom Converters, Prev: Rule Factories, Up: URL Routing @@ -5356,6 +6484,16 @@ File: werkzeug.info, Node: Rule Templates, Next: Custom Converters, Prev: Rul When a rule template is called the keyword arguments are used to replace the placeholders in all the string parameters. + + Parameters: ‘rules’ (‘Iterable’‘[’*note Rule: 30.‘]’) – + + + Return type: None(1) + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3/library/constants.html#None +  File: werkzeug.info, Node: Custom Converters, Next: Host Matching, Prev: Rule Templates, Up: URL Routing @@ -5364,8 +6502,8 @@ File: werkzeug.info, Node: Custom Converters, Next: Host Matching, Prev: Rule You can add custom converters that add behaviors not provided by the built-in converters. To make a custom converter, subclass -‘BaseConverter’ then pass the new class to the *note Map: 35. -‘converters’ parameter, or add it to *note url_map.converters: 167. +‘BaseConverter’ then pass the new class to the *note Map: 2f. +‘converters’ parameter, or add it to *note url_map.converters: 149. The converter should have a ‘regex’ attribute with a regular expression to match with. If the converter can take arguments in a URL rule, it @@ -5391,7 +6529,7 @@ This example implements a ‘BooleanConverter’ that will match the strings regex = r"(?:yes|no|maybe)" def __init__(self, url_map, maybe=False): - super(BooleanConverter, self).__init__(url_map) + super().__init__(url_map) self.maybe = maybe def to_python(self, value): @@ -5424,7 +6562,7 @@ New in version 0.7. Starting with Werkzeug 0.7 it’s also possible to do matching on the whole host names instead of just the subdomain. To enable this feature -you need to pass ‘host_matching=True’ to the *note Map: 35. constructor +you need to pass ‘host_matching=True’ to the *note Map: 2f. constructor and provide the ‘host’ argument to all routes: url_map = Map([ @@ -5447,8 +6585,8 @@ File: werkzeug.info, Node: WebSockets, Prev: Host Matching, Up: URL Routing New in version 1.0. -If a *note Rule: 36. is created with ‘websocket=True’, it will only -match if the *note Map: 35. is bound to a request with a ‘url_scheme’ of +If a *note Rule: 30. is created with ‘websocket=True’, it will only +match if the *note Map: 2f. is bound to a request with a ‘url_scheme’ of ‘ws’ or ‘wss’. Note: Werkzeug has no further WebSocket support beyond routing. @@ -5462,7 +6600,7 @@ match if the *note Map: 35. is bound to a request with a ‘url_scheme’ of If the only match is a WebSocket rule and the bind is HTTP (or the only match is HTTP and the bind is WebSocket) a ‘WebsocketMismatch’ (derives -from *note BadRequest: 15d.) exception is raised. +from *note BadRequest: e0.) exception is raised. As WebSocket URLs have a different scheme, rules are always built with a scheme and host, ‘force_external=True’ is implied. @@ -5471,7 +6609,7 @@ scheme and host, ‘force_external=True’ is implied. assert url == "ws://example.org/ws"  -File: werkzeug.info, Node: WSGI Helpers, Next: Filesystem Utilities, Prev: URL Routing, Up: Reference +File: werkzeug.info, Node: WSGI Helpers, Next: HTTP Utilities, Prev: URL Routing, Up: Reference 3.3 WSGI Helpers ================ @@ -5479,7 +6617,7 @@ File: werkzeug.info, Node: WSGI Helpers, Next: Filesystem Utilities, Prev: UR The following classes and functions are designed to make working with the WSGI specification easier or operate on the WSGI layer. All the functionality from this module is available on the high-level *note -Request / Response classes: 97. +Request / Response Objects: 93. * Menu: @@ -5521,6 +6659,18 @@ iterator and the input stream. cleanup_session() cleanup_locals() + + Parameters: + + * ‘iterable’ (‘Iterable’‘[’bytes(1)‘]’) – + + * ‘callbacks’ (‘Optional’‘[’‘Union’‘[’‘Callable’‘[’‘[’‘]’‘, + ’None(2)‘]’‘, ’‘Iterable’‘[’‘Callable’‘[’‘[’‘]’‘, + ’None(3)‘]’‘]’‘]’‘]’) – + + + Return type: None(4) + -- Class: werkzeug.wsgi.FileWrapper (file, buffer_size=8192) This class can be used to convert a ‘file’-like object into an @@ -5528,58 +6678,65 @@ iterator and the input stream. read. You should not use this class directly but rather use the *note - wrap_file(): 14f. function that uses the WSGI server’s file wrapper + wrap_file(): 133. function that uses the WSGI server’s file wrapper support if it’s available. New in version 0.5. - If you’re using this object together with a ‘BaseResponse’ you have - to use the ‘direct_passthrough’ mode. + If you’re using this object together with a ‘Response’ you have to + use the ‘direct_passthrough’ mode. Parameters: - * ‘file’ – a ‘file’-like object with a ‘read()’ method. + * ‘file’ (‘IO’‘[’bytes(5)‘]’) – a ‘file’-like object with a + ‘read()’ method. - * ‘buffer_size’ – number of bytes for one iteration. + * ‘buffer_size’ (int(6)) – number of bytes for one iteration. + + + Return type: None(7) -- Class: werkzeug.wsgi.LimitedStream (stream, limit) Wraps a stream so that it doesn’t read more than n bytes. If the stream is exhausted and the caller tries to get more bytes from it - *note on_exhausted(): 191. is called which by default returns an + *note on_exhausted(): 171. is called which by default returns an empty string. The return value of that function is forwarded to the reader function. So if it returns an empty string *note - read(): 192. will return an empty string as well. + read(): 172. will return an empty string as well. The limit however must never be higher than what the stream can - output. Otherwise *note readlines(): 193. will try to read past + output. Otherwise *note readlines(): 173. will try to read past the limit. - Note on WSGI compliance: calls to *note readline(): 194. and - *note readlines(): 193. are not WSGI compliant because it + Note on WSGI compliance: calls to *note readline(): 174. and + *note readlines(): 173. are not WSGI compliant because it passes a size argument to the readline methods. Unfortunately the WSGI PEP is not safely implementable without a size - argument to *note readline(): 194. because there is no EOF + argument to *note readline(): 174. because there is no EOF marker in the stream. As a result of that the use of *note - readline(): 194. is discouraged. + readline(): 174. is discouraged. For the same reason iterating over the *note LimitedStream: - 190. is not portable. It internally calls *note readline(): - 194. + 170. is not portable. It internally calls *note readline(): + 174. - We strongly suggest using *note read(): 192. only or using the - *note make_line_iter(): 195. which safely iterates line-based + We strongly suggest using *note read(): 172. only or using the + *note make_line_iter(): 175. which safely iterates line-based over a WSGI input stream. Parameters: - * ‘stream’ – the stream to wrap. + * ‘stream’ (‘IO’‘[’bytes(8)‘]’) – the stream to wrap. - * ‘limit’ – the limit for the stream, must not be longer than - what the string can provide if the stream does not end with - ‘EOF’ (like ‘wsgi.input’) + * ‘limit’ (int(9)) – the limit for the stream, must not be + longer than what the string can provide if the stream does not + end with ‘EOF’ (like ‘wsgi.input’) + + + Return type: None(10) -- Method: exhaust (chunk_size=65536) @@ -5587,11 +6744,14 @@ iterator and the input stream. limit is reached. - Parameters: ‘chunk_size’ – the size for a chunk. It will read - the chunk until the stream is exhausted and throw away the - results. + Parameters: ‘chunk_size’ (int(11)) – the size for a chunk. It + will read the chunk until the stream is exhausted and throw + away the results. - -- Attribute: is_exhausted + + Return type: None(12) + + -- Property: is_exhausted: bool(13) If the stream is exhausted this attribute is ‘True’. @@ -5600,7 +6760,10 @@ iterator and the input stream. What should happen if a disconnect is detected? The return value of this function is returned from read functions in case the client went away. By default a *note ClientDisconnected: - 199. exception is raised. + 179. exception is raised. + + + Return type: bytes(14) -- Method: on_exhausted () @@ -5608,13 +6771,20 @@ iterator and the input stream. The return value of this function is returned from the reading function. + + Return type: bytes(15) + -- Method: read (size=None) Read ‘size’ bytes or if size is not provided everything is read. - Parameters: ‘size’ – the number of bytes read. + Parameters: ‘size’ (‘Optional’‘[’int(16)‘]’) – the number of + bytes read. + + + Return type: bytes(17) -- Method: readable () @@ -5622,28 +6792,46 @@ iterator and the input stream. If False, read() will raise OSError. + + Return type: bool(18) + -- Method: readline (size=None) Reads one line from the stream. + + Parameters: ‘size’ (‘Optional’‘[’int(19)‘]’) – + + + Return type: bytes(20) + -- Method: readlines (size=None) Reads a file into a list of strings. It calls *note - readline(): 194. until the file is read to the end. It does + readline(): 174. until the file is read to the end. It does support the optional ‘size’ argument if the underlying stream supports it for ‘readline’. + + Parameters: ‘size’ (‘Optional’‘[’int(21)‘]’) – + + + Return type: List[bytes(22)] + -- Method: tell () Returns the position of the stream. New in version 0.9. + + Return type: int(23) + -- Function: werkzeug.wsgi.make_line_iter (stream, limit=None, buffer_size=10240, cap_at_buffer=False) Safely iterates line-based over an input stream. If the input - stream is not a *note LimitedStream: 190. the ‘limit’ parameter is + stream is not a *note LimitedStream: 170. the ‘limit’ parameter is mandatory. This uses the stream’s ‘read()’ method internally as opposite to @@ -5666,25 +6854,30 @@ iterator and the input stream. Parameters: - * ‘stream’ – the stream or iterate to iterate over. + * ‘stream’ (‘Union’‘[’‘Iterable’‘[’bytes(24)‘]’‘, + ’‘IO’‘[’bytes(25)‘]’‘]’) – the stream or iterate to iterate + over. - * ‘limit’ – the limit in bytes for the stream. (Usually content - length. Not necessary if the ‘stream’ is a *note - LimitedStream: 190. + * ‘limit’ (‘Optional’‘[’int(26)‘]’) – the limit in bytes for the + stream. (Usually content length. Not necessary if the + ‘stream’ is a *note LimitedStream: 170. - * ‘buffer_size’ – The optional buffer size. + * ‘buffer_size’ (int(27)) – The optional buffer size. - * ‘cap_at_buffer’ – if this is set chunks are split if they are - longer than the buffer size. Internally this is implemented - that the buffer size might be exhausted by a factor of two - however. + * ‘cap_at_buffer’ (bool(28)) – if this is set chunks are split + if they are longer than the buffer size. Internally this is + implemented that the buffer size might be exhausted by a + factor of two however. + + + Return type: Iterator[bytes(29)] -- Function: werkzeug.wsgi.make_chunk_iter (stream, separator, limit=None, buffer_size=10240, cap_at_buffer=False) - Works like *note make_line_iter(): 195. but accepts a separator + Works like *note make_line_iter(): 175. but accepts a separator which divides chunks. If you want newline based processing you - should use *note make_line_iter(): 195. instead as it supports + should use *note make_line_iter(): 175. instead as it supports arbitrary newline markers. New in version 0.11.10: added support for the ‘cap_at_buffer’ @@ -5697,45 +6890,135 @@ iterator and the input stream. Parameters: - * ‘stream’ – the stream or iterate to iterate over. + * ‘stream’ (‘Union’‘[’‘Iterable’‘[’bytes(30)‘]’‘, + ’‘IO’‘[’bytes(31)‘]’‘]’) – the stream or iterate to iterate + over. - * ‘separator’ – the separator that divides chunks. + * ‘separator’ (bytes(32)) – the separator that divides chunks. - * ‘limit’ – the limit in bytes for the stream. (Usually content - length. Not necessary if the ‘stream’ is otherwise already - limited). + * ‘limit’ (‘Optional’‘[’int(33)‘]’) – the limit in bytes for the + stream. (Usually content length. Not necessary if the + ‘stream’ is otherwise already limited). - * ‘buffer_size’ – The optional buffer size. + * ‘buffer_size’ (int(34)) – The optional buffer size. - * ‘cap_at_buffer’ – if this is set chunks are split if they are - longer than the buffer size. Internally this is implemented - that the buffer size might be exhausted by a factor of two - however. + * ‘cap_at_buffer’ (bool(35)) – if this is set chunks are split + if they are longer than the buffer size. Internally this is + implemented that the buffer size might be exhausted by a + factor of two however. + + + Return type: Iterator[bytes(36)] -- Function: werkzeug.wsgi.wrap_file (environ, file, buffer_size=8192) Wraps a file. This uses the WSGI server’s file wrapper if - available or otherwise the generic *note FileWrapper: 18f. + available or otherwise the generic *note FileWrapper: 16f. New in version 0.5. If the file wrapper from the WSGI server is used it’s important to not iterate over it from inside the application but to pass it through unchanged. If you want to pass out a file wrapper inside a - response object you have to set ‘direct_passthrough’ to ‘True’. + response object you have to set ‘Response.direct_passthrough’ to + ‘True’. - More information about file wrappers are available in PEP 333(1). + More information about file wrappers are available in PEP 333(37). Parameters: - * ‘file’ – a ‘file’-like object with a ‘read()’ method. + * ‘file’ (‘IO’‘[’bytes(38)‘]’) – a ‘file’-like object with a + ‘read()’ method. - * ‘buffer_size’ – number of bytes for one iteration. + * ‘buffer_size’ (int(39)) – number of bytes for one iteration. + + * ‘environ’ (‘WSGIEnvironment’) – + + + Return type: Iterable[bytes(40)] ---------- Footnotes ---------- - (1) https://www.python.org/dev/peps/pep-0333 + (1) https://docs.python.org/3/library/stdtypes.html#bytes + + (2) https://docs.python.org/3/library/constants.html#None + + (3) https://docs.python.org/3/library/constants.html#None + + (4) https://docs.python.org/3/library/constants.html#None + + (5) https://docs.python.org/3/library/stdtypes.html#bytes + + (6) https://docs.python.org/3/library/functions.html#int + + (7) https://docs.python.org/3/library/constants.html#None + + (8) https://docs.python.org/3/library/stdtypes.html#bytes + + (9) https://docs.python.org/3/library/functions.html#int + + (10) https://docs.python.org/3/library/constants.html#None + + (11) https://docs.python.org/3/library/functions.html#int + + (12) https://docs.python.org/3/library/constants.html#None + + (13) https://docs.python.org/3/library/functions.html#bool + + (14) https://docs.python.org/3/library/stdtypes.html#bytes + + (15) https://docs.python.org/3/library/stdtypes.html#bytes + + (16) https://docs.python.org/3/library/functions.html#int + + (17) https://docs.python.org/3/library/stdtypes.html#bytes + + (18) https://docs.python.org/3/library/functions.html#bool + + (19) https://docs.python.org/3/library/functions.html#int + + (20) https://docs.python.org/3/library/stdtypes.html#bytes + + (21) https://docs.python.org/3/library/functions.html#int + + (22) https://docs.python.org/3/library/stdtypes.html#bytes + + (23) https://docs.python.org/3/library/functions.html#int + + (24) https://docs.python.org/3/library/stdtypes.html#bytes + + (25) https://docs.python.org/3/library/stdtypes.html#bytes + + (26) https://docs.python.org/3/library/functions.html#int + + (27) https://docs.python.org/3/library/functions.html#int + + (28) https://docs.python.org/3/library/functions.html#bool + + (29) https://docs.python.org/3/library/stdtypes.html#bytes + + (30) https://docs.python.org/3/library/stdtypes.html#bytes + + (31) https://docs.python.org/3/library/stdtypes.html#bytes + + (32) https://docs.python.org/3/library/stdtypes.html#bytes + + (33) https://docs.python.org/3/library/functions.html#int + + (34) https://docs.python.org/3/library/functions.html#int + + (35) https://docs.python.org/3/library/functions.html#bool + + (36) https://docs.python.org/3/library/stdtypes.html#bytes + + (37) https://www.python.org/dev/peps/pep-0333 + + (38) https://docs.python.org/3/library/stdtypes.html#bytes + + (39) https://docs.python.org/3/library/functions.html#int + + (40) https://docs.python.org/3/library/stdtypes.html#bytes  File: werkzeug.info, Node: Environ Helpers, Next: Convenience Helpers, Prev: Iterator / Stream Helpers, Up: WSGI Helpers @@ -5748,27 +7031,32 @@ information or perform common manipulations: -- Function: werkzeug.wsgi.get_host (environ, trusted_hosts=None) - Return the host for the given WSGI environment. This first checks - the ‘Host’ header. If it’s not present, then ‘SERVER_NAME’ and - ‘SERVER_PORT’ are used. The host will only contain the port if it - is different than the standard port for the protocol. + Return the host for the given WSGI environment. + + The ‘Host’ header is preferred, then ‘SERVER_NAME’ if it’s not set. + The returned host will only contain the port if it is different + than the standard port for the protocol. Optionally, verify that the host is trusted using *note - host_is_trusted(): 19f. and raise a *note SecurityError: 1a0. if it + host_is_trusted(): 17f. and raise a *note SecurityError: 180. if it is not. Parameters: - * ‘environ’ – The WSGI environment to get the host from. + * ‘environ’ (‘WSGIEnvironment’) – A WSGI environment dict. - * ‘trusted_hosts’ – A list of trusted hosts. + * ‘trusted_hosts’ (‘Optional’‘[’‘Iterable’‘[’str(1)‘]’‘]’) – A + list of trusted host names. Returns: Host, with port if necessary. - Raises: *note SecurityError: 1a0. – If the host is not trusted. + Raises: *note SecurityError: 180. – If the host is not trusted. + + + Return type: str(2) -- Function: werkzeug.wsgi.get_content_length (environ) @@ -5779,8 +7067,11 @@ information or perform common manipulations: New in version 0.9. - Parameters: ‘environ’ – the WSGI environ to fetch the content - length from. + Parameters: ‘environ’ (‘WSGIEnvironment’) – the WSGI environ to + fetch the content length from. + + + Return type: Optional[int(3)] -- Function: werkzeug.wsgi.get_input_stream (environ, safe_fallback=True) @@ -5800,109 +7091,104 @@ information or perform common manipulations: Parameters: - * ‘environ’ – the WSGI environ to fetch the stream from. + * ‘environ’ (‘WSGIEnvironment’) – the WSGI environ to fetch the + stream from. - * ‘safe_fallback’ – use an empty stream as a safe fallback when - the content length is not set. Disabling this allows infinite - streams, which can be a denial-of-service risk. + * ‘safe_fallback’ (bool(4)) – use an empty stream as a safe + fallback when the content length is not set. Disabling this + allows infinite streams, which can be a denial-of-service + risk. + + + Return type: IO[bytes(5)] -- Function: werkzeug.wsgi.get_current_url (environ, root_only=False, strip_querystring=False, host_only=False, trusted_hosts=None) - A handy helper function that recreates the full URL as IRI for the - current request or parts of it. Here’s an example: + Recreate the URL for a request from the parts in a WSGI + environment. - >>> from werkzeug.test import create_environ - >>> env = create_environ("/?param=foo", "http://localhost/script") - >>> get_current_url(env) - 'http://localhost/script/?param=foo' - >>> get_current_url(env, root_only=True) - 'http://localhost/script/' - >>> get_current_url(env, host_only=True) - 'http://localhost/' - >>> get_current_url(env, strip_querystring=True) - 'http://localhost/script/' - - This optionally it verifies that the host is in a list of trusted - hosts. If the host is not in there it will raise a *note - SecurityError: 1a0. - - Note that the string returned might contain unicode characters as - the representation is an IRI not an URI. If you need an ASCII only - representation you can use the *note iri_to_uri(): 1a4. function: - - >>> from werkzeug.urls import iri_to_uri - >>> iri_to_uri(get_current_url(env)) - 'http://localhost/script/?param=foo' + The URL is an IRI, not a URI, so it may contain Unicode characters. + Use *note iri_to_uri(): 184. to convert it to ASCII. Parameters: - * ‘environ’ – the WSGI environment to get the current URL from. + * ‘environ’ (‘WSGIEnvironment’) – The WSGI environment to get + the URL parts from. - * ‘root_only’ – set ‘True’ if you only want the root URL. + * ‘root_only’ (bool(6)) – Only build the root path, don’t + include the remaining path or query string. - * ‘strip_querystring’ – set to ‘True’ if you don’t want the - querystring. + * ‘strip_querystring’ (bool(7)) – Don’t include the query + string. - * ‘host_only’ – set to ‘True’ if the host URL should be - returned. + * ‘host_only’ (bool(8)) – Only build the scheme and host. - * ‘trusted_hosts’ – a list of trusted hosts, see *note - host_is_trusted(): 19f. for more information. + * ‘trusted_hosts’ (‘Optional’‘[’‘Iterable’‘[’str(9)‘]’‘]’) – A + list of trusted host names to validate the host against. + + + Return type: str(10) -- Function: werkzeug.wsgi.get_query_string (environ) Returns the ‘QUERY_STRING’ from the WSGI environment. This also - takes care about the WSGI decoding dance on Python 3 environments - as a native string. The string returned will be restricted to - ASCII characters. + takes care of the WSGI decoding dance. The string returned will be + restricted to ASCII characters. + + + Parameters: ‘environ’ (‘WSGIEnvironment’) – WSGI environment to get + the query string from. + + + Return type: str(11) New in version 0.9. - - Parameters: ‘environ’ – the WSGI environment object to get the - query string from. - -- Function: werkzeug.wsgi.get_script_name (environ, charset='utf-8', errors='replace') - Returns the ‘SCRIPT_NAME’ from the WSGI environment and properly - decodes it. This also takes care about the WSGI decoding dance on - Python 3 environments. if the ‘charset’ is set to ‘None’ a - bytestring is returned. - - New in version 0.9. + Return the ‘SCRIPT_NAME’ from the WSGI environment and decode it + unless ‘charset’ is set to ‘None’. Parameters: - * ‘environ’ – the WSGI environment object to get the path from. + * ‘environ’ (‘WSGIEnvironment’) – WSGI environment to get the + path from. - * ‘charset’ – the charset for the path, or ‘None’ if no decoding - should be performed. + * ‘charset’ (str(12)) – The charset for the path, or ‘None’ if + no decoding should be performed. - * ‘errors’ – the decoding error handling. + * ‘errors’ (str(13)) – The decoding error handling. + + + Return type: str(14) + + New in version 0.9. -- Function: werkzeug.wsgi.get_path_info (environ, charset='utf-8', errors='replace') - Returns the ‘PATH_INFO’ from the WSGI environment and properly - decodes it. This also takes care about the WSGI decoding dance on - Python 3 environments. if the ‘charset’ is set to ‘None’ a - bytestring is returned. - - New in version 0.9. + Return the ‘PATH_INFO’ from the WSGI environment and decode it + unless ‘charset’ is ‘None’. Parameters: - * ‘environ’ – the WSGI environment object to get the path from. + * ‘environ’ (‘WSGIEnvironment’) – WSGI environment to get the + path from. - * ‘charset’ – the charset for the path info, or ‘None’ if no - decoding should be performed. + * ‘charset’ (str(15)) – The charset for the path info, or ‘None’ + if no decoding should be performed. - * ‘errors’ – the decoding error handling. + * ‘errors’ (str(16)) – The decoding error handling. + + + Return type: str(17) + + New in version 0.9. -- Function: werkzeug.wsgi.pop_path_info (environ, charset='utf-8', errors='replace') @@ -5911,7 +7197,7 @@ information or perform common manipulations: onto ‘SCRIPT_NAME’. Returns ‘None’ if there is nothing left on ‘PATH_INFO’. - If the ‘charset’ is set to ‘None’ a bytestring is returned. + If the ‘charset’ is set to ‘None’ bytes are returned. If there are empty segments (‘'/foo//bar’) these are ignored but properly pushed to the ‘SCRIPT_NAME’: @@ -5932,13 +7218,25 @@ information or perform common manipulations: New in version 0.5. - Parameters: ‘environ’ – the WSGI environment that is modified. + Parameters: + + * ‘environ’ (‘WSGIEnvironment’) – the WSGI environment that is + modified. + + * ‘charset’ (str(18)) – The ‘encoding’ parameter passed to + ‘bytes.decode()’. + + * ‘errors’ (str(19)) – The ‘errors’ paramater passed to + ‘bytes.decode()’. + + + Return type: Optional[str(20)] -- Function: werkzeug.wsgi.peek_path_info (environ, charset='utf-8', errors='replace') Returns the next segment on the ‘PATH_INFO’ or ‘None’ if there is - none. Works like *note pop_path_info(): 1a8. without modifying the + none. Works like *note pop_path_info(): 188. without modifying the environment: >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} @@ -5947,7 +7245,7 @@ information or perform common manipulations: >>> peek_path_info(env) 'a' - If the ‘charset’ is set to ‘None’ a bytestring is returned. + If the ‘charset’ is set to ‘None’ bytes are returned. Changed in version 0.9: The path is now decoded and a charset and encoding parameter can be provided. @@ -5955,25 +7253,35 @@ information or perform common manipulations: New in version 0.5. - Parameters: ‘environ’ – the WSGI environment that is checked. + Parameters: + + * ‘environ’ (‘WSGIEnvironment’) – the WSGI environment that is + checked. + + * ‘charset’ (str(21)) – + + * ‘errors’ (str(22)) – + + + Return type: Optional[str(23)] -- Function: werkzeug.wsgi.extract_path_info (environ_or_baseurl, path_or_url, charset='utf-8', errors='werkzeug.url_quote', collapse_http_schemes=True) Extracts the path info from the given URL (or WSGI environment) and - path. The path info returned is a unicode string, not a bytestring - suitable for a WSGI environment. The URLs might also be IRIs. + path. The path info returned is a string. The URLs might also be + IRIs. If the path info could not be determined, ‘None’ is returned. Some examples: >>> extract_path_info('http://example.com/app', '/app/hello') - u'/hello' + '/hello' >>> extract_path_info('http://example.com/app', ... 'https://example.com/app/hello') - u'/hello' + '/hello' >>> extract_path_info('http://example.com/app', ... 'https://example.com/app/hello', ... collapse_http_schemes=False) is None @@ -5985,20 +7293,25 @@ information or perform common manipulations: Parameters: - * ‘environ_or_baseurl’ – a WSGI environment dict, a base URL or - base IRI. This is the root of the application. + * ‘environ_or_baseurl’ (‘Union’‘[’str(24)‘, + ’‘WSGIEnvironment’‘]’) – a WSGI environment dict, a base URL + or base IRI. This is the root of the application. - * ‘path_or_url’ – an absolute path from the server root, a - relative path (in which case it’s the path info) or a full - URL. Also accepts IRIs and unicode parameters. + * ‘path_or_url’ (‘Union’‘[’str(25)‘, + ’‘werkzeug.urls._URLTuple’‘]’) – an absolute path from the + server root, a relative path (in which case it’s the path + info) or a full URL. - * ‘charset’ – the charset for byte data in URLs + * ‘charset’ (str(26)) – the charset for byte data in URLs - * ‘errors’ – the error handling on decode + * ‘errors’ (str(27)) – the error handling on decode - * ‘collapse_http_schemes’ – if set to ‘False’ the algorithm does - not assume that http and https on the same server point to the - same resource. + * ‘collapse_http_schemes’ (bool(28)) – if set to ‘False’ the + algorithm does not assume that http and https on the same + server point to the same resource. + + + Return type: Optional[str(29)] Changed in version 0.15: The ‘errors’ parameter defaults to leaving invalid bytes quoted instead of replacing them. @@ -6007,19 +7320,87 @@ information or perform common manipulations: -- Function: werkzeug.wsgi.host_is_trusted (hostname, trusted_list) - Checks if a host is trusted against a list. This also takes care - of port normalization. - - New in version 0.9. + Check if a host matches a list of trusted names. Parameters: - * ‘hostname’ – the hostname to check + * ‘hostname’ (str(30)) – The name to check. - * ‘trusted_list’ – a list of hostnames to check against. If a - hostname starts with a dot it will match against all - subdomains as well. + * ‘trusted_list’ (‘Iterable’‘[’str(31)‘]’) – A list of valid + names to match. If a name starts with a dot it will match all + subdomains. + + + Return type: bool(32) + + New in version 0.9. + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3/library/stdtypes.html#str + + (2) https://docs.python.org/3/library/stdtypes.html#str + + (3) https://docs.python.org/3/library/functions.html#int + + (4) https://docs.python.org/3/library/functions.html#bool + + (5) https://docs.python.org/3/library/stdtypes.html#bytes + + (6) https://docs.python.org/3/library/functions.html#bool + + (7) https://docs.python.org/3/library/functions.html#bool + + (8) https://docs.python.org/3/library/functions.html#bool + + (9) https://docs.python.org/3/library/stdtypes.html#str + + (10) https://docs.python.org/3/library/stdtypes.html#str + + (11) https://docs.python.org/3/library/stdtypes.html#str + + (12) https://docs.python.org/3/library/stdtypes.html#str + + (13) https://docs.python.org/3/library/stdtypes.html#str + + (14) https://docs.python.org/3/library/stdtypes.html#str + + (15) https://docs.python.org/3/library/stdtypes.html#str + + (16) https://docs.python.org/3/library/stdtypes.html#str + + (17) https://docs.python.org/3/library/stdtypes.html#str + + (18) https://docs.python.org/3/library/stdtypes.html#str + + (19) https://docs.python.org/3/library/stdtypes.html#str + + (20) https://docs.python.org/3/library/stdtypes.html#str + + (21) https://docs.python.org/3/library/stdtypes.html#str + + (22) https://docs.python.org/3/library/stdtypes.html#str + + (23) https://docs.python.org/3/library/stdtypes.html#str + + (24) https://docs.python.org/3/library/stdtypes.html#str + + (25) https://docs.python.org/3/library/stdtypes.html#str + + (26) https://docs.python.org/3/library/stdtypes.html#str + + (27) https://docs.python.org/3/library/stdtypes.html#str + + (28) https://docs.python.org/3/library/functions.html#bool + + (29) https://docs.python.org/3/library/stdtypes.html#str + + (30) https://docs.python.org/3/library/stdtypes.html#str + + (31) https://docs.python.org/3/library/stdtypes.html#str + + (32) https://docs.python.org/3/library/functions.html#bool  File: werkzeug.info, Node: Convenience Helpers, Next: Bytes Strings and Encodings, Prev: Environ Helpers, Up: WSGI Helpers @@ -6038,6 +7419,13 @@ File: werkzeug.info, Node: Convenience Helpers, Next: Bytes Strings and Encodi def application(environ, start_response): return Response('Hello World!') + + Parameters: ‘f’ (‘Callable’‘[’‘[’‘...’‘]’‘, ’‘WSGIApplication’‘]’) + – + + + Return type: WSGIApplication + -- Function: werkzeug.testapp.test_app (environ, start_response) Simple test application that dumps the environment. You can use it @@ -6051,32 +7439,42 @@ File: werkzeug.info, Node: Convenience Helpers, Next: Bytes Strings and Encodi The application displays important information from the WSGI environment, the Python interpreter and the installed libraries. + + Parameters: + + * ‘environ’ (‘WSGIEnvironment’) – + + * ‘start_response’ (‘StartResponse’) – + + + Return type: Iterable[bytes(1)] + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3/library/stdtypes.html#bytes +  File: werkzeug.info, Node: Bytes Strings and Encodings, Next: Raw Request URI and Path Encoding, Prev: Convenience Helpers, Up: WSGI Helpers 3.3.4 Bytes, Strings, and Encodings ----------------------------------- -The WSGI environment on Python 3 works slightly different than it does -on Python 2. Werkzeug hides the differences from you if you use the -higher level APIs. +The values in HTTP requests come in as bytes representing (or encoded +to) ASCII. The WSGI specification ( PEP 3333(1)) decided to always use +the ‘str’ type to represent values. To accomplish this, the raw bytes +are decoded using the ISO-8859-1 charset to produce a string. -The WSGI specification (PEP 3333(1)) decided to always use the native -‘str’ type. On Python 2 this means the raw bytes are passed through and -can be decoded directly. On Python 3, however, the raw bytes are always -decoded using the ISO-8859-1 charset to produce a Unicode string. - -Python 3 Unicode strings in the WSGI environment are restricted to -ISO-8859-1 code points. If a string read from the environment might -contain characters outside that charset, it must first be decoded to -bytes as ISO-8859-1, then encoded to a Unicode string using the proper -charset (typically UTF-8). The reverse is done when writing to the -environ. This is known as the “WSGI encoding dance”. +Strings in the WSGI environment are restricted to ISO-8859-1 code +points. If a string read from the environment might contain characters +outside that charset, it must first be decoded to bytes as ISO-8859-1, +then encoded to a string using the proper charset (typically UTF-8). +The reverse is done when writing to the environ. This is known as the +“WSGI encoding dance”. Werkzeug provides functions to deal with this automatically so that you don’t need to be aware of the inner workings. Use the functions on this -page as well as *note EnvironHeaders(): bc. to read data out of the WSGI -environment. +page as well as *note EnvironHeaders(): 18f. to read data out of the +WSGI environment. Applications should avoid manually creating or modifying a WSGI environment unless they take care of the proper encoding or decoding @@ -6085,7 +7483,7 @@ decoding as necessary. ---------- Footnotes ---------- - (1) https://www.python.org/dev/peps/pep-3333/#unicode-issues + (1) https://www.python.org/dev/peps/pep-3333  File: werkzeug.info, Node: Raw Request URI and Path Encoding, Prev: Bytes Strings and Encodings, Up: WSGI Helpers @@ -6098,7 +7496,7 @@ For example, the raw path ‘/hello%2fworld’ would show up from the WSGI server to Werkzeug as ‘/hello/world’. This loses the information that the slash was a raw character as opposed to a path separator. -The WSGI specification (PEP 3333(1)) does not provide a way to get the +The WSGI specification ( PEP 3333(1)) does not provide a way to get the original value, so it is impossible to route some types of data in the path. The most compatible way to work around this is to send problematic data in the query string instead of the path. @@ -6113,37 +7511,12 @@ guaranteed to be present. ---------- Footnotes ---------- - (1) https://www.python.org/dev/peps/pep-3333/#unicode-issues + (1) https://www.python.org/dev/peps/pep-3333  -File: werkzeug.info, Node: Filesystem Utilities, Next: HTTP Utilities, Prev: WSGI Helpers, Up: Reference +File: werkzeug.info, Node: HTTP Utilities, Next: Data Structures, Prev: WSGI Helpers, Up: Reference -3.4 Filesystem Utilities -======================== - -Various utilities for the local filesystem. - - -- Class: werkzeug.filesystem.BrokenFilesystemWarning - - The warning used by Werkzeug to signal a broken filesystem. Will - only be used once per runtime. - - -- Function: werkzeug.filesystem.get_filesystem_encoding () - - Returns the filesystem encoding that should be used. Note that - this is different from the Python understanding of the filesystem - encoding which might be deeply flawed. Do not use this value - against Python’s unicode APIs because it might be different. See - *note The Filesystem: 1b5. for the exact behavior. - - The concept of a filesystem encoding in generally is not something - you should rely on. As such if you ever need to use this function - except for writing wrapper code reconsider. - - -File: werkzeug.info, Node: HTTP Utilities, Next: Data Structures, Prev: Filesystem Utilities, Up: Reference - -3.5 HTTP Utilities +3.4 HTTP Utilities ================== Werkzeug provides a couple of functions to parse and generate HTTP @@ -6153,7 +7526,7 @@ also exposed from request and response objects. * Menu: -* Date Functions:: +* Datetime Functions:: * Header Parsing: Header Parsing<2>. * Header Utilities:: * Cookies:: @@ -6162,78 +7535,111 @@ also exposed from request and response objects. * Form Data Parsing::  -File: werkzeug.info, Node: Date Functions, Next: Header Parsing<2>, Up: HTTP Utilities +File: werkzeug.info, Node: Datetime Functions, Next: Header Parsing<2>, Up: HTTP Utilities -3.5.1 Date Functions --------------------- +3.4.1 Datetime Functions +------------------------ -The following functions simplify working with times in an HTTP context. -Werkzeug uses offset-naive datetime(1) objects internally that store the -time in UTC. If you’re working with timezones in your application make -sure to replace the tzinfo attribute with a UTC timezone information -before processing the values. +These functions simplify working with times in an HTTP context. +Werkzeug produces timezone-aware datetime(1) objects in UTC. When +passing datetime objects to Werkzeug, it assumes any naive datetime is +in UTC. - -- Function: werkzeug.http.cookie_date (expires=None) +When comparing datetime values from Werkzeug, your own datetime objects +must also be timezone-aware, or you must make the values from Werkzeug +naive. - Formats the time to ensure compatibility with Netscape’s cookie - standard. + * ‘dt = datetime.now(timezone.utc)’ gets the current time in UTC. - Accepts a floating point number expressed in seconds since the - epoch in, a datetime object or a timetuple. All times in UTC. The - *note parse_date(): 1ba. function can be used to parse such a date. + * ‘dt = datetime(..., tzinfo=timezone.utc)’ creates a time in UTC. - Outputs a string in the format ‘Wdy, DD-Mon-YYYY HH:MM:SS GMT’. + * ‘dt = dt.replace(tzinfo=timezone.utc)’ makes a naive object aware + by assuming it’s in UTC. - - Parameters: ‘expires’ – If provided that date is used, otherwise - the current. - - -- Function: werkzeug.http.http_date (timestamp=None) - - Formats the time to match the RFC1123 date format. - - Accepts a floating point number expressed in seconds since the - epoch in, a datetime object or a timetuple. All times in UTC. The - *note parse_date(): 1ba. function can be used to parse such a date. - - Outputs a string in the format ‘Wdy, DD Mon YYYY HH:MM:SS GMT’. - - - Parameters: ‘timestamp’ – If provided that date is used, otherwise - the current. + * ‘dt = dt.replace(tzinfo=None)’ makes an aware object naive. -- Function: werkzeug.http.parse_date (value) - Parse one of the following date formats into a datetime object: + Parse an RFC 2822(2) date into a timezone-aware + datetime.datetime(3) object, or ‘None’ if parsing fails. - Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 - Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036 - Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format - - If parsing fails the return value is ‘None’. + This is a wrapper for email.utils.parsedate_to_datetime()(4). It + returns ‘None’ if parsing fails instead of raising an exception, + and always returns a timezone-aware datetime object. If the string + doesn’t have timezone information, it is assumed to be UTC. - Parameters: ‘value’ – a string with a supported date format. + Parameters: ‘value’ (‘Optional’‘[’str(5)‘]’) – A string with a + supported date format. - Returns: a datetime.datetime(2) object. + Return type: Optional[datetime.datetime(6)] + + Changed in version 2.0: Return a timezone-aware datetime object. + Use ‘email.utils.parsedate_to_datetime’. + + -- Function: werkzeug.http.http_date (timestamp=None) + + Format a datetime object or timestamp into an RFC 2822(7) date + string. + + This is a wrapper for email.utils.format_datetime()(8). It assumes + naive datetime objects are in UTC instead of raising an exception. + + + Parameters: ‘timestamp’ + (‘Optional’‘[’‘Union’‘[’datetime.datetime(9)‘, ’datetime.date(10)‘, + ’int(11)‘, ’float(12)‘, ’time.struct_time(13)‘]’‘]’) – The datetime + or timestamp to format. Defaults to the current time. + + + Return type: str(14) + + Changed in version 2.0: Use ‘email.utils.format_datetime’. Accept + ‘date’ objects. ---------- Footnotes ---------- (1) https://docs.python.org/3/library/datetime.html#datetime.datetime - (2) https://docs.python.org/3/library/datetime.html#datetime.datetime + (2) https://tools.ietf.org/html/rfc2822.html + + (3) https://docs.python.org/3/library/datetime.html#datetime.datetime + + (4) +https://docs.python.org/3/library/email.utils.html#email.utils.parsedate_to_datetime + + (5) https://docs.python.org/3/library/stdtypes.html#str + + (6) https://docs.python.org/3/library/datetime.html#datetime.datetime + + (7) https://tools.ietf.org/html/rfc2822.html + + (8) +https://docs.python.org/3/library/email.utils.html#email.utils.format_datetime + + (9) https://docs.python.org/3/library/datetime.html#datetime.datetime + + (10) https://docs.python.org/3/library/datetime.html#datetime.date + + (11) https://docs.python.org/3/library/functions.html#int + + (12) https://docs.python.org/3/library/functions.html#float + + (13) https://docs.python.org/3/library/time.html#time.struct_time + + (14) https://docs.python.org/3/library/stdtypes.html#str  -File: werkzeug.info, Node: Header Parsing<2>, Next: Header Utilities, Prev: Date Functions, Up: HTTP Utilities +File: werkzeug.info, Node: Header Parsing<2>, Next: Header Utilities, Prev: Datetime Functions, Up: HTTP Utilities -3.5.2 Header Parsing +3.4.2 Header Parsing -------------------- The following functions can be used to parse incoming HTTP headers. Because Python does not provide data structures with the semantics required by RFC 2616(1), Werkzeug implements some custom data structures -that are *note documented separately: 1bd. +that are *note documented separately: 197. -- Function: werkzeug.http.parse_options_header (value, multiple=False) @@ -6245,7 +7651,7 @@ that are *note documented separately: 1bd. This should not be used to parse ‘Cache-Control’ like headers that use a slightly different format. For these headers use the *note - parse_dict_header(): 1bf. function. + parse_dict_header(): 199. function. Changed in version 0.15: RFC 2231(2) parameter continuations are handled. @@ -6255,18 +7661,22 @@ that are *note documented separately: 1bd. Parameters: - * ‘value’ – the header to parse. + * ‘value’ (‘Optional’‘[’str(3)‘]’) – the header to parse. - * ‘multiple’ – Whether try to parse and return multiple MIME - types + * ‘multiple’ (bool(4)) – Whether try to parse and return + multiple MIME types Returns: (mimetype, options) or (mimetype, options, mimetype, options, …) if multiple=True + + Return type: Union[Tuple[str(5), Dict[str(6), str(7)]], Tuple[Any, + …]] + -- Function: werkzeug.http.parse_set_header (value, on_update=None) - Parse a set-like header and return a *note HeaderSet: 1c1. object: + Parse a set-like header and return a *note HeaderSet: e5. object: >>> hs = parse_set_header('token, "quoted value"') @@ -6281,18 +7691,23 @@ that are *note documented separately: 1bd. HeaderSet(['token', 'quoted value']) To create a header from the ‘HeaderSet’ again, use the *note - dump_header(): 1c2. function. + dump_header(): 19b. function. Parameters: - * ‘value’ – a set header to be parsed. + * ‘value’ (‘Optional’‘[’str(8)‘]’) – a set header to be parsed. - * ‘on_update’ – an optional callable that is called every time a - value on the *note HeaderSet: 1c1. object is changed. + * ‘on_update’ (‘Optional’‘[’‘Callable’‘[’‘[’*note + werkzeug.datastructures.HeaderSet: e5.‘]’‘, ’None(9)‘]’‘]’) – + an optional callable that is called every time a value on the + *note HeaderSet: e5. object is changed. - Returns: a *note HeaderSet: 1c1. + Returns: a *note HeaderSet: e5. + + + Return type: *note werkzeug.datastructures.HeaderSet: e5. -- Function: werkzeug.http.parse_list_header (value) @@ -6303,22 +7718,25 @@ that are *note documented separately: 1bd. a comma. A non-quoted string could have quotes in the middle. Quotes are removed automatically after parsing. - It basically works like *note parse_set_header(): 1c0. just that + It basically works like *note parse_set_header(): 19a. just that items may appear multiple times and case sensitivity is preserved. - The return value is a standard list(3): + The return value is a standard list(10): >>> parse_list_header('token, "quoted value"') ['token', 'quoted value'] - To create a header from the list(4) again, use the *note - dump_header(): 1c2. function. + To create a header from the list(11) again, use the *note + dump_header(): 19b. function. - Parameters: ‘value’ – a string with a list header. + Parameters: ‘value’ (str(12)) – a string with a list header. - Returns: list(5) + Returns: list(13) + + + Return type: List[str(14)] -- Function: werkzeug.http.parse_dict_header (value, cls=) @@ -6339,21 +7757,25 @@ that are *note documented separately: 1bd. >>> parse_dict_header('key_without_value') {'key_without_value': None} - To create a header from the dict(6) again, use the *note - dump_header(): 1c2. function. + To create a header from the dict(15) again, use the *note + dump_header(): 19b. function. Changed in version 0.9: Added support for ‘cls’ argument. Parameters: - * ‘value’ – a string with a dict header. + * ‘value’ (str(16)) – a string with a dict header. - * ‘cls’ – callable to use for storage of parsed results. + * ‘cls’ (‘Type’‘[’dict(17)‘]’) – callable to use for storage of + parsed results. Returns: an instance of ‘cls’ + + Return type: Dict[str(18), str(19)] + -- Function: werkzeug.http.parse_accept_header (value[, class]) Parses an HTTP Accept-* header. This does not implement a complete @@ -6370,14 +7792,20 @@ that are *note documented separately: 1bd. Parameters: - * ‘value’ – the accept header string to be parsed. + * ‘value’ (‘Optional’‘[’str(20)‘]’) – the accept header string + to be parsed. - * ‘cls’ – the wrapper class for the return value (can be - ‘Accept’ or a subclass thereof) + * ‘cls’ + (‘Optional’‘[’‘Type’‘[’‘werkzeug.http._TAnyAccept’‘]’‘]’) – + the wrapper class for the return value (can be ‘Accept’ or a + subclass thereof) Returns: an instance of ‘cls’. + + Return type: werkzeug.http._TAnyAccept + -- Function: werkzeug.http.parse_cache_control_header (value, on_update=None, cls=None) @@ -6386,72 +7814,109 @@ that are *note documented separately: 1bd. responsibility to not use the wrong control statements. New in version 0.5: The ‘cls’ was added. If not specified an - immutable *note RequestCacheControl: 13d. is returned. + immutable *note RequestCacheControl: ad. is returned. Parameters: - * ‘value’ – a cache control header to be parsed. + * ‘value’ (‘Optional’‘[’str(21)‘]’) – a cache control header to + be parsed. - * ‘on_update’ – an optional callable that is called every time a - value on the ‘CacheControl’ object is changed. + * ‘on_update’ + (‘Optional’‘[’‘Callable’‘[’‘[’‘werkzeug.http._TAnyCC’‘]’‘, + ’None(22)‘]’‘]’) – an optional callable that is called every + time a value on the ‘CacheControl’ object is changed. - * ‘cls’ – the class for the returned object. By default *note - RequestCacheControl: 13d. is used. + * ‘cls’ (‘Optional’‘[’‘Type’‘[’‘werkzeug.http._TAnyCC’‘]’‘]’) – + the class for the returned object. By default *note + RequestCacheControl: ad. is used. Returns: a ‘cls’ object. + + Return type: werkzeug.http._TAnyCC + -- Function: werkzeug.http.parse_authorization_header (value) Parse an HTTP basic/digest authorization header transmitted by the web browser. The return value is either ‘None’ if the header was - invalid or not given, otherwise an *note Authorization: 12f. - object. + invalid or not given, otherwise an *note Authorization: 7a. object. - Parameters: ‘value’ – the authorization header to parse. + Parameters: ‘value’ (‘Optional’‘[’str(23)‘]’) – the authorization + header to parse. - Returns: a *note Authorization: 12f. object or ‘None’. + Returns: a *note Authorization: 7a. object or ‘None’. + + + Return type: Optional[*note werkzeug.datastructures.Authorization: + 7a.] -- Function: werkzeug.http.parse_www_authenticate_header (value, on_update=None) Parse an HTTP WWW-Authenticate header into a *note WWWAuthenticate: - 1c8. object. + 140. object. Parameters: - * ‘value’ – a WWW-Authenticate header to parse. + * ‘value’ (‘Optional’‘[’str(24)‘]’) – a WWW-Authenticate header + to parse. - * ‘on_update’ – an optional callable that is called every time a - value on the *note WWWAuthenticate: 1c8. object is changed. + * ‘on_update’ (‘Optional’‘[’‘Callable’‘[’‘[’*note + werkzeug.datastructures.WWWAuthenticate: 140.‘]’‘, + ’None(25)‘]’‘]’) – an optional callable that is called every + time a value on the *note WWWAuthenticate: 140. object is + changed. - Returns: a *note WWWAuthenticate: 1c8. object. + Returns: a *note WWWAuthenticate: 140. object. + + + Return type: *note werkzeug.datastructures.WWWAuthenticate: 140. -- Function: werkzeug.http.parse_if_range_header (value) Parses an if-range header which can be an etag or a date. Returns - a *note IfRange: 143. object. + a *note IfRange: cc. object. + + Changed in version 2.0: If the value represents a datetime, it is + timezone-aware. New in version 0.7. + + Parameters: ‘value’ (‘Optional’‘[’str(26)‘]’) – + + + Return type: *note werkzeug.datastructures.IfRange: cc. + -- Function: werkzeug.http.parse_range_header (value, make_inclusive=True) - Parses a range header into a *note Range: 146. object. If the + Parses a range header into a *note Range: e8. object. If the header is missing or malformed ‘None’ is returned. ‘ranges’ is a list of ‘(start, stop)’ tuples where the ranges are non-inclusive. New in version 0.7. + + Parameters: + + * ‘value’ (‘Optional’‘[’str(27)‘]’) – + + * ‘make_inclusive’ (bool(28)) – + + + Return type: Optional[*note werkzeug.datastructures.Range: e8.] + -- Function: werkzeug.http.parse_content_range_header (value, on_update=None) - Parses a range header into a *note ContentRange: 14c. object or + Parses a range header into a *note ContentRange: 113. object or ‘None’ if parsing is not possible. New in version 0.7. @@ -6459,10 +7924,18 @@ that are *note documented separately: 1bd. Parameters: - * ‘value’ – a content range header to be parsed. + * ‘value’ (‘Optional’‘[’str(29)‘]’) – a content range header to + be parsed. - * ‘on_update’ – an optional callable that is called every time a - value on the *note ContentRange: 14c. object is changed. + * ‘on_update’ (‘Optional’‘[’‘Callable’‘[’‘[’*note + werkzeug.datastructures.ContentRange: 113.‘]’‘, + ’None(30)‘]’‘]’) – an optional callable that is called every + time a value on the *note ContentRange: 113. object is + changed. + + + Return type: Optional[*note werkzeug.datastructures.ContentRange: + 113.] ---------- Footnotes ---------- @@ -6470,18 +7943,66 @@ that are *note documented separately: 1bd. (2) https://tools.ietf.org/html/rfc2231.html - (3) https://docs.python.org/3/library/stdtypes.html#list + (3) https://docs.python.org/3/library/stdtypes.html#str - (4) https://docs.python.org/3/library/stdtypes.html#list + (4) https://docs.python.org/3/library/functions.html#bool - (5) https://docs.python.org/3/library/stdtypes.html#list + (5) https://docs.python.org/3/library/stdtypes.html#str - (6) https://docs.python.org/3/library/stdtypes.html#dict + (6) https://docs.python.org/3/library/stdtypes.html#str + + (7) https://docs.python.org/3/library/stdtypes.html#str + + (8) https://docs.python.org/3/library/stdtypes.html#str + + (9) https://docs.python.org/3/library/constants.html#None + + (10) https://docs.python.org/3/library/stdtypes.html#list + + (11) https://docs.python.org/3/library/stdtypes.html#list + + (12) https://docs.python.org/3/library/stdtypes.html#str + + (13) https://docs.python.org/3/library/stdtypes.html#list + + (14) https://docs.python.org/3/library/stdtypes.html#str + + (15) https://docs.python.org/3/library/stdtypes.html#dict + + (16) https://docs.python.org/3/library/stdtypes.html#str + + (17) https://docs.python.org/3/library/stdtypes.html#dict + + (18) https://docs.python.org/3/library/stdtypes.html#str + + (19) https://docs.python.org/3/library/stdtypes.html#str + + (20) https://docs.python.org/3/library/stdtypes.html#str + + (21) https://docs.python.org/3/library/stdtypes.html#str + + (22) https://docs.python.org/3/library/constants.html#None + + (23) https://docs.python.org/3/library/stdtypes.html#str + + (24) https://docs.python.org/3/library/stdtypes.html#str + + (25) https://docs.python.org/3/library/constants.html#None + + (26) https://docs.python.org/3/library/stdtypes.html#str + + (27) https://docs.python.org/3/library/stdtypes.html#str + + (28) https://docs.python.org/3/library/functions.html#bool + + (29) https://docs.python.org/3/library/stdtypes.html#str + + (30) https://docs.python.org/3/library/constants.html#None  File: werkzeug.info, Node: Header Utilities, Next: Cookies, Prev: Header Parsing<2>, Up: HTTP Utilities -3.5.3 Header Utilities +3.4.3 Header Utilities ---------------------- The following utilities operate on HTTP headers well but do not parse @@ -6497,11 +8018,14 @@ HTTP header strings from the parsed data. New in version 0.5. - Parameters: ‘header’ – the header to test. + Parameters: ‘header’ (str(1)) – the header to test. Returns: ‘True’ if it’s an entity header, ‘False’ otherwise. + + Return type: bool(2) + -- Function: werkzeug.http.is_hop_by_hop_header (header) Check if a header is an HTTP/1.1 “Hop-by-Hop” header. @@ -6509,18 +8033,21 @@ HTTP header strings from the parsed data. New in version 0.5. - Parameters: ‘header’ – the header to test. + Parameters: ‘header’ (str(3)) – the header to test. Returns: ‘True’ if it’s an HTTP/1.1 “Hop-by-Hop” header, ‘False’ otherwise. + + Return type: bool(4) + -- Function: werkzeug.http.remove_entity_headers (headers, allowed=('expires', 'content-location')) Remove all entity headers from a list or ‘Headers’ object. This operation works in-place. ‘Expires’ and ‘Content-Location’ headers - are by default not removed. The reason for this is RFC 2616(1) + are by default not removed. The reason for this is RFC 2616(5) section 10.3.5 which specifies some entity headers that should be sent. @@ -6529,10 +8056,15 @@ HTTP header strings from the parsed data. Parameters: - * ‘headers’ – a list or ‘Headers’ object. + * ‘headers’ (‘Union’‘[’*note werkzeug.datastructures.Headers: + 70.‘, ’‘List’‘[’‘Tuple’‘[’str(6)‘, ’str(7)‘]’‘]’‘]’) – a list + or ‘Headers’ object. - * ‘allowed’ – a list of headers that should still be allowed - even though they are entity headers. + * ‘allowed’ (‘Iterable’‘[’str(8)‘]’) – a list of headers that + should still be allowed even though they are entity headers. + + + Return type: None(9) -- Function: werkzeug.http.remove_hop_by_hop_headers (headers) @@ -6542,7 +8074,13 @@ HTTP header strings from the parsed data. New in version 0.5. - Parameters: ‘headers’ – a list or ‘Headers’ object. + Parameters: ‘headers’ (‘Union’‘[’*note + werkzeug.datastructures.Headers: 70.‘, + ’‘List’‘[’‘Tuple’‘[’str(10)‘, ’str(11)‘]’‘]’‘]’) – a list or + ‘Headers’ object. + + + Return type: None(12) -- Function: werkzeug.http.is_byte_range_valid (start, stop, length) @@ -6550,6 +8088,18 @@ HTTP header strings from the parsed data. New in version 0.7. + + Parameters: + + * ‘start’ (‘Optional’‘[’int(13)‘]’) – + + * ‘stop’ (‘Optional’‘[’int(14)‘]’) – + + * ‘length’ (‘Optional’‘[’int(15)‘]’) – + + + Return type: bool(16) + -- Function: werkzeug.http.quote_header_value (value, extra_chars='', allow_token=True) @@ -6560,30 +8110,43 @@ HTTP header strings from the parsed data. Parameters: - * ‘value’ – the value to quote. + * ‘value’ (‘Union’‘[’str(17)‘, ’int(18)‘]’) – the value to + quote. - * ‘extra_chars’ – a list of extra characters to skip quoting. + * ‘extra_chars’ (str(19)) – a list of extra characters to skip + quoting. - * ‘allow_token’ – if this is enabled token values are returned - unchanged. + * ‘allow_token’ (bool(20)) – if this is enabled token values are + returned unchanged. + + + Return type: str(21) -- Function: werkzeug.http.unquote_header_value (value, is_filename=False) Unquotes a header value. (Reversal of *note quote_header_value(): - 1d2.). This does not use the real unquoting but what browsers are + 1aa.). This does not use the real unquoting but what browsers are actually using for quoting. New in version 0.5. - Parameters: ‘value’ – the header value to unquote. + Parameters: + + * ‘value’ (str(22)) – the header value to unquote. + + * ‘is_filename’ (bool(23)) – The value represents a filename or + path. + + + Return type: str(24) -- Function: werkzeug.http.dump_header (iterable, allow_token=True) Dump an HTTP header again. This is the reversal of *note - parse_list_header(): 1c3, *note parse_set_header(): 1c0. and *note - parse_dict_header(): 1bf. This also quotes strings that include an + parse_list_header(): 19c, *note parse_set_header(): 19a. and *note + parse_dict_header(): 199. This also quotes strings that include an equals sign unless you pass it as dict of key, value pairs. >>> dump_header({'foo': 'bar baz'}) @@ -6594,20 +8157,83 @@ HTTP header strings from the parsed data. Parameters: - * ‘iterable’ – the iterable or dict of values to quote. + * ‘iterable’ (‘Union’‘[’‘Dict’‘[’str(25)‘, ’‘Union’‘[’str(26)‘, + ’int(27)‘]’‘]’‘, ’‘Iterable’‘[’str(28)‘]’‘]’) – the iterable + or dict of values to quote. - * ‘allow_token’ – if set to ‘False’ tokens as values are - disallowed. See *note quote_header_value(): 1d2. for more + * ‘allow_token’ (bool(29)) – if set to ‘False’ tokens as values + are disallowed. See *note quote_header_value(): 1aa. for more details. + + Return type: str(30) + ---------- Footnotes ---------- - (1) https://tools.ietf.org/html/rfc2616.html + (1) https://docs.python.org/3/library/stdtypes.html#str + + (2) https://docs.python.org/3/library/functions.html#bool + + (3) https://docs.python.org/3/library/stdtypes.html#str + + (4) https://docs.python.org/3/library/functions.html#bool + + (5) https://tools.ietf.org/html/rfc2616.html + + (6) https://docs.python.org/3/library/stdtypes.html#str + + (7) https://docs.python.org/3/library/stdtypes.html#str + + (8) https://docs.python.org/3/library/stdtypes.html#str + + (9) https://docs.python.org/3/library/constants.html#None + + (10) https://docs.python.org/3/library/stdtypes.html#str + + (11) https://docs.python.org/3/library/stdtypes.html#str + + (12) https://docs.python.org/3/library/constants.html#None + + (13) https://docs.python.org/3/library/functions.html#int + + (14) https://docs.python.org/3/library/functions.html#int + + (15) https://docs.python.org/3/library/functions.html#int + + (16) https://docs.python.org/3/library/functions.html#bool + + (17) https://docs.python.org/3/library/stdtypes.html#str + + (18) https://docs.python.org/3/library/functions.html#int + + (19) https://docs.python.org/3/library/stdtypes.html#str + + (20) https://docs.python.org/3/library/functions.html#bool + + (21) https://docs.python.org/3/library/stdtypes.html#str + + (22) https://docs.python.org/3/library/stdtypes.html#str + + (23) https://docs.python.org/3/library/functions.html#bool + + (24) https://docs.python.org/3/library/stdtypes.html#str + + (25) https://docs.python.org/3/library/stdtypes.html#str + + (26) https://docs.python.org/3/library/stdtypes.html#str + + (27) https://docs.python.org/3/library/functions.html#int + + (28) https://docs.python.org/3/library/stdtypes.html#str + + (29) https://docs.python.org/3/library/functions.html#bool + + (30) https://docs.python.org/3/library/stdtypes.html#str  File: werkzeug.info, Node: Cookies, Next: Conditional Response Helpers, Prev: Header Utilities, Up: HTTP Utilities -3.5.4 Cookies +3.4.4 Cookies ------------- -- Function: werkzeug.http.parse_cookie (header, charset='utf-8', @@ -6622,15 +8248,21 @@ File: werkzeug.info, Node: Cookies, Next: Conditional Response Helpers, Prev: Parameters: - * ‘header’ – The cookie header as a string, or a WSGI environ - dict with a ‘HTTP_COOKIE’ key. + * ‘header’ (‘Optional’‘[’‘Union’‘[’‘WSGIEnvironment’‘, ’str(1)‘, + ’bytes(2)‘]’‘]’) – The cookie header as a string, or a WSGI + environ dict with a ‘HTTP_COOKIE’ key. - * ‘charset’ – The charset for the cookie values. + * ‘charset’ (str(3)) – The charset for the cookie values. - * ‘errors’ – The error behavior for the charset decoding. + * ‘errors’ (str(4)) – The error behavior for the charset + decoding. - * ‘cls’ – A dict-like class to store the parsed cookies in. - Defaults to ‘MultiDict’. + * ‘cls’ (‘Optional’‘[’‘Type’‘[’‘ds.MultiDict’‘]’‘]’) – A + dict-like class to store the parsed cookies in. Defaults to + ‘MultiDict’. + + + Return type: ds.MultiDict[str(5), str(6)] Changed in version 1.0.0: Returns a ‘MultiDict’ instead of a ‘TypeConversionDict’. @@ -6643,16 +8275,11 @@ File: werkzeug.info, Node: Cookies, Next: Conditional Response Helpers, Prev: httponly=False, charset='utf-8', sync_expires=True, max_size=4093, samesite=None) - Creates a new Set-Cookie header without the ‘Set-Cookie’ prefix The - parameters are the same as in the cookie Morsel object in the - Python standard library but it accepts unicode data, too. + Create a Set-Cookie header without the ‘Set-Cookie’ prefix. - On Python 3 the return value of this function will be a unicode - string, on Python 2 it will be a native string. In both cases the - return value is usually restricted to ascii as the vast majority of - values are properly escaped, but that is no guarantee. If a - unicode string is returned it’s tunneled through latin1 as required - by PEP 3333. + The return value is usually restricted to ascii as the vast + majority of values are properly escaped, but that is no guarantee. + It’s tunneled through latin1 as required by PEP 3333(7). The return value is not ASCII safe if the key contains unicode characters. This is technically against the specification but @@ -6662,50 +8289,116 @@ File: werkzeug.info, Node: Cookies, Next: Conditional Response Helpers, Prev: Parameters: - * ‘max_age’ – should be a number of seconds, or ‘None’ (default) - if the cookie should last only as long as the client’s browser - session. Additionally ‘timedelta’ objects are accepted, too. + * ‘max_age’ (‘Optional’‘[’‘Union’‘[’datetime.timedelta(8)‘, + ’int(9)‘]’‘]’) – should be a number of seconds, or ‘None’ + (default) if the cookie should last only as long as the + client’s browser session. Additionally ‘timedelta’ objects + are accepted, too. - * ‘expires’ – should be a ‘datetime’ object or unix timestamp. + * ‘expires’ (‘Optional’‘[’‘Union’‘[’str(10)‘, + ’datetime.datetime(11)‘, ’int(12)‘, ’float(13)‘]’‘]’) – should + be a ‘datetime’ object or unix timestamp. - * ‘path’ – limits the cookie to a given path, per default it - will span the whole domain. + * ‘path’ (‘Optional’‘[’str(14)‘]’) – limits the cookie to a + given path, per default it will span the whole domain. - * ‘domain’ – Use this if you want to set a cross-domain cookie. - For example, ‘domain=".example.com"’ will set a cookie that is - readable by the domain ‘www.example.com’, ‘foo.example.com’ - etc. Otherwise, a cookie will only be readable by the domain - that set it. + * ‘domain’ (‘Optional’‘[’str(15)‘]’) – Use this if you want to + set a cross-domain cookie. For example, + ‘domain=".example.com"’ will set a cookie that is readable by + the domain ‘www.example.com’, ‘foo.example.com’ etc. + Otherwise, a cookie will only be readable by the domain that + set it. - * ‘secure’ – The cookie will only be available via HTTPS + * ‘secure’ (bool(16)) – The cookie will only be available via + HTTPS - * ‘httponly’ – disallow JavaScript to access the cookie. This - is an extension to the cookie standard and probably not - supported by all browsers. + * ‘httponly’ (bool(17)) – disallow JavaScript to access the + cookie. This is an extension to the cookie standard and + probably not supported by all browsers. - * ‘charset’ – the encoding for unicode values. + * ‘charset’ (str(18)) – the encoding for string values. - * ‘sync_expires’ – automatically set expires if max_age is - defined but expires not. + * ‘sync_expires’ (bool(19)) – automatically set expires if + max_age is defined but expires not. - * ‘max_size’ – Warn if the final header value exceeds this size. - The default, 4093, should be safely supported by most - browsers(1). Set to 0 to disable this check. + * ‘max_size’ (int(20)) – Warn if the final header value exceeds + this size. The default, 4093, should be safely supported by + most browsers(21). Set to 0 to disable this check. - * ‘samesite’ – Limits the scope of the cookie such that it will - only be attached to requests if those requests are same-site. + * ‘samesite’ (‘Optional’‘[’str(22)‘]’) – Limits the scope of the + cookie such that it will only be attached to requests if those + requests are same-site. + + * ‘key’ (str(23)) – + + * ‘value’ (‘Union’‘[’bytes(24)‘, ’str(25)‘]’) – + + + Return type: str(26) Changed in version 1.0.0: The string ‘'None'’ is accepted for ‘samesite’. ---------- Footnotes ---------- - (1) http://browsercookielimits.squawky.net/ + (1) https://docs.python.org/3/library/stdtypes.html#str + + (2) https://docs.python.org/3/library/stdtypes.html#bytes + + (3) https://docs.python.org/3/library/stdtypes.html#str + + (4) https://docs.python.org/3/library/stdtypes.html#str + + (5) https://docs.python.org/3/library/stdtypes.html#str + + (6) https://docs.python.org/3/library/stdtypes.html#str + + (7) https://www.python.org/dev/peps/pep-3333 + + (8) +https://docs.python.org/3/library/datetime.html#datetime.timedelta + + (9) https://docs.python.org/3/library/functions.html#int + + (10) https://docs.python.org/3/library/stdtypes.html#str + + (11) +https://docs.python.org/3/library/datetime.html#datetime.datetime + + (12) https://docs.python.org/3/library/functions.html#int + + (13) https://docs.python.org/3/library/functions.html#float + + (14) https://docs.python.org/3/library/stdtypes.html#str + + (15) https://docs.python.org/3/library/stdtypes.html#str + + (16) https://docs.python.org/3/library/functions.html#bool + + (17) https://docs.python.org/3/library/functions.html#bool + + (18) https://docs.python.org/3/library/stdtypes.html#str + + (19) https://docs.python.org/3/library/functions.html#bool + + (20) https://docs.python.org/3/library/functions.html#int + + (21) http://browsercookielimits.squawky.net/ + + (22) https://docs.python.org/3/library/stdtypes.html#str + + (23) https://docs.python.org/3/library/stdtypes.html#str + + (24) https://docs.python.org/3/library/stdtypes.html#bytes + + (25) https://docs.python.org/3/library/stdtypes.html#str + + (26) https://docs.python.org/3/library/stdtypes.html#str  File: werkzeug.info, Node: Conditional Response Helpers, Next: Constants, Prev: Cookies, Up: HTTP Utilities -3.5.5 Conditional Response Helpers +3.4.5 Conditional Response Helpers ---------------------------------- For conditional responses the following functions might be useful: @@ -6715,10 +8408,14 @@ For conditional responses the following functions might be useful: Parse an etag header. - Parameters: ‘value’ – the tag header to parse + Parameters: ‘value’ (‘Optional’‘[’str(1)‘]’) – the tag header to + parse - Returns: an *note ETags: 13f. object. + Returns: an *note ETags: c8. object. + + + Return type: *note werkzeug.datastructures.ETags: c8. -- Function: werkzeug.http.quote_etag (etag, weak=False) @@ -6727,9 +8424,12 @@ For conditional responses the following functions might be useful: Parameters: - * ‘etag’ – the etag to quote. + * ‘etag’ (str(2)) – the etag to quote. - * ‘weak’ – set to ‘True’ to tag it “weak”. + * ‘weak’ (bool(3)) – set to ‘True’ to tag it “weak”. + + + Return type: str(4) -- Function: werkzeug.http.unquote_etag (etag) @@ -6741,15 +8441,28 @@ For conditional responses the following functions might be useful: ('bar', False) - Parameters: ‘etag’ – the etag identifier to unquote. + Parameters: ‘etag’ (‘Optional’‘[’str(5)‘]’) – the etag identifier + to unquote. Returns: a ‘(etag, weak)’ tuple. + + Return type: Union[Tuple[str(6), bool(7)], Tuple[None(8), None(9)]] + -- Function: werkzeug.http.generate_etag (data) Generate an etag for some data. + Changed in version 2.0: Use SHA-1. MD5 may not be available in + some environments. + + + Parameters: ‘data’ (bytes(10)) – + + + Return type: str(11) + -- Function: werkzeug.http.is_resource_modified (environ, etag=None, data=None, last_modified=None, ignore_if_range=True) @@ -6758,29 +8471,76 @@ For conditional responses the following functions might be useful: Parameters: - * ‘environ’ – the WSGI environment of the request to be checked. + * ‘environ’ (‘WSGIEnvironment’) – the WSGI environment of the + request to be checked. - * ‘etag’ – the etag for the response for comparison. + * ‘etag’ (‘Optional’‘[’str(12)‘]’) – the etag for the response + for comparison. - * ‘data’ – or alternatively the data of the response to - automatically generate an etag using *note generate_etag(): - 1db. + * ‘data’ (‘Optional’‘[’bytes(13)‘]’) – or alternatively the data + of the response to automatically generate an etag using *note + generate_etag(): 1b3. - * ‘last_modified’ – an optional date of the last modification. + * ‘last_modified’ + (‘Optional’‘[’‘Union’‘[’datetime.datetime(14)‘, + ’str(15)‘]’‘]’) – an optional date of the last modification. - * ‘ignore_if_range’ – If ‘False’, ‘If-Range’ header will be - taken into account. + * ‘ignore_if_range’ (bool(16)) – If ‘False’, ‘If-Range’ header + will be taken into account. Returns: ‘True’ if the resource was modified, otherwise ‘False’. + + Return type: bool(17) + + Changed in version 2.0: SHA-1 is used to generate an etag value for + the data. MD5 may not be available in some environments. + Changed in version 1.0.0: The check is run for methods other than ‘GET’ and ‘HEAD’. + ---------- Footnotes ---------- + + (1) https://docs.python.org/3/library/stdtypes.html#str + + (2) https://docs.python.org/3/library/stdtypes.html#str + + (3) https://docs.python.org/3/library/functions.html#bool + + (4) https://docs.python.org/3/library/stdtypes.html#str + + (5) https://docs.python.org/3/library/stdtypes.html#str + + (6) https://docs.python.org/3/library/stdtypes.html#str + + (7) https://docs.python.org/3/library/functions.html#bool + + (8) https://docs.python.org/3/library/constants.html#None + + (9) https://docs.python.org/3/library/constants.html#None + + (10) https://docs.python.org/3/library/stdtypes.html#bytes + + (11) https://docs.python.org/3/library/stdtypes.html#str + + (12) https://docs.python.org/3/library/stdtypes.html#str + + (13) https://docs.python.org/3/library/stdtypes.html#bytes + + (14) +https://docs.python.org/3/library/datetime.html#datetime.datetime + + (15) https://docs.python.org/3/library/stdtypes.html#str + + (16) https://docs.python.org/3/library/functions.html#bool + + (17) https://docs.python.org/3/library/functions.html#bool +  File: werkzeug.info, Node: Constants, Next: Form Data Parsing, Prev: Conditional Response Helpers, Up: HTTP Utilities -3.5.6 Constants +3.4.6 Constants --------------- -- Data: werkzeug.http.HTTP_STATUS_CODES @@ -6792,7 +8552,7 @@ File: werkzeug.info, Node: Constants, Next: Form Data Parsing, Prev: Conditio  File: werkzeug.info, Node: Form Data Parsing, Prev: Constants, Up: HTTP Utilities -3.5.7 Form Data Parsing +3.4.7 Form Data Parsing ----------------------- Werkzeug provides the form parsing functions separately from the request @@ -6809,17 +8569,23 @@ used by any of the modern web browsers. Usage example: - >>> from cStringIO import StringIO - >>> data = '--foo\r\nContent-Disposition: form-data; name="test"\r\n' \ - ... '\r\nHello World!\r\n--foo--' - >>> environ = {'wsgi.input': StringIO(data), 'CONTENT_LENGTH': str(len(data)), - ... 'CONTENT_TYPE': 'multipart/form-data; boundary=foo', - ... 'REQUEST_METHOD': 'POST'} + >>> from io import BytesIO + >>> from werkzeug.formparser import parse_form_data + >>> data = ( + ... b'--foo\r\nContent-Disposition: form-data; name="test"\r\n' + ... b"\r\nHello World!\r\n--foo--" + ... ) + >>> environ = { + ... "wsgi.input": BytesIO(data), + ... "CONTENT_LENGTH": str(len(data)), + ... "CONTENT_TYPE": "multipart/form-data; boundary=foo", + ... "REQUEST_METHOD": "POST", + ... } >>> stream, form, files = parse_form_data(environ) >>> stream.read() - '' + b'' >>> form['test'] - u'Hello World!' + 'Hello World!' >>> not files True @@ -6843,28 +8609,35 @@ environments for unittesting you might want to use the Parameters: - * ‘stream_factory’ – An optional callable that returns a new - read and writeable file descriptor. This callable works the - same as ‘_get_file_stream()’. + * ‘stream_factory’ (‘Optional’‘[’‘TStreamFactory’‘]’) – An + optional callable that returns a new read and writeable file + descriptor. This callable works the same as + ‘Response._get_file_stream()’. - * ‘charset’ – The character set for URL and url encoded form - data. + * ‘charset’ (str(1)) – The character set for URL and url encoded + form data. - * ‘errors’ – The encoding error behavior. + * ‘errors’ (str(2)) – The encoding error behavior. - * ‘max_form_memory_size’ – the maximum number of bytes to be - accepted for in-memory stored form data. If the data exceeds - the value specified an ‘RequestEntityTooLarge’ exception is - raised. + * ‘max_form_memory_size’ (‘Optional’‘[’int(3)‘]’) – the maximum + number of bytes to be accepted for in-memory stored form data. + If the data exceeds the value specified an + ‘RequestEntityTooLarge’ exception is raised. - * ‘max_content_length’ – If this is provided and the transmitted - data is longer than this value an ‘RequestEntityTooLarge’ - exception is raised. + * ‘max_content_length’ (‘Optional’‘[’int(4)‘]’) – If this is + provided and the transmitted data is longer than this value an + ‘RequestEntityTooLarge’ exception is raised. - * ‘cls’ – an optional dict class to use. If this is not - specified or ‘None’ the default ‘MultiDict’ is used. + * ‘cls’ (‘Optional’‘[’‘Type’‘[’*note + werkzeug.datastructures.MultiDict: 82.‘]’‘]’) – an optional + dict class to use. If this is not specified or ‘None’ the + default ‘MultiDict’ is used. - * ‘silent’ – If set to False parsing errors will not be caught. + * ‘silent’ (bool(5)) – If set to False parsing errors will not + be caught. + + + Return type: None(6) -- Function: werkzeug.formparser.parse_form_data (environ, stream_factory=None, charset='utf-8', errors='replace', @@ -6881,9 +8654,9 @@ environments for unittesting you might want to use the first argument, else the stream is empty. This is a shortcut for the common usage of *note FormDataParser: - b7. + bd. - Have a look at *note Dealing with Request Data: c8. for more + Have a look at *note Dealing with Request Data: db. for more details. New in version 0.5.1: The optional ‘silent’ flag was added. @@ -6894,51 +8667,70 @@ environments for unittesting you might want to use the Parameters: - * ‘environ’ – the WSGI environment to be used for parsing. + * ‘environ’ (‘WSGIEnvironment’) – the WSGI environment to be + used for parsing. - * ‘stream_factory’ – An optional callable that returns a new - read and writeable file descriptor. This callable works the - same as ‘_get_file_stream()’. + * ‘stream_factory’ (‘Optional’‘[’‘TStreamFactory’‘]’) – An + optional callable that returns a new read and writeable file + descriptor. This callable works the same as + ‘Response._get_file_stream()’. - * ‘charset’ – The character set for URL and url encoded form - data. + * ‘charset’ (str(7)) – The character set for URL and url encoded + form data. - * ‘errors’ – The encoding error behavior. + * ‘errors’ (str(8)) – The encoding error behavior. - * ‘max_form_memory_size’ – the maximum number of bytes to be - accepted for in-memory stored form data. If the data exceeds - the value specified an ‘RequestEntityTooLarge’ exception is - raised. + * ‘max_form_memory_size’ (‘Optional’‘[’int(9)‘]’) – the maximum + number of bytes to be accepted for in-memory stored form data. + If the data exceeds the value specified an + ‘RequestEntityTooLarge’ exception is raised. - * ‘max_content_length’ – If this is provided and the transmitted - data is longer than this value an ‘RequestEntityTooLarge’ - exception is raised. + * ‘max_content_length’ (‘Optional’‘[’int(10)‘]’) – If this is + provided and the transmitted data is longer than this value an + ‘RequestEntityTooLarge’ exception is raised. - * ‘cls’ – an optional dict class to use. If this is not - specified or ‘None’ the default ‘MultiDict’ is used. + * ‘cls’ (‘Optional’‘[’‘Type’‘[’*note + werkzeug.datastructures.MultiDict: 82.‘]’‘]’) – an optional + dict class to use. If this is not specified or ‘None’ the + default ‘MultiDict’ is used. - * ‘silent’ – If set to False parsing errors will not be caught. + * ‘silent’ (bool(11)) – If set to False parsing errors will not + be caught. Returns: A tuple in the form ‘(stream, form, files)’. - -- Function: werkzeug.formparser.parse_multipart_headers (iterable) - Parses multipart headers from an iterable that yields lines - (including the trailing newline symbol). The iterable has to be - newline terminated. + Return type: t_parse_result - The iterable will stop at the line where the headers ended so it - can be further consumed. + ---------- Footnotes ---------- + (1) https://docs.python.org/3/library/stdtypes.html#str - Parameters: ‘iterable’ – iterable of strings that are newline - terminated + (2) https://docs.python.org/3/library/stdtypes.html#str + + (3) https://docs.python.org/3/library/functions.html#int + + (4) https://docs.python.org/3/library/functions.html#int + + (5) https://docs.python.org/3/library/functions.html#bool + + (6) https://docs.python.org/3/library/constants.html#None + + (7) https://docs.python.org/3/library/stdtypes.html#str + + (8) https://docs.python.org/3/library/stdtypes.html#str + + (9) https://docs.python.org/3/library/functions.html#int + + (10) https://docs.python.org/3/library/functions.html#int + + (11) https://docs.python.org/3/library/functions.html#bool  File: werkzeug.info, Node: Data Structures, Next: Utilities, Prev: HTTP Utilities, Up: Reference -3.6 Data Structures +3.5 Data Structures =================== Werkzeug provides some subclasses of common Python objects to extend @@ -6955,19 +8747,19 @@ HTTP.  File: werkzeug.info, Node: General Purpose, Next: HTTP Related, Up: Data Structures -3.6.1 General Purpose +3.5.1 General Purpose --------------------- Changed in version 0.6: The general purpose classes are now pickleable in each protocol as long as the contained objects are pickleable. This -means that the *note FileMultiDict: 1e5. won’t be pickleable as soon as +means that the *note FileMultiDict: 83. won’t be pickleable as soon as it contains a file. -- Class: werkzeug.datastructures.TypeConversionDict - Works like a regular dict but the *note get(): 1e7. method can - perform type conversions. *note MultiDict: b2. and *note - CombinedMultiDict: d5. are subclasses of this class and provide the + Works like a regular dict but the *note get(): 1bd. method can + perform type conversions. *note MultiDict: 82. and *note + CombinedMultiDict: f7. are subclasses of this class and provide the same feature. New in version 0.5. @@ -6996,12 +8788,12 @@ it contains a file. returned. * ‘type’ – A callable that is used to cast the value in the - *note MultiDict: b2. If a ValueError(2) is raised by + *note MultiDict: 82. If a ValueError(2) is raised by this callable the default value is returned. -- Class: werkzeug.datastructures.ImmutableTypeConversionDict - Works like a *note TypeConversionDict: 1e6. but does not support + Works like a *note TypeConversionDict: 1bc. but does not support modifications. New in version 0.5. @@ -7009,18 +8801,18 @@ it contains a file. -- Method: copy () Return a shallow mutable copy of this object. Keep in mind - that the standard library’s *note copy(): 1e9. function is a + that the standard library’s *note copy(): 1bf. function is a no-op for this class like for any other python immutable type (eg: tuple(3)). -- Class: werkzeug.datastructures.MultiDict (mapping=None) - A *note MultiDict: b2. is a dictionary subclass customized to deal + A *note MultiDict: 82. is a dictionary subclass customized to deal with multiple values for the same key which is for example used by the parsing functions in the wrappers. This is necessary because some HTML form elements pass multiple values for the same key. - *note MultiDict: b2. implements all standard dictionary methods. + *note MultiDict: 82. implements all standard dictionary methods. Internally, it saves all values for a key as a list, but the standard dict access methods will only return the first value for a key. If you want to gain access to the other values, too, you have @@ -7046,13 +8838,13 @@ it contains a file. a page for a ‘400 BAD REQUEST’ if caught in a catch-all for HTTP exceptions. - A *note MultiDict: b2. can be constructed from an iterable of - ‘(key, value)’ tuples, a dict, a *note MultiDict: b2. or from + A *note MultiDict: 82. can be constructed from an iterable of + ‘(key, value)’ tuples, a dict, a *note MultiDict: 82. or from Werkzeug 0.2 onwards some keyword parameters. Parameters: ‘mapping’ – the initial value for the *note MultiDict: - b2. Either a regular dict, an iterable of ‘(key, value)’ tuples or + 82. Either a regular dict, an iterable of ‘(key, value)’ tuples or ‘None’. -- Method: add (key, value) @@ -7078,7 +8870,7 @@ it contains a file. Return a deep copy of this object. - -- Method: fromkeys () + -- Method: fromkeys (value=None, /) Create a new dictionary with keys from iterable and values set to value. @@ -7107,15 +8899,15 @@ it contains a file. returned. * ‘type’ – A callable that is used to cast the value in the - *note MultiDict: b2. If a ValueError(5) is raised by + *note MultiDict: 82. If a ValueError(5) is raised by this callable the default value is returned. -- Method: getlist (key, type=None) Return the list of items for a given key. If that key is not in the ‘MultiDict’, the return value will be an empty list. - Just as ‘get’ ‘getlist’ accepts a ‘type’ parameter. All items - will be converted with the callable defined there. + Just like ‘get’, ‘getlist’ accepts a ‘type’ parameter. All + items will be converted with the callable defined there. Parameters: @@ -7123,7 +8915,7 @@ it contains a file. * ‘key’ – The key to be looked up. * ‘type’ – A callable that is used to cast the value in the - *note MultiDict: b2. If a ValueError(6) is raised by + *note MultiDict: 82. If a ValueError(6) is raised by this callable the value will be removed from the list. @@ -7149,8 +8941,8 @@ it contains a file. -- Method: listvalues () Return an iterator of all values associated with a key. - Zipping *note keys(): 1f2. and this is the same as calling - *note lists(): 1f3.: + Zipping *note keys(): 1c8. and this is the same as calling + *note lists(): 1c9.: >>> d = MultiDict({"foo": [1, 2, 3]}) >>> zip(d.keys(), d.listvalues()) == d.lists() @@ -7264,7 +9056,7 @@ it contains a file. Returns: a dict(9) - -- Method: update (other_dict) + -- Method: update (mapping) update() extends rather than replaces existing key lists: @@ -7291,12 +9083,12 @@ it contains a file. -- Class: werkzeug.datastructures.OrderedMultiDict (mapping=None) - Works like a regular *note MultiDict: b2. but preserves the order + Works like a regular *note MultiDict: 82. but preserves the order of the fields. To convert the ordered multi dict into a list you can use the ‘items()’ method and pass it ‘multi=True’. - In general an *note OrderedMultiDict: 1ff. is an order of magnitude - slower than a *note MultiDict: b2. + In general an *note OrderedMultiDict: 1d5. is an order of magnitude + slower than a *note MultiDict: 82. note: Due to a limitation in Python you cannot convert an ordered multi dict into a regular dict by using @@ -7305,35 +9097,35 @@ it contains a file. -- Class: werkzeug.datastructures.ImmutableMultiDict (mapping=None) - An immutable *note MultiDict: b2. + An immutable *note MultiDict: 82. New in version 0.5. -- Method: copy () Return a shallow mutable copy of this object. Keep in mind - that the standard library’s *note copy(): 200. function is a + that the standard library’s *note copy(): 1d6. function is a no-op for this class like for any other python immutable type (eg: tuple(10)). -- Class: werkzeug.datastructures.ImmutableOrderedMultiDict (mapping=None) - An immutable *note OrderedMultiDict: 1ff. + An immutable *note OrderedMultiDict: 1d5. New in version 0.6. -- Method: copy () Return a shallow mutable copy of this object. Keep in mind - that the standard library’s *note copy(): 202. function is a + that the standard library’s *note copy(): 1d8. function is a no-op for this class like for any other python immutable type (eg: tuple(11)). -- Class: werkzeug.datastructures.CombinedMultiDict (dicts=None) - A read only *note MultiDict: b2. that you can pass multiple *note - MultiDict: b2. instances as sequence and it will combine the return + A read only *note MultiDict: 82. that you can pass multiple *note + MultiDict: 82. instances as sequence and it will combine the return values of all wrapped dicts: >>> from werkzeug.datastructures import CombinedMultiDict, MultiDict @@ -7362,11 +9154,11 @@ it contains a file. -- Method: copy () Return a shallow mutable copy of this object. Keep in mind - that the standard library’s *note copy(): 204. function is a + that the standard library’s *note copy(): 1da. function is a no-op for this class like for any other python immutable type (eg: tuple(13)). - -- Class: werkzeug.datastructures.ImmutableList + -- Class: werkzeug.datastructures.ImmutableList (iterable=(), /) An immutable list(14). @@ -7377,7 +9169,7 @@ it contains a file. -- Class: werkzeug.datastructures.FileMultiDict (mapping=None) - A special *note MultiDict: b2. that has convenience methods to add + A special *note MultiDict: 82. that has convenience methods to add files to it. This is used for ‘EnvironBuilder’ and generally useful for unittesting. @@ -7386,7 +9178,7 @@ it contains a file. -- Method: add_file (name, file, filename=None, content_type=None) Adds a new file to the dict. ‘file’ can be a file name or a - ‘file’-like or a *note FileStorage: b3. object. + ‘file’-like or a *note FileStorage: b9. object. Parameters: @@ -7432,13 +9224,14 @@ it contains a file.  File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, Up: Data Structures -3.6.2 HTTP Related +3.5.2 HTTP Related ------------------ -- Class: werkzeug.datastructures.Headers ([defaults]) - An object that stores some headers. It has a dict-like interface - but is ordered and can store the same keys multiple times. + An object that stores some headers. It has a dict-like interface, + but is ordered, can store the same key multiple times, and + iterating yields ‘(key, value)’ pairs instead of only keys. This data structure is useful if you want a nicer way to handle WSGI headers which are stored as tuples in a list. @@ -7451,16 +9244,19 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, Headers is mostly compatible with the Python wsgiref.headers.Headers(2) class, with the exception of ‘__getitem__’. wsgiref(3) will return ‘None’ for - ‘headers['missing']’, whereas *note Headers: d9. will raise a + ‘headers['missing']’, whereas *note Headers: 70. will raise a KeyError(4). - To create a new *note Headers: d9. object pass it a list or dict of - headers which are used as default values. This does not reuse the - list passed to the constructor for internal usage. + To create a new ‘Headers’ object, pass it a list, dict, or other + ‘Headers’ object with default values. These values are validated + the same way values added later are. Parameters: ‘defaults’ – The list of default values for the *note - Headers: d9. + Headers: 70. + + Changed in version 2.1.0: Default values are validated the same as + values added later. Changed in version 0.9: This data structure now stores unicode values similar to how the multi dicts do it. The main difference @@ -7492,7 +9288,7 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, Add a new header tuple to the list. - An alias for *note add(): 207. for compatibility with the + An alias for *note add(): 1dd. for compatibility with the wsgiref(6) add_header()(7) method. -- Method: clear () @@ -7505,13 +9301,13 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, containing header items as well as keyword arguments. To replace existing keys instead of extending, use *note - update(): 20b. instead. + update(): 1e1. instead. If provided, the first argument can be another *note Headers: - d9. object, a *note MultiDict: b2, dict(8), or iterable of + 70. object, a *note MultiDict: 82, dict(8), or iterable of pairs. - Changed in version 1.0: Support *note MultiDict: b2. Allow + Changed in version 1.0: Support *note MultiDict: 82. Allow passing ‘kwargs’. -- Method: get (key, default=None, type=None, as_bytes=False) @@ -7526,9 +9322,6 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, >>> d.get('Content-Length', type=int) 42 - If a headers object is bound you must not add unicode strings - because no encoding takes place. - New in version 0.9: Added support for ‘as_bytes’. @@ -7541,10 +9334,10 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, returned. * ‘type’ – A callable that is used to cast the value in the - *note Headers: d9. If a ValueError(10) is raised by this + *note Headers: 70. If a ValueError(10) is raised by this callable the default value is returned. - * ‘as_bytes’ – return bytes instead of unicode strings. + * ‘as_bytes’ – return bytes instead of strings. -- Method: get_all (name) @@ -7556,10 +9349,10 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, -- Method: getlist (key, type=None, as_bytes=False) Return the list of items for a given key. If that key is not - in the *note Headers: d9, the return value will be an empty - list. Just as *note get(): 20c. *note getlist(): 20e. accepts - a ‘type’ parameter. All items will be converted with the - callable defined there. + in the *note Headers: 70, the return value will be an empty + list. Just like *note get(): 1e2, *note getlist(): 1e4. + accepts a ‘type’ parameter. All items will be converted with + the callable defined there. New in version 0.9: Added support for ‘as_bytes’. @@ -7569,18 +9362,14 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, * ‘key’ – The key to be looked up. * ‘type’ – A callable that is used to cast the value in the - *note Headers: d9. If a ValueError(13) is raised by this + *note Headers: 70. If a ValueError(13) is raised by this callable the value will be removed from the list. - * ‘as_bytes’ – return bytes instead of unicode strings. + * ‘as_bytes’ – return bytes instead of strings. Returns: a list(14) of all the values for the key. - -- Method: has_key (key) - - Check if a key is present. - -- Method: pop (key=None, default=no value) Removes and returns a key or index. @@ -7613,10 +9402,10 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, Keyword arguments can specify additional parameters for the header value, with underscores converted to dashes. See *note - add(): 207. for more information. + add(): 1dd. for more information. - Changed in version 0.6.1: *note set(): 213. now accepts the - same arguments as *note add(): 207. + Changed in version 0.6.1: *note set(): 1e8. now accepts the + same arguments as *note add(): 1dd. Parameters: @@ -7658,7 +9447,7 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, otherwise set the header to the list of values given by ‘default’ and return that. - Unlike *note MultiDict.setlistdefault(): 1fb, modifying the + Unlike *note MultiDict.setlistdefault(): 1d1, modifying the returned list will not affect the headers. @@ -7675,9 +9464,6 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, Convert the headers into a list suitable for WSGI. - The values are byte strings in Python 2 converted to latin1 - and unicode strings in Python 3 for the WSGI server to encode. - Returns: list @@ -7687,10 +9473,10 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, object and keyword arguments. To extend existing keys instead of replacing, use *note - extend(): 20a. instead. + extend(): 1e0. instead. If provided, the first argument can be another *note Headers: - d9. object, a *note MultiDict: b2, dict(15), or iterable of + 70. object, a *note MultiDict: 82, dict(15), or iterable of pairs. New in version 1.0. @@ -7709,8 +9495,8 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, -- Class: werkzeug.datastructures.HeaderSet (headers=None, on_update=None) - Similar to the *note ETags: 13f. class this implements a set-like - structure. Unlike *note ETags: 13f. this is case insensitive and + Similar to the *note ETags: c8. class this implements a set-like + structure. Unlike *note ETags: c8. this is case insensitive and used for vary, allow, and content-language headers. If not constructed using the ‘parse_set_header()’ function the @@ -7733,7 +9519,7 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, Parameters: ‘preserve_casing’ – if set to ‘True’ the items in the set returned will have the original case like in the *note - HeaderSet: 1c1, otherwise they will be lowercase. + HeaderSet: e5, otherwise they will be lowercase. -- Method: clear () @@ -7741,7 +9527,7 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, -- Method: discard (header) - Like *note remove(): 21c. but ignores errors. + Like *note remove(): 1f1. but ignores errors. Parameters: ‘header’ – the header to be discarded. @@ -7787,11 +9573,11 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, -- Class: werkzeug.datastructures.Accept (values=()) - An *note Accept: 125. object is just a list subclass for lists of + An *note Accept: 9d. object is just a list subclass for lists of ‘(value, quality)’ tuples. It is automatically sorted by specificity and quality. - All *note Accept: 125. objects work similar to a list but provide + All *note Accept: 9d. objects work similar to a list but provide extra functionality for working with the data. Containment checks are normalized to the rules of that header: @@ -7812,14 +9598,14 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, >>> a['utf7'] 0 - Changed in version 1.0.0: *note Accept: 125. internal values are no + Changed in version 1.0.0: *note Accept: 9d. internal values are no longer ordered alphabetically for equal quality tags. Instead the initial order is preserved. - Changed in version 0.5: *note Accept: 125. objects are forced + Changed in version 0.5: *note Accept: 9d. objects are forced immutable now. - -- Attribute: best + -- Property: best The best match as value. @@ -7872,28 +9658,28 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, -- Class: werkzeug.datastructures.MIMEAccept (values=()) - Like *note Accept: 125. but with special methods and behavior for + Like *note Accept: 9d. but with special methods and behavior for mimetypes. - -- Attribute: accept_html + -- Property: accept_html True if this object accepts HTML. - -- Attribute: accept_json + -- Property: accept_json True if this object accepts JSON. - -- Attribute: accept_xhtml + -- Property: accept_xhtml True if this object accepts XHTML. -- Class: werkzeug.datastructures.CharsetAccept (values=()) - Like *note Accept: 125. but with normalization for charsets. + Like *note Accept: 9d. but with normalization for charsets. -- Class: werkzeug.datastructures.LanguageAccept (values=()) - Like *note Accept: 125. but with normalization for language tags. + Like *note Accept: 9d. but with normalization for language tags. -- Class: werkzeug.datastructures.RequestCacheControl (values=(), on_update=None) @@ -7901,11 +9687,14 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, A cache control for requests. This is immutable and gives access to all the request-relevant cache control headers. - To get a header of the *note RequestCacheControl: 13d. object again + To get a header of the *note RequestCacheControl: ad. object again you can convert the object into a string or call the ‘to_header()’ method. If you plan to subclass it and add your own items have a look at the sourcecode for that class. + Changed in version 2.1.0: Setting int properties such as ‘max_age’ + will convert the value to an int. + New in version 0.5: In previous versions a ‘CacheControl’ class existed that was used both for request and response. @@ -7925,15 +9714,15 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, accessor for ‘no-transform’ - -- Attribute: max_stale + -- Property: max_stale accessor for ‘max-stale’ - -- Attribute: min_fresh + -- Property: min_fresh accessor for ‘min-fresh’ - -- Attribute: only_if_cached + -- Property: only_if_cached accessor for ‘only-if-cached’ @@ -7941,14 +9730,17 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, on_update=None) A cache control for responses. Unlike *note RequestCacheControl: - 13d. this is mutable and gives access to response-relevant cache + ad. this is mutable and gives access to response-relevant cache control headers. - To get a header of the *note ResponseCacheControl: 232. object + To get a header of the *note ResponseCacheControl: 109. object again you can convert the object into a string or call the ‘to_header()’ method. If you plan to subclass it and add your own items have a look at the sourcecode for that class. + Changed in version 2.1.0: Setting int properties such as ‘max_age’ + will convert the value to an int. + New in version 0.5: In previous versions a ‘CacheControl’ class existed that was used both for request and response. @@ -7968,27 +9760,27 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, accessor for ‘no-transform’ - -- Attribute: immutable + -- Property: immutable accessor for ‘immutable’ - -- Attribute: must_revalidate + -- Property: must_revalidate accessor for ‘must-revalidate’ - -- Attribute: private + -- Property: private accessor for ‘private’ - -- Attribute: proxy_revalidate + -- Property: proxy_revalidate accessor for ‘proxy-revalidate’ - -- Attribute: public + -- Property: public accessor for ‘public’ - -- Attribute: s_maxage + -- Property: s_maxage accessor for ‘s-maxage’ @@ -8033,68 +9825,73 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, -- Class: werkzeug.datastructures.Authorization (auth_type, data=None) - Represents an ‘Authorization’ header sent by the client. You - should not create this kind of object yourself but use it when it’s - returned by the ‘parse_authorization_header’ function. + Represents an ‘Authorization’ header sent by the client. - This object is a dict subclass and can be altered by setting dict - items but it should be considered immutable as it’s returned by the - client and not meant for modifications. + This is returned by *note parse_authorization_header(): 19f. It + can be useful to create the object manually to pass to the test + *note Client: 5c. Changed in version 0.5: This object became immutable. - -- Attribute: cnonce + -- Property: cnonce If the server sent a qop-header in the ‘WWW-Authenticate’ header, the client has to provide this value for HTTP digest auth. See the RFC for more details. - -- Attribute: nc + -- Property: nc The nonce count value transmitted by clients if a qop-header is also transmitted. HTTP digest auth only. - -- Attribute: nonce + -- Property: nonce The nonce the server sent for digest auth, sent back by the client. A nonce should be unique for every 401 response for HTTP digest auth. - -- Attribute: opaque + -- Property: opaque The opaque header from the server returned unchanged by the client. It is recommended that this string be base64 or hexadecimal data. Digest auth only. - -- Attribute: password + -- Property: password When the authentication type is basic this is the password transmitted by the client, else ‘None’. - -- Attribute: qop + -- Property: qop Indicates what “quality of protection” the client has applied to the message for HTTP digest auth. Note that this is a single token, not a quoted list of alternatives as in WWW-Authenticate. - -- Attribute: realm + -- Property: realm This is the server realm sent back for HTTP digest auth. - -- Attribute: response + -- Property: response A string of 32 hex digits computed as defined in RFC 2617, which proves that the user knows a password. Digest auth only. - -- Attribute: uri + -- Method: to_header () + + Convert to a string value for an ‘Authorization’ header. + + New in version 2.0: Added to support passing authorization to + the test client. + + -- Property: uri The URI from Request-URI of the Request-Line; duplicated because proxies are allowed to change the Request-Line in transit. HTTP digest auth only. - -- Attribute: username + -- Property: username The username transmitted. This is set for both basic and digest auth all the time. @@ -8104,7 +9901,7 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, Provides simple access to ‘WWW-Authenticate’ headers. - -- Attribute: algorithm + -- Property: algorithm A string indicating a pair of algorithms used to produce the digest and a checksum. If this is not present it is assumed @@ -8112,31 +9909,31 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, challenge should be ignored (and a different one used, if there is more than one). - -- Static Method: auth_property (name, doc=None) + -- Method: static auth_property (name, doc=None) - A static helper function for subclasses to add extra - authentication system properties onto a class: + A static helper function for Authentication subclasses to add + extra authentication system properties onto a class: class FooAuthenticate(WWWAuthenticate): special_realm = auth_property('special_realm') For more information have a look at the sourcecode to see how - the regular properties (*note realm: 250. etc.) are + the regular properties (*note realm: 225. etc.) are implemented. - -- Attribute: domain + -- Property: domain A list of URIs that define the protection space. If a URI is an absolute path, it is relative to the canonical root URL of the server being accessed. - -- Attribute: nonce + -- Property: nonce A server-specified data string which should be uniquely generated each time a 401 response is made. It is recommended that this string be base64 or hexadecimal data. - -- Attribute: opaque + -- Property: opaque A string of data, specified by the server, which should be returned by the client unchanged in the Authorization header @@ -8144,12 +9941,12 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, It is recommended that this string be base64 or hexadecimal data. - -- Attribute: qop + -- Property: qop A set of quality-of-privacy directives such as auth and auth-int. - -- Attribute: realm + -- Property: realm A string to be displayed to users so they know which username and password to use. This string should contain at least the @@ -8161,12 +9958,12 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, Clear the auth info and enable basic auth. - -- Method: set_digest (realm, nonce, qop=('auth', ), opaque=None, + -- Method: set_digest (realm, nonce, qop=('auth',), opaque=None, algorithm=None, stale=False) Clear the auth info and enable digest auth. - -- Attribute: stale + -- Property: stale A flag, indicating that the previous request from the client was rejected because the nonce value was stale. @@ -8175,7 +9972,7 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, Convert the stored values into a WWW-Authenticate header. - -- Attribute: type + -- Property: type The type of the auth mechanism. HTTP currently specifies ‘Basic’ and ‘Digest’. @@ -8188,11 +9985,11 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, New in version 0.7. - -- Attribute: date = None + -- Attribute: date The date in parsed format or ‘None’. - -- Attribute: etag = None + -- Attribute: etag The etag parsed and unquoted. Ranges always operate on strong etags so the weakness information is not necessary. @@ -8216,7 +10013,7 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, -- Method: make_content_range (length) - Creates a *note ContentRange: 14c. object from the current + Creates a *note ContentRange: 113. object from the current range and given content length. -- Method: range_for_length (length) @@ -8225,7 +10022,7 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, exactly one range and it is satisfiable it returns a ‘(start, stop)’ tuple, otherwise ‘None’. - -- Attribute: ranges = None + -- Attribute: ranges A list of ‘(begin, end)’ tuples for the range header provided. The ranges are non-inclusive. @@ -8239,7 +10036,7 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, Converts the object back into an HTTP header. - -- Attribute: units = None + -- Attribute: units The units of this range. Usually “bytes”. @@ -8250,7 +10047,7 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, New in version 0.7. - -- Attribute: length + -- Property: length The length of the range or ‘None’. @@ -8258,16 +10055,16 @@ File: werkzeug.info, Node: HTTP Related, Next: Others, Prev: General Purpose, Simple method to update the ranges. - -- Attribute: start + -- Property: start The start point of the range or ‘None’. - -- Attribute: stop + -- Property: stop The stop point of the range (non-inclusive) or ‘None’. Can only be ‘None’ if also start is ‘None’. - -- Attribute: units + -- Property: units The units to use, usually “bytes” @@ -8328,14 +10125,14 @@ https://docs.python.org/3/library/wsgiref.html#wsgiref.headers.Headers.get_all  File: werkzeug.info, Node: Others, Prev: HTTP Related, Up: Data Structures -3.6.3 Others +3.5.3 Others ------------ -- Class: werkzeug.datastructures.FileStorage (stream=None, filename=None, name=None, content_type=None, content_length=None, headers=None) - The *note FileStorage: b3. class is a thin wrapper over incoming + The *note FileStorage: b9. class is a thin wrapper over incoming files. It is used by the request object to represent uploaded files. All the attributes of the wrapper stream are proxied by the file storage so it’s possible to do ‘storage.read()’ instead of the @@ -8356,7 +10153,7 @@ File: werkzeug.info, Node: Others, Prev: HTTP Related, Up: Data Structures -- Attribute: headers - The multipart headers as *note Headers: d9. object. This + The multipart headers as *note Headers: 70. object. This usually contains irrelevant information but in combination with custom multipart requests the raw headers might be interesting. @@ -8367,24 +10164,24 @@ File: werkzeug.info, Node: Others, Prev: HTTP Related, Up: Data Structures Close the underlying file if possible. - -- Attribute: content_length + -- Property: content_length The content-length sent in the header. Usually not available - -- Attribute: content_type + -- Property: content_type The content-type sent in the header. Usually not available - -- Attribute: mimetype + -- Property: mimetype - Like *note content_type: 270, but without parameters (eg, + Like *note content_type: 245, but without parameters (eg, without charset, type etc.) and always lowercase. For example if the content type is ‘text/HTML; charset=utf-8’ the mimetype would be ‘'text/html'’. New in version 0.7. - -- Attribute: mimetype_params + -- Property: mimetype_params The mimetype parameters as dict. For example if the content type is ‘text/html; charset=utf-8’ the params would be @@ -8424,130 +10221,65 @@ File: werkzeug.info, Node: Others, Prev: HTTP Related, Up: Data Structures  File: werkzeug.info, Node: Utilities, Next: URL Helpers<2>, Prev: Data Structures, Up: Reference -3.7 Utilities +3.6 Utilities ============= Various utility functions shipped with Werkzeug. * Menu: -* HTML Helpers:: * General Helpers:: * URL Helpers:: -* UserAgent Parsing:: +* User Agent API:: * Security Helpers:: * Logging::  -File: werkzeug.info, Node: HTML Helpers, Next: General Helpers, Up: Utilities +File: werkzeug.info, Node: General Helpers, Next: URL Helpers, Up: Utilities -3.7.1 HTML Helpers ------------------- +3.6.1 General Helpers +--------------------- - -- Class: werkzeug.utils.HTMLBuilder (dialect) + -- Class: werkzeug.utils.cached_property (fget, name=None, doc=None) - Helper object for HTML generation. + A ‘property()’ that is only evaluated once. Subsequent access + returns the cached value. Setting the property sets the cached + value. Deleting the property clears the cached value, accessing it + again will evaluate it again. - Per default there are two instances of that class. The ‘html’ one, - and the ‘xhtml’ one for those two dialects. The class uses keyword - parameters and positional parameters to generate small snippets of - HTML. + class Example: + @cached_property + def value(self): + # calculate something important here + return 42 - Keyword parameters are converted to XML/SGML attributes, positional - arguments are used as children. Because Python accepts positional - arguments before keyword arguments it’s a good idea to use a list - with the star-syntax for some children: + e = Example() + e.value # evaluates + e.value # uses cache + e.value = 16 # sets cache + del e.value # clears cache - >>> html.p(class_='foo', *[html.a('foo', href='foo.html'), ' ', - ... html.a('bar', href='bar.html')]) - u'

foo bar

' + The class must have a ‘__dict__’ for this to work. - This class works around some browser limitations and can not be - used for arbitrary SGML/XML generation. For that purpose lxml and - similar libraries exist. - - Calling the builder escapes the string passed: - - >>> html.p(html("")) - u'

<foo>

' - - -- Function: werkzeug.utils.escape (s) - - Replace special characters “&”, “<”, “>” and (”) to HTML-safe - sequences. - - There is a special handling for ‘None’ which escapes to an empty - string. - - Changed in version 0.9: ‘quote’ is now implicitly on. + Changed in version 2.0: ‘del obj.name’ clears the cached value. Parameters: - * ‘s’ – the string to escape. + * ‘fget’ (‘Callable’‘[’‘[’‘Any’‘]’‘, ’‘werkzeug.utils._T’‘]’) – - * ‘quote’ – ignored. + * ‘name’ (‘Optional’‘[’str(1)‘]’) – - -- Function: werkzeug.utils.unescape (s) - - The reverse function of ‘escape’. This unescapes all the HTML - entities, not only the XML entities inserted by ‘escape’. + * ‘doc’ (‘Optional’‘[’str(2)‘]’) – - Parameters: ‘s’ – the string to unescape. - - -File: werkzeug.info, Node: General Helpers, Next: URL Helpers, Prev: HTML Helpers, Up: Utilities - -3.7.2 General Helpers ---------------------- - - -- Class: werkzeug.utils.cached_property (func, name=None, doc=None) - - A decorator that converts a function into a lazy property. The - function wrapped is called the first time to retrieve the result - and then that calculated result is used the next time you access - the value: - - class Foo(object): - - @cached_property - def foo(self): - # calculate something important here - return 42 - - The class has to have a ‘__dict__’ in order for this property to - work. - - -- Function: werkzeug.utils.invalidate_cached_property (obj, name) - - Invalidates the cache for a *note cached_property: 27a.: - - >>> class Test(object): - ... @cached_property - ... def magic_number(self): - ... print("recalculating...") - ... return 42 - ... - >>> var = Test() - >>> var.magic_number - recalculating... - 42 - >>> var.magic_number - 42 - >>> invalidate_cached_property(var, "magic_number") - >>> var.magic_number - recalculating... - 42 - - You must pass the name of the cached property as the second - argument. + Return type: None(3) -- Class: werkzeug.utils.environ_property (name, default=None, load_func=None, dump_func=None, read_only=None, doc=None) Maps request attributes to environment variables. This works not - only for the Werzeug request object, but also any other class with + only for the Werkzeug request object, but also any other class with an environ attribute: >>> class Test(object): @@ -8559,7 +10291,7 @@ File: werkzeug.info, Node: General Helpers, Next: URL Helpers, Prev: HTML Hel If you pass it a second value it’s used as default if the key does not exist, the third one can be a converter that takes a value and - converts it. If it raises ValueError(1) or TypeError(2) the + converts it. If it raises ValueError(4) or TypeError(5) the default value is used. If no default value is provided ‘None’ is used. @@ -8589,13 +10321,17 @@ File: werkzeug.info, Node: General Helpers, Next: URL Helpers, Prev: HTML Hel Parameters: - * ‘location’ – the location the response should redirect to. + * ‘location’ (str(6)) – the location the response should + redirect to. - * ‘code’ – the redirect status code. defaults to 302. + * ‘code’ (int(7)) – the redirect status code. defaults to 302. * ‘Response’ (‘class’) – a Response class to use when instantiating a response. The default is *note - werkzeug.wrappers.Response: 9a. if unspecified. + werkzeug.wrappers.Response: 5e. if unspecified. + + + Return type: *note Response: 5e. -- Function: werkzeug.utils.append_slash_redirect (environ, code=301) @@ -8606,10 +10342,115 @@ File: werkzeug.info, Node: General Helpers, Next: URL Helpers, Prev: HTML Hel Parameters: - * ‘environ’ – the WSGI environment for the request that triggers - the redirect. + * ‘environ’ (‘WSGIEnvironment’) – the WSGI environment for the + request that triggers the redirect. - * ‘code’ – the status code for the redirect. + * ‘code’ (int(8)) – the status code for the redirect. + + + Return type: *note Response: 5e. + + -- Function: werkzeug.utils.send_file (path_or_file, environ, + mimetype=None, as_attachment=False, download_name=None, + conditional=True, etag=True, last_modified=None, max_age=None, + use_x_sendfile=False, response_class=None, _root_path=None) + + Send the contents of a file to the client. + + The first argument can be a file path or a file-like object. Paths + are preferred in most cases because Werkzeug can manage the file + and get extra information from the path. Passing a file-like + object requires that the file is opened in binary mode, and is + mostly useful when building a file in memory with io.BytesIO(9). + + Never pass file paths provided by a user. The path is assumed to + be trusted, so a user could craft a path to access a file you + didn’t intend. + + If the WSGI server sets a ‘file_wrapper’ in ‘environ’, it is used, + otherwise Werkzeug’s built-in wrapper is used. Alternatively, if + the HTTP server supports ‘X-Sendfile’, ‘use_x_sendfile=True’ will + tell the server to send the given path, which is much more + efficient than reading it in Python. + + + Parameters: + + * ‘path_or_file’ (‘Union’‘[’os.PathLike(10)‘, ’str(11)‘, + ’‘IO’‘[’bytes(12)‘]’‘]’) – The path to the file to send, + relative to the current working directory if a relative path + is given. Alternatively, a file-like object opened in binary + mode. Make sure the file pointer is seeked to the start of + the data. + + * ‘environ’ (‘WSGIEnvironment’) – The WSGI environ for the + current request. + + * ‘mimetype’ (‘Optional’‘[’str(13)‘]’) – The MIME type to send + for the file. If not provided, it will try to detect it from + the file name. + + * ‘as_attachment’ (bool(14)) – Indicate to a browser that it + should offer to save the file instead of displaying it. + + * ‘download_name’ (‘Optional’‘[’str(15)‘]’) – The default name + browsers will use when saving the file. Defaults to the + passed file name. + + * ‘conditional’ (bool(16)) – Enable conditional and range + responses based on request headers. Requires passing a file + path and ‘environ’. + + * ‘etag’ (‘Union’‘[’bool(17)‘, ’str(18)‘]’) – Calculate an ETag + for the file, which requires passing a file path. Can also be + a string to use instead. + + * ‘last_modified’ + (‘Optional’‘[’‘Union’‘[’datetime.datetime(19)‘, ’int(20)‘, + ’float(21)‘]’‘]’) – The last modified time to send for the + file, in seconds. If not provided, it will try to detect it + from the file path. + + * ‘max_age’ (‘Optional’‘[’‘Union’‘[’int(22)‘, + ’‘Callable’‘[’‘[’‘Optional’‘[’str(23)‘]’‘]’‘, + ’‘Optional’‘[’int(24)‘]’‘]’‘]’‘]’) – How long the client + should cache the file, in seconds. If set, ‘Cache-Control’ + will be ‘public’, otherwise it will be ‘no-cache’ to prefer + conditional caching. + + * ‘use_x_sendfile’ (bool(25)) – Set the ‘X-Sendfile’ header to + let the server to efficiently send the file. Requires support + from the HTTP server. Requires passing a file path. + + * ‘response_class’ (‘Optional’‘[’‘Type’‘[’*note Response: + 5e.‘]’‘]’) – Build the response using this class. Defaults to + *note Response: 5e. + + * ‘_root_path’ (‘Optional’‘[’‘Union’‘[’os.PathLike(26)‘, + ’str(27)‘]’‘]’) – Do not use. For internal use only. Use + ‘send_from_directory()’ to safely send files under a path. + + + Return type: *note Response: 5e. + + Changed in version 2.0.2: ‘send_file’ only sets a detected + ‘Content-Encoding’ if ‘as_attachment’ is disabled. + + New in version 2.0: Adapted from Flask’s implementation. + + Changed in version 2.0: ‘download_name’ replaces Flask’s + ‘attachment_filename’ parameter. If ‘as_attachment=False’, it is + passed with ‘Content-Disposition: inline’ instead. + + Changed in version 2.0: ‘max_age’ replaces Flask’s ‘cache_timeout’ + parameter. ‘conditional’ is enabled and ‘max_age’ is not set by + default. + + Changed in version 2.0: ‘etag’ replaces Flask’s ‘add_etags’ + parameter. It can be a string to use instead of generating one. + + Changed in version 2.0: If an encoding is returned when guessing + ‘mimetype’ from ‘download_name’, set the ‘Content-Encoding’ header. -- Function: werkzeug.utils.import_string (import_name, silent=False) @@ -8625,14 +10466,18 @@ File: werkzeug.info, Node: General Helpers, Next: URL Helpers, Prev: HTML Hel Parameters: - * ‘import_name’ – the dotted name for the object to import. + * ‘import_name’ (str(28)) – the dotted name for the object to + import. - * ‘silent’ – if set to ‘True’ import errors are ignored and - ‘None’ is returned instead. + * ‘silent’ (bool(29)) – if set to ‘True’ import errors are + ignored and ‘None’ is returned instead. Returns: imported object + + Return type: Any + -- Function: werkzeug.utils.find_modules (import_path, include_packages=False, recursive=False) @@ -8649,80 +10494,26 @@ File: werkzeug.info, Node: General Helpers, Next: URL Helpers, Prev: HTML Hel Parameters: - * ‘import_path’ – the dotted name for the package to find child - modules. + * ‘import_path’ (str(30)) – the dotted name for the package to + find child modules. - * ‘include_packages’ – set to ‘True’ if packages should be - returned, too. + * ‘include_packages’ (bool(31)) – set to ‘True’ if packages + should be returned, too. - * ‘recursive’ – set to ‘True’ if recursion should happen. + * ‘recursive’ (bool(32)) – set to ‘True’ if recursion should + happen. Returns: generator - -- Function: werkzeug.utils.validate_arguments (func, args, kwargs, - drop_extra=True) - Checks if the function accepts the arguments and keyword arguments. - Returns a new ‘(args, kwargs)’ tuple that can safely be passed to - the function without causing a ‘TypeError’ because the function - signature is incompatible. If ‘drop_extra’ is set to ‘True’ (which - is the default) any extra positional or keyword arguments are - dropped automatically. - - The exception raised provides three attributes: - - ‘missing’ - - A set of argument names that the function expected but where - missing. - - ‘extra’ - - A dict of keyword arguments that the function can not handle - but where provided. - - ‘extra_positional’ - - A list of values that where given by positional argument but - the function cannot accept. - - This can be useful for decorators that forward user submitted data - to a view function: - - from werkzeug.utils import ArgumentValidationError, validate_arguments - - def sanitize(f): - def proxy(request): - data = request.values.to_dict() - try: - args, kwargs = validate_arguments(f, (request,), data) - except ArgumentValidationError: - raise BadRequest('The browser failed to transmit all ' - 'the data expected.') - return f(*args, **kwargs) - return proxy - - - Parameters: - - * ‘func’ – the function the validation is performed against. - - * ‘args’ – a tuple of positional arguments. - - * ‘kwargs’ – a dict of keyword arguments. - - * ‘drop_extra’ – set to ‘False’ if you don’t want extra - arguments to be silently dropped. - - - Returns: tuple in the form ‘(args, kwargs)’. + Return type: Iterator[str(33)] -- Function: werkzeug.utils.secure_filename (filename) Pass it a filename and it will return a secure version of it. This filename can then safely be stored on a regular file system and - passed to os.path.join()(3). The filename returned is an ASCII + passed to os.path.join()(34). The filename returned is an ASCII only string for maximum portability. On windows systems the function also makes sure that the file is @@ -8732,7 +10523,7 @@ File: werkzeug.info, Node: General Helpers, Next: URL Helpers, Prev: HTML Hel 'My_cool_movie.mov' >>> secure_filename("../../../etc/passwd") 'etc_passwd' - >>> secure_filename(u'i contain cool \xfcml\xe4uts.txt') + >>> secure_filename('i contain cool \xfcml\xe4uts.txt') 'i_contain_cool_umlauts.txt' The function might return an empty filename. It’s your @@ -8743,185 +10534,175 @@ File: werkzeug.info, Node: General Helpers, Next: URL Helpers, Prev: HTML Hel New in version 0.5. - Parameters: ‘filename’ – the filename to secure - - -- Function: werkzeug.utils.bind_arguments (func, args, kwargs) - - Bind the arguments provided into a dict. When passed a function, a - tuple of arguments and a dict of keyword arguments ‘bind_arguments’ - returns a dict of names as the function would see it. This can be - useful to implement a cache decorator that uses the function - arguments to build the cache key based on the values of the - arguments. + Parameters: ‘filename’ (str(35)) – the filename to secure - Parameters: - - * ‘func’ – the function the arguments should be bound for. - - * ‘args’ – tuple of positional arguments. - - * ‘kwargs’ – a dict of keyword arguments. - - - Returns: a dict(4) of bound keyword arguments. + Return type: str(36) ---------- Footnotes ---------- - (1) https://docs.python.org/3/library/exceptions.html#ValueError + (1) https://docs.python.org/3/library/stdtypes.html#str - (2) https://docs.python.org/3/library/exceptions.html#TypeError + (2) https://docs.python.org/3/library/stdtypes.html#str - (3) https://docs.python.org/3/library/os.path.html#os.path.join + (3) https://docs.python.org/3/library/constants.html#None - (4) https://docs.python.org/3/library/stdtypes.html#dict + (4) https://docs.python.org/3/library/exceptions.html#ValueError + + (5) https://docs.python.org/3/library/exceptions.html#TypeError + + (6) https://docs.python.org/3/library/stdtypes.html#str + + (7) https://docs.python.org/3/library/functions.html#int + + (8) https://docs.python.org/3/library/functions.html#int + + (9) https://docs.python.org/3/library/io.html#io.BytesIO + + (10) https://docs.python.org/3/library/os.html#os.PathLike + + (11) https://docs.python.org/3/library/stdtypes.html#str + + (12) https://docs.python.org/3/library/stdtypes.html#bytes + + (13) https://docs.python.org/3/library/stdtypes.html#str + + (14) https://docs.python.org/3/library/functions.html#bool + + (15) https://docs.python.org/3/library/stdtypes.html#str + + (16) https://docs.python.org/3/library/functions.html#bool + + (17) https://docs.python.org/3/library/functions.html#bool + + (18) https://docs.python.org/3/library/stdtypes.html#str + + (19) +https://docs.python.org/3/library/datetime.html#datetime.datetime + + (20) https://docs.python.org/3/library/functions.html#int + + (21) https://docs.python.org/3/library/functions.html#float + + (22) https://docs.python.org/3/library/functions.html#int + + (23) https://docs.python.org/3/library/stdtypes.html#str + + (24) https://docs.python.org/3/library/functions.html#int + + (25) https://docs.python.org/3/library/functions.html#bool + + (26) https://docs.python.org/3/library/os.html#os.PathLike + + (27) https://docs.python.org/3/library/stdtypes.html#str + + (28) https://docs.python.org/3/library/stdtypes.html#str + + (29) https://docs.python.org/3/library/functions.html#bool + + (30) https://docs.python.org/3/library/stdtypes.html#str + + (31) https://docs.python.org/3/library/functions.html#bool + + (32) https://docs.python.org/3/library/functions.html#bool + + (33) https://docs.python.org/3/library/stdtypes.html#str + + (34) https://docs.python.org/3/library/os.path.html#os.path.join + + (35) https://docs.python.org/3/library/stdtypes.html#str + + (36) https://docs.python.org/3/library/stdtypes.html#str  -File: werkzeug.info, Node: URL Helpers, Next: UserAgent Parsing, Prev: General Helpers, Up: Utilities +File: werkzeug.info, Node: URL Helpers, Next: User Agent API, Prev: General Helpers, Up: Utilities -3.7.3 URL Helpers +3.6.2 URL Helpers ----------------- -Please refer to *note URL Helpers: 286. +Please refer to *note URL Helpers: 254.  -File: werkzeug.info, Node: UserAgent Parsing, Next: Security Helpers, Prev: URL Helpers, Up: Utilities +File: werkzeug.info, Node: User Agent API, Next: Security Helpers, Prev: URL Helpers, Up: Utilities -3.7.4 UserAgent Parsing ------------------------ +3.6.3 User Agent API +-------------------- - -- Class: werkzeug.useragents.UserAgent (environ_or_string) + -- Class: werkzeug.user_agent.UserAgent (string) - Represents a user agent. Pass it a WSGI environment or a user - agent string and you can inspect some of the details from the user - agent string via the attributes. The following attributes exist: + Represents a parsed user agent header value. - -- Attribute: string + The default implementation does no parsing, only the *note string: + 256. attribute is set. A subclass may parse the string to set the + common attributes or expose other information. Set *note + werkzeug.wrappers.Request.user_agent_class: f5. to use a subclass. - the raw user agent string - -- Attribute: platform + Parameters: ‘string’ (str(1)) – The header value to parse. - the browser platform. ‘None’ if not recognized. The - following platforms are currently recognized: - - ‘aix’ + Return type: None(2) - - ‘amiga’ + New in version 2.0: This replaces the previous ‘useragents’ module, + but does not provide a built-in parser. - - ‘android’ + -- Attribute: platform: Optional[str(3)] = None - - ‘blackberry’ + The OS name, if it could be parsed from the string. - - ‘bsd’ + -- Attribute: browser: Optional[str(4)] = None - - ‘chromeos’ + The browser name, if it could be parsed from the string. - - ‘dragonflybsd’ + -- Attribute: version: Optional[str(5)] = None - - ‘freebsd’ + The browser version, if it could be parsed from the string. - - ‘hpux’ + -- Attribute: language: Optional[str(6)] = None - - ‘ipad’ + The browser language, if it could be parsed from the string. - - ‘iphone’ + -- Attribute: string: str(7) - - ‘irix’ + The original header value. - - ‘linux’ + -- Method: to_header () - - ‘macos’ + Convert to a header value. - - ‘netbsd’ - - ‘openbsd’ + Return type: str(8) - - ‘sco’ + ---------- Footnotes ---------- - - ‘solaris’ + (1) https://docs.python.org/3/library/stdtypes.html#str - - ‘symbian’ + (2) https://docs.python.org/3/library/constants.html#None - - ‘wii’ + (3) https://docs.python.org/3/library/stdtypes.html#str - - ‘windows’ + (4) https://docs.python.org/3/library/stdtypes.html#str - -- Attribute: browser + (5) https://docs.python.org/3/library/stdtypes.html#str - the name of the browser. ‘None’ if not recognized. The - following browsers are currently recognized: + (6) https://docs.python.org/3/library/stdtypes.html#str - - ‘aol’ * + (7) https://docs.python.org/3/library/stdtypes.html#str - - ‘ask’ * - - - ‘baidu’ * - - - ‘bing’ * - - - ‘camino’ - - - ‘chrome’ - - - ‘edge’ - - - ‘firefox’ - - - ‘galeon’ - - - ‘google’ * - - - ‘kmeleon’ - - - ‘konqueror’ - - - ‘links’ - - - ‘lynx’ - - - ‘mozilla’ - - - ‘msie’ - - - ‘msn’ - - - ‘netscape’ - - - ‘opera’ - - - ‘safari’ - - - ‘seamonkey’ - - - ‘webkit’ - - - ‘yahoo’ * - - (Browsers marked with a star (‘*’) are crawlers.) - - -- Attribute: version - - the version of the browser. ‘None’ if not recognized. - - -- Attribute: language - - the language of the browser. ‘None’ if not recognized. + (8) https://docs.python.org/3/library/stdtypes.html#str  -File: werkzeug.info, Node: Security Helpers, Next: Logging, Prev: UserAgent Parsing, Up: Utilities +File: werkzeug.info, Node: Security Helpers, Next: Logging, Prev: User Agent API, Up: Utilities -3.7.5 Security Helpers +3.6.4 Security Helpers ---------------------- -New in version 0.6.1. - -- Function: werkzeug.security.generate_password_hash (password, - method='pbkdf2:sha256', salt_length=8) + method='pbkdf2:sha256', salt_length=16) Hash a password with the given method and salt with a string of the given length. The format of the string returned includes the - method that was used so that *note check_password_hash(): 28f. can + method that was used so that *note check_password_hash(): 25e. can check the hash. The format for the hashed string looks like this: @@ -8942,17 +10723,20 @@ New in version 0.6.1. Parameters: - * ‘password’ – the password to hash. + * ‘password’ (str(1)) – the password to hash. - * ‘method’ – the hash method to use (one that hashlib supports). - Can optionally be in the format ‘pbkdf2:[:iterations]’ - to enable PBKDF2. + * ‘method’ (str(2)) – the hash method to use (one that hashlib + supports). Can optionally be in the format + ‘pbkdf2:method:iterations’ to enable PBKDF2. - * ‘salt_length’ – the length of the salt in letters. + * ‘salt_length’ (int(3)) – the length of the salt in letters. + + + Return type: str(4) -- Function: werkzeug.security.check_password_hash (pwhash, password) - check a password against a given salted and hashed password value. + Check a password against a given salted and hashed password value. In order to support unsalted legacy passwords this method supports plain text passwords, md5 and sha1 hashes (both salted and unsalted). @@ -8962,22 +10746,14 @@ New in version 0.6.1. Parameters: - * ‘pwhash’ – a hashed string like returned by *note - generate_password_hash(): 28e. + * ‘pwhash’ (str(5)) – a hashed string like returned by *note + generate_password_hash(): 25d. - * ‘password’ – the plaintext password to compare against the - hash. + * ‘password’ (str(6)) – the plaintext password to compare + against the hash. - -- Function: werkzeug.security.safe_str_cmp (a, b) - This function compares strings in somewhat constant time. This - requires that the length of at least one string is known in - advance. - - Returns ‘True’ if the two strings are equal, or ‘False’ if they are - not. - - New in version 0.7. + Return type: bool(7) -- Function: werkzeug.security.safe_join (directory, *pathnames) @@ -8987,67 +10763,43 @@ New in version 0.6.1. Parameters: - * ‘directory’ – The trusted base directory. + * ‘directory’ (str(8)) – The trusted base directory. - * ‘pathnames’ – The untrusted path components relative to the - base directory. + * ‘pathnames’ (str(9)) – The untrusted path components relative + to the base directory. Returns: A safe path, otherwise ‘None’. - -- Function: werkzeug.security.pbkdf2_hex (data, salt, - iterations=150000, keylen=None, hashfunc=None) - Like *note pbkdf2_bin(): 293, but returns a hex-encoded string. + Return type: Optional[str(10)] - New in version 0.9. + ---------- Footnotes ---------- + (1) https://docs.python.org/3/library/stdtypes.html#str - Parameters: + (2) https://docs.python.org/3/library/stdtypes.html#str - * ‘data’ – the data to derive. + (3) https://docs.python.org/3/library/functions.html#int - * ‘salt’ – the salt for the derivation. + (4) https://docs.python.org/3/library/stdtypes.html#str - * ‘iterations’ – the number of iterations. + (5) https://docs.python.org/3/library/stdtypes.html#str - * ‘keylen’ – the length of the resulting key. If not provided, - the digest size will be used. + (6) https://docs.python.org/3/library/stdtypes.html#str - * ‘hashfunc’ – the hash function to use. This can either be the - string name of a known hash function, or a function from the - hashlib module. Defaults to sha256. + (7) https://docs.python.org/3/library/functions.html#bool - -- Function: werkzeug.security.pbkdf2_bin (data, salt, - iterations=150000, keylen=None, hashfunc=None) + (8) https://docs.python.org/3/library/stdtypes.html#str - Returns a binary digest for the PBKDF2 hash algorithm of ‘data’ - with the given ‘salt’. It iterates ‘iterations’ times and produces - a key of ‘keylen’ bytes. By default, SHA-256 is used as hash - function; a different hashlib ‘hashfunc’ can be provided. + (9) https://docs.python.org/3/library/stdtypes.html#str - New in version 0.9. - - - Parameters: - - * ‘data’ – the data to derive. - - * ‘salt’ – the salt for the derivation. - - * ‘iterations’ – the number of iterations. - - * ‘keylen’ – the length of the resulting key. If not provided - the digest size will be used. - - * ‘hashfunc’ – the hash function to use. This can either be the - string name of a known hash function or a function from the - hashlib module. Defaults to sha256. + (10) https://docs.python.org/3/library/stdtypes.html#str  File: werkzeug.info, Node: Logging, Prev: Security Helpers, Up: Utilities -3.7.6 Logging +3.6.5 Logging ------------- Werkzeug uses standard Python logging(1). The logger is named @@ -9069,47 +10821,43 @@ https://docs.python.org/3/library/logging.handlers.html#logging.StreamHandler  File: werkzeug.info, Node: URL Helpers<2>, Next: Context Locals, Prev: Utilities, Up: Reference -3.8 URL Helpers +3.7 URL Helpers =============== -* Menu: +Functions for working with URLs. -* werkzeug.urls: werkzeug urls. +Contains implementations of functions from urllib.parse(1) that handle +bytes and strings. - -File: werkzeug.info, Node: werkzeug urls, Up: URL Helpers<2> + -- Class: werkzeug.urls.BaseURL (scheme, netloc, path, query, fragment) -3.8.1 werkzeug.urls -------------------- + Superclass of *note URL: 263. and *note BytesURL: 264. -‘werkzeug.urls’ used to provide several wrapper functions for Python 2 -urlparse, whose main purpose were to work around the behavior of the Py2 -stdlib and its lack of unicode support. While this was already a -somewhat inconvenient situation, it got even more complicated because -Python 3’s ‘urllib.parse’ actually does handle unicode properly. In -other words, this module would wrap two libraries with completely -different behavior. So now this module contains a 2-and-3-compatible -backport of Python 3’s ‘urllib.parse’, which is mostly API-compatible. + Create new instance of _URLTuple(scheme, netloc, path, query, + fragment) -copyright: 2007 Pallets + Parameters: + * ‘scheme’ (str(2)) – -license: BSD-3-Clause + * ‘netloc’ (str(3)) – - -- Class: werkzeug.urls.BaseURL + * ‘path’ (str(4)) – - Superclass of *note URL: 298. and *note BytesURL: 299. + * ‘query’ (str(5)) – - -- Attribute: ascii_host + * ‘fragment’ (str(6)) – - Works exactly like *note host: 29b. but will return a result + -- Property: ascii_host: Optional[str(7)] + + Works exactly like *note host: 266. but will return a result that is restricted to ASCII. If it finds a netloc that is not ASCII it will attempt to idna decode it. This is useful for socket operations when the URL might include internationalized characters. - -- Attribute: auth + -- Property: auth: Optional[str(8)] The authentication part in the URL if available, ‘None’ otherwise. @@ -9118,12 +10866,32 @@ license: BSD-3-Clause Decodes the netloc part into a string. + + Return type: str(9) + -- Method: decode_query (*args, **kwargs) Decodes the query part of the URL. Ths is a shortcut for - calling *note url_decode(): 29f. on the query argument. The + calling *note url_decode(): 26a. on the query argument. The arguments and keyword arguments are forwarded to *note - url_decode(): 29f. unchanged. + url_decode(): 26a. unchanged. + + + Parameters: + + * ‘args’ (‘Any’) – + + * ‘kwargs’ (‘Any’) – + + + Return type: ds.MultiDict[str(10), str(11)] + + -- Method: encode_netloc () + + Encodes the netloc part to an ASCII safe URL as bytes. + + + Return type: str(12) -- Method: get_file_location (pathformat=None) @@ -9140,11 +10908,15 @@ license: BSD-3-Clause location are both represented as ‘None’. - Parameters: ‘pathformat’ – The expected format of the path - component. Currently ‘'windows'’ and ‘'posix'’ are supported. - Defaults to ‘None’ which is autodetect. + Parameters: ‘pathformat’ (‘Optional’‘[’str(13)‘]’) – The + expected format of the path component. Currently ‘'windows'’ + and ‘'posix'’ are supported. Defaults to ‘None’ which is + autodetect. - -- Attribute: host + + Return type: Tuple[Optional[str(14)], Optional[str(15)]] + + -- Property: host: Optional[str(16)] The host part of the URL if available, otherwise ‘None’. The host is either the hostname or the IP address mentioned in the @@ -9153,29 +10925,38 @@ license: BSD-3-Clause -- Method: join (*args, **kwargs) Joins this URL with another one. This is just a convenience - function for calling into *note url_join(): 2a2. and then + function for calling into *note url_join(): 26e. and then parsing the return value again. - -- Attribute: password + + Parameters: + + * ‘args’ (‘Any’) – + + * ‘kwargs’ (‘Any’) – + + + Return type: *note werkzeug.urls.BaseURL: 262. + + -- Property: password: Optional[str(17)] The password if it was part of the URL, ‘None’ otherwise. - This undergoes URL decoding and will always be a unicode - string. + This undergoes URL decoding and will always be a string. - -- Attribute: port + -- Property: port: Optional[int(18)] The port in the URL as an integer if it was present, ‘None’ otherwise. This does not fill in default ports. - -- Attribute: raw_password + -- Property: raw_password: Optional[str(19)] The password if it was part of the URL, ‘None’ otherwise. - Unlike *note password: 2a3. this one is not being decoded. + Unlike *note password: 26f. this one is not being decoded. - -- Attribute: raw_username + -- Property: raw_username: Optional[str(20)] The username if it was part of the URL, ‘None’ otherwise. - Unlike *note username: 2a7. this one is not being decoded. + Unlike *note username: 273. this one is not being decoded. -- Method: replace (**kwargs) @@ -9183,115 +10964,129 @@ license: BSD-3-Clause parameters given new values by whichever keyword arguments are specified. + + Parameters: ‘kwargs’ (‘Any’) – + + + Return type: *note werkzeug.urls.BaseURL: 262. + -- Method: to_iri_tuple () - Returns a *note URL: 298. tuple that holds a IRI. This will + Returns a *note URL: 263. tuple that holds a IRI. This will try to decode as much information as possible in the URL without losing information similar to how a web browser does it for the URL bar. It’s usually more interesting to directly call *note - uri_to_iri(): 2aa. which will return a string. + uri_to_iri(): 276. which will return a string. + + + Return type: *note werkzeug.urls.BaseURL: 262. -- Method: to_uri_tuple () - Returns a *note BytesURL: 299. tuple that holds a URI. This + Returns a *note BytesURL: 264. tuple that holds a URI. This will encode all the information in the URL properly to ASCII using the rules a web browser would follow. It’s usually more interesting to directly call *note - iri_to_uri(): 1a4. which will return a string. + iri_to_uri(): 184. which will return a string. + + + Return type: *note werkzeug.urls.BaseURL: 262. -- Method: to_url () Returns a URL string or bytes depending on the type of the information stored. This is just a convenience function for - calling *note url_unparse(): 2ad. for this URL. + calling *note url_unparse(): 279. for this URL. - -- Attribute: username + + Return type: str(21) + + -- Property: username: Optional[str(22)] The username if it was part of the URL, ‘None’ otherwise. - This undergoes URL decoding and will always be a unicode - string. + This undergoes URL decoding and will always be a string. - -- Class: werkzeug.urls.BytesURL + -- Class: werkzeug.urls.BytesURL (scheme, netloc, path, query, + fragment) Represents a parsed URL in bytes. + Create new instance of _URLTuple(scheme, netloc, path, query, + fragment) + + + Parameters: + + * ‘scheme’ (str(23)) – + + * ‘netloc’ (str(24)) – + + * ‘path’ (str(25)) – + + * ‘query’ (str(26)) – + + * ‘fragment’ (str(27)) – + -- Method: decode (charset='utf-8', errors='replace') Decodes the URL to a tuple made out of strings. The charset is only being used for the path, query and fragment. + + Parameters: + + * ‘charset’ (str(28)) – + + * ‘errors’ (str(29)) – + + + Return type: *note werkzeug.urls.URL: 263. + -- Method: encode_netloc () Returns the netloc unchanged as bytes. - -- Class: werkzeug.urls.Href (base='./', charset='utf-8', sort=False, - key=None) - Implements a callable that constructs URLs with the given base. - The function can be called with any number of positional and - keyword arguments which than are used to assemble the URL. Works - with URLs and posix paths. + Return type: bytes(30) - Positional arguments are appended as individual segments to the - path of the URL: - - >>> href = Href('/foo') - >>> href('bar', 23) - '/foo/bar/23' - >>> href('foo', bar=23) - '/foo/foo?bar=23' - - If any of the arguments (positional or keyword) evaluates to ‘None’ - it will be skipped. If no keyword arguments are given the last - argument can be a dict(1) or ‘MultiDict’ (or any other dict - subclass), otherwise the keyword arguments are used for the query - parameters, cutting off the first trailing underscore of the - parameter name: - - >>> href(is_=42) - '/foo?is=42' - >>> href({'foo': 'bar'}) - '/foo?foo=bar' - - Combining of both methods is not allowed: - - >>> href({'foo': 'bar'}, bar=42) - Traceback (most recent call last): - ... - TypeError: keyword arguments and query-dicts can't be combined - - Accessing attributes on the href object creates a new href object - with the attribute name as prefix: - - >>> bar_href = href.bar - >>> bar_href("blub") - '/foo/bar/blub' - - If ‘sort’ is set to ‘True’ the items are sorted by ‘key’ or the - default sorting algorithm: - - >>> href = Href("/", sort=True) - >>> href(a=1, b=2, c=3) - '/?a=1&b=2&c=3' - - New in version 0.5: ‘sort’ and ‘key’ were added. - - -- Class: werkzeug.urls.URL + -- Class: werkzeug.urls.URL (scheme, netloc, path, query, fragment) Represents a parsed URL. This behaves like a regular tuple but also has some extra attributes that give further insight into the URL. + Create new instance of _URLTuple(scheme, netloc, path, query, + fragment) + + + Parameters: + + * ‘scheme’ (str(31)) – + + * ‘netloc’ (str(32)) – + + * ‘path’ (str(33)) – + + * ‘query’ (str(34)) – + + * ‘fragment’ (str(35)) – + -- Method: encode (charset='utf-8', errors='replace') Encodes the URL to a tuple made out of bytes. The charset is only being used for the path, query and fragment. - -- Method: encode_netloc () - Encodes the netloc part to an ASCII safe URL as bytes. + Parameters: + + * ‘charset’ (str(36)) – + + * ‘errors’ (str(37)) – + + + Return type: *note werkzeug.urls.BytesURL: 264. -- Function: werkzeug.urls.iri_to_uri (iri, charset='utf-8', errors='strict', safe_conversion=False) @@ -9305,16 +11100,21 @@ license: BSD-3-Clause Parameters: - * ‘iri’ – The IRI to convert. + * ‘iri’ (‘Union’‘[’str(38)‘, ’‘Tuple’‘[’str(39)‘, ’str(40)‘, + ’str(41)‘, ’str(42)‘, ’str(43)‘]’‘]’) – The IRI to convert. - * ‘charset’ – The encoding of the IRI. + * ‘charset’ (str(44)) – The encoding of the IRI. - * ‘errors’ – Error handler to use during ‘bytes.encode’. + * ‘errors’ (str(45)) – Error handler to use during + ‘bytes.encode’. - * ‘safe_conversion’ – Return the URL unchanged if it only - contains ASCII characters and no whitespace. See the + * ‘safe_conversion’ (bool(46)) – Return the URL unchanged if it + only contains ASCII characters and no whitespace. See the explanation below. + + Return type: str(47) + There is a general problem with IRI conversion with some protocols that are in violation of the URI specification. Consider the following two IRIs: @@ -9352,12 +11152,17 @@ license: BSD-3-Clause Parameters: - * ‘uri’ – The URI to convert. + * ‘uri’ (‘Union’‘[’str(48)‘, ’‘Tuple’‘[’str(49)‘, ’str(50)‘, + ’str(51)‘, ’str(52)‘, ’str(53)‘]’‘]’) – The URI to convert. - * ‘charset’ – The encoding to encode unquoted bytes with. + * ‘charset’ (str(54)) – The encoding to encode unquoted bytes + with. - * ‘errors’ – Error handler to use during ‘bytes.encode’. By - default, invalid bytes are left quoted. + * ‘errors’ (str(55)) – Error handler to use during + ‘bytes.encode’. By default, invalid bytes are left quoted. + + + Return type: str(56) Changed in version 0.15: All reserved and invalid characters remain quoted. Previously, only some reserved characters were preserved, @@ -9366,158 +11171,157 @@ license: BSD-3-Clause New in version 0.6. -- Function: werkzeug.urls.url_decode (s, charset='utf-8', - decode_keys=False, include_empty=True, errors='replace', - separator='&', cls=None) + include_empty=True, errors='replace', separator='&', cls=None) - Parse a querystring and return it as ‘MultiDict’. There is a - difference in key decoding on different Python versions. On Python - 3 keys will always be fully decoded whereas on Python 2, keys will - remain bytestrings if they fit into ASCII. On 2.x keys can be - forced to be unicode by setting ‘decode_keys’ to ‘True’. - - If the charset is set to ‘None’ no unicode decoding will happen and - raw bytes will be returned. - - Per default a missing value for a key will default to an empty key. - If you don’t want that behavior you can set ‘include_empty’ to - ‘False’. - - Per default encoding errors are ignored. If you want a different - behavior you can set ‘errors’ to ‘'replace'’ or ‘'strict'’. In - strict mode a ‘HTTPUnicodeError’ is raised. - - Changed in version 0.5: In previous versions “;” and “&” could be - used for url decoding. This changed in 0.5 where only “&” is - supported. If you want to use “;” instead a different ‘separator’ - can be provided. - - The ‘cls’ parameter was added. + Parse a query string and return it as a ‘MultiDict’. Parameters: - * ‘s’ – a string with the query string to decode. + * ‘s’ (‘AnyStr’) – The query string to parse. - * ‘charset’ – the charset of the query string. If set to ‘None’ - no unicode decoding will take place. + * ‘charset’ (str(57)) – Decode bytes to string with this + charset. If not given, bytes are returned as-is. - * ‘decode_keys’ – Used on Python 2.x to control whether keys - should be forced to be unicode objects. If set to ‘True’ then - keys will be unicode in all cases. Otherwise, they remain - ‘str’ if they fit into ASCII. + * ‘include_empty’ (bool(58)) – Include keys with empty values in + the dict. - * ‘include_empty’ – Set to ‘False’ if you don’t want empty - values to appear in the dict. + * ‘errors’ (str(59)) – Error handling behavior when decoding + bytes. - * ‘errors’ – the decoding error behavior. + * ‘separator’ (str(60)) – Separator character between pairs. - * ‘separator’ – the pair separator to be used, defaults to ‘&’ + * ‘cls’ (‘Optional’‘[’‘Type’‘[’‘ds.MultiDict’‘]’‘]’) – Container + to hold result instead of ‘MultiDict’. - * ‘cls’ – an optional dict class to use. If this is not - specified or ‘None’ the default ‘MultiDict’ is used. + + Return type: ds.MultiDict[str(61), str(62)] + + Changed in version 2.0: The ‘decode_keys’ parameter is deprecated + and will be removed in Werkzeug 2.1. + + Changed in version 0.5: In previous versions “;” and “&” could be + used for url decoding. Now only “&” is supported. If you want to + use “;”, a different ‘separator’ can be provided. + + Changed in version 0.5: The ‘cls’ parameter was added. -- Function: werkzeug.urls.url_decode_stream (stream, charset='utf-8', - decode_keys=False, include_empty=True, errors='replace', - separator='&', cls=None, limit=None, return_iterator=False) + include_empty=True, errors='replace', separator=b'&', + cls=None, limit=None) - Works like *note url_decode(): 29f. but decodes a stream. The + Works like *note url_decode(): 26a. but decodes a stream. The behavior of stream and limit follows functions like *note - make_line_iter(): 195. The generator of pairs is directly fed to + make_line_iter(): 175. The generator of pairs is directly fed to the ‘cls’ so you can consume the data while it’s parsed. + + Parameters: + + * ‘stream’ (‘IO’‘[’bytes(63)‘]’) – a stream with the encoded + querystring + + * ‘charset’ (str(64)) – the charset of the query string. If set + to ‘None’ no decoding will take place. + + * ‘include_empty’ (bool(65)) – Set to ‘False’ if you don’t want + empty values to appear in the dict. + + * ‘errors’ (str(66)) – the decoding error behavior. + + * ‘separator’ (bytes(67)) – the pair separator to be used, + defaults to ‘&’ + + * ‘cls’ (‘Optional’‘[’‘Type’‘[’‘ds.MultiDict’‘]’‘]’) – an + optional dict class to use. If this is not specified or + ‘None’ the default ‘MultiDict’ is used. + + * ‘limit’ (‘Optional’‘[’int(68)‘]’) – the content length of the + URL data. Not necessary if a limited stream is provided. + + + Return type: ds.MultiDict[str(69), str(70)] + + Changed in version 2.0: The ‘decode_keys’ and ‘return_iterator’ + parameters are deprecated and will be removed in Werkzeug 2.1. + New in version 0.8. - - Parameters: - - * ‘stream’ – a stream with the encoded querystring - - * ‘charset’ – the charset of the query string. If set to ‘None’ - no unicode decoding will take place. - - * ‘decode_keys’ – Used on Python 2.x to control whether keys - should be forced to be unicode objects. If set to ‘True’, - keys will be unicode in all cases. Otherwise, they remain - ‘str’ if they fit into ASCII. - - * ‘include_empty’ – Set to ‘False’ if you don’t want empty - values to appear in the dict. - - * ‘errors’ – the decoding error behavior. - - * ‘separator’ – the pair separator to be used, defaults to ‘&’ - - * ‘cls’ – an optional dict class to use. If this is not - specified or ‘None’ the default ‘MultiDict’ is used. - - * ‘limit’ – the content length of the URL data. Not necessary - if a limited stream is provided. - - * ‘return_iterator’ – if set to ‘True’ the ‘cls’ argument is - ignored and an iterator over all decoded pairs is returned - -- Function: werkzeug.urls.url_encode (obj, charset='utf-8', - encode_keys=False, sort=False, key=None, separator=b'&') + sort=False, key=None, separator='&') URL encode a dict/‘MultiDict’. If a value is ‘None’ it will not appear in the result string. Per default only values are encoded - into the target charset strings. If ‘encode_keys’ is set to ‘True’ - unicode keys are supported too. - - If ‘sort’ is set to ‘True’ the items are sorted by ‘key’ or the - default sorting algorithm. - - New in version 0.5: ‘sort’, ‘key’, and ‘separator’ were added. + into the target charset strings. Parameters: - * ‘obj’ – the object to encode into a query string. + * ‘obj’ (‘Union’‘[’‘Mapping’‘[’str(71)‘, ’str(72)‘]’‘, + ’‘Iterable’‘[’‘Tuple’‘[’str(73)‘, ’str(74)‘]’‘]’‘]’) – the + object to encode into a query string. - * ‘charset’ – the charset of the query string. + * ‘charset’ (str(75)) – the charset of the query string. - * ‘encode_keys’ – set to ‘True’ if you have unicode keys. - (Ignored on Python 3.x) + * ‘sort’ (bool(76)) – set to ‘True’ if you want parameters to be + sorted by ‘key’. - * ‘sort’ – set to ‘True’ if you want parameters to be sorted by - ‘key’. + * ‘separator’ (str(77)) – the separator to be used for the + pairs. - * ‘separator’ – the separator to be used for the pairs. + * ‘key’ (‘Optional’‘[’‘Callable’‘[’‘[’‘Tuple’‘[’str(78)‘, + ’str(79)‘]’‘]’‘, ’‘Any’‘]’‘]’) – an optional function to be + used for sorting. For more details check out the sorted()(80) + documentation. - * ‘key’ – an optional function to be used for sorting. For more - details check out the sorted()(2) documentation. + + Return type: str(81) + + Changed in version 2.0: The ‘encode_keys’ parameter is deprecated + and will be removed in Werkzeug 2.1. + + Changed in version 0.5: Added the ‘sort’, ‘key’, and ‘separator’ + parameters. -- Function: werkzeug.urls.url_encode_stream (obj, stream=None, - charset='utf-8', encode_keys=False, sort=False, key=None, - separator=b'&') + charset='utf-8', sort=False, key=None, separator='&') - Like *note url_encode(): 2b4. but writes the results to a stream + Like *note url_encode(): 27e. but writes the results to a stream object. If the stream is ‘None’ a generator over all encoded pairs is returned. - New in version 0.8. - Parameters: - * ‘obj’ – the object to encode into a query string. + * ‘obj’ (‘Union’‘[’‘Mapping’‘[’str(82)‘, ’str(83)‘]’‘, + ’‘Iterable’‘[’‘Tuple’‘[’str(84)‘, ’str(85)‘]’‘]’‘]’) – the + object to encode into a query string. - * ‘stream’ – a stream to write the encoded object into or ‘None’ - if an iterator over the encoded pairs should be returned. In - that case the separator argument is ignored. + * ‘stream’ (‘Optional’‘[’‘IO’‘[’str(86)‘]’‘]’) – a stream to + write the encoded object into or ‘None’ if an iterator over + the encoded pairs should be returned. In that case the + separator argument is ignored. - * ‘charset’ – the charset of the query string. + * ‘charset’ (str(87)) – the charset of the query string. - * ‘encode_keys’ – set to ‘True’ if you have unicode keys. - (Ignored on Python 3.x) + * ‘sort’ (bool(88)) – set to ‘True’ if you want parameters to be + sorted by ‘key’. - * ‘sort’ – set to ‘True’ if you want parameters to be sorted by - ‘key’. + * ‘separator’ (str(89)) – the separator to be used for the + pairs. - * ‘separator’ – the separator to be used for the pairs. + * ‘key’ (‘Optional’‘[’‘Callable’‘[’‘[’‘Tuple’‘[’str(90)‘, + ’str(91)‘]’‘]’‘, ’‘Any’‘]’‘]’) – an optional function to be + used for sorting. For more details check out the sorted()(92) + documentation. - * ‘key’ – an optional function to be used for sorting. For more - details check out the sorted()(3) documentation. + + Return type: None(93) + + Changed in version 2.0: The ‘encode_keys’ parameter is deprecated + and will be removed in Werkzeug 2.1. + + New in version 0.8. -- Function: werkzeug.urls.url_fix (s, charset='utf-8') @@ -9526,16 +11330,19 @@ license: BSD-3-Clause function can fix some of the problems in a similar way browsers handle data entered by the user: - >>> url_fix(u'http://de.wikipedia.org/wiki/Elf (Begriffskl\xe4rung)') + >>> url_fix('http://de.wikipedia.org/wiki/Elf (Begriffskl\xe4rung)') 'http://de.wikipedia.org/wiki/Elf%20(Begriffskl%C3%A4rung)' Parameters: - * ‘s’ – the string with the URL to fix. + * ‘s’ (str(94)) – the string with the URL to fix. - * ‘charset’ – The target charset for the URL if the url was - given as unicode string. + * ‘charset’ (str(95)) – The target charset for the URL if the + url was given as a string. + + + Return type: str(96) -- Function: werkzeug.urls.url_join (base, url, allow_fragments=True) @@ -9545,32 +11352,42 @@ license: BSD-3-Clause Parameters: - * ‘base’ – the base URL for the join operation. + * ‘base’ (‘Union’‘[’str(97)‘, ’‘Tuple’‘[’str(98)‘, ’str(99)‘, + ’str(100)‘, ’str(101)‘, ’str(102)‘]’‘]’) – the base URL for + the join operation. - * ‘url’ – the URL to join. + * ‘url’ (‘Union’‘[’str(103)‘, ’‘Tuple’‘[’str(104)‘, ’str(105)‘, + ’str(106)‘, ’str(107)‘, ’str(108)‘]’‘]’) – the URL to join. - * ‘allow_fragments’ – indicates whether fragments should be - allowed. + * ‘allow_fragments’ (bool(109)) – indicates whether fragments + should be allowed. + + + Return type: str(110) -- Function: werkzeug.urls.url_parse (url, scheme=None, allow_fragments=True) - Parses a URL from a string into a *note URL: 298. tuple. If the + Parses a URL from a string into a *note URL: 263. tuple. If the URL is lacking a scheme it can be provided as second argument. Otherwise, it is ignored. Optionally fragments can be stripped from the URL by setting ‘allow_fragments’ to ‘False’. - The inverse of this function is *note url_unparse(): 2ad. + The inverse of this function is *note url_unparse(): 279. Parameters: - * ‘url’ – the URL to parse. + * ‘url’ (str(111)) – the URL to parse. - * ‘scheme’ – the default schema to use if the URL is schemaless. + * ‘scheme’ (‘Optional’‘[’str(112)‘]’) – the default schema to + use if the URL is schemaless. - * ‘allow_fragments’ – if set to ‘False’ a fragment will be - removed from the URL. + * ‘allow_fragments’ (bool(113)) – if set to ‘False’ a fragment + will be removed from the URL. + + + Return type: *note werkzeug.urls.BaseURL: 262. -- Function: werkzeug.urls.url_quote (string, charset='utf-8', errors='strict', safe='/:', unsafe='') @@ -9582,11 +11399,20 @@ license: BSD-3-Clause * ‘s’ – the string to quote. - * ‘charset’ – the charset to be used. + * ‘charset’ (str(114)) – the charset to be used. - * ‘safe’ – an optional sequence of safe characters. + * ‘safe’ (‘Union’‘[’str(115)‘, ’bytes(116)‘]’) – an optional + sequence of safe characters. - * ‘unsafe’ – an optional sequence of unsafe characters. + * ‘unsafe’ (‘Union’‘[’str(117)‘, ’bytes(118)‘]’) – an optional + sequence of unsafe characters. + + * ‘string’ (‘Union’‘[’str(119)‘, ’bytes(120)‘]’) – + + * ‘errors’ (str(121)) – + + + Return type: str(122) New in version 0.9.2: The ‘unsafe’ parameter was added. @@ -9601,36 +11427,54 @@ license: BSD-3-Clause * ‘s’ – The string to quote. - * ‘charset’ – The charset to be used. + * ‘charset’ (str(123)) – The charset to be used. - * ‘safe’ – An optional sequence of safe characters. + * ‘safe’ (str(124)) – An optional sequence of safe characters. + + * ‘string’ (str(125)) – + + * ‘errors’ (str(126)) – + + + Return type: str(127) -- Function: werkzeug.urls.url_unparse (components) - The reverse operation to *note url_parse(): 2b7. This accepts - arbitrary as well as *note URL: 298. tuples and returns a URL as a + The reverse operation to *note url_parse(): 281. This accepts + arbitrary as well as *note URL: 263. tuples and returns a URL as a string. - Parameters: ‘components’ – the parsed URL as tuple which should be - converted into a URL string. + Parameters: ‘components’ (‘Tuple’‘[’str(128)‘, ’str(129)‘, + ’str(130)‘, ’str(131)‘, ’str(132)‘]’) – the parsed URL as tuple + which should be converted into a URL string. - -- Function: werkzeug.urls.url_unquote (string, charset='utf-8', + + Return type: str(133) + + -- Function: werkzeug.urls.url_unquote (s, charset='utf-8', errors='replace', unsafe='') URL decode a single string with a given encoding. If the charset - is set to ‘None’ no unicode decoding is performed and raw bytes are + is set to ‘None’ no decoding is performed and raw bytes are returned. Parameters: - * ‘s’ – the string to unquote. + * ‘s’ (‘Union’‘[’str(134)‘, ’bytes(135)‘]’) – the string to + unquote. - * ‘charset’ – the charset of the query string. If set to ‘None’ - no unicode decoding will take place. + * ‘charset’ (str(136)) – the charset of the query string. If + set to ‘None’ no decoding will take place. - * ‘errors’ – the error handling for the charset decoding. + * ‘errors’ (str(137)) – the error handling for the charset + decoding. + + * ‘unsafe’ (str(138)) – + + + Return type: str(139) -- Function: werkzeug.urls.url_unquote_plus (s, charset='utf-8', errors='replace') @@ -9639,31 +11483,318 @@ license: BSD-3-Clause to whitespace. Per default encoding errors are ignored. If you want a different - behavior you can set ‘errors’ to ‘'replace'’ or ‘'strict'’. In - strict mode a ‘HTTPUnicodeError’ is raised. + behavior you can set ‘errors’ to ‘'replace'’ or ‘'strict'’. Parameters: - * ‘s’ – The string to unquote. + * ‘s’ (‘Union’‘[’str(140)‘, ’bytes(141)‘]’) – The string to + unquote. - * ‘charset’ – the charset of the query string. If set to ‘None’ - no unicode decoding will take place. + * ‘charset’ (str(142)) – the charset of the query string. If + set to ‘None’ no decoding will take place. - * ‘errors’ – The error handling for the ‘charset’ decoding. + * ‘errors’ (str(143)) – The error handling for the ‘charset’ + decoding. + + + Return type: str(144) ---------- Footnotes ---------- - (1) https://docs.python.org/3/library/stdtypes.html#dict + (1) +https://docs.python.org/3/library/urllib.parse.html#module-urllib.parse - (2) https://docs.python.org/3/library/functions.html#sorted + (2) https://docs.python.org/3/library/stdtypes.html#str - (3) https://docs.python.org/3/library/functions.html#sorted + (3) https://docs.python.org/3/library/stdtypes.html#str + + (4) https://docs.python.org/3/library/stdtypes.html#str + + (5) https://docs.python.org/3/library/stdtypes.html#str + + (6) https://docs.python.org/3/library/stdtypes.html#str + + (7) https://docs.python.org/3/library/stdtypes.html#str + + (8) https://docs.python.org/3/library/stdtypes.html#str + + (9) https://docs.python.org/3/library/stdtypes.html#str + + (10) https://docs.python.org/3/library/stdtypes.html#str + + (11) https://docs.python.org/3/library/stdtypes.html#str + + (12) https://docs.python.org/3/library/stdtypes.html#str + + (13) https://docs.python.org/3/library/stdtypes.html#str + + (14) https://docs.python.org/3/library/stdtypes.html#str + + (15) https://docs.python.org/3/library/stdtypes.html#str + + (16) https://docs.python.org/3/library/stdtypes.html#str + + (17) https://docs.python.org/3/library/stdtypes.html#str + + (18) https://docs.python.org/3/library/functions.html#int + + (19) https://docs.python.org/3/library/stdtypes.html#str + + (20) https://docs.python.org/3/library/stdtypes.html#str + + (21) https://docs.python.org/3/library/stdtypes.html#str + + (22) https://docs.python.org/3/library/stdtypes.html#str + + (23) https://docs.python.org/3/library/stdtypes.html#str + + (24) https://docs.python.org/3/library/stdtypes.html#str + + (25) https://docs.python.org/3/library/stdtypes.html#str + + (26) https://docs.python.org/3/library/stdtypes.html#str + + (27) https://docs.python.org/3/library/stdtypes.html#str + + (28) https://docs.python.org/3/library/stdtypes.html#str + + (29) https://docs.python.org/3/library/stdtypes.html#str + + (30) https://docs.python.org/3/library/stdtypes.html#bytes + + (31) https://docs.python.org/3/library/stdtypes.html#str + + (32) https://docs.python.org/3/library/stdtypes.html#str + + (33) https://docs.python.org/3/library/stdtypes.html#str + + (34) https://docs.python.org/3/library/stdtypes.html#str + + (35) https://docs.python.org/3/library/stdtypes.html#str + + (36) https://docs.python.org/3/library/stdtypes.html#str + + (37) https://docs.python.org/3/library/stdtypes.html#str + + (38) https://docs.python.org/3/library/stdtypes.html#str + + (39) https://docs.python.org/3/library/stdtypes.html#str + + (40) https://docs.python.org/3/library/stdtypes.html#str + + (41) https://docs.python.org/3/library/stdtypes.html#str + + (42) https://docs.python.org/3/library/stdtypes.html#str + + (43) https://docs.python.org/3/library/stdtypes.html#str + + (44) https://docs.python.org/3/library/stdtypes.html#str + + (45) https://docs.python.org/3/library/stdtypes.html#str + + (46) https://docs.python.org/3/library/functions.html#bool + + (47) https://docs.python.org/3/library/stdtypes.html#str + + (48) https://docs.python.org/3/library/stdtypes.html#str + + (49) https://docs.python.org/3/library/stdtypes.html#str + + (50) https://docs.python.org/3/library/stdtypes.html#str + + (51) https://docs.python.org/3/library/stdtypes.html#str + + (52) https://docs.python.org/3/library/stdtypes.html#str + + (53) https://docs.python.org/3/library/stdtypes.html#str + + (54) https://docs.python.org/3/library/stdtypes.html#str + + (55) https://docs.python.org/3/library/stdtypes.html#str + + (56) https://docs.python.org/3/library/stdtypes.html#str + + (57) https://docs.python.org/3/library/stdtypes.html#str + + (58) https://docs.python.org/3/library/functions.html#bool + + (59) https://docs.python.org/3/library/stdtypes.html#str + + (60) https://docs.python.org/3/library/stdtypes.html#str + + (61) https://docs.python.org/3/library/stdtypes.html#str + + (62) https://docs.python.org/3/library/stdtypes.html#str + + (63) https://docs.python.org/3/library/stdtypes.html#bytes + + (64) https://docs.python.org/3/library/stdtypes.html#str + + (65) https://docs.python.org/3/library/functions.html#bool + + (66) https://docs.python.org/3/library/stdtypes.html#str + + (67) https://docs.python.org/3/library/stdtypes.html#bytes + + (68) https://docs.python.org/3/library/functions.html#int + + (69) https://docs.python.org/3/library/stdtypes.html#str + + (70) https://docs.python.org/3/library/stdtypes.html#str + + (71) https://docs.python.org/3/library/stdtypes.html#str + + (72) https://docs.python.org/3/library/stdtypes.html#str + + (73) https://docs.python.org/3/library/stdtypes.html#str + + (74) https://docs.python.org/3/library/stdtypes.html#str + + (75) https://docs.python.org/3/library/stdtypes.html#str + + (76) https://docs.python.org/3/library/functions.html#bool + + (77) https://docs.python.org/3/library/stdtypes.html#str + + (78) https://docs.python.org/3/library/stdtypes.html#str + + (79) https://docs.python.org/3/library/stdtypes.html#str + + (80) https://docs.python.org/3/library/functions.html#sorted + + (81) https://docs.python.org/3/library/stdtypes.html#str + + (82) https://docs.python.org/3/library/stdtypes.html#str + + (83) https://docs.python.org/3/library/stdtypes.html#str + + (84) https://docs.python.org/3/library/stdtypes.html#str + + (85) https://docs.python.org/3/library/stdtypes.html#str + + (86) https://docs.python.org/3/library/stdtypes.html#str + + (87) https://docs.python.org/3/library/stdtypes.html#str + + (88) https://docs.python.org/3/library/functions.html#bool + + (89) https://docs.python.org/3/library/stdtypes.html#str + + (90) https://docs.python.org/3/library/stdtypes.html#str + + (91) https://docs.python.org/3/library/stdtypes.html#str + + (92) https://docs.python.org/3/library/functions.html#sorted + + (93) https://docs.python.org/3/library/constants.html#None + + (94) https://docs.python.org/3/library/stdtypes.html#str + + (95) https://docs.python.org/3/library/stdtypes.html#str + + (96) https://docs.python.org/3/library/stdtypes.html#str + + (97) https://docs.python.org/3/library/stdtypes.html#str + + (98) https://docs.python.org/3/library/stdtypes.html#str + + (99) https://docs.python.org/3/library/stdtypes.html#str + + (100) https://docs.python.org/3/library/stdtypes.html#str + + (101) https://docs.python.org/3/library/stdtypes.html#str + + (102) https://docs.python.org/3/library/stdtypes.html#str + + (103) https://docs.python.org/3/library/stdtypes.html#str + + (104) https://docs.python.org/3/library/stdtypes.html#str + + (105) https://docs.python.org/3/library/stdtypes.html#str + + (106) https://docs.python.org/3/library/stdtypes.html#str + + (107) https://docs.python.org/3/library/stdtypes.html#str + + (108) https://docs.python.org/3/library/stdtypes.html#str + + (109) https://docs.python.org/3/library/functions.html#bool + + (110) https://docs.python.org/3/library/stdtypes.html#str + + (111) https://docs.python.org/3/library/stdtypes.html#str + + (112) https://docs.python.org/3/library/stdtypes.html#str + + (113) https://docs.python.org/3/library/functions.html#bool + + (114) https://docs.python.org/3/library/stdtypes.html#str + + (115) https://docs.python.org/3/library/stdtypes.html#str + + (116) https://docs.python.org/3/library/stdtypes.html#bytes + + (117) https://docs.python.org/3/library/stdtypes.html#str + + (118) https://docs.python.org/3/library/stdtypes.html#bytes + + (119) https://docs.python.org/3/library/stdtypes.html#str + + (120) https://docs.python.org/3/library/stdtypes.html#bytes + + (121) https://docs.python.org/3/library/stdtypes.html#str + + (122) https://docs.python.org/3/library/stdtypes.html#str + + (123) https://docs.python.org/3/library/stdtypes.html#str + + (124) https://docs.python.org/3/library/stdtypes.html#str + + (125) https://docs.python.org/3/library/stdtypes.html#str + + (126) https://docs.python.org/3/library/stdtypes.html#str + + (127) https://docs.python.org/3/library/stdtypes.html#str + + (128) https://docs.python.org/3/library/stdtypes.html#str + + (129) https://docs.python.org/3/library/stdtypes.html#str + + (130) https://docs.python.org/3/library/stdtypes.html#str + + (131) https://docs.python.org/3/library/stdtypes.html#str + + (132) https://docs.python.org/3/library/stdtypes.html#str + + (133) https://docs.python.org/3/library/stdtypes.html#str + + (134) https://docs.python.org/3/library/stdtypes.html#str + + (135) https://docs.python.org/3/library/stdtypes.html#bytes + + (136) https://docs.python.org/3/library/stdtypes.html#str + + (137) https://docs.python.org/3/library/stdtypes.html#str + + (138) https://docs.python.org/3/library/stdtypes.html#str + + (139) https://docs.python.org/3/library/stdtypes.html#str + + (140) https://docs.python.org/3/library/stdtypes.html#str + + (141) https://docs.python.org/3/library/stdtypes.html#bytes + + (142) https://docs.python.org/3/library/stdtypes.html#str + + (143) https://docs.python.org/3/library/stdtypes.html#str + + (144) https://docs.python.org/3/library/stdtypes.html#str  File: werkzeug.info, Node: Context Locals, Next: Middleware, Prev: URL Helpers<2>, Up: Reference -3.9 Context Locals +3.8 Context Locals ================== Sooner or later you have some things you want to have in every single @@ -9743,13 +11874,20 @@ for this context. False With this function one can release ‘Local’ objects as well as *note - LocalStack: 2bf. objects. However it is not possible to release + LocalStack: 289. objects. However it is not possible to release data held by proxies that way, one always has to retain a reference to the underlying local object in order to be able to release it. New in version 0.6.1. - -- Class: werkzeug.local.LocalManager (locals=None, ident_func=None) + + Parameters: ‘local’ (‘Union’‘[’‘werkzeug.local.Local’‘, ’*note + werkzeug.local.LocalStack: 289.‘]’) – + + + Return type: None(1) + + -- Class: werkzeug.local.LocalManager (locals=None) Local objects cannot manage themselves. For that you need a local manager. You can pass a local manager multiple locals or add them @@ -9757,13 +11895,21 @@ for this context. manager cleans up, it will clean up all the data left in the locals for this context. - The ‘ident_func’ parameter can be added to override the default - ident function for the wrapped locals. + Changed in version 2.0: ‘ident_func’ is deprecated and will be + removed in Werkzeug 2.1. - Changed in version 0.7: ‘ident_func’ was added. + Changed in version 0.7: The ‘ident_func’ parameter was added. - Changed in version 0.6.1: Instead of a manager the *note - release_local(): 2be. function can be used as well. + Changed in version 0.6.1: The *note release_local(): 288. function + can be used instead of a manager. + + + Parameters: ‘locals’ + (‘Optional’‘[’‘Iterable’‘[’‘Union’‘[’‘werkzeug.local.Local’‘, + ’*note werkzeug.local.LocalStack: 289.‘]’‘]’‘]’) – + + + Return type: None(2) -- Method: cleanup () @@ -9771,22 +11917,20 @@ for this context. Call this at the end of the request or use ‘make_middleware()’. - -- Method: get_ident () - Return the context identifier the local objects use internally - for this context. You cannot override this method to change - the behavior but use it to link other context local objects - (such as SQLAlchemy’s scoped sessions) to the Werkzeug locals. - - Changed in version 0.7: You can pass a different ident - function to the local manager that will then be propagated to - all the locals passed to the constructor. + Return type: None(3) -- Method: make_middleware (app) Wrap a WSGI application so that cleaning up happens after request end. + + Parameters: ‘app’ (‘WSGIApplication’) – + + + Return type: WSGIApplication + -- Method: middleware (func) Like ‘make_middleware’ but for decorating functions. @@ -9801,6 +11945,12 @@ for this context. passed will have all the arguments copied from the inner application (name, docstring, module). + + Parameters: ‘func’ (‘WSGIApplication’) – + + + Return type: WSGIApplication + -- Class: werkzeug.local.LocalStack This class works similar to a ‘Local’ but keeps a stack of objects @@ -9818,8 +11968,8 @@ for this context. >>> ls.top 42 - They can be force released by using a *note LocalManager: 2c0. or - with the *note release_local(): 2be. function but the correct way + They can be force released by using a *note LocalManager: 28a. or + with the *note release_local(): 288. function but the correct way is to pop the item from the stack after using. When the stack is empty it will no longer be bound to the current context (and as such released). @@ -9829,69 +11979,75 @@ for this context. New in version 0.6.1. + + Return type: None(4) + -- Method: pop () Removes the topmost item from the stack, will return the old value or ‘None’ if the stack was already empty. + + Return type: Any + -- Method: push (obj) Pushes a new item to the stack - -- Attribute: top + + Parameters: ‘obj’ (‘Any’) – + + + Return type: List[Any] + + -- Property: top: Any The topmost item on the stack. If the stack is empty, ‘None’ is returned. -- Class: werkzeug.local.LocalProxy (local, name=None) - Acts as a proxy for a werkzeug local. Forwards all operations to a - proxied object. The only operations not supported for forwarding - are right handed operands and any kind of assignment. - - Example usage: + A proxy to the object bound to a ‘Local’. All operations on the + proxy are forwarded to the bound object. If no object is bound, a + RuntimeError(5) is raised. from werkzeug.local import Local l = Local() - # these are proxies - request = l('request') - user = l('user') - + # a proxy to whatever l.user is set to + user = l("user") from werkzeug.local import LocalStack - _response_local = LocalStack() + _request_stack = LocalStack() - # this is a proxy - response = _response_local() + # a proxy to _request_stack.top + request = _request_stack() - Whenever something is bound to l.user / l.request the proxy objects - will forward all operations. If no object is bound a - RuntimeError(1) will be raised. + # a proxy to the session attribute of the request proxy + session = LocalProxy(lambda: request.session) - To create proxies to ‘Local’ or *note LocalStack: 2bf. objects, - call the object as shown above. If you want to have a proxy to an - object looked up by a function, you can (as of Werkzeug 0.6.1) pass - a function to the *note LocalProxy: 2c8. constructor: + ‘__repr__’ and ‘__class__’ are forwarded, so ‘repr(x)’ and + ‘isinstance(x, cls)’ will look like the proxied object. Use + ‘issubclass(type(x), LocalProxy)’ to check if an object is a proxy. - session = LocalProxy(lambda: get_current_request().session) + repr(user) # + isinstance(user, User) # True + issubclass(type(user), LocalProxy) # True + + + Parameters: + + * ‘local’ – The ‘Local’ or callable that provides the proxied + object. + + * ‘name’ – The attribute name to look up on a ‘Local’. Not used + if a callable is given. + + Changed in version 2.0: Updated proxied attributes and methods to + reflect the current data model. Changed in version 0.6.1: The class can be instantiated with a - callable as well now. - - Keep in mind that ‘repr()’ is also forwarded, so if you want to - find out if you are dealing with a proxy you can do an - ‘isinstance()’ check: - - >>> from werkzeug.local import LocalProxy - >>> isinstance(request, LocalProxy) - True - - You can also create proxy objects by hand: - - from werkzeug.local import Local, LocalProxy - local = Local() - request = LocalProxy(local, 'request') + callable. -- Method: _get_current_object () @@ -9900,15 +12056,26 @@ for this context. or because you want to pass the object into a different context. + + Return type: Any + ---------- Footnotes ---------- - (1) https://docs.python.org/3/library/exceptions.html#RuntimeError + (1) https://docs.python.org/3/library/constants.html#None + + (2) https://docs.python.org/3/library/constants.html#None + + (3) https://docs.python.org/3/library/constants.html#None + + (4) https://docs.python.org/3/library/constants.html#None + + (5) https://docs.python.org/3/library/exceptions.html#RuntimeError  File: werkzeug.info, Node: Middleware, Next: HTTP Exceptions, Prev: Context Locals, Up: Reference -3.10 Middleware -=============== +3.9 Middleware +============== A WSGI middleware is a WSGI application that wraps another application in order to observe or change its behavior. Werkzeug provides some @@ -9926,8 +12093,8 @@ middleware for common use cases.  File: werkzeug.info, Node: X-Forwarded-For Proxy Fix, Next: Serve Shared Static Files, Up: Middleware -3.10.1 X-Forwarded-For Proxy Fix --------------------------------- +3.9.1 X-Forwarded-For Proxy Fix +------------------------------- This module provides a middleware that adjusts the WSGI environ based on ‘X-Forwarded-’ headers that proxies in front of an application may set. @@ -9936,7 +12103,7 @@ When an application is running behind a proxy server, WSGI may see the request as coming from that server rather than the real client. Proxies set various headers to track where the request actually came from. -This middleware should only be applied if the application is actually +This middleware should only be used if the application is actually behind such a proxy, and should be configured with the number of proxies that are chained in front of it. Not all proxies set all the headers. Since incoming headers can be faked, you must set how many proxies are @@ -9969,19 +12136,26 @@ setting each header so the middleware knows what to trust. Parameters: - * ‘app’ – The WSGI application to wrap. + * ‘app’ (‘WSGIApplication’) – The WSGI application to wrap. - * ‘x_for’ – Number of values to trust for ‘X-Forwarded-For’. + * ‘x_for’ (int(1)) – Number of values to trust for + ‘X-Forwarded-For’. - * ‘x_proto’ – Number of values to trust for ‘X-Forwarded-Proto’. + * ‘x_proto’ (int(2)) – Number of values to trust for + ‘X-Forwarded-Proto’. - * ‘x_host’ – Number of values to trust for ‘X-Forwarded-Host’. + * ‘x_host’ (int(3)) – Number of values to trust for + ‘X-Forwarded-Host’. - * ‘x_port’ – Number of values to trust for ‘X-Forwarded-Port’. + * ‘x_port’ (int(4)) – Number of values to trust for + ‘X-Forwarded-Port’. - * ‘x_prefix’ – Number of values to trust for + * ‘x_prefix’ (int(5)) – Number of values to trust for ‘X-Forwarded-Prefix’. + + Return type: None(6) + from werkzeug.middleware.proxy_fix import ProxyFix # App is behind one proxy that sets the -For and -Host headers. app = ProxyFix(app, x_for=1, x_host=1) @@ -10010,37 +12184,45 @@ setting each header so the middleware knows what to trust. Changed in version 0.15: ‘X-Forwarded-Host’ and ‘X-Forwarded-Port’ modify ‘SERVER_NAME’ and ‘SERVER_PORT’. + ---------- Footnotes ---------- -copyright: 2007 Pallets + (1) https://docs.python.org/3/library/functions.html#int + (2) https://docs.python.org/3/library/functions.html#int -license: BSD-3-Clause + (3) https://docs.python.org/3/library/functions.html#int + + (4) https://docs.python.org/3/library/functions.html#int + + (5) https://docs.python.org/3/library/functions.html#int + + (6) https://docs.python.org/3/library/constants.html#None  File: werkzeug.info, Node: Serve Shared Static Files, Next: Application Dispatcher, Prev: X-Forwarded-For Proxy Fix, Up: Middleware -3.10.2 Serve Shared Static Files --------------------------------- +3.9.2 Serve Shared Static Files +------------------------------- -- Class: werkzeug.middleware.shared_data.SharedDataMiddleware (app, exports, disallow=None, cache=True, cache_timeout=43200, fallback_mimetype='application/octet-stream') - A WSGI middleware that provides static content for development - environments or simple server setups. Usage is quite simple: + A WSGI middleware which provides static content for development + environments or simple server setups. Its usage is quite simple: import os from werkzeug.middleware.shared_data import SharedDataMiddleware app = SharedDataMiddleware(app, { - '/static': os.path.join(os.path.dirname(__file__), 'static') + '/shared': os.path.join(os.path.dirname(__file__), 'shared') }) The contents of the folder ‘./shared’ will now be available on ‘http://example.com/shared/’. This is pretty useful during - development because a standalone media server is not required. One - can also mount files on the root folder and still continue to use - the application because the shared data middleware forwards all + development because a standalone media server is not required. + Files can also be mounted on the root folder and still continue to + use the application because the shared data middleware forwards all unhandled requests to the application, even if the requests are below one of the shared folders. @@ -10058,10 +12240,10 @@ File: werkzeug.info, Node: Serve Shared Static Files, Next: Application Dispat rules for files that are not accessible from the web. If ‘cache’ is set to ‘False’ no caching headers are sent. - Currently the middleware does not support non ASCII filenames. If - the encoding on the file system happens to be the encoding of the - URI it may work but this could also be by accident. We strongly - suggest using ASCII only file names for static files. + Currently the middleware does not support non-ASCII filenames. If + the encoding on the file system happens to match the encoding of + the URI it may work but this could also be by accident. We + strongly suggest using ASCII only file names for static files. The middleware will guess the mimetype using the Python ‘mimetype’ module. If it’s unable to figure out the charset it will fall back @@ -10070,19 +12252,27 @@ File: werkzeug.info, Node: Serve Shared Static Files, Next: Application Dispat Parameters: - * ‘app’ – the application to wrap. If you don’t want to wrap an - application you can pass it ‘NotFound’. + * ‘app’ (‘WSGIApplication’) – the application to wrap. If you + don’t want to wrap an application you can pass it ‘NotFound’. - * ‘exports’ – a list or dict of exported files and folders. + * ‘exports’ (‘Union’‘[’‘Dict’‘[’str(2)‘, ’‘Union’‘[’str(3)‘, + ’‘Tuple’‘[’str(4)‘, ’str(5)‘]’‘]’‘]’‘, + ’‘Iterable’‘[’‘Tuple’‘[’str(6)‘, ’‘Union’‘[’str(7)‘, + ’‘Tuple’‘[’str(8)‘, ’str(9)‘]’‘]’‘]’‘]’‘]’) – a list or dict + of exported files and folders. - * ‘disallow’ – a list of fnmatch()(2) rules. + * ‘disallow’ (None(10)) – a list of fnmatch()(11) rules. - * ‘cache’ – enable or disable caching headers. + * ‘cache’ (bool(12)) – enable or disable caching headers. - * ‘cache_timeout’ – the cache timeout in seconds for the - headers. + * ‘cache_timeout’ (int(13)) – the cache timeout in seconds for + the headers. - * ‘fallback_mimetype’ – The fallback mimetype for unknown files. + * ‘fallback_mimetype’ (str(14)) – The fallback mimetype for + unknown files. + + + Return type: None(15) Changed in version 1.0: The default ‘fallback_mimetype’ is ‘application/octet-stream’. If a filename looks like a text @@ -10099,22 +12289,52 @@ File: werkzeug.info, Node: Serve Shared Static Files, Next: Application Dispat constructor this method is overwritten. -copyright: 2007 Pallets + Parameters: ‘filename’ (str(16)) – -license: BSD-3-Clause + Return type: bool(17) ---------- Footnotes ---------- (1) https://docs.python.org/3/library/fnmatch.html#fnmatch.fnmatch - (2) https://docs.python.org/3/library/fnmatch.html#fnmatch.fnmatch + (2) https://docs.python.org/3/library/stdtypes.html#str + + (3) https://docs.python.org/3/library/stdtypes.html#str + + (4) https://docs.python.org/3/library/stdtypes.html#str + + (5) https://docs.python.org/3/library/stdtypes.html#str + + (6) https://docs.python.org/3/library/stdtypes.html#str + + (7) https://docs.python.org/3/library/stdtypes.html#str + + (8) https://docs.python.org/3/library/stdtypes.html#str + + (9) https://docs.python.org/3/library/stdtypes.html#str + + (10) https://docs.python.org/3/library/constants.html#None + + (11) https://docs.python.org/3/library/fnmatch.html#fnmatch.fnmatch + + (12) https://docs.python.org/3/library/functions.html#bool + + (13) https://docs.python.org/3/library/functions.html#int + + (14) https://docs.python.org/3/library/stdtypes.html#str + + (15) https://docs.python.org/3/library/constants.html#None + + (16) https://docs.python.org/3/library/stdtypes.html#str + + (17) https://docs.python.org/3/library/functions.html#bool  File: werkzeug.info, Node: Application Dispatcher, Next: Basic HTTP Proxy, Prev: Serve Shared Static Files, Up: Middleware -3.10.3 Application Dispatcher ------------------------------ +3.9.3 Application Dispatcher +---------------------------- This middleware creates a single WSGI application that dispatches to multiple other WSGI applications mounted at different URL paths. @@ -10148,22 +12368,27 @@ and the static files would be served directly by the HTTP server. Parameters: - * ‘app’ – The WSGI application to dispatch to if the request - doesn’t match a mounted path. + * ‘app’ (‘WSGIApplication’) – The WSGI application to dispatch + to if the request doesn’t match a mounted path. - * ‘mounts’ – Maps path prefixes to applications for dispatching. + * ‘mounts’ (‘Optional’‘[’‘Dict’‘[’str(1)‘, + ’‘WSGIApplication’‘]’‘]’) – Maps path prefixes to applications + for dispatching. -copyright: 2007 Pallets + Return type: None(2) + ---------- Footnotes ---------- -license: BSD-3-Clause + (1) https://docs.python.org/3/library/stdtypes.html#str + + (2) https://docs.python.org/3/library/constants.html#None  File: werkzeug.info, Node: Basic HTTP Proxy, Next: WSGI Protocol Linter, Prev: Application Dispatcher, Up: Middleware -3.10.4 Basic HTTP Proxy ------------------------ +3.9.4 Basic HTTP Proxy +---------------------- -- Class: werkzeug.middleware.http_proxy.ProxyMiddleware (app, targets, chunk_size=16384, timeout=10) @@ -10171,13 +12396,13 @@ File: werkzeug.info, Node: Basic HTTP Proxy, Next: WSGI Protocol Linter, Prev Proxy requests under a path to an external server, routing other requests to the app. - This middleware can only proxy HTTP requests, as that is the only + This middleware can only proxy HTTP requests, as HTTP is the only protocol handled by the WSGI server. Other protocols, such as - websocket requests, cannot be proxied at this layer. This should - only be used for development, in production a real proxying server + WebSocket requests, cannot be proxied at this layer. This should + only be used for development, in production a real proxy server should be used. - The middleware takes a dict that maps a path prefix to a dict + The middleware takes a dict mapping a path prefix to a dict describing the host to be proxied to: app = ProxyMiddleware(app, { @@ -10229,33 +12454,42 @@ File: werkzeug.info, Node: Basic HTTP Proxy, Next: WSGI Protocol Linter, Prev Parameters: - * ‘app’ – The WSGI application to wrap. + * ‘app’ (‘WSGIApplication’) – The WSGI application to wrap. - * ‘targets’ – Proxy target configurations. See description + * ‘targets’ (‘Mapping’‘[’str(2)‘, ’‘Dict’‘[’str(3)‘, + ’‘Any’‘]’‘]’) – Proxy target configurations. See description above. - * ‘chunk_size’ – Size of chunks to read from input stream and - write to target. + * ‘chunk_size’ (int(4)) – Size of chunks to read from input + stream and write to target. - * ‘timeout’ – Seconds before an operation to a target fails. + * ‘timeout’ (int(5)) – Seconds before an operation to a target + fails. + + + Return type: None(6) New in version 0.14. - -copyright: 2007 Pallets - - -license: BSD-3-Clause - ---------- Footnotes ---------- (1) https://docs.python.org/3/library/ssl.html#ssl.SSLContext + (2) https://docs.python.org/3/library/stdtypes.html#str + + (3) https://docs.python.org/3/library/stdtypes.html#str + + (4) https://docs.python.org/3/library/functions.html#int + + (5) https://docs.python.org/3/library/functions.html#int + + (6) https://docs.python.org/3/library/constants.html#None +  File: werkzeug.info, Node: WSGI Protocol Linter, Next: Application Profiler, Prev: Basic HTTP Proxy, Up: Middleware -3.10.5 WSGI Protocol Linter ---------------------------- +3.9.5 WSGI Protocol Linter +-------------------------- This module provides a middleware that performs sanity checks on the behavior of the WSGI server and application. It checks that the PEP @@ -10265,11 +12499,11 @@ HTTP errors such as non-empty responses for 304 status codes. -- Class: werkzeug.middleware.lint.LintMiddleware (app) Warns about common errors in the WSGI and HTTP behavior of the - server and wrapped application. Some of the issues it check are: + server and wrapped application. Some of the issues it checks are: - invalid status codes - - non-bytestrings sent to the WSGI server + - non-bytes sent to the WSGI server - strings returned from the WSGI application @@ -10286,28 +12520,28 @@ HTTP errors such as non-empty responses for 304 status codes. Error information is emitted using the warnings(2) module. - Parameters: ‘app’ – The WSGI application to wrap. + Parameters: ‘app’ (‘WSGIApplication’) – The WSGI application to + wrap. + + + Return type: None(3) from werkzeug.middleware.lint import LintMiddleware app = LintMiddleware(app) - -copyright: 2007 Pallets - - -license: BSD-3-Clause - ---------- Footnotes ---------- (1) https://www.python.org/dev/peps/pep-3333 (2) https://docs.python.org/3/library/warnings.html#module-warnings + (3) https://docs.python.org/3/library/constants.html#None +  File: werkzeug.info, Node: Application Profiler, Prev: WSGI Protocol Linter, Up: Middleware -3.10.6 Application Profiler ---------------------------- +3.9.6 Application Profiler +-------------------------- This module provides a middleware that profiles each request with the cProfile(1) module. This can help identify bottlenecks in your code @@ -10344,20 +12578,27 @@ that may be slowing down your application. Parameters: - * ‘app’ – The WSGI application to wrap. + * ‘app’ (‘WSGIApplication’) – The WSGI application to wrap. - * ‘stream’ – Write stats to this stream. Disable with ‘None’. + * ‘stream’ (‘IO’‘[’str(5)‘]’) – Write stats to this stream. + Disable with ‘None’. - * ‘sort_by’ – A tuple of columns to sort stats by. See - pstats.Stats.sort_stats()(5). + * ‘sort_by’ (‘Iterable’‘[’str(6)‘]’) – A tuple of columns to + sort stats by. See pstats.Stats.sort_stats()(7). - * ‘restrictions’ – A tuple of restrictions to filter stats by. - See pstats.Stats.print_stats()(6). + * ‘restrictions’ (‘Iterable’‘[’‘Union’‘[’str(8)‘, ’int(9)‘, + ’float(10)‘]’‘]’) – A tuple of restrictions to filter stats + by. See pstats.Stats.print_stats()(11). - * ‘profile_dir’ – Save profile data files to this directory. + * ‘profile_dir’ (‘Optional’‘[’str(12)‘]’) – Save profile data + files to this directory. - * ‘filename_format’ – Format string for profile data file names, - or a callable returning a name. See explanation above. + * ‘filename_format’ (str(13)) – Format string for profile data + file names, or a callable returning a name. See explanation + above. + + + Return type: None(14) from werkzeug.middleware.profiler import ProfilerMiddleware app = ProfilerMiddleware(app) @@ -10369,21 +12610,9 @@ that may be slowing down your application. New in version 0.9: Added ‘restrictions’ and ‘profile_dir’. - -copyright: 2007 Pallets - - -license: BSD-3-Clause - -The *note interactive debugger: 8d. is also a middleware that can be +The *note interactive debugger: 8b. is also a middleware that can be applied manually, although it is typically used automatically with the -*note development server: 4a. - - -copyright: 2007 Pallets - - -license: BSD-3-Clause +*note development server: 44. ---------- Footnotes ---------- @@ -10395,21 +12624,40 @@ license: BSD-3-Clause (4) https://docs.python.org/3/library/stdtypes.html#str.format - (5) + (5) https://docs.python.org/3/library/stdtypes.html#str + + (6) https://docs.python.org/3/library/stdtypes.html#str + + (7) https://docs.python.org/3/library/profile.html#pstats.Stats.sort_stats - (6) + (8) https://docs.python.org/3/library/stdtypes.html#str + + (9) https://docs.python.org/3/library/functions.html#int + + (10) https://docs.python.org/3/library/functions.html#float + + (11) https://docs.python.org/3/library/profile.html#pstats.Stats.print_stats + (12) https://docs.python.org/3/library/stdtypes.html#str + + (13) https://docs.python.org/3/library/stdtypes.html#str + + (14) https://docs.python.org/3/library/constants.html#None +  File: werkzeug.info, Node: HTTP Exceptions, Prev: Middleware, Up: Reference -3.11 HTTP Exceptions +3.10 HTTP Exceptions ==================== +Implements a number of Python exceptions which can be raised from within +a view to trigger a standard HTTP non-200 response. + * Menu: -* werkzeug.exceptions: werkzeug exceptions. +* Usage Example:: * Error Classes:: * Baseclass:: * Special HTTP Exceptions:: @@ -10417,74 +12665,48 @@ File: werkzeug.info, Node: HTTP Exceptions, Prev: Middleware, Up: Reference * Custom Errors::  -File: werkzeug.info, Node: werkzeug exceptions, Next: Error Classes, Up: HTTP Exceptions +File: werkzeug.info, Node: Usage Example, Next: Error Classes, Up: HTTP Exceptions -3.11.1 werkzeug.exceptions --------------------------- +3.10.1 Usage Example +-------------------- -This module implements a number of Python exceptions you can raise from -within your views to trigger a standard non-200 response. - -* Menu: - -* Usage Example:: - - -File: werkzeug.info, Node: Usage Example, Up: werkzeug exceptions - -3.11.1.1 Usage Example -...................... - - from werkzeug.wrappers import BaseRequest - from werkzeug.wsgi import responder + from werkzeug.wrappers.request import Request from werkzeug.exceptions import HTTPException, NotFound def view(request): raise NotFound() - @responder - def application(environ, start_response): - request = BaseRequest(environ) + @Request.application + def application(request): try: return view(request) except HTTPException as e: return e As you can see from this example those exceptions are callable WSGI -applications. Because of Python 2.4 compatibility those do not extend -from the response objects but only from the python exception class. +applications. However, they are not Werkzeug response objects. You can +get a response object by calling ‘get_response()’ on a HTTP exception. -As a matter of fact they are not Werkzeug response objects. However you -can get a response object by calling ‘get_response()’ on a HTTP -exception. - -Keep in mind that you have to pass an environment to ‘get_response()’ -because some errors fetch additional information from the WSGI -environment. +Keep in mind that you may have to pass an environ (WSGI) or scope (ASGI) +to ‘get_response()’ because some errors fetch additional information +relating to the request. If you want to hook in a different exception page to say, a 404 status code, you can add a second except for a specific subclass of an error: - @responder - def application(environ, start_response): - request = BaseRequest(environ) + @Request.application + def application(request): try: return view(request) - except NotFound, e: + except NotFound as e: return not_found(request) - except HTTPException, e: + except HTTPException as e: return e - -copyright: 2007 Pallets - - -license: BSD-3-Clause -  -File: werkzeug.info, Node: Error Classes, Next: Baseclass, Prev: werkzeug exceptions, Up: HTTP Exceptions +File: werkzeug.info, Node: Error Classes, Next: Baseclass, Prev: Usage Example, Up: HTTP Exceptions -3.11.2 Error Classes +3.10.2 Error Classes -------------------- The following error classes exist in Werkzeug: @@ -10497,6 +12719,16 @@ The following error classes exist in Werkzeug: Raise if the browser sends something to the application the application or server cannot handle. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(1)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(2) + -- Exception: werkzeug.exceptions.Unauthorized (description=None, response=None, www_authenticate=None) @@ -10506,7 +12738,7 @@ The following error classes exist in Werkzeug: The ‘www_authenticate’ argument should be used to set the ‘WWW-Authenticate’ header. This is used for HTTP basic auth and - other schemes. Use *note WWWAuthenticate: 1c8. to create correctly + other schemes. Use *note WWWAuthenticate: 140. to create correctly formatted values. Strictly speaking a 401 response is invalid if it doesn’t provide at least one value for this header, although real clients typically don’t care. @@ -10514,11 +12746,24 @@ The following error classes exist in Werkzeug: Parameters: - * ‘description’ – Override the default message used for the body - of the response. + * ‘description’ (‘Optional’‘[’str(3)‘]’) – Override the default + message used for the body of the response. * ‘www-authenticate’ – A single value, or list of values, for - the WWW-Authenticate header. + the WWW-Authenticate header(s). + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + * ‘www_authenticate’ (‘Optional’‘[’‘Union’‘[’*note + WWWAuthenticate: 140.‘, ’‘Iterable’‘[’*note WWWAuthenticate: + 140.‘]’‘]’‘]’) – + + + Return type: None(4) + + Changed in version 2.0: Serialize multiple ‘www_authenticate’ items + into multiple ‘WWW-Authenticate’ headers, rather than joining them + into a single value, for better interoperability. Changed in version 0.15.3: If the ‘www_authenticate’ argument is not set, the ‘WWW-Authenticate’ header is not set. @@ -10539,6 +12784,16 @@ The following error classes exist in Werkzeug: Raise if the user doesn’t have the permission for the requested resource but was authenticated. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(5)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(6) + -- Exception: werkzeug.exceptions.NotFound (description=None, response=None) @@ -10546,8 +12801,18 @@ The following error classes exist in Werkzeug: Raise if a resource does not exist and never existed. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(7)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(8) + -- Exception: werkzeug.exceptions.MethodNotAllowed (valid_methods=None, - description=None) + description=None, response=None) `405' ‘Method Not Allowed’ @@ -10560,6 +12825,21 @@ The following error classes exist in Werkzeug: don’t provide valid methods in the header which you can do with that list. + Takes an optional list of valid http methods starting with werkzeug + 0.3 the list will be mandatory. + + + Parameters: + + * ‘valid_methods’ (‘Optional’‘[’‘Iterable’‘[’str(9)‘]’‘]’) – + + * ‘description’ (‘Optional’‘[’str(10)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(11) + -- Exception: werkzeug.exceptions.NotAcceptable (description=None, response=None) @@ -10568,6 +12848,16 @@ The following error classes exist in Werkzeug: Raise if the server can’t return any content conforming to the ‘Accept’ headers of the client. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(12)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(13) + -- Exception: werkzeug.exceptions.RequestTimeout (description=None, response=None) @@ -10575,6 +12865,16 @@ The following error classes exist in Werkzeug: Raise to signalize a timeout. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(14)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(15) + -- Exception: werkzeug.exceptions.Conflict (description=None, response=None) @@ -10585,6 +12885,16 @@ The following error classes exist in Werkzeug: New in version 0.7. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(16)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(17) + -- Exception: werkzeug.exceptions.Gone (description=None, response=None) @@ -10593,6 +12903,16 @@ The following error classes exist in Werkzeug: Raise if a resource existed previously and went away without new location. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(18)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(19) + -- Exception: werkzeug.exceptions.LengthRequired (description=None, response=None) @@ -10601,6 +12921,16 @@ The following error classes exist in Werkzeug: Raise if the browser submitted data but no ‘Content-Length’ header which is required for the kind of processing the server does. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(20)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(21) + -- Exception: werkzeug.exceptions.PreconditionFailed (description=None, response=None) @@ -10609,6 +12939,16 @@ The following error classes exist in Werkzeug: Status code used in combination with ‘If-Match’, ‘If-None-Match’, or ‘If-Unmodified-Since’. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(22)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(23) + -- Exception: werkzeug.exceptions.RequestEntityTooLarge (description=None, response=None) @@ -10617,6 +12957,16 @@ The following error classes exist in Werkzeug: The status code one should return if the data submitted exceeded a given limit. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(24)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(25) + -- Exception: werkzeug.exceptions.RequestURITooLarge (description=None, response=None) @@ -10624,6 +12974,16 @@ The following error classes exist in Werkzeug: Like `413' but for too long URLs. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(26)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(27) + -- Exception: werkzeug.exceptions.UnsupportedMediaType (description=None, response=None) @@ -10632,8 +12992,18 @@ The following error classes exist in Werkzeug: The status code returned if the server is unable to handle the media type the client transmitted. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(28)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(29) + -- Exception: werkzeug.exceptions.RequestedRangeNotSatisfiable - (length=None, units='bytes', description=None) + (length=None, units='bytes', description=None, response=None) `416' ‘Requested Range Not Satisfiable’ @@ -10641,6 +13011,23 @@ The following error classes exist in Werkzeug: New in version 0.7. + Takes an optional ‘Content-Range’ header value based on ‘length’ + parameter. + + + Parameters: + + * ‘length’ (‘Optional’‘[’int(30)‘]’) – + + * ‘units’ (str(31)) – + + * ‘description’ (‘Optional’‘[’str(32)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(33) + -- Exception: werkzeug.exceptions.ExpectationFailed (description=None, response=None) @@ -10651,6 +13038,16 @@ The following error classes exist in Werkzeug: New in version 0.7. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(34)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(35) + -- Exception: werkzeug.exceptions.ImATeapot (description=None, response=None) @@ -10661,6 +13058,16 @@ The following error classes exist in Werkzeug: New in version 0.7. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(36)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(37) + -- Exception: werkzeug.exceptions.UnprocessableEntity (description=None, response=None) @@ -10669,6 +13076,16 @@ The following error classes exist in Werkzeug: Used if the request is well formed, but the instructions are otherwise incorrect. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(38)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(39) + -- Exception: werkzeug.exceptions.Locked (description=None, response=None) @@ -10676,6 +13093,16 @@ The following error classes exist in Werkzeug: Used if the resource that is being accessed is locked. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(40)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(41) + -- Exception: werkzeug.exceptions.FailedDependency (description=None, response=None) @@ -10685,6 +13112,16 @@ The following error classes exist in Werkzeug: the requested action depended on another action and that action failed. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(42)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(43) + -- Exception: werkzeug.exceptions.PreconditionRequired (description=None, response=None) @@ -10698,6 +13135,16 @@ The following error classes exist in Werkzeug: retained from a recent GET request, the server ensures that each client has at least seen the previous revision of the resource. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(44)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(45) + -- Exception: werkzeug.exceptions.TooManyRequests (description=None, response=None, retry_after=None) @@ -10710,9 +13157,19 @@ The following error classes exist in Werkzeug: the user should wait before retrying. - Parameters: ‘retry_after’ – If given, set the ‘Retry-After’ header - to this value. May be an int(1) number of seconds or a - datetime(2). + Parameters: + + * ‘retry_after’ (‘Optional’‘[’‘Union’‘[’datetime.datetime(46)‘, + ’int(47)‘]’‘]’) – If given, set the ‘Retry-After’ header to + this value. May be an int(48) number of seconds or a + datetime(49). + + * ‘description’ (‘Optional’‘[’str(50)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(51) Changed in version 1.0: Added ‘retry_after’ parameter. @@ -10725,6 +13182,16 @@ The following error classes exist in Werkzeug: are too large. One or more individual fields may be too large, or the set of all headers is too large. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(52)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(53) + -- Exception: werkzeug.exceptions.UnavailableForLegalReasons (description=None, response=None) @@ -10733,6 +13200,16 @@ The following error classes exist in Werkzeug: This status code indicates that the server is denying access to the resource as a consequence of a legal demand. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(54)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(55) + -- Exception: werkzeug.exceptions.InternalServerError (description=None, response=None, original_exception=None) @@ -10741,10 +13218,22 @@ The following error classes exist in Werkzeug: Raise if an internal server error occurred. This is a good fallback if an unknown error occurred in the dispatcher. - Changed in version 1.0.0: Added the *note original_exception: 2f8. + Changed in version 1.0.0: Added the *note original_exception: 2c0. attribute. - -- Attribute: original_exception = None + + Parameters: + + * ‘description’ (‘Optional’‘[’str(56)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + * ‘original_exception’ (‘Optional’‘[’BaseException(57)‘]’) – + + + Return type: None(58) + + -- Attribute: original_exception The original exception that caused this 500 error. Can be used by frameworks to provide context when handling unexpected @@ -10758,6 +13247,16 @@ The following error classes exist in Werkzeug: Raise if the application does not support the action requested by the browser. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(59)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(60) + -- Exception: werkzeug.exceptions.BadGateway (description=None, response=None) @@ -10767,6 +13266,16 @@ The following error classes exist in Werkzeug: status code if you received an invalid response from the upstream server it accessed in attempting to fulfill the request. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(61)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(62) + -- Exception: werkzeug.exceptions.ServiceUnavailable (description=None, response=None, retry_after=None) @@ -10776,9 +13285,19 @@ The following error classes exist in Werkzeug: unavailable. - Parameters: ‘retry_after’ – If given, set the ‘Retry-After’ header - to this value. May be an int(3) number of seconds or a - datetime(4). + Parameters: + + * ‘retry_after’ (‘Optional’‘[’‘Union’‘[’datetime.datetime(63)‘, + ’int(64)‘]’‘]’) – If given, set the ‘Retry-After’ header to + this value. May be an int(65) number of seconds or a + datetime(66). + + * ‘description’ (‘Optional’‘[’str(67)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(68) Changed in version 1.0: Added ‘retry_after’ parameter. @@ -10790,6 +13309,16 @@ The following error classes exist in Werkzeug: Status code you should return if a connection to an upstream server times out. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(69)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(70) + -- Exception: werkzeug.exceptions.HTTPVersionNotSupported (description=None, response=None) @@ -10798,10 +13327,15 @@ The following error classes exist in Werkzeug: The server does not support the HTTP protocol version used in the request. - -- Exception: werkzeug.exceptions.HTTPUnicodeError - This exception is used to signal unicode decode errors of request - data. For more information see the *note Unicode: 2ff. chapter. + Parameters: + + * ‘description’ (‘Optional’‘[’str(71)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(72) -- Exception: werkzeug.exceptions.ClientDisconnected (description=None, response=None) @@ -10819,6 +13353,16 @@ The following error classes exist in Werkzeug: New in version 0.8. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(73)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(74) + -- Exception: werkzeug.exceptions.SecurityError (description=None, response=None) @@ -10827,20 +13371,178 @@ The following error classes exist in Werkzeug: New in version 0.9. + + Parameters: + + * ‘description’ (‘Optional’‘[’str(75)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(76) + ---------- Footnotes ---------- - (1) https://docs.python.org/3/library/functions.html#int + (1) https://docs.python.org/3/library/stdtypes.html#str - (2) https://docs.python.org/3/library/datetime.html#datetime.datetime + (2) https://docs.python.org/3/library/constants.html#None - (3) https://docs.python.org/3/library/functions.html#int + (3) https://docs.python.org/3/library/stdtypes.html#str - (4) https://docs.python.org/3/library/datetime.html#datetime.datetime + (4) https://docs.python.org/3/library/constants.html#None + + (5) https://docs.python.org/3/library/stdtypes.html#str + + (6) https://docs.python.org/3/library/constants.html#None + + (7) https://docs.python.org/3/library/stdtypes.html#str + + (8) https://docs.python.org/3/library/constants.html#None + + (9) https://docs.python.org/3/library/stdtypes.html#str + + (10) https://docs.python.org/3/library/stdtypes.html#str + + (11) https://docs.python.org/3/library/constants.html#None + + (12) https://docs.python.org/3/library/stdtypes.html#str + + (13) https://docs.python.org/3/library/constants.html#None + + (14) https://docs.python.org/3/library/stdtypes.html#str + + (15) https://docs.python.org/3/library/constants.html#None + + (16) https://docs.python.org/3/library/stdtypes.html#str + + (17) https://docs.python.org/3/library/constants.html#None + + (18) https://docs.python.org/3/library/stdtypes.html#str + + (19) https://docs.python.org/3/library/constants.html#None + + (20) https://docs.python.org/3/library/stdtypes.html#str + + (21) https://docs.python.org/3/library/constants.html#None + + (22) https://docs.python.org/3/library/stdtypes.html#str + + (23) https://docs.python.org/3/library/constants.html#None + + (24) https://docs.python.org/3/library/stdtypes.html#str + + (25) https://docs.python.org/3/library/constants.html#None + + (26) https://docs.python.org/3/library/stdtypes.html#str + + (27) https://docs.python.org/3/library/constants.html#None + + (28) https://docs.python.org/3/library/stdtypes.html#str + + (29) https://docs.python.org/3/library/constants.html#None + + (30) https://docs.python.org/3/library/functions.html#int + + (31) https://docs.python.org/3/library/stdtypes.html#str + + (32) https://docs.python.org/3/library/stdtypes.html#str + + (33) https://docs.python.org/3/library/constants.html#None + + (34) https://docs.python.org/3/library/stdtypes.html#str + + (35) https://docs.python.org/3/library/constants.html#None + + (36) https://docs.python.org/3/library/stdtypes.html#str + + (37) https://docs.python.org/3/library/constants.html#None + + (38) https://docs.python.org/3/library/stdtypes.html#str + + (39) https://docs.python.org/3/library/constants.html#None + + (40) https://docs.python.org/3/library/stdtypes.html#str + + (41) https://docs.python.org/3/library/constants.html#None + + (42) https://docs.python.org/3/library/stdtypes.html#str + + (43) https://docs.python.org/3/library/constants.html#None + + (44) https://docs.python.org/3/library/stdtypes.html#str + + (45) https://docs.python.org/3/library/constants.html#None + + (46) +https://docs.python.org/3/library/datetime.html#datetime.datetime + + (47) https://docs.python.org/3/library/functions.html#int + + (48) https://docs.python.org/3/library/functions.html#int + + (49) +https://docs.python.org/3/library/datetime.html#datetime.datetime + + (50) https://docs.python.org/3/library/stdtypes.html#str + + (51) https://docs.python.org/3/library/constants.html#None + + (52) https://docs.python.org/3/library/stdtypes.html#str + + (53) https://docs.python.org/3/library/constants.html#None + + (54) https://docs.python.org/3/library/stdtypes.html#str + + (55) https://docs.python.org/3/library/constants.html#None + + (56) https://docs.python.org/3/library/stdtypes.html#str + + (57) https://docs.python.org/3/library/exceptions.html#BaseException + + (58) https://docs.python.org/3/library/constants.html#None + + (59) https://docs.python.org/3/library/stdtypes.html#str + + (60) https://docs.python.org/3/library/constants.html#None + + (61) https://docs.python.org/3/library/stdtypes.html#str + + (62) https://docs.python.org/3/library/constants.html#None + + (63) +https://docs.python.org/3/library/datetime.html#datetime.datetime + + (64) https://docs.python.org/3/library/functions.html#int + + (65) https://docs.python.org/3/library/functions.html#int + + (66) +https://docs.python.org/3/library/datetime.html#datetime.datetime + + (67) https://docs.python.org/3/library/stdtypes.html#str + + (68) https://docs.python.org/3/library/constants.html#None + + (69) https://docs.python.org/3/library/stdtypes.html#str + + (70) https://docs.python.org/3/library/constants.html#None + + (71) https://docs.python.org/3/library/stdtypes.html#str + + (72) https://docs.python.org/3/library/constants.html#None + + (73) https://docs.python.org/3/library/stdtypes.html#str + + (74) https://docs.python.org/3/library/constants.html#None + + (75) https://docs.python.org/3/library/stdtypes.html#str + + (76) https://docs.python.org/3/library/constants.html#None  File: werkzeug.info, Node: Baseclass, Next: Special HTTP Exceptions, Prev: Error Classes, Up: HTTP Exceptions -3.11.3 Baseclass +3.10.3 Baseclass ---------------- All the exceptions implement this common interface: @@ -10848,9 +13550,22 @@ All the exceptions implement this common interface: -- Exception: werkzeug.exceptions.HTTPException (description=None, response=None) - Baseclass for all HTTP exceptions. This exception can be called as - WSGI application to render a default error page or you can catch - the subclasses of it independently and render nicer error messages. + The base class for all HTTP exceptions. This exception can be + called as a WSGI application to render a default error page or you + can catch the subclasses of it independently and render nicer error + messages. + + Changed in version 2.1: Removed the ‘wrap’ class method. + + + Parameters: + + * ‘description’ (‘Optional’‘[’str(1)‘]’) – + + * ‘response’ (‘Optional’‘[’*note Response: 5e.‘]’) – + + + Return type: None(2) -- Method: __call__ (environ, start_response) @@ -10859,33 +13574,54 @@ All the exceptions implement this common interface: Parameters: - * ‘environ’ – the WSGI environment. + * ‘environ’ (‘WSGIEnvironment’) – the WSGI environment. - * ‘start_response’ – the response callable provided by the - WSGI server. + * ‘start_response’ (‘StartResponse’) – the response + callable provided by the WSGI server. - -- Method: get_response (environ=None) + + Return type: Iterable[bytes(3)] + + -- Method: get_response (environ=None, scope=None) Get a response object. If one was passed to the exception it’s returned directly. - Parameters: ‘environ’ – the optional environ for the request. - This can be used to modify the response depending on how the - request looked like. + Parameters: + + * ‘environ’ (‘Optional’‘[’‘Union’‘[’‘WSGIEnvironment’‘, + ’‘WSGIRequest’‘]’‘]’) – the optional environ for the + request. This can be used to modify the response + depending on how the request looked like. + + * ‘scope’ (‘Optional’‘[’dict(4)‘]’) – Returns: a ‘Response’ object or a subclass thereof. + + Return type: *note Response: 5e. + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3/library/stdtypes.html#str + + (2) https://docs.python.org/3/library/constants.html#None + + (3) https://docs.python.org/3/library/stdtypes.html#bytes + + (4) https://docs.python.org/3/library/stdtypes.html#dict +  File: werkzeug.info, Node: Special HTTP Exceptions, Next: Simple Aborting, Prev: Baseclass, Up: HTTP Exceptions -3.11.4 Special HTTP Exceptions +3.10.4 Special HTTP Exceptions ------------------------------ Starting with Werkzeug 0.3 some of the builtin classes raise exceptions that look like regular python exceptions (eg KeyError(1)) but are *note -BadRequest: 15d. HTTP exceptions at the same time. This decision was +BadRequest: e0. HTTP exceptions at the same time. This decision was made to simplify a common pattern where you want to abort if the client tampered with the submitted form data in a way that the application can’t recover properly and should abort with ‘400 BAD REQUEST’. @@ -10901,13 +13637,22 @@ to check if the keys exist: If ‘title’ or ‘body’ are missing in the form, a special key error will be raised which behaves like a KeyError(2) but also a *note BadRequest: -15d. exception. +e0. exception. -- Exception: werkzeug.exceptions.BadRequestKeyError (arg=None, *args, **kwargs) An exception that is used to signal both a KeyError(3) and a *note - BadRequest: 15d. Used by many of the datastructures. + BadRequest: e0. Used by many of the datastructures. + + + Parameters: + + * ‘arg’ (‘Optional’‘[’str(4)‘]’) – + + * ‘args’ (‘Any’) – + + * ‘kwargs’ (‘Any’) – ---------- Footnotes ---------- @@ -10917,19 +13662,21 @@ be raised which behaves like a KeyError(2) but also a *note BadRequest: (3) https://docs.python.org/3/library/exceptions.html#KeyError + (4) https://docs.python.org/3/library/stdtypes.html#str +  File: werkzeug.info, Node: Simple Aborting, Next: Custom Errors, Prev: Special HTTP Exceptions, Up: HTTP Exceptions -3.11.5 Simple Aborting +3.10.5 Simple Aborting ---------------------- Sometimes it’s convenient to just raise an exception by the error code, without importing the exception and looking up the name etc. For this -purpose there is the *note abort(): 306. function. +purpose there is the *note abort(): 2cc. function. -- Function: werkzeug.exceptions.abort (status, *args, **kwargs) - Raises an *note HTTPException: 38. for the given status code or + Raises an *note HTTPException: 32. for the given status code or WSGI application. If a status code is given, it will be looked up in the list of @@ -10940,6 +13687,18 @@ purpose there is the *note abort(): 306. function. abort(404) # 404 Not Found abort(Response('Hello World')) + + Parameters: + + * ‘status’ (‘Union’‘[’int(1)‘, ’*note Response: 5e.‘]’) – + + * ‘args’ (‘Any’) – + + * ‘kwargs’ (‘Any’) – + + + Return type: te.NoReturn + If you want to use this functionality with custom exceptions you can create an instance of the aborter class: @@ -10953,10 +13712,32 @@ create an instance of the aborter class: The rest of the arguments are forwarded to the exception constructor. + + Parameters: + + * ‘mapping’ (‘Optional’‘[’‘Dict’‘[’int(2)‘, ’‘Type’‘[’*note + werkzeug.exceptions.HTTPException: 32.‘]’‘]’‘]’) – + + * ‘extra’ (‘Optional’‘[’‘Dict’‘[’int(3)‘, ’‘Type’‘[’*note + werkzeug.exceptions.HTTPException: 32.‘]’‘]’‘]’) – + + + Return type: None(4) + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3/library/functions.html#int + + (2) https://docs.python.org/3/library/functions.html#int + + (3) https://docs.python.org/3/library/functions.html#int + + (4) https://docs.python.org/3/library/constants.html#None +  File: werkzeug.info, Node: Custom Errors, Prev: Simple Aborting, Up: HTTP Exceptions -3.11.6 Custom Errors +3.10.6 Custom Errors -------------------- As you can see from the list above not all status codes are available as @@ -10965,7 +13746,7 @@ represent errors are missing. For redirects you can use the ‘redirect()’ function from the utilities. If you want to add an error yourself you can subclass *note -HTTPException: 38.: +HTTPException: 32.: from werkzeug.exceptions import HTTPException @@ -10976,7 +13757,7 @@ HTTPException: 38.: This is the minimal code you need for your own exception. If you want to add more logic to the errors you can override the ‘get_description()’, ‘get_body()’, ‘get_headers()’ and *note -get_response(): 302. methods. In any case you should have a look at the +get_response(): 2c8. methods. In any case you should have a look at the sourcecode of the exceptions module. You can override the default description in the constructor with the @@ -11050,13 +13831,6 @@ First you need to create the CGI application file. Let’s call it application = make_app() CGIHandler().run(application) -If you’re running Python 2.4 you will need the wsgiref(1) package. -Python 2.5 and higher ship this as part of the standard library. - - ---------- Footnotes ---------- - - (1) https://docs.python.org/3/library/wsgiref.html#module-wsgiref -  File: werkzeug.info, Node: Server Setup, Prev: Creating a cgi file, Up: CGI @@ -11389,7 +14163,7 @@ It looks something along these lines: If you now start the file the server will listen on ‘localhost:8080’. Keep in mind that WSGI applications behave slightly different for proxied setups. If you have not developed your application for proxying -in mind, you can apply the *note ProxyFix: 2ce. middleware. +in mind, you can apply the *note ProxyFix: 297. middleware.  File: werkzeug.info, Node: Configuring nginx<2>, Prev: Creating a py server, Up: HTTP Proxying @@ -11427,7 +14201,8 @@ File: werkzeug.info, Node: Additional Information, Next: Python Module Index, * Important Terms:: * Unicode:: * Dealing with Request Data:: -* Changelog:: +* BSD-3-Clause License:: +* Changes::  File: werkzeug.info, Node: Important Terms, Next: Unicode, Up: Additional Information @@ -11451,13 +14226,13 @@ File: werkzeug.info, Node: WSGI, Next: Response Object, Up: Important Terms ---------- WSGI a specification for Python web applications Werkzeug follows. It -was specified in the PEP 333(1) and is widely supported. Unlike +was specified in the PEP 3333(1) and is widely supported. Unlike previous solutions it guarantees that web applications, servers and utilities can work together. ---------- Footnotes ---------- - (1) https://www.python.org/dev/peps/pep-0333 + (1) https://www.python.org/dev/peps/pep-3333  File: werkzeug.info, Node: Response Object, Next: View Function, Prev: WSGI, Up: Important Terms @@ -11470,7 +14245,7 @@ application but does not do any request processing. Usually you have a view function or controller method that processes the request and assembles a response object. -A response object is `not' necessarily the ‘BaseResponse’ object or a +A response object is `not' necessarily the ‘Response’ class or a subclass thereof. For example Pylons/webob provide a very similar response class that can @@ -11500,17 +14275,10 @@ File: werkzeug.info, Node: Unicode, Next: Dealing with Request Data, Prev: Im 5.2 Unicode =========== -Since early Python 2 days unicode was part of all default Python builds. -It allows developers to write applications that deal with non-ASCII -characters in a straightforward way. But working with unicode requires -a basic knowledge about that matter, especially when working with -libraries that do not support it. - -Werkzeug uses unicode internally everywhere text data is assumed, even -if the HTTP standard is not unicode aware as it. Basically all incoming -data is decoded from the charset specified (per default ‘utf-8’) so that -you don’t operate on bytestrings any more. Outgoing unicode data is -then encoded into the target charset again. +Werkzeug uses strings internally everwhere text data is assumed, even if +the HTTP standard is not Unicode aware. Basically all incoming data is +decoded from the charset (UTF-8 by default) so that you don’t work with +bytes directly. Outgoing data is encoded into the target charset. * Menu: @@ -11518,7 +14286,6 @@ then encoded into the target charset again. * Unicode in HTTP:: * Error Handling:: * Request and Response Objects:: -* The Filesystem::  File: werkzeug.info, Node: Unicode in Python, Next: Unicode in HTTP, Up: Unicode @@ -11526,27 +14293,21 @@ File: werkzeug.info, Node: Unicode in Python, Next: Unicode in HTTP, Up: Unic 5.2.1 Unicode in Python ----------------------- -In Python 2 there are two basic string types: ‘str’ and ‘unicode’. -‘str’ may carry encoded unicode data but it’s always represented in -bytes whereas the ‘unicode’ type does not contain bytes but charpoints. -What does this mean? Imagine you have the German Umlaut ‘ö’. In ASCII -you cannot represent that character, but in the ‘latin-1’ and ‘utf-8’ -character sets you can represent it, but they look differently when -encoded: +Imagine you have the German Umlaut ‘ö’. In ASCII you cannot represent +that character, but in the ‘latin-1’ and ‘utf-8’ character sets you can +represent it, but they look different when encoded: - >>> u'ö'.encode('latin1') - '\xf6' - >>> u'ö'.encode('utf-8') - '\xc3\xb6' + >>> "ö".encode("latin1") + b'\xf6' + >>> "ö".encode("utf-8") + b'\xc3\xb6' -So an ‘ö’ might look totally different depending on the encoding which -makes it hard to work with it. The solution is using the ‘unicode’ type -(as we did above, note the ‘u’ prefix before the string). The unicode -type does not store the bytes for ‘ö’ but the information, that this is -a ‘LATIN SMALL LETTER O WITH DIAERESIS’. - -Doing ‘len(u'ö')’ will always give us the expected “1” but ‘len('ö')’ -might give different results depending on the encoding of ‘'ö'’. +An ‘ö’ looks different depending on the encoding which makes it hard to +work with it as bytes. Instead, Python treats strings as Unicode text +and stores the information ‘LATIN SMALL LETTER O WITH DIAERESIS’ instead +of the bytes for ‘ö’ in a specific encoding. The length of a string +with 1 character will be 1, where the length of the bytes might be some +other value.  File: werkzeug.info, Node: Unicode in HTTP, Next: Error Handling, Prev: Unicode in Python, Up: Unicode @@ -11554,28 +14315,12 @@ File: werkzeug.info, Node: Unicode in HTTP, Next: Error Handling, Prev: Unico 5.2.2 Unicode in HTTP --------------------- -The problem with unicode is that HTTP does not know what unicode is. -HTTP is limited to bytes but this is not a big problem as Werkzeug -decodes and encodes for us automatically all incoming and outgoing data. -Basically what this means is that data sent from the browser to the web -application is per default decoded from an utf-8 bytestring into a -‘unicode’ string. Data sent from the application back to the browser -that is not yet a bytestring is then encoded back to utf-8. - -Usually this “just works” and we don’t have to worry about it, but there -are situations where this behavior is problematic. For example the -Python 2 IO layer is not unicode aware. This means that whenever you -work with data from the file system you have to properly decode it. The -correct way to load a text file from the file system looks like this: - - f = file('/path/to/the_file.txt', 'r') - try: - text = f.decode('utf-8') # assuming the file is utf-8 encoded - finally: - f.close() - -There is also the codecs module which provides an open function that -decodes automatically from the given encoding. +However, the HTTP spec was written in a time where ASCII bytes were the +common way data was represented. To work around this for the modern +web, Werkzeug decodes and encodes incoming and outgoing data +automatically. Data sent from the browser to the web application is +decoded from UTF-8 bytes into a string. Data sent from the application +back to the browser is encoded back to UTF-8.  File: werkzeug.info, Node: Error Handling, Next: Request and Response Objects, Prev: Unicode in HTTP, Up: Unicode @@ -11594,70 +14339,33 @@ the bad data to the client. (1) https://docs.python.org/3/library/stdtypes.html#str.encode  -File: werkzeug.info, Node: Request and Response Objects, Next: The Filesystem, Prev: Error Handling, Up: Unicode +File: werkzeug.info, Node: Request and Response Objects, Prev: Error Handling, Up: Unicode 5.2.4 Request and Response Objects ---------------------------------- -As request and response objects usually are the central entities of -Werkzeug powered applications you can change the default encoding -Werkzeug operates on by subclassing these two classes. For example you -can easily set the application to utf-7 and strict error handling: +In most cases, you should stick with Werkzeug’s default encoding of +UTF-8. If you have a specific reason to, you can subclass *note +wrappers.Request: 71. and *note wrappers.Response: 5e. to change the +encoding and error handling. - from werkzeug.wrappers import BaseRequest, BaseResponse + from werkzeug.wrappers.request import Request + from werkzeug.wrappers.response import Response - class Request(BaseRequest): - charset = 'utf-7' - encoding_errors = 'strict' + class Latin1Request(Request): + charset = "latin1" + encoding_errors = "strict" - class Response(BaseResponse): - charset = 'utf-7' + class Latin1Response(Response): + charset = "latin1" -Keep in mind that the error handling is only customizable for all -decoding but not encoding. If Werkzeug encounters an encoding error it -will raise a UnicodeEncodeError(1). It’s your responsibility to not -create data that is not present in the target charset (a non issue with -all unicode encodings such as utf-8). - - ---------- Footnotes ---------- - - (1) -https://docs.python.org/3/library/exceptions.html#UnicodeEncodeError +The error handling can only be changed for the request. Werkzeug will +always raise errors when encoding to bytes in the response. It’s your +responsibility to not create data that is not present in the target +charset. This is not an issue for UTF-8.  -File: werkzeug.info, Node: The Filesystem, Prev: Request and Response Objects, Up: Unicode - -5.2.5 The Filesystem --------------------- - -Changed in version 0.11. - -Up until version 0.11, Werkzeug used Python’s stdlib functionality to -detect the filesystem encoding. However, several bug reports against -Werkzeug have shown that the value of sys.getfilesystemencoding()(1) -cannot be trusted under traditional UNIX systems. The usual problems -come from misconfigured systems, where ‘LANG’ and similar environment -variables are not set. In such cases, Python would default to ASCII as -filesystem encoding, a very conservative default that is usually wrong -and causes more problems than it avoids. - -Therefore Werkzeug will force the filesystem encoding to ‘UTF-8’ and -issue a warning whenever it detects that it is running under BSD or -Linux, and sys.getfilesystemencoding()(2) is returning an ASCII -encoding. - -See also *note werkzeug.filesystem: 3. - - ---------- Footnotes ---------- - - (1) -https://docs.python.org/3/library/sys.html#sys.getfilesystemencoding - - (2) -https://docs.python.org/3/library/sys.html#sys.getfilesystemencoding - - -File: werkzeug.info, Node: Dealing with Request Data, Next: Changelog, Prev: Unicode, Up: Additional Information +File: werkzeug.info, Node: Dealing with Request Data, Next: BSD-3-Clause License, Prev: Unicode, Up: Additional Information 5.3 Dealing with Request Data ============================= @@ -11748,8 +14456,8 @@ File: werkzeug.info, Node: Limiting Request Data, Next: How to extend Parsing? --------------------------- To avoid being the victim of a DDOS attack you can set the maximum -accepted content length and request field sizes. The ‘BaseRequest’ -class has two attributes for that: ‘max_content_length’ and +accepted content length and request field sizes. The ‘Request’ class +has two attributes for that: ‘max_content_length’ and ‘max_form_memory_size’. The first one can be used to limit the total content length. For @@ -11772,37 +14480,58 @@ File: werkzeug.info, Node: How to extend Parsing?, Prev: Limiting Request Data ---------------------------- Modern web applications transmit a lot more than multipart form data or -url encoded data. To extend the capabilities, subclass ‘BaseRequest’ or +url encoded data. To extend the capabilities, subclass ‘Request’ or ‘Request’ and add or extend methods. -There is already a mixin that provides JSON parsing: + +File: werkzeug.info, Node: BSD-3-Clause License, Next: Changes, Prev: Dealing with Request Data, Up: Additional Information - from werkzeug.wrappers import Request - from werkzeug.wrappers.json import JSONMixin +5.4 BSD-3-Clause License +======================== - class JSONRequest(JSONMixin, Request): - pass +Copyright 2007 Pallets -The basic implementation of that looks like: +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: - from werkzeug.utils import cached_property - from werkzeug.wrappers import Request - import simplejson as json + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. - class JSONRequest(Request): - @cached_property - def json(self): - if self.mimetype == "application/json": - return json.loads(self.data) + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS +IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  -File: werkzeug.info, Node: Changelog, Prev: Dealing with Request Data, Up: Additional Information +File: werkzeug.info, Node: Changes, Prev: BSD-3-Clause License, Up: Additional Information -5.4 Changelog -============= +5.5 Changes +=========== * Menu: +* Version 2.1.0: Version 2 1 0. +* Version 2.0.3: Version 2 0 3. +* Version 2.0.2: Version 2 0 2. +* Version 2.0.1: Version 2 0 1. +* Version 2.0.0: Version 2 0 0. * Version 1.0.1: Version 1 0 1. * Version 1.0.0: Version 1 0 0. * Version 0.16.1: Version 0 16 1. @@ -11873,9 +14602,727 @@ File: werkzeug.info, Node: Changelog, Prev: Dealing with Request Data, Up: Ad * Version 0.1: Version 0 1.  -File: werkzeug.info, Node: Version 1 0 1, Next: Version 1 0 0, Up: Changelog +File: werkzeug.info, Node: Version 2 1 0, Next: Version 2 0 3, Up: Changes -5.4.1 Version 1.0.1 +5.5.1 Version 2.1.0 +------------------- + +Unreleased + + - Drop support for Python 3.6. #2277(1) + + - Using gevent or eventlet requires greenlet>=1.0 or PyPy>=7.3.7. + ‘werkzeug.locals’ and ‘contextvars’ will not work correctly with + older versions. #2278(2) + + - Remove previously deprecated code. #2276(3) + + - Remove the non-standard ‘shutdown’ function from the WSGI + environ when running the development server. See the docs for + alternatives. + + - Request and response mixins have all been merged into the + ‘Request’ and ‘Response’ classes. + + - The user agent parser and the ‘useragents’ module is removed. + The ‘user_agent’ module provides an interface that can be + subclassed to add a parser, such as ua-parser. By default it + only stores the whole string. + + - The test client returns ‘TestResponse’ instances and can no + longer be treated as a tuple. All data is available as + properties on the response. + + - Remove ‘locals.get_ident’ and related thread-local code from + ‘locals’, it no longer makes sense when moving to a + contextvars-based implementation. + + - Remove the ‘python -m werkzeug.serving’ CLI. + + - The ‘has_key’ method on some mapping datastructures; use ‘key + in data’ instead. + + - ‘Request.disable_data_descriptor’ is removed, pass + ‘shallow=True’ instead. + + - Remove the ‘no_etag’ parameter from ‘Response.freeze()’. + + - Remove the ‘HTTPException.wrap’ class method. + + - Remove the ‘cookie_date’ function. Use ‘http_date’ instead. + + - Remove the ‘pbkdf2_hex’, ‘pbkdf2_bin’, and ‘safe_str_cmp’ + functions. Use equivalents in ‘hashlib’ and ‘hmac’ modules + instead. + + - Remove the ‘Href’ class. + + - Remove the ‘HTMLBuilder’ class. + + - Remove the ‘invalidate_cached_property’ function. Use ‘del + obj.attr’ instead. + + - Remove ‘bind_arguments’ and ‘validate_arguments’. Use + ‘Signature.bind()’ and inspect.signature()(4) instead. + + - Remove ‘detect_utf_encoding’, it’s built-in to ‘json.loads’. + + - Remove ‘format_string’, use string.Template(5) instead. + + - Remove ‘escape’ and ‘unescape’. Use MarkupSafe instead. + + - Rely on PEP 538(6) and PEP 540(7) to handle decoding file names + with the correct filesystem encoding. The ‘filesystem’ module is + removed. #1760(8) + + - Default values passed to ‘Headers’ are validated the same way + values added later are. #1608(9) + + - Setting ‘CacheControl’ int properties, such as ‘max_age’, will + convert the value to an int. #2230(10) + + - Always use ‘socket.fromfd’ when restarting the dev server. + #2287(11) + + - When passing a dict of URL values to ‘Map.build’, list values do + not filter out ‘None’ or collapse to a single value. Passing a + ‘MultiDict’ does collapse single items. This undoes a previous + change that made it difficult to pass a list, or ‘None’ values in a + list, to custom URL converters. #2249(12) + + - ‘run_simple’ shows instructions for dealing with “address already + in use” errors, including extra instructions for macOS. #2321(13) + + - Extend list of characters considered always safe in URLs based on + RFC 3986(14). #2319(15) + + - Optimize the stat reloader to avoid watching unnecessary files in + more cases. The watchdog reloader is still recommended for + performance and accuracy. #2141(16) + + - The development server uses ‘Transfer-Encoding: chunked’ for + streaming responses when it is configured for HTTP/1.1. + #2090(17)#1327(18), #2091(19) + + - The development server uses HTTP/1.1, which enables keep-alive + connections and chunked streaming responses, when ‘threaded’ or + ‘processes’ is enabled. #2323(20) + + ---------- Footnotes ---------- + + (1) https://github.com/pallets/werkzeug/pull/2277 + + (2) https://github.com/pallets/werkzeug/pull/2278 + + (3) https://github.com/pallets/werkzeug/pull/2276 + + (4) https://docs.python.org/3/library/inspect.html#inspect.signature + + (5) https://docs.python.org/3/library/string.html#string.Template + + (6) https://www.python.org/dev/peps/pep-0538 + + (7) https://www.python.org/dev/peps/pep-0540 + + (8) https://github.com/pallets/werkzeug/issues/1760 + + (9) https://github.com/pallets/werkzeug/issues/1608 + + (10) https://github.com/pallets/werkzeug/issues/2230 + + (11) https://github.com/pallets/werkzeug/pull/2287 + + (12) https://github.com/pallets/werkzeug/issues/2249 + + (13) https://github.com/pallets/werkzeug/pull/2321 + + (14) https://tools.ietf.org/html/rfc3986.html + + (15) https://github.com/pallets/werkzeug/issues/2319 + + (16) https://github.com/pallets/werkzeug/issues/2141 + + (17) https://github.com/pallets/werkzeug/issues/2090 + + (18) https://github.com/pallets/werkzeug/issues/1327 + + (19) https://github.com/pallets/werkzeug/pull/2091 + + (20) https://github.com/pallets/werkzeug/pull/2323 + + +File: werkzeug.info, Node: Version 2 0 3, Next: Version 2 0 2, Prev: Version 2 1 0, Up: Changes + +5.5.2 Version 2.0.3 +------------------- + +Unreleased + + - ‘ProxyFix’ supports IPv6 addresses. #2262(1) + + - Type annotation for ‘Response.make_conditional’, + ‘HTTPException.get_response’, and ‘Map.bind_to_environ’ accepts + ‘Request’ in addition to ‘WSGIEnvironment’ for the first parameter. + #2290(2) + + - Fix type annotation for ‘Request.user_agent_class’. #2273(3) + + - Accessing ‘LocalProxy.__class__’ and ‘__doc__’ on an unbound proxy + returns the fallback value instead of a method object. #2188(4) + + ---------- Footnotes ---------- + + (1) https://github.com/pallets/werkzeug/issues/2262 + + (2) https://github.com/pallets/werkzeug/pull/2290 + + (3) https://github.com/pallets/werkzeug/issues/2273 + + (4) https://github.com/pallets/werkzeug/issues/2188 + + +File: werkzeug.info, Node: Version 2 0 2, Next: Version 2 0 1, Prev: Version 2 0 3, Up: Changes + +5.5.3 Version 2.0.2 +------------------- + +Released 2021-10-05 + + - Handle multiple tokens in ‘Connection’ header when routing + WebSocket requests. #2131(1) + + - Set the debugger pin cookie secure flag when on https. #2150(2) + + - Fix type annotation for ‘MultiDict.update’ to accept iterable + values #2142(3) + + - Prevent double encoding of redirect URL when ‘merge_slash=True’ for + ‘Rule.match’. #2157(4) + + - ‘CombinedMultiDict.to_dict’ with ‘flat=False’ considers all + component dicts when building value lists. #2189(5) + + - ‘send_file’ only sets a detected ‘Content-Encoding’ if + ‘as_attachment’ is disabled to avoid browsers saving decompressed + ‘.tar.gz’ files. #2149(6) + + - Fix type annotations for ‘TypeConversionDict.get’ to not return an + ‘Optional’ value if both ‘default’ and ‘type’ are not ‘None’. + #2169(7) + + - Fix type annotation for routing rule factories to accept + ‘Iterable[RuleFactory]’ instead of ‘Iterable[Rule]’ for the ‘rules’ + parameter. #2183(8) + + - Add missing type annotation for ‘FileStorage.__getattr__’ #2155(9) + + - The debugger pin cookie is set with ‘SameSite’ set to ‘Strict’ + instead of ‘None’ to be compatible with modern browser security. + #2156(10) + + - Type annotations use ‘IO[bytes]’ and ‘IO[str]’ instead of + ‘BinaryIO’ and ‘TextIO’ for wider type compatibility. #2130(11) + + - Ad-hoc TLS certs are generated with SAN matching CN. #2158(12) + + - Fix memory usage for locals when using Python 3.6 or pre 0.4.17 + greenlet versions. #2212(13) + + - Fix type annotation in ‘CallbackDict’, because it is not utilizing + a bound TypeVar. #2235(14) + + - Fix setting CSP header options on the response. #2237(15) + + - Fix an issue with with the interactive debugger where lines would + not expand on click for very long tracebacks. #2239(16) + + - The interactive debugger handles displaying an exception that does + not have a traceback, such as from ‘ProcessPoolExecutor’. + #2217(17) + + ---------- Footnotes ---------- + + (1) https://github.com/pallets/werkzeug/issues/2131 + + (2) https://github.com/pallets/werkzeug/pull/2150 + + (3) https://github.com/pallets/werkzeug/pull/2142 + + (4) https://github.com/pallets/werkzeug/issues/2157 + + (5) https://github.com/pallets/werkzeug/issues/2189 + + (6) https://github.com/pallets/werkzeug/issues/2149 + + (7) https://github.com/pallets/werkzeug/issues/2169 + + (8) https://github.com/pallets/werkzeug/issues/2183 + + (9) https://github.com/pallets/werkzeug/issues/2155 + + (10) https://github.com/pallets/werkzeug/issues/2156 + + (11) https://github.com/pallets/werkzeug/issues/2130 + + (12) https://github.com/pallets/werkzeug/issues/2158 + + (13) https://github.com/pallets/werkzeug/pull/2212 + + (14) https://github.com/pallets/werkzeug/issues/2235 + + (15) https://github.com/pallets/werkzeug/pull/2237 + + (16) https://github.com/pallets/werkzeug/pull/2239 + + (17) https://github.com/pallets/werkzeug/issues/2217 + + +File: werkzeug.info, Node: Version 2 0 1, Next: Version 2 0 0, Prev: Version 2 0 2, Up: Changes + +5.5.4 Version 2.0.1 +------------------- + +Released 2021-05-17 + + - Fix type annotation for ‘send_file’ ‘max_age’ callable. Don’t pass + ‘pathlib.Path’ to ‘max_age’. #2119(1) + + - Mark top-level names as exported so type checking understands + imports in user projects. #2122(2) + + - Fix some types that weren’t available in Python 3.6.0. #2123(3) + + - ‘cached_property’ is generic over its return type, properties + decorated with it report the correct type. #2113(4) + + - Fix multipart parsing bug when boundary contains special regex + characters. #2125(5) + + - Type checking understands that calling ‘headers.get’ with a string + default will always return a string. #2128(6) + + - If ‘HTTPException.description’ is not a string, ‘get_description’ + will convert it to a string. #2115(7) + + ---------- Footnotes ---------- + + (1) https://github.com/pallets/werkzeug/issues/2119 + + (2) https://github.com/pallets/werkzeug/issues/2122 + + (3) https://github.com/pallets/werkzeug/issues/2123 + + (4) https://github.com/pallets/werkzeug/issues/2113 + + (5) https://github.com/pallets/werkzeug/issues/2125 + + (6) https://github.com/pallets/werkzeug/issues/2128 + + (7) https://github.com/pallets/werkzeug/issues/2115 + + +File: werkzeug.info, Node: Version 2 0 0, Next: Version 1 0 1, Prev: Version 2 0 1, Up: Changes + +5.5.5 Version 2.0.0 +------------------- + +Released 2021-05-11 + + - Drop support for Python 2 and 3.5. #1693(1) + + - Deprecate ‘utils.format_string()’, use string.Template(2) instead. + #1756(3) + + - Deprecate ‘utils.bind_arguments()’ and + ‘utils.validate_arguments()’, use ‘Signature.bind()’ and + inspect.signature()(4) instead. #1757(5) + + - Deprecate ‘utils.HTMLBuilder’. #1761(6) + + - Deprecate ‘utils.escape()’ and ‘utils.unescape()’, use MarkupSafe + instead. #1758(7) + + - Deprecate the undocumented ‘python -m werkzeug.serving’ CLI. + #1834(8) + + - Deprecate the ‘environ["werkzeug.server.shutdown"]’ function that + is available when running the development server. #1752(9) + + - Deprecate the ‘useragents’ module and the built-in user agent + parser. Use a dedicated parser library instead by subclassing + ‘user_agent.UserAgent’ and setting ‘Request.user_agent_class’. + #2078(10) + + - Remove the unused, internal ‘posixemulation’ module. #1759(11) + + - All ‘datetime’ values are timezone-aware with + ‘tzinfo=timezone.utc’. This applies to anything using + ‘http.parse_date’: ‘Request.date’, ‘.if_modified_since’, + ‘.if_unmodified_since’; ‘Response.date’, ‘.expires’, + ‘.last_modified’, ‘.retry_after’; ‘parse_if_range_header’, and + ‘IfRange.date’. When comparing values, the other values must also + be aware, or these values must be made naive. When passing + parameters or setting attributes, naive values are still assumed to + be in UTC. #2040(12) + + - Merge all request and response wrapper mixin code into single + ‘Request’ and ‘Response’ classes. Using the mixin classes is no + longer necessary and will show a deprecation warning. Checking + ‘isinstance’ or ‘issubclass’ against ‘BaseRequest’ and + ‘BaseResponse’ will show a deprecation warning and check against + ‘Request’ or ‘Response’ instead. #1963(13) + + - JSON support no longer uses simplejson if it’s installed. To use + another JSON module, override ‘Request.json_module’ and + ‘Response.json_module’. #1766(14) + + - ‘Response.get_json()’ no longer caches the result, and the ‘cache’ + parameter is removed. #1698(15) + + - ‘Response.freeze()’ generates an ‘ETag’ header if one is not set. + The ‘no_etag’ parameter (which usually wasn’t visible anyway) is no + longer used. #1963(16) + + - Add a ‘url_scheme’ argument to *note build(): 15b. to override the + bound scheme. #1721(17) + + - Passing an empty list as a query string parameter to ‘build()’ + won’t append an unnecessary ‘?’. Also drop any number of ‘None’ + items in a list. #1992(18) + + - When passing a ‘Headers’ object to a test client method or + ‘EnvironBuilder’, multiple values for a key are joined into one + comma separated value. This matches the HTTP spec on multi-value + headers. #1655(19) + + - Setting ‘Response.status’ and ‘status_code’ uses identical parsing + and error checking. #1658(20), #1728(21) + + - ‘MethodNotAllowed’ and ‘RequestedRangeNotSatisfiable’ take a + ‘response’ kwarg, consistent with other HTTP errors. #1748(22) + + - The response generated by *note Unauthorized: 2ac. produces one + ‘WWW-Authenticate’ header per value in ‘www_authenticate’, rather + than joining them into a single value, to improve interoperability + with browsers and other clients. #1755(23) + + - If ‘parse_authorization_header’ can’t decode the header value, it + returns ‘None’ instead of raising a ‘UnicodeDecodeError’. + #1816(24) + + - The debugger no longer uses jQuery. #1807(25) + + - The test client includes the query string in ‘REQUEST_URI’ and + ‘RAW_URI’. #1781(26) + + - Switch the parameter order of ‘default_stream_factory’ to match the + order used when calling it. #1085(27) + + - Add ‘send_file’ function to generate a response that serves a file. + Adapted from Flask’s implementation. #265(28), #1850(29) + + - Add ‘send_from_directory’ function to safely serve an untrusted + path within a trusted directory. Adapted from Flask’s + implementation. #1880(30) + + - ‘send_file’ takes ‘download_name’, which is passed even if + ‘as_attachment=False’ by using ‘Content-Disposition: inline’. + ‘download_name’ replaces Flask’s ‘attachment_filename’. #1869(31) + + - ‘send_file’ sets ‘conditional=True’ and ‘max_age=None’ by default. + ‘Cache-Control’ is set to ‘no-cache’ if ‘max_age’ is not set, + otherwise ‘public’. This tells browsers to validate conditional + requests instead of using a timed cache. ‘max_age=None’ replaces + Flask’s ‘cache_timeout=43200’. #1882(32) + + - ‘send_file’ can be called with ‘etag="string"’ to set a custom ETag + instead of generating one. ‘etag’ replaces Flask’s ‘add_etags’. + #1868(33) + + - ‘send_file’ sets the ‘Content-Encoding’ header if an encoding is + returned when guessing ‘mimetype’ from ‘download_name’. #3896(34) + + - Update the defaults used by ‘generate_password_hash’. Increase + PBKDF2 iterations to 260000 from 150000. Increase salt length to + 16 from 8. Use ‘secrets’ module to generate salt. #1935(35) + + - The reloader doesn’t crash if ‘sys.stdin’ is somehow ‘None’. + #1915(36) + + - Add arguments to ‘delete_cookie’ to match ‘set_cookie’ and the + attributes modern browsers expect. #1889(37) + + - ‘utils.cookie_date’ is deprecated, use ‘utils.http_date’ instead. + The value for ‘Set-Cookie expires’ is no longer “-” delimited. + #2040(38) + + - Use ‘request.headers’ instead of ‘request.environ’ to look up + header attributes. #1808(39) + + - The test ‘Client’ request methods (‘client.get’, etc.) always + return an instance of ‘TestResponse’. In addition to the normal + behavior of ‘Response’, this class provides ‘request’ with the + request that produced the response, and ‘history’ to track + intermediate responses when ‘follow_redirects’ is used. + #763(40)#1894(41) + + - The test ‘Client’ request methods takes an ‘auth’ parameter to add + an ‘Authorization’ header. It can be an ‘Authorization’ object or + a ‘(username, password)’ tuple for ‘Basic’ auth. #1809(42) + + - Calling ‘response.close()’ on a response from the test ‘Client’ + will close the request input stream. This matches file behavior + and can prevent a ‘ResourceWarning’ in some cases. #1785(43) + + - ‘EnvironBuilder.from_environ’ decodes values encoded for WSGI, to + avoid double encoding the new values. #1959(44) + + - The default stat reloader will watch Python files under + non-system/virtualenv ‘sys.path’ entries, which should contain most + user code. It will also watch all Python files under directories + given in ‘extra_files’. #1945(45) + + - The reloader ignores ‘__pycache__’ directories again. #1945(46) + + - ‘run_simple’ takes ‘exclude_patterns’ a list of ‘fnmatch’ patterns + that will not be scanned by the reloader. #1333(47) + + - Cookie names are no longer unquoted. This was against RFC 6265(48) + and potentially allowed setting ‘__Secure’ prefixed cookies. + #1965(49) + + - Fix some word matches for user agent platform when the word can be + a substring. #1923(50) + + - The development server logs ignored SSL errors. #1967(51) + + - Temporary files for form data are opened in ‘rb+’ instead of ‘wb+’ + mode for better compatibility with some libraries. #1961(52) + + - Use SHA-1 instead of MD5 for generating ETags and the debugger pin, + and in some tests. MD5 is not available in some environments, such + as FIPS 140. This may invalidate some caches since the ETag will + be different. #1897(53) + + - Add ‘Cross-Origin-Opener-Policy’ and ‘Cross-Origin-Embedder-Policy’ + response header properties. #2008(54) + + - ‘run_simple’ tries to show a valid IP address when binding to all + addresses, instead of ‘0.0.0.0’ or ‘::’. It also warns about not + running the development server in production in this case. + #1964(55) + + - Colors in the development server log are displayed if Colorama is + installed on Windows. For all platforms, style support no longer + requires Click. #1832(56) + + - A range request for an empty file (or other data with length 0) + will return a 200 response with the empty file instead of a 416 + error. #1937(57) + + - New sans-IO base classes for ‘Request’ and ‘Response’ have been + extracted to contain all the behavior that is not WSGI or IO + dependent. These are not a public API, they are part of an ongoing + refactor to let ASGI frameworks use Werkzeug. #2005(58) + + - Parsing ‘multipart/form-data’ has been refactored to use sans-io + patterns. This should also make parsing forms with large binary + file uploads significantly faster. #1788(59)#875(60) + + - ‘LocalProxy’ matches the current Python data model special methods, + including all r-ops, in-place ops, and async. ‘__class__’ is + proxied, so the proxy will look like the object in more cases, + including ‘isinstance’. Use ‘issubclass(type(obj), LocalProxy)’ to + check if an object is actually a proxy. #1754(61) + + - ‘Local’ uses ‘ContextVar’ on Python 3.7+ instead of + ‘threading.local’. #1778(62) + + - ‘request.values’ does not include ‘form’ for GET requests (even + though GET bodies are undefined). This prevents bad caching + proxies from caching form data instead of query strings. #2037(63) + + - The development server adds the underlying socket to ‘environ’ as + ‘werkzeug.socket’. This is non-standard and specific to the dev + server, other servers may expose this under their own key. It is + useful for handling a WebSocket upgrade request. #2052(64) + + - URL matching assumes ‘websocket=True’ mode for WebSocket upgrade + requests. #2052(65) + + - Updated ‘UserAgentParser’ to handle more cases. #1971(66) + + - ‘werzeug.DechunkedInput.readinto’ will not read beyond the size of + the buffer. #2021(67) + + - Fix connection reset when exceeding max content size. #2051(68) + + - ‘pbkdf2_hex’, ‘pbkdf2_bin’, and ‘safe_str_cmp’ are deprecated. + ‘hashlib’ and ‘hmac’ provide equivalents. #2083(69) + + - ‘invalidate_cached_property’ is deprecated. Use ‘del obj.name’ + instead. #2084(70) + + - ‘Href’ is deprecated. Use ‘werkzeug.routing’ instead. #2085(71) + + - ‘Request.disable_data_descriptor’ is deprecated. Create the + request with ‘shallow=True’ instead. #2085(72) + + - ‘HTTPException.wrap’ is deprecated. Create a subclass manually + instead. #2085(73) + + ---------- Footnotes ---------- + + (1) https://github.com/pallets/werkzeug/pull/1693 + + (2) https://docs.python.org/3/library/string.html#string.Template + + (3) https://github.com/pallets/werkzeug/issues/1756 + + (4) https://docs.python.org/3/library/inspect.html#inspect.signature + + (5) https://github.com/pallets/werkzeug/issues/1757 + + (6) https://github.com/pallets/werkzeug/issues/1761 + + (7) https://github.com/pallets/werkzeug/issues/1758 + + (8) https://github.com/pallets/werkzeug/issues/1834 + + (9) https://github.com/pallets/werkzeug/issues/1752 + + (10) https://github.com/pallets/werkzeug/issues/2078 + + (11) https://github.com/pallets/werkzeug/issues/1759 + + (12) https://github.com/pallets/werkzeug/pull/2040 + + (13) https://github.com/pallets/werkzeug/issues/1963 + + (14) https://github.com/pallets/werkzeug/pull/1766 + + (15) https://github.com/pallets/werkzeug/issues/1698 + + (16) https://github.com/pallets/werkzeug/issues/1963 + + (17) https://github.com/pallets/werkzeug/pull/1721 + + (18) https://github.com/pallets/werkzeug/issues/1992 + + (19) https://github.com/pallets/werkzeug/issues/1655 + + (20) https://github.com/pallets/werkzeug/issues/1658 + + (21) https://github.com/pallets/werkzeug/pull/1728 + + (22) https://github.com/pallets/werkzeug/pull/1748 + + (23) https://github.com/pallets/werkzeug/pull/1755 + + (24) https://github.com/pallets/werkzeug/issues/1816 + + (25) https://github.com/pallets/werkzeug/issues/1807 + + (26) https://github.com/pallets/werkzeug/issues/1781 + + (27) https://github.com/pallets/werkzeug/pull/1085 + + (28) https://github.com/pallets/werkzeug/issues/265 + + (29) https://github.com/pallets/werkzeug/pull/1850 + + (30) https://github.com/pallets/werkzeug/issues/1880 + + (31) https://github.com/pallets/werkzeug/issues/1869 + + (32) https://github.com/pallets/werkzeug/issues/1882 + + (33) https://github.com/pallets/werkzeug/issues/1868 + + (34) https://github.com/pallets/werkzeug/pull/3896 + + (35) https://github.com/pallets/werkzeug/pull/1935 + + (36) https://github.com/pallets/werkzeug/pull/1915 + + (37) https://github.com/pallets/werkzeug/pull/1889 + + (38) https://github.com/pallets/werkzeug/pull/2040 + + (39) https://github.com/pallets/werkzeug/pull/1808 + + (40) https://github.com/pallets/werkzeug/issues/763 + + (41) https://github.com/pallets/werkzeug/issues/1894 + + (42) https://github.com/pallets/werkzeug/pull/1809 + + (43) https://github.com/pallets/werkzeug/issues/1785 + + (44) https://github.com/pallets/werkzeug/pull/1959 + + (45) https://github.com/pallets/werkzeug/pull/1945 + + (46) https://github.com/pallets/werkzeug/pull/1945 + + (47) https://github.com/pallets/werkzeug/issues/1333 + + (48) https://tools.ietf.org/html/rfc6265.html + + (49) https://github.com/pallets/werkzeug/pull/1965 + + (50) https://github.com/pallets/werkzeug/issues/1923 + + (51) https://github.com/pallets/werkzeug/pull/1967 + + (52) https://github.com/pallets/werkzeug/issues/1961 + + (53) https://github.com/pallets/werkzeug/issues/1897 + + (54) https://github.com/pallets/werkzeug/pull/2008 + + (55) https://github.com/pallets/werkzeug/issues/1964 + + (56) https://github.com/pallets/werkzeug/issues/1832 + + (57) https://github.com/pallets/werkzeug/issues/1937 + + (58) https://github.com/pallets/werkzeug/pull/2005 + + (59) https://github.com/pallets/werkzeug/issues/1788 + + (60) https://github.com/pallets/werkzeug/issues/875 + + (61) https://github.com/pallets/werkzeug/issues/1754 + + (62) https://github.com/pallets/werkzeug/pull/1778 + + (63) https://github.com/pallets/werkzeug/pull/2037 + + (64) https://github.com/pallets/werkzeug/issues/2052 + + (65) https://github.com/pallets/werkzeug/issues/2052 + + (66) https://github.com/pallets/werkzeug/issues/1971 + + (67) https://github.com/pallets/werkzeug/issues/2021 + + (68) https://github.com/pallets/werkzeug/pull/2051 + + (69) https://github.com/pallets/werkzeug/pull/2083 + + (70) https://github.com/pallets/werkzeug/pull/2084 + + (71) https://github.com/pallets/werkzeug/pull/2085 + + (72) https://github.com/pallets/werkzeug/pull/2085 + + (73) https://github.com/pallets/werkzeug/pull/2085 + + +File: werkzeug.info, Node: Version 1 0 1, Next: Version 1 0 0, Prev: Version 2 0 0, Up: Changes + +5.5.6 Version 1.0.1 ------------------- Released 2020-03-31 @@ -11912,9 +15359,9 @@ Released 2020-03-31 (6) https://github.com/pallets/werkzeug/issues/1733  -File: werkzeug.info, Node: Version 1 0 0, Next: Version 0 16 1, Prev: Version 1 0 1, Up: Changelog +File: werkzeug.info, Node: Version 1 0 0, Next: Version 0 16 1, Prev: Version 1 0 1, Up: Changes -5.4.2 Version 1.0.0 +5.5.7 Version 1.0.0 ------------------- Released 2020-02-06 @@ -11962,17 +15409,17 @@ Released 2020-02-06 match the current server name without the port if the current scheme matches. #1584(16) - - *note InternalServerError: 2f7. has a ‘original_exception’ + - *note InternalServerError: 2bf. has a ‘original_exception’ attribute that frameworks can use to track the original cause of the error. #1590(17) - Headers are tested for equality independent of the header key case, such that ‘X-Foo’ is the same as ‘x-foo’. #1605(18) - - *note http.dump_cookie(): 1d6. accepts ‘'None'’ as a value for + - *note http.dump_cookie(): 1ae. accepts ‘'None'’ as a value for ‘samesite’. #1549(19) - - ‘set_cookie()’ accepts a ‘samesite’ argument. #1705(20) + - *note set_cookie(): 64. accepts a ‘samesite’ argument. #1705(20) - Support the Content Security Policy header through the ‘Response.content_security_policy’ data structure. #1617(21) @@ -12050,11 +15497,10 @@ Released 2020-02-06 200, to be more compliant with RFC 7233(47). This may help serving media to older browsers. #410(48)#1704(49) - - The *note SharedDataMiddleware: 2d1. default ‘fallback_mimetype’ is + - The *note SharedDataMiddleware: 29a. default ‘fallback_mimetype’ is ‘application/octet-stream’. If a filename looks like a text mimetype, the ‘utf-8’ charset is added to it. This matches the - behavior of *note BaseResponse: d7. and Flask’s ‘send_file()’. - #1689(50) + behavior of ‘BaseResponse’ and Flask’s ‘send_file()’. #1689(50) ---------- Footnotes ---------- @@ -12159,9 +15605,9 @@ Released 2020-02-06 (50) https://github.com/pallets/werkzeug/issues/1689  -File: werkzeug.info, Node: Version 0 16 1, Next: Version 0 16 0, Prev: Version 1 0 0, Up: Changelog +File: werkzeug.info, Node: Version 0 16 1, Next: Version 0 16 0, Prev: Version 1 0 0, Up: Changes -5.4.3 Version 0.16.1 +5.5.8 Version 0.16.1 -------------------- Released 2020-01-27 @@ -12179,9 +15625,9 @@ Released 2020-01-27 (2) https://github.com/pallets/werkzeug/issues/1659  -File: werkzeug.info, Node: Version 0 16 0, Next: Version 0 15 6, Prev: Version 0 16 1, Up: Changelog +File: werkzeug.info, Node: Version 0 16 0, Next: Version 0 15 6, Prev: Version 0 16 1, Up: Changes -5.4.4 Version 0.16.0 +5.5.9 Version 0.16.0 -------------------- Released 2019-09-19 @@ -12205,10 +15651,10 @@ Released 2019-09-19 (2) https://github.com/pallets/werkzeug/pull/1640  -File: werkzeug.info, Node: Version 0 15 6, Next: Version 0 15 5, Prev: Version 0 16 0, Up: Changelog +File: werkzeug.info, Node: Version 0 15 6, Next: Version 0 15 5, Prev: Version 0 16 0, Up: Changes -5.4.5 Version 0.15.6 --------------------- +5.5.10 Version 0.15.6 +--------------------- Released 2019-09-04 @@ -12234,10 +15680,10 @@ Released 2019-09-04 (3) https://github.com/pallets/werkzeug/issues/1630  -File: werkzeug.info, Node: Version 0 15 5, Next: Version 0 15 4, Prev: Version 0 15 6, Up: Changelog +File: werkzeug.info, Node: Version 0 15 5, Next: Version 0 15 4, Prev: Version 0 15 6, Up: Changes -5.4.6 Version 0.15.5 --------------------- +5.5.11 Version 0.15.5 +--------------------- Released 2019-07-17 @@ -12247,7 +15693,7 @@ Released 2019-07-17 - Fix a C assertion failure in debug builds of some Python 2.7 releases. #1553(2) - - *note BadRequestKeyError: 304. adds the ‘KeyError’ message to the + - *note BadRequestKeyError: 2ca. adds the ‘KeyError’ message to the description if ‘e.show_exception’ is set to ‘True’. This is a more secure default than the original 0.15.0 behavior and makes it easier to control without losing information. #1592(3) @@ -12289,10 +15735,10 @@ Released 2019-07-17 (9) https://github.com/pallets/werkzeug/issues/1589  -File: werkzeug.info, Node: Version 0 15 4, Next: Version 0 15 3, Prev: Version 0 15 5, Up: Changelog +File: werkzeug.info, Node: Version 0 15 4, Next: Version 0 15 3, Prev: Version 0 15 5, Up: Changes -5.4.7 Version 0.15.4 --------------------- +5.5.12 Version 0.15.4 +--------------------- Released 2019-05-14 @@ -12303,29 +15749,29 @@ Released 2019-05-14 (1) https://github.com/pallets/werkzeug/issues/1544  -File: werkzeug.info, Node: Version 0 15 3, Next: Version 0 15 2, Prev: Version 0 15 4, Up: Changelog +File: werkzeug.info, Node: Version 0 15 3, Next: Version 0 15 2, Prev: Version 0 15 4, Up: Changes -5.4.8 Version 0.15.3 --------------------- +5.5.13 Version 0.15.3 +--------------------- Released 2019-05-14 - Properly handle multi-line header folding in development server in Python 2.7. (#1080(1)) - - Restore the ‘response’ argument to *note Unauthorized: 2e4. + - Restore the ‘response’ argument to *note Unauthorized: 2ac. (#1527(2)) - - *note Unauthorized: 2e4. doesn’t add the ‘WWW-Authenticate’ header + - *note Unauthorized: 2ac. doesn’t add the ‘WWW-Authenticate’ header if ‘www_authenticate’ is not given. (#1516(3)) - The default URL converter correctly encodes bytes to string rather than representing them with ‘b''’. (#1502(4)) - - Fix the filename format string in *note ProfilerMiddleware: 2de. to + - Fix the filename format string in *note ProfilerMiddleware: 2a7. to correctly handle float values. (#1511(5)) - - Update *note LintMiddleware: 2db. to work on Python 3. (#1510(6)) + - Update *note LintMiddleware: 2a4. to work on Python 3. (#1510(6)) - The debugger detects cycles in chained exceptions and does not time out in that case. (#1536(7)) @@ -12350,10 +15796,10 @@ Released 2019-05-14 (7) https://github.com/pallets/werkzeug/issues/1536  -File: werkzeug.info, Node: Version 0 15 2, Next: Version 0 15 1, Prev: Version 0 15 3, Up: Changelog +File: werkzeug.info, Node: Version 0 15 2, Next: Version 0 15 1, Prev: Version 0 15 3, Up: Changes -5.4.9 Version 0.15.2 --------------------- +5.5.14 Version 0.15.2 +--------------------- Released 2019-04-02 @@ -12385,14 +15831,14 @@ Released 2019-04-02 (4) https://github.com/pallets/werkzeug/issues/1492  -File: werkzeug.info, Node: Version 0 15 1, Next: Version 0 15 0, Prev: Version 0 15 2, Up: Changelog +File: werkzeug.info, Node: Version 0 15 1, Next: Version 0 15 0, Prev: Version 0 15 2, Up: Changes -5.4.10 Version 0.15.1 +5.5.15 Version 0.15.1 --------------------- Released 2019-03-21 - - *note Unauthorized: 2e4. takes ‘description’ as the first argument, + - *note Unauthorized: 2ac. takes ‘description’ as the first argument, restoring previous behavior. The new ‘www_authenticate’ argument is listed second. (#1483(1)) @@ -12401,21 +15847,21 @@ Released 2019-03-21 (1) https://github.com/pallets/werkzeug/issues/1483  -File: werkzeug.info, Node: Version 0 15 0, Next: Version 0 14 1, Prev: Version 0 15 1, Up: Changelog +File: werkzeug.info, Node: Version 0 15 0, Next: Version 0 14 1, Prev: Version 0 15 1, Up: Changes -5.4.11 Version 0.15.0 +5.5.16 Version 0.15.0 --------------------- Released 2019-03-19 - - Building URLs is ~7x faster. Each *note Rule: 36. compiles an + - Building URLs is ~7x faster. Each *note Rule: 30. compiles an optimized function for building itself. (#1281(1)) - - *note MapAdapter.build(): 179. can be passed a *note MultiDict: b2. + - *note MapAdapter.build(): 15b. can be passed a *note MultiDict: 82. to represent multiple values for a key. It already did this when passing a dict with a list value. (#724(2)) - - ‘path_info’ defaults to ‘'/'’ for *note Map.bind(): 171. (#740(3), + - ‘path_info’ defaults to ‘'/'’ for *note Map.bind(): 153. (#740(3), #768(4), #1316(5)) - Change ‘RequestRedirect’ code from 301 to 308, preserving the verb @@ -12425,9 +15871,9 @@ Released 2019-03-19 values if passed the ‘signed=True’ parameter. For example, ‘/jump/’. (#1355(7)) - - ‘Location’ autocorrection in *note Response.get_wsgi_headers(): f1. - is relative to the current path rather than the root path. - (#693(8), #718(9), #1315(10)) + - ‘Location’ autocorrection in ‘Response.get_wsgi_headers()’ is + relative to the current path rather than the root path. (#693(8), + #718(9), #1315(10)) - 412 responses once again include entity headers and an error message in the body. They were originally omitted when @@ -12439,28 +15885,28 @@ Released 2019-03-19 header would still be present. The new behavior matches RFC 7230. (#1294(14)) - - *note Unauthorized: 2e4. takes a ‘www_authenticate’ parameter to + - *note Unauthorized: 2ac. takes a ‘www_authenticate’ parameter to set the ‘WWW-Authenticate’ header for the response, which is technically required for a valid 401 response. (#772(15), #795(16)) - - Add support for status code 424 *note FailedDependency: 2f2. + - Add support for status code 424 *note FailedDependency: 2ba. (#1358(17)) - - *note http.parse_cookie(): 1d5. ignores empty segments rather than + - *note http.parse_cookie(): 1ad. ignores empty segments rather than producing a cookie with no key or value. (#1245(18), #1301(19)) - - *note parse_authorization_header(): 1c6. (and *note Authorization: - 12f, ‘authorization’) treats the authorization header as UTF-8. On - Python 2, basic auth username and password are ‘unicode’. - (#1325(20)) + - *note parse_authorization_header(): 19f. (and *note Authorization: + 7a, *note authorization: a9.) treats the authorization header as + UTF-8. On Python 2, basic auth username and password are + ‘unicode’. (#1325(20)) - - *note parse_options_header(): 1be. understands RFC 2231(21) + - *note parse_options_header(): 198. understands RFC 2231(21) parameter continuations. (#1417(22)) - - *note uri_to_iri(): 2aa. does not unquote ASCII characters in the + - *note uri_to_iri(): 276. does not unquote ASCII characters in the unreserved class, such as space, and leaves invalid bytes quoted - when decoding. *note iri_to_uri(): 1a4. does not quote reserved + when decoding. *note iri_to_uri(): 184. does not quote reserved characters. See RFC 3987(23) for these character classes. (#1433(24)) @@ -12472,28 +15918,28 @@ Released 2019-03-19 - Clean up ‘werkzeug.security’ module, remove outdated hashlib support. (#1282(26)) - - In *note generate_password_hash(): 28e, PBKDF2 uses 150000 + - In *note generate_password_hash(): 25d, PBKDF2 uses 150000 iterations by default, increased from 50000. (#1377(27)) - - *note ClosingIterator: 18e. calls ‘close’ on the wrapped + - *note ClosingIterator: 16e. calls ‘close’ on the wrapped `iterable', not the internal iterator. This doesn’t affect objects where ‘__iter__’ returned ‘self’. For other objects, the method was not called before. (#1259(28), #1260(29)) - - Bytes may be used as keys in *note Headers: d9, they will be + - Bytes may be used as keys in *note Headers: 70, they will be decoded as Latin-1 like values are. (#1346(30)) - - *note Range: 146. validates that list of range tuples passed to it + - *note Range: e8. validates that list of range tuples passed to it would produce a valid ‘Range’ header. (#1412(31)) - - *note FileStorage: b3. looks up attributes on ‘stream._file’ if + - *note FileStorage: b9. looks up attributes on ‘stream._file’ if they don’t exist on ‘stream’, working around an issue where tempfile.SpooledTemporaryFile()(32) didn’t implement all of io.IOBase(33). See ‘https://github.com/python/cpython/pull/3249’. (#1409(34)) - - *note CombinedMultiDict.copy(): d5. returns a shallow mutable copy - as a *note MultiDict: b2. The copy no longer reflects changes to + - *note CombinedMultiDict.copy(): f7. returns a shallow mutable copy + as a *note MultiDict: 82. The copy no longer reflects changes to the combined dicts, but is more generally useful. (#1420(35)) - The version of jQuery used by the debugger is updated to 3.3.1. @@ -12521,12 +15967,12 @@ Released 2019-03-19 when the current UID doesn’t have an associated username, which can happen in Docker. (#1471(42)) - - *note BadRequestKeyError: 304. adds the ‘KeyError’ message to the + - *note BadRequestKeyError: 2ca. adds the ‘KeyError’ message to the description, making it clearer what caused the 400 error. Frameworks like Flask can omit this information in production by setting ‘e.args = ()’. (#1395(43)) - - If a nested ‘ImportError’ occurs from *note import_string(): 280. + - If a nested ‘ImportError’ occurs from *note import_string(): 250. the traceback mentions the nested import. Removes an untested code path for handling “modules not yet set up by the parent.” (#735(44)) @@ -12549,7 +15995,7 @@ Released 2019-03-19 - Server uses ‘IPPROTO_TCP’ constant instead of ‘SOL_TCP’ for Jython compatibility. (#1375(50)) - - When using an adhoc SSL cert with *note run_simple(): 4c, the cert + - When using an adhoc SSL cert with *note run_simple(): 46, the cert is shown as self-signed rather than signed by an invalid authority. (#1430(51)) @@ -12566,7 +16012,7 @@ Released 2019-03-19 servers add them. Middleware could replace ‘PATH_INFO’ with this to route based on the raw value. (#1419(54)) - - *note EnvironBuilder: 63. doesn’t set ‘CONTENT_TYPE’ or + - *note EnvironBuilder: 61. doesn’t set ‘CONTENT_TYPE’ or ‘CONTENT_LENGTH’ in the environ if they aren’t set. Previously these used default values if they weren’t set. Now it’s possible to distinguish between empty and unset values. (#1308(55)) @@ -12574,12 +16020,12 @@ Released 2019-03-19 - The test client raises a ‘ValueError’ if a query string argument would overwrite a query string in the path. (#1338(56)) - - *note test.EnvironBuilder: 63. and *note test.Client: 83. take a + - *note test.EnvironBuilder: 61. and *note test.Client: 5c. take a ‘json’ argument instead of manually passing ‘data’ and ‘content_type’. This is serialized using the *note - test.EnvironBuilder.json_dumps(): 6d. method. (#1404(57)) + test.EnvironBuilder.json_dumps(): 79. method. (#1404(57)) - - *note test.Client: 83. redirect handling is rewritten. (#1402(58)) + - *note test.Client: 5c. redirect handling is rewritten. (#1402(58)) - The redirect environ is copied from the initial request environ. @@ -12595,7 +16041,7 @@ Released 2019-03-19 - Headers are passed to the new request for all codes, following what browsers do. - - *note test.EnvironBuilder: 63. sets the content type and + - *note test.EnvironBuilder: 61. sets the content type and length headers in addition to the WSGI keys when detecting them from the data. @@ -12604,8 +16050,8 @@ Released 2019-03-19 code safely. Only the last response is not buffered. (#988(59)) - - *note EnvironBuilder: 63, *note FileStorage: b3, and *note - wsgi.get_input_stream(): 1a2. no longer share a global + - *note EnvironBuilder: 61, *note FileStorage: b9, and *note + wsgi.get_input_stream(): 182. no longer share a global ‘_empty_stream’ instance. This improves test isolation by preventing cases where closing the stream in one request would affect other usages. (#1340(60)) @@ -12619,9 +16065,8 @@ Released 2019-03-19 0.9. Both are deprecated and will be removed in version 1.0. (#1141(64)) - - *note werkzeug.wrappers.json.JSONMixin: 157. has been replaced with - Flask’s implementation. Check the docs for the full API. - (#1445(65)) + - ‘werkzeug.wrappers.json.JSONMixin’ has been replaced with Flask’s + implementation. Check the docs for the full API. (#1445(65)) - The contrib modules are deprecated and will either be moved into ‘werkzeug’ core or removed completely in version 1.0. Some modules @@ -12631,13 +16076,13 @@ Released 2019-03-19 using. (#4(66)) - ‘LintMiddleware’ has moved to *note werkzeug.middleware.lint: - a. + 9. - ‘ProfilerMiddleware’ has moved to *note - werkzeug.middleware.profiler: b. + werkzeug.middleware.profiler: a. - ‘ProxyFix’ has moved to *note werkzeug.middleware.proxy_fix: - c. + b. - ‘JSONRequestMixin’ has moved to ‘werkzeug.wrappers.json’. @@ -12668,10 +16113,10 @@ Released 2019-03-19 - ‘iterio’ is deprecated. - - *note wsgi.get_host(): 19e. no longer looks at ‘X-Forwarded-For’. - Use *note ProxyFix: 2ce. to handle that. (#609(69), #1303(70)) + - *note wsgi.get_host(): 17e. no longer looks at ‘X-Forwarded-For’. + Use *note ProxyFix: 297. to handle that. (#609(69), #1303(70)) - - *note ProxyFix: 2ce. is refactored to support more headers, + - *note ProxyFix: 297. is refactored to support more headers, multiple values, and more secure configuration. - Each header supports multiple values. The trusted number of @@ -12698,17 +16143,17 @@ Released 2019-03-19 and will be removed in version 1.0. (#1452(76)) - ‘werkzeug.wsgi.DispatcherMiddleware’ has moved to *note - werkzeug.middleware.dispatcher.DispatcherMiddleware: 2d5. + werkzeug.middleware.dispatcher.DispatcherMiddleware: 29e. - ‘werkzeug.wsgi.ProxyMiddleware’ as moved to *note - werkzeug.middleware.http_proxy.ProxyMiddleware: 2d8. + werkzeug.middleware.http_proxy.ProxyMiddleware: 2a1. - ‘werkzeug.wsgi.SharedDataMiddleware’ has moved to *note - werkzeug.middleware.shared_data.SharedDataMiddleware: 2d1. + werkzeug.middleware.shared_data.SharedDataMiddleware: 29a. - - *note ProxyMiddleware: 2d8. proxies the query string. (#1252(77)) + - *note ProxyMiddleware: 2a1. proxies the query string. (#1252(77)) - - The filenames generated by *note ProfilerMiddleware: 2de. can be + - The filenames generated by *note ProfilerMiddleware: 2a7. can be customized. (#1283(78)) - The ‘werkzeug.wrappers’ module has been converted to a package, and @@ -12879,9 +16324,9 @@ https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile (79) https://github.com/pallets/werkzeug/pull/1456  -File: werkzeug.info, Node: Version 0 14 1, Next: Version 0 14, Prev: Version 0 15 0, Up: Changelog +File: werkzeug.info, Node: Version 0 14 1, Next: Version 0 14, Prev: Version 0 15 0, Up: Changes -5.4.12 Version 0.14.1 +5.5.17 Version 0.14.1 --------------------- Released on December 31st 2017 @@ -12890,9 +16335,9 @@ Released on December 31st 2017 development server.  -File: werkzeug.info, Node: Version 0 14, Next: Version 0 13, Prev: Version 0 14 1, Up: Changelog +File: werkzeug.info, Node: Version 0 14, Next: Version 0 13, Prev: Version 0 14 1, Up: Changes -5.4.13 Version 0.14 +5.5.18 Version 0.14 ------------------- Released on December 31st 2017 @@ -12958,9 +16403,9 @@ Released on December 31st 2017 are passed to it.  -File: werkzeug.info, Node: Version 0 13, Next: Version 0 12 2, Prev: Version 0 14, Up: Changelog +File: werkzeug.info, Node: Version 0 13, Next: Version 0 12 2, Prev: Version 0 14, Up: Changes -5.4.14 Version 0.13 +5.5.19 Version 0.13 ------------------- Released on December 7th 2017 @@ -13042,9 +16487,9 @@ Released on December 7th 2017 (15) https://github.com/pallets/werkzeug/pull/1198  -File: werkzeug.info, Node: Version 0 12 2, Next: Version 0 12 1, Prev: Version 0 13, Up: Changelog +File: werkzeug.info, Node: Version 0 12 2, Next: Version 0 12 1, Prev: Version 0 13, Up: Changes -5.4.15 Version 0.12.2 +5.5.20 Version 0.12.2 --------------------- Released on May 16 2017 @@ -13056,9 +16501,9 @@ Released on May 16 2017 - Fix a bug in ‘safe_join’ on Windows.  -File: werkzeug.info, Node: Version 0 12 1, Next: Version 0 12, Prev: Version 0 12 2, Up: Changelog +File: werkzeug.info, Node: Version 0 12 1, Next: Version 0 12, Prev: Version 0 12 2, Up: Changes -5.4.16 Version 0.12.1 +5.5.21 Version 0.12.1 --------------------- Released on March 15th 2017 @@ -13070,9 +16515,9 @@ Released on March 15th 2017 ‘#1084’.  -File: werkzeug.info, Node: Version 0 12, Next: Version 0 11 16, Prev: Version 0 12 1, Up: Changelog +File: werkzeug.info, Node: Version 0 12, Next: Version 0 11 16, Prev: Version 0 12 1, Up: Changes -5.4.17 Version 0.12 +5.5.22 Version 0.12 ------------------- Released on March 10th 2017 @@ -13152,9 +16597,9 @@ Released on March 10th 2017 (for example in ‘requests.accept_mimetypes.best_match’)  -File: werkzeug.info, Node: Version 0 11 16, Next: Version 0 11 15, Prev: Version 0 12, Up: Changelog +File: werkzeug.info, Node: Version 0 11 16, Next: Version 0 11 15, Prev: Version 0 12, Up: Changes -5.4.18 Version 0.11.16 +5.5.23 Version 0.11.16 ---------------------- - werkzeug.serving: set CONTENT_TYPE / CONTENT_LENGTH if only they’re @@ -13164,9 +16609,9 @@ File: werkzeug.info, Node: Version 0 11 16, Next: Version 0 11 15, Prev: Vers werkzeug.serving’.  -File: werkzeug.info, Node: Version 0 11 15, Next: Version 0 11 14, Prev: Version 0 11 16, Up: Changelog +File: werkzeug.info, Node: Version 0 11 15, Next: Version 0 11 14, Prev: Version 0 11 16, Up: Changes -5.4.19 Version 0.11.15 +5.5.24 Version 0.11.15 ---------------------- Released on December 30th 2016. @@ -13174,9 +16619,9 @@ Released on December 30th 2016. - Bugfix for the bugfix in the previous release.  -File: werkzeug.info, Node: Version 0 11 14, Next: Version 0 11 13, Prev: Version 0 11 15, Up: Changelog +File: werkzeug.info, Node: Version 0 11 14, Next: Version 0 11 13, Prev: Version 0 11 15, Up: Changes -5.4.20 Version 0.11.14 +5.5.25 Version 0.11.14 ---------------------- Released on December 30th 2016. @@ -13186,9 +16631,9 @@ Released on December 30th 2016. PR ‘#999’.  -File: werkzeug.info, Node: Version 0 11 13, Next: Version 0 11 12, Prev: Version 0 11 14, Up: Changelog +File: werkzeug.info, Node: Version 0 11 13, Next: Version 0 11 12, Prev: Version 0 11 14, Up: Changes -5.4.21 Version 0.11.13 +5.5.26 Version 0.11.13 ---------------------- Released on December 26th 2016. @@ -13197,9 +16642,9 @@ Released on December 26th 2016. installations.  -File: werkzeug.info, Node: Version 0 11 12, Next: Version 0 11 11, Prev: Version 0 11 13, Up: Changelog +File: werkzeug.info, Node: Version 0 11 12, Next: Version 0 11 11, Prev: Version 0 11 13, Up: Changes -5.4.22 Version 0.11.12 +5.5.27 Version 0.11.12 ---------------------- Released on December 26th 2016. @@ -13212,9 +16657,9 @@ Released on December 26th 2016. - Added a workaround for the reloader on windows.  -File: werkzeug.info, Node: Version 0 11 11, Next: Version 0 11 10, Prev: Version 0 11 12, Up: Changelog +File: werkzeug.info, Node: Version 0 11 11, Next: Version 0 11 10, Prev: Version 0 11 12, Up: Changes -5.4.23 Version 0.11.11 +5.5.28 Version 0.11.11 ---------------------- Released on August 31st 2016. @@ -13235,9 +16680,9 @@ Released on August 31st 2016. ‘#1001’.  -File: werkzeug.info, Node: Version 0 11 10, Next: Version 0 11 9, Prev: Version 0 11 11, Up: Changelog +File: werkzeug.info, Node: Version 0 11 10, Next: Version 0 11 9, Prev: Version 0 11 11, Up: Changes -5.4.24 Version 0.11.10 +5.5.29 Version 0.11.10 ---------------------- Released on May 24th 2016. @@ -13252,9 +16697,9 @@ Released on May 24th 2016. exhaustion.  -File: werkzeug.info, Node: Version 0 11 9, Next: Version 0 11 8, Prev: Version 0 11 10, Up: Changelog +File: werkzeug.info, Node: Version 0 11 9, Next: Version 0 11 8, Prev: Version 0 11 10, Up: Changes -5.4.25 Version 0.11.9 +5.5.30 Version 0.11.9 --------------------- Released on April 24th 2016. @@ -13268,9 +16713,9 @@ Released on April 24th 2016. Without this fix the pin was remembered for too long.  -File: werkzeug.info, Node: Version 0 11 8, Next: Version 0 11 7, Prev: Version 0 11 9, Up: Changelog +File: werkzeug.info, Node: Version 0 11 8, Next: Version 0 11 7, Prev: Version 0 11 9, Up: Changes -5.4.26 Version 0.11.8 +5.5.31 Version 0.11.8 --------------------- Released on April 15th 2016. @@ -13279,9 +16724,9 @@ Released on April 15th 2016. Python 3.  -File: werkzeug.info, Node: Version 0 11 7, Next: Version 0 11 6, Prev: Version 0 11 8, Up: Changelog +File: werkzeug.info, Node: Version 0 11 7, Next: Version 0 11 6, Prev: Version 0 11 8, Up: Changes -5.4.27 Version 0.11.7 +5.5.32 Version 0.11.7 --------------------- Released on April 14th 2016. @@ -13289,9 +16734,9 @@ Released on April 14th 2016. - fixed a regression on Python 3 for the debugger.  -File: werkzeug.info, Node: Version 0 11 6, Next: Version 0 11 5, Prev: Version 0 11 7, Up: Changelog +File: werkzeug.info, Node: Version 0 11 6, Next: Version 0 11 5, Prev: Version 0 11 7, Up: Changes -5.4.28 Version 0.11.6 +5.5.33 Version 0.11.6 --------------------- Released on April 14th 2016. @@ -13311,9 +16756,9 @@ Released on April 14th 2016. slash.  -File: werkzeug.info, Node: Version 0 11 5, Next: Version 0 11 4, Prev: Version 0 11 6, Up: Changelog +File: werkzeug.info, Node: Version 0 11 5, Next: Version 0 11 4, Prev: Version 0 11 6, Up: Changes -5.4.29 Version 0.11.5 +5.5.34 Version 0.11.5 --------------------- Released on March 22nd 2016. @@ -13322,9 +16767,9 @@ Released on March 22nd 2016. server.  -File: werkzeug.info, Node: Version 0 11 4, Next: Version 0 11 3, Prev: Version 0 11 5, Up: Changelog +File: werkzeug.info, Node: Version 0 11 4, Next: Version 0 11 3, Prev: Version 0 11 5, Up: Changes -5.4.30 Version 0.11.4 +5.5.35 Version 0.11.4 --------------------- Released on February 14th 2016. @@ -13334,9 +16779,9 @@ Released on February 14th 2016. - Fixed incorrect weak etag handling.  -File: werkzeug.info, Node: Version 0 11 3, Next: Version 0 11 2, Prev: Version 0 11 4, Up: Changelog +File: werkzeug.info, Node: Version 0 11 3, Next: Version 0 11 2, Prev: Version 0 11 4, Up: Changes -5.4.31 Version 0.11.3 +5.5.36 Version 0.11.3 --------------------- Released on December 20th 2015. @@ -13350,9 +16795,9 @@ Released on December 20th 2015. 0.11.2 but for a different code path.  -File: werkzeug.info, Node: Version 0 11 2, Next: Version 0 11 1, Prev: Version 0 11 3, Up: Changelog +File: werkzeug.info, Node: Version 0 11 2, Next: Version 0 11 1, Prev: Version 0 11 3, Up: Changes -5.4.32 Version 0.11.2 +5.5.37 Version 0.11.2 --------------------- Released on November 12th 2015. @@ -13370,9 +16815,9 @@ Released on November 12th 2015. request errors.  -File: werkzeug.info, Node: Version 0 11 1, Next: Version 0 11, Prev: Version 0 11 2, Up: Changelog +File: werkzeug.info, Node: Version 0 11 1, Next: Version 0 11, Prev: Version 0 11 2, Up: Changes -5.4.33 Version 0.11.1 +5.5.38 Version 0.11.1 --------------------- Released on November 10th 2015. @@ -13380,9 +16825,9 @@ Released on November 10th 2015. - Fixed a regression on Python 3 in the debugger.  -File: werkzeug.info, Node: Version 0 11, Next: Version 0 10 5, Prev: Version 0 11 1, Up: Changelog +File: werkzeug.info, Node: Version 0 11, Next: Version 0 10 5, Prev: Version 0 11 1, Up: Changes -5.4.34 Version 0.11 +5.5.39 Version 0.11 ------------------- Released on November 8th 2015, codename Gleisbaumaschine. @@ -13434,9 +16879,9 @@ Released on November 8th 2015, codename Gleisbaumaschine. - Devserver no longer requires SSL module to be installed.  -File: werkzeug.info, Node: Version 0 10 5, Next: Version 0 10 4, Prev: Version 0 11, Up: Changelog +File: werkzeug.info, Node: Version 0 10 5, Next: Version 0 10 4, Prev: Version 0 11, Up: Changes -5.4.35 Version 0.10.5 +5.5.40 Version 0.10.5 --------------------- (bugfix release, release date yet to be decided) @@ -13449,9 +16894,9 @@ File: werkzeug.info, Node: Version 0 10 5, Next: Version 0 10 4, Prev: Versio (issue ‘#744’).  -File: werkzeug.info, Node: Version 0 10 4, Next: Version 0 10 3, Prev: Version 0 10 5, Up: Changelog +File: werkzeug.info, Node: Version 0 10 4, Next: Version 0 10 3, Prev: Version 0 10 5, Up: Changes -5.4.36 Version 0.10.4 +5.5.41 Version 0.10.4 --------------------- (bugfix release, released on March 26th 2015) @@ -13459,9 +16904,9 @@ File: werkzeug.info, Node: Version 0 10 4, Next: Version 0 10 3, Prev: Versio - Re-release of 0.10.3 with packaging artifacts manually removed.  -File: werkzeug.info, Node: Version 0 10 3, Next: Version 0 10 2, Prev: Version 0 10 4, Up: Changelog +File: werkzeug.info, Node: Version 0 10 3, Next: Version 0 10 2, Prev: Version 0 10 4, Up: Changes -5.4.37 Version 0.10.3 +5.5.42 Version 0.10.3 --------------------- (bugfix release, released on March 26th 2015) @@ -13469,9 +16914,9 @@ File: werkzeug.info, Node: Version 0 10 3, Next: Version 0 10 2, Prev: Versio - Re-release of 0.10.2 without packaging artifacts.  -File: werkzeug.info, Node: Version 0 10 2, Next: Version 0 10 1, Prev: Version 0 10 3, Up: Changelog +File: werkzeug.info, Node: Version 0 10 2, Next: Version 0 10 1, Prev: Version 0 10 3, Up: Changes -5.4.38 Version 0.10.2 +5.5.43 Version 0.10.2 --------------------- (bugfix release, released on March 26th 2015) @@ -13492,9 +16937,9 @@ File: werkzeug.info, Node: Version 0 10 2, Next: Version 0 10 1, Prev: Versio - Fix performance problems with stat-reloader (pull request ‘#715’).  -File: werkzeug.info, Node: Version 0 10 1, Next: Version 0 10, Prev: Version 0 10 2, Up: Changelog +File: werkzeug.info, Node: Version 0 10 1, Next: Version 0 10, Prev: Version 0 10 2, Up: Changes -5.4.39 Version 0.10.1 +5.5.44 Version 0.10.1 --------------------- (bugfix release, released on February 3rd 2015) @@ -13506,9 +16951,9 @@ File: werkzeug.info, Node: Version 0 10 1, Next: Version 0 10, Prev: Version (pull request ‘#663’).  -File: werkzeug.info, Node: Version 0 10, Next: Version 0 9 7, Prev: Version 0 10 1, Up: Changelog +File: werkzeug.info, Node: Version 0 10, Next: Version 0 9 7, Prev: Version 0 10 1, Up: Changes -5.4.40 Version 0.10 +5.5.45 Version 0.10 ------------------- Released on January 30th 2015, codename Bagger. @@ -13519,7 +16964,7 @@ Released on January 30th 2015, codename Bagger. - Fixed a bug on Python 3 when creating adhoc ssl contexts, due to ‘sys.maxint’ not being defined. - - Fixed a bug on Python 3, that caused *note make_ssl_devcert(): 4f. + - Fixed a bug on Python 3, that caused *note make_ssl_devcert(): 48. to fail with an exception. - Added exceptions for 504 and 505. @@ -13531,7 +16976,7 @@ Released on January 30th 2015, codename Bagger. - Added message that explains how to quit the server. - Fixed a bug on Python 2, that caused ‘len’ for *note - werkzeug.datastructures.CombinedMultiDict: d5. to crash. + werkzeug.datastructures.CombinedMultiDict: f7. to crash. - Added support for stdlib pbkdf2 hmac if a compatible digest is found. @@ -13579,7 +17024,7 @@ Released on January 30th 2015, codename Bagger. bits (issue ‘#611’). - Added support for specifying a ‘Response’ subclass to use when - calling *note redirect(): 27e. + calling *note redirect(): 24e. - ‘werkzeug.test.EnvironBuilder’ now doesn’t use the request method anymore to guess the content type, and purely relies on the ‘form’, @@ -13604,9 +17049,9 @@ Released on January 30th 2015, codename Bagger. ‘#658’).  -File: werkzeug.info, Node: Version 0 9 7, Next: Version 0 9 6, Prev: Version 0 10, Up: Changelog +File: werkzeug.info, Node: Version 0 9 7, Next: Version 0 9 6, Prev: Version 0 10, Up: Changes -5.4.41 Version 0.9.7 +5.5.46 Version 0.9.7 -------------------- (bugfix release, release date to be decided) @@ -13658,9 +17103,9 @@ File: werkzeug.info, Node: Version 0 9 7, Next: Version 0 9 6, Prev: Version cache (pull request ‘#651’).  -File: werkzeug.info, Node: Version 0 9 6, Next: Version 0 9 7<2>, Prev: Version 0 9 7, Up: Changelog +File: werkzeug.info, Node: Version 0 9 6, Next: Version 0 9 7<2>, Prev: Version 0 9 7, Up: Changes -5.4.42 Version 0.9.6 +5.5.47 Version 0.9.6 -------------------- (bugfix release, released on June 7th 2014) @@ -13670,18 +17115,18 @@ File: werkzeug.info, Node: Version 0 9 6, Next: Version 0 9 7<2>, Prev: Versi such as ‘itms-service’.  -File: werkzeug.info, Node: Version 0 9 7<2>, Next: Version 0 9 5, Prev: Version 0 9 6, Up: Changelog +File: werkzeug.info, Node: Version 0 9 7<2>, Next: Version 0 9 5, Prev: Version 0 9 6, Up: Changes -5.4.43 Version 0.9.7 +5.5.48 Version 0.9.7 -------------------- - Fixed uri_to_iri() not re-encoding hashes in query string parameters.  -File: werkzeug.info, Node: Version 0 9 5, Next: Version 0 9 4, Prev: Version 0 9 7<2>, Up: Changelog +File: werkzeug.info, Node: Version 0 9 5, Next: Version 0 9 4, Prev: Version 0 9 7<2>, Up: Changes -5.4.44 Version 0.9.5 +5.5.49 Version 0.9.5 -------------------- (bugfix release, released on June 7th 2014) @@ -13709,9 +17154,9 @@ File: werkzeug.info, Node: Version 0 9 5, Next: Version 0 9 4, Prev: Version 2.7.7 and Python 3.4.  -File: werkzeug.info, Node: Version 0 9 4, Next: Version 0 9 3, Prev: Version 0 9 5, Up: Changelog +File: werkzeug.info, Node: Version 0 9 4, Next: Version 0 9 3, Prev: Version 0 9 5, Up: Changes -5.4.45 Version 0.9.4 +5.5.50 Version 0.9.4 -------------------- (bugfix release, released on August 26th 2013) @@ -13724,9 +17169,9 @@ File: werkzeug.info, Node: Version 0 9 4, Next: Version 0 9 3, Prev: Version - Fixed URI to IRI conversion incorrectly decoding percent signs.  -File: werkzeug.info, Node: Version 0 9 3, Next: Version 0 9 2, Prev: Version 0 9 4, Up: Changelog +File: werkzeug.info, Node: Version 0 9 3, Next: Version 0 9 2, Prev: Version 0 9 4, Up: Changes -5.4.46 Version 0.9.3 +5.5.51 Version 0.9.3 -------------------- (bugfix release, released on July 25th 2013) @@ -13742,16 +17187,16 @@ File: werkzeug.info, Node: Version 0 9 3, Next: Version 0 9 2, Prev: Version custom form data more consistent.  -File: werkzeug.info, Node: Version 0 9 2, Next: Version 0 9 1, Prev: Version 0 9 3, Up: Changelog +File: werkzeug.info, Node: Version 0 9 2, Next: Version 0 9 1, Prev: Version 0 9 3, Up: Changes -5.4.47 Version 0.9.2 +5.5.52 Version 0.9.2 -------------------- (bugfix release, released on July 18th 2013) - - Added ‘unsafe’ parameter to *note url_quote(): 2b8. + - Added ‘unsafe’ parameter to *note url_quote(): 282. - - Fixed an issue with *note url_quote_plus(): 2b9. not quoting ‘‘+’’ + - Fixed an issue with *note url_quote_plus(): 283. not quoting ‘‘+’’ correctly. - Ported remaining parts of ‘RedisCache’ to Python 3.3. @@ -13766,16 +17211,15 @@ File: werkzeug.info, Node: Version 0 9 2, Next: Version 0 9 1, Prev: Version - Use correct name for stdlib secure string comparison function. - Fixed a wrong reference in the docstring of *note release_local(): - 2be. + 288. - Fixed an ‘AttributeError’ that sometimes occurred when accessing - the *note werkzeug.wrappers.BaseResponse.is_streamed: f4. - attribute. + the ‘werkzeug.wrappers.BaseResponse.is_streamed’ attribute.  -File: werkzeug.info, Node: Version 0 9 1, Next: Version 0 9, Prev: Version 0 9 2, Up: Changelog +File: werkzeug.info, Node: Version 0 9 1, Next: Version 0 9, Prev: Version 0 9 2, Up: Changes -5.4.48 Version 0.9.1 +5.5.53 Version 0.9.1 -------------------- (bugfix release, released on June 14th 2013) @@ -13802,17 +17246,17 @@ File: werkzeug.info, Node: Version 0 9 1, Next: Version 0 9, Prev: Version 0 - Raised the buffer sizes for the multipart parser.  -File: werkzeug.info, Node: Version 0 9, Next: Version 0 8 4, Prev: Version 0 9 1, Up: Changelog +File: werkzeug.info, Node: Version 0 9, Next: Version 0 8 4, Prev: Version 0 9 1, Up: Changes -5.4.49 Version 0.9 +5.5.54 Version 0.9 ------------------ Released on June 13nd 2013, codename Planierraupe. - - Added support for *note tell(): 19b. on the limited stream. + - Added support for *note tell(): 17b. on the limited stream. - - *note ETags: 13f. now is nonzero if it contains at least one etag - of any kind, including weak ones. + - *note ETags: c8. now is nonzero if it contains at least one etag of + any kind, including weak ones. - Added a workaround for a bug in the stdlib for SSL servers. @@ -13822,22 +17266,22 @@ Released on June 13nd 2013, codename Planierraupe. - Refactored test client to invoke the open method on the class for redirects. This makes subclassing more powerful. - - *note werkzeug.wsgi.make_chunk_iter(): 19c. and *note - werkzeug.wsgi.make_line_iter(): 195. now support processing of + - *note werkzeug.wsgi.make_chunk_iter(): 17c. and *note + werkzeug.wsgi.make_line_iter(): 175. now support processing of iterators and streams. - URL generation by the routing system now no longer quotes ‘+’. - URL fixing now no longer quotes certain reserved characters. - - The *note werkzeug.security.generate_password_hash(): 28e. and + - The *note werkzeug.security.generate_password_hash(): 25d. and check functions now support any of the hashlib algorithms. - ‘wsgi.get_current_url’ is now ascii safe for browsers sending non-ascii data in query strings. - improved parsing behavior for *note - werkzeug.http.parse_options_header(): 1be. + werkzeug.http.parse_options_header(): 198. - added more operators to local proxies. @@ -13855,7 +17299,7 @@ Released on June 13nd 2013, codename Planierraupe. - Added support for fragment handling in URI/IRI functions. - Added custom class support for *note - werkzeug.http.parse_dict_header(): 1bf. + werkzeug.http.parse_dict_header(): 199. - Renamed ‘LighttpdCGIRootFix’ to ‘CGIRootFix’. @@ -13920,8 +17364,8 @@ Released on June 13nd 2013, codename Planierraupe. means that the stream property on the request class is always available instead of just when the parsing fails. - - Added support for using *note werkzeug.wrappers.BaseResponse: d7. - in a with statement. + - Added support for using ‘werkzeug.wrappers.BaseResponse’ in a with + statement. - Changed ‘get_app_iter’ to fetch the response early so that it does not fail when wrapping a response iterable. This makes filtering @@ -13941,9 +17385,9 @@ Released on June 13nd 2013, codename Planierraupe. private pastes.  -File: werkzeug.info, Node: Version 0 8 4, Next: Version 0 8 3, Prev: Version 0 9, Up: Changelog +File: werkzeug.info, Node: Version 0 8 4, Next: Version 0 8 3, Prev: Version 0 9, Up: Changes -5.4.50 Version 0.8.4 +5.5.55 Version 0.8.4 -------------------- (bugfix release, release date to be announced) @@ -13971,14 +17415,14 @@ File: werkzeug.info, Node: Version 0 8 4, Next: Version 0 8 3, Prev: Version not be picked up properly.  -File: werkzeug.info, Node: Version 0 8 3, Next: Version 0 8 2, Prev: Version 0 8 4, Up: Changelog +File: werkzeug.info, Node: Version 0 8 3, Next: Version 0 8 2, Prev: Version 0 8 4, Up: Changes -5.4.51 Version 0.8.3 +5.5.56 Version 0.8.3 -------------------- (bugfix release, released on February 5th 2012) - - Fixed another issue with *note werkzeug.wsgi.make_line_iter(): 195. + - Fixed another issue with *note werkzeug.wsgi.make_line_iter(): 175. where lines longer than the buffer size were not handled properly. - Restore stdout after debug console finished executing so that the @@ -13993,9 +17437,9 @@ File: werkzeug.info, Node: Version 0 8 3, Next: Version 0 8 2, Prev: Version - Redis cache backend now supports password authentication.  -File: werkzeug.info, Node: Version 0 8 2, Next: Version 0 8 1, Prev: Version 0 8 3, Up: Changelog +File: werkzeug.info, Node: Version 0 8 2, Next: Version 0 8 1, Prev: Version 0 8 3, Up: Changes -5.4.52 Version 0.8.2 +5.5.57 Version 0.8.2 -------------------- (bugfix release, released on December 16th 2011) @@ -14019,9 +17463,9 @@ File: werkzeug.info, Node: Version 0 8 2, Next: Version 0 8 1, Prev: Version uploads.  -File: werkzeug.info, Node: Version 0 8 1, Next: Version 0 8, Prev: Version 0 8 2, Up: Changelog +File: werkzeug.info, Node: Version 0 8 1, Next: Version 0 8, Prev: Version 0 8 2, Up: Changes -5.4.53 Version 0.8.1 +5.5.58 Version 0.8.1 -------------------- (bugfix release, released on September 30th 2011) @@ -14039,15 +17483,15 @@ File: werkzeug.info, Node: Version 0 8 1, Next: Version 0 8, Prev: Version 0 (1) https://docs.python.org/3/library/copy.html#copy.copy  -File: werkzeug.info, Node: Version 0 8, Next: Version 0 7 2, Prev: Version 0 8 1, Up: Changelog +File: werkzeug.info, Node: Version 0 8, Next: Version 0 7 2, Prev: Version 0 8 1, Up: Changes -5.4.54 Version 0.8 +5.5.59 Version 0.8 ------------------ Released on September 29th 2011, codename Lötkolben - Removed data structure specific KeyErrors for a general purpose - *note BadRequestKeyError: 304. + *note BadRequestKeyError: 2ca. - Documented ‘werkzeug.wrappers.BaseRequest._load_form_data()’. @@ -14056,8 +17500,7 @@ Released on September 29th 2011, codename Lötkolben through for redirects. - Werkzeug now automatically sets the content length immediately when - the *note data: e7. attribute is set for efficiency and simplicity - reasons. + the ‘data’ attribute is set for efficiency and simplicity reasons. - The routing system will now normalize server names to lowercase. @@ -14081,7 +17524,7 @@ Released on September 29th 2011, codename Lötkolben data is complete and will raise IO errors by itself if the server fails to do so. - - *note make_line_iter(): 195. now requires a limit that is not + - *note make_line_iter(): 175. now requires a limit that is not higher than the length the stream can provide. - Refactored form parsing into a form parser class that makes it @@ -14112,9 +17555,9 @@ Released on September 29th 2011, codename Lötkolben - Removed support for Python 2.4  -File: werkzeug.info, Node: Version 0 7 2, Next: Version 0 7 1, Prev: Version 0 8, Up: Changelog +File: werkzeug.info, Node: Version 0 7 2, Next: Version 0 7 1, Prev: Version 0 8, Up: Changes -5.4.55 Version 0.7.2 +5.5.60 Version 0.7.2 -------------------- (bugfix release, released on September 30th 2011) @@ -14127,9 +17570,9 @@ File: werkzeug.info, Node: Version 0 7 2, Next: Version 0 7 1, Prev: Version properly decoded from it for redirects.  -File: werkzeug.info, Node: Version 0 7 1, Next: Version 0 7, Prev: Version 0 7 2, Up: Changelog +File: werkzeug.info, Node: Version 0 7 1, Next: Version 0 7, Prev: Version 0 7 2, Up: Changes -5.4.56 Version 0.7.1 +5.5.61 Version 0.7.1 -------------------- (bugfix release, released on July 26th 2011) @@ -14139,9 +17582,9 @@ File: werkzeug.info, Node: Version 0 7 1, Next: Version 0 7, Prev: Version 0 - Disabled pyinotify based reloader which does not work reliably.  -File: werkzeug.info, Node: Version 0 7, Next: Version 0 6 2, Prev: Version 0 7 1, Up: Changelog +File: werkzeug.info, Node: Version 0 7, Next: Version 0 6 2, Prev: Version 0 7 1, Up: Changes -5.4.57 Version 0.7 +5.5.62 Version 0.7 ------------------ Released on July 24th 2011, codename Schraubschlüssel @@ -14264,31 +17707,31 @@ Released on July 24th 2011, codename Schraubschlüssel - Headers are now assumed to be latin1 for better compatibility with Python 3 once we have support. - - Added *note werkzeug.security.safe_join(): 291. + - Added *note werkzeug.security.safe_join(): 25f. - Added ‘accept_json’ property analogous to ‘accept_html’ on the - *note werkzeug.datastructures.MIMEAccept: 12c. + *note werkzeug.datastructures.MIMEAccept: a1. - - *note werkzeug.utils.import_string(): 280. now fails with much + - *note werkzeug.utils.import_string(): 250. now fails with much better error messages that pinpoint to the problem. - Added support for parsing of the ‘If-Range’ header (*note - werkzeug.http.parse_if_range_header(): 1c9. and *note - werkzeug.datastructures.IfRange: 143.). + werkzeug.http.parse_if_range_header(): 1a1. and *note + werkzeug.datastructures.IfRange: cc.). - Added support for parsing of the ‘Range’ header (*note - werkzeug.http.parse_range_header(): 1ca. and *note - werkzeug.datastructures.Range: 146.). + werkzeug.http.parse_range_header(): 1a2. and *note + werkzeug.datastructures.Range: e8.). - Added support for parsing of the ‘Content-Range’ header of responses and provided an accessor object for it (*note - werkzeug.http.parse_content_range_header(): 1cb. and *note - werkzeug.datastructures.ContentRange: 14c.). + werkzeug.http.parse_content_range_header(): 1a3. and *note + werkzeug.datastructures.ContentRange: 113.).  -File: werkzeug.info, Node: Version 0 6 2, Next: Version 0 6 1, Prev: Version 0 7, Up: Changelog +File: werkzeug.info, Node: Version 0 6 2, Next: Version 0 6 1, Prev: Version 0 7, Up: Changes -5.4.58 Version 0.6.2 +5.5.63 Version 0.6.2 -------------------- (bugfix release, released on April 23th 2010) @@ -14297,9 +17740,9 @@ File: werkzeug.info, Node: Version 0 6 2, Next: Version 0 6 1, Prev: Version the request object to ‘implicit_sequence_conversion’.  -File: werkzeug.info, Node: Version 0 6 1, Next: Version 0 6, Prev: Version 0 6 2, Up: Changelog +File: werkzeug.info, Node: Version 0 6 1, Next: Version 0 6, Prev: Version 0 6 2, Up: Changes -5.4.59 Version 0.6.1 +5.5.64 Version 0.6.1 -------------------- (bugfix release, released on April 13th 2010) @@ -14335,9 +17778,9 @@ File: werkzeug.info, Node: Version 0 6 1, Next: Version 0 6, Prev: Version 0 - the script support can start SSL servers now.  -File: werkzeug.info, Node: Version 0 6, Next: Version 0 5 1, Prev: Version 0 6 1, Up: Changelog +File: werkzeug.info, Node: Version 0 6, Next: Version 0 5 1, Prev: Version 0 6 1, Up: Changes -5.4.60 Version 0.6 +5.5.65 Version 0.6 ------------------ Released on Feb 19th 2010, codename Hammer. @@ -14355,7 +17798,7 @@ Released on Feb 19th 2010, codename Hammer. - ‘MapAdapter.match()’ now accepts a ‘return_rule’ keyword argument that returns the matched ‘Rule’ instead of just the ‘endpoint’ - - *note routing.Map.bind_to_environ(): 172. raises a more correct + - *note routing.Map.bind_to_environ(): 154. raises a more correct error message now if the map was bound to an invalid WSGI environment. @@ -14433,11 +17876,11 @@ Released on Feb 19th 2010, codename Hammer. name. - better ‘__repr__’ and ‘__str__’ of *note - werkzeug.exceptions.HTTPException: 38. + werkzeug.exceptions.HTTPException: 32. - test client works correctly with multiple cookies now. - - the *note werkzeug.routing.Map: 35. now has a class attribute with + - the *note werkzeug.routing.Map: 2f. now has a class attribute with the default converter mapping. This helps subclasses to override the converters without passing them to the constructor. @@ -14461,9 +17904,9 @@ Released on Feb 19th 2010, codename Hammer. - profiler now writes to the correct stream.  -File: werkzeug.info, Node: Version 0 5 1, Next: Version 0 5, Prev: Version 0 6, Up: Changelog +File: werkzeug.info, Node: Version 0 5 1, Next: Version 0 5, Prev: Version 0 6, Up: Changes -5.4.61 Version 0.5.1 +5.5.66 Version 0.5.1 -------------------- (bugfix release for 0.5, released on July 9th 2009) @@ -14504,9 +17947,9 @@ File: werkzeug.info, Node: Version 0 5 1, Next: Version 0 5, Prev: Version 0 - fixed console of the interactive debugger.  -File: werkzeug.info, Node: Version 0 5, Next: Version 0 4 1, Prev: Version 0 5 1, Up: Changelog +File: werkzeug.info, Node: Version 0 5, Next: Version 0 4 1, Prev: Version 0 5 1, Up: Changes -5.4.62 Version 0.5 +5.5.67 Version 0.5 ------------------ Released on April 24th, codename Schlagbohrer. @@ -14610,9 +18053,9 @@ Released on April 24th, codename Schlagbohrer. (1) https://docs.python.org/3/library/functions.html#open  -File: werkzeug.info, Node: Version 0 4 1, Next: Version 0 4, Prev: Version 0 5, Up: Changelog +File: werkzeug.info, Node: Version 0 4 1, Next: Version 0 4, Prev: Version 0 5, Up: Changes -5.4.63 Version 0.4.1 +5.5.68 Version 0.4.1 -------------------- (Bugfix release, released on January 11th 2009) @@ -14653,9 +18096,9 @@ File: werkzeug.info, Node: Version 0 4 1, Next: Version 0 4, Prev: Version 0 - dropped support for Python 2.3  -File: werkzeug.info, Node: Version 0 4, Next: Version 0 3 1, Prev: Version 0 4 1, Up: Changelog +File: werkzeug.info, Node: Version 0 4, Next: Version 0 3 1, Prev: Version 0 4 1, Up: Changes -5.4.64 Version 0.4 +5.5.69 Version 0.4 ------------------ Released on November 23rd 2008, codename Schraubenzieher. @@ -14704,9 +18147,9 @@ Released on November 23rd 2008, codename Schraubenzieher. properties.  -File: werkzeug.info, Node: Version 0 3 1, Next: Version 0 3, Prev: Version 0 4, Up: Changelog +File: werkzeug.info, Node: Version 0 3 1, Next: Version 0 3, Prev: Version 0 4, Up: Changes -5.4.65 Version 0.3.1 +5.5.70 Version 0.3.1 -------------------- (bugfix release, released on June 24th 2008) @@ -14714,9 +18157,9 @@ File: werkzeug.info, Node: Version 0 3 1, Next: Version 0 3, Prev: Version 0 - fixed a security problem with ‘werkzeug.contrib.SecureCookie’.  -File: werkzeug.info, Node: Version 0 3, Next: Version 0 2, Prev: Version 0 3 1, Up: Changelog +File: werkzeug.info, Node: Version 0 3, Next: Version 0 2, Prev: Version 0 3 1, Up: Changes -5.4.66 Version 0.3 +5.5.71 Version 0.3 ------------------ Released on June 14th 2008, codename EUR325CAT6. @@ -14784,9 +18227,9 @@ Released on June 14th 2008, codename EUR325CAT6. the input stream.  -File: werkzeug.info, Node: Version 0 2, Next: Version 0 1, Prev: Version 0 3, Up: Changelog +File: werkzeug.info, Node: Version 0 2, Next: Version 0 1, Prev: Version 0 3, Up: Changes -5.4.67 Version 0.2 +5.5.72 Version 0.2 ------------------ Released Feb 14th 2008, codename Faustkeil. @@ -14862,9 +18305,9 @@ Released Feb 14th 2008, codename Faustkeil. - many fixes and small improvements  -File: werkzeug.info, Node: Version 0 1, Prev: Version 0 2, Up: Changelog +File: werkzeug.info, Node: Version 0 1, Prev: Version 0 2, Up: Changes -5.4.68 Version 0.1 +5.5.73 Version 0.1 ------------------ Released on Dec 9th 2007, codename Wictorinoxger. @@ -14882,26 +18325,25 @@ Python Module Index * werkzeug.datastructures: 0. * werkzeug.debug: 1. * werkzeug.exceptions: 2. -* werkzeug.filesystem: 3. -* werkzeug.formparser: 4. -* werkzeug.http: 5. -* werkzeug.local: 6. -* werkzeug.middleware: 7. -* werkzeug.middleware.dispatcher: 8. -* werkzeug.middleware.http_proxy: 9. -* werkzeug.middleware.lint: a. -* werkzeug.middleware.profiler: b. -* werkzeug.middleware.proxy_fix: c. -* werkzeug.middleware.shared_data: d. -* werkzeug.routing: e. -* werkzeug.security: f. -* werkzeug.serving: 10. -* werkzeug.test: 11. -* werkzeug.urls: 12. -* werkzeug.useragents: 13. -* werkzeug.utils: 14. -* werkzeug.wrappers: 15. -* werkzeug.wsgi: 16. +* werkzeug.formparser: 3. +* werkzeug.http: 4. +* werkzeug.local: 5. +* werkzeug.middleware: 6. +* werkzeug.middleware.dispatcher: 7. +* werkzeug.middleware.http_proxy: 8. +* werkzeug.middleware.lint: 9. +* werkzeug.middleware.profiler: a. +* werkzeug.middleware.proxy_fix: b. +* werkzeug.middleware.shared_data: c. +* werkzeug.routing: d. +* werkzeug.security: e. +* werkzeug.serving: f. +* werkzeug.test: 10. +* werkzeug.urls: 11. +* werkzeug.user_agent: 12. +* werkzeug.utils: 13. +* werkzeug.wrappers: 14. +* werkzeug.wsgi: 15.  File: werkzeug.info, Node: Index, Prev: Python Module Index, Up: Top @@ -14912,3418 +18354,4220 @@ Index [index] * Menu: -* _ensure_sequence() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 557) +* _ensure_sequence() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 816) * _get_current_object() (werkzeug.local.LocalProxy method): Context Locals. - (line 233) -* _get_file_stream() (werkzeug.wrappers.BaseRequest method): Base Wrappers. - (line 67) + (line 258) +* _get_file_stream() (werkzeug.wrappers.Request method): Wrapper Classes. + (line 50) * __call__() (werkzeug.exceptions.HTTPException method): Baseclass. - (line 15) -* __call__() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 542) -* abort() (in module werkzeug.exceptions): Simple Aborting. (line 10) -* Aborter (class in werkzeug.exceptions): Simple Aborting. (line 26) -* Accept (class in werkzeug.datastructures): HTTP Related. (line 356) -* AcceptMixin (class in werkzeug.wrappers): Accept. (line 6) -* accept_charsets (werkzeug.wrappers.AcceptMixin attribute): Accept. - (line 12) -* accept_encodings (werkzeug.wrappers.AcceptMixin attribute): Accept. - (line 17) -* accept_html (werkzeug.datastructures.MIMEAccept attribute): HTTP Related. - (line 446) -* accept_json (werkzeug.datastructures.MIMEAccept attribute): HTTP Related. - (line 450) -* accept_languages (werkzeug.wrappers.AcceptMixin attribute): Accept. - (line 23) -* accept_mimetypes (werkzeug.wrappers.AcceptMixin attribute): Accept. - (line 28) -* accept_ranges (werkzeug.wrappers.ETagResponseMixin attribute): ETag. - (line 69) -* accept_xhtml (werkzeug.datastructures.MIMEAccept attribute): HTTP Related. - (line 454) -* access_control_allow_credentials (werkzeug.wrappers.cors.CORSResponseMixin attribute): CORS. - (line 40) -* access_control_allow_headers (werkzeug.wrappers.cors.CORSResponseMixin attribute): CORS. - (line 46) -* access_control_allow_methods (werkzeug.wrappers.cors.CORSResponseMixin attribute): CORS. - (line 50) -* access_control_allow_origin (werkzeug.wrappers.cors.CORSResponseMixin attribute): CORS. - (line 54) -* access_control_expose_headers (werkzeug.wrappers.cors.CORSResponseMixin attribute): CORS. - (line 59) -* access_control_max_age (werkzeug.wrappers.cors.CORSResponseMixin attribute): CORS. - (line 63) -* access_control_request_headers (werkzeug.wrappers.cors.CORSRequestMixin attribute): CORS. - (line 13) -* access_control_request_method (werkzeug.wrappers.cors.CORSRequestMixin attribute): CORS. - (line 20) -* access_route (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 97) + (line 28) +* __call__() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 798) +* abort() (in module werkzeug.exceptions): Simple Aborting. (line 10) +* Aborter (class in werkzeug.exceptions): Simple Aborting. (line 38) +* Accept (class in werkzeug.datastructures): HTTP Related. (line 350) +* accept_charsets (werkzeug.wrappers.Request property): Wrapper Classes. + (line 84) +* accept_encodings (werkzeug.wrappers.Request property): Wrapper Classes. + (line 90) +* accept_html (werkzeug.datastructures.MIMEAccept property): HTTP Related. + (line 440) +* accept_json (werkzeug.datastructures.MIMEAccept property): HTTP Related. + (line 444) +* accept_languages (werkzeug.wrappers.Request property): Wrapper Classes. + (line 97) +* accept_mimetypes (werkzeug.wrappers.Request property): Wrapper Classes. + (line 103) +* accept_ranges (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 830) +* accept_xhtml (werkzeug.datastructures.MIMEAccept property): HTTP Related. + (line 448) +* access_control_allow_credentials (werkzeug.wrappers.Response property): Wrapper Classes. + (line 840) +* access_control_allow_headers (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 846) +* access_control_allow_methods (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 850) +* access_control_allow_origin (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 854) +* access_control_expose_headers (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 859) +* access_control_max_age (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 863) +* access_control_request_headers (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 109) +* access_control_request_method (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 116) +* access_route (werkzeug.wrappers.Request property): Wrapper Classes. + (line 123) * add() (werkzeug.datastructures.Headers method): HTTP Related. - (line 42) + (line 46) * add() (werkzeug.datastructures.HeaderSet method): HTTP Related. - (line 291) + (line 285) * add() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 103) + (line 103) * add() (werkzeug.routing.Map method): Maps Rules and Adapters. - (line 73) -* add_etag() (werkzeug.wrappers.ETagResponseMixin method): ETag. - (line 79) + (line 84) +* add_etag() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 868) * add_file() (werkzeug.datastructures.FileMultiDict method): General Purpose. - (line 431) + (line 431) * add_header() (werkzeug.datastructures.Headers method): HTTP Related. - (line 59) -* age (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 98) -* algorithm (werkzeug.datastructures.WWWAuthenticate attribute): HTTP Related. - (line 675) -* allow (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 107) + (line 63) +* age (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 885) +* algorithm (werkzeug.datastructures.WWWAuthenticate property): HTTP Related. + (line 680) +* allow (werkzeug.wrappers.Response property): Wrapper Classes. + (line 894) * allowed_methods() (werkzeug.routing.MapAdapter method): Maps Rules and Adapters. - (line 219) + (line 290) * AnyConverter (class in werkzeug.routing): Built-in Converters. - (line 46) + (line 60) * append_slash_redirect() (in module werkzeug.utils): General Helpers. - (line 101) -* application() (werkzeug.wrappers.BaseRequest class method): Base Wrappers. - (line 102) -* args (werkzeug.test.EnvironBuilder attribute): Testing API. (line 157) -* args (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 123) -* ascii_host (werkzeug.urls.BaseURL attribute): werkzeug urls. - (line 25) + (line 99) +* application() (werkzeug.wrappers.Request class method): Wrapper Classes. + (line 128) +* args (werkzeug.test.EnvironBuilder property): API. (line 551) +* args (werkzeug.wrappers.Request property): Wrapper Classes. + (line 153) +* ascii_host (werkzeug.urls.BaseURL property): URL Helpers<2>. + (line 31) * as_set() (werkzeug.datastructures.ETags method): HTTP Related. - (line 569) + (line 569) * as_set() (werkzeug.datastructures.HeaderSet method): HTTP Related. - (line 295) -* auth (werkzeug.urls.BaseURL attribute): werkzeug urls. (line 33) + (line 289) +* auth (werkzeug.urls.BaseURL property): URL Helpers<2>. (line 39) * Authorization (class in werkzeug.datastructures): HTTP Related. - (line 602) -* authorization (werkzeug.wrappers.AuthorizationMixin attribute): Authentication. - (line 12) -* AuthorizationMixin (class in werkzeug.wrappers): Authentication. - (line 6) + (line 602) +* authorization (werkzeug.wrappers.Request property): Wrapper Classes. + (line 163) * auth_property() (werkzeug.datastructures.WWWAuthenticate static method): HTTP Related. - (line 683) -* autocorrect_location_header (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 565) -* automatically_set_content_length (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 572) -* BadGateway: Error Classes. (line 277) -* BadRequest: Error Classes. (line 8) + (line 688) +* autocorrect_location_header (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 902) +* automatically_set_content_length (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 909) +* BadGateway: Error Classes. (line 554) +* BadRequest: Error Classes. (line 8) * BadRequestKeyError: Special HTTP Exceptions. - (line 26) -* BaseRequest (class in werkzeug.wrappers): Base Wrappers. (line 11) -* BaseResponse (class in werkzeug.wrappers): Base Wrappers. (line 436) -* BaseURL (class in werkzeug.urls): werkzeug urls. (line 21) -* base_url (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 161) -* base_url (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 133) -* best (werkzeug.datastructures.Accept attribute): HTTP Related. - (line 390) + (line 26) +* BaseURL (class in werkzeug.urls): URL Helpers<2>. (line 11) +* base_url (werkzeug.test.EnvironBuilder property): API. (line 498) +* base_url (werkzeug.wrappers.Request property): Wrapper Classes. + (line 168) +* best (werkzeug.datastructures.Accept property): HTTP Related. + (line 384) * best_match() (werkzeug.datastructures.Accept method): HTTP Related. - (line 394) + (line 388) * bind() (werkzeug.routing.Map method): Maps Rules and Adapters. - (line 82) -* bind_arguments() (in module werkzeug.utils): General Helpers. - (line 249) + (line 96) * bind_to_environ() (werkzeug.routing.Map method): Maps Rules and Adapters. - (line 112) -* BrokenFilesystemWarning (class in werkzeug.filesystem): Filesystem Utilities. - (line 8) -* browser (werkzeug.useragents.UserAgent attribute): UserAgent Parsing. - (line 63) + (line 148) +* browser (werkzeug.user_agent.UserAgent attribute): User Agent API. + (line 28) * build() (werkzeug.routing.MapAdapter method): Maps Rules and Adapters. - (line 225) -* BytesURL (class in werkzeug.urls): werkzeug urls. (line 138) -* cached_property (class in werkzeug.utils): General Helpers. (line 6) -* cache_control (werkzeug.wrappers.ETagRequestMixin attribute): ETag. - (line 12) -* cache_control (werkzeug.wrappers.ETagResponseMixin attribute): ETag. - (line 83) -* calculate_content_length() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 579) -* call_on_close() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 583) -* charset (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 121) -* charset (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 138) -* charset (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 592) + (line 302) +* BytesURL (class in werkzeug.urls): URL Helpers<2>. (line 191) +* cached_property (class in werkzeug.utils): General Helpers. + (line 6) +* cache_control (werkzeug.wrappers.Request property): Wrapper Classes. + (line 172) +* cache_control (werkzeug.wrappers.Response property): Wrapper Classes. + (line 916) +* calculate_content_length() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 923) +* call_on_close() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 930) * CharsetAccept (class in werkzeug.datastructures): HTTP Related. - (line 458) + (line 452) * check_password_hash() (in module werkzeug.security): Security Helpers. - (line 42) + (line 43) * cleanup() (werkzeug.local.LocalManager method): Context Locals. - (line 105) + (line 120) * clear() (werkzeug.datastructures.Headers method): HTTP Related. - (line 66) + (line 70) * clear() (werkzeug.datastructures.HeaderSet method): HTTP Related. - (line 306) + (line 300) * clear() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 116) -* Client (class in werkzeug.test): Testing API. (line 267) -* ClientDisconnected: Error Classes. (line 322) + (line 116) +* Client (class in werkzeug.test): API. (line 6) +* ClientDisconnected: Error Classes. (line 634) * close() (werkzeug.datastructures.FileStorage method): Others. - (line 38) -* close() (werkzeug.test.EnvironBuilder method): Testing API. (line 166) -* close() (werkzeug.wrappers.BaseRequest method): Base Wrappers. - (line 142) -* close() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 596) + (line 38) +* close() (werkzeug.test.EnvironBuilder method): API. (line 563) +* close() (werkzeug.wrappers.Request method): Wrapper Classes. + (line 178) +* close() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 945) * ClosingIterator (class in werkzeug.wsgi): Iterator / Stream Helpers. - (line 9) -* cnonce (werkzeug.datastructures.Authorization attribute): HTTP Related. - (line 614) + (line 9) +* cnonce (werkzeug.datastructures.Authorization property): HTTP Related. + (line 612) * CombinedMultiDict (class in werkzeug.datastructures): General Purpose. - (line 378) -* CommonRequestDescriptorsMixin (class in werkzeug.wrappers): Common Descriptors. - (line 6) -* CommonResponseDescriptorsMixin (class in werkzeug.wrappers): Common Descriptors. - (line 92) -* Conflict: Error Classes. (line 94) + (line 378) +* Conflict: Error Classes. (line 172) * contains() (werkzeug.datastructures.ETags method): HTTP Related. - (line 574) + (line 574) * contains_raw() (werkzeug.datastructures.ETags method): HTTP Related. - (line 579) + (line 579) * contains_weak() (werkzeug.datastructures.ETags method): HTTP Related. - (line 585) + (line 585) * ContentRange (class in werkzeug.datastructures): HTTP Related. - (line 814) -* content_encoding (werkzeug.wrappers.CommonRequestDescriptorsMixin attribute): Common Descriptors. - (line 14) -* content_encoding (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 115) -* content_language (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 124) -* content_length (werkzeug.datastructures.FileStorage attribute): Others. - (line 42) -* content_length (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 172) -* content_length (werkzeug.wrappers.CommonRequestDescriptorsMixin attribute): Common Descriptors. - (line 25) -* content_length (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 131) -* content_location (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 139) -* content_md5 (werkzeug.wrappers.CommonRequestDescriptorsMixin attribute): Common Descriptors. - (line 32) -* content_md5 (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 146) -* content_range (werkzeug.wrappers.ETagResponseMixin attribute): ETag. - (line 89) -* content_security_policy (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 155) -* content_security_policy_report_only (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 160) -* content_type (werkzeug.datastructures.FileStorage attribute): Others. - (line 46) -* content_type (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 178) -* content_type (werkzeug.wrappers.CommonRequestDescriptorsMixin attribute): Common Descriptors. - (line 43) -* content_type (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 166) + (line 819) +* content_encoding (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 190) +* content_encoding (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 955) +* content_language (werkzeug.wrappers.Response property): Wrapper Classes. + (line 964) +* content_length (werkzeug.datastructures.FileStorage property): Others. + (line 42) +* content_length (werkzeug.test.EnvironBuilder property): API. + (line 523) +* content_length (werkzeug.wrappers.Request property): Wrapper Classes. + (line 201) +* content_length (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 972) +* content_location (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 980) +* content_md5 (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 208) +* content_md5 (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 987) +* content_range (werkzeug.wrappers.Response property): Wrapper Classes. + (line 996) +* content_security_policy (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1004) +* content_security_policy_report_only (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1014) +* content_type (werkzeug.datastructures.FileStorage property): Others. + (line 46) +* content_type (werkzeug.test.EnvironBuilder property): API. (line 503) +* content_type (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 219) +* content_type (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 1025) * converters (werkzeug.routing.Map attribute): Maps Rules and Adapters. - (line 65) -* cookies (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 151) -* cookie_date() (in module werkzeug.http): Date Functions. (line 12) + (line 76) +* cookies (werkzeug.wrappers.Request property): Wrapper Classes. + (line 226) * copy() (werkzeug.datastructures.ImmutableDict method): General Purpose. - (line 407) + (line 407) * copy() (werkzeug.datastructures.ImmutableMultiDict method): General Purpose. - (line 357) + (line 357) * copy() (werkzeug.datastructures.ImmutableOrderedMultiDict method): General Purpose. - (line 371) + (line 371) * copy() (werkzeug.datastructures.ImmutableTypeConversionDict method): General Purpose. - (line 54) + (line 54) * copy() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 118) -* CORSRequestMixin (class in werkzeug.wrappers.cors): CORS. (line 6) -* CORSResponseMixin (class in werkzeug.wrappers.cors): CORS. (line 33) -* create_environ() (in module werkzeug.test): Testing API. (line 365) -* data (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 156) -* data (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 603) + (line 118) +* create_environ() (in module werkzeug.test): API. (line 596) +* cross_origin_embedder_policy (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 1032) +* cross_origin_opener_policy (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 1038) +* data (werkzeug.wrappers.Request property): Wrapper Classes. + (line 231) +* data (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1044) * date (werkzeug.datastructures.IfRange attribute): HTTP Related. - (line 759) -* date (werkzeug.wrappers.CommonRequestDescriptorsMixin attribute): Common Descriptors. - (line 50) -* date (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 173) + (line 764) +* date (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 236) +* date (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 1049) * DebuggedApplication (class in werkzeug.debug): Enabling the Debugger. - (line 10) -* decode() (werkzeug.urls.BytesURL method): werkzeug urls. (line 142) -* decode_netloc() (werkzeug.urls.BaseURL method): werkzeug urls. - (line 38) -* decode_query() (werkzeug.urls.BaseURL method): werkzeug urls. - (line 42) + (line 10) +* decode() (werkzeug.urls.BytesURL method): URL Helpers<2>. (line 212) +* decode_netloc() (werkzeug.urls.BaseURL method): URL Helpers<2>. + (line 44) +* decode_query() (werkzeug.urls.BaseURL method): URL Helpers<2>. + (line 51) * deepcopy() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 122) + (line 122) * default_converters (werkzeug.routing.Map attribute): Maps Rules and Adapters. - (line 161) -* default_mimetype (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 608) -* default_status (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 612) -* delete() (werkzeug.test.Client method): Testing API. (line 353) -* delete_cookie() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 616) -* dict_storage_class (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 161) -* direct_passthrough (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 533) -* disable_data_descriptor (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 165) + (line 202) +* delete() (werkzeug.test.Client method): API. (line 194) +* delete_cookie() (werkzeug.test.Client method): API. (line 81) +* delete_cookie() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1057) +* dict_storage_class (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 244) +* direct_passthrough (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 1088) * discard() (werkzeug.datastructures.HeaderSet method): HTTP Related. - (line 310) + (line 304) * dispatch() (werkzeug.routing.MapAdapter method): Maps Rules and Adapters. - (line 303) + (line 391) * DispatcherMiddleware (class in werkzeug.middleware.dispatcher): Application Dispatcher. - (line 28) -* domain (werkzeug.datastructures.WWWAuthenticate attribute): HTTP Related. - (line 695) -* dump_cookie() (in module werkzeug.http): Cookies. (line 34) -* dump_header() (in module werkzeug.http): Header Utilities. (line 101) + (line 28) +* domain (werkzeug.datastructures.WWWAuthenticate property): HTTP Related. + (line 700) +* dump_cookie() (in module werkzeug.http): Cookies. (line 40) +* dump_header() (in module werkzeug.http): Header Utilities. (line 143) * empty() (werkzeug.routing.Rule method): Maps Rules and Adapters. - (line 637) -* encode() (werkzeug.urls.URL method): werkzeug urls. (line 208) -* encode_netloc() (werkzeug.urls.BytesURL method): werkzeug urls. - (line 147) -* encode_netloc() (werkzeug.urls.URL method): werkzeug urls. (line 213) -* encoding_errors (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 172) -* EndpointPrefix (class in werkzeug.routing): Rule Factories. (line 51) -* environ (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 57) -* EnvironBuilder (class in werkzeug.test): Testing API. (line 6) + (line 780) +* encode() (werkzeug.urls.URL method): URL Helpers<2>. (line 255) +* encode_netloc() (werkzeug.urls.BaseURL method): URL Helpers<2>. + (line 68) +* encode_netloc() (werkzeug.urls.BytesURL method): URL Helpers<2>. + (line 227) +* EndpointPrefix (class in werkzeug.routing): Rule Factories. + (line 79) +* environ (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 248) +* EnvironBuilder (class in werkzeug.test): API. (line 316) * EnvironHeaders (class in werkzeug.datastructures): HTTP Related. - (line 266) -* environ_base (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 141) -* environ_overrides (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 145) + (line 260) * environ_property (class in werkzeug.utils): General Helpers. - (line 47) -* errors_stream (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 129) -* escape() (in module werkzeug.utils): HTML Helpers. (line 33) + (line 41) * etag (werkzeug.datastructures.IfRange attribute): HTTP Related. - (line 763) -* ETagRequestMixin (class in werkzeug.wrappers): ETag. (line 6) -* ETagResponseMixin (class in werkzeug.wrappers): ETag. (line 58) -* ETags (class in werkzeug.datastructures): HTTP Related. (line 563) + (line 768) +* ETags (class in werkzeug.datastructures): HTTP Related. (line 563) * exhaust() (werkzeug.wsgi.LimitedStream method): Iterator / Stream Helpers. - (line 92) -* ExpectationFailed: Error Classes. (line 160) -* expires (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 179) + (line 111) +* ExpectationFailed: Error Classes. (line 325) +* expires (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 1095) * extend() (werkzeug.datastructures.Headers method): HTTP Related. - (line 70) + (line 74) * extract_path_info() (in module werkzeug.wsgi): Environ Helpers. - (line 220) -* FailedDependency: Error Classes. (line 195) + (line 245) +* FailedDependency: Error Classes. (line 400) * FileMultiDict (class in werkzeug.datastructures): General Purpose. - (line 423) + (line 423) * filename (werkzeug.datastructures.FileStorage attribute): Others. - (line 21) -* files (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 184) -* files (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 176) -* FileStorage (class in werkzeug.datastructures): Others. (line 6) + (line 21) +* files (werkzeug.test.EnvironBuilder property): API. (line 533) +* files (werkzeug.wrappers.Request property): Wrapper Classes. + (line 253) +* FileStorage (class in werkzeug.datastructures): Others. (line 6) * FileWrapper (class in werkzeug.wsgi): Iterator / Stream Helpers. - (line 32) + (line 44) * find() (werkzeug.datastructures.Accept method): HTTP Related. - (line 408) + (line 402) * find() (werkzeug.datastructures.HeaderSet method): HTTP Related. - (line 317) -* find_modules() (in module werkzeug.utils): General Helpers. (line 137) + (line 311) +* find_modules() (in module werkzeug.utils): General Helpers. + (line 244) * FloatConverter (class in werkzeug.routing): Built-in Converters. - (line 90) -* Forbidden: Error Classes. (line 50) -* force_type() (werkzeug.wrappers.BaseResponse class method): Base Wrappers. - (line 631) -* form (werkzeug.test.EnvironBuilder attribute): Testing API. (line 189) -* form (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 195) + (line 111) +* Forbidden: Error Classes. (line 73) +* force_type() (werkzeug.wrappers.Response class method): Wrapper Classes. + (line 1103) +* form (werkzeug.test.EnvironBuilder property): API. (line 529) +* form (werkzeug.wrappers.Request property): Wrapper Classes. + (line 272) * FormDataParser (class in werkzeug.formparser): Form Data Parsing. - (line 39) -* form_data_parser_class (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 209) -* freeze() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 668) -* freeze() (werkzeug.wrappers.ETagResponseMixin method): ETag. - (line 96) + (line 45) +* form_data_parser_class (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 286) +* freeze() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1145) * fromkeys() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 126) -* from_app() (werkzeug.wrappers.BaseResponse class method): Base Wrappers. - (line 678) -* from_environ() (werkzeug.test.EnvironBuilder class method): Testing API. - (line 193) -* from_values() (werkzeug.wrappers.BaseRequest class method): Base Wrappers. - (line 213) -* full_path (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 231) -* GatewayTimeout: Error Classes. (line 301) + (line 126) +* from_app() (werkzeug.wrappers.Response class method): Wrapper Classes. + (line 1169) +* from_environ() (werkzeug.test.EnvironBuilder class method): API. + (line 478) +* from_values() (werkzeug.wrappers.Request class method): Wrapper Classes. + (line 290) +* full_path (werkzeug.wrappers.Request property): Wrapper Classes. + (line 318) +* GatewayTimeout: Error Classes. (line 598) * generate_etag() (in module werkzeug.http): Conditional Response Helpers. - (line 44) + (line 55) * generate_password_hash() (in module werkzeug.security): Security Helpers. - (line 8) + (line 6) * get() (werkzeug.datastructures.Headers method): HTTP Related. - (line 85) + (line 89) * get() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 131) + (line 131) * get() (werkzeug.datastructures.TypeConversionDict method): General Purpose. - (line 20) -* get() (werkzeug.test.Client method): Testing API. (line 333) + (line 20) +* get() (werkzeug.test.Client method): API. (line 152) * getlist() (werkzeug.datastructures.Headers method): HTTP Related. - (line 124) + (line 125) * getlist() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 158) + (line 158) * get_all() (werkzeug.datastructures.Headers method): HTTP Related. - (line 117) -* get_app_iter() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 700) + (line 118) +* get_app_iter() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1197) * get_content_length() (in module werkzeug.wsgi): Environ Helpers. - (line 33) + (line 38) * get_current_url() (in module werkzeug.wsgi): Environ Helpers. - (line 69) -* get_data() (werkzeug.wrappers.BaseRequest method): Base Wrappers. - (line 235) -* get_data() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 719) -* get_default_redirect() (werkzeug.routing.MapAdapter method): Maps Rules and Adapters. - (line 355) -* get_environ() (werkzeug.test.EnvironBuilder method): Testing API. - (line 200) -* get_etag() (werkzeug.wrappers.ETagResponseMixin method): ETag. - (line 103) -* get_filesystem_encoding() (in module werkzeug.filesystem): Filesystem Utilities. - (line 13) -* get_file_location() (werkzeug.urls.BaseURL method): werkzeug urls. - (line 49) -* get_host() (in module werkzeug.wsgi): Environ Helpers. (line 9) + (line 82) +* get_data() (werkzeug.wrappers.Request method): Wrapper Classes. + (line 322) +* get_data() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1220) +* get_environ() (werkzeug.test.EnvironBuilder method): API. (line 572) +* get_etag() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1241) +* get_file_location() (werkzeug.urls.BaseURL method): URL Helpers<2>. + (line 75) +* get_host() (in module werkzeug.wsgi): Environ Helpers. (line 9) * get_host() (werkzeug.routing.MapAdapter method): Maps Rules and Adapters. - (line 363) -* get_ident() (werkzeug.local.LocalManager method): Context Locals. - (line 111) + (line 449) * get_input_stream() (in module werkzeug.wsgi): Environ Helpers. - (line 45) -* get_json() (werkzeug.wrappers.json.JSONMixin method): JSON. (line 14) -* get_path_info() (in module werkzeug.wsgi): Environ Helpers. (line 147) + (line 53) +* get_json() (werkzeug.wrappers.Request method): Wrapper Classes. + (line 362) +* get_json() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1250) +* get_path_info() (in module werkzeug.wsgi): Environ Helpers. + (line 148) * get_query_string() (in module werkzeug.wsgi): Environ Helpers. - (line 114) -* get_request() (werkzeug.test.EnvironBuilder method): Testing API. - (line 208) + (line 111) +* get_request() (werkzeug.test.EnvironBuilder method): API. (line 583) * get_response() (werkzeug.exceptions.HTTPException method): Baseclass. - (line 27) + (line 43) * get_rules() (werkzeug.routing.RuleFactory method): Rule Factories. - (line 13) + (line 13) * get_script_name() (in module werkzeug.wsgi): Environ Helpers. - (line 127) -* get_wsgi_headers() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 734) -* get_wsgi_response() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 761) -* Gone: Error Classes. (line 104) -* has_key() (werkzeug.datastructures.Headers method): HTTP Related. - (line 148) -* head() (werkzeug.test.Client method): Testing API. (line 345) -* Headers (class in werkzeug.datastructures): HTTP Related. (line 6) + (line 126) +* get_wsgi_headers() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1271) +* get_wsgi_response() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1302) +* Gone: Error Classes. (line 192) +* head() (werkzeug.test.Client method): API. (line 236) +* Headers (class in werkzeug.datastructures): HTTP Related. (line 6) * headers (werkzeug.datastructures.FileStorage attribute): Others. - (line 29) -* headers (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 125) -* headers (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 263) -* headers (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 525) -* HeaderSet (class in werkzeug.datastructures): HTTP Related. (line 277) -* header_property (class in werkzeug.utils): General Helpers. (line 70) -* host (werkzeug.urls.BaseURL attribute): werkzeug urls. (line 68) -* host (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 268) + (line 29) +* headers (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 387) +* HeaderSet (class in werkzeug.datastructures): HTTP Related. + (line 271) +* header_property (class in werkzeug.utils): General Helpers. + (line 64) +* history (werkzeug.test.TestResponse attribute): API. (line 310) +* host (werkzeug.urls.BaseURL property): URL Helpers<2>. (line 98) +* host (werkzeug.wrappers.Request property): Wrapper Classes. + (line 391) * host_is_trusted() (in module werkzeug.wsgi): Environ Helpers. - (line 268) -* host_url (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 273) -* Href (class in werkzeug.urls): werkzeug urls. (line 151) -* HTMLBuilder (class in werkzeug.utils): HTML Helpers. (line 6) -* HTTPException: Baseclass. (line 8) -* HTTPUnicodeError: Error Classes. (line 317) -* HTTPVersionNotSupported: Error Classes. (line 309) -* http_date() (in module werkzeug.http): Date Functions. (line 27) -* HTTP_STATUS_CODES (in module werkzeug.http): Constants. (line 6) -* IfRange (class in werkzeug.datastructures): HTTP Related. (line 751) -* if_match (werkzeug.wrappers.ETagRequestMixin attribute): ETag. - (line 17) -* if_modified_since (werkzeug.wrappers.ETagRequestMixin attribute): ETag. - (line 24) -* if_none_match (werkzeug.wrappers.ETagRequestMixin attribute): ETag. - (line 28) -* if_range (werkzeug.wrappers.ETagRequestMixin attribute): ETag. - (line 36) -* if_unmodified_since (werkzeug.wrappers.ETagRequestMixin attribute): ETag. - (line 45) -* ImATeapot: Error Classes. (line 170) -* immutable (werkzeug.datastructures.ResponseCacheControl attribute): HTTP Related. - (line 539) + (line 298) +* host_url (werkzeug.wrappers.Request property): Wrapper Classes. + (line 396) +* HTTPException: Baseclass. (line 8) +* HTTPVersionNotSupported: Error Classes. (line 616) +* http_date() (in module werkzeug.http): Datetime Functions. (line 44) +* HTTP_STATUS_CODES (in module werkzeug.http): Constants. (line 6) +* IfRange (class in werkzeug.datastructures): HTTP Related. (line 756) +* if_match (werkzeug.wrappers.Request property): Wrapper Classes. + (line 400) +* if_modified_since (werkzeug.wrappers.Request property): Wrapper Classes. + (line 407) +* if_none_match (werkzeug.wrappers.Request property): Wrapper Classes. + (line 413) +* if_range (werkzeug.wrappers.Request property): Wrapper Classes. + (line 422) +* if_unmodified_since (werkzeug.wrappers.Request property): Wrapper Classes. + (line 430) +* ImATeapot: Error Classes. (line 345) +* immutable (werkzeug.datastructures.ResponseCacheControl property): HTTP Related. + (line 539) * ImmutableDict (class in werkzeug.datastructures): General Purpose. - (line 401) + (line 401) * ImmutableList (class in werkzeug.datastructures): General Purpose. - (line 414) + (line 414) * ImmutableMultiDict (class in werkzeug.datastructures): General Purpose. - (line 351) + (line 351) * ImmutableOrderedMultiDict (class in werkzeug.datastructures): General Purpose. - (line 364) + (line 364) * ImmutableTypeConversionDict (class in werkzeug.datastructures): General Purpose. - (line 47) -* implicit_sequence_conversion (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 779) + (line 47) +* implicit_sequence_conversion (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 1325) * import_string() (in module werkzeug.utils): General Helpers. - (line 115) + (line 218) * index() (werkzeug.datastructures.Accept method): HTTP Related. - (line 415) + (line 409) * index() (werkzeug.datastructures.HeaderSet method): HTTP Related. - (line 325) -* input_stream (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 150) -* input_stream (werkzeug.test.EnvironBuilder attribute) <1>: Testing API. - (line 216) + (line 319) +* input_stream (werkzeug.test.EnvironBuilder property): API. (line 539) +* input_stream (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 436) * IntegerConverter (class in werkzeug.routing): Built-in Converters. - (line 61) -* InternalServerError: Error Classes. (line 252) -* invalidate_cached_property() (in module werkzeug.utils): General Helpers. - (line 23) -* iri_to_uri() (in module werkzeug.urls): werkzeug urls. (line 217) + (line 78) +* InternalServerError: Error Classes. (line 507) +* iri_to_uri() (in module werkzeug.urls): URL Helpers<2>. (line 270) * is_allowed() (werkzeug.middleware.shared_data.SharedDataMiddleware method): Serve Shared Static Files. - (line 76) + (line 84) * is_byte_range_valid() (in module werkzeug.http): Header Utilities. - (line 66) + (line 83) * is_endpoint_expecting() (werkzeug.routing.Map method): Maps Rules and Adapters. - (line 172) + (line 213) * is_entity_header() (in module werkzeug.http): Header Utilities. - (line 12) -* is_exhausted (werkzeug.wsgi.LimitedStream attribute): Iterator / Stream Helpers. - (line 102) + (line 12) +* is_exhausted (werkzeug.wsgi.LimitedStream property): Iterator / Stream Helpers. + (line 124) * is_hop_by_hop_header() (in module werkzeug.http): Header Utilities. - (line 24) -* is_json (werkzeug.wrappers.json.JSONMixin attribute): JSON. (line 36) -* is_multiprocess (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 278) -* is_multithread (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 283) + (line 27) +* is_json (werkzeug.wrappers.Request property): Wrapper Classes. + (line 444) +* is_json (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1336) +* is_multiprocess (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 449) +* is_multithread (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 454) * is_resource_modified() (in module werkzeug.http): Conditional Response Helpers. - (line 48) + (line 68) * is_running_from_reloader() (in module werkzeug.serving): Serving WSGI Applications. - (line 110) -* is_run_once (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 288) -* is_secure (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 295) -* is_sequence (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 790) -* is_streamed (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 798) + (line 141) +* is_run_once (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 459) +* is_secure (werkzeug.wrappers.Request property): Wrapper Classes. + (line 466) +* is_sequence (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1341) +* is_streamed (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1349) * is_strong() (werkzeug.datastructures.ETags method): HTTP Related. - (line 590) + (line 590) * is_weak() (werkzeug.datastructures.ETags method): HTTP Related. - (line 594) + (line 594) * items() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 177) -* iter_encoded() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 809) + (line 177) +* iter_encoded() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1360) * iter_rules() (werkzeug.routing.Map method): Maps Rules and Adapters. - (line 189) -* join() (werkzeug.urls.BaseURL method): werkzeug urls. (line 74) -* json (werkzeug.wrappers.json.JSONMixin attribute): JSON. (line 41) -* JSONMixin (class in werkzeug.wrappers.json): JSON. (line 6) -* json_dumps() (werkzeug.test.EnvironBuilder static method): Testing API. - (line 221) -* json_module (werkzeug.wrappers.json.JSONMixin attribute): JSON. - (line 48) + (line 234) +* join() (werkzeug.urls.BaseURL method): URL Helpers<2>. (line 104) +* json (werkzeug.wrappers.Request property): Wrapper Classes. + (line 471) +* json (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1370) +* json_dumps() (werkzeug.test.EnvironBuilder static method): API. + (line 471) +* json_module (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 478) +* json_module (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 1377) * keys() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 186) -* language (werkzeug.useragents.UserAgent attribute): UserAgent Parsing. - (line 120) + (line 186) +* language (werkzeug.user_agent.UserAgent attribute): User Agent API. + (line 36) * LanguageAccept (class in werkzeug.datastructures): HTTP Related. - (line 462) -* last_modified (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 185) -* length (werkzeug.datastructures.ContentRange attribute): HTTP Related. - (line 821) -* LengthRequired: Error Classes. (line 112) + (line 456) +* last_modified (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 1383) +* length (werkzeug.datastructures.ContentRange property): HTTP Related. + (line 826) +* LengthRequired: Error Classes. (line 210) * LimitedStream (class in werkzeug.wsgi): Iterator / Stream Helpers. - (line 54) + (line 70) * LintMiddleware (class in werkzeug.middleware.lint): WSGI Protocol Linter. - (line 11) + (line 11) * lists() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 189) + (line 189) * listvalues() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 194) -* list_storage_class (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 299) -* LocalManager (class in werkzeug.local): Context Locals. (line 89) -* LocalProxy (class in werkzeug.local): Context Locals. (line 183) -* LocalStack (class in werkzeug.local): Context Locals. (line 141) -* location (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 191) -* Locked: Error Classes. (line 188) + (line 194) +* list_storage_class (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 484) +* LocalManager (class in werkzeug.local): Context Locals. (line 96) +* LocalProxy (class in werkzeug.local): Context Locals. (line 214) +* LocalStack (class in werkzeug.local): Context Locals. (line 160) +* location (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 1391) +* Locked: Error Classes. (line 383) * lock_class() (werkzeug.routing.Map method): Maps Rules and Adapters. - (line 200) + (line 248) * make_alias_redirect_url() (werkzeug.routing.MapAdapter method): Maps Rules and Adapters. - (line 369) + (line 461) * make_chunk_iter() (in module werkzeug.wsgi): Iterator / Stream Helpers. - (line 190) -* make_conditional() (werkzeug.wrappers.ETagResponseMixin method): ETag. - (line 108) + (line 245) +* make_conditional() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1397) * make_content_range() (werkzeug.datastructures.Range method): HTTP Related. - (line 785) -* make_form_data_parser() (werkzeug.wrappers.BaseRequest method): Base Wrappers. - (line 303) + (line 790) +* make_form_data_parser() (werkzeug.wrappers.Request method): Wrapper Classes. + (line 488) * make_line_iter() (in module werkzeug.wsgi): Iterator / Stream Helpers. - (line 150) + (line 200) * make_middleware() (werkzeug.local.LocalManager method): Context Locals. - (line 122) -* make_redirect_url() (werkzeug.routing.MapAdapter method): Maps Rules and Adapters. - (line 374) -* make_sequence() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 816) + (line 129) +* make_sequence() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1452) * make_ssl_devcert() (in module werkzeug.serving): Serving WSGI Applications. - (line 117) + (line 151) * Map (class in werkzeug.routing): Maps Rules and Adapters. - (line 6) + (line 6) * MapAdapter (class in werkzeug.routing): Maps Rules and Adapters. - (line 211) + (line 262) * match() (werkzeug.routing.MapAdapter method): Maps Rules and Adapters. - (line 382) + (line 483) * max_age (werkzeug.datastructures.RequestCacheControl attribute): HTTP Related. - (line 488) + (line 485) * max_age (werkzeug.datastructures.ResponseCacheControl attribute): HTTP Related. - (line 531) -* max_content_length (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 310) -* max_cookie_size (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 826) -* max_form_memory_size (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 324) -* max_forwards (werkzeug.wrappers.CommonRequestDescriptorsMixin attribute): Common Descriptors. - (line 56) -* max_stale (werkzeug.datastructures.RequestCacheControl attribute): HTTP Related. - (line 496) -* method (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 337) -* MethodNotAllowed: Error Classes. (line 65) + (line 531) +* max_content_length (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 498) +* max_form_memory_size (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 512) +* max_forwards (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 525) +* max_stale (werkzeug.datastructures.RequestCacheControl property): HTTP Related. + (line 493) +* method (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 532) +* MethodNotAllowed: Error Classes. (line 108) * middleware() (werkzeug.local.LocalManager method): Context Locals. - (line 127) + (line 140) * MIMEAccept (class in werkzeug.datastructures): HTTP Related. - (line 441) -* mimetype (werkzeug.datastructures.FileStorage attribute): Others. - (line 50) -* mimetype (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 228) -* mimetype (werkzeug.wrappers.CommonRequestDescriptorsMixin attribute): Common Descriptors. - (line 63) -* mimetype (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 197) -* mimetype_params (werkzeug.datastructures.FileStorage attribute): Others. - (line 59) -* mimetype_params (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 234) -* mimetype_params (werkzeug.wrappers.CommonRequestDescriptorsMixin attribute): Common Descriptors. - (line 70) -* mimetype_params (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 201) -* min_fresh (werkzeug.datastructures.RequestCacheControl attribute): HTTP Related. - (line 500) + (line 435) +* mimetype (werkzeug.datastructures.FileStorage property): Others. + (line 50) +* mimetype (werkzeug.test.EnvironBuilder property): API. (line 509) +* mimetype (werkzeug.wrappers.Request property): Wrapper Classes. + (line 536) +* mimetype (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1465) +* mimetype_params (werkzeug.datastructures.FileStorage property): Others. + (line 59) +* mimetype_params (werkzeug.test.EnvironBuilder property): API. + (line 515) +* mimetype_params (werkzeug.wrappers.Request property): Wrapper Classes. + (line 543) +* mimetype_params (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1469) +* min_fresh (werkzeug.datastructures.RequestCacheControl property): HTTP Related. + (line 497) +* module; werkzeug.datastructures: Data Structures. (line 6) +* module; werkzeug.debug: Debugging Applications. + (line 6) +* module; werkzeug.exceptions: HTTP Exceptions. (line 6) +* module; werkzeug.formparser: Form Data Parsing. (line 6) +* module; werkzeug.http: HTTP Utilities. (line 6) +* module; werkzeug.local: Context Locals. (line 6) +* module; werkzeug.middleware: Context Locals. (line 267) +* module; werkzeug.middleware.dispatcher: Serve Shared Static Files. + (line 95) +* module; werkzeug.middleware.http_proxy: Application Dispatcher. + (line 47) +* module; werkzeug.middleware.lint: Basic HTTP Proxy. (line 86) +* module; werkzeug.middleware.profiler: WSGI Protocol Linter. + (line 42) +* module; werkzeug.middleware.proxy_fix: Middleware. (line 8) +* module; werkzeug.middleware.shared_data: X-Forwarded-For Proxy Fix. + (line 93) +* module; werkzeug.routing: URL Routing. (line 6) +* module; werkzeug.security: Security Helpers. (line 6) +* module; werkzeug.serving: Serving WSGI Applications. + (line 6) +* module; werkzeug.test: Unix Sockets. (line 11) +* module; werkzeug.urls: URL Helpers<2>. (line 6) +* module; werkzeug.user_agent: User Agent API. (line 6) +* module; werkzeug.utils: Utilities. (line 6) +* module; werkzeug.wrappers: Request / Response Objects. + (line 6) +* module; werkzeug.wsgi: WSGI Helpers. (line 6) * MultiDict (class in werkzeug.datastructures): General Purpose. - (line 61) -* multiprocess (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 137) -* multithread (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 133) -* must_revalidate (werkzeug.datastructures.ResponseCacheControl attribute): HTTP Related. - (line 543) + (line 61) +* must_revalidate (werkzeug.datastructures.ResponseCacheControl property): HTTP Related. + (line 543) * name (werkzeug.datastructures.FileStorage attribute): Others. - (line 25) -* nc (werkzeug.datastructures.Authorization attribute): HTTP Related. - (line 620) -* nonce (werkzeug.datastructures.Authorization attribute): HTTP Related. - (line 625) -* nonce (werkzeug.datastructures.WWWAuthenticate attribute): HTTP Related. - (line 701) -* NotAcceptable: Error Classes. (line 79) -* NotFound: Error Classes. (line 58) -* NotImplemented: Error Classes. (line 269) + (line 25) +* nc (werkzeug.datastructures.Authorization property): HTTP Related. + (line 618) +* nonce (werkzeug.datastructures.Authorization property): HTTP Related. + (line 623) +* nonce (werkzeug.datastructures.WWWAuthenticate property): HTTP Related. + (line 706) +* NotAcceptable: Error Classes. (line 137) +* NotFound: Error Classes. (line 91) +* NotImplemented: Error Classes. (line 536) * no_cache (werkzeug.datastructures.RequestCacheControl attribute): HTTP Related. - (line 480) + (line 477) * no_cache (werkzeug.datastructures.ResponseCacheControl attribute): HTTP Related. - (line 523) + (line 523) * no_store (werkzeug.datastructures.RequestCacheControl attribute): HTTP Related. - (line 484) + (line 481) * no_store (werkzeug.datastructures.ResponseCacheControl attribute): HTTP Related. - (line 527) + (line 527) * no_transform (werkzeug.datastructures.RequestCacheControl attribute): HTTP Related. - (line 492) + (line 489) * no_transform (werkzeug.datastructures.ResponseCacheControl attribute): HTTP Related. - (line 535) -* only_if_cached (werkzeug.datastructures.RequestCacheControl attribute): HTTP Related. - (line 504) + (line 535) +* only_if_cached (werkzeug.datastructures.RequestCacheControl property): HTTP Related. + (line 501) * on_disconnect() (werkzeug.wsgi.LimitedStream method): Iterator / Stream Helpers. - (line 106) + (line 128) * on_exhausted() (werkzeug.wsgi.LimitedStream method): Iterator / Stream Helpers. - (line 113) -* on_json_loading_failed() (werkzeug.wrappers.json.JSONMixin method): JSON. - (line 55) -* opaque (werkzeug.datastructures.Authorization attribute): HTTP Related. - (line 631) -* opaque (werkzeug.datastructures.WWWAuthenticate attribute): HTTP Related. - (line 707) -* open() (werkzeug.test.Client method): Testing API. (line 298) -* options() (werkzeug.test.Client method): Testing API. (line 357) + (line 138) +* on_json_loading_failed() (werkzeug.wrappers.Request method): Wrapper Classes. + (line 549) +* opaque (werkzeug.datastructures.Authorization property): HTTP Related. + (line 629) +* opaque (werkzeug.datastructures.WWWAuthenticate property): HTTP Related. + (line 712) +* open() (werkzeug.test.Client method): API. (line 106) +* options() (werkzeug.test.Client method): API. (line 222) * OrderedMultiDict (class in werkzeug.datastructures): General Purpose. - (line 337) -* origin (werkzeug.wrappers.cors.CORSRequestMixin attribute): CORS. - (line 27) + (line 337) +* origin (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 562) * original_exception (werkzeug.exceptions.InternalServerError attribute): Error Classes. - (line 263) -* parameter_storage_class (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 341) + (line 530) +* parameter_storage_class (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 568) * parse_accept_header() (in module werkzeug.http): Header Parsing<2>. - (line 130) + (line 146) * parse_authorization_header() (in module werkzeug.http): Header Parsing<2>. - (line 178) + (line 207) * parse_cache_control_header() (in module werkzeug.http): Header Parsing<2>. - (line 154) + (line 176) * parse_content_range_header() (in module werkzeug.http): Header Parsing<2>. - (line 224) -* parse_cookie() (in module werkzeug.http): Cookies. (line 6) -* parse_date() (in module werkzeug.http): Date Functions. (line 41) + (line 283) +* parse_cookie() (in module werkzeug.http): Cookies. (line 6) +* parse_date() (in module werkzeug.http): Datetime Functions. + (line 24) * parse_dict_header() (in module werkzeug.http): Header Parsing<2>. - (line 96) + (line 108) * parse_etags() (in module werkzeug.http): Conditional Response Helpers. - (line 8) + (line 8) * parse_form_data() (in module werkzeug.formparser): Form Data Parsing. - (line 77) + (line 90) * parse_if_range_header() (in module werkzeug.http): Header Parsing<2>. - (line 208) + (line 248) * parse_list_header() (in module werkzeug.http): Header Parsing<2>. - (line 70) -* parse_multipart_headers() (in module werkzeug.formparser): Form Data Parsing. - (line 133) + (line 79) * parse_options_header() (in module werkzeug.http): Header Parsing<2>. - (line 11) + (line 11) * parse_range_header() (in module werkzeug.http): Header Parsing<2>. - (line 215) + (line 264) * parse_set_header() (in module werkzeug.http): Header Parsing<2>. - (line 40) + (line 44) * parse_www_authenticate_header() (in module werkzeug.http): Header Parsing<2>. - (line 191) -* password (werkzeug.datastructures.Authorization attribute): HTTP Related. - (line 637) -* password (werkzeug.urls.BaseURL attribute): werkzeug urls. (line 80) -* patch() (werkzeug.test.Client method): Testing API. (line 337) -* path (werkzeug.test.EnvironBuilder attribute): Testing API. (line 117) -* path (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 345) + (line 224) +* password (werkzeug.datastructures.Authorization property): HTTP Related. + (line 635) +* password (werkzeug.urls.BaseURL property): URL Helpers<2>. (line 120) +* patch() (werkzeug.test.Client method): API. (line 208) +* path (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 572) * PathConverter (class in werkzeug.routing): Built-in Converters. - (line 35) -* pbkdf2_bin() (in module werkzeug.security): Security Helpers. - (line 110) -* pbkdf2_hex() (in module werkzeug.security): Security Helpers. - (line 87) + (line 40) * peek_path_info() (in module werkzeug.wsgi): Environ Helpers. - (line 197) -* platform (werkzeug.useragents.UserAgent attribute): UserAgent Parsing. - (line 16) + (line 212) +* platform (werkzeug.user_agent.UserAgent attribute): User Agent API. + (line 24) * pop() (werkzeug.datastructures.Headers method): HTTP Related. - (line 152) + (line 149) * pop() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 204) -* pop() (werkzeug.local.LocalStack method): Context Locals. (line 169) + (line 204) +* pop() (werkzeug.local.LocalStack method): Context Locals. (line 191) * popitem() (werkzeug.datastructures.Headers method): HTTP Related. - (line 165) + (line 162) * popitem() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 223) + (line 223) * popitemlist() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 227) + (line 227) * poplist() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 231) -* pop_path_info() (in module werkzeug.wsgi): Environ Helpers. (line 167) -* port (werkzeug.urls.BaseURL attribute): werkzeug urls. (line 86) -* post() (werkzeug.test.Client method): Testing API. (line 341) -* pragma (werkzeug.wrappers.CommonRequestDescriptorsMixin attribute): Common Descriptors. - (line 76) -* PreconditionFailed: Error Classes. (line 120) -* PreconditionRequired: Error Classes. (line 204) -* private (werkzeug.datastructures.ResponseCacheControl attribute): HTTP Related. - (line 547) + (line 231) +* pop_path_info() (in module werkzeug.wsgi): Environ Helpers. + (line 170) +* port (werkzeug.urls.BaseURL property): URL Helpers<2>. (line 125) +* post() (werkzeug.test.Client method): API. (line 166) +* pragma (werkzeug.wrappers.Request property): Wrapper Classes. + (line 577) +* PreconditionFailed: Error Classes. (line 228) +* PreconditionRequired: Error Classes. (line 419) +* private (werkzeug.datastructures.ResponseCacheControl property): HTTP Related. + (line 547) * ProfilerMiddleware (class in werkzeug.middleware.profiler): Application Profiler. - (line 10) + (line 10) * ProxyFix (class in werkzeug.middleware.proxy_fix): X-Forwarded-For Proxy Fix. - (line 19) + (line 19) * ProxyMiddleware (class in werkzeug.middleware.http_proxy): Basic HTTP Proxy. - (line 6) -* proxy_revalidate (werkzeug.datastructures.ResponseCacheControl attribute): HTTP Related. - (line 551) -* public (werkzeug.datastructures.ResponseCacheControl attribute): HTTP Related. - (line 555) -* push() (werkzeug.local.LocalStack method): Context Locals. (line 174) -* put() (werkzeug.test.Client method): Testing API. (line 349) -* Python Enhancement Proposals; PEP 333: Quickstart. (line 8) -* Python Enhancement Proposals; PEP 333 <1>: Iterator / Stream Helpers. - (line 235) -* Python Enhancement Proposals; PEP 333 <2>: WSGI. (line 7) -* Python Enhancement Proposals; PEP 3333: WSGI Protocol Linter. - (line 7) -* Python Enhancement Proposals; PEP 519: Version 1 0 0. (line 95) -* qop (werkzeug.datastructures.Authorization attribute): HTTP Related. - (line 642) -* qop (werkzeug.datastructures.WWWAuthenticate attribute): HTTP Related. - (line 715) + (line 6) +* proxy_revalidate (werkzeug.datastructures.ResponseCacheControl property): HTTP Related. + (line 551) +* public (werkzeug.datastructures.ResponseCacheControl property): HTTP Related. + (line 555) +* push() (werkzeug.local.LocalStack method): Context Locals. (line 199) +* put() (werkzeug.test.Client method): API. (line 180) +* Python Enhancement Proposals; PEP 333: Iterator / Stream Helpers. + (line 296) +* Python Enhancement Proposals; PEP 3333: Quickstart. (line 8) +* Python Enhancement Proposals; PEP 3333 <1>: Bytes Strings and Encodings. + (line 7) +* Python Enhancement Proposals; PEP 3333 <2>: Raw Request URI and Path Encoding. + (line 11) +* Python Enhancement Proposals; PEP 3333 <3>: Cookies. (line 49) +* Python Enhancement Proposals; PEP 3333 <4>: WSGI Protocol Linter. + (line 7) +* Python Enhancement Proposals; PEP 3333 <5>: WSGI. (line 7) +* Python Enhancement Proposals; PEP 519: Version 1 0 0. (line 95) +* Python Enhancement Proposals; PEP 538: Version 2 1 0. (line 70) +* Python Enhancement Proposals; PEP 540: Version 2 1 0. (line 70) +* qop (werkzeug.datastructures.Authorization property): HTTP Related. + (line 640) +* qop (werkzeug.datastructures.WWWAuthenticate property): HTTP Related. + (line 720) * quality() (werkzeug.datastructures.Accept method): HTTP Related. - (line 425) -* query_string (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 242) -* query_string (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 351) + (line 419) +* query_string (werkzeug.test.EnvironBuilder property): API. (line 546) +* query_string (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 586) * quote_etag() (in module werkzeug.http): Conditional Response Helpers. - (line 18) + (line 22) * quote_header_value() (in module werkzeug.http): Header Utilities. - (line 72) -* Range (class in werkzeug.datastructures): HTTP Related. (line 772) -* range (werkzeug.wrappers.ETagRequestMixin attribute): ETag. (line 49) + (line 101) +* Range (class in werkzeug.datastructures): HTTP Related. (line 777) +* range (werkzeug.wrappers.Request property): Wrapper Classes. + (line 591) * ranges (werkzeug.datastructures.Range attribute): HTTP Related. - (line 796) + (line 801) * range_for_length() (werkzeug.datastructures.Range method): HTTP Related. - (line 790) -* raw_password (werkzeug.urls.BaseURL attribute): werkzeug urls. - (line 91) -* raw_username (werkzeug.urls.BaseURL attribute): werkzeug urls. - (line 96) + (line 795) +* raw_password (werkzeug.urls.BaseURL property): URL Helpers<2>. + (line 130) +* raw_username (werkzeug.urls.BaseURL property): URL Helpers<2>. + (line 135) * read() (werkzeug.wsgi.LimitedStream method): Iterator / Stream Helpers. - (line 119) + (line 147) * readable() (werkzeug.wsgi.LimitedStream method): Iterator / Stream Helpers. - (line 127) + (line 159) * readline() (werkzeug.wsgi.LimitedStream method): Iterator / Stream Helpers. - (line 133) + (line 168) * readlines() (werkzeug.wsgi.LimitedStream method): Iterator / Stream Helpers. - (line 137) -* realm (werkzeug.datastructures.Authorization attribute): HTTP Related. - (line 649) -* realm (werkzeug.datastructures.WWWAuthenticate attribute): HTTP Related. - (line 720) -* redirect() (in module werkzeug.utils): General Helpers. (line 75) -* referrer (werkzeug.wrappers.CommonRequestDescriptorsMixin attribute): Common Descriptors. - (line 85) -* release_local() (in module werkzeug.local): Context Locals. (line 69) -* remote_addr (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 355) -* remote_user (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 359) + (line 178) +* realm (werkzeug.datastructures.Authorization property): HTTP Related. + (line 647) +* realm (werkzeug.datastructures.WWWAuthenticate property): HTTP Related. + (line 725) +* redirect() (in module werkzeug.utils): General Helpers. (line 69) +* referrer (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 601) +* release_local() (in module werkzeug.local): Context Locals. + (line 69) +* remote_addr (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 608) +* remote_user (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 612) * remove() (werkzeug.datastructures.Headers method): HTTP Related. - (line 169) + (line 166) * remove() (werkzeug.datastructures.HeaderSet method): HTTP Related. - (line 333) + (line 327) * remove_entity_headers() (in module werkzeug.http): Header Utilities. - (line 37) + (line 43) * remove_hop_by_hop_headers() (in module werkzeug.http): Header Utilities. - (line 56) -* replace() (werkzeug.urls.BaseURL method): werkzeug urls. (line 101) -* Request (class in werkzeug.wrappers): Mixin Classes. (line 21) + (line 67) +* replace() (werkzeug.urls.BaseURL method): URL Helpers<2>. (line 140) +* Request (class in werkzeug.wrappers): Wrapper Classes. (line 6) +* request (werkzeug.test.TestResponse attribute): API. (line 304) * RequestCacheControl (class in werkzeug.datastructures): HTTP Related. - (line 466) -* RequestedRangeNotSatisfiable: Error Classes. (line 151) -* RequestEntityTooLarge: Error Classes. (line 128) -* RequestHeaderFieldsTooLarge: Error Classes. (line 235) -* RequestTimeout: Error Classes. (line 87) -* RequestURITooLarge: Error Classes. (line 136) -* request_class (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 247) -* responder() (in module werkzeug.wsgi): Convenience Helpers. (line 6) -* Response (class in werkzeug.wrappers): Mixin Classes. (line 40) -* response (werkzeug.datastructures.Authorization attribute): HTTP Related. - (line 653) -* response (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 518) + (line 460) +* RequestedRangeNotSatisfiable: Error Classes. (line 299) +* RequestEntityTooLarge: Error Classes. (line 246) +* RequestHeaderFieldsTooLarge: Error Classes. (line 470) +* RequestTimeout: Error Classes. (line 155) +* RequestURITooLarge: Error Classes. (line 264) +* request_class (werkzeug.test.EnvironBuilder attribute): API. + (line 467) +* responder() (in module werkzeug.wsgi): Convenience Helpers. + (line 6) +* Response (class in werkzeug.wrappers): Wrapper Classes. (line 716) +* response (werkzeug.datastructures.Authorization property): HTTP Related. + (line 651) +* response (werkzeug.wrappers.Response attribute): Wrapper Classes. + (line 1477) * ResponseCacheControl (class in werkzeug.datastructures): HTTP Related. - (line 508) -* ResponseStreamMixin (class in werkzeug.wrappers): Response Stream. - (line 6) -* retry_after (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 209) -* RFC; RFC 2231: Header Parsing<2>. (line 23) -* RFC; RFC 2231 <1>: Version 0 15 0. (line 55) -* RFC; RFC 2616: Quickstart. (line 8) -* RFC; RFC 2616 <1>: Header Parsing<2>. (line 8) -* RFC; RFC 2616 <2>: Header Utilities. (line 42) -* RFC; RFC 3987: Version 0 15 0. (line 61) -* RFC; RFC 7233: Version 1 0 0. (line 136) + (line 505) +* retry_after (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1489) +* RFC; RFC 2231: Header Parsing<2>. (line 23) +* RFC; RFC 2231 <1>: Version 0 15 0. (line 55) +* RFC; RFC 2616: Quickstart. (line 8) +* RFC; RFC 2616 <1>: Header Parsing<2>. (line 8) +* RFC; RFC 2616 <2>: Header Utilities. (line 48) +* RFC; RFC 2822: Datetime Functions. (line 26) +* RFC; RFC 2822 <1>: Datetime Functions. (line 46) +* RFC; RFC 3986: Version 2 1 0. (line 92) +* RFC; RFC 3987: Version 0 15 0. (line 61) +* RFC; RFC 6265: Version 2 0 0. (line 167) +* RFC; RFC 7233: Version 1 0 0. (line 136) +* root_path (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 618) +* root_url (werkzeug.wrappers.Request property): Wrapper Classes. + (line 623) * Rule (class in werkzeug.routing): Maps Rules and Adapters. - (line 492) -* RuleFactory (class in werkzeug.routing): Rule Factories. (line 6) -* RuleTemplate (class in werkzeug.routing): Rule Templates. (line 6) + (line 604) +* RuleFactory (class in werkzeug.routing): Rule Factories. (line 6) +* RuleTemplate (class in werkzeug.routing): Rule Templates. (line 6) * run_simple() (in module werkzeug.serving): Serving WSGI Applications. - (line 26) -* run_wsgi_app() (in module werkzeug.test): Testing API. (line 381) + (line 23) +* run_wsgi_app() (in module werkzeug.test): API. (line 622) * safe_join() (in module werkzeug.security): Security Helpers. - (line 71) -* safe_str_cmp() (in module werkzeug.security): Security Helpers. - (line 60) + (line 64) * save() (werkzeug.datastructures.FileStorage method): Others. - (line 67) -* scheme (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 365) -* script_root (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 371) + (line 67) +* scheme (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 628) +* script_root (werkzeug.wrappers.Request property): Wrapper Classes. + (line 633) * secure_filename() (in module werkzeug.utils): General Helpers. - (line 222) -* SecurityError: Error Classes. (line 338) -* server_name (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 251) -* server_port (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 255) -* server_protocol (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 259) -* ServiceUnavailable: Error Classes. (line 286) + (line 275) +* SecurityError: Error Classes. (line 660) +* send_file() (in module werkzeug.utils): General Helpers. (line 116) +* server (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 638) +* server_name (werkzeug.test.EnvironBuilder property): API. (line 555) +* server_port (werkzeug.test.EnvironBuilder property): API. (line 559) +* server_protocol (werkzeug.test.EnvironBuilder attribute): API. + (line 459) +* ServiceUnavailable: Error Classes. (line 573) * set() (werkzeug.datastructures.ContentRange method): HTTP Related. - (line 825) + (line 830) * set() (werkzeug.datastructures.Headers method): HTTP Related. - (line 176) + (line 173) * setdefault() (werkzeug.datastructures.Headers method): HTTP Related. - (line 196) + (line 193) * setdefault() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 239) + (line 239) * setlist() (werkzeug.datastructures.Headers method): HTTP Related. - (line 210) + (line 207) * setlist() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 253) + (line 253) * setlistdefault() (werkzeug.datastructures.Headers method): HTTP Related. - (line 223) + (line 220) * setlistdefault() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 274) + (line 274) * set_basic() (werkzeug.datastructures.WWWAuthenticate method): HTTP Related. - (line 728) -* set_cookie() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 836) -* set_data() (werkzeug.wrappers.BaseResponse method): Base Wrappers. - (line 881) + (line 733) +* set_cookie() (werkzeug.test.Client method): API. (line 43) +* set_cookie() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1500) +* set_data() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1550) * set_digest() (werkzeug.datastructures.WWWAuthenticate method): HTTP Related. - (line 732) -* set_etag() (werkzeug.wrappers.ETagResponseMixin method): ETag. - (line 154) -* shallow (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 62) + (line 737) +* set_etag() (werkzeug.wrappers.Response method): Wrapper Classes. + (line 1564) +* shallow (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 643) * SharedDataMiddleware (class in werkzeug.middleware.shared_data): Serve Shared Static Files. - (line 6) -* stale (werkzeug.datastructures.WWWAuthenticate attribute): HTTP Related. - (line 737) -* start (werkzeug.datastructures.ContentRange attribute): HTTP Related. - (line 829) -* status (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 890) -* status_code (werkzeug.wrappers.BaseResponse attribute): Base Wrappers. - (line 529) -* status_code (werkzeug.wrappers.BaseResponse attribute) <1>: Base Wrappers. - (line 894) -* stop (werkzeug.datastructures.ContentRange attribute): HTTP Related. - (line 833) + (line 6) +* stale (werkzeug.datastructures.WWWAuthenticate property): HTTP Related. + (line 742) +* start (werkzeug.datastructures.ContentRange property): HTTP Related. + (line 834) +* status (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1578) +* status_code (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1582) +* stop (werkzeug.datastructures.ContentRange property): HTTP Related. + (line 838) * stream (werkzeug.datastructures.FileStorage attribute): Others. - (line 16) -* stream (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 375) -* stream (werkzeug.wrappers.ResponseStreamMixin attribute): Response Stream. - (line 13) -* string (werkzeug.useragents.UserAgent attribute): UserAgent Parsing. - (line 12) -* Subdomain (class in werkzeug.routing): Rule Factories. (line 18) -* Submount (class in werkzeug.routing): Rule Factories. (line 37) -* s_maxage (werkzeug.datastructures.ResponseCacheControl attribute): HTTP Related. - (line 559) + (line 16) +* stream (werkzeug.wrappers.Request property): Wrapper Classes. + (line 649) +* stream (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1586) +* string (werkzeug.user_agent.UserAgent attribute): User Agent API. + (line 40) +* Subdomain (class in werkzeug.routing): Rule Factories. (line 24) +* Submount (class in werkzeug.routing): Rule Factories. (line 54) +* s_maxage (werkzeug.datastructures.ResponseCacheControl property): HTTP Related. + (line 559) * tell() (werkzeug.wsgi.LimitedStream method): Iterator / Stream Helpers. - (line 144) + (line 191) * test() (werkzeug.routing.MapAdapter method): Maps Rules and Adapters. - (line 478) + (line 586) +* TestResponse (class in werkzeug.test): API. (line 264) * test_app() (in module werkzeug.testapp): Convenience Helpers. - (line 17) -* TooManyRequests: Error Classes. (line 217) -* top (werkzeug.local.LocalStack attribute): Context Locals. (line 178) + (line 24) +* TooManyRequests: Error Classes. (line 442) +* top (werkzeug.local.LocalStack property): Context Locals. (line 209) * to_content_range_header() (werkzeug.datastructures.Range method): HTTP Related. - (line 801) + (line 806) * to_dict() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 298) + (line 298) * to_header() (werkzeug.datastructures.Accept method): HTTP Related. - (line 433) + (line 427) +* to_header() (werkzeug.datastructures.Authorization method): HTTP Related. + (line 657) * to_header() (werkzeug.datastructures.ETags method): HTTP Related. - (line 598) + (line 598) * to_header() (werkzeug.datastructures.HeaderSet method): HTTP Related. - (line 344) + (line 338) * to_header() (werkzeug.datastructures.IfRange method): HTTP Related. - (line 768) + (line 773) * to_header() (werkzeug.datastructures.Range method): HTTP Related. - (line 806) + (line 811) * to_header() (werkzeug.datastructures.WWWAuthenticate method): HTTP Related. - (line 742) -* to_iri_tuple() (werkzeug.urls.BaseURL method): werkzeug urls. - (line 107) -* to_uri_tuple() (werkzeug.urls.BaseURL method): werkzeug urls. - (line 117) -* to_url() (werkzeug.urls.BaseURL method): werkzeug urls. (line 126) + (line 747) +* to_header() (werkzeug.user_agent.UserAgent method): User Agent API. + (line 44) +* to_iri_tuple() (werkzeug.urls.BaseURL method): URL Helpers<2>. + (line 152) +* to_uri_tuple() (werkzeug.urls.BaseURL method): URL Helpers<2>. + (line 165) +* to_url() (werkzeug.urls.BaseURL method): URL Helpers<2>. (line 177) * to_wsgi_list() (werkzeug.datastructures.Headers method): HTTP Related. - (line 242) -* trace() (werkzeug.test.Client method): Testing API. (line 361) -* trusted_hosts (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 393) -* type (werkzeug.datastructures.WWWAuthenticate attribute): HTTP Related. - (line 746) + (line 239) +* trace() (werkzeug.test.Client method): API. (line 250) +* type (werkzeug.datastructures.WWWAuthenticate property): HTTP Related. + (line 751) * TypeConversionDict (class in werkzeug.datastructures): General Purpose. - (line 11) -* Unauthorized: Error Classes. (line 16) -* UnavailableForLegalReasons: Error Classes. (line 244) -* unescape() (in module werkzeug.utils): HTML Helpers. (line 50) + (line 11) +* Unauthorized: Error Classes. (line 26) +* UnavailableForLegalReasons: Error Classes. (line 489) * UnicodeConverter (class in werkzeug.routing): Built-in Converters. - (line 10) -* units (werkzeug.datastructures.ContentRange attribute): HTTP Related. - (line 838) + (line 10) +* units (werkzeug.datastructures.ContentRange property): HTTP Related. + (line 843) * units (werkzeug.datastructures.Range attribute): HTTP Related. - (line 810) -* UnprocessableEntity: Error Classes. (line 180) + (line 815) +* UnprocessableEntity: Error Classes. (line 365) * unquote_etag() (in module werkzeug.http): Conditional Response Helpers. - (line 29) + (line 36) * unquote_header_value() (in module werkzeug.http): Header Utilities. - (line 89) + (line 123) * unset() (werkzeug.datastructures.ContentRange method): HTTP Related. - (line 842) -* UnsupportedMediaType: Error Classes. (line 143) + (line 847) +* UnsupportedMediaType: Error Classes. (line 281) * update() (werkzeug.datastructures.Headers method): HTTP Related. - (line 252) + (line 246) * update() (werkzeug.datastructures.HeaderSet method): HTTP Related. - (line 348) + (line 342) * update() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 312) + (line 312) * update() (werkzeug.routing.Map method): Maps Rules and Adapters. - (line 206) -* uri (werkzeug.datastructures.Authorization attribute): HTTP Related. - (line 659) -* uri_to_iri() (in module werkzeug.urls): werkzeug urls. (line 263) -* URL (class in werkzeug.urls): werkzeug urls. (line 203) -* url (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 406) -* url_charset (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 411) -* url_decode() (in module werkzeug.urls): werkzeug urls. (line 289) -* url_decode_stream() (in module werkzeug.urls): werkzeug urls. - (line 340) -* url_encode() (in module werkzeug.urls): werkzeug urls. (line 380) -* url_encode_stream() (in module werkzeug.urls): werkzeug urls. - (line 411) -* url_fix() (in module werkzeug.urls): werkzeug urls. (line 443) -* url_join() (in module werkzeug.urls): werkzeug urls. (line 461) -* url_parse() (in module werkzeug.urls): werkzeug urls. (line 476) -* url_quote() (in module werkzeug.urls): werkzeug urls. (line 496) -* url_quote_plus() (in module werkzeug.urls): werkzeug urls. (line 514) -* url_root (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 418) -* url_unparse() (in module werkzeug.urls): werkzeug urls. (line 529) -* url_unquote() (in module werkzeug.urls): werkzeug urls. (line 539) -* url_unquote_plus() (in module werkzeug.urls): werkzeug urls. - (line 556) -* UserAgent (class in werkzeug.useragents): UserAgent Parsing. - (line 6) -* UserAgentMixin (class in werkzeug.wrappers): User Agent. (line 6) -* username (werkzeug.datastructures.Authorization attribute): HTTP Related. - (line 665) -* username (werkzeug.urls.BaseURL attribute): werkzeug urls. (line 132) -* user_agent (werkzeug.wrappers.UserAgentMixin attribute): User Agent. - (line 12) + (line 254) +* uri (werkzeug.datastructures.Authorization property): HTTP Related. + (line 664) +* uri_to_iri() (in module werkzeug.urls): URL Helpers<2>. (line 321) +* URL (class in werkzeug.urls): URL Helpers<2>. (line 234) +* url (werkzeug.wrappers.Request property): Wrapper Classes. (line 667) +* url_charset (werkzeug.wrappers.Request property): Wrapper Classes. + (line 672) +* url_decode() (in module werkzeug.urls): URL Helpers<2>. (line 352) +* url_decode_stream() (in module werkzeug.urls): URL Helpers<2>. + (line 388) +* url_encode() (in module werkzeug.urls): URL Helpers<2>. (line 429) +* url_encode_stream() (in module werkzeug.urls): URL Helpers<2>. + (line 465) +* url_fix() (in module werkzeug.urls): URL Helpers<2>. (line 505) +* url_join() (in module werkzeug.urls): URL Helpers<2>. (line 526) +* url_parse() (in module werkzeug.urls): URL Helpers<2>. (line 547) +* url_quote() (in module werkzeug.urls): URL Helpers<2>. (line 571) +* url_quote_plus() (in module werkzeug.urls): URL Helpers<2>. + (line 598) +* url_root (werkzeug.wrappers.Request property): Wrapper Classes. + (line 679) +* url_unparse() (in module werkzeug.urls): URL Helpers<2>. (line 620) +* url_unquote() (in module werkzeug.urls): URL Helpers<2>. (line 634) +* url_unquote_plus() (in module werkzeug.urls): URL Helpers<2>. + (line 658) +* UserAgent (class in werkzeug.user_agent): User Agent API. (line 6) +* username (werkzeug.datastructures.Authorization property): HTTP Related. + (line 670) +* username (werkzeug.urls.BaseURL property): URL Helpers<2>. (line 186) +* user_agent (werkzeug.wrappers.Request property): Wrapper Classes. + (line 684) +* user_agent_class (werkzeug.wrappers.Request attribute): Wrapper Classes. + (line 695) * UUIDConverter (class in werkzeug.routing): Built-in Converters. - (line 115) -* validate_arguments() (in module werkzeug.utils): General Helpers. - (line 164) -* values (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 423) + (line 139) +* values (werkzeug.wrappers.Request property): Wrapper Classes. + (line 699) * values() (werkzeug.datastructures.Accept method): HTTP Related. - (line 437) + (line 431) * values() (werkzeug.datastructures.MultiDict method): General Purpose. - (line 332) -* vary (werkzeug.wrappers.CommonResponseDescriptorsMixin attribute): Common Descriptors. - (line 218) -* version (werkzeug.useragents.UserAgent attribute): UserAgent Parsing. - (line 116) -* want_form_data_parsed (werkzeug.wrappers.BaseRequest attribute): Base Wrappers. - (line 428) -* werkzeug.datastructures (module): Data Structures. (line 6) -* werkzeug.debug (module): Debugging Applications. - (line 6) -* werkzeug.exceptions (module): HTTP Exceptions. (line 6) -* werkzeug.filesystem (module): Filesystem Utilities. - (line 6) -* werkzeug.formparser (module): Form Data Parsing. (line 6) -* werkzeug.http (module): HTTP Utilities. (line 6) -* werkzeug.local (module): Context Locals. (line 6) -* werkzeug.middleware (module): Context Locals. (line 238) -* werkzeug.middleware.dispatcher (module): Serve Shared Static Files. - (line 87) -* werkzeug.middleware.http_proxy (module): Application Dispatcher. - (line 48) -* werkzeug.middleware.lint (module): Basic HTTP Proxy. (line 87) -* werkzeug.middleware.profiler (module): WSGI Protocol Linter. - (line 45) -* werkzeug.middleware.proxy_fix (module): Middleware. (line 8) -* werkzeug.middleware.shared_data (module): X-Forwarded-For Proxy Fix. - (line 92) -* werkzeug.routing (module): URL Routing. (line 6) -* werkzeug.security (module): Security Helpers. (line 6) -* werkzeug.serving (module): Serving WSGI Applications. - (line 6) -* werkzeug.test (module): Test Utilities. (line 6) -* werkzeug.urls (module): URL Helpers<2>. (line 6) -* werkzeug.useragents (module): UserAgent Parsing. (line 6) -* werkzeug.utils (module): HTML Helpers. (line 6) -* werkzeug.wrappers (module): Request / Response Objects. - (line 6) -* werkzeug.wsgi (module): WSGI Helpers. (line 6) + (line 332) +* vary (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1590) +* version (werkzeug.user_agent.UserAgent attribute): User Agent API. + (line 32) +* want_form_data_parsed (werkzeug.wrappers.Request property): Wrapper Classes. + (line 709) * wrap_file() (in module werkzeug.wsgi): Iterator / Stream Helpers. - (line 223) -* wsgi_version (werkzeug.test.EnvironBuilder attribute): Testing API. - (line 263) + (line 283) +* wsgi_version (werkzeug.test.EnvironBuilder attribute): API. + (line 463) * WWWAuthenticate (class in werkzeug.datastructures): HTTP Related. - (line 670) -* WWWAuthenticateMixin (class in werkzeug.wrappers): Authentication. - (line 16) -* www_authenticate (werkzeug.wrappers.WWWAuthenticateMixin attribute): Authentication. - (line 20) + (line 675) +* www_authenticate (werkzeug.wrappers.Response property): Wrapper Classes. + (line 1597)  Tag Table: -Node: Top301 -Ref: index doc458 -Ref: 17458 -Ref: Top-Footnote-17817 -Node: Getting Started7864 -Ref: index getting-started7961 -Ref: 187961 -Ref: index werkzeug7961 -Ref: 197961 -Ref: index wsgi7961 -Ref: 1a7961 -Node: Installation8077 -Ref: installation doc8169 -Ref: 1b8169 -Ref: installation id18169 -Ref: 1c8169 -Ref: installation installation8169 -Ref: 1d8169 -Node: Python Version8319 -Ref: installation python-version8405 -Ref: 1e8405 -Node: Dependencies8556 -Ref: installation dependencies8671 -Ref: 1f8671 -Node: Optional dependencies8795 -Ref: installation optional-dependencies8867 -Ref: 208867 -Ref: Optional dependencies-Footnote-19432 -Ref: Optional dependencies-Footnote-29485 -Ref: Optional dependencies-Footnote-39525 -Node: Virtual environments9568 -Ref: installation virtual-environments9685 -Ref: 219685 -Ref: installation watchdog9685 -Ref: 229685 -Ref: Virtual environments-Footnote-110668 -Node: Create an environment10732 -Ref: installation create-an-environment10845 -Ref: 2410845 -Ref: installation install-create-env10845 -Ref: 2510845 -Node: Activate the environment11265 -Ref: installation activate-the-environment11378 -Ref: 2611378 -Node: Install Werkzeug11664 -Ref: installation install-werkzeug11787 -Ref: 2711787 -Node: Living on the edge11976 -Ref: installation living-on-the-edge12049 -Ref: 2812049 -Node: Install virtualenv12309 -Ref: installation install-install-virtualenv12403 -Ref: 2312403 -Ref: installation install-virtualenv12403 -Ref: 2912403 -Ref: Install virtualenv-Footnote-113167 -Ref: Install virtualenv-Footnote-213213 -Node: Werkzeug Tutorial13258 -Ref: tutorial doc13369 -Ref: 2a13369 -Ref: tutorial get-pip-py13369 -Ref: 2b13369 -Ref: tutorial werkzeug-tutorial13369 -Ref: 2c13369 -Ref: Werkzeug Tutorial-Footnote-114917 -Ref: Werkzeug Tutorial-Footnote-214946 -Ref: Werkzeug Tutorial-Footnote-314978 -Ref: Werkzeug Tutorial-Footnote-415004 -Node: Introducing Shortly15055 -Ref: tutorial introducing-shortly15171 -Ref: 2d15171 -Ref: Introducing Shortly-Footnote-115836 -Ref: Introducing Shortly-Footnote-215862 -Node: Step 0 A Basic WSGI Introduction15888 -Ref: tutorial redis16040 -Ref: 2e16040 -Ref: tutorial step-0-a-basic-wsgi-introduction16040 -Ref: 2f16040 -Node: Step 1 Creating the Folders17975 -Ref: tutorial step-1-creating-the-folders18133 -Ref: 3018133 -Node: Step 2 The Base Structure18794 -Ref: tutorial step-2-the-base-structure18954 -Ref: 3118954 -Node: Intermezzo Running the Application22345 -Ref: tutorial intermezzo-running-the-application22500 -Ref: 3222500 -Node: Step 3 The Environment23021 -Ref: tutorial step-3-the-environment23169 -Ref: 3323169 -Node: Step 4 The Routing23990 -Ref: tutorial step-4-the-routing24125 -Ref: 3424125 -Node: Step 5 The First View26778 -Ref: tutorial step-5-the-first-view26911 -Ref: 3926911 -Node: Step 6 Redirect View29208 -Ref: tutorial step-6-redirect-view29341 -Ref: 3a29341 -Node: Step 7 Detail View30065 -Ref: tutorial step-7-detail-view30193 -Ref: 3b30193 -Ref: Step 7 Detail View-Footnote-131073 -Node: Step 8 Templates31134 -Ref: tutorial step-8-templates31258 -Ref: 3c31258 -Node: Step 9 The Style32914 -Ref: tutorial step-9-the-style33037 -Ref: 3d33037 -Node: Bonus Refinements34190 -Ref: tutorial bonus-refinements34288 -Ref: 3e34288 -Ref: Bonus Refinements-Footnote-134586 -Node: API Levels34659 -Ref: levels doc34768 -Ref: 3f34768 -Ref: levels api-levels34768 -Ref: 4034768 -Node: Example35187 -Ref: levels example35264 -Ref: 4135264 -Node: High or Low?36880 -Ref: levels high-or-low36957 -Ref: 4236957 -Node: Quickstart37613 -Ref: quickstart doc37696 -Ref: 4337696 -Ref: quickstart quickstart37696 -Ref: 4437696 -Ref: Quickstart-Footnote-138406 -Ref: Quickstart-Footnote-238455 -Node: WSGI Environment38504 -Ref: quickstart wsgi-environment38591 -Ref: 4538591 -Node: Enter Request39335 -Ref: quickstart enter-request39445 -Ref: 4639445 -Node: Header Parsing41746 -Ref: quickstart header-parsing41849 -Ref: 4741849 -Node: Responses44440 -Ref: quickstart responses44521 -Ref: 4844521 -Node: Serving and Testing48464 -Ref: index serving-and-testing48567 -Ref: 4948567 -Node: Serving WSGI Applications48698 -Ref: serving doc48804 -Ref: 4a48804 -Ref: serving module-werkzeug serving48804 -Ref: 1048804 -Ref: serving serving-wsgi-applications48804 -Ref: 4b48804 -Ref: serving werkzeug serving run_simple49617 -Ref: 4c49617 -Ref: serving werkzeug serving is_running_from_reloader53205 -Ref: 4e53205 -Ref: serving werkzeug serving make_ssl_devcert53386 -Ref: 4f53386 -Ref: Serving WSGI Applications-Footnote-154673 -Node: Reloader54739 -Ref: serving id154835 -Ref: 5154835 -Ref: serving reloader54835 -Ref: 4d54835 -Ref: Reloader-Footnote-156179 -Node: Colored Logging56222 -Ref: serving colored-logging56340 -Ref: 5256340 -Ref: Colored Logging-Footnote-156575 -Node: Virtual Hosts56615 -Ref: serving click56749 -Ref: 5356749 -Ref: serving virtual-hosts56749 -Ref: 5456749 -Ref: Virtual Hosts-Footnote-157849 -Node: Shutting Down The Server57898 -Ref: serving shutting-down-the-server58032 -Ref: 5658032 -Node: Troubleshooting58650 -Ref: serving troubleshooting58774 -Ref: 5758774 -Ref: Troubleshooting-Footnote-160321 -Node: SSL60370 -Ref: serving hosts-file60482 -Ref: 5860482 -Ref: serving ssl60482 -Ref: 5960482 -Node: Quickstart<2>60819 -Ref: serving quickstart60907 -Ref: 5a60907 -Node: Loading Contexts by Hand61797 -Ref: serving loading-contexts-by-hand61917 -Ref: 5b61917 -Node: Generating Certificates62362 -Ref: serving generating-certificates62487 -Ref: 5c62487 -Node: Adhoc Certificates62865 -Ref: serving adhoc-certificates62957 -Ref: 5d62957 -Node: Unix Sockets63530 -Ref: serving unix-sockets63618 -Ref: 5e63618 -Node: Test Utilities63930 -Ref: test doc64067 -Ref: 5f64067 -Ref: test module-werkzeug test64067 -Ref: 1164067 -Ref: test test-utilities64067 -Ref: 6064067 -Node: Diving In64529 -Ref: test diving-in64620 -Ref: 6164620 -Node: Environment Building65986 -Ref: test environment-building66097 -Ref: 6266097 -Node: Testing API67924 -Ref: test testing-api68017 -Ref: 6468017 -Ref: test werkzeug test EnvironBuilder68054 -Ref: 6368054 -Ref: test werkzeug test EnvironBuilder path72907 -Ref: 6e72907 -Ref: test werkzeug test EnvironBuilder charset72996 -Ref: 6f72996 -Ref: test werkzeug test EnvironBuilder headers73077 -Ref: 7073077 -Ref: test werkzeug test EnvironBuilder errors_stream73166 -Ref: 7173166 -Ref: test werkzeug test EnvironBuilder multithread73268 -Ref: 7273268 -Ref: test werkzeug test EnvironBuilder multiprocess73348 -Ref: 7373348 -Ref: test werkzeug test EnvironBuilder environ_base73430 -Ref: 7473430 -Ref: test werkzeug test EnvironBuilder environ_overrides73527 -Ref: 7573527 -Ref: test werkzeug test EnvironBuilder input_stream73655 -Ref: 6973655 -Ref: test werkzeug test EnvironBuilder args73935 -Ref: 6c73935 -Ref: test werkzeug test EnvironBuilder base_url74010 -Ref: 7674010 -Ref: test werkzeug test EnvironBuilder close74141 -Ref: 7774141 -Ref: test werkzeug test EnvironBuilder content_length74352 -Ref: 6a74352 -Ref: test werkzeug test EnvironBuilder content_type74575 -Ref: 6b74575 -Ref: test werkzeug test EnvironBuilder files74799 -Ref: 6874799 -Ref: test werkzeug test EnvironBuilder form74928 -Ref: 6774928 -Ref: test werkzeug test EnvironBuilder from_environ74999 -Ref: 7874999 -Ref: test werkzeug test EnvironBuilder get_environ75215 -Ref: 7975215 -Ref: test werkzeug test EnvironBuilder get_request75459 -Ref: 7a75459 -Ref: test werkzeug test EnvironBuilder json_dumps75842 -Ref: 6d75842 -Ref: test werkzeug test EnvironBuilder mimetype76151 -Ref: 7c76151 -Ref: test werkzeug test EnvironBuilder mimetype_params76273 -Ref: 7d76273 -Ref: test werkzeug test EnvironBuilder query_string76521 -Ref: 7e76521 -Ref: test werkzeug test EnvironBuilder request_class76668 -Ref: 7b76668 -Ref: test werkzeug test EnvironBuilder server_name76772 -Ref: 7f76772 -Ref: test werkzeug test EnvironBuilder server_port76867 -Ref: 8076867 -Ref: test werkzeug test EnvironBuilder server_protocol76973 -Ref: 8176973 -Ref: test werkzeug test EnvironBuilder wsgi_version77084 -Ref: 8277084 -Ref: test werkzeug test Client77183 -Ref: 8377183 -Ref: test werkzeug test Client open78342 -Ref: 6678342 -Ref: test werkzeug test Client get79734 -Ref: 8479734 -Ref: test werkzeug test Client patch79822 -Ref: 8579822 -Ref: test werkzeug test Client post79914 -Ref: 8679914 -Ref: test werkzeug test Client head80004 -Ref: 8780004 -Ref: test werkzeug test Client put80094 -Ref: 8880094 -Ref: test werkzeug test Client delete80182 -Ref: 8980182 -Ref: test werkzeug test Client options80276 -Ref: 8a80276 -Ref: test werkzeug test Client trace80372 -Ref: 8b80372 -Ref: test werkzeug test create_environ80464 -Ref: 6580464 -Ref: test werkzeug test run_wsgi_app81187 -Ref: 8c81187 -Node: Debugging Applications82109 -Ref: debug doc82212 -Ref: 8d82212 -Ref: debug debugging-applications82212 -Ref: 8e82212 -Ref: debug module-werkzeug debug82212 -Ref: 182212 -Node: Enabling the Debugger83246 -Ref: debug enabling-the-debugger83355 -Ref: 8f83355 -Ref: debug werkzeug debug DebuggedApplication83617 -Ref: 9083617 -Node: Using the Debugger85142 -Ref: debug using-the-debugger85272 -Ref: 9185272 -Node: Debugger PIN86745 -Ref: debug debugger-pin86868 -Ref: 9286868 -Node: Pasting Errors87839 -Ref: debug pasting-errors87935 -Ref: 9387935 -Ref: Pasting Errors-Footnote-188225 -Node: Reference88257 -Ref: index reference88355 -Ref: 9488355 -Node: Request / Response Objects88617 -Ref: wrappers doc88711 -Ref: 9588711 -Ref: wrappers module-werkzeug wrappers88711 -Ref: 1588711 -Ref: wrappers request-response-objects88711 -Ref: 9688711 -Ref: wrappers wrappers88711 -Ref: 9788711 -Node: How they Work89077 -Ref: wrappers how-they-work89202 -Ref: 9889202 -Node: Mutability and Reusability of Wrappers90572 -Ref: wrappers mutability-and-reusability-of-wrappers90719 -Ref: 9b90719 -Node: Base Wrappers91861 -Ref: wrappers base-wrappers92008 -Ref: 9c92008 -Ref: wrappers werkzeug wrappers BaseRequest92304 -Ref: 9d92304 -Ref: wrappers werkzeug wrappers BaseRequest environ94524 -Ref: 9f94524 -Ref: wrappers werkzeug wrappers BaseRequest shallow94643 -Ref: a094643 -Ref: wrappers werkzeug wrappers BaseRequest _get_file_stream94799 -Ref: a194799 -Ref: wrappers werkzeug wrappers BaseRequest access_route95956 -Ref: a295956 -Ref: wrappers werkzeug wrappers BaseRequest application96120 -Ref: a396120 -Ref: wrappers werkzeug wrappers BaseRequest args96825 -Ref: a496825 -Ref: wrappers werkzeug wrappers BaseRequest base_url97219 -Ref: a797219 -Ref: wrappers werkzeug wrappers BaseRequest charset97353 -Ref: aa97353 -Ref: wrappers werkzeug wrappers BaseRequest close97450 -Ref: ab97450 -Ref: wrappers werkzeug wrappers BaseRequest cookies97735 -Ref: ac97735 -Ref: wrappers werkzeug wrappers BaseRequest data97858 -Ref: ad97858 -Ref: wrappers werkzeug wrappers BaseRequest dict_storage_class98008 -Ref: ae98008 -Ref: wrappers werkzeug wrappers BaseRequest disable_data_descriptor98122 -Ref: af98122 -Ref: wrappers werkzeug wrappers BaseRequest encoding_errors98351 -Ref: b098351 -Ref: wrappers werkzeug wrappers BaseRequest files98478 -Ref: b198478 -Ref: wrappers werkzeug wrappers BaseRequest form99369 -Ref: b599369 -Ref: wrappers werkzeug wrappers BaseRequest form_data_parser_class99960 -Ref: b699960 -Ref: wrappers werkzeug wrappers BaseRequest from_values100070 -Ref: b8100070 -Ref: wrappers werkzeug wrappers BaseRequest full_path100874 -Ref: b9100874 -Ref: wrappers werkzeug wrappers BaseRequest get_data100971 -Ref: ba100971 -Ref: wrappers werkzeug wrappers BaseRequest headers102375 -Ref: bb102375 -Ref: wrappers werkzeug wrappers BaseRequest host102498 -Ref: bd102498 -Ref: wrappers werkzeug wrappers BaseRequest host_url102628 -Ref: be102628 -Ref: wrappers werkzeug wrappers BaseRequest is_multiprocess102748 -Ref: bf102748 -Ref: wrappers werkzeug wrappers BaseRequest is_multithread102911 -Ref: c0102911 -Ref: wrappers werkzeug wrappers BaseRequest is_run_once103056 -Ref: c1103056 -Ref: wrappers werkzeug wrappers BaseRequest is_secure103333 -Ref: c2103333 -Ref: wrappers werkzeug wrappers BaseRequest list_storage_class103412 -Ref: c3103412 -Ref: wrappers werkzeug wrappers BaseRequest make_form_data_parser103521 -Ref: c5103521 -Ref: wrappers werkzeug wrappers BaseRequest max_content_length103720 -Ref: c6103720 -Ref: wrappers werkzeug wrappers BaseRequest max_form_memory_size104265 -Ref: c9104265 -Ref: wrappers werkzeug wrappers BaseRequest method104800 -Ref: ca104800 -Ref: wrappers werkzeug wrappers BaseRequest parameter_storage_class104903 -Ref: a6104903 -Ref: wrappers werkzeug wrappers BaseRequest path105022 -Ref: cb105022 -Ref: wrappers werkzeug wrappers BaseRequest query_string105250 -Ref: cc105250 -Ref: wrappers werkzeug wrappers BaseRequest remote_addr105333 -Ref: cd105333 -Ref: wrappers werkzeug wrappers BaseRequest remote_user105411 -Ref: ce105411 -Ref: wrappers werkzeug wrappers BaseRequest scheme105616 -Ref: cf105616 -Ref: wrappers werkzeug wrappers BaseRequest script_root105714 -Ref: d0105714 -Ref: wrappers werkzeug wrappers BaseRequest stream105814 -Ref: d1105814 -Ref: wrappers werkzeug wrappers BaseRequest trusted_hosts106683 -Ref: a9106683 -Ref: wrappers werkzeug wrappers BaseRequest url107228 -Ref: a8107228 -Ref: wrappers werkzeug wrappers BaseRequest url_charset107347 -Ref: d2107347 -Ref: wrappers werkzeug wrappers BaseRequest url_root107515 -Ref: d3107515 -Ref: wrappers werkzeug wrappers BaseRequest values107673 -Ref: d4107673 -Ref: wrappers werkzeug wrappers BaseRequest want_form_data_parsed107827 -Ref: d6107827 -Ref: wrappers werkzeug wrappers BaseResponse108060 -Ref: d7108060 -Ref: wrappers werkzeug wrappers BaseResponse response111623 -Ref: db111623 -Ref: wrappers werkzeug wrappers BaseResponse headers111882 -Ref: dc111882 -Ref: wrappers werkzeug wrappers BaseResponse status_code111980 -Ref: dd111980 -Ref: wrappers werkzeug wrappers BaseResponse direct_passthrough112056 -Ref: de112056 -Ref: wrappers werkzeug wrappers BaseResponse __call__112496 -Ref: df112496 -Ref: wrappers werkzeug wrappers BaseResponse _ensure_sequence112835 -Ref: e0112835 -Ref: wrappers werkzeug wrappers BaseResponse autocorrect_location_header113108 -Ref: e1113108 -Ref: wrappers werkzeug wrappers BaseResponse automatically_set_content_length113320 -Ref: e2113320 -Ref: wrappers werkzeug wrappers BaseResponse calculate_content_length113544 -Ref: e3113544 -Ref: wrappers werkzeug wrappers BaseResponse call_on_close113666 -Ref: e4113666 -Ref: wrappers werkzeug wrappers BaseResponse charset113995 -Ref: e5113995 -Ref: wrappers werkzeug wrappers BaseResponse close114074 -Ref: e6114074 -Ref: wrappers werkzeug wrappers BaseResponse data114314 -Ref: e7114314 -Ref: wrappers werkzeug wrappers BaseResponse default_mimetype114433 -Ref: ea114433 -Ref: wrappers werkzeug wrappers BaseResponse default_status114539 -Ref: eb114539 -Ref: wrappers werkzeug wrappers BaseResponse delete_cookie114632 -Ref: ec114632 -Ref: wrappers werkzeug wrappers BaseResponse force_type115144 -Ref: d8115144 -Ref: wrappers werkzeug wrappers BaseResponse freeze116550 -Ref: ed116550 -Ref: wrappers werkzeug wrappers BaseResponse from_app116913 -Ref: ee116913 -Ref: wrappers werkzeug wrappers BaseResponse get_app_iter117741 -Ref: ef117741 -Ref: wrappers werkzeug wrappers BaseResponse get_data118362 -Ref: e8118362 -Ref: wrappers werkzeug wrappers BaseResponse get_wsgi_headers118892 -Ref: f1118892 -Ref: wrappers werkzeug wrappers BaseResponse get_wsgi_response120062 -Ref: f2120062 -Ref: wrappers werkzeug wrappers BaseResponse implicit_sequence_conversion120738 -Ref: f0120738 -Ref: wrappers werkzeug wrappers BaseResponse is_sequence121199 -Ref: f3121199 -Ref: wrappers werkzeug wrappers BaseResponse is_streamed121463 -Ref: f4121463 -Ref: wrappers werkzeug wrappers BaseResponse iter_encoded121975 -Ref: da121975 -Ref: wrappers werkzeug wrappers BaseResponse make_sequence122281 -Ref: f5122281 -Ref: wrappers werkzeug wrappers BaseResponse max_cookie_size122662 -Ref: f6122662 -Ref: wrappers werkzeug wrappers BaseResponse set_cookie123048 -Ref: f7123048 -Ref: wrappers werkzeug wrappers BaseResponse set_data124939 -Ref: e9124939 -Ref: wrappers werkzeug wrappers BaseResponse status125240 -Ref: f8125240 -Ref: Base Wrappers-Footnote-1125427 -Ref: Base Wrappers-Footnote-2125488 -Node: Mixin Classes125536 -Ref: wrappers mixin-classes125664 -Ref: f9125664 -Ref: wrappers werkzeug wrappers Request126338 -Ref: 99126338 -Ref: wrappers werkzeug wrappers Response126941 -Ref: 9a126941 -Node: Common Descriptors127747 -Ref: wrappers common-descriptors127841 -Ref: 105127841 -Ref: wrappers werkzeug wrappers CommonRequestDescriptorsMixin127896 -Ref: ff127896 -Ref: wrappers werkzeug wrappers CommonRequestDescriptorsMixin content_encoding128181 -Ref: 106128181 -Ref: wrappers werkzeug wrappers CommonRequestDescriptorsMixin content_length128627 -Ref: 107128627 -Ref: wrappers werkzeug wrappers CommonRequestDescriptorsMixin content_md5128908 -Ref: 108128908 -Ref: wrappers werkzeug wrappers CommonRequestDescriptorsMixin content_type129359 -Ref: 109129359 -Ref: wrappers werkzeug wrappers CommonRequestDescriptorsMixin date129642 -Ref: 10a129642 -Ref: wrappers werkzeug wrappers CommonRequestDescriptorsMixin max_forwards129846 -Ref: 10b129846 -Ref: wrappers werkzeug wrappers CommonRequestDescriptorsMixin mimetype130115 -Ref: 10c130115 -Ref: wrappers werkzeug wrappers CommonRequestDescriptorsMixin mimetype_params130403 -Ref: 10d130403 -Ref: wrappers werkzeug wrappers CommonRequestDescriptorsMixin pragma130619 -Ref: 10e130619 -Ref: wrappers werkzeug wrappers CommonRequestDescriptorsMixin referrer131030 -Ref: 10f131030 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin131334 -Ref: 104131334 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin age131596 -Ref: 110131596 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin allow131910 -Ref: 111131910 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin content_encoding132288 -Ref: 112132288 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin content_language132703 -Ref: 113132703 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin content_length132996 -Ref: 114132996 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin content_location133330 -Ref: 115133330 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin content_md5133626 -Ref: 116133626 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin content_security_policy134046 -Ref: 117134046 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin content_security_policy_report_only134238 -Ref: 118134238 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin content_type134477 -Ref: 119134477 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin date134760 -Ref: 11a134760 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin expires134964 -Ref: 11b134964 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin last_modified135184 -Ref: 11c135184 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin location135383 -Ref: 11d135383 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin mimetype135621 -Ref: 11e135621 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin mimetype_params135711 -Ref: 11f135711 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin retry_after135958 -Ref: 120135958 -Ref: wrappers werkzeug wrappers CommonResponseDescriptorsMixin vary136266 -Ref: 121136266 -Node: Response Stream136553 -Ref: wrappers response-stream136662 -Ref: 122136662 -Ref: wrappers werkzeug wrappers ResponseStreamMixin136711 -Ref: 103136711 -Ref: wrappers werkzeug wrappers ResponseStreamMixin stream136982 -Ref: 123136982 -Node: Accept137065 -Ref: wrappers accept137170 -Ref: 124137170 -Ref: wrappers werkzeug wrappers AcceptMixin137201 -Ref: fa137201 -Ref: wrappers werkzeug wrappers AcceptMixin accept_charsets137401 -Ref: 126137401 -Ref: wrappers werkzeug wrappers AcceptMixin accept_encodings137534 -Ref: 128137534 -Ref: wrappers werkzeug wrappers AcceptMixin accept_languages137759 -Ref: 129137759 -Ref: wrappers werkzeug wrappers AcceptMixin accept_mimetypes137894 -Ref: 12b137894 -Node: Authentication138026 -Ref: wrappers authentication138120 -Ref: 12d138120 -Ref: wrappers werkzeug wrappers AuthorizationMixin138167 -Ref: fd138167 -Ref: wrappers werkzeug wrappers AuthorizationMixin authorization138379 -Ref: 12e138379 -Ref: wrappers werkzeug wrappers WWWAuthenticateMixin138472 -Ref: 101138472 -Ref: wrappers werkzeug wrappers WWWAuthenticateMixin www_authenticate138596 -Ref: 130138596 -Node: CORS138697 -Ref: wrappers cors138789 -Ref: 131138789 -Ref: wrappers werkzeug wrappers cors CORSRequestMixin138816 -Ref: fe138816 -Ref: wrappers werkzeug wrappers cors CORSRequestMixin access_control_request_headers139023 -Ref: 132139023 -Ref: wrappers werkzeug wrappers cors CORSRequestMixin access_control_request_method139317 -Ref: 134139317 -Ref: wrappers werkzeug wrappers cors CORSRequestMixin origin139608 -Ref: 136139608 -Ref: wrappers werkzeug wrappers cors CORSResponseMixin139810 -Ref: 102139810 -Ref: wrappers werkzeug wrappers cors CORSResponseMixin access_control_allow_credentials140019 -Ref: 138140019 -Ref: wrappers werkzeug wrappers cors CORSResponseMixin access_control_allow_headers140281 -Ref: 133140281 -Ref: wrappers werkzeug wrappers cors CORSResponseMixin access_control_allow_methods140399 -Ref: 135140399 -Ref: wrappers werkzeug wrappers cors CORSResponseMixin access_control_allow_origin140516 -Ref: 137140516 -Ref: wrappers werkzeug wrappers cors CORSResponseMixin access_control_expose_headers140660 -Ref: 139140660 -Ref: wrappers werkzeug wrappers cors CORSResponseMixin access_control_max_age140785 -Ref: 13a140785 -Node: ETag140924 -Ref: wrappers etag141012 -Ref: 13b141012 -Ref: wrappers werkzeug wrappers ETagRequestMixin141039 -Ref: fb141039 -Ref: wrappers werkzeug wrappers ETagRequestMixin cache_control141303 -Ref: 13c141303 -Ref: wrappers werkzeug wrappers ETagRequestMixin if_match141440 -Ref: 13e141440 -Ref: wrappers werkzeug wrappers ETagRequestMixin if_modified_since141589 -Ref: 140141589 -Ref: wrappers werkzeug wrappers ETagRequestMixin if_none_match141701 -Ref: 141141701 -Ref: wrappers werkzeug wrappers ETagRequestMixin if_range141870 -Ref: 142141870 -Ref: wrappers werkzeug wrappers ETagRequestMixin if_unmodified_since142021 -Ref: 144142021 -Ref: wrappers werkzeug wrappers ETagRequestMixin range142137 -Ref: 145142137 -Ref: wrappers werkzeug wrappers ETagResponseMixin142280 -Ref: 100142280 -Ref: wrappers werkzeug wrappers ETagResponseMixin accept_ranges142757 -Ref: 148142757 -Ref: wrappers werkzeug wrappers ETagResponseMixin add_etag143058 -Ref: 149143058 -Ref: wrappers werkzeug wrappers ETagResponseMixin cache_control143185 -Ref: 14a143185 -Ref: wrappers werkzeug wrappers ETagResponseMixin content_range143400 -Ref: 14b143400 -Ref: wrappers werkzeug wrappers ETagResponseMixin freeze143598 -Ref: 147143598 -Ref: wrappers werkzeug wrappers ETagResponseMixin get_etag143872 -Ref: 14d143872 -Ref: wrappers werkzeug wrappers ETagResponseMixin make_conditional144034 -Ref: 14e144034 -Ref: wrappers werkzeug wrappers ETagResponseMixin set_etag146122 -Ref: 151146122 -Ref: ETag-Footnote-1146272 -Node: User Agent146332 -Ref: wrappers user-agent146407 -Ref: 152146407 -Ref: wrappers werkzeug wrappers UserAgentMixin146446 -Ref: fc146446 -Ref: wrappers werkzeug wrappers UserAgentMixin user_agent146677 -Ref: 154146677 -Node: Extra Mixin Classes146744 -Ref: wrappers extra-mixin-classes146850 -Ref: 155146850 -Node: JSON147171 -Ref: wrappers json147233 -Ref: 156147233 -Ref: wrappers werkzeug wrappers json JSONMixin147260 -Ref: 157147260 -Ref: wrappers werkzeug wrappers json JSONMixin get_json147526 -Ref: 158147526 -Ref: wrappers werkzeug wrappers json JSONMixin is_json148228 -Ref: 159148228 -Ref: wrappers werkzeug wrappers json JSONMixin json148380 -Ref: 15b148380 -Ref: wrappers werkzeug wrappers json JSONMixin json_module148598 -Ref: 15c148598 -Ref: wrappers werkzeug wrappers json JSONMixin on_json_loading_failed148813 -Ref: 15a148813 -Ref: JSON-Footnote-1149153 -Ref: JSON-Footnote-2149206 -Ref: JSON-Footnote-3149270 -Node: URL Routing149334 -Ref: routing doc149449 -Ref: 15e149449 -Ref: routing module-werkzeug routing149449 -Ref: e149449 -Ref: routing routing149449 -Ref: 55149449 -Ref: routing url-routing149449 -Ref: 15f149449 -Ref: URL Routing-Footnote-1150186 -Node: Quickstart<3>150235 -Ref: routing quickstart150318 -Ref: 160150318 -Ref: routing routes150318 -Ref: 161150318 -Node: Rule Format152466 -Ref: routing rule-format152577 -Ref: 165152577 -Node: Built-in Converters153593 -Ref: routing built-in-converters153714 -Ref: 166153714 -Ref: routing werkzeug routing UnicodeConverter153918 -Ref: 168153918 -Ref: routing werkzeug routing PathConverter154591 -Ref: 169154591 -Ref: routing werkzeug routing AnyConverter154906 -Ref: 16a154906 -Ref: routing werkzeug routing IntegerConverter155302 -Ref: 16b155302 -Ref: routing werkzeug routing FloatConverter156172 -Ref: 16c156172 -Ref: routing werkzeug routing UUIDConverter156826 -Ref: 16d156826 -Node: Maps Rules and Adapters157047 -Ref: routing maps-rules-and-adapters157171 -Ref: 16e157171 -Ref: routing werkzeug routing Map157234 -Ref: 35157234 -Ref: routing werkzeug routing Map converters159736 -Ref: 167159736 -Ref: routing werkzeug routing Map add160092 -Ref: 16f160092 -Ref: routing werkzeug routing Map bind160353 -Ref: 171160353 -Ref: routing werkzeug routing Map bind_to_environ161791 -Ref: 172161791 -Ref: routing werkzeug routing Map default_converters164027 -Ref: 173164027 -Ref: routing werkzeug routing Map is_endpoint_expecting164590 -Ref: 174164590 -Ref: routing werkzeug routing Map iter_rules165265 -Ref: 175165265 -Ref: routing werkzeug routing Map lock_class165518 -Ref: 176165518 -Ref: routing werkzeug routing Map update165631 -Ref: 177165631 -Ref: routing werkzeug routing MapAdapter165786 -Ref: 162165786 -Ref: routing werkzeug routing MapAdapter allowed_methods166102 -Ref: 178166102 -Ref: routing werkzeug routing MapAdapter build166250 -Ref: 179166250 -Ref: routing werkzeug routing MapAdapter dispatch169552 -Ref: 17a169552 -Ref: routing werkzeug routing MapAdapter get_default_redirect171824 -Ref: 17b171824 -Ref: routing werkzeug routing MapAdapter get_host172046 -Ref: 17c172046 -Ref: routing werkzeug routing MapAdapter make_alias_redirect_url172263 -Ref: 17d172263 -Ref: routing werkzeug routing MapAdapter make_redirect_url172425 -Ref: 17e172425 -Ref: routing werkzeug routing MapAdapter match172580 -Ref: 163172580 -Ref: routing werkzeug routing MapAdapter test176838 -Ref: 17f176838 -Ref: routing werkzeug routing Rule177327 -Ref: 36177327 -Ref: routing werkzeug routing Rule empty183330 -Ref: 180183330 -Node: Rule Factories183603 -Ref: routing rule-factories183722 -Ref: 181183722 -Ref: routing werkzeug routing RuleFactory183765 -Ref: 170183765 -Ref: routing werkzeug routing RuleFactory get_rules184051 -Ref: 182184051 -Ref: routing werkzeug routing Subdomain184200 -Ref: 183184200 -Ref: routing werkzeug routing Submount184947 -Ref: 184184947 -Ref: routing werkzeug routing EndpointPrefix185404 -Ref: 185185404 -Node: Rule Templates185873 -Ref: routing rule-templates185986 -Ref: 186185986 -Ref: routing werkzeug routing RuleTemplate186029 -Ref: 187186029 -Node: Custom Converters186696 -Ref: routing custom-converters186808 -Ref: 188186808 -Node: Host Matching188981 -Ref: routing host-matching189089 -Ref: 189189089 -Node: WebSockets189854 -Ref: routing websockets189936 -Ref: 18a189936 -Node: WSGI Helpers190889 -Ref: wsgi doc190998 -Ref: 18b190998 -Ref: wsgi module-werkzeug wsgi190998 -Ref: 16190998 -Ref: wsgi wsgi-helpers190998 -Ref: 18c190998 -Node: Iterator / Stream Helpers191457 -Ref: wsgi iterator-stream-helpers191557 -Ref: 18d191557 -Ref: wsgi werkzeug wsgi ClosingIterator191725 -Ref: 18e191725 -Ref: wsgi werkzeug wsgi FileWrapper192658 -Ref: 18f192658 -Ref: wsgi werkzeug wsgi LimitedStream193378 -Ref: 190193378 -Ref: wsgi werkzeug wsgi LimitedStream exhaust195055 -Ref: 196195055 -Ref: wsgi werkzeug wsgi LimitedStream is_exhausted195371 -Ref: 197195371 -Ref: wsgi werkzeug wsgi LimitedStream on_disconnect195473 -Ref: 198195473 -Ref: wsgi werkzeug wsgi LimitedStream on_exhausted195760 -Ref: 191195760 -Ref: wsgi werkzeug wsgi LimitedStream read195959 -Ref: 192195959 -Ref: wsgi werkzeug wsgi LimitedStream readable196149 -Ref: 19a196149 -Ref: wsgi werkzeug wsgi LimitedStream readline196284 -Ref: 194196284 -Ref: wsgi werkzeug wsgi LimitedStream readlines196366 -Ref: 193196366 -Ref: wsgi werkzeug wsgi LimitedStream tell196659 -Ref: 19b196659 -Ref: wsgi werkzeug wsgi make_line_iter196763 -Ref: 195196763 -Ref: wsgi werkzeug wsgi make_chunk_iter198306 -Ref: 19c198306 -Ref: wsgi werkzeug wsgi wrap_file199480 -Ref: 14f199480 -Ref: Iterator / Stream Helpers-Footnote-1200277 -Node: Environ Helpers200326 -Ref: wsgi environ-helpers200454 -Ref: 19d200454 -Ref: wsgi werkzeug wsgi get_host200615 -Ref: 19e200615 -Ref: wsgi werkzeug wsgi get_content_length201388 -Ref: 1a1201388 -Ref: wsgi werkzeug wsgi get_input_stream201732 -Ref: 1a2201732 -Ref: wsgi werkzeug wsgi get_current_url202653 -Ref: 1a3202653 -Ref: wsgi werkzeug wsgi get_query_string204430 -Ref: 1a5204430 -Ref: wsgi werkzeug wsgi get_script_name204849 -Ref: 1a6204849 -Ref: wsgi werkzeug wsgi get_path_info205494 -Ref: 1a7205494 -Ref: wsgi werkzeug wsgi pop_path_info206140 -Ref: 1a8206140 -Ref: wsgi werkzeug wsgi peek_path_info207087 -Ref: 1a9207087 -Ref: wsgi werkzeug wsgi extract_path_info207807 -Ref: 1aa207807 -Ref: wsgi werkzeug wsgi host_is_trusted209630 -Ref: 19f209630 -Node: Convenience Helpers210068 -Ref: wsgi convenience-helpers210198 -Ref: 1ab210198 -Ref: wsgi werkzeug wsgi responder210251 -Ref: 1ac210251 -Ref: wsgi werkzeug testapp test_app210569 -Ref: 1ad210569 -Node: Bytes Strings and Encodings211102 -Ref: wsgi bytes-strings-and-encodings211250 -Ref: 1ae211250 -Ref: Bytes Strings and Encodings-Footnote-1212673 -Node: Raw Request URI and Path Encoding212738 -Ref: wsgi pep-3333212858 -Ref: 1af212858 -Ref: wsgi raw-request-uri-and-path-encoding212858 -Ref: 1b0212858 -Ref: Raw Request URI and Path Encoding-Footnote-1213988 -Node: Filesystem Utilities214053 -Ref: filesystem doc214165 -Ref: 1b1214165 -Ref: filesystem filesystem-utilities214165 -Ref: 1b2214165 -Ref: filesystem module-werkzeug filesystem214259 -Ref: 3214259 -Ref: filesystem werkzeug filesystem BrokenFilesystemWarning214261 -Ref: 1b3214261 -Ref: filesystem werkzeug filesystem get_filesystem_encoding214425 -Ref: 1b4214425 -Node: HTTP Utilities215018 -Ref: http doc215133 -Ref: 1b6215133 -Ref: http http-utilities215133 -Ref: 1b7215133 -Ref: http module-werkzeug http215133 -Ref: 5215133 -Node: Date Functions215596 -Ref: http date-functions215689 -Ref: 1b8215689 -Ref: http werkzeug http cookie_date216050 -Ref: 1b9216050 -Ref: http werkzeug http http_date216577 -Ref: 1bb216577 -Ref: http werkzeug http parse_date217076 -Ref: 1ba217076 -Ref: Date Functions-Footnote-1217622 -Ref: Date Functions-Footnote-2217696 -Node: Header Parsing<2>217770 -Ref: http header-parsing217888 -Ref: 1bc217888 -Ref: http werkzeug http parse_options_header218183 -Ref: 1be218183 -Ref: http werkzeug http parse_set_header219031 -Ref: 1c0219031 -Ref: http werkzeug http parse_list_header219874 -Ref: 1c3219874 -Ref: http werkzeug http parse_dict_header220717 -Ref: 1bf220717 -Ref: http werkzeug http parse_accept_header221748 -Ref: 1c4221748 -Ref: http werkzeug http parse_cache_control_header222502 -Ref: 1c5222502 -Ref: http werkzeug http parse_authorization_header223315 -Ref: 1c6223315 -Ref: http werkzeug http parse_www_authenticate_header223742 -Ref: 1c7223742 -Ref: http werkzeug http parse_if_range_header224213 -Ref: 1c9224213 -Ref: http werkzeug http parse_range_header224406 -Ref: 1ca224406 -Ref: http werkzeug http parse_content_range_header224743 -Ref: 1cb224743 -Ref: Header Parsing<2>-Footnote-1225239 -Ref: Header Parsing<2>-Footnote-2225288 -Ref: Header Parsing<2>-Footnote-3225337 -Ref: Header Parsing<2>-Footnote-4225398 -Ref: Header Parsing<2>-Footnote-5225459 -Ref: Header Parsing<2>-Footnote-6225520 -Node: Header Utilities225581 -Ref: http header-utilities225692 -Ref: 1cc225692 -Ref: http werkzeug http is_entity_header226057 -Ref: 1cd226057 -Ref: http werkzeug http is_hop_by_hop_header226317 -Ref: 1ce226317 -Ref: http werkzeug http remove_entity_headers226624 -Ref: 1cf226624 -Ref: http werkzeug http remove_hop_by_hop_headers227307 -Ref: 1d0227307 -Ref: http werkzeug http is_byte_range_valid227592 -Ref: 1d1227592 -Ref: http werkzeug http quote_header_value227763 -Ref: 1d2227763 -Ref: http werkzeug http unquote_header_value228172 -Ref: 1d3228172 -Ref: http werkzeug http dump_header228527 -Ref: 1c2228527 -Ref: Header Utilities-Footnote-1229307 -Node: Cookies229356 -Ref: http cookies229478 -Ref: 1d4229478 -Ref: http werkzeug http parse_cookie229507 -Ref: 1d5229507 -Ref: http werkzeug http dump_cookie230511 -Ref: 1d6230511 -Ref: Cookies-Footnote-1233249 -Node: Conditional Response Helpers233297 -Ref: http conditional-response-helpers233412 -Ref: 1d7233412 -Ref: http werkzeug http parse_etags233551 -Ref: 1d8233551 -Ref: http werkzeug http quote_etag233732 -Ref: 1d9233732 -Ref: http werkzeug http unquote_etag233942 -Ref: 1da233942 -Ref: http werkzeug http generate_etag234254 -Ref: 1db234254 -Ref: http werkzeug http is_resource_modified234342 -Ref: 1dc234342 -Node: Constants235224 -Ref: http constants235349 -Ref: 1dd235349 -Ref: http werkzeug http HTTP_STATUS_CODES235382 -Ref: 1de235382 -Node: Form Data Parsing235617 -Ref: http form-data-parsing235705 -Ref: 1df235705 -Ref: http module-werkzeug formparser235705 -Ref: 4235705 -Ref: http werkzeug formparser FormDataParser236965 -Ref: b7236965 -Ref: http werkzeug formparser parse_form_data238502 -Ref: 1e0238502 -Ref: http werkzeug formparser parse_multipart_headers240709 -Ref: 1e1240709 -Node: Data Structures241132 -Ref: datastructures doc241236 -Ref: 1e2241236 -Ref: datastructures data-structures241236 -Ref: 1e3241236 -Ref: datastructures module-werkzeug datastructures241236 -Ref: 0241236 -Node: General Purpose241550 -Ref: datastructures general-purpose241640 -Ref: 1e4241640 -Ref: datastructures werkzeug datastructures TypeConversionDict241923 -Ref: 1e6241923 -Ref: datastructures werkzeug datastructures TypeConversionDict get242228 -Ref: 1e7242228 -Ref: datastructures werkzeug datastructures ImmutableTypeConversionDict243268 -Ref: 1e8243268 -Ref: datastructures werkzeug datastructures ImmutableTypeConversionDict copy243449 -Ref: 1e9243449 -Ref: datastructures werkzeug datastructures MultiDict243717 -Ref: b2243717 -Ref: datastructures werkzeug datastructures MultiDict add245408 -Ref: 1ea245408 -Ref: datastructures werkzeug datastructures MultiDict clear245642 -Ref: 1eb245642 -Ref: datastructures werkzeug datastructures MultiDict copy245703 -Ref: 1ec245703 -Ref: datastructures werkzeug datastructures MultiDict deepcopy245778 -Ref: 1ed245778 -Ref: datastructures werkzeug datastructures MultiDict fromkeys245863 -Ref: 1ee245863 -Ref: datastructures werkzeug datastructures MultiDict get245987 -Ref: 1ef245987 -Ref: datastructures werkzeug datastructures MultiDict getlist247027 -Ref: 1f0247027 -Ref: datastructures werkzeug datastructures MultiDict items247723 -Ref: 1f1247723 -Ref: datastructures werkzeug datastructures MultiDict keys248039 -Ref: 1f2248039 -Ref: datastructures werkzeug datastructures MultiDict lists248130 -Ref: 1f3248130 -Ref: datastructures werkzeug datastructures MultiDict listvalues248290 -Ref: 1f4248290 -Ref: datastructures werkzeug datastructures MultiDict pop248625 -Ref: 1f5248625 -Ref: datastructures werkzeug datastructures MultiDict popitem249160 -Ref: 1f6249160 -Ref: datastructures werkzeug datastructures MultiDict popitemlist249227 -Ref: 1f7249227 -Ref: datastructures werkzeug datastructures MultiDict poplist249316 -Ref: 1f8249316 -Ref: datastructures werkzeug datastructures MultiDict setdefault249590 -Ref: 1f9249590 -Ref: datastructures werkzeug datastructures MultiDict setlist250034 -Ref: 1fa250034 -Ref: datastructures werkzeug datastructures MultiDict setlistdefault250674 -Ref: 1fb250674 -Ref: datastructures werkzeug datastructures MultiDict to_dict251449 -Ref: 1fc251449 -Ref: datastructures werkzeug datastructures MultiDict update251943 -Ref: 1fd251943 -Ref: datastructures werkzeug datastructures MultiDict values252575 -Ref: 1fe252575 -Ref: datastructures werkzeug datastructures OrderedMultiDict252692 -Ref: 1ff252692 -Ref: datastructures werkzeug datastructures ImmutableMultiDict253359 -Ref: a5253359 -Ref: datastructures werkzeug datastructures ImmutableMultiDict copy253495 -Ref: 200253495 -Ref: datastructures werkzeug datastructures ImmutableOrderedMultiDict253764 -Ref: 201253764 -Ref: datastructures werkzeug datastructures ImmutableOrderedMultiDict copy253925 -Ref: 202253925 -Ref: datastructures werkzeug datastructures CombinedMultiDict254194 -Ref: d5254194 -Ref: datastructures werkzeug datastructures ImmutableDict255152 -Ref: 203255152 -Ref: datastructures werkzeug datastructures ImmutableDict copy255257 -Ref: 204255257 -Ref: datastructures werkzeug datastructures ImmutableList255526 -Ref: c4255526 -Ref: datastructures werkzeug datastructures FileMultiDict255647 -Ref: 1e5255647 -Ref: datastructures werkzeug datastructures FileMultiDict add_file255911 -Ref: 205255911 -Ref: General Purpose-Footnote-1256425 -Ref: General Purpose-Footnote-2256494 -Ref: General Purpose-Footnote-3256563 -Ref: General Purpose-Footnote-4256625 -Ref: General Purpose-Footnote-5256694 -Ref: General Purpose-Footnote-6256763 -Ref: General Purpose-Footnote-7256832 -Ref: General Purpose-Footnote-8256893 -Ref: General Purpose-Footnote-9256954 -Ref: General Purpose-Footnote-10257015 -Ref: General Purpose-Footnote-11257078 -Ref: General Purpose-Footnote-12257141 -Ref: General Purpose-Footnote-13257203 -Ref: General Purpose-Footnote-14257266 -Node: HTTP Related257328 -Ref: datastructures http-datastructures257433 -Ref: 1bd257433 -Ref: datastructures http-related257433 -Ref: 206257433 -Ref: datastructures werkzeug datastructures Headers257472 -Ref: d9257472 -Ref: datastructures werkzeug datastructures Headers add258995 -Ref: 207258995 -Ref: datastructures werkzeug datastructures Headers add_header259593 -Ref: 208259593 -Ref: datastructures werkzeug datastructures Headers clear259805 -Ref: 209259805 -Ref: datastructures werkzeug datastructures Headers extend259863 -Ref: 20a259863 -Ref: datastructures werkzeug datastructures Headers get260406 -Ref: 20c260406 -Ref: datastructures werkzeug datastructures Headers get_all261660 -Ref: 20d261660 -Ref: datastructures werkzeug datastructures Headers getlist261847 -Ref: 20e261847 -Ref: datastructures werkzeug datastructures Headers has_key262729 -Ref: 20f262729 -Ref: datastructures werkzeug datastructures Headers pop262799 -Ref: 210262799 -Ref: datastructures werkzeug datastructures Headers popitem263187 -Ref: 211263187 -Ref: datastructures werkzeug datastructures Headers remove263283 -Ref: 212263283 -Ref: datastructures werkzeug datastructures Headers set263400 -Ref: 213263400 -Ref: datastructures werkzeug datastructures Headers setdefault264081 -Ref: 214264081 -Ref: datastructures werkzeug datastructures Headers setlist264478 -Ref: 215264478 -Ref: datastructures werkzeug datastructures Headers setlistdefault264770 -Ref: 216264770 -Ref: datastructures werkzeug datastructures Headers to_wsgi_list265350 -Ref: 217265350 -Ref: datastructures werkzeug datastructures Headers update265616 -Ref: 20b265616 -Ref: datastructures werkzeug datastructures EnvironHeaders266065 -Ref: bc266065 -Ref: datastructures werkzeug datastructures HeaderSet266538 -Ref: 1c1266538 -Ref: datastructures werkzeug datastructures HeaderSet add267047 -Ref: 218267047 -Ref: datastructures werkzeug datastructures HeaderSet as_set267118 -Ref: 219267118 -Ref: datastructures werkzeug datastructures HeaderSet clear267542 -Ref: 21a267542 -Ref: datastructures werkzeug datastructures HeaderSet discard267595 -Ref: 21b267595 -Ref: datastructures werkzeug datastructures HeaderSet find267756 -Ref: 21d267756 -Ref: datastructures werkzeug datastructures HeaderSet index267947 -Ref: 21e267947 -Ref: datastructures werkzeug datastructures HeaderSet remove268140 -Ref: 21c268140 -Ref: datastructures werkzeug datastructures HeaderSet to_header268498 -Ref: 21f268498 -Ref: datastructures werkzeug datastructures HeaderSet update268591 -Ref: 220268591 -Ref: datastructures werkzeug datastructures Accept268791 -Ref: 125268791 -Ref: datastructures werkzeug datastructures Accept best269870 -Ref: 221269870 -Ref: datastructures werkzeug datastructures Accept best_match269932 -Ref: 222269932 -Ref: datastructures werkzeug datastructures Accept find270388 -Ref: 223270388 -Ref: datastructures werkzeug datastructures Accept index270534 -Ref: 224270534 -Ref: datastructures werkzeug datastructures Accept quality270814 -Ref: 225270814 -Ref: datastructures werkzeug datastructures Accept to_header271054 -Ref: 226271054 -Ref: datastructures werkzeug datastructures Accept values271147 -Ref: 227271147 -Ref: datastructures werkzeug datastructures MIMEAccept271211 -Ref: 12c271211 -Ref: datastructures werkzeug datastructures MIMEAccept accept_html271358 -Ref: 228271358 -Ref: datastructures werkzeug datastructures MIMEAccept accept_json271436 -Ref: 229271436 -Ref: datastructures werkzeug datastructures MIMEAccept accept_xhtml271514 -Ref: 22a271514 -Ref: datastructures werkzeug datastructures CharsetAccept271594 -Ref: 127271594 -Ref: datastructures werkzeug datastructures LanguageAccept271723 -Ref: 12a271723 -Ref: datastructures werkzeug datastructures RequestCacheControl271858 -Ref: 13d271858 -Ref: datastructures werkzeug datastructures RequestCacheControl no_cache272477 -Ref: 22b272477 -Ref: datastructures werkzeug datastructures RequestCacheControl no_store272546 -Ref: 22c272546 -Ref: datastructures werkzeug datastructures RequestCacheControl max_age272615 -Ref: 22d272615 -Ref: datastructures werkzeug datastructures RequestCacheControl no_transform272682 -Ref: 22e272682 -Ref: datastructures werkzeug datastructures RequestCacheControl max_stale272759 -Ref: 22f272759 -Ref: datastructures werkzeug datastructures RequestCacheControl min_fresh272830 -Ref: 230272830 -Ref: datastructures werkzeug datastructures RequestCacheControl only_if_cached272901 -Ref: 231272901 -Ref: datastructures werkzeug datastructures ResponseCacheControl272982 -Ref: 232272982 -Ref: datastructures werkzeug datastructures ResponseCacheControl no_cache273639 -Ref: 233273639 -Ref: datastructures werkzeug datastructures ResponseCacheControl no_store273708 -Ref: 234273708 -Ref: datastructures werkzeug datastructures ResponseCacheControl max_age273777 -Ref: 235273777 -Ref: datastructures werkzeug datastructures ResponseCacheControl no_transform273844 -Ref: 236273844 -Ref: datastructures werkzeug datastructures ResponseCacheControl immutable273921 -Ref: 237273921 -Ref: datastructures werkzeug datastructures ResponseCacheControl must_revalidate273992 -Ref: 238273992 -Ref: datastructures werkzeug datastructures ResponseCacheControl private274075 -Ref: 239274075 -Ref: datastructures werkzeug datastructures ResponseCacheControl proxy_revalidate274142 -Ref: 23a274142 -Ref: datastructures werkzeug datastructures ResponseCacheControl public274227 -Ref: 23b274227 -Ref: datastructures werkzeug datastructures ResponseCacheControl s_maxage274292 -Ref: 23c274292 -Ref: datastructures werkzeug datastructures ETags274361 -Ref: 13f274361 -Ref: datastructures werkzeug datastructures ETags as_set274558 -Ref: 23d274558 -Ref: datastructures werkzeug datastructures ETags contains274733 -Ref: 23e274733 -Ref: datastructures werkzeug datastructures ETags contains_raw274895 -Ref: 23f274895 -Ref: datastructures werkzeug datastructures ETags contains_weak275122 -Ref: 240275122 -Ref: datastructures werkzeug datastructures ETags is_strong275250 -Ref: 241275250 -Ref: datastructures werkzeug datastructures ETags is_weak275324 -Ref: 242275324 -Ref: datastructures werkzeug datastructures ETags to_header275394 -Ref: 243275394 -Ref: datastructures werkzeug datastructures Authorization275485 -Ref: 12f275485 -Ref: datastructures werkzeug datastructures Authorization cnonce276021 -Ref: 244276021 -Ref: datastructures werkzeug datastructures Authorization nc276240 -Ref: 245276240 -Ref: datastructures werkzeug datastructures Authorization nonce276391 -Ref: 246276391 -Ref: datastructures werkzeug datastructures Authorization opaque276588 -Ref: 247276588 -Ref: datastructures werkzeug datastructures Authorization password276801 -Ref: 248276801 -Ref: datastructures werkzeug datastructures Authorization qop276955 -Ref: 249276955 -Ref: datastructures werkzeug datastructures Authorization realm277217 -Ref: 24a277217 -Ref: datastructures werkzeug datastructures Authorization response277312 -Ref: 24b277312 -Ref: datastructures werkzeug datastructures Authorization uri277496 -Ref: 24c277496 -Ref: datastructures werkzeug datastructures Authorization username277700 -Ref: 24d277700 -Ref: datastructures werkzeug datastructures WWWAuthenticate277835 -Ref: 1c8277835 -Ref: datastructures werkzeug datastructures WWWAuthenticate algorithm278007 -Ref: 24e278007 -Ref: datastructures werkzeug datastructures WWWAuthenticate auth_property278352 -Ref: 24f278352 -Ref: datastructures werkzeug datastructures WWWAuthenticate domain278810 -Ref: 251278810 -Ref: datastructures werkzeug datastructures WWWAuthenticate nonce279020 -Ref: 252279020 -Ref: datastructures werkzeug datastructures WWWAuthenticate opaque279245 -Ref: 253279245 -Ref: datastructures werkzeug datastructures WWWAuthenticate qop279573 -Ref: 254279573 -Ref: datastructures werkzeug datastructures WWWAuthenticate realm279685 -Ref: 250279685 -Ref: datastructures werkzeug datastructures WWWAuthenticate set_basic280013 -Ref: 255280013 -Ref: datastructures werkzeug datastructures WWWAuthenticate set_digest280129 -Ref: 256280129 -Ref: datastructures werkzeug datastructures WWWAuthenticate stale280301 -Ref: 257280301 -Ref: datastructures werkzeug datastructures WWWAuthenticate to_header280458 -Ref: 258280458 -Ref: datastructures werkzeug datastructures WWWAuthenticate type280558 -Ref: 259280558 -Ref: datastructures werkzeug datastructures IfRange280693 -Ref: 143280693 -Ref: datastructures werkzeug datastructures IfRange date280956 -Ref: 25a280956 -Ref: datastructures werkzeug datastructures IfRange etag281041 -Ref: 25b281041 -Ref: datastructures werkzeug datastructures IfRange to_header281210 -Ref: 25c281210 -Ref: datastructures werkzeug datastructures Range281298 -Ref: 146281298 -Ref: datastructures werkzeug datastructures Range make_content_range281710 -Ref: 25d281710 -Ref: datastructures werkzeug datastructures Range range_for_length281868 -Ref: 25e281868 -Ref: datastructures werkzeug datastructures Range ranges282108 -Ref: 25f282108 -Ref: datastructures werkzeug datastructures Range to_content_range_header282261 -Ref: 260282261 -Ref: datastructures werkzeug datastructures Range to_header282413 -Ref: 261282413 -Ref: datastructures werkzeug datastructures Range units282501 -Ref: 262282501 -Ref: datastructures werkzeug datastructures ContentRange282593 -Ref: 14c282593 -Ref: datastructures werkzeug datastructures ContentRange length282771 -Ref: 263282771 -Ref: datastructures werkzeug datastructures ContentRange set282849 -Ref: 264282849 -Ref: datastructures werkzeug datastructures ContentRange start282960 -Ref: 265282960 -Ref: datastructures werkzeug datastructures ContentRange stop283042 -Ref: 266283042 -Ref: datastructures werkzeug datastructures ContentRange units283201 -Ref: 267283201 -Ref: datastructures werkzeug datastructures ContentRange unset283277 -Ref: 268283277 -Ref: HTTP Related-Footnote-1283448 -Ref: HTTP Related-Footnote-2283515 -Ref: HTTP Related-Footnote-3283595 -Ref: HTTP Related-Footnote-4283665 -Ref: HTTP Related-Footnote-5283732 -Ref: HTTP Related-Footnote-6283802 -Ref: HTTP Related-Footnote-7283872 -Ref: HTTP Related-Footnote-8283963 -Ref: HTTP Related-Footnote-9284024 -Ref: HTTP Related-Footnote-10284093 -Ref: HTTP Related-Footnote-11284163 -Ref: HTTP Related-Footnote-12284234 -Ref: HTTP Related-Footnote-13284323 -Ref: HTTP Related-Footnote-14284393 -Ref: HTTP Related-Footnote-15284455 -Ref: HTTP Related-Footnote-16284517 -Ref: HTTP Related-Footnote-17284587 -Ref: HTTP Related-Footnote-18284655 -Ref: HTTP Related-Footnote-19284725 -Ref: HTTP Related-Footnote-20284793 -Ref: HTTP Related-Footnote-21284863 -Ref: HTTP Related-Footnote-22284933 -Node: Others285003 -Ref: datastructures others285084 -Ref: 269285084 -Ref: datastructures werkzeug datastructures FileStorage285111 -Ref: b3285111 -Ref: datastructures werkzeug datastructures FileStorage stream285608 -Ref: 26a285608 -Ref: datastructures werkzeug datastructures FileStorage filename285745 -Ref: 26b285745 -Ref: datastructures werkzeug datastructures FileStorage name285826 -Ref: 26c285826 -Ref: datastructures werkzeug datastructures FileStorage headers285891 -Ref: 26d285891 -Ref: datastructures werkzeug datastructures FileStorage close286178 -Ref: 26e286178 -Ref: datastructures werkzeug datastructures FileStorage content_length286255 -Ref: 26f286255 -Ref: datastructures werkzeug datastructures FileStorage content_type286364 -Ref: 270286364 -Ref: datastructures werkzeug datastructures FileStorage mimetype286469 -Ref: 271286469 -Ref: datastructures werkzeug datastructures FileStorage mimetype_params286788 -Ref: 272286788 -Ref: datastructures werkzeug datastructures FileStorage save287035 -Ref: b4287035 -Ref: Others-Footnote-1287790 -Ref: Others-Footnote-2287852 -Ref: Others-Footnote-3287925 -Node: Utilities287995 -Ref: utils doc288099 -Ref: 273288099 -Ref: utils utilities288099 -Ref: 274288099 -Node: HTML Helpers288296 -Ref: utils html-helpers288380 -Ref: 275288380 -Ref: utils module-werkzeug utils288380 -Ref: 14288380 -Ref: utils werkzeug utils HTMLBuilder288419 -Ref: 276288419 -Ref: utils werkzeug utils escape289536 -Ref: 277289536 -Ref: utils werkzeug utils unescape289927 -Ref: 278289927 -Node: General Helpers290165 -Ref: utils general-helpers290269 -Ref: 279290269 -Ref: utils werkzeug utils cached_property290314 -Ref: 27a290314 -Ref: utils werkzeug utils invalidate_cached_property290871 -Ref: 27b290871 -Ref: utils werkzeug utils environ_property291565 -Ref: 27c291565 -Ref: utils werkzeug utils header_property292502 -Ref: 27d292502 -Ref: utils werkzeug utils redirect292685 -Ref: 27e292685 -Ref: utils werkzeug utils append_slash_redirect293694 -Ref: 27f293694 -Ref: utils werkzeug utils import_string294101 -Ref: 280294101 -Ref: utils werkzeug utils find_modules294818 -Ref: 281294818 -Ref: utils werkzeug utils validate_arguments295707 -Ref: 282295707 -Ref: utils werkzeug utils secure_filename297665 -Ref: 283297665 -Ref: utils werkzeug utils bind_arguments298672 -Ref: 284298672 -Ref: General Helpers-Footnote-1299405 -Ref: General Helpers-Footnote-2299474 -Ref: General Helpers-Footnote-3299542 -Ref: General Helpers-Footnote-4299610 -Node: URL Helpers299671 -Ref: utils url-helpers299780 -Ref: 285299780 -Node: UserAgent Parsing299858 -Ref: utils module-werkzeug useragents299968 -Ref: 13299968 -Ref: utils useragent-parsing299968 -Ref: 287299968 -Ref: utils werkzeug useragents UserAgent300017 -Ref: 153300017 -Ref: utils werkzeug useragents UserAgent string300291 -Ref: 288300291 -Ref: utils werkzeug useragents UserAgent platform300356 -Ref: 289300356 -Ref: utils werkzeug useragents UserAgent browser301117 -Ref: 28a301117 -Ref: utils werkzeug useragents UserAgent version302007 -Ref: 28b302007 -Ref: utils werkzeug useragents UserAgent language302106 -Ref: 28c302106 -Node: Security Helpers302207 -Ref: utils module-werkzeug security302313 -Ref: f302313 -Ref: utils security-helpers302313 -Ref: 28d302313 -Ref: utils werkzeug security generate_password_hash302383 -Ref: 28e302383 -Ref: utils werkzeug security check_password_hash303580 -Ref: 28f303580 -Ref: utils werkzeug security safe_str_cmp304169 -Ref: 290304169 -Ref: utils werkzeug security safe_join304489 -Ref: 291304489 -Ref: utils werkzeug security pbkdf2_hex304908 -Ref: 292304908 -Ref: utils werkzeug security pbkdf2_bin305613 -Ref: 293305613 -Node: Logging306539 -Ref: utils logging306619 -Ref: 294306619 -Ref: Logging-Footnote-1306975 -Ref: Logging-Footnote-2307045 -Node: URL Helpers<2>307132 -Ref: urls doc307235 -Ref: 286307235 -Ref: urls module-werkzeug urls307235 -Ref: 12307235 -Ref: urls url-helpers307235 -Ref: 295307235 -Node: werkzeug urls307310 -Ref: urls werkzeug-urls307376 -Ref: 296307376 -Ref: urls werkzeug urls BaseURL308040 -Ref: 297308040 -Ref: urls werkzeug urls BaseURL ascii_host308135 -Ref: 29a308135 -Ref: urls werkzeug urls BaseURL auth308477 -Ref: 29c308477 -Ref: urls werkzeug urls BaseURL decode_netloc308595 -Ref: 29d308595 -Ref: urls werkzeug urls BaseURL decode_query308680 -Ref: 29e308680 -Ref: urls werkzeug urls BaseURL get_file_location308973 -Ref: 2a0308973 -Ref: urls werkzeug urls BaseURL host309856 -Ref: 29b309856 -Ref: urls werkzeug urls BaseURL join310077 -Ref: 2a1310077 -Ref: urls werkzeug urls BaseURL password310300 -Ref: 2a3310300 -Ref: urls werkzeug urls BaseURL port310488 -Ref: 2a4310488 -Ref: urls werkzeug urls BaseURL raw_password310648 -Ref: 2a5310648 -Ref: urls werkzeug urls BaseURL raw_username310824 -Ref: 2a6310824 -Ref: urls werkzeug urls BaseURL replace311000 -Ref: 2a8311000 -Ref: urls werkzeug urls BaseURL to_iri_tuple311195 -Ref: 2a9311195 -Ref: urls werkzeug urls BaseURL to_uri_tuple311591 -Ref: 2ab311591 -Ref: urls werkzeug urls BaseURL to_url311944 -Ref: 2ac311944 -Ref: urls werkzeug urls BaseURL username312171 -Ref: 2a7312171 -Ref: urls werkzeug urls BytesURL312359 -Ref: 299312359 -Ref: urls werkzeug urls BytesURL decode312434 -Ref: 2ae312434 -Ref: urls werkzeug urls BytesURL encode_netloc312630 -Ref: 2af312630 -Ref: urls werkzeug urls Href312715 -Ref: 2b0312715 -Ref: urls werkzeug urls URL314483 -Ref: 298314483 -Ref: urls werkzeug urls URL encode314658 -Ref: 2b1314658 -Ref: urls werkzeug urls URL encode_netloc314852 -Ref: 2b2314852 -Ref: urls werkzeug urls iri_to_uri314953 -Ref: 1a4314953 -Ref: urls werkzeug urls uri_to_iri316731 -Ref: 2aa316731 -Ref: urls werkzeug urls url_decode317644 -Ref: 29f317644 -Ref: urls werkzeug urls url_decode_stream319821 -Ref: 2b3319821 -Ref: urls werkzeug urls url_encode321482 -Ref: 2b4321482 -Ref: urls werkzeug urls url_encode_stream322648 -Ref: 2b5322648 -Ref: urls werkzeug urls url_fix323784 -Ref: 2b6323784 -Ref: urls werkzeug urls url_join324427 -Ref: 2a2324427 -Ref: urls werkzeug urls url_parse324822 -Ref: 2b7324822 -Ref: urls werkzeug urls url_quote325503 -Ref: 2b8325503 -Ref: urls werkzeug urls url_quote_plus325993 -Ref: 2b9325993 -Ref: urls werkzeug urls url_unparse326379 -Ref: 2ad326379 -Ref: urls werkzeug urls url_unquote326701 -Ref: 2ba326701 -Ref: urls werkzeug urls url_unquote_plus327240 -Ref: 2bb327240 -Ref: werkzeug urls-Footnote-1327953 -Ref: werkzeug urls-Footnote-2328014 -Ref: werkzeug urls-Footnote-3328078 -Node: Context Locals328142 -Ref: local doc328246 -Ref: 2bc328246 -Ref: local context-locals328246 -Ref: 2bd328246 -Ref: local module-werkzeug local328246 -Ref: 6328246 -Ref: local werkzeug local release_local331082 -Ref: 2be331082 -Ref: local werkzeug local LocalManager331736 -Ref: 2c0331736 -Ref: local werkzeug local LocalManager cleanup332414 -Ref: 2c1332414 -Ref: local werkzeug local LocalManager get_ident332601 -Ref: 2c2332601 -Ref: local werkzeug local LocalManager make_middleware333112 -Ref: 2c3333112 -Ref: local werkzeug local LocalManager middleware333244 -Ref: 2c4333244 -Ref: local werkzeug local LocalStack333678 -Ref: 2bf333678 -Ref: local werkzeug local LocalStack pop334520 -Ref: 2c5334520 -Ref: local werkzeug local LocalStack push334679 -Ref: 2c6334679 -Ref: local werkzeug local LocalStack top334750 -Ref: 2c7334750 -Ref: local werkzeug local LocalProxy334875 -Ref: 2c8334875 -Ref: local werkzeug local LocalProxy _get_current_object336547 -Ref: 2c9336547 -Ref: middleware/index module-werkzeug middleware336815 -Ref: 7336815 -Ref: Context Locals-Footnote-1336852 -Node: Middleware336923 -Ref: middleware/index doc337028 -Ref: 2ca337028 -Ref: middleware/index middleware337028 -Ref: 2cb337028 -Ref: middleware/proxy_fix module-werkzeug middleware proxy_fix337232 -Ref: c337232 -Node: X-Forwarded-For Proxy Fix337402 -Ref: middleware/proxy_fix doc337510 -Ref: 2cc337510 -Ref: middleware/proxy_fix x-forwarded-for-proxy-fix337510 -Ref: 2cd337510 -Ref: middleware/proxy_fix werkzeug middleware proxy_fix ProxyFix338284 -Ref: 2ce338284 -Ref: middleware/shared_data module-werkzeug middleware shared_data340891 -Ref: d340891 -Node: Serve Shared Static Files340891 -Ref: middleware/shared_data doc341030 -Ref: 2cf341030 -Ref: middleware/shared_data serve-shared-static-files341030 -Ref: 2d0341030 -Ref: middleware/shared_data werkzeug middleware shared_data SharedDataMiddleware341097 -Ref: 2d1341097 -Ref: middleware/shared_data werkzeug middleware shared_data SharedDataMiddleware is_allowed343936 -Ref: 2d2343936 -Ref: middleware/dispatcher module-werkzeug middleware dispatcher344218 -Ref: 8344218 -Ref: Serve Shared Static Files-Footnote-1344254 -Ref: Serve Shared Static Files-Footnote-2344325 -Node: Application Dispatcher344396 -Ref: middleware/dispatcher doc344526 -Ref: 2d3344526 -Ref: middleware/dispatcher application-dispatcher344526 -Ref: 2d4344526 -Ref: middleware/dispatcher werkzeug middleware dispatcher DispatcherMiddleware345583 -Ref: 2d5345583 -Ref: middleware/http_proxy module-werkzeug middleware http_proxy346100 -Ref: 9346100 -Node: Basic HTTP Proxy346100 -Ref: middleware/http_proxy doc346225 -Ref: 2d6346225 -Ref: middleware/http_proxy basic-http-proxy346225 -Ref: 2d7346225 -Ref: middleware/http_proxy werkzeug middleware http_proxy ProxyMiddleware346274 -Ref: 2d8346274 -Ref: middleware/lint module-werkzeug middleware lint348592 -Ref: a348592 -Ref: Basic HTTP Proxy-Footnote-1348628 -Node: WSGI Protocol Linter348694 -Ref: middleware/lint doc348817 -Ref: 2d9348817 -Ref: middleware/lint wsgi-protocol-linter348817 -Ref: 2da348817 -Ref: middleware/lint werkzeug middleware lint LintMiddleware349148 -Ref: 2db349148 -Ref: middleware/profiler module-werkzeug middleware profiler349945 -Ref: b349945 -Ref: WSGI Protocol Linter-Footnote-1349981 -Ref: WSGI Protocol Linter-Footnote-2350030 -Node: Application Profiler350102 -Ref: middleware/profiler doc350200 -Ref: 2dc350200 -Ref: middleware/profiler application-profiler350200 -Ref: 2dd350200 -Ref: middleware/profiler werkzeug middleware profiler ProfilerMiddleware350440 -Ref: 2de350440 -Ref: Application Profiler-Footnote-1352929 -Ref: Application Profiler-Footnote-2353000 -Ref: Application Profiler-Footnote-3353068 -Ref: Application Profiler-Footnote-4353139 -Ref: Application Profiler-Footnote-5353206 -Ref: Application Profiler-Footnote-6353286 -Node: HTTP Exceptions353367 -Ref: exceptions doc353449 -Ref: 2df353449 -Ref: exceptions http-exceptions353449 -Ref: 2e0353449 -Ref: exceptions module-werkzeug exceptions353449 -Ref: 2353449 -Node: werkzeug exceptions353644 -Ref: exceptions werkzeug-exceptions353739 -Ref: 2e1353739 -Node: Usage Example353953 -Ref: exceptions usage-example354024 -Ref: 2e2354024 -Node: Error Classes355463 -Ref: exceptions error-classes355576 -Ref: 2e3355576 -Ref: exceptions werkzeug exceptions BadRequest355667 -Ref: 15d355667 -Ref: exceptions werkzeug exceptions Unauthorized355896 -Ref: 2e4355896 -Ref: exceptions werkzeug exceptions Forbidden357207 -Ref: 2e5357207 -Ref: exceptions werkzeug exceptions NotFound357434 -Ref: 37357434 -Ref: exceptions werkzeug exceptions MethodNotAllowed357611 -Ref: 164357611 -Ref: exceptions werkzeug exceptions NotAcceptable358141 -Ref: 2e6358141 -Ref: exceptions werkzeug exceptions RequestTimeout358380 -Ref: 2e7358380 -Ref: exceptions werkzeug exceptions Conflict358545 -Ref: 2e8358545 -Ref: exceptions werkzeug exceptions Gone358808 -Ref: 2e9358808 -Ref: exceptions werkzeug exceptions LengthRequired359002 -Ref: 2ea359002 -Ref: exceptions werkzeug exceptions PreconditionFailed359275 -Ref: 2eb359275 -Ref: exceptions werkzeug exceptions RequestEntityTooLarge359527 -Ref: c7359527 -Ref: exceptions werkzeug exceptions RequestURITooLarge359763 -Ref: 2ec359763 -Ref: exceptions werkzeug exceptions UnsupportedMediaType359942 -Ref: 2ed359942 -Ref: exceptions werkzeug exceptions RequestedRangeNotSatisfiable360193 -Ref: 150360193 -Ref: exceptions werkzeug exceptions ExpectationFailed360447 -Ref: 2ee360447 -Ref: exceptions werkzeug exceptions ImATeapot360689 -Ref: 2ef360689 -Ref: exceptions werkzeug exceptions UnprocessableEntity360943 -Ref: 2f0360943 -Ref: exceptions werkzeug exceptions Locked361175 -Ref: 2f1361175 -Ref: exceptions werkzeug exceptions FailedDependency361348 -Ref: 2f2361348 -Ref: exceptions werkzeug exceptions PreconditionRequired361635 -Ref: 2f3361635 -Ref: exceptions werkzeug exceptions TooManyRequests362274 -Ref: 2f4362274 -Ref: exceptions werkzeug exceptions RequestHeaderFieldsTooLarge362981 -Ref: 2f5362981 -Ref: exceptions werkzeug exceptions UnavailableForLegalReasons363327 -Ref: 2f6363327 -Ref: exceptions werkzeug exceptions InternalServerError363606 -Ref: 2f7363606 -Ref: exceptions werkzeug exceptions InternalServerError original_exception363988 -Ref: 2f8363988 -Ref: exceptions werkzeug exceptions NotImplemented364196 -Ref: 2f9364196 -Ref: exceptions werkzeug exceptions BadGateway364415 -Ref: 2fa364415 -Ref: exceptions werkzeug exceptions ServiceUnavailable364737 -Ref: 2fb364737 -Ref: exceptions werkzeug exceptions GatewayTimeout365202 -Ref: 2fc365202 -Ref: exceptions werkzeug exceptions HTTPVersionNotSupported365421 -Ref: 2fd365421 -Ref: exceptions werkzeug exceptions HTTPUnicodeError365656 -Ref: 2fe365656 -Ref: exceptions werkzeug exceptions ClientDisconnected365851 -Ref: 199365851 -Ref: exceptions werkzeug exceptions SecurityError366516 -Ref: 1a0366516 -Ref: Error Classes-Footnote-1366783 -Ref: Error Classes-Footnote-2366844 -Ref: Error Classes-Footnote-3366918 -Ref: Error Classes-Footnote-4366979 -Node: Baseclass367053 -Ref: exceptions baseclass367170 -Ref: 300367170 -Ref: exceptions werkzeug exceptions HTTPException367258 -Ref: 38367258 -Ref: exceptions werkzeug exceptions HTTPException __call__367569 -Ref: 301367569 -Ref: exceptions werkzeug exceptions HTTPException get_response367860 -Ref: 302367860 -Node: Special HTTP Exceptions368262 -Ref: exceptions special-http-exceptions368381 -Ref: 303368381 -Ref: exceptions werkzeug exceptions BadRequestKeyError369374 -Ref: 304369374 -Ref: Special HTTP Exceptions-Footnote-1369635 -Ref: Special HTTP Exceptions-Footnote-2369702 -Ref: Special HTTP Exceptions-Footnote-3369769 -Node: Simple Aborting369836 -Ref: exceptions simple-aborting369959 -Ref: 305369959 -Ref: exceptions werkzeug exceptions abort370203 -Ref: 306370203 -Ref: exceptions werkzeug exceptions Aborter370769 -Ref: 307370769 -Node: Custom Errors371194 -Ref: exceptions custom-errors371285 -Ref: 308371285 -Node: Deployment372315 -Ref: index deployment372416 -Ref: 309372416 -Node: Application Deployment372480 -Ref: deployment/index doc372551 -Ref: 30a372551 -Ref: deployment/index application-deployment372551 -Ref: 30b372551 -Ref: deployment/index deployment372551 -Ref: 50372551 -Node: CGI372796 -Ref: deployment/cgi doc372884 -Ref: 30c372884 -Ref: deployment/cgi cgi372884 -Ref: 30d372884 -Ref: CGI-Footnote-1373386 -Node: Creating a cgi file373430 -Ref: deployment/cgi appengine373512 -Ref: 30e373512 -Ref: deployment/cgi creating-a-cgi-file373512 -Ref: 30f373512 -Ref: Creating a cgi file-Footnote-1374023 -Node: Server Setup374093 -Ref: deployment/cgi server-setup374175 -Ref: 310374175 -Node: mod_wsgi Apache374630 -Ref: deployment/mod_wsgi doc374734 -Ref: 311374734 -Ref: deployment/mod_wsgi mod-wsgi-apache374734 -Ref: 312374734 -Ref: mod_wsgi Apache-Footnote-1375012 -Ref: mod_wsgi Apache-Footnote-2375046 -Node: Installing mod_wsgi375097 -Ref: deployment/mod_wsgi apache375199 -Ref: 313375199 -Ref: deployment/mod_wsgi installing-mod-wsgi375199 -Ref: 314375199 -Ref: Installing mod_wsgi-Footnote-1376026 -Node: Creating a wsgi file376094 -Ref: deployment/mod_wsgi creating-a-wsgi-file376223 -Ref: 315376223 -Ref: Creating a wsgi file-Footnote-1377150 -Node: Configuring Apache377195 -Ref: deployment/mod_wsgi configuring-apache377296 -Ref: 316377296 -Node: FastCGI378019 -Ref: deployment/fastcgi doc378133 -Ref: 317378133 -Ref: deployment/fastcgi fastcgi378133 -Ref: 318378133 -Ref: deployment/fastcgi virtual-python378133 -Ref: 319378133 -Ref: FastCGI-Footnote-1378586 -Ref: FastCGI-Footnote-2378620 -Ref: FastCGI-Footnote-3378647 -Node: Creating a fcgi file378686 -Ref: deployment/fastcgi creating-a-fcgi-file378781 -Ref: 31a378781 -Node: Configuring lighttpd379858 -Ref: deployment/fastcgi configuring-lighttpd379979 -Ref: 31b379979 -Ref: Configuring lighttpd-Footnote-1380802 -Node: Configuring nginx380879 -Ref: deployment/fastcgi configuring-nginx380989 -Ref: 31c380989 -Node: Debugging382234 -Ref: deployment/fastcgi debugging382315 -Ref: 31d382315 -Node: HTTP Proxying383386 -Ref: deployment/proxying doc383476 -Ref: 31e383476 -Ref: deployment/proxying flup383476 -Ref: 31f383476 -Ref: deployment/proxying http-proxying383476 -Ref: 320383476 -Node: Creating a py server383923 -Ref: deployment/proxying creating-a-py-server384024 -Ref: 321384024 -Node: Configuring nginx<2>384746 -Ref: deployment/proxying configuring-nginx384847 -Ref: 322384847 -Node: Additional Information385488 -Ref: index additional-information385599 -Ref: 323385599 -Node: Important Terms385736 -Ref: terms doc385828 -Ref: 324385828 -Ref: terms important-terms385828 -Ref: 325385828 -Node: WSGI386007 -Ref: terms wsgi386089 -Ref: 326386089 -Ref: WSGI-Footnote-1386382 -Node: Response Object386431 -Ref: terms response-object386535 -Ref: 327386535 -Node: View Function387022 -Ref: terms view-function387113 -Ref: 328387113 -Node: Unicode387777 -Ref: unicode doc387903 -Ref: 9e387903 -Ref: unicode id1387903 -Ref: 329387903 -Ref: unicode unicode387903 -Ref: 2ff387903 -Node: Unicode in Python388702 -Ref: unicode unicode-in-python388789 -Ref: 32a388789 -Node: Unicode in HTTP389894 -Ref: unicode unicode-in-http390004 -Ref: 32b390004 -Node: Error Handling391172 -Ref: unicode error-handling391293 -Ref: 32c391293 -Ref: Error Handling-Footnote-1391698 -Node: Request and Response Objects391765 -Ref: unicode request-and-response-objects391885 -Ref: 32d391885 -Ref: Request and Response Objects-Footnote-1392808 -Node: The Filesystem392886 -Ref: unicode filesystem-encoding392983 -Ref: 1b5392983 -Ref: unicode the-filesystem392983 -Ref: 32e392983 -Ref: The Filesystem-Footnote-1393884 -Ref: The Filesystem-Footnote-2393962 -Node: Dealing with Request Data394040 -Ref: request_data doc394160 -Ref: 32f394160 -Ref: request_data dealing-with-request-data394160 -Ref: c8394160 -Ref: request_data id1394160 -Ref: 330394160 -Node: Missing EOF Marker on Input Stream394703 -Ref: request_data missing-eof-marker-on-input-stream394835 -Ref: 331394835 -Node: When does Werkzeug Parse?395435 -Ref: request_data when-does-werkzeug-parse395594 -Ref: 332395594 -Node: How does it Parse?396409 -Ref: request_data how-does-it-parse396555 -Ref: 333396555 -Node: Limiting Request Data397521 -Ref: request_data limiting-request-data397664 -Ref: 334397664 -Node: How to extend Parsing?398593 -Ref: request_data how-to-extend-parsing398709 -Ref: 335398709 -Node: Changelog399519 -Ref: changes doc399623 -Ref: 336399623 -Ref: changes changelog399623 -Ref: 337399623 -Node: Version 1 0 1401875 -Ref: changes version-1-0-1401958 -Ref: 338401958 -Ref: Version 1 0 1-Footnote-1402583 -Ref: Version 1 0 1-Footnote-2402639 -Ref: Version 1 0 1-Footnote-3402693 -Ref: Version 1 0 1-Footnote-4402747 -Ref: Version 1 0 1-Footnote-5402803 -Ref: Version 1 0 1-Footnote-6402859 -Node: Version 1 0 0402915 -Ref: changes version-1-0-0403021 -Ref: 339403021 -Ref: Version 1 0 0-Footnote-1409178 -Ref: Version 1 0 0-Footnote-2409234 -Ref: Version 1 0 0-Footnote-3409290 -Ref: Version 1 0 0-Footnote-4409343 -Ref: Version 1 0 0-Footnote-5409397 -Ref: Version 1 0 0-Footnote-6409451 -Ref: Version 1 0 0-Footnote-7409507 -Ref: Version 1 0 0-Footnote-8409563 -Ref: Version 1 0 0-Footnote-9409617 -Ref: Version 1 0 0-Footnote-10409671 -Ref: Version 1 0 0-Footnote-11409727 -Ref: Version 1 0 0-Footnote-12409784 -Ref: Version 1 0 0-Footnote-13409839 -Ref: Version 1 0 0-Footnote-14409896 -Ref: Version 1 0 0-Footnote-15409951 -Ref: Version 1 0 0-Footnote-16410007 -Ref: Version 1 0 0-Footnote-17410062 -Ref: Version 1 0 0-Footnote-18410117 -Ref: Version 1 0 0-Footnote-19410172 -Ref: Version 1 0 0-Footnote-20410229 -Ref: Version 1 0 0-Footnote-21410284 -Ref: Version 1 0 0-Footnote-22410339 -Ref: Version 1 0 0-Footnote-23410395 -Ref: Version 1 0 0-Footnote-24410450 -Ref: Version 1 0 0-Footnote-25410506 -Ref: Version 1 0 0-Footnote-26410561 -Ref: Version 1 0 0-Footnote-27410616 -Ref: Version 1 0 0-Footnote-28410672 -Ref: Version 1 0 0-Footnote-29410729 -Ref: Version 1 0 0-Footnote-30410786 -Ref: Version 1 0 0-Footnote-31410843 -Ref: Version 1 0 0-Footnote-32410898 -Ref: Version 1 0 0-Footnote-33410948 -Ref: Version 1 0 0-Footnote-34411005 -Ref: Version 1 0 0-Footnote-35411062 -Ref: Version 1 0 0-Footnote-36411118 -Ref: Version 1 0 0-Footnote-37411175 -Ref: Version 1 0 0-Footnote-38411230 -Ref: Version 1 0 0-Footnote-39411285 -Ref: Version 1 0 0-Footnote-40411340 -Ref: Version 1 0 0-Footnote-41411395 -Ref: Version 1 0 0-Footnote-42411450 -Ref: Version 1 0 0-Footnote-43411506 -Ref: Version 1 0 0-Footnote-44411561 -Ref: Version 1 0 0-Footnote-45411618 -Ref: Version 1 0 0-Footnote-46411673 -Ref: Version 1 0 0-Footnote-47411728 -Ref: Version 1 0 0-Footnote-48411778 -Ref: Version 1 0 0-Footnote-49411834 -Ref: Version 1 0 0-Footnote-50411891 -Node: Version 0 16 1411948 -Ref: changes version-0-16-1412055 -Ref: 33a412055 -Ref: Version 0 16 1-Footnote-1412334 -Ref: Version 0 16 1-Footnote-2412390 -Node: Version 0 16 0412446 -Ref: changes version-0-16-0412554 -Ref: 33b412554 -Ref: Version 0 16 0-Footnote-1413198 -Ref: Version 0 16 0-Footnote-2413251 -Node: Version 0 15 6413305 -Ref: changes version-0-15-6413413 -Ref: 33c413413 -Ref: Version 0 15 6-Footnote-1414125 -Ref: Version 0 15 6-Footnote-2414181 -Ref: Version 0 15 6-Footnote-3414237 -Node: Version 0 15 5414293 -Ref: changes version-0-15-5414401 -Ref: 33d414401 -Ref: Version 0 15 5-Footnote-1415612 -Ref: Version 0 15 5-Footnote-2415668 -Ref: Version 0 15 5-Footnote-3415724 -Ref: Version 0 15 5-Footnote-4415778 -Ref: Version 0 15 5-Footnote-5415834 -Ref: Version 0 15 5-Footnote-6415890 -Ref: Version 0 15 5-Footnote-7415946 -Ref: Version 0 15 5-Footnote-8416002 -Ref: Version 0 15 5-Footnote-9416058 -Node: Version 0 15 4416114 -Ref: changes version-0-15-4416222 -Ref: 33e416222 -Ref: Version 0 15 4-Footnote-1416381 -Node: Version 0 15 3416437 -Ref: changes version-0-15-3416545 -Ref: 33f416545 -Ref: Version 0 15 3-Footnote-1417515 -Ref: Version 0 15 3-Footnote-2417571 -Ref: Version 0 15 3-Footnote-3417625 -Ref: Version 0 15 3-Footnote-4417681 -Ref: Version 0 15 3-Footnote-5417737 -Ref: Version 0 15 3-Footnote-6417793 -Ref: Version 0 15 3-Footnote-7417849 -Node: Version 0 15 2417905 -Ref: changes version-0-15-2418013 -Ref: 340418013 -Ref: Version 0 15 2-Footnote-1418914 -Ref: Version 0 15 2-Footnote-2418970 -Ref: Version 0 15 2-Footnote-3419026 -Ref: Version 0 15 2-Footnote-4419082 -Node: Version 0 15 1419138 -Ref: changes version-0-15-1419246 -Ref: 341419246 -Ref: Version 0 15 1-Footnote-1419536 -Node: Version 0 15 0419592 -Ref: changes version-0-15-0419700 -Ref: 342419700 -Ref: Version 0 15 0-Footnote-1433671 -Ref: Version 0 15 0-Footnote-2433725 -Ref: Version 0 15 0-Footnote-3433778 -Ref: Version 0 15 0-Footnote-4433833 -Ref: Version 0 15 0-Footnote-5433886 -Ref: Version 0 15 0-Footnote-6433940 -Ref: Version 0 15 0-Footnote-7433994 -Ref: Version 0 15 0-Footnote-8434048 -Ref: Version 0 15 0-Footnote-9434103 -Ref: Version 0 15 0-Footnote-10434156 -Ref: Version 0 15 0-Footnote-11434211 -Ref: Version 0 15 0-Footnote-12434266 -Ref: Version 0 15 0-Footnote-13434323 -Ref: Version 0 15 0-Footnote-14434378 -Ref: Version 0 15 0-Footnote-15434433 -Ref: Version 0 15 0-Footnote-16434489 -Ref: Version 0 15 0-Footnote-17434543 -Ref: Version 0 15 0-Footnote-18434598 -Ref: Version 0 15 0-Footnote-19434655 -Ref: Version 0 15 0-Footnote-20434710 -Ref: Version 0 15 0-Footnote-21434765 -Ref: Version 0 15 0-Footnote-22434815 -Ref: Version 0 15 0-Footnote-23434870 -Ref: Version 0 15 0-Footnote-24434920 -Ref: Version 0 15 0-Footnote-25434975 -Ref: Version 0 15 0-Footnote-26435030 -Ref: Version 0 15 0-Footnote-27435085 -Ref: Version 0 15 0-Footnote-28435140 -Ref: Version 0 15 0-Footnote-29435197 -Ref: Version 0 15 0-Footnote-30435252 -Ref: Version 0 15 0-Footnote-31435307 -Ref: Version 0 15 0-Footnote-32435362 -Ref: Version 0 15 0-Footnote-33435450 -Ref: Version 0 15 0-Footnote-34435511 -Ref: Version 0 15 0-Footnote-35435566 -Ref: Version 0 15 0-Footnote-36435621 -Ref: Version 0 15 0-Footnote-37435676 -Ref: Version 0 15 0-Footnote-38435731 -Ref: Version 0 15 0-Footnote-39435786 -Ref: Version 0 15 0-Footnote-40435841 -Ref: Version 0 15 0-Footnote-41435896 -Ref: Version 0 15 0-Footnote-42435951 -Ref: Version 0 15 0-Footnote-43436008 -Ref: Version 0 15 0-Footnote-44436063 -Ref: Version 0 15 0-Footnote-45436117 -Ref: Version 0 15 0-Footnote-46436172 -Ref: Version 0 15 0-Footnote-47436227 -Ref: Version 0 15 0-Footnote-48436282 -Ref: Version 0 15 0-Footnote-49436336 -Ref: Version 0 15 0-Footnote-50436391 -Ref: Version 0 15 0-Footnote-51436446 -Ref: Version 0 15 0-Footnote-52436501 -Ref: Version 0 15 0-Footnote-53436558 -Ref: Version 0 15 0-Footnote-54436613 -Ref: Version 0 15 0-Footnote-55436668 -Ref: Version 0 15 0-Footnote-56436723 -Ref: Version 0 15 0-Footnote-57436778 -Ref: Version 0 15 0-Footnote-58436833 -Ref: Version 0 15 0-Footnote-59436888 -Ref: Version 0 15 0-Footnote-60436942 -Ref: Version 0 15 0-Footnote-61436997 -Ref: Version 0 15 0-Footnote-62437066 -Ref: Version 0 15 0-Footnote-63437131 -Ref: Version 0 15 0-Footnote-64437186 -Ref: Version 0 15 0-Footnote-65437241 -Ref: Version 0 15 0-Footnote-66437296 -Ref: Version 0 15 0-Footnote-67437350 -Ref: Version 0 15 0-Footnote-68437395 -Ref: Version 0 15 0-Footnote-69437445 -Ref: Version 0 15 0-Footnote-70437501 -Ref: Version 0 15 0-Footnote-71437556 -Ref: Version 0 15 0-Footnote-72437611 -Ref: Version 0 15 0-Footnote-73437666 -Ref: Version 0 15 0-Footnote-74437723 -Ref: Version 0 15 0-Footnote-75437778 -Ref: Version 0 15 0-Footnote-76437835 -Ref: Version 0 15 0-Footnote-77437890 -Ref: Version 0 15 0-Footnote-78437945 -Ref: Version 0 15 0-Footnote-79438002 -Node: Version 0 14 1438057 -Ref: changes version-0-14-1438163 -Ref: 343438163 -Node: Version 0 14438337 -Ref: changes version-0-14438441 -Ref: 344438441 -Node: Version 0 13440532 -Ref: changes version-0-13440636 -Ref: 345440636 -Ref: Version 0 13-Footnote-1442507 -Ref: Version 0 13-Footnote-2442557 -Ref: Version 0 13-Footnote-3442611 -Ref: Version 0 13-Footnote-4442656 -Ref: Version 0 13-Footnote-5442710 -Ref: Version 0 13-Footnote-6442763 -Ref: Version 0 13-Footnote-7442819 -Ref: Version 0 13-Footnote-8442872 -Ref: Version 0 13-Footnote-9442925 -Ref: Version 0 13-Footnote-10442979 -Ref: Version 0 13-Footnote-11443034 -Ref: Version 0 13-Footnote-12443090 -Ref: Version 0 13-Footnote-13443145 -Ref: Version 0 13-Footnote-14443200 -Ref: Version 0 13-Footnote-15443255 -Node: Version 0 12 2443310 -Ref: changes click443416 -Ref: 346443416 -Ref: changes version-0-12-2443416 -Ref: 347443416 -Node: Version 0 12 1443713 -Ref: changes version-0-12-1443819 -Ref: 348443819 -Node: Version 0 12444115 -Ref: changes version-0-12444222 -Ref: 349444222 -Node: Version 0 11 16447008 -Ref: changes version-0-11-16447116 -Ref: 34a447116 -Node: Version 0 11 15447363 -Ref: changes version-0-11-15447474 -Ref: 34b447474 -Node: Version 0 11 14447607 -Ref: changes version-0-11-14447718 -Ref: 34c447718 -Node: Version 0 11 13447971 -Ref: changes version-0-11-13448082 -Ref: 34d448082 -Node: Version 0 11 12448243 -Ref: changes version-0-11-12448354 -Ref: 34e448354 -Node: Version 0 11 11448680 -Ref: changes version-0-11-11448791 -Ref: 34f448791 -Node: Version 0 11 10449372 -Ref: changes version-0-11-10449482 -Ref: 350449482 -Node: Version 0 11 9449845 -Ref: changes version-0-11-9449954 -Ref: 351449954 -Node: Version 0 11 8450331 -Ref: changes version-0-11-8450439 -Ref: 352450439 -Node: Version 0 11 7450599 -Ref: changes version-0-11-7450707 -Ref: 353450707 -Node: Version 0 11 6450837 -Ref: changes version-0-11-6450945 -Ref: 354450945 -Node: Version 0 11 5451562 -Ref: changes version-0-11-5451670 -Ref: 355451670 -Node: Version 0 11 4451831 -Ref: changes version-0-11-4451939 -Ref: 356451939 -Node: Version 0 11 3452114 -Ref: changes version-0-11-3452222 -Ref: 357452222 -Node: Version 0 11 2452623 -Ref: changes version-0-11-2452731 -Ref: 358452731 -Node: Version 0 11 1453170 -Ref: changes version-0-11-1453276 -Ref: 359453276 -Node: Version 0 11453408 -Ref: changes version-0-11453514 -Ref: 35a453514 -Node: Version 0 10 5455649 -Ref: changes version-0-10-5455755 -Ref: 35b455755 -Node: Version 0 10 4456123 -Ref: changes version-0-10-4456231 -Ref: 35c456231 -Node: Version 0 10 3456393 -Ref: changes version-0-10-3456501 -Ref: 35d456501 -Node: Version 0 10 2456649 -Ref: changes version-0-10-2456757 -Ref: 35e456757 -Node: Version 0 10 1457499 -Ref: changes version-0-10-1457605 -Ref: 35f457605 -Node: Version 0 10457895 -Ref: changes version-0-10458000 -Ref: 360458000 -Node: Version 0 9 7461451 -Ref: changes version-0-9-7461555 -Ref: 361461555 -Node: Version 0 9 6463468 -Ref: changes version-0-9-6463576 -Ref: 362463576 -Node: Version 0 9 7<2>463839 -Ref: changes id1463947 -Ref: 363463947 -Node: Version 0 9 5464071 -Ref: changes version-0-9-5464179 -Ref: 364464179 -Node: Version 0 9 4464954 -Ref: changes version-0-9-4465059 -Ref: 365465059 -Node: Version 0 9 3465380 -Ref: changes version-0-9-3465485 -Ref: 366465485 -Node: Version 0 9 2466069 -Ref: changes version-0-9-2466174 -Ref: 367466174 -Node: Version 0 9 1467053 -Ref: changes version-0-9-1467156 -Ref: 368467156 -Node: Version 0 9468061 -Ref: changes version-0-9468164 -Ref: 369468164 -Node: Version 0 8 4472990 -Ref: changes version-0-8-4473093 -Ref: 36a473093 -Node: Version 0 8 3473978 -Ref: changes version-0-8-3474083 -Ref: 36b474083 -Node: Version 0 8 2474670 -Ref: changes version-0-8-2474775 -Ref: 36c474775 -Node: Version 0 8 1475453 -Ref: changes version-0-8-1475556 -Ref: 36d475556 -Ref: Version 0 8 1-Footnote-1475992 -Node: Version 0 8476054 -Ref: changes version-0-8476157 -Ref: 36e476157 -Node: Version 0 7 2478799 -Ref: changes version-0-7-2478902 -Ref: 36f478902 -Node: Version 0 7 1479223 -Ref: changes version-0-7-1479326 -Ref: 370479326 -Node: Version 0 7479539 -Ref: changes version-0-7479642 -Ref: 371479642 -Node: Version 0 6 2484975 -Ref: changes version-0-6-2485078 -Ref: 372485078 -Node: Version 0 6 1485306 -Ref: changes version-0-6-1485409 -Ref: 373485409 -Node: Version 0 6486745 -Ref: changes version-0-6486848 -Ref: 374486848 -Node: Version 0 5 1491273 -Ref: changes version-0-5-1491374 -Ref: 375491374 -Node: Version 0 5492698 -Ref: changes version-0-5492801 -Ref: 376492801 -Ref: Version 0 5-Footnote-1496055 -Node: Version 0 4 1496117 -Ref: changes version-0-4-1496218 -Ref: 377496218 -Node: Version 0 4497583 -Ref: changes version-0-4497686 -Ref: 378497686 -Node: Version 0 3 1499451 -Ref: changes version-0-3-1499552 -Ref: 379499552 -Node: Version 0 3499714 -Ref: changes version-0-3499815 -Ref: 37a499815 -Node: Version 0 2501864 -Ref: changes version-0-2501963 -Ref: 37b501963 -Node: Version 0 1504134 -Ref: changes version-0-1504213 -Ref: 37c504213 -Node: Python Module Index504325 -Node: Index505100 +Node: Top328 +Ref: index doc504 +Ref: 16504 +Ref: Top-Footnote-17625 +Node: Getting Started7672 +Ref: index getting-started7769 +Ref: 177769 +Ref: index werkzeug7769 +Ref: 187769 +Ref: index wsgi7769 +Ref: 197769 +Node: Installation7957 +Ref: installation doc8049 +Ref: 1a8049 +Ref: installation installation8049 +Ref: 1b8049 +Node: Python Version8176 +Ref: installation python-version8262 +Ref: 1c8262 +Node: Dependencies8396 +Ref: installation dependencies8511 +Ref: 1d8511 +Node: Optional dependencies8648 +Ref: installation optional-dependencies8737 +Ref: 1e8737 +Ref: Optional dependencies-Footnote-19194 +Ref: Optional dependencies-Footnote-29237 +Node: greenlet9280 +Ref: installation greenlet9369 +Ref: 1f9369 +Ref: installation watchdog9369 +Ref: 209369 +Node: Virtual environments9711 +Ref: installation virtual-environments9828 +Ref: 219828 +Ref: Virtual environments-Footnote-110651 +Node: Create an environment10715 +Ref: installation create-an-environment10828 +Ref: 2210828 +Node: Activate the environment11050 +Ref: installation activate-the-environment11163 +Ref: 2311163 +Node: Install Werkzeug11449 +Ref: installation install-werkzeug11545 +Ref: 2411545 +Node: Werkzeug Tutorial11701 +Ref: tutorial doc11812 +Ref: 2511812 +Ref: tutorial werkzeug-tutorial11812 +Ref: 2611812 +Ref: Werkzeug Tutorial-Footnote-113360 +Ref: Werkzeug Tutorial-Footnote-213389 +Ref: Werkzeug Tutorial-Footnote-313421 +Ref: Werkzeug Tutorial-Footnote-413447 +Node: Introducing Shortly13498 +Ref: tutorial introducing-shortly13614 +Ref: 2713614 +Ref: Introducing Shortly-Footnote-114296 +Ref: Introducing Shortly-Footnote-214322 +Node: Step 0 A Basic WSGI Introduction14348 +Ref: tutorial redis14500 +Ref: 2814500 +Ref: tutorial step-0-a-basic-wsgi-introduction14500 +Ref: 2914500 +Node: Step 1 Creating the Folders16433 +Ref: tutorial step-1-creating-the-folders16591 +Ref: 2a16591 +Node: Step 2 The Base Structure17252 +Ref: tutorial step-2-the-base-structure17412 +Ref: 2b17412 +Node: Intermezzo Running the Application20878 +Ref: tutorial intermezzo-running-the-application21033 +Ref: 2c21033 +Node: Step 3 The Environment21554 +Ref: tutorial step-3-the-environment21702 +Ref: 2d21702 +Node: Step 4 The Routing22523 +Ref: tutorial step-4-the-routing22658 +Ref: 2e22658 +Node: Step 5 The First View25312 +Ref: tutorial step-5-the-first-view25445 +Ref: 3325445 +Node: Step 6 Redirect View27732 +Ref: tutorial step-6-redirect-view27865 +Ref: 3427865 +Node: Step 7 Detail View28589 +Ref: tutorial step-7-detail-view28717 +Ref: 3528717 +Ref: Step 7 Detail View-Footnote-129597 +Node: Step 8 Templates29658 +Ref: tutorial step-8-templates29782 +Ref: 3629782 +Node: Step 9 The Style31438 +Ref: tutorial step-9-the-style31561 +Ref: 3731561 +Node: Bonus Refinements32714 +Ref: tutorial bonus-refinements32812 +Ref: 3832812 +Ref: Bonus Refinements-Footnote-133110 +Node: API Levels33181 +Ref: levels doc33290 +Ref: 3933290 +Ref: levels api-levels33290 +Ref: 3a33290 +Node: Example33709 +Ref: levels example33786 +Ref: 3b33786 +Node: High or Low?35378 +Ref: levels high-or-low35455 +Ref: 3c35455 +Node: Quickstart36111 +Ref: quickstart doc36219 +Ref: 3d36219 +Ref: quickstart quickstart36219 +Ref: 3e36219 +Ref: Quickstart-Footnote-136496 +Ref: Quickstart-Footnote-236545 +Node: WSGI Environment36594 +Ref: quickstart wsgi-environment36705 +Ref: 3f36705 +Node: Enter Request37463 +Ref: quickstart enter-request37578 +Ref: 4037578 +Node: Header Parsing39864 +Ref: quickstart header-parsing39972 +Ref: 4139972 +Node: Responses42197 +Ref: quickstart responses42283 +Ref: 4242283 +Node: Serving and Testing46253 +Ref: index serving-and-testing46356 +Ref: 4346356 +Node: Serving WSGI Applications46498 +Ref: serving doc46615 +Ref: 4446615 +Ref: serving module-werkzeug serving46615 +Ref: f46615 +Ref: serving serving-wsgi-applications46615 +Ref: 4546615 +Ref: serving werkzeug serving run_simple47371 +Ref: 4647371 +Ref: serving werkzeug serving is_running_from_reloader52840 +Ref: 4752840 +Ref: serving werkzeug serving make_ssl_devcert53044 +Ref: 4853044 +Ref: Serving WSGI Applications-Footnote-154460 +Ref: Serving WSGI Applications-Footnote-254520 +Ref: Serving WSGI Applications-Footnote-354581 +Ref: Serving WSGI Applications-Footnote-454643 +Ref: Serving WSGI Applications-Footnote-554705 +Ref: Serving WSGI Applications-Footnote-654767 +Ref: Serving WSGI Applications-Footnote-754827 +Ref: Serving WSGI Applications-Footnote-854887 +Ref: Serving WSGI Applications-Footnote-954957 +Ref: Serving WSGI Applications-Footnote-1055018 +Ref: Serving WSGI Applications-Footnote-1155079 +Ref: Serving WSGI Applications-Footnote-1255142 +Ref: Serving WSGI Applications-Footnote-1355204 +Ref: Serving WSGI Applications-Footnote-1455265 +Ref: Serving WSGI Applications-Footnote-1555326 +Ref: Serving WSGI Applications-Footnote-1655387 +Ref: Serving WSGI Applications-Footnote-1755448 +Ref: Serving WSGI Applications-Footnote-1855511 +Ref: Serving WSGI Applications-Footnote-1955578 +Ref: Serving WSGI Applications-Footnote-2055639 +Ref: Serving WSGI Applications-Footnote-2155700 +Ref: Serving WSGI Applications-Footnote-2255767 +Ref: Serving WSGI Applications-Footnote-2355830 +Ref: Serving WSGI Applications-Footnote-2455893 +Ref: Serving WSGI Applications-Footnote-2555954 +Ref: Serving WSGI Applications-Footnote-2656015 +Ref: Serving WSGI Applications-Footnote-2756076 +Ref: Serving WSGI Applications-Footnote-2856137 +Node: Reloader56198 +Ref: serving id156294 +Ref: 4a56294 +Ref: serving reloader56294 +Ref: 4b56294 +Ref: Reloader-Footnote-157638 +Node: Colored Logging57681 +Ref: serving colored-logging57799 +Ref: 4c57799 +Ref: Colored Logging-Footnote-158045 +Node: Virtual Hosts58088 +Ref: serving colorama58222 +Ref: 4d58222 +Ref: serving virtual-hosts58222 +Ref: 4e58222 +Ref: Virtual Hosts-Footnote-159322 +Node: Shutting Down The Server59371 +Ref: serving shutting-down-the-server59505 +Ref: 5059505 +Ref: Shutting Down The Server-Footnote-160908 +Ref: Shutting Down The Server-Footnote-260995 +Node: Troubleshooting61072 +Ref: serving troubleshooting61196 +Ref: 5161196 +Ref: Troubleshooting-Footnote-162743 +Node: SSL62792 +Ref: serving hosts-file62904 +Ref: 5262904 +Ref: serving ssl62904 +Ref: 5362904 +Node: Quickstart<2>63241 +Ref: serving quickstart63329 +Ref: 5463329 +Node: Loading Contexts by Hand64219 +Ref: serving loading-contexts-by-hand64339 +Ref: 5564339 +Node: Generating Certificates64694 +Ref: serving generating-certificates64819 +Ref: 5664819 +Node: Adhoc Certificates65197 +Ref: serving adhoc-certificates65289 +Ref: 5765289 +Node: Unix Sockets65862 +Ref: serving unix-sockets65950 +Ref: 5865950 +Ref: test module-werkzeug test66261 +Ref: 1066261 +Node: Testing WSGI Applications66262 +Ref: test doc66410 +Ref: 5966410 +Ref: test testing-wsgi-applications66410 +Ref: 5a66410 +Node: Test Client66546 +Ref: test test-client66642 +Ref: 5b66642 +Node: Request Body67490 +Ref: test request-body67614 +Ref: 5f67614 +Node: Environment Builder68726 +Ref: test environment-builder68842 +Ref: 6068842 +Node: API69666 +Ref: test api69761 +Ref: 6369761 +Ref: test werkzeug test Client69782 +Ref: 5c69782 +Ref: test werkzeug test Client set_cookie71032 +Ref: 6471032 +Ref: test werkzeug test Client delete_cookie72216 +Ref: 6572216 +Ref: test werkzeug test Client open72819 +Ref: 6672819 +Ref: test werkzeug test Client get74731 +Ref: 6874731 +Ref: test werkzeug test Client post75008 +Ref: 6975008 +Ref: test werkzeug test Client put75287 +Ref: 6a75287 +Ref: test werkzeug test Client delete75564 +Ref: 6b75564 +Ref: test werkzeug test Client patch75847 +Ref: 6c75847 +Ref: test werkzeug test Client options76128 +Ref: 6d76128 +Ref: test werkzeug test Client head76413 +Ref: 6e76413 +Ref: test werkzeug test Client trace76692 +Ref: 6f76692 +Ref: test werkzeug test TestResponse76973 +Ref: 5d76973 +Ref: test werkzeug test TestResponse request78341 +Ref: 6278341 +Ref: test werkzeug test TestResponse history78543 +Ref: 6778543 +Ref: test werkzeug test EnvironBuilder78770 +Ref: 6178770 +Ref: test werkzeug test EnvironBuilder server_protocol85576 +Ref: 7c85576 +Ref: test werkzeug test EnvironBuilder wsgi_version85687 +Ref: 7d85687 +Ref: test werkzeug test EnvironBuilder request_class85786 +Ref: 7b85786 +Ref: test werkzeug test EnvironBuilder json_dumps85886 +Ref: 7985886 +Ref: test werkzeug test EnvironBuilder from_environ86195 +Ref: 7e86195 +Ref: test werkzeug test EnvironBuilder base_url86731 +Ref: 7f86731 +Ref: test werkzeug test EnvironBuilder content_type86870 +Ref: 7786870 +Ref: test werkzeug test EnvironBuilder mimetype87108 +Ref: 8087108 +Ref: test werkzeug test EnvironBuilder mimetype_params87248 +Ref: 8187248 +Ref: test werkzeug test EnvironBuilder content_length87522 +Ref: 7687522 +Ref: test werkzeug test EnvironBuilder form87759 +Ref: 7387759 +Ref: test werkzeug test EnvironBuilder files87875 +Ref: 7487875 +Ref: test werkzeug test EnvironBuilder input_stream88068 +Ref: 7588068 +Ref: test werkzeug test EnvironBuilder query_string88388 +Ref: 8488388 +Ref: test werkzeug test EnvironBuilder args88543 +Ref: 7888543 +Ref: test werkzeug test EnvironBuilder server_name88663 +Ref: 8588663 +Ref: test werkzeug test EnvironBuilder server_port88766 +Ref: 8688766 +Ref: test werkzeug test EnvironBuilder close88880 +Ref: 8788880 +Ref: test werkzeug test EnvironBuilder get_environ89125 +Ref: 8889125 +Ref: test werkzeug test EnvironBuilder get_request89410 +Ref: 8989410 +Ref: test werkzeug test create_environ89833 +Ref: 7289833 +Ref: test werkzeug test run_wsgi_app90695 +Ref: 8a90695 +Ref: API-Footnote-191846 +Ref: API-Footnote-291908 +Ref: API-Footnote-391970 +Ref: API-Footnote-492032 +Ref: API-Footnote-592092 +Ref: API-Footnote-692152 +Ref: API-Footnote-792212 +Ref: API-Footnote-892288 +Ref: API-Footnote-992349 +Ref: API-Footnote-1092409 +Ref: API-Footnote-1192485 +Ref: API-Footnote-1292547 +Ref: API-Footnote-1392611 +Ref: API-Footnote-1492672 +Ref: API-Footnote-1592733 +Ref: API-Footnote-1692796 +Ref: API-Footnote-1792859 +Ref: API-Footnote-1892920 +Ref: API-Footnote-1992981 +Ref: API-Footnote-2093044 +Ref: API-Footnote-2193105 +Ref: API-Footnote-2293166 +Ref: API-Footnote-2393227 +Ref: API-Footnote-2493288 +Ref: API-Footnote-2593351 +Ref: API-Footnote-2693414 +Ref: API-Footnote-2793475 +Ref: API-Footnote-2893538 +Ref: API-Footnote-2993601 +Ref: API-Footnote-3093664 +Ref: API-Footnote-3193725 +Ref: API-Footnote-3293788 +Ref: API-Footnote-3393849 +Ref: API-Footnote-3493912 +Ref: API-Footnote-3593973 +Ref: API-Footnote-3694034 +Ref: API-Footnote-3794095 +Ref: API-Footnote-3894156 +Ref: API-Footnote-3994217 +Ref: API-Footnote-4094278 +Ref: API-Footnote-4194341 +Ref: API-Footnote-4294402 +Ref: API-Footnote-4394464 +Ref: API-Footnote-4494525 +Ref: API-Footnote-4594588 +Ref: API-Footnote-4694651 +Ref: API-Footnote-4794714 +Ref: API-Footnote-4894775 +Ref: API-Footnote-4994836 +Ref: API-Footnote-5094899 +Ref: API-Footnote-5194960 +Ref: API-Footnote-5295023 +Ref: API-Footnote-5395084 +Ref: API-Footnote-5495145 +Ref: API-Footnote-5595206 +Ref: API-Footnote-5695267 +Ref: API-Footnote-5795328 +Ref: API-Footnote-5895389 +Ref: API-Footnote-5995450 +Ref: API-Footnote-6095511 +Ref: API-Footnote-6195574 +Ref: API-Footnote-6295635 +Ref: API-Footnote-6395696 +Ref: API-Footnote-6495757 +Ref: API-Footnote-6595818 +Ref: API-Footnote-6695879 +Ref: API-Footnote-6795941 +Ref: API-Footnote-6896004 +Ref: API-Footnote-6996065 +Ref: API-Footnote-7096126 +Ref: API-Footnote-7196188 +Ref: API-Footnote-7296251 +Ref: API-Footnote-7396314 +Ref: API-Footnote-7496377 +Node: Debugging Applications96438 +Ref: debug doc96552 +Ref: 8b96552 +Ref: debug debugging-applications96552 +Ref: 8c96552 +Ref: debug module-werkzeug debug96552 +Ref: 196552 +Node: Enabling the Debugger97586 +Ref: debug enabling-the-debugger97695 +Ref: 8d97695 +Ref: debug werkzeug debug DebuggedApplication97957 +Ref: 8e97957 +Ref: Enabling the Debugger-Footnote-199796 +Ref: Enabling the Debugger-Footnote-299858 +Ref: Enabling the Debugger-Footnote-399918 +Ref: Enabling the Debugger-Footnote-499978 +Ref: Enabling the Debugger-Footnote-5100038 +Ref: Enabling the Debugger-Footnote-6100100 +Ref: Enabling the Debugger-Footnote-7100162 +Ref: Enabling the Debugger-Footnote-8100224 +Node: Using the Debugger100286 +Ref: debug using-the-debugger100416 +Ref: 8f100416 +Node: Debugger PIN101906 +Ref: debug debugger-pin102029 +Ref: 90102029 +Node: Pasting Errors103000 +Ref: debug pasting-errors103096 +Ref: 91103096 +Node: Reference103372 +Ref: index reference103470 +Ref: 92103470 +Node: Request / Response Objects103707 +Ref: wrappers doc103801 +Ref: 93103801 +Ref: wrappers module-werkzeug wrappers103801 +Ref: 14103801 +Ref: wrappers request-response-objects103801 +Ref: 94103801 +Node: How they Work104127 +Ref: wrappers how-they-work104252 +Ref: 95104252 +Node: Mutability and Reusability of Wrappers105618 +Ref: wrappers mutability-and-reusability-of-wrappers105767 +Ref: 96105767 +Node: Wrapper Classes106909 +Ref: wrappers wrapper-classes107036 +Ref: 97107036 +Ref: wrappers werkzeug wrappers Request107081 +Ref: 71107081 +Ref: wrappers werkzeug wrappers Request _get_file_stream108834 +Ref: 99108834 +Ref: wrappers werkzeug wrappers Request accept_charsets110192 +Ref: 9a110192 +Ref: wrappers werkzeug wrappers Request accept_encodings110388 +Ref: 9c110388 +Ref: wrappers werkzeug wrappers Request accept_languages110670 +Ref: 9e110670 +Ref: wrappers werkzeug wrappers Request accept_mimetypes110869 +Ref: a0110869 +Ref: wrappers werkzeug wrappers Request access_control_request_headers111061 +Ref: a2111061 +Ref: wrappers werkzeug wrappers Request access_control_request_method111349 +Ref: a3111349 +Ref: wrappers werkzeug wrappers Request access_route111634 +Ref: a4111634 +Ref: wrappers werkzeug wrappers Request application111812 +Ref: a5111812 +Ref: wrappers werkzeug wrappers Request args112666 +Ref: a6112666 +Ref: wrappers werkzeug wrappers Request authorization113088 +Ref: a9113088 +Ref: wrappers werkzeug wrappers Request base_url113255 +Ref: aa113255 +Ref: wrappers werkzeug wrappers Request cache_control113354 +Ref: ac113354 +Ref: wrappers werkzeug wrappers Request close113560 +Ref: ae113560 +Ref: wrappers werkzeug wrappers Request content_encoding113879 +Ref: af113879 +Ref: wrappers werkzeug wrappers Request content_length114325 +Ref: b0114325 +Ref: wrappers werkzeug wrappers Request content_md5114624 +Ref: b1114624 +Ref: wrappers werkzeug wrappers Request content_type115075 +Ref: b2115075 +Ref: wrappers werkzeug wrappers Request cookies115358 +Ref: b3115358 +Ref: wrappers werkzeug wrappers Request data115519 +Ref: b4115519 +Ref: wrappers werkzeug wrappers Request date115679 +Ref: b5115679 +Ref: wrappers werkzeug wrappers Request dict_storage_class115957 +Ref: b6115957 +Ref: wrappers werkzeug wrappers Request environ116071 +Ref: b7116071 +Ref: wrappers werkzeug wrappers Request files116221 +Ref: b8116221 +Ref: wrappers werkzeug wrappers Request form117153 +Ref: bb117153 +Ref: wrappers werkzeug wrappers Request form_data_parser_class117781 +Ref: bc117781 +Ref: wrappers werkzeug wrappers Request from_values117891 +Ref: be117891 +Ref: wrappers werkzeug wrappers Request full_path118883 +Ref: bf118883 +Ref: wrappers werkzeug wrappers Request get_data118977 +Ref: c0118977 +Ref: wrappers werkzeug wrappers Request get_json120591 +Ref: c1120591 +Ref: wrappers werkzeug wrappers Request headers121366 +Ref: c4121366 +Ref: wrappers werkzeug wrappers Request host121445 +Ref: c5121445 +Ref: wrappers werkzeug wrappers Request host_url121619 +Ref: c6121619 +Ref: wrappers werkzeug wrappers Request if_match121706 +Ref: c7121706 +Ref: wrappers werkzeug wrappers Request if_modified_since121895 +Ref: c9121895 +Ref: wrappers werkzeug wrappers Request if_none_match122115 +Ref: ca122115 +Ref: wrappers werkzeug wrappers Request if_range122339 +Ref: cb122339 +Ref: wrappers werkzeug wrappers Request if_unmodified_since122561 +Ref: cd122561 +Ref: wrappers werkzeug wrappers Request input_stream122785 +Ref: ce122785 +Ref: wrappers werkzeug wrappers Request is_json123012 +Ref: c2123012 +Ref: wrappers werkzeug wrappers Request is_multiprocess123173 +Ref: cf123173 +Ref: wrappers werkzeug wrappers Request is_multithread123336 +Ref: d0123336 +Ref: wrappers werkzeug wrappers Request is_run_once123481 +Ref: d1123481 +Ref: wrappers werkzeug wrappers Request is_secure123758 +Ref: d2123758 +Ref: wrappers werkzeug wrappers Request json123893 +Ref: d3123893 +Ref: wrappers werkzeug wrappers Request json_module124126 +Ref: d5124126 +Ref: wrappers werkzeug wrappers Request list_storage_class124382 +Ref: d6124382 +Ref: wrappers werkzeug wrappers Request make_form_data_parser124491 +Ref: d8124491 +Ref: wrappers werkzeug wrappers Request max_content_length124761 +Ref: d9124761 +Ref: wrappers werkzeug wrappers Request max_form_memory_size125325 +Ref: dc125325 +Ref: wrappers werkzeug wrappers Request max_forwards125879 +Ref: dd125879 +Ref: wrappers werkzeug wrappers Request method126148 +Ref: de126148 +Ref: wrappers werkzeug wrappers Request mimetype126244 +Ref: d4126244 +Ref: wrappers werkzeug wrappers Request mimetype_params126539 +Ref: df126539 +Ref: wrappers werkzeug wrappers Request on_json_loading_failed126778 +Ref: c3126778 +Ref: wrappers werkzeug wrappers Request origin127161 +Ref: e1127161 +Ref: wrappers werkzeug wrappers Request parameter_storage_class127357 +Ref: a8127357 +Ref: wrappers werkzeug wrappers Request path127476 +Ref: e2127476 +Ref: wrappers werkzeug wrappers Request pragma127634 +Ref: e4127634 +Ref: wrappers werkzeug wrappers Request query_string128090 +Ref: e6128090 +Ref: wrappers werkzeug wrappers Request range128251 +Ref: e7128251 +Ref: wrappers werkzeug wrappers Request referrer128459 +Ref: e9128459 +Ref: wrappers werkzeug wrappers Request remote_addr128763 +Ref: ea128763 +Ref: wrappers werkzeug wrappers Request remote_user128854 +Ref: eb128854 +Ref: wrappers werkzeug wrappers Request root_path129059 +Ref: e3129059 +Ref: wrappers werkzeug wrappers Request root_url129222 +Ref: ec129222 +Ref: wrappers werkzeug wrappers Request scheme129383 +Ref: ed129383 +Ref: wrappers werkzeug wrappers Request script_root129515 +Ref: ee129515 +Ref: wrappers werkzeug wrappers Request server129665 +Ref: ef129665 +Ref: wrappers werkzeug wrappers Request shallow129827 +Ref: f0129827 +Ref: wrappers werkzeug wrappers Request stream130075 +Ref: 98130075 +Ref: wrappers werkzeug wrappers Request url130963 +Ref: ab130963 +Ref: wrappers werkzeug wrappers Request url_charset131096 +Ref: f1131096 +Ref: wrappers werkzeug wrappers Request url_root131268 +Ref: f2131268 +Ref: wrappers werkzeug wrappers Request user_agent131446 +Ref: f3131446 +Ref: wrappers werkzeug wrappers Request user_agent_class131966 +Ref: f5131966 +Ref: wrappers werkzeug wrappers Request values132065 +Ref: f6132065 +Ref: wrappers werkzeug wrappers Request want_form_data_parsed132437 +Ref: f8132437 +Ref: wrappers werkzeug wrappers Response132649 +Ref: 5e132649 +Ref: wrappers werkzeug wrappers Response __call__136299 +Ref: fa136299 +Ref: wrappers werkzeug wrappers Response _ensure_sequence136729 +Ref: fb136729 +Ref: wrappers werkzeug wrappers Response accept_ranges137089 +Ref: fc137089 +Ref: wrappers werkzeug wrappers Response access_control_allow_credentials137390 +Ref: fd137390 +Ref: wrappers werkzeug wrappers Response access_control_allow_headers137661 +Ref: fe137661 +Ref: wrappers werkzeug wrappers Response access_control_allow_methods137779 +Ref: ff137779 +Ref: wrappers werkzeug wrappers Response access_control_allow_origin137896 +Ref: 100137896 +Ref: wrappers werkzeug wrappers Response access_control_expose_headers138040 +Ref: 101138040 +Ref: wrappers werkzeug wrappers Response access_control_max_age138165 +Ref: 102138165 +Ref: wrappers werkzeug wrappers Response add_etag138304 +Ref: 103138304 +Ref: wrappers werkzeug wrappers Response age138707 +Ref: 104138707 +Ref: wrappers werkzeug wrappers Response allow139021 +Ref: 105139021 +Ref: wrappers werkzeug wrappers Response autocorrect_location_header139444 +Ref: 106139444 +Ref: wrappers werkzeug wrappers Response automatically_set_content_length139656 +Ref: 107139656 +Ref: wrappers werkzeug wrappers Response cache_control139880 +Ref: 108139880 +Ref: wrappers werkzeug wrappers Response calculate_content_length140167 +Ref: 10a140167 +Ref: wrappers werkzeug wrappers Response call_on_close140332 +Ref: 10b140332 +Ref: wrappers werkzeug wrappers Response close140805 +Ref: 10c140805 +Ref: wrappers werkzeug wrappers Response content_encoding141079 +Ref: 10d141079 +Ref: wrappers werkzeug wrappers Response content_language141494 +Ref: 10e141494 +Ref: wrappers werkzeug wrappers Response content_length141847 +Ref: 10f141847 +Ref: wrappers werkzeug wrappers Response content_location142181 +Ref: 110142181 +Ref: wrappers werkzeug wrappers Response content_md5142477 +Ref: 111142477 +Ref: wrappers werkzeug wrappers Response content_range142897 +Ref: 112142897 +Ref: wrappers werkzeug wrappers Response content_security_policy143159 +Ref: 114143159 +Ref: wrappers werkzeug wrappers Response content_security_policy_report_only143567 +Ref: 115143567 +Ref: wrappers werkzeug wrappers Response content_type144034 +Ref: 116144034 +Ref: wrappers werkzeug wrappers Response cross_origin_embedder_policy144317 +Ref: 117144317 +Ref: wrappers werkzeug wrappers Response cross_origin_opener_policy144575 +Ref: 118144575 +Ref: wrappers werkzeug wrappers Response data144800 +Ref: 119144800 +Ref: wrappers werkzeug wrappers Response date144947 +Ref: 11c144947 +Ref: wrappers werkzeug wrappers Response delete_cookie145225 +Ref: 11d145225 +Ref: wrappers werkzeug wrappers Response direct_passthrough146332 +Ref: 11e146332 +Ref: wrappers werkzeug wrappers Response expires146646 +Ref: 11f146646 +Ref: wrappers werkzeug wrappers Response force_type146940 +Ref: 120146940 +Ref: wrappers werkzeug wrappers Response freeze148493 +Ref: 121148493 +Ref: wrappers werkzeug wrappers Response from_app149240 +Ref: 122149240 +Ref: wrappers werkzeug wrappers Response get_app_iter150223 +Ref: 123150223 +Ref: wrappers werkzeug wrappers Response get_data150923 +Ref: 11a150923 +Ref: wrappers werkzeug wrappers Response get_etag151552 +Ref: 125151552 +Ref: wrappers werkzeug wrappers Response get_json151808 +Ref: 126151808 +Ref: wrappers werkzeug wrappers Response get_wsgi_headers152423 +Ref: 128152423 +Ref: wrappers werkzeug wrappers Response get_wsgi_response153695 +Ref: 129153695 +Ref: wrappers werkzeug wrappers Response implicit_sequence_conversion154507 +Ref: 124154507 +Ref: wrappers werkzeug wrappers Response is_json154968 +Ref: 127154968 +Ref: wrappers werkzeug wrappers Response is_sequence155129 +Ref: 12a155129 +Ref: wrappers werkzeug wrappers Response is_streamed155402 +Ref: 12b155402 +Ref: wrappers werkzeug wrappers Response iter_encoded155924 +Ref: 12c155924 +Ref: wrappers werkzeug wrappers Response json156277 +Ref: 12d156277 +Ref: wrappers werkzeug wrappers Response json_module156513 +Ref: 12f156513 +Ref: wrappers werkzeug wrappers Response last_modified156770 +Ref: 130156770 +Ref: wrappers werkzeug wrappers Response location157043 +Ref: 131157043 +Ref: wrappers werkzeug wrappers Response make_conditional157281 +Ref: 132157281 +Ref: wrappers werkzeug wrappers Response make_sequence159770 +Ref: 135159770 +Ref: wrappers werkzeug wrappers Response mimetype160186 +Ref: 12e160186 +Ref: wrappers werkzeug wrappers Response mimetype_params160295 +Ref: 136160295 +Ref: wrappers werkzeug wrappers Response response160567 +Ref: 137160567 +Ref: wrappers werkzeug wrappers Response retry_after161067 +Ref: 138161067 +Ref: wrappers werkzeug wrappers Response set_cookie161482 +Ref: 139161482 +Ref: wrappers werkzeug wrappers Response set_data163583 +Ref: 11b163583 +Ref: wrappers werkzeug wrappers Response set_etag163964 +Ref: 13a163964 +Ref: wrappers werkzeug wrappers Response status164222 +Ref: 13b164222 +Ref: wrappers werkzeug wrappers Response status_code164304 +Ref: 13c164304 +Ref: wrappers werkzeug wrappers Response stream164391 +Ref: 13d164391 +Ref: wrappers werkzeug wrappers Response vary164516 +Ref: 13e164516 +Ref: wrappers werkzeug wrappers Response www_authenticate164848 +Ref: 13f164848 +Ref: Wrapper Classes-Footnote-1165052 +Ref: Wrapper Classes-Footnote-2165114 +Ref: Wrapper Classes-Footnote-3165176 +Ref: Wrapper Classes-Footnote-4165247 +Ref: Wrapper Classes-Footnote-5165309 +Ref: Wrapper Classes-Footnote-6165370 +Ref: Wrapper Classes-Footnote-7165430 +Ref: Wrapper Classes-Footnote-8165490 +Ref: Wrapper Classes-Footnote-9165551 +Ref: Wrapper Classes-Footnote-10165613 +Ref: Wrapper Classes-Footnote-11165674 +Ref: Wrapper Classes-Footnote-12165735 +Ref: Wrapper Classes-Footnote-13165796 +Ref: Wrapper Classes-Footnote-14165857 +Ref: Wrapper Classes-Footnote-15165920 +Ref: Wrapper Classes-Footnote-16165982 +Ref: Wrapper Classes-Footnote-17166043 +Ref: Wrapper Classes-Footnote-18166104 +Ref: Wrapper Classes-Footnote-19166166 +Ref: Wrapper Classes-Footnote-20166229 +Ref: Wrapper Classes-Footnote-21166290 +Ref: Wrapper Classes-Footnote-22166351 +Ref: Wrapper Classes-Footnote-23166412 +Ref: Wrapper Classes-Footnote-24166473 +Ref: Wrapper Classes-Footnote-25166536 +Ref: Wrapper Classes-Footnote-26166599 +Ref: Wrapper Classes-Footnote-27166662 +Ref: Wrapper Classes-Footnote-28166725 +Ref: Wrapper Classes-Footnote-29166786 +Ref: Wrapper Classes-Footnote-30166849 +Ref: Wrapper Classes-Footnote-31166912 +Ref: Wrapper Classes-Footnote-32166975 +Ref: Wrapper Classes-Footnote-33167036 +Ref: Wrapper Classes-Footnote-34167097 +Ref: Wrapper Classes-Footnote-35167173 +Ref: Wrapper Classes-Footnote-36167249 +Ref: Wrapper Classes-Footnote-37167312 +Ref: Wrapper Classes-Footnote-38167375 +Ref: Wrapper Classes-Footnote-39167440 +Ref: Wrapper Classes-Footnote-40167502 +Ref: Wrapper Classes-Footnote-41167564 +Ref: Wrapper Classes-Footnote-42167625 +Ref: Wrapper Classes-Footnote-43167686 +Ref: Wrapper Classes-Footnote-44167747 +Ref: Wrapper Classes-Footnote-45167817 +Ref: Wrapper Classes-Footnote-46167878 +Ref: Wrapper Classes-Footnote-47167939 +Ref: Wrapper Classes-Footnote-48168002 +Ref: Wrapper Classes-Footnote-49168065 +Ref: Wrapper Classes-Footnote-50168126 +Ref: Wrapper Classes-Footnote-51168187 +Ref: Wrapper Classes-Footnote-52168248 +Ref: Wrapper Classes-Footnote-53168309 +Ref: Wrapper Classes-Footnote-54168370 +Ref: Wrapper Classes-Footnote-55168433 +Ref: Wrapper Classes-Footnote-56168494 +Ref: Wrapper Classes-Footnote-57168557 +Ref: Wrapper Classes-Footnote-58168619 +Ref: Wrapper Classes-Footnote-59168680 +Ref: Wrapper Classes-Footnote-60168749 +Ref: Wrapper Classes-Footnote-61168810 +Ref: Wrapper Classes-Footnote-62168871 +Ref: Wrapper Classes-Footnote-63168934 +Ref: Wrapper Classes-Footnote-64168997 +Ref: Wrapper Classes-Footnote-65169060 +Ref: Wrapper Classes-Footnote-66169123 +Ref: Wrapper Classes-Footnote-67169186 +Ref: Wrapper Classes-Footnote-68169249 +Ref: Wrapper Classes-Footnote-69169312 +Ref: Wrapper Classes-Footnote-70169375 +Ref: Wrapper Classes-Footnote-71169438 +Ref: Wrapper Classes-Footnote-72169500 +Ref: Wrapper Classes-Footnote-73169563 +Ref: Wrapper Classes-Footnote-74169626 +Ref: Wrapper Classes-Footnote-75169687 +Ref: Wrapper Classes-Footnote-76169748 +Ref: Wrapper Classes-Footnote-77169809 +Ref: Wrapper Classes-Footnote-78169870 +Ref: Wrapper Classes-Footnote-79169933 +Ref: Wrapper Classes-Footnote-80169996 +Ref: Wrapper Classes-Footnote-81170057 +Ref: Wrapper Classes-Footnote-82170120 +Ref: Wrapper Classes-Footnote-83170183 +Ref: Wrapper Classes-Footnote-84170246 +Ref: Wrapper Classes-Footnote-85170309 +Ref: Wrapper Classes-Footnote-86170372 +Ref: Wrapper Classes-Footnote-87170435 +Ref: Wrapper Classes-Footnote-88170496 +Ref: Wrapper Classes-Footnote-89170557 +Ref: Wrapper Classes-Footnote-90170620 +Ref: Wrapper Classes-Footnote-91170683 +Ref: Wrapper Classes-Footnote-92170746 +Ref: Wrapper Classes-Footnote-93170809 +Ref: Wrapper Classes-Footnote-94170872 +Ref: Wrapper Classes-Footnote-95170935 +Ref: Wrapper Classes-Footnote-96170996 +Ref: Wrapper Classes-Footnote-97171057 +Ref: Wrapper Classes-Footnote-98171118 +Ref: Wrapper Classes-Footnote-99171181 +Ref: Wrapper Classes-Footnote-100171244 +Ref: Wrapper Classes-Footnote-101171308 +Ref: Wrapper Classes-Footnote-102171372 +Ref: Wrapper Classes-Footnote-103171438 +Ref: Wrapper Classes-Footnote-104171500 +Ref: Wrapper Classes-Footnote-105171564 +Ref: Wrapper Classes-Footnote-106171626 +Ref: Wrapper Classes-Footnote-107171689 +Ref: Wrapper Classes-Footnote-108171753 +Ref: Wrapper Classes-Footnote-109171815 +Ref: Wrapper Classes-Footnote-110171877 +Ref: Wrapper Classes-Footnote-111171939 +Ref: Wrapper Classes-Footnote-112172001 +Ref: Wrapper Classes-Footnote-113172065 +Ref: Wrapper Classes-Footnote-114172142 +Ref: Wrapper Classes-Footnote-115172204 +Ref: Wrapper Classes-Footnote-116172266 +Ref: Wrapper Classes-Footnote-117172344 +Ref: Wrapper Classes-Footnote-118172407 +Ref: Wrapper Classes-Footnote-119172469 +Ref: Wrapper Classes-Footnote-120172546 +Ref: Wrapper Classes-Footnote-121172609 +Ref: Wrapper Classes-Footnote-122172674 +Ref: Wrapper Classes-Footnote-123172736 +Ref: Wrapper Classes-Footnote-124172798 +Ref: Wrapper Classes-Footnote-125172862 +Ref: Wrapper Classes-Footnote-126172926 +Ref: Wrapper Classes-Footnote-127172988 +Ref: Wrapper Classes-Footnote-128173052 +Ref: Wrapper Classes-Footnote-129173116 +Ref: Wrapper Classes-Footnote-130173178 +Ref: Wrapper Classes-Footnote-131173242 +Ref: Wrapper Classes-Footnote-132173304 +Ref: Wrapper Classes-Footnote-133173368 +Ref: Wrapper Classes-Footnote-134173432 +Ref: Wrapper Classes-Footnote-135173494 +Node: URL Routing173557 +Ref: routing doc173672 +Ref: 4f173672 +Ref: routing module-werkzeug routing173672 +Ref: d173672 +Ref: routing url-routing173672 +Ref: 141173672 +Ref: URL Routing-Footnote-1174409 +Node: Quickstart<3>174458 +Ref: routing quickstart174541 +Ref: 142174541 +Ref: routing routes174541 +Ref: 143174541 +Node: Rule Format176687 +Ref: routing rule-format176798 +Ref: 147176798 +Node: Built-in Converters177814 +Ref: routing built-in-converters177935 +Ref: 148177935 +Ref: routing werkzeug routing UnicodeConverter178139 +Ref: 14a178139 +Ref: routing werkzeug routing PathConverter178960 +Ref: 14b178960 +Ref: routing werkzeug routing AnyConverter179426 +Ref: 14c179426 +Ref: routing werkzeug routing IntegerConverter179876 +Ref: 14d179876 +Ref: routing werkzeug routing FloatConverter180897 +Ref: 14e180897 +Ref: routing werkzeug routing UUIDConverter181688 +Ref: 14f181688 +Ref: Built-in Converters-Footnote-1182097 +Ref: Built-in Converters-Footnote-2182158 +Ref: Built-in Converters-Footnote-3182219 +Ref: Built-in Converters-Footnote-4182280 +Ref: Built-in Converters-Footnote-5182342 +Ref: Built-in Converters-Footnote-6182404 +Ref: Built-in Converters-Footnote-7182464 +Ref: Built-in Converters-Footnote-8182526 +Ref: Built-in Converters-Footnote-9182587 +Ref: Built-in Converters-Footnote-10182648 +Ref: Built-in Converters-Footnote-11182710 +Ref: Built-in Converters-Footnote-12182773 +Ref: Built-in Converters-Footnote-13182836 +Ref: Built-in Converters-Footnote-14182900 +Ref: Built-in Converters-Footnote-15182964 +Ref: Built-in Converters-Footnote-16183027 +Ref: Built-in Converters-Footnote-17183090 +Node: Maps Rules and Adapters183153 +Ref: routing maps-rules-and-adapters183277 +Ref: 150183277 +Ref: routing werkzeug routing Map183340 +Ref: 2f183340 +Ref: routing werkzeug routing Map converters186358 +Ref: 149186358 +Ref: routing werkzeug routing Map add186714 +Ref: 152186714 +Ref: routing werkzeug routing Map bind187052 +Ref: 153187052 +Ref: routing werkzeug routing Map bind_to_environ189138 +Ref: 154189138 +Ref: routing werkzeug routing Map default_converters191603 +Ref: 155191603 +Ref: routing werkzeug routing Map is_endpoint_expecting192166 +Ref: 156192166 +Ref: routing werkzeug routing Map iter_rules192910 +Ref: 157192910 +Ref: routing werkzeug routing Map lock_class193269 +Ref: 158193269 +Ref: routing werkzeug routing Map update193382 +Ref: 159193382 +Ref: routing werkzeug routing MapAdapter193571 +Ref: 144193571 +Ref: routing werkzeug routing MapAdapter allowed_methods194413 +Ref: 15a194413 +Ref: routing werkzeug routing MapAdapter build194686 +Ref: 15b194686 +Ref: routing werkzeug routing MapAdapter dispatch198441 +Ref: 15c198441 +Ref: routing werkzeug routing MapAdapter get_host201027 +Ref: 15d201027 +Ref: routing werkzeug routing MapAdapter make_alias_redirect_url201361 +Ref: 15e201361 +Ref: routing werkzeug routing MapAdapter match201942 +Ref: 145201942 +Ref: routing werkzeug routing MapAdapter test206610 +Ref: 15f206610 +Ref: routing werkzeug routing Rule207225 +Ref: 30207225 +Ref: routing werkzeug routing Rule empty214176 +Ref: 160214176 +Ref: Maps Rules and Adapters-Footnote-1214543 +Ref: Maps Rules and Adapters-Footnote-2214603 +Ref: Maps Rules and Adapters-Footnote-3214663 +Ref: Maps Rules and Adapters-Footnote-4214725 +Ref: Maps Rules and Adapters-Footnote-5214787 +Ref: Maps Rules and Adapters-Footnote-6214849 +Ref: Maps Rules and Adapters-Footnote-7214909 +Ref: Maps Rules and Adapters-Footnote-8214971 +Ref: Maps Rules and Adapters-Footnote-9215031 +Ref: Maps Rules and Adapters-Footnote-10215093 +Ref: Maps Rules and Adapters-Footnote-11215156 +Ref: Maps Rules and Adapters-Footnote-12215219 +Ref: Maps Rules and Adapters-Footnote-13215280 +Ref: Maps Rules and Adapters-Footnote-14215341 +Ref: Maps Rules and Adapters-Footnote-15215402 +Ref: Maps Rules and Adapters-Footnote-16215463 +Ref: Maps Rules and Adapters-Footnote-17215524 +Ref: Maps Rules and Adapters-Footnote-18215585 +Ref: Maps Rules and Adapters-Footnote-19215646 +Ref: Maps Rules and Adapters-Footnote-20215707 +Ref: Maps Rules and Adapters-Footnote-21215768 +Ref: Maps Rules and Adapters-Footnote-22215829 +Ref: Maps Rules and Adapters-Footnote-23215890 +Ref: Maps Rules and Adapters-Footnote-24215951 +Ref: Maps Rules and Adapters-Footnote-25216014 +Ref: Maps Rules and Adapters-Footnote-26216075 +Ref: Maps Rules and Adapters-Footnote-27216138 +Ref: Maps Rules and Adapters-Footnote-28216199 +Ref: Maps Rules and Adapters-Footnote-29216260 +Ref: Maps Rules and Adapters-Footnote-30216321 +Ref: Maps Rules and Adapters-Footnote-31216382 +Ref: Maps Rules and Adapters-Footnote-32216443 +Ref: Maps Rules and Adapters-Footnote-33216504 +Ref: Maps Rules and Adapters-Footnote-34216565 +Ref: Maps Rules and Adapters-Footnote-35216626 +Ref: Maps Rules and Adapters-Footnote-36216687 +Ref: Maps Rules and Adapters-Footnote-37216748 +Ref: Maps Rules and Adapters-Footnote-38216809 +Ref: Maps Rules and Adapters-Footnote-39216870 +Ref: Maps Rules and Adapters-Footnote-40216931 +Ref: Maps Rules and Adapters-Footnote-41216994 +Ref: Maps Rules and Adapters-Footnote-42217057 +Ref: Maps Rules and Adapters-Footnote-43217118 +Ref: Maps Rules and Adapters-Footnote-44217179 +Ref: Maps Rules and Adapters-Footnote-45217240 +Ref: Maps Rules and Adapters-Footnote-46217301 +Ref: Maps Rules and Adapters-Footnote-47217362 +Ref: Maps Rules and Adapters-Footnote-48217423 +Ref: Maps Rules and Adapters-Footnote-49217486 +Ref: Maps Rules and Adapters-Footnote-50217547 +Ref: Maps Rules and Adapters-Footnote-51217608 +Ref: Maps Rules and Adapters-Footnote-52217669 +Ref: Maps Rules and Adapters-Footnote-53217730 +Ref: Maps Rules and Adapters-Footnote-54217791 +Ref: Maps Rules and Adapters-Footnote-55217852 +Ref: Maps Rules and Adapters-Footnote-56217913 +Ref: Maps Rules and Adapters-Footnote-57217974 +Ref: Maps Rules and Adapters-Footnote-58218035 +Ref: Maps Rules and Adapters-Footnote-59218096 +Ref: Maps Rules and Adapters-Footnote-60218157 +Ref: Maps Rules and Adapters-Footnote-61218220 +Ref: Maps Rules and Adapters-Footnote-62218281 +Ref: Maps Rules and Adapters-Footnote-63218342 +Ref: Maps Rules and Adapters-Footnote-64218405 +Ref: Maps Rules and Adapters-Footnote-65218466 +Ref: Maps Rules and Adapters-Footnote-66218527 +Ref: Maps Rules and Adapters-Footnote-67218588 +Ref: Maps Rules and Adapters-Footnote-68218649 +Ref: Maps Rules and Adapters-Footnote-69218712 +Ref: Maps Rules and Adapters-Footnote-70218773 +Ref: Maps Rules and Adapters-Footnote-71218834 +Ref: Maps Rules and Adapters-Footnote-72218895 +Ref: Maps Rules and Adapters-Footnote-73218956 +Ref: Maps Rules and Adapters-Footnote-74219019 +Ref: Maps Rules and Adapters-Footnote-75219080 +Ref: Maps Rules and Adapters-Footnote-76219143 +Ref: Maps Rules and Adapters-Footnote-77219206 +Ref: Maps Rules and Adapters-Footnote-78219267 +Ref: Maps Rules and Adapters-Footnote-79219328 +Ref: Maps Rules and Adapters-Footnote-80219391 +Ref: Maps Rules and Adapters-Footnote-81219452 +Ref: Maps Rules and Adapters-Footnote-82219515 +Node: Rule Factories219578 +Ref: routing rule-factories219697 +Ref: 161219697 +Ref: routing werkzeug routing RuleFactory219740 +Ref: 151219740 +Ref: routing werkzeug routing RuleFactory get_rules220026 +Ref: 162220026 +Ref: routing werkzeug routing Subdomain220315 +Ref: 163220315 +Ref: routing werkzeug routing Submount221257 +Ref: 164221257 +Ref: routing werkzeug routing EndpointPrefix221904 +Ref: 165221904 +Ref: Rule Factories-Footnote-1222601 +Ref: Rule Factories-Footnote-2222661 +Ref: Rule Factories-Footnote-3222723 +Ref: Rule Factories-Footnote-4222783 +Ref: Rule Factories-Footnote-5222845 +Ref: Rule Factories-Footnote-6222905 +Node: Rule Templates222967 +Ref: routing rule-templates223080 +Ref: 166223080 +Ref: routing werkzeug routing RuleTemplate223123 +Ref: 167223123 +Ref: Rule Templates-Footnote-1223935 +Node: Custom Converters223997 +Ref: routing custom-converters224109 +Ref: 168224109 +Node: Host Matching226260 +Ref: routing host-matching226368 +Ref: 169226368 +Node: WebSockets227133 +Ref: routing websockets227215 +Ref: 16a227215 +Node: WSGI Helpers228167 +Ref: wsgi doc228270 +Ref: 16b228270 +Ref: wsgi module-werkzeug wsgi228270 +Ref: 15228270 +Ref: wsgi wsgi-helpers228270 +Ref: 16c228270 +Node: Iterator / Stream Helpers228729 +Ref: wsgi iterator-stream-helpers228829 +Ref: 16d228829 +Ref: wsgi werkzeug wsgi ClosingIterator228997 +Ref: 16e228997 +Ref: wsgi werkzeug wsgi FileWrapper230303 +Ref: 16f230303 +Ref: wsgi werkzeug wsgi LimitedStream231099 +Ref: 170231099 +Ref: wsgi werkzeug wsgi LimitedStream exhaust232847 +Ref: 176232847 +Ref: wsgi werkzeug wsgi LimitedStream is_exhausted233207 +Ref: 177233207 +Ref: wsgi werkzeug wsgi LimitedStream on_disconnect233318 +Ref: 178233318 +Ref: wsgi werkzeug wsgi LimitedStream on_exhausted233640 +Ref: 171233640 +Ref: wsgi werkzeug wsgi LimitedStream read233874 +Ref: 172233874 +Ref: wsgi werkzeug wsgi LimitedStream readable234147 +Ref: 17a234147 +Ref: wsgi werkzeug wsgi LimitedStream readline234316 +Ref: 174234316 +Ref: wsgi werkzeug wsgi LimitedStream readlines234510 +Ref: 173234510 +Ref: wsgi werkzeug wsgi LimitedStream tell234921 +Ref: 17b234921 +Ref: wsgi werkzeug wsgi make_line_iter235058 +Ref: 175235058 +Ref: wsgi werkzeug wsgi make_chunk_iter236824 +Ref: 17c236824 +Ref: wsgi werkzeug wsgi wrap_file238233 +Ref: 133238233 +Ref: Iterator / Stream Helpers-Footnote-1239192 +Ref: Iterator / Stream Helpers-Footnote-2239254 +Ref: Iterator / Stream Helpers-Footnote-3239316 +Ref: Iterator / Stream Helpers-Footnote-4239378 +Ref: Iterator / Stream Helpers-Footnote-5239440 +Ref: Iterator / Stream Helpers-Footnote-6239502 +Ref: Iterator / Stream Helpers-Footnote-7239563 +Ref: Iterator / Stream Helpers-Footnote-8239625 +Ref: Iterator / Stream Helpers-Footnote-9239687 +Ref: Iterator / Stream Helpers-Footnote-10239748 +Ref: Iterator / Stream Helpers-Footnote-11239811 +Ref: Iterator / Stream Helpers-Footnote-12239873 +Ref: Iterator / Stream Helpers-Footnote-13239936 +Ref: Iterator / Stream Helpers-Footnote-14239999 +Ref: Iterator / Stream Helpers-Footnote-15240062 +Ref: Iterator / Stream Helpers-Footnote-16240125 +Ref: Iterator / Stream Helpers-Footnote-17240187 +Ref: Iterator / Stream Helpers-Footnote-18240250 +Ref: Iterator / Stream Helpers-Footnote-19240313 +Ref: Iterator / Stream Helpers-Footnote-20240375 +Ref: Iterator / Stream Helpers-Footnote-21240438 +Ref: Iterator / Stream Helpers-Footnote-22240500 +Ref: Iterator / Stream Helpers-Footnote-23240563 +Ref: Iterator / Stream Helpers-Footnote-24240625 +Ref: Iterator / Stream Helpers-Footnote-25240688 +Ref: Iterator / Stream Helpers-Footnote-26240751 +Ref: Iterator / Stream Helpers-Footnote-27240813 +Ref: Iterator / Stream Helpers-Footnote-28240875 +Ref: Iterator / Stream Helpers-Footnote-29240938 +Ref: Iterator / Stream Helpers-Footnote-30241001 +Ref: Iterator / Stream Helpers-Footnote-31241064 +Ref: Iterator / Stream Helpers-Footnote-32241127 +Ref: Iterator / Stream Helpers-Footnote-33241190 +Ref: Iterator / Stream Helpers-Footnote-34241252 +Ref: Iterator / Stream Helpers-Footnote-35241314 +Ref: Iterator / Stream Helpers-Footnote-36241377 +Ref: Iterator / Stream Helpers-Footnote-37241440 +Ref: Iterator / Stream Helpers-Footnote-38241490 +Ref: Iterator / Stream Helpers-Footnote-39241553 +Ref: Iterator / Stream Helpers-Footnote-40241615 +Node: Environ Helpers241678 +Ref: wsgi environ-helpers241806 +Ref: 17d241806 +Ref: wsgi werkzeug wsgi get_host241967 +Ref: 17e241967 +Ref: wsgi werkzeug wsgi get_content_length242819 +Ref: 181242819 +Ref: wsgi werkzeug wsgi get_input_stream243224 +Ref: 182243224 +Ref: wsgi werkzeug wsgi get_current_url244232 +Ref: 183244232 +Ref: wsgi werkzeug wsgi get_query_string245210 +Ref: 185245210 +Ref: wsgi werkzeug wsgi get_script_name245618 +Ref: 186245618 +Ref: wsgi werkzeug wsgi get_path_info246208 +Ref: 187246208 +Ref: wsgi werkzeug wsgi pop_path_info246792 +Ref: 188246792 +Ref: wsgi werkzeug wsgi peek_path_info248033 +Ref: 189248033 +Ref: wsgi werkzeug wsgi extract_path_info248907 +Ref: 18a248907 +Ref: wsgi werkzeug wsgi host_is_trusted250853 +Ref: 17f250853 +Ref: Environ Helpers-Footnote-1251330 +Ref: Environ Helpers-Footnote-2251390 +Ref: Environ Helpers-Footnote-3251450 +Ref: Environ Helpers-Footnote-4251511 +Ref: Environ Helpers-Footnote-5251573 +Ref: Environ Helpers-Footnote-6251635 +Ref: Environ Helpers-Footnote-7251697 +Ref: Environ Helpers-Footnote-8251759 +Ref: Environ Helpers-Footnote-9251821 +Ref: Environ Helpers-Footnote-10251881 +Ref: Environ Helpers-Footnote-11251942 +Ref: Environ Helpers-Footnote-12252003 +Ref: Environ Helpers-Footnote-13252064 +Ref: Environ Helpers-Footnote-14252125 +Ref: Environ Helpers-Footnote-15252186 +Ref: Environ Helpers-Footnote-16252247 +Ref: Environ Helpers-Footnote-17252308 +Ref: Environ Helpers-Footnote-18252369 +Ref: Environ Helpers-Footnote-19252430 +Ref: Environ Helpers-Footnote-20252491 +Ref: Environ Helpers-Footnote-21252552 +Ref: Environ Helpers-Footnote-22252613 +Ref: Environ Helpers-Footnote-23252674 +Ref: Environ Helpers-Footnote-24252735 +Ref: Environ Helpers-Footnote-25252796 +Ref: Environ Helpers-Footnote-26252857 +Ref: Environ Helpers-Footnote-27252918 +Ref: Environ Helpers-Footnote-28252979 +Ref: Environ Helpers-Footnote-29253042 +Ref: Environ Helpers-Footnote-30253103 +Ref: Environ Helpers-Footnote-31253164 +Ref: Environ Helpers-Footnote-32253225 +Node: Convenience Helpers253288 +Ref: wsgi convenience-helpers253418 +Ref: 18b253418 +Ref: wsgi werkzeug wsgi responder253471 +Ref: 18c253471 +Ref: wsgi werkzeug testapp test_app253944 +Ref: 18d253944 +Ref: Convenience Helpers-Footnote-1254682 +Node: Bytes Strings and Encodings254744 +Ref: wsgi bytes-strings-and-encodings254892 +Ref: 18e254892 +Ref: Bytes Strings and Encodings-Footnote-1256122 +Node: Raw Request URI and Path Encoding256171 +Ref: wsgi raw-request-uri-and-path-encoding256291 +Ref: 190256291 +Ref: Raw Request URI and Path Encoding-Footnote-1257422 +Node: HTTP Utilities257471 +Ref: http doc257578 +Ref: 191257578 +Ref: http http-utilities257578 +Ref: 192257578 +Ref: http module-werkzeug http257578 +Ref: 4257578 +Node: Datetime Functions258045 +Ref: http datetime-functions258142 +Ref: 193258142 +Ref: http werkzeug http parse_date258881 +Ref: 194258881 +Ref: http werkzeug http http_date259623 +Ref: 195259623 +Ref: Datetime Functions-Footnote-1260356 +Ref: Datetime Functions-Footnote-2260430 +Ref: Datetime Functions-Footnote-3260479 +Ref: Datetime Functions-Footnote-4260553 +Ref: Datetime Functions-Footnote-5260647 +Ref: Datetime Functions-Footnote-6260707 +Ref: Datetime Functions-Footnote-7260781 +Ref: Datetime Functions-Footnote-8260830 +Ref: Datetime Functions-Footnote-9260918 +Ref: Datetime Functions-Footnote-10260992 +Ref: Datetime Functions-Footnote-11261063 +Ref: Datetime Functions-Footnote-12261125 +Ref: Datetime Functions-Footnote-13261189 +Ref: Datetime Functions-Footnote-14261259 +Node: Header Parsing<2>261320 +Ref: http header-parsing261442 +Ref: 196261442 +Ref: http werkzeug http parse_options_header261737 +Ref: 198261737 +Ref: http werkzeug http parse_set_header262717 +Ref: 19a262717 +Ref: http werkzeug http parse_list_header263811 +Ref: 19c263811 +Ref: http werkzeug http parse_dict_header264701 +Ref: 199264701 +Ref: http werkzeug http parse_accept_header265831 +Ref: 19d265831 +Ref: http werkzeug http parse_cache_control_header266785 +Ref: 19e266785 +Ref: http werkzeug http parse_authorization_header267914 +Ref: 19f267914 +Ref: http werkzeug http parse_www_authenticate_header268461 +Ref: 1a0268461 +Ref: http werkzeug http parse_if_range_header269222 +Ref: 1a1269222 +Ref: http werkzeug http parse_range_header269643 +Ref: 1a2269643 +Ref: http werkzeug http parse_content_range_header270181 +Ref: 1a3270181 +Ref: Header Parsing<2>-Footnote-1270976 +Ref: Header Parsing<2>-Footnote-2271025 +Ref: Header Parsing<2>-Footnote-3271074 +Ref: Header Parsing<2>-Footnote-4271134 +Ref: Header Parsing<2>-Footnote-5271196 +Ref: Header Parsing<2>-Footnote-6271256 +Ref: Header Parsing<2>-Footnote-7271316 +Ref: Header Parsing<2>-Footnote-8271376 +Ref: Header Parsing<2>-Footnote-9271436 +Ref: Header Parsing<2>-Footnote-10271498 +Ref: Header Parsing<2>-Footnote-11271560 +Ref: Header Parsing<2>-Footnote-12271622 +Ref: Header Parsing<2>-Footnote-13271683 +Ref: Header Parsing<2>-Footnote-14271745 +Ref: Header Parsing<2>-Footnote-15271806 +Ref: Header Parsing<2>-Footnote-16271868 +Ref: Header Parsing<2>-Footnote-17271929 +Ref: Header Parsing<2>-Footnote-18271991 +Ref: Header Parsing<2>-Footnote-19272052 +Ref: Header Parsing<2>-Footnote-20272113 +Ref: Header Parsing<2>-Footnote-21272174 +Ref: Header Parsing<2>-Footnote-22272235 +Ref: Header Parsing<2>-Footnote-23272298 +Ref: Header Parsing<2>-Footnote-24272359 +Ref: Header Parsing<2>-Footnote-25272420 +Ref: Header Parsing<2>-Footnote-26272483 +Ref: Header Parsing<2>-Footnote-27272544 +Ref: Header Parsing<2>-Footnote-28272605 +Ref: Header Parsing<2>-Footnote-29272668 +Ref: Header Parsing<2>-Footnote-30272729 +Node: Header Utilities272792 +Ref: http header-utilities272903 +Ref: 1a4272903 +Ref: http werkzeug http is_entity_header273268 +Ref: 1a5273268 +Ref: http werkzeug http is_hop_by_hop_header273565 +Ref: 1a6273565 +Ref: http werkzeug http remove_entity_headers273909 +Ref: 1a7273909 +Ref: http werkzeug http remove_hop_by_hop_headers274824 +Ref: 1a8274824 +Ref: http werkzeug http is_byte_range_valid275302 +Ref: 1a9275302 +Ref: http werkzeug http quote_header_value275716 +Ref: 1aa275716 +Ref: http werkzeug http unquote_header_value276244 +Ref: 1ab276244 +Ref: http werkzeug http dump_header276743 +Ref: 19b276743 +Ref: Header Utilities-Footnote-1277739 +Ref: Header Utilities-Footnote-2277799 +Ref: Header Utilities-Footnote-3277861 +Ref: Header Utilities-Footnote-4277921 +Ref: Header Utilities-Footnote-5277983 +Ref: Header Utilities-Footnote-6278032 +Ref: Header Utilities-Footnote-7278092 +Ref: Header Utilities-Footnote-8278152 +Ref: Header Utilities-Footnote-9278212 +Ref: Header Utilities-Footnote-10278274 +Ref: Header Utilities-Footnote-11278335 +Ref: Header Utilities-Footnote-12278396 +Ref: Header Utilities-Footnote-13278459 +Ref: Header Utilities-Footnote-14278521 +Ref: Header Utilities-Footnote-15278583 +Ref: Header Utilities-Footnote-16278645 +Ref: Header Utilities-Footnote-17278708 +Ref: Header Utilities-Footnote-18278769 +Ref: Header Utilities-Footnote-19278831 +Ref: Header Utilities-Footnote-20278892 +Ref: Header Utilities-Footnote-21278955 +Ref: Header Utilities-Footnote-22279016 +Ref: Header Utilities-Footnote-23279077 +Ref: Header Utilities-Footnote-24279140 +Ref: Header Utilities-Footnote-25279201 +Ref: Header Utilities-Footnote-26279262 +Ref: Header Utilities-Footnote-27279323 +Ref: Header Utilities-Footnote-28279385 +Ref: Header Utilities-Footnote-29279446 +Ref: Header Utilities-Footnote-30279509 +Node: Cookies279570 +Ref: http cookies279692 +Ref: 1ac279692 +Ref: http werkzeug http parse_cookie279721 +Ref: 1ad279721 +Ref: http werkzeug http dump_cookie281003 +Ref: 1ae281003 +Ref: Cookies-Footnote-1284026 +Ref: Cookies-Footnote-2284086 +Ref: Cookies-Footnote-3284148 +Ref: Cookies-Footnote-4284208 +Ref: Cookies-Footnote-5284268 +Ref: Cookies-Footnote-6284328 +Ref: Cookies-Footnote-7284388 +Ref: Cookies-Footnote-8284437 +Ref: Cookies-Footnote-9284513 +Ref: Cookies-Footnote-10284574 +Ref: Cookies-Footnote-11284635 +Ref: Cookies-Footnote-12284711 +Ref: Cookies-Footnote-13284773 +Ref: Cookies-Footnote-14284837 +Ref: Cookies-Footnote-15284898 +Ref: Cookies-Footnote-16284959 +Ref: Cookies-Footnote-17285022 +Ref: Cookies-Footnote-18285085 +Ref: Cookies-Footnote-19285146 +Ref: Cookies-Footnote-20285209 +Ref: Cookies-Footnote-21285271 +Ref: Cookies-Footnote-22285320 +Ref: Cookies-Footnote-23285381 +Ref: Cookies-Footnote-24285442 +Ref: Cookies-Footnote-25285505 +Ref: Cookies-Footnote-26285566 +Node: Conditional Response Helpers285627 +Ref: http conditional-response-helpers285742 +Ref: 1af285742 +Ref: http werkzeug http parse_etags285881 +Ref: 1b0285881 +Ref: http werkzeug http quote_etag286164 +Ref: 1b1286164 +Ref: http werkzeug http unquote_etag286420 +Ref: 1b2286420 +Ref: http werkzeug http generate_etag286849 +Ref: 1b3286849 +Ref: http werkzeug http is_resource_modified287105 +Ref: 1b4287105 +Ref: Conditional Response Helpers-Footnote-1288434 +Ref: Conditional Response Helpers-Footnote-2288494 +Ref: Conditional Response Helpers-Footnote-3288554 +Ref: Conditional Response Helpers-Footnote-4288616 +Ref: Conditional Response Helpers-Footnote-5288676 +Ref: Conditional Response Helpers-Footnote-6288736 +Ref: Conditional Response Helpers-Footnote-7288796 +Ref: Conditional Response Helpers-Footnote-8288858 +Ref: Conditional Response Helpers-Footnote-9288920 +Ref: Conditional Response Helpers-Footnote-10288982 +Ref: Conditional Response Helpers-Footnote-11289045 +Ref: Conditional Response Helpers-Footnote-12289106 +Ref: Conditional Response Helpers-Footnote-13289167 +Ref: Conditional Response Helpers-Footnote-14289230 +Ref: Conditional Response Helpers-Footnote-15289306 +Ref: Conditional Response Helpers-Footnote-16289367 +Ref: Conditional Response Helpers-Footnote-17289430 +Node: Constants289493 +Ref: http constants289618 +Ref: 1b5289618 +Ref: http werkzeug http HTTP_STATUS_CODES289651 +Ref: 1b6289651 +Node: Form Data Parsing289886 +Ref: http form-data-parsing289974 +Ref: 1b7289974 +Ref: http module-werkzeug formparser289974 +Ref: 3289974 +Ref: http werkzeug formparser FormDataParser291336 +Ref: bd291336 +Ref: http werkzeug formparser parse_form_data293201 +Ref: 1b8293201 +Ref: Form Data Parsing-Footnote-1295815 +Ref: Form Data Parsing-Footnote-2295875 +Ref: Form Data Parsing-Footnote-3295935 +Ref: Form Data Parsing-Footnote-4295996 +Ref: Form Data Parsing-Footnote-5296057 +Ref: Form Data Parsing-Footnote-6296119 +Ref: Form Data Parsing-Footnote-7296181 +Ref: Form Data Parsing-Footnote-8296241 +Ref: Form Data Parsing-Footnote-9296301 +Ref: Form Data Parsing-Footnote-10296362 +Ref: Form Data Parsing-Footnote-11296424 +Node: Data Structures296487 +Ref: datastructures doc296591 +Ref: 1b9296591 +Ref: datastructures data-structures296591 +Ref: 1ba296591 +Ref: datastructures module-werkzeug datastructures296591 +Ref: 0296591 +Node: General Purpose296905 +Ref: datastructures general-purpose296995 +Ref: 1bb296995 +Ref: datastructures werkzeug datastructures TypeConversionDict297277 +Ref: 1bc297277 +Ref: datastructures werkzeug datastructures TypeConversionDict get297582 +Ref: 1bd297582 +Ref: datastructures werkzeug datastructures ImmutableTypeConversionDict298622 +Ref: 1be298622 +Ref: datastructures werkzeug datastructures ImmutableTypeConversionDict copy298803 +Ref: 1bf298803 +Ref: datastructures werkzeug datastructures MultiDict299071 +Ref: 82299071 +Ref: datastructures werkzeug datastructures MultiDict add300762 +Ref: 1c0300762 +Ref: datastructures werkzeug datastructures MultiDict clear300996 +Ref: 1c1300996 +Ref: datastructures werkzeug datastructures MultiDict copy301057 +Ref: 1c2301057 +Ref: datastructures werkzeug datastructures MultiDict deepcopy301132 +Ref: 1c3301132 +Ref: datastructures werkzeug datastructures MultiDict fromkeys301217 +Ref: 1c4301217 +Ref: datastructures werkzeug datastructures MultiDict get301354 +Ref: 1c5301354 +Ref: datastructures werkzeug datastructures MultiDict getlist302394 +Ref: 1c6302394 +Ref: datastructures werkzeug datastructures MultiDict items303093 +Ref: 1c7303093 +Ref: datastructures werkzeug datastructures MultiDict keys303409 +Ref: 1c8303409 +Ref: datastructures werkzeug datastructures MultiDict lists303500 +Ref: 1c9303500 +Ref: datastructures werkzeug datastructures MultiDict listvalues303660 +Ref: 1ca303660 +Ref: datastructures werkzeug datastructures MultiDict pop303995 +Ref: 1cb303995 +Ref: datastructures werkzeug datastructures MultiDict popitem304530 +Ref: 1cc304530 +Ref: datastructures werkzeug datastructures MultiDict popitemlist304597 +Ref: 1cd304597 +Ref: datastructures werkzeug datastructures MultiDict poplist304686 +Ref: 1ce304686 +Ref: datastructures werkzeug datastructures MultiDict setdefault304960 +Ref: 1cf304960 +Ref: datastructures werkzeug datastructures MultiDict setlist305404 +Ref: 1d0305404 +Ref: datastructures werkzeug datastructures MultiDict setlistdefault306044 +Ref: 1d1306044 +Ref: datastructures werkzeug datastructures MultiDict to_dict306819 +Ref: 1d2306819 +Ref: datastructures werkzeug datastructures MultiDict update307313 +Ref: 1d3307313 +Ref: datastructures werkzeug datastructures MultiDict values307942 +Ref: 1d4307942 +Ref: datastructures werkzeug datastructures OrderedMultiDict308059 +Ref: 1d5308059 +Ref: datastructures werkzeug datastructures ImmutableMultiDict308726 +Ref: a7308726 +Ref: datastructures werkzeug datastructures ImmutableMultiDict copy308862 +Ref: 1d6308862 +Ref: datastructures werkzeug datastructures ImmutableOrderedMultiDict309131 +Ref: 1d7309131 +Ref: datastructures werkzeug datastructures ImmutableOrderedMultiDict copy309292 +Ref: 1d8309292 +Ref: datastructures werkzeug datastructures CombinedMultiDict309561 +Ref: f7309561 +Ref: datastructures werkzeug datastructures ImmutableDict310519 +Ref: 1d9310519 +Ref: datastructures werkzeug datastructures ImmutableDict copy310624 +Ref: 1da310624 +Ref: datastructures werkzeug datastructures ImmutableList310893 +Ref: d7310893 +Ref: datastructures werkzeug datastructures FileMultiDict311031 +Ref: 83311031 +Ref: datastructures werkzeug datastructures FileMultiDict add_file311295 +Ref: 1db311295 +Ref: General Purpose-Footnote-1311809 +Ref: General Purpose-Footnote-2311878 +Ref: General Purpose-Footnote-3311947 +Ref: General Purpose-Footnote-4312009 +Ref: General Purpose-Footnote-5312078 +Ref: General Purpose-Footnote-6312147 +Ref: General Purpose-Footnote-7312216 +Ref: General Purpose-Footnote-8312277 +Ref: General Purpose-Footnote-9312338 +Ref: General Purpose-Footnote-10312399 +Ref: General Purpose-Footnote-11312462 +Ref: General Purpose-Footnote-12312525 +Ref: General Purpose-Footnote-13312587 +Ref: General Purpose-Footnote-14312650 +Node: HTTP Related312712 +Ref: datastructures http-datastructures312817 +Ref: 197312817 +Ref: datastructures http-related312817 +Ref: 1dc312817 +Ref: datastructures werkzeug datastructures Headers312856 +Ref: 70312856 +Ref: datastructures werkzeug datastructures Headers add314537 +Ref: 1dd314537 +Ref: datastructures werkzeug datastructures Headers add_header315135 +Ref: 1de315135 +Ref: datastructures werkzeug datastructures Headers clear315347 +Ref: 1df315347 +Ref: datastructures werkzeug datastructures Headers extend315405 +Ref: 1e0315405 +Ref: datastructures werkzeug datastructures Headers get315948 +Ref: 1e2315948 +Ref: datastructures werkzeug datastructures Headers get_all317078 +Ref: 1e3317078 +Ref: datastructures werkzeug datastructures Headers getlist317265 +Ref: 1e4317265 +Ref: datastructures werkzeug datastructures Headers pop318141 +Ref: 1e5318141 +Ref: datastructures werkzeug datastructures Headers popitem318529 +Ref: 1e6318529 +Ref: datastructures werkzeug datastructures Headers remove318625 +Ref: 1e7318625 +Ref: datastructures werkzeug datastructures Headers set318742 +Ref: 1e8318742 +Ref: datastructures werkzeug datastructures Headers setdefault319423 +Ref: 1e9319423 +Ref: datastructures werkzeug datastructures Headers setlist319820 +Ref: 1ea319820 +Ref: datastructures werkzeug datastructures Headers setlistdefault320112 +Ref: 1eb320112 +Ref: datastructures werkzeug datastructures Headers to_wsgi_list320692 +Ref: 1ec320692 +Ref: datastructures werkzeug datastructures Headers update320814 +Ref: 1e1320814 +Ref: datastructures werkzeug datastructures EnvironHeaders321263 +Ref: 18f321263 +Ref: datastructures werkzeug datastructures HeaderSet321736 +Ref: e5321736 +Ref: datastructures werkzeug datastructures HeaderSet add322243 +Ref: 1ed322243 +Ref: datastructures werkzeug datastructures HeaderSet as_set322314 +Ref: 1ee322314 +Ref: datastructures werkzeug datastructures HeaderSet clear322737 +Ref: 1ef322737 +Ref: datastructures werkzeug datastructures HeaderSet discard322790 +Ref: 1f0322790 +Ref: datastructures werkzeug datastructures HeaderSet find322951 +Ref: 1f2322951 +Ref: datastructures werkzeug datastructures HeaderSet index323142 +Ref: 1f3323142 +Ref: datastructures werkzeug datastructures HeaderSet remove323335 +Ref: 1f1323335 +Ref: datastructures werkzeug datastructures HeaderSet to_header323693 +Ref: 1f4323693 +Ref: datastructures werkzeug datastructures HeaderSet update323786 +Ref: 1f5323786 +Ref: datastructures werkzeug datastructures Accept323986 +Ref: 9d323986 +Ref: datastructures werkzeug datastructures Accept best325061 +Ref: 1f6325061 +Ref: datastructures werkzeug datastructures Accept best_match325122 +Ref: 1f7325122 +Ref: datastructures werkzeug datastructures Accept find325578 +Ref: 1f8325578 +Ref: datastructures werkzeug datastructures Accept index325724 +Ref: 1f9325724 +Ref: datastructures werkzeug datastructures Accept quality326004 +Ref: 1fa326004 +Ref: datastructures werkzeug datastructures Accept to_header326244 +Ref: 1fb326244 +Ref: datastructures werkzeug datastructures Accept values326337 +Ref: 1fc326337 +Ref: datastructures werkzeug datastructures MIMEAccept326401 +Ref: a1326401 +Ref: datastructures werkzeug datastructures MIMEAccept accept_html326547 +Ref: 1fd326547 +Ref: datastructures werkzeug datastructures MIMEAccept accept_json326624 +Ref: 1fe326624 +Ref: datastructures werkzeug datastructures MIMEAccept accept_xhtml326701 +Ref: 1ff326701 +Ref: datastructures werkzeug datastructures CharsetAccept326780 +Ref: 9b326780 +Ref: datastructures werkzeug datastructures LanguageAccept326908 +Ref: 9f326908 +Ref: datastructures werkzeug datastructures RequestCacheControl327042 +Ref: ad327042 +Ref: datastructures werkzeug datastructures RequestCacheControl no_cache327776 +Ref: 200327776 +Ref: datastructures werkzeug datastructures RequestCacheControl no_store327845 +Ref: 201327845 +Ref: datastructures werkzeug datastructures RequestCacheControl max_age327914 +Ref: 202327914 +Ref: datastructures werkzeug datastructures RequestCacheControl no_transform327981 +Ref: 203327981 +Ref: datastructures werkzeug datastructures RequestCacheControl max_stale328058 +Ref: 204328058 +Ref: datastructures werkzeug datastructures RequestCacheControl min_fresh328128 +Ref: 205328128 +Ref: datastructures werkzeug datastructures RequestCacheControl only_if_cached328198 +Ref: 206328198 +Ref: datastructures werkzeug datastructures ResponseCacheControl328278 +Ref: 109328278 +Ref: datastructures werkzeug datastructures ResponseCacheControl no_cache329050 +Ref: 207329050 +Ref: datastructures werkzeug datastructures ResponseCacheControl no_store329119 +Ref: 208329119 +Ref: datastructures werkzeug datastructures ResponseCacheControl max_age329188 +Ref: 209329188 +Ref: datastructures werkzeug datastructures ResponseCacheControl no_transform329255 +Ref: 20a329255 +Ref: datastructures werkzeug datastructures ResponseCacheControl immutable329332 +Ref: 20b329332 +Ref: datastructures werkzeug datastructures ResponseCacheControl must_revalidate329402 +Ref: 20c329402 +Ref: datastructures werkzeug datastructures ResponseCacheControl private329484 +Ref: 20d329484 +Ref: datastructures werkzeug datastructures ResponseCacheControl proxy_revalidate329550 +Ref: 20e329550 +Ref: datastructures werkzeug datastructures ResponseCacheControl public329634 +Ref: 20f329634 +Ref: datastructures werkzeug datastructures ResponseCacheControl s_maxage329698 +Ref: 210329698 +Ref: datastructures werkzeug datastructures ETags329766 +Ref: c8329766 +Ref: datastructures werkzeug datastructures ETags as_set329963 +Ref: 211329963 +Ref: datastructures werkzeug datastructures ETags contains330138 +Ref: 212330138 +Ref: datastructures werkzeug datastructures ETags contains_raw330300 +Ref: 213330300 +Ref: datastructures werkzeug datastructures ETags contains_weak330527 +Ref: 214330527 +Ref: datastructures werkzeug datastructures ETags is_strong330655 +Ref: 215330655 +Ref: datastructures werkzeug datastructures ETags is_weak330729 +Ref: 216330729 +Ref: datastructures werkzeug datastructures ETags to_header330799 +Ref: 217330799 +Ref: datastructures werkzeug datastructures Authorization330890 +Ref: 7a330890 +Ref: datastructures werkzeug datastructures Authorization cnonce331253 +Ref: 218331253 +Ref: datastructures werkzeug datastructures Authorization nc331471 +Ref: 219331471 +Ref: datastructures werkzeug datastructures Authorization nonce331621 +Ref: 21a331621 +Ref: datastructures werkzeug datastructures Authorization opaque331817 +Ref: 21b331817 +Ref: datastructures werkzeug datastructures Authorization password332029 +Ref: 21c332029 +Ref: datastructures werkzeug datastructures Authorization qop332182 +Ref: 21d332182 +Ref: datastructures werkzeug datastructures Authorization realm332443 +Ref: 21e332443 +Ref: datastructures werkzeug datastructures Authorization response332537 +Ref: 21f332537 +Ref: datastructures werkzeug datastructures Authorization to_header332720 +Ref: 220332720 +Ref: datastructures werkzeug datastructures Authorization uri332923 +Ref: 221332923 +Ref: datastructures werkzeug datastructures Authorization username333126 +Ref: 222333126 +Ref: datastructures werkzeug datastructures WWWAuthenticate333260 +Ref: 140333260 +Ref: datastructures werkzeug datastructures WWWAuthenticate algorithm333432 +Ref: 223333432 +Ref: datastructures werkzeug datastructures WWWAuthenticate auth_property333776 +Ref: 224333776 +Ref: datastructures werkzeug datastructures WWWAuthenticate domain334249 +Ref: 226334249 +Ref: datastructures werkzeug datastructures WWWAuthenticate nonce334458 +Ref: 227334458 +Ref: datastructures werkzeug datastructures WWWAuthenticate opaque334682 +Ref: 228334682 +Ref: datastructures werkzeug datastructures WWWAuthenticate qop335009 +Ref: 229335009 +Ref: datastructures werkzeug datastructures WWWAuthenticate realm335120 +Ref: 225335120 +Ref: datastructures werkzeug datastructures WWWAuthenticate set_basic335447 +Ref: 22a335447 +Ref: datastructures werkzeug datastructures WWWAuthenticate set_digest335563 +Ref: 22b335563 +Ref: datastructures werkzeug datastructures WWWAuthenticate stale335734 +Ref: 22c335734 +Ref: datastructures werkzeug datastructures WWWAuthenticate to_header335890 +Ref: 22d335890 +Ref: datastructures werkzeug datastructures WWWAuthenticate type335990 +Ref: 22e335990 +Ref: datastructures werkzeug datastructures IfRange336124 +Ref: cc336124 +Ref: datastructures werkzeug datastructures IfRange date336387 +Ref: 22f336387 +Ref: datastructures werkzeug datastructures IfRange etag336465 +Ref: 230336465 +Ref: datastructures werkzeug datastructures IfRange to_header336627 +Ref: 231336627 +Ref: datastructures werkzeug datastructures Range336715 +Ref: e8336715 +Ref: datastructures werkzeug datastructures Range make_content_range337127 +Ref: 232337127 +Ref: datastructures werkzeug datastructures Range range_for_length337285 +Ref: 233337285 +Ref: datastructures werkzeug datastructures Range ranges337525 +Ref: 234337525 +Ref: datastructures werkzeug datastructures Range to_content_range_header337671 +Ref: 235337671 +Ref: datastructures werkzeug datastructures Range to_header337823 +Ref: 236337823 +Ref: datastructures werkzeug datastructures Range units337911 +Ref: 237337911 +Ref: datastructures werkzeug datastructures ContentRange337996 +Ref: 113337996 +Ref: datastructures werkzeug datastructures ContentRange length338174 +Ref: 238338174 +Ref: datastructures werkzeug datastructures ContentRange set338251 +Ref: 239338251 +Ref: datastructures werkzeug datastructures ContentRange start338362 +Ref: 23a338362 +Ref: datastructures werkzeug datastructures ContentRange stop338443 +Ref: 23b338443 +Ref: datastructures werkzeug datastructures ContentRange units338601 +Ref: 23c338601 +Ref: datastructures werkzeug datastructures ContentRange unset338676 +Ref: 23d338676 +Ref: HTTP Related-Footnote-1338847 +Ref: HTTP Related-Footnote-2338914 +Ref: HTTP Related-Footnote-3338994 +Ref: HTTP Related-Footnote-4339064 +Ref: HTTP Related-Footnote-5339131 +Ref: HTTP Related-Footnote-6339201 +Ref: HTTP Related-Footnote-7339271 +Ref: HTTP Related-Footnote-8339362 +Ref: HTTP Related-Footnote-9339423 +Ref: HTTP Related-Footnote-10339492 +Ref: HTTP Related-Footnote-11339562 +Ref: HTTP Related-Footnote-12339633 +Ref: HTTP Related-Footnote-13339722 +Ref: HTTP Related-Footnote-14339792 +Ref: HTTP Related-Footnote-15339854 +Ref: HTTP Related-Footnote-16339916 +Ref: HTTP Related-Footnote-17339986 +Ref: HTTP Related-Footnote-18340054 +Ref: HTTP Related-Footnote-19340124 +Ref: HTTP Related-Footnote-20340192 +Ref: HTTP Related-Footnote-21340262 +Ref: HTTP Related-Footnote-22340332 +Node: Others340402 +Ref: datastructures others340483 +Ref: 23e340483 +Ref: datastructures werkzeug datastructures FileStorage340510 +Ref: b9340510 +Ref: datastructures werkzeug datastructures FileStorage stream341007 +Ref: 23f341007 +Ref: datastructures werkzeug datastructures FileStorage filename341144 +Ref: 240341144 +Ref: datastructures werkzeug datastructures FileStorage name341225 +Ref: 241341225 +Ref: datastructures werkzeug datastructures FileStorage headers341290 +Ref: 242341290 +Ref: datastructures werkzeug datastructures FileStorage close341577 +Ref: 243341577 +Ref: datastructures werkzeug datastructures FileStorage content_length341654 +Ref: 244341654 +Ref: datastructures werkzeug datastructures FileStorage content_type341762 +Ref: 245341762 +Ref: datastructures werkzeug datastructures FileStorage mimetype341866 +Ref: 246341866 +Ref: datastructures werkzeug datastructures FileStorage mimetype_params342184 +Ref: 247342184 +Ref: datastructures werkzeug datastructures FileStorage save342430 +Ref: ba342430 +Ref: Others-Footnote-1343185 +Ref: Others-Footnote-2343247 +Ref: Others-Footnote-3343320 +Node: Utilities343390 +Ref: utils doc343494 +Ref: 248343494 +Ref: utils utilities343494 +Ref: 249343494 +Ref: utils module-werkzeug utils343571 +Ref: 13343571 +Node: General Helpers343671 +Ref: utils general-helpers343754 +Ref: 24a343754 +Ref: utils werkzeug utils cached_property343799 +Ref: 24b343799 +Ref: utils werkzeug utils environ_property344872 +Ref: 24c344872 +Ref: utils werkzeug utils header_property345810 +Ref: 24d345810 +Ref: utils werkzeug utils redirect345993 +Ref: 24e345993 +Ref: utils werkzeug utils append_slash_redirect347070 +Ref: 24f347070 +Ref: utils werkzeug utils send_file347550 +Ref: f9347550 +Ref: utils werkzeug utils import_string352474 +Ref: 250352474 +Ref: utils werkzeug utils find_modules353246 +Ref: 251353246 +Ref: utils werkzeug utils secure_filename354215 +Ref: 252354215 +Ref: General Helpers-Footnote-1355296 +Ref: General Helpers-Footnote-2355356 +Ref: General Helpers-Footnote-3355416 +Ref: General Helpers-Footnote-4355478 +Ref: General Helpers-Footnote-5355547 +Ref: General Helpers-Footnote-6355615 +Ref: General Helpers-Footnote-7355675 +Ref: General Helpers-Footnote-8355736 +Ref: General Helpers-Footnote-9355797 +Ref: General Helpers-Footnote-10355858 +Ref: General Helpers-Footnote-11355921 +Ref: General Helpers-Footnote-12355982 +Ref: General Helpers-Footnote-13356045 +Ref: General Helpers-Footnote-14356106 +Ref: General Helpers-Footnote-15356169 +Ref: General Helpers-Footnote-16356230 +Ref: General Helpers-Footnote-17356293 +Ref: General Helpers-Footnote-18356356 +Ref: General Helpers-Footnote-19356417 +Ref: General Helpers-Footnote-20356493 +Ref: General Helpers-Footnote-21356555 +Ref: General Helpers-Footnote-22356619 +Ref: General Helpers-Footnote-23356681 +Ref: General Helpers-Footnote-24356742 +Ref: General Helpers-Footnote-25356804 +Ref: General Helpers-Footnote-26356867 +Ref: General Helpers-Footnote-27356930 +Ref: General Helpers-Footnote-28356991 +Ref: General Helpers-Footnote-29357052 +Ref: General Helpers-Footnote-30357115 +Ref: General Helpers-Footnote-31357176 +Ref: General Helpers-Footnote-32357239 +Ref: General Helpers-Footnote-33357302 +Ref: General Helpers-Footnote-34357363 +Ref: General Helpers-Footnote-35357432 +Ref: General Helpers-Footnote-36357493 +Node: URL Helpers357554 +Ref: utils url-helpers357660 +Ref: 253357660 +Node: User Agent API357738 +Ref: utils module-werkzeug user_agent357845 +Ref: 12357845 +Ref: utils user-agent-api357845 +Ref: 255357845 +Ref: utils werkzeug user_agent UserAgent357888 +Ref: f4357888 +Ref: utils werkzeug user_agent UserAgent platform358493 +Ref: 257358493 +Ref: utils werkzeug user_agent UserAgent browser358611 +Ref: 258358611 +Ref: utils werkzeug user_agent UserAgent version358733 +Ref: 259358733 +Ref: utils werkzeug user_agent UserAgent language358858 +Ref: 25a358858 +Ref: utils werkzeug user_agent UserAgent string358985 +Ref: 256358985 +Ref: utils werkzeug user_agent UserAgent to_header359059 +Ref: 25b359059 +Ref: User Agent API-Footnote-1359196 +Ref: User Agent API-Footnote-2359256 +Ref: User Agent API-Footnote-3359318 +Ref: User Agent API-Footnote-4359378 +Ref: User Agent API-Footnote-5359438 +Ref: User Agent API-Footnote-6359498 +Ref: User Agent API-Footnote-7359558 +Ref: User Agent API-Footnote-8359618 +Node: Security Helpers359678 +Ref: utils module-werkzeug security359781 +Ref: e359781 +Ref: utils security-helpers359781 +Ref: 25c359781 +Ref: utils werkzeug security generate_password_hash359828 +Ref: 25d359828 +Ref: utils werkzeug security check_password_hash361077 +Ref: 25e361077 +Ref: utils werkzeug security safe_join361712 +Ref: 25f361712 +Ref: Security Helpers-Footnote-1362223 +Ref: Security Helpers-Footnote-2362283 +Ref: Security Helpers-Footnote-3362343 +Ref: Security Helpers-Footnote-4362404 +Ref: Security Helpers-Footnote-5362464 +Ref: Security Helpers-Footnote-6362524 +Ref: Security Helpers-Footnote-7362584 +Ref: Security Helpers-Footnote-8362646 +Ref: Security Helpers-Footnote-9362706 +Ref: Security Helpers-Footnote-10362766 +Node: Logging362827 +Ref: utils logging362907 +Ref: 260362907 +Ref: Logging-Footnote-1363263 +Ref: Logging-Footnote-2363333 +Node: URL Helpers<2>363420 +Ref: urls doc363523 +Ref: 254363523 +Ref: urls module-werkzeug urls363523 +Ref: 11363523 +Ref: urls url-helpers363523 +Ref: 261363523 +Ref: urls werkzeug urls BaseURL363681 +Ref: 262363681 +Ref: urls werkzeug urls BaseURL ascii_host364102 +Ref: 265364102 +Ref: urls werkzeug urls BaseURL auth364461 +Ref: 267364461 +Ref: urls werkzeug urls BaseURL decode_netloc364596 +Ref: 268364596 +Ref: urls werkzeug urls BaseURL decode_query364713 +Ref: 269364713 +Ref: urls werkzeug urls BaseURL encode_netloc365174 +Ref: 26b365174 +Ref: urls werkzeug urls BaseURL get_file_location365308 +Ref: 26c365308 +Ref: urls werkzeug urls BaseURL host366309 +Ref: 266366309 +Ref: urls werkzeug urls BaseURL join366548 +Ref: 26d366548 +Ref: urls werkzeug urls BaseURL password366942 +Ref: 26f366942 +Ref: urls werkzeug urls BaseURL port367130 +Ref: 270367130 +Ref: urls werkzeug urls BaseURL raw_password367308 +Ref: 271367308 +Ref: urls werkzeug urls BaseURL raw_username367502 +Ref: 272367502 +Ref: urls werkzeug urls BaseURL replace367696 +Ref: 274367696 +Ref: urls werkzeug urls BaseURL to_iri_tuple368003 +Ref: 275368003 +Ref: urls werkzeug urls BaseURL to_uri_tuple368458 +Ref: 277368458 +Ref: urls werkzeug urls BaseURL to_url368870 +Ref: 278368870 +Ref: urls werkzeug urls BaseURL username369130 +Ref: 273369130 +Ref: urls werkzeug urls BytesURL369318 +Ref: 264369318 +Ref: urls werkzeug urls BytesURL decode369734 +Ref: 27a369734 +Ref: urls werkzeug urls BytesURL encode_netloc370096 +Ref: 27b370096 +Ref: urls werkzeug urls URL370216 +Ref: 263370216 +Ref: urls werkzeug urls URL encode370722 +Ref: 27c370722 +Ref: urls werkzeug urls iri_to_uri371087 +Ref: 184371087 +Ref: urls werkzeug urls uri_to_iri373079 +Ref: 276373079 +Ref: urls werkzeug urls url_decode374195 +Ref: 26a374195 +Ref: urls werkzeug urls url_decode_stream375491 +Ref: 27d375491 +Ref: urls werkzeug urls url_encode377103 +Ref: 27e377103 +Ref: urls werkzeug urls url_encode_stream378488 +Ref: 27f378488 +Ref: urls werkzeug urls url_fix380079 +Ref: 280380079 +Ref: urls werkzeug urls url_join380763 +Ref: 26e380763 +Ref: urls werkzeug urls url_parse381508 +Ref: 281381508 +Ref: urls werkzeug urls url_quote382315 +Ref: 282382315 +Ref: urls werkzeug urls url_quote_plus383094 +Ref: 283383094 +Ref: urls werkzeug urls url_unparse383609 +Ref: 279383609 +Ref: urls werkzeug urls url_unquote384065 +Ref: 284384065 +Ref: urls werkzeug urls url_unquote_plus384747 +Ref: 285384747 +Ref: URL Helpers<2>-Footnote-1385520 +Ref: URL Helpers<2>-Footnote-2385601 +Ref: URL Helpers<2>-Footnote-3385661 +Ref: URL Helpers<2>-Footnote-4385721 +Ref: URL Helpers<2>-Footnote-5385781 +Ref: URL Helpers<2>-Footnote-6385841 +Ref: URL Helpers<2>-Footnote-7385901 +Ref: URL Helpers<2>-Footnote-8385961 +Ref: URL Helpers<2>-Footnote-9386021 +Ref: URL Helpers<2>-Footnote-10386081 +Ref: URL Helpers<2>-Footnote-11386142 +Ref: URL Helpers<2>-Footnote-12386203 +Ref: URL Helpers<2>-Footnote-13386264 +Ref: URL Helpers<2>-Footnote-14386325 +Ref: URL Helpers<2>-Footnote-15386386 +Ref: URL Helpers<2>-Footnote-16386447 +Ref: URL Helpers<2>-Footnote-17386508 +Ref: URL Helpers<2>-Footnote-18386569 +Ref: URL Helpers<2>-Footnote-19386631 +Ref: URL Helpers<2>-Footnote-20386692 +Ref: URL Helpers<2>-Footnote-21386753 +Ref: URL Helpers<2>-Footnote-22386814 +Ref: URL Helpers<2>-Footnote-23386875 +Ref: URL Helpers<2>-Footnote-24386936 +Ref: URL Helpers<2>-Footnote-25386997 +Ref: URL Helpers<2>-Footnote-26387058 +Ref: URL Helpers<2>-Footnote-27387119 +Ref: URL Helpers<2>-Footnote-28387180 +Ref: URL Helpers<2>-Footnote-29387241 +Ref: URL Helpers<2>-Footnote-30387302 +Ref: URL Helpers<2>-Footnote-31387365 +Ref: URL Helpers<2>-Footnote-32387426 +Ref: URL Helpers<2>-Footnote-33387487 +Ref: URL Helpers<2>-Footnote-34387548 +Ref: URL Helpers<2>-Footnote-35387609 +Ref: URL Helpers<2>-Footnote-36387670 +Ref: URL Helpers<2>-Footnote-37387731 +Ref: URL Helpers<2>-Footnote-38387792 +Ref: URL Helpers<2>-Footnote-39387853 +Ref: URL Helpers<2>-Footnote-40387914 +Ref: URL Helpers<2>-Footnote-41387975 +Ref: URL Helpers<2>-Footnote-42388036 +Ref: URL Helpers<2>-Footnote-43388097 +Ref: URL Helpers<2>-Footnote-44388158 +Ref: URL Helpers<2>-Footnote-45388219 +Ref: URL Helpers<2>-Footnote-46388280 +Ref: URL Helpers<2>-Footnote-47388343 +Ref: URL Helpers<2>-Footnote-48388404 +Ref: URL Helpers<2>-Footnote-49388465 +Ref: URL Helpers<2>-Footnote-50388526 +Ref: URL Helpers<2>-Footnote-51388587 +Ref: URL Helpers<2>-Footnote-52388648 +Ref: URL Helpers<2>-Footnote-53388709 +Ref: URL Helpers<2>-Footnote-54388770 +Ref: URL Helpers<2>-Footnote-55388831 +Ref: URL Helpers<2>-Footnote-56388892 +Ref: URL Helpers<2>-Footnote-57388953 +Ref: URL Helpers<2>-Footnote-58389014 +Ref: URL Helpers<2>-Footnote-59389077 +Ref: URL Helpers<2>-Footnote-60389138 +Ref: URL Helpers<2>-Footnote-61389199 +Ref: URL Helpers<2>-Footnote-62389260 +Ref: URL Helpers<2>-Footnote-63389321 +Ref: URL Helpers<2>-Footnote-64389384 +Ref: URL Helpers<2>-Footnote-65389445 +Ref: URL Helpers<2>-Footnote-66389508 +Ref: URL Helpers<2>-Footnote-67389569 +Ref: URL Helpers<2>-Footnote-68389632 +Ref: URL Helpers<2>-Footnote-69389694 +Ref: URL Helpers<2>-Footnote-70389755 +Ref: URL Helpers<2>-Footnote-71389816 +Ref: URL Helpers<2>-Footnote-72389877 +Ref: URL Helpers<2>-Footnote-73389938 +Ref: URL Helpers<2>-Footnote-74389999 +Ref: URL Helpers<2>-Footnote-75390060 +Ref: URL Helpers<2>-Footnote-76390121 +Ref: URL Helpers<2>-Footnote-77390184 +Ref: URL Helpers<2>-Footnote-78390245 +Ref: URL Helpers<2>-Footnote-79390306 +Ref: URL Helpers<2>-Footnote-80390367 +Ref: URL Helpers<2>-Footnote-81390432 +Ref: URL Helpers<2>-Footnote-82390493 +Ref: URL Helpers<2>-Footnote-83390554 +Ref: URL Helpers<2>-Footnote-84390615 +Ref: URL Helpers<2>-Footnote-85390676 +Ref: URL Helpers<2>-Footnote-86390737 +Ref: URL Helpers<2>-Footnote-87390798 +Ref: URL Helpers<2>-Footnote-88390859 +Ref: URL Helpers<2>-Footnote-89390922 +Ref: URL Helpers<2>-Footnote-90390983 +Ref: URL Helpers<2>-Footnote-91391044 +Ref: URL Helpers<2>-Footnote-92391105 +Ref: URL Helpers<2>-Footnote-93391170 +Ref: URL Helpers<2>-Footnote-94391233 +Ref: URL Helpers<2>-Footnote-95391294 +Ref: URL Helpers<2>-Footnote-96391355 +Ref: URL Helpers<2>-Footnote-97391416 +Ref: URL Helpers<2>-Footnote-98391477 +Ref: URL Helpers<2>-Footnote-99391538 +Ref: URL Helpers<2>-Footnote-100391599 +Ref: URL Helpers<2>-Footnote-101391661 +Ref: URL Helpers<2>-Footnote-102391723 +Ref: URL Helpers<2>-Footnote-103391785 +Ref: URL Helpers<2>-Footnote-104391847 +Ref: URL Helpers<2>-Footnote-105391909 +Ref: URL Helpers<2>-Footnote-106391971 +Ref: URL Helpers<2>-Footnote-107392033 +Ref: URL Helpers<2>-Footnote-108392095 +Ref: URL Helpers<2>-Footnote-109392157 +Ref: URL Helpers<2>-Footnote-110392221 +Ref: URL Helpers<2>-Footnote-111392283 +Ref: URL Helpers<2>-Footnote-112392345 +Ref: URL Helpers<2>-Footnote-113392407 +Ref: URL Helpers<2>-Footnote-114392471 +Ref: URL Helpers<2>-Footnote-115392533 +Ref: URL Helpers<2>-Footnote-116392595 +Ref: URL Helpers<2>-Footnote-117392659 +Ref: URL Helpers<2>-Footnote-118392721 +Ref: URL Helpers<2>-Footnote-119392785 +Ref: URL Helpers<2>-Footnote-120392847 +Ref: URL Helpers<2>-Footnote-121392911 +Ref: URL Helpers<2>-Footnote-122392973 +Ref: URL Helpers<2>-Footnote-123393035 +Ref: URL Helpers<2>-Footnote-124393097 +Ref: URL Helpers<2>-Footnote-125393159 +Ref: URL Helpers<2>-Footnote-126393221 +Ref: URL Helpers<2>-Footnote-127393283 +Ref: URL Helpers<2>-Footnote-128393345 +Ref: URL Helpers<2>-Footnote-129393407 +Ref: URL Helpers<2>-Footnote-130393469 +Ref: URL Helpers<2>-Footnote-131393531 +Ref: URL Helpers<2>-Footnote-132393593 +Ref: URL Helpers<2>-Footnote-133393655 +Ref: URL Helpers<2>-Footnote-134393717 +Ref: URL Helpers<2>-Footnote-135393779 +Ref: URL Helpers<2>-Footnote-136393843 +Ref: URL Helpers<2>-Footnote-137393905 +Ref: URL Helpers<2>-Footnote-138393967 +Ref: URL Helpers<2>-Footnote-139394029 +Ref: URL Helpers<2>-Footnote-140394091 +Ref: URL Helpers<2>-Footnote-141394153 +Ref: URL Helpers<2>-Footnote-142394217 +Ref: URL Helpers<2>-Footnote-143394279 +Ref: URL Helpers<2>-Footnote-144394341 +Node: Context Locals394403 +Ref: local doc394507 +Ref: 286394507 +Ref: local context-locals394507 +Ref: 287394507 +Ref: local module-werkzeug local394507 +Ref: 5394507 +Ref: local werkzeug local release_local397343 +Ref: 288397343 +Ref: local werkzeug local LocalManager398164 +Ref: 28a398164 +Ref: local werkzeug local LocalManager cleanup399045 +Ref: 28b399045 +Ref: local werkzeug local LocalManager make_middleware399265 +Ref: 28c399265 +Ref: local werkzeug local LocalManager middleware399500 +Ref: 28d399500 +Ref: local werkzeug local LocalStack400038 +Ref: 289400038 +Ref: local werkzeug local LocalStack pop400908 +Ref: 28e400908 +Ref: local werkzeug local LocalStack push401096 +Ref: 28f401096 +Ref: local werkzeug local LocalStack top401252 +Ref: 290401252 +Ref: local werkzeug local LocalProxy401381 +Ref: 291401381 +Ref: local werkzeug local LocalProxy _get_current_object402837 +Ref: 292402837 +Ref: middleware/index module-werkzeug middleware403135 +Ref: 6403135 +Ref: Context Locals-Footnote-1403171 +Ref: Context Locals-Footnote-2403233 +Ref: Context Locals-Footnote-3403295 +Ref: Context Locals-Footnote-4403357 +Ref: Context Locals-Footnote-5403419 +Node: Middleware403490 +Ref: middleware/index doc403595 +Ref: 293403595 +Ref: middleware/index middleware403595 +Ref: 294403595 +Ref: middleware/proxy_fix module-werkzeug middleware proxy_fix403797 +Ref: b403797 +Node: X-Forwarded-For Proxy Fix403967 +Ref: middleware/proxy_fix doc404075 +Ref: 295404075 +Ref: middleware/proxy_fix x-forwarded-for-proxy-fix404075 +Ref: 296404075 +Ref: middleware/proxy_fix werkzeug middleware proxy_fix ProxyFix404844 +Ref: 297404844 +Ref: middleware/shared_data module-werkzeug middleware shared_data407538 +Ref: c407538 +Ref: X-Forwarded-For Proxy Fix-Footnote-1407574 +Ref: X-Forwarded-For Proxy Fix-Footnote-2407635 +Ref: X-Forwarded-For Proxy Fix-Footnote-3407696 +Ref: X-Forwarded-For Proxy Fix-Footnote-4407757 +Ref: X-Forwarded-For Proxy Fix-Footnote-5407818 +Ref: X-Forwarded-For Proxy Fix-Footnote-6407879 +Node: Serve Shared Static Files407941 +Ref: middleware/shared_data doc408080 +Ref: 298408080 +Ref: middleware/shared_data serve-shared-static-files408080 +Ref: 299408080 +Ref: middleware/shared_data werkzeug middleware shared_data SharedDataMiddleware408145 +Ref: 29a408145 +Ref: middleware/shared_data werkzeug middleware shared_data SharedDataMiddleware is_allowed411447 +Ref: 29b411447 +Ref: middleware/dispatcher module-werkzeug middleware dispatcher411766 +Ref: 7411766 +Ref: Serve Shared Static Files-Footnote-1411802 +Ref: Serve Shared Static Files-Footnote-2411873 +Ref: Serve Shared Static Files-Footnote-3411933 +Ref: Serve Shared Static Files-Footnote-4411993 +Ref: Serve Shared Static Files-Footnote-5412053 +Ref: Serve Shared Static Files-Footnote-6412113 +Ref: Serve Shared Static Files-Footnote-7412173 +Ref: Serve Shared Static Files-Footnote-8412233 +Ref: Serve Shared Static Files-Footnote-9412293 +Ref: Serve Shared Static Files-Footnote-10412353 +Ref: Serve Shared Static Files-Footnote-11412416 +Ref: Serve Shared Static Files-Footnote-12412488 +Ref: Serve Shared Static Files-Footnote-13412551 +Ref: Serve Shared Static Files-Footnote-14412613 +Ref: Serve Shared Static Files-Footnote-15412674 +Ref: Serve Shared Static Files-Footnote-16412737 +Ref: Serve Shared Static Files-Footnote-17412798 +Node: Application Dispatcher412861 +Ref: middleware/dispatcher doc412991 +Ref: 29c412991 +Ref: middleware/dispatcher application-dispatcher412991 +Ref: 29d412991 +Ref: middleware/dispatcher werkzeug middleware dispatcher DispatcherMiddleware414046 +Ref: 29e414046 +Ref: middleware/http_proxy module-werkzeug middleware http_proxy414675 +Ref: 8414675 +Ref: Application Dispatcher-Footnote-1414711 +Ref: Application Dispatcher-Footnote-2414771 +Node: Basic HTTP Proxy414833 +Ref: middleware/http_proxy doc414958 +Ref: 29f414958 +Ref: middleware/http_proxy basic-http-proxy414958 +Ref: 2a0414958 +Ref: middleware/http_proxy werkzeug middleware http_proxy ProxyMiddleware415005 +Ref: 2a1415005 +Ref: middleware/lint module-werkzeug middleware lint417449 +Ref: 9417449 +Ref: Basic HTTP Proxy-Footnote-1417485 +Ref: Basic HTTP Proxy-Footnote-2417551 +Ref: Basic HTTP Proxy-Footnote-3417611 +Ref: Basic HTTP Proxy-Footnote-4417671 +Ref: Basic HTTP Proxy-Footnote-5417732 +Ref: Basic HTTP Proxy-Footnote-6417793 +Node: WSGI Protocol Linter417855 +Ref: middleware/lint doc417978 +Ref: 2a2417978 +Ref: middleware/lint wsgi-protocol-linter417978 +Ref: 2a3417978 +Ref: middleware/lint werkzeug middleware lint LintMiddleware418307 +Ref: 2a4418307 +Ref: middleware/profiler module-werkzeug middleware profiler419105 +Ref: a419105 +Ref: WSGI Protocol Linter-Footnote-1419142 +Ref: WSGI Protocol Linter-Footnote-2419191 +Ref: WSGI Protocol Linter-Footnote-3419263 +Node: Application Profiler419325 +Ref: middleware/profiler doc419423 +Ref: 2a5419423 +Ref: middleware/profiler application-profiler419423 +Ref: 2a6419423 +Ref: middleware/profiler werkzeug middleware profiler ProfilerMiddleware419661 +Ref: 2a7419661 +Ref: Application Profiler-Footnote-1422353 +Ref: Application Profiler-Footnote-2422424 +Ref: Application Profiler-Footnote-3422492 +Ref: Application Profiler-Footnote-4422563 +Ref: Application Profiler-Footnote-5422630 +Ref: Application Profiler-Footnote-6422690 +Ref: Application Profiler-Footnote-7422750 +Ref: Application Profiler-Footnote-8422830 +Ref: Application Profiler-Footnote-9422890 +Ref: Application Profiler-Footnote-10422951 +Ref: Application Profiler-Footnote-11423015 +Ref: Application Profiler-Footnote-12423097 +Ref: Application Profiler-Footnote-13423158 +Ref: Application Profiler-Footnote-14423219 +Node: HTTP Exceptions423282 +Ref: exceptions doc423364 +Ref: 2a8423364 +Ref: exceptions http-exceptions423364 +Ref: 2a9423364 +Ref: exceptions module-werkzeug exceptions423364 +Ref: 2423364 +Node: Usage Example423659 +Ref: exceptions usage-example423748 +Ref: 2aa423748 +Node: Error Classes424885 +Ref: exceptions error-classes424992 +Ref: 2ab424992 +Ref: exceptions werkzeug exceptions BadRequest425083 +Ref: e0425083 +Ref: exceptions werkzeug exceptions Unauthorized425509 +Ref: 2ac425509 +Ref: exceptions werkzeug exceptions Forbidden427381 +Ref: 2ad427381 +Ref: exceptions werkzeug exceptions NotFound427805 +Ref: 31427805 +Ref: exceptions werkzeug exceptions MethodNotAllowed428179 +Ref: 146428179 +Ref: exceptions werkzeug exceptions NotAcceptable429134 +Ref: 2ae429134 +Ref: exceptions werkzeug exceptions RequestTimeout429572 +Ref: 2af429572 +Ref: exceptions werkzeug exceptions Conflict429936 +Ref: 2b0429936 +Ref: exceptions werkzeug exceptions Gone430398 +Ref: 2b1430398 +Ref: exceptions werkzeug exceptions LengthRequired430791 +Ref: 2b2430791 +Ref: exceptions werkzeug exceptions PreconditionFailed431263 +Ref: 2b3431263 +Ref: exceptions werkzeug exceptions RequestEntityTooLarge431714 +Ref: da431714 +Ref: exceptions werkzeug exceptions RequestURITooLarge432149 +Ref: 2b4432149 +Ref: exceptions werkzeug exceptions UnsupportedMediaType432527 +Ref: 2b5432527 +Ref: exceptions werkzeug exceptions RequestedRangeNotSatisfiable432977 +Ref: 134432977 +Ref: exceptions werkzeug exceptions ExpectationFailed433643 +Ref: 2b6433643 +Ref: exceptions werkzeug exceptions ImATeapot434084 +Ref: 2b7434084 +Ref: exceptions werkzeug exceptions UnprocessableEntity434537 +Ref: 2b8434537 +Ref: exceptions werkzeug exceptions Locked434968 +Ref: 2b9434968 +Ref: exceptions werkzeug exceptions FailedDependency435340 +Ref: 2ba435340 +Ref: exceptions werkzeug exceptions PreconditionRequired435826 +Ref: 2bb435826 +Ref: exceptions werkzeug exceptions TooManyRequests436664 +Ref: 2bc436664 +Ref: exceptions werkzeug exceptions RequestHeaderFieldsTooLarge437676 +Ref: 2bd437676 +Ref: exceptions werkzeug exceptions UnavailableForLegalReasons438221 +Ref: 2be438221 +Ref: exceptions werkzeug exceptions InternalServerError438699 +Ref: 2bf438699 +Ref: exceptions werkzeug exceptions InternalServerError original_exception439368 +Ref: 2c0439368 +Ref: exceptions werkzeug exceptions NotImplemented439569 +Ref: 2c1439569 +Ref: exceptions werkzeug exceptions BadGateway439987 +Ref: 2c2439987 +Ref: exceptions werkzeug exceptions ServiceUnavailable440508 +Ref: 2c3440508 +Ref: exceptions werkzeug exceptions GatewayTimeout441278 +Ref: 2c4441278 +Ref: exceptions werkzeug exceptions HTTPVersionNotSupported441696 +Ref: 2c5441696 +Ref: exceptions werkzeug exceptions ClientDisconnected442130 +Ref: 179442130 +Ref: exceptions werkzeug exceptions SecurityError442994 +Ref: 180442994 +Ref: Error Classes-Footnote-1443460 +Ref: Error Classes-Footnote-2443520 +Ref: Error Classes-Footnote-3443582 +Ref: Error Classes-Footnote-4443642 +Ref: Error Classes-Footnote-5443704 +Ref: Error Classes-Footnote-6443764 +Ref: Error Classes-Footnote-7443826 +Ref: Error Classes-Footnote-8443886 +Ref: Error Classes-Footnote-9443948 +Ref: Error Classes-Footnote-10444008 +Ref: Error Classes-Footnote-11444069 +Ref: Error Classes-Footnote-12444132 +Ref: Error Classes-Footnote-13444193 +Ref: Error Classes-Footnote-14444256 +Ref: Error Classes-Footnote-15444317 +Ref: Error Classes-Footnote-16444380 +Ref: Error Classes-Footnote-17444441 +Ref: Error Classes-Footnote-18444504 +Ref: Error Classes-Footnote-19444565 +Ref: Error Classes-Footnote-20444628 +Ref: Error Classes-Footnote-21444689 +Ref: Error Classes-Footnote-22444752 +Ref: Error Classes-Footnote-23444813 +Ref: Error Classes-Footnote-24444876 +Ref: Error Classes-Footnote-25444937 +Ref: Error Classes-Footnote-26445000 +Ref: Error Classes-Footnote-27445061 +Ref: Error Classes-Footnote-28445124 +Ref: Error Classes-Footnote-29445185 +Ref: Error Classes-Footnote-30445248 +Ref: Error Classes-Footnote-31445310 +Ref: Error Classes-Footnote-32445371 +Ref: Error Classes-Footnote-33445432 +Ref: Error Classes-Footnote-34445495 +Ref: Error Classes-Footnote-35445556 +Ref: Error Classes-Footnote-36445619 +Ref: Error Classes-Footnote-37445680 +Ref: Error Classes-Footnote-38445743 +Ref: Error Classes-Footnote-39445804 +Ref: Error Classes-Footnote-40445867 +Ref: Error Classes-Footnote-41445928 +Ref: Error Classes-Footnote-42445991 +Ref: Error Classes-Footnote-43446052 +Ref: Error Classes-Footnote-44446115 +Ref: Error Classes-Footnote-45446176 +Ref: Error Classes-Footnote-46446239 +Ref: Error Classes-Footnote-47446315 +Ref: Error Classes-Footnote-48446377 +Ref: Error Classes-Footnote-49446439 +Ref: Error Classes-Footnote-50446515 +Ref: Error Classes-Footnote-51446576 +Ref: Error Classes-Footnote-52446639 +Ref: Error Classes-Footnote-53446700 +Ref: Error Classes-Footnote-54446763 +Ref: Error Classes-Footnote-55446824 +Ref: Error Classes-Footnote-56446887 +Ref: Error Classes-Footnote-57446948 +Ref: Error Classes-Footnote-58447021 +Ref: Error Classes-Footnote-59447084 +Ref: Error Classes-Footnote-60447145 +Ref: Error Classes-Footnote-61447208 +Ref: Error Classes-Footnote-62447269 +Ref: Error Classes-Footnote-63447332 +Ref: Error Classes-Footnote-64447408 +Ref: Error Classes-Footnote-65447470 +Ref: Error Classes-Footnote-66447532 +Ref: Error Classes-Footnote-67447608 +Ref: Error Classes-Footnote-68447669 +Ref: Error Classes-Footnote-69447732 +Ref: Error Classes-Footnote-70447793 +Ref: Error Classes-Footnote-71447856 +Ref: Error Classes-Footnote-72447917 +Ref: Error Classes-Footnote-73447980 +Ref: Error Classes-Footnote-74448041 +Ref: Error Classes-Footnote-75448104 +Ref: Error Classes-Footnote-76448165 +Node: Baseclass448228 +Ref: exceptions baseclass448345 +Ref: 2c6448345 +Ref: exceptions werkzeug exceptions HTTPException448433 +Ref: 32448433 +Ref: exceptions werkzeug exceptions HTTPException __call__449020 +Ref: 2c7449020 +Ref: exceptions werkzeug exceptions HTTPException get_response449401 +Ref: 2c8449401 +Ref: Baseclass-Footnote-1450110 +Ref: Baseclass-Footnote-2450170 +Ref: Baseclass-Footnote-3450232 +Ref: Baseclass-Footnote-4450294 +Node: Special HTTP Exceptions450355 +Ref: exceptions special-http-exceptions450474 +Ref: 2c9450474 +Ref: exceptions werkzeug exceptions BadRequestKeyError451465 +Ref: 2ca451465 +Ref: Special HTTP Exceptions-Footnote-1451884 +Ref: Special HTTP Exceptions-Footnote-2451951 +Ref: Special HTTP Exceptions-Footnote-3452018 +Ref: Special HTTP Exceptions-Footnote-4452085 +Node: Simple Aborting452145 +Ref: exceptions simple-aborting452268 +Ref: 2cb452268 +Ref: exceptions werkzeug exceptions abort452512 +Ref: 2cc452512 +Ref: exceptions werkzeug exceptions Aborter453296 +Ref: 2cd453296 +Ref: Simple Aborting-Footnote-1454154 +Ref: Simple Aborting-Footnote-2454215 +Ref: Simple Aborting-Footnote-3454276 +Ref: Simple Aborting-Footnote-4454337 +Node: Custom Errors454399 +Ref: exceptions custom-errors454490 +Ref: 2ce454490 +Node: Deployment455520 +Ref: index deployment455621 +Ref: 2cf455621 +Node: Application Deployment455685 +Ref: deployment/index doc455756 +Ref: 49455756 +Ref: deployment/index application-deployment455756 +Ref: 2d0455756 +Node: CGI456001 +Ref: deployment/cgi doc456089 +Ref: 2d1456089 +Ref: deployment/cgi cgi456089 +Ref: 2d2456089 +Ref: CGI-Footnote-1456591 +Node: Creating a cgi file456635 +Ref: deployment/cgi appengine456717 +Ref: 2d3456717 +Ref: deployment/cgi creating-a-cgi-file456717 +Ref: 2d4456717 +Node: Server Setup457057 +Ref: deployment/cgi server-setup457139 +Ref: 2d5457139 +Node: mod_wsgi Apache457594 +Ref: deployment/mod_wsgi doc457698 +Ref: 2d6457698 +Ref: deployment/mod_wsgi mod-wsgi-apache457698 +Ref: 2d7457698 +Ref: mod_wsgi Apache-Footnote-1457976 +Ref: mod_wsgi Apache-Footnote-2458010 +Node: Installing mod_wsgi458061 +Ref: deployment/mod_wsgi apache458163 +Ref: 2d8458163 +Ref: deployment/mod_wsgi installing-mod-wsgi458163 +Ref: 2d9458163 +Ref: Installing mod_wsgi-Footnote-1458990 +Node: Creating a wsgi file459058 +Ref: deployment/mod_wsgi creating-a-wsgi-file459187 +Ref: 2da459187 +Ref: Creating a wsgi file-Footnote-1460114 +Node: Configuring Apache460159 +Ref: deployment/mod_wsgi configuring-apache460260 +Ref: 2db460260 +Node: FastCGI460983 +Ref: deployment/fastcgi doc461097 +Ref: 2dc461097 +Ref: deployment/fastcgi fastcgi461097 +Ref: 2dd461097 +Ref: deployment/fastcgi virtual-python461097 +Ref: 2de461097 +Ref: FastCGI-Footnote-1461550 +Ref: FastCGI-Footnote-2461584 +Ref: FastCGI-Footnote-3461611 +Node: Creating a fcgi file461650 +Ref: deployment/fastcgi creating-a-fcgi-file461745 +Ref: 2df461745 +Node: Configuring lighttpd462822 +Ref: deployment/fastcgi configuring-lighttpd462943 +Ref: 2e0462943 +Ref: Configuring lighttpd-Footnote-1463766 +Node: Configuring nginx463843 +Ref: deployment/fastcgi configuring-nginx463953 +Ref: 2e1463953 +Node: Debugging465198 +Ref: deployment/fastcgi debugging465279 +Ref: 2e2465279 +Node: HTTP Proxying466350 +Ref: deployment/proxying doc466440 +Ref: 2e3466440 +Ref: deployment/proxying flup466440 +Ref: 2e4466440 +Ref: deployment/proxying http-proxying466440 +Ref: 2e5466440 +Node: Creating a py server466887 +Ref: deployment/proxying creating-a-py-server466988 +Ref: 2e6466988 +Node: Configuring nginx<2>467710 +Ref: deployment/proxying configuring-nginx467811 +Ref: 2e7467811 +Node: Additional Information468452 +Ref: index additional-information468563 +Ref: 2e8468563 +Node: Important Terms468723 +Ref: terms doc468815 +Ref: 2e9468815 +Ref: terms important-terms468815 +Ref: 2ea468815 +Node: WSGI468994 +Ref: terms wsgi469076 +Ref: 2eb469076 +Ref: WSGI-Footnote-1469370 +Node: Response Object469419 +Ref: terms response-object469523 +Ref: 2ec469523 +Node: View Function470005 +Ref: terms view-function470096 +Ref: 2ed470096 +Node: Unicode470760 +Ref: unicode doc470886 +Ref: 2ee470886 +Ref: unicode unicode470886 +Ref: 2ef470886 +Node: Unicode in Python471302 +Ref: unicode unicode-in-python471389 +Ref: 2f0471389 +Node: Unicode in HTTP472124 +Ref: unicode unicode-in-http472234 +Ref: 2f1472234 +Node: Error Handling472669 +Ref: unicode error-handling472790 +Ref: 2f2472790 +Ref: Error Handling-Footnote-1473195 +Node: Request and Response Objects473262 +Ref: unicode request-and-response-objects473359 +Ref: 2f3473359 +Node: Dealing with Request Data474190 +Ref: request_data doc474321 +Ref: db474321 +Ref: request_data dealing-with-request-data474321 +Ref: 2f4474321 +Node: Missing EOF Marker on Input Stream474864 +Ref: request_data missing-eof-marker-on-input-stream474996 +Ref: 2f5474996 +Node: When does Werkzeug Parse?475596 +Ref: request_data when-does-werkzeug-parse475755 +Ref: 2f6475755 +Node: How does it Parse?476570 +Ref: request_data how-does-it-parse476716 +Ref: 2f7476716 +Node: Limiting Request Data477682 +Ref: request_data limiting-request-data477825 +Ref: 2f8477825 +Node: How to extend Parsing?478750 +Ref: request_data how-to-extend-parsing478866 +Ref: 2f9478866 +Node: BSD-3-Clause License479112 +Ref: license doc479243 +Ref: 2fa479243 +Ref: license bsd-3-clause-license479243 +Ref: 2fb479243 +Node: Changes480787 +Ref: changes doc480884 +Ref: 2fc480884 +Ref: changes changes480884 +Ref: 2fd480884 +Node: Version 2 1 0483292 +Ref: changes version-2-1-0483373 +Ref: 2fe483373 +Ref: Version 2 1 0-Footnote-1487506 +Ref: Version 2 1 0-Footnote-2487560 +Ref: Version 2 1 0-Footnote-3487614 +Ref: Version 2 1 0-Footnote-4487668 +Ref: Version 2 1 0-Footnote-5487741 +Ref: Version 2 1 0-Footnote-6487811 +Ref: Version 2 1 0-Footnote-7487860 +Ref: Version 2 1 0-Footnote-8487909 +Ref: Version 2 1 0-Footnote-9487965 +Ref: Version 2 1 0-Footnote-10488021 +Ref: Version 2 1 0-Footnote-11488078 +Ref: Version 2 1 0-Footnote-12488133 +Ref: Version 2 1 0-Footnote-13488190 +Ref: Version 2 1 0-Footnote-14488245 +Ref: Version 2 1 0-Footnote-15488295 +Ref: Version 2 1 0-Footnote-16488352 +Ref: Version 2 1 0-Footnote-17488409 +Ref: Version 2 1 0-Footnote-18488466 +Ref: Version 2 1 0-Footnote-19488523 +Ref: Version 2 1 0-Footnote-20488578 +Node: Version 2 0 3488633 +Ref: changes version-2-0-3488736 +Ref: 2ff488736 +Ref: Version 2 0 3-Footnote-1489335 +Ref: Version 2 0 3-Footnote-2489391 +Ref: Version 2 0 3-Footnote-3489445 +Ref: Version 2 0 3-Footnote-4489501 +Node: Version 2 0 2489557 +Ref: changes version-2-0-2489660 +Ref: 300489660 +Ref: Version 2 0 2-Footnote-1491828 +Ref: Version 2 0 2-Footnote-2491884 +Ref: Version 2 0 2-Footnote-3491938 +Ref: Version 2 0 2-Footnote-4491992 +Ref: Version 2 0 2-Footnote-5492048 +Ref: Version 2 0 2-Footnote-6492104 +Ref: Version 2 0 2-Footnote-7492160 +Ref: Version 2 0 2-Footnote-8492216 +Ref: Version 2 0 2-Footnote-9492272 +Ref: Version 2 0 2-Footnote-10492328 +Ref: Version 2 0 2-Footnote-11492385 +Ref: Version 2 0 2-Footnote-12492442 +Ref: Version 2 0 2-Footnote-13492499 +Ref: Version 2 0 2-Footnote-14492554 +Ref: Version 2 0 2-Footnote-15492611 +Ref: Version 2 0 2-Footnote-16492666 +Ref: Version 2 0 2-Footnote-17492721 +Node: Version 2 0 1492778 +Ref: changes version-2-0-1492881 +Ref: 301492881 +Ref: Version 2 0 1-Footnote-1493776 +Ref: Version 2 0 1-Footnote-2493832 +Ref: Version 2 0 1-Footnote-3493888 +Ref: Version 2 0 1-Footnote-4493944 +Ref: Version 2 0 1-Footnote-5494000 +Ref: Version 2 0 1-Footnote-6494056 +Ref: Version 2 0 1-Footnote-7494112 +Node: Version 2 0 0494168 +Ref: changes version-2-0-0494271 +Ref: 302494271 +Ref: Version 2 0 0-Footnote-1505541 +Ref: Version 2 0 0-Footnote-2505595 +Ref: Version 2 0 0-Footnote-3505665 +Ref: Version 2 0 0-Footnote-4505721 +Ref: Version 2 0 0-Footnote-5505794 +Ref: Version 2 0 0-Footnote-6505850 +Ref: Version 2 0 0-Footnote-7505906 +Ref: Version 2 0 0-Footnote-8505962 +Ref: Version 2 0 0-Footnote-9506018 +Ref: Version 2 0 0-Footnote-10506074 +Ref: Version 2 0 0-Footnote-11506131 +Ref: Version 2 0 0-Footnote-12506188 +Ref: Version 2 0 0-Footnote-13506243 +Ref: Version 2 0 0-Footnote-14506300 +Ref: Version 2 0 0-Footnote-15506355 +Ref: Version 2 0 0-Footnote-16506412 +Ref: Version 2 0 0-Footnote-17506469 +Ref: Version 2 0 0-Footnote-18506524 +Ref: Version 2 0 0-Footnote-19506581 +Ref: Version 2 0 0-Footnote-20506638 +Ref: Version 2 0 0-Footnote-21506695 +Ref: Version 2 0 0-Footnote-22506750 +Ref: Version 2 0 0-Footnote-23506805 +Ref: Version 2 0 0-Footnote-24506860 +Ref: Version 2 0 0-Footnote-25506917 +Ref: Version 2 0 0-Footnote-26506974 +Ref: Version 2 0 0-Footnote-27507031 +Ref: Version 2 0 0-Footnote-28507086 +Ref: Version 2 0 0-Footnote-29507142 +Ref: Version 2 0 0-Footnote-30507197 +Ref: Version 2 0 0-Footnote-31507254 +Ref: Version 2 0 0-Footnote-32507311 +Ref: Version 2 0 0-Footnote-33507368 +Ref: Version 2 0 0-Footnote-34507425 +Ref: Version 2 0 0-Footnote-35507480 +Ref: Version 2 0 0-Footnote-36507535 +Ref: Version 2 0 0-Footnote-37507590 +Ref: Version 2 0 0-Footnote-38507645 +Ref: Version 2 0 0-Footnote-39507700 +Ref: Version 2 0 0-Footnote-40507755 +Ref: Version 2 0 0-Footnote-41507811 +Ref: Version 2 0 0-Footnote-42507868 +Ref: Version 2 0 0-Footnote-43507923 +Ref: Version 2 0 0-Footnote-44507980 +Ref: Version 2 0 0-Footnote-45508035 +Ref: Version 2 0 0-Footnote-46508090 +Ref: Version 2 0 0-Footnote-47508145 +Ref: Version 2 0 0-Footnote-48508202 +Ref: Version 2 0 0-Footnote-49508252 +Ref: Version 2 0 0-Footnote-50508307 +Ref: Version 2 0 0-Footnote-51508364 +Ref: Version 2 0 0-Footnote-52508419 +Ref: Version 2 0 0-Footnote-53508476 +Ref: Version 2 0 0-Footnote-54508533 +Ref: Version 2 0 0-Footnote-55508588 +Ref: Version 2 0 0-Footnote-56508645 +Ref: Version 2 0 0-Footnote-57508702 +Ref: Version 2 0 0-Footnote-58508759 +Ref: Version 2 0 0-Footnote-59508814 +Ref: Version 2 0 0-Footnote-60508871 +Ref: Version 2 0 0-Footnote-61508927 +Ref: Version 2 0 0-Footnote-62508984 +Ref: Version 2 0 0-Footnote-63509039 +Ref: Version 2 0 0-Footnote-64509094 +Ref: Version 2 0 0-Footnote-65509151 +Ref: Version 2 0 0-Footnote-66509208 +Ref: Version 2 0 0-Footnote-67509265 +Ref: Version 2 0 0-Footnote-68509322 +Ref: Version 2 0 0-Footnote-69509377 +Ref: Version 2 0 0-Footnote-70509432 +Ref: Version 2 0 0-Footnote-71509487 +Ref: Version 2 0 0-Footnote-72509542 +Ref: Version 2 0 0-Footnote-73509597 +Node: Version 1 0 1509652 +Ref: changes version-1-0-1509755 +Ref: 303509755 +Ref: Version 1 0 1-Footnote-1510380 +Ref: Version 1 0 1-Footnote-2510436 +Ref: Version 1 0 1-Footnote-3510490 +Ref: Version 1 0 1-Footnote-4510544 +Ref: Version 1 0 1-Footnote-5510600 +Ref: Version 1 0 1-Footnote-6510656 +Node: Version 1 0 0510712 +Ref: changes version-1-0-0510816 +Ref: 304510816 +Ref: Version 1 0 0-Footnote-1516969 +Ref: Version 1 0 0-Footnote-2517025 +Ref: Version 1 0 0-Footnote-3517081 +Ref: Version 1 0 0-Footnote-4517134 +Ref: Version 1 0 0-Footnote-5517188 +Ref: Version 1 0 0-Footnote-6517242 +Ref: Version 1 0 0-Footnote-7517298 +Ref: Version 1 0 0-Footnote-8517354 +Ref: Version 1 0 0-Footnote-9517408 +Ref: Version 1 0 0-Footnote-10517462 +Ref: Version 1 0 0-Footnote-11517518 +Ref: Version 1 0 0-Footnote-12517575 +Ref: Version 1 0 0-Footnote-13517630 +Ref: Version 1 0 0-Footnote-14517687 +Ref: Version 1 0 0-Footnote-15517742 +Ref: Version 1 0 0-Footnote-16517798 +Ref: Version 1 0 0-Footnote-17517853 +Ref: Version 1 0 0-Footnote-18517908 +Ref: Version 1 0 0-Footnote-19517963 +Ref: Version 1 0 0-Footnote-20518020 +Ref: Version 1 0 0-Footnote-21518075 +Ref: Version 1 0 0-Footnote-22518130 +Ref: Version 1 0 0-Footnote-23518186 +Ref: Version 1 0 0-Footnote-24518241 +Ref: Version 1 0 0-Footnote-25518297 +Ref: Version 1 0 0-Footnote-26518352 +Ref: Version 1 0 0-Footnote-27518407 +Ref: Version 1 0 0-Footnote-28518463 +Ref: Version 1 0 0-Footnote-29518520 +Ref: Version 1 0 0-Footnote-30518577 +Ref: Version 1 0 0-Footnote-31518634 +Ref: Version 1 0 0-Footnote-32518689 +Ref: Version 1 0 0-Footnote-33518739 +Ref: Version 1 0 0-Footnote-34518796 +Ref: Version 1 0 0-Footnote-35518853 +Ref: Version 1 0 0-Footnote-36518909 +Ref: Version 1 0 0-Footnote-37518966 +Ref: Version 1 0 0-Footnote-38519021 +Ref: Version 1 0 0-Footnote-39519076 +Ref: Version 1 0 0-Footnote-40519131 +Ref: Version 1 0 0-Footnote-41519186 +Ref: Version 1 0 0-Footnote-42519241 +Ref: Version 1 0 0-Footnote-43519297 +Ref: Version 1 0 0-Footnote-44519352 +Ref: Version 1 0 0-Footnote-45519409 +Ref: Version 1 0 0-Footnote-46519464 +Ref: Version 1 0 0-Footnote-47519519 +Ref: Version 1 0 0-Footnote-48519569 +Ref: Version 1 0 0-Footnote-49519625 +Ref: Version 1 0 0-Footnote-50519682 +Node: Version 0 16 1519739 +Ref: changes version-0-16-1519844 +Ref: 305519844 +Ref: Version 0 16 1-Footnote-1520123 +Ref: Version 0 16 1-Footnote-2520179 +Node: Version 0 16 0520235 +Ref: changes version-0-16-0520341 +Ref: 306520341 +Ref: Version 0 16 0-Footnote-1520985 +Ref: Version 0 16 0-Footnote-2521038 +Node: Version 0 15 6521092 +Ref: changes version-0-15-6521198 +Ref: 307521198 +Ref: Version 0 15 6-Footnote-1521912 +Ref: Version 0 15 6-Footnote-2521968 +Ref: Version 0 15 6-Footnote-3522024 +Node: Version 0 15 5522080 +Ref: changes version-0-15-5522186 +Ref: 308522186 +Ref: Version 0 15 5-Footnote-1523399 +Ref: Version 0 15 5-Footnote-2523455 +Ref: Version 0 15 5-Footnote-3523511 +Ref: Version 0 15 5-Footnote-4523565 +Ref: Version 0 15 5-Footnote-5523621 +Ref: Version 0 15 5-Footnote-6523677 +Ref: Version 0 15 5-Footnote-7523733 +Ref: Version 0 15 5-Footnote-8523789 +Ref: Version 0 15 5-Footnote-9523845 +Node: Version 0 15 4523901 +Ref: changes version-0-15-4524007 +Ref: 309524007 +Ref: Version 0 15 4-Footnote-1524168 +Node: Version 0 15 3524224 +Ref: changes version-0-15-3524330 +Ref: 30a524330 +Ref: Version 0 15 3-Footnote-1525302 +Ref: Version 0 15 3-Footnote-2525358 +Ref: Version 0 15 3-Footnote-3525412 +Ref: Version 0 15 3-Footnote-4525468 +Ref: Version 0 15 3-Footnote-5525524 +Ref: Version 0 15 3-Footnote-6525580 +Ref: Version 0 15 3-Footnote-7525636 +Node: Version 0 15 2525692 +Ref: changes version-0-15-2525798 +Ref: 30b525798 +Ref: Version 0 15 2-Footnote-1526701 +Ref: Version 0 15 2-Footnote-2526757 +Ref: Version 0 15 2-Footnote-3526813 +Ref: Version 0 15 2-Footnote-4526869 +Node: Version 0 15 1526925 +Ref: changes version-0-15-1527031 +Ref: 30c527031 +Ref: Version 0 15 1-Footnote-1527321 +Node: Version 0 15 0527377 +Ref: changes version-0-15-0527483 +Ref: 30d527483 +Ref: Version 0 15 0-Footnote-1541443 +Ref: Version 0 15 0-Footnote-2541497 +Ref: Version 0 15 0-Footnote-3541550 +Ref: Version 0 15 0-Footnote-4541605 +Ref: Version 0 15 0-Footnote-5541658 +Ref: Version 0 15 0-Footnote-6541712 +Ref: Version 0 15 0-Footnote-7541766 +Ref: Version 0 15 0-Footnote-8541820 +Ref: Version 0 15 0-Footnote-9541875 +Ref: Version 0 15 0-Footnote-10541928 +Ref: Version 0 15 0-Footnote-11541983 +Ref: Version 0 15 0-Footnote-12542038 +Ref: Version 0 15 0-Footnote-13542095 +Ref: Version 0 15 0-Footnote-14542150 +Ref: Version 0 15 0-Footnote-15542205 +Ref: Version 0 15 0-Footnote-16542261 +Ref: Version 0 15 0-Footnote-17542315 +Ref: Version 0 15 0-Footnote-18542370 +Ref: Version 0 15 0-Footnote-19542427 +Ref: Version 0 15 0-Footnote-20542482 +Ref: Version 0 15 0-Footnote-21542537 +Ref: Version 0 15 0-Footnote-22542587 +Ref: Version 0 15 0-Footnote-23542642 +Ref: Version 0 15 0-Footnote-24542692 +Ref: Version 0 15 0-Footnote-25542747 +Ref: Version 0 15 0-Footnote-26542802 +Ref: Version 0 15 0-Footnote-27542857 +Ref: Version 0 15 0-Footnote-28542912 +Ref: Version 0 15 0-Footnote-29542969 +Ref: Version 0 15 0-Footnote-30543024 +Ref: Version 0 15 0-Footnote-31543079 +Ref: Version 0 15 0-Footnote-32543134 +Ref: Version 0 15 0-Footnote-33543222 +Ref: Version 0 15 0-Footnote-34543283 +Ref: Version 0 15 0-Footnote-35543338 +Ref: Version 0 15 0-Footnote-36543393 +Ref: Version 0 15 0-Footnote-37543448 +Ref: Version 0 15 0-Footnote-38543503 +Ref: Version 0 15 0-Footnote-39543558 +Ref: Version 0 15 0-Footnote-40543613 +Ref: Version 0 15 0-Footnote-41543668 +Ref: Version 0 15 0-Footnote-42543723 +Ref: Version 0 15 0-Footnote-43543780 +Ref: Version 0 15 0-Footnote-44543835 +Ref: Version 0 15 0-Footnote-45543889 +Ref: Version 0 15 0-Footnote-46543944 +Ref: Version 0 15 0-Footnote-47543999 +Ref: Version 0 15 0-Footnote-48544054 +Ref: Version 0 15 0-Footnote-49544108 +Ref: Version 0 15 0-Footnote-50544163 +Ref: Version 0 15 0-Footnote-51544218 +Ref: Version 0 15 0-Footnote-52544273 +Ref: Version 0 15 0-Footnote-53544330 +Ref: Version 0 15 0-Footnote-54544385 +Ref: Version 0 15 0-Footnote-55544440 +Ref: Version 0 15 0-Footnote-56544495 +Ref: Version 0 15 0-Footnote-57544550 +Ref: Version 0 15 0-Footnote-58544605 +Ref: Version 0 15 0-Footnote-59544660 +Ref: Version 0 15 0-Footnote-60544714 +Ref: Version 0 15 0-Footnote-61544769 +Ref: Version 0 15 0-Footnote-62544838 +Ref: Version 0 15 0-Footnote-63544903 +Ref: Version 0 15 0-Footnote-64544958 +Ref: Version 0 15 0-Footnote-65545013 +Ref: Version 0 15 0-Footnote-66545068 +Ref: Version 0 15 0-Footnote-67545122 +Ref: Version 0 15 0-Footnote-68545167 +Ref: Version 0 15 0-Footnote-69545217 +Ref: Version 0 15 0-Footnote-70545273 +Ref: Version 0 15 0-Footnote-71545328 +Ref: Version 0 15 0-Footnote-72545383 +Ref: Version 0 15 0-Footnote-73545438 +Ref: Version 0 15 0-Footnote-74545495 +Ref: Version 0 15 0-Footnote-75545550 +Ref: Version 0 15 0-Footnote-76545607 +Ref: Version 0 15 0-Footnote-77545662 +Ref: Version 0 15 0-Footnote-78545717 +Ref: Version 0 15 0-Footnote-79545774 +Node: Version 0 14 1545829 +Ref: changes version-0-14-1545933 +Ref: 30e545933 +Node: Version 0 14546107 +Ref: changes version-0-14546209 +Ref: 30f546209 +Node: Version 0 13548300 +Ref: changes version-0-13548402 +Ref: 310548402 +Ref: Version 0 13-Footnote-1550273 +Ref: Version 0 13-Footnote-2550323 +Ref: Version 0 13-Footnote-3550377 +Ref: Version 0 13-Footnote-4550422 +Ref: Version 0 13-Footnote-5550476 +Ref: Version 0 13-Footnote-6550529 +Ref: Version 0 13-Footnote-7550585 +Ref: Version 0 13-Footnote-8550638 +Ref: Version 0 13-Footnote-9550691 +Ref: Version 0 13-Footnote-10550745 +Ref: Version 0 13-Footnote-11550800 +Ref: Version 0 13-Footnote-12550856 +Ref: Version 0 13-Footnote-13550911 +Ref: Version 0 13-Footnote-14550966 +Ref: Version 0 13-Footnote-15551021 +Node: Version 0 12 2551076 +Ref: changes click551180 +Ref: 311551180 +Ref: changes version-0-12-2551180 +Ref: 312551180 +Node: Version 0 12 1551477 +Ref: changes version-0-12-1551581 +Ref: 313551581 +Node: Version 0 12551877 +Ref: changes version-0-12551982 +Ref: 314551982 +Node: Version 0 11 16554768 +Ref: changes version-0-11-16554874 +Ref: 315554874 +Node: Version 0 11 15555121 +Ref: changes version-0-11-15555230 +Ref: 316555230 +Node: Version 0 11 14555363 +Ref: changes version-0-11-14555472 +Ref: 317555472 +Node: Version 0 11 13555725 +Ref: changes version-0-11-13555834 +Ref: 318555834 +Node: Version 0 11 12555995 +Ref: changes version-0-11-12556104 +Ref: 319556104 +Node: Version 0 11 11556430 +Ref: changes version-0-11-11556539 +Ref: 31a556539 +Node: Version 0 11 10557120 +Ref: changes version-0-11-10557228 +Ref: 31b557228 +Node: Version 0 11 9557591 +Ref: changes version-0-11-9557698 +Ref: 31c557698 +Node: Version 0 11 8558075 +Ref: changes version-0-11-8558181 +Ref: 31d558181 +Node: Version 0 11 7558341 +Ref: changes version-0-11-7558447 +Ref: 31e558447 +Node: Version 0 11 6558577 +Ref: changes version-0-11-6558683 +Ref: 31f558683 +Node: Version 0 11 5559300 +Ref: changes version-0-11-5559406 +Ref: 320559406 +Node: Version 0 11 4559567 +Ref: changes version-0-11-4559673 +Ref: 321559673 +Node: Version 0 11 3559848 +Ref: changes version-0-11-3559954 +Ref: 322559954 +Node: Version 0 11 2560355 +Ref: changes version-0-11-2560461 +Ref: 323560461 +Node: Version 0 11 1560900 +Ref: changes version-0-11-1561004 +Ref: 324561004 +Node: Version 0 11561136 +Ref: changes version-0-11561240 +Ref: 325561240 +Node: Version 0 10 5563375 +Ref: changes version-0-10-5563479 +Ref: 326563479 +Node: Version 0 10 4563847 +Ref: changes version-0-10-4563953 +Ref: 327563953 +Node: Version 0 10 3564115 +Ref: changes version-0-10-3564221 +Ref: 328564221 +Node: Version 0 10 2564369 +Ref: changes version-0-10-2564475 +Ref: 329564475 +Node: Version 0 10 1565217 +Ref: changes version-0-10-1565321 +Ref: 32a565321 +Node: Version 0 10565611 +Ref: changes version-0-10565714 +Ref: 32b565714 +Node: Version 0 9 7569165 +Ref: changes version-0-9-7569267 +Ref: 32c569267 +Node: Version 0 9 6571180 +Ref: changes version-0-9-6571286 +Ref: 32d571286 +Node: Version 0 9 7<2>571549 +Ref: changes id1571655 +Ref: 32e571655 +Node: Version 0 9 5571779 +Ref: changes version-0-9-5571885 +Ref: 32f571885 +Node: Version 0 9 4572660 +Ref: changes version-0-9-4572763 +Ref: 330572763 +Node: Version 0 9 3573084 +Ref: changes version-0-9-3573187 +Ref: 331573187 +Node: Version 0 9 2573771 +Ref: changes version-0-9-2573874 +Ref: 332573874 +Node: Version 0 9 1574743 +Ref: changes version-0-9-1574844 +Ref: 333574844 +Node: Version 0 9575749 +Ref: changes version-0-9575850 +Ref: 334575850 +Node: Version 0 8 4580670 +Ref: changes version-0-8-4580771 +Ref: 335580771 +Node: Version 0 8 3581656 +Ref: changes version-0-8-3581759 +Ref: 336581759 +Node: Version 0 8 2582346 +Ref: changes version-0-8-2582449 +Ref: 337582449 +Node: Version 0 8 1583127 +Ref: changes version-0-8-1583228 +Ref: 338583228 +Ref: Version 0 8 1-Footnote-1583664 +Node: Version 0 8583726 +Ref: changes version-0-8583827 +Ref: 339583827 +Node: Version 0 7 2586459 +Ref: changes version-0-7-2586560 +Ref: 33a586560 +Node: Version 0 7 1586881 +Ref: changes version-0-7-1586982 +Ref: 33b586982 +Node: Version 0 7587195 +Ref: changes version-0-7587296 +Ref: 33c587296 +Node: Version 0 6 2592626 +Ref: changes version-0-6-2592727 +Ref: 33d592727 +Node: Version 0 6 1592955 +Ref: changes version-0-6-1593056 +Ref: 33e593056 +Node: Version 0 6594392 +Ref: changes version-0-6594493 +Ref: 33f594493 +Node: Version 0 5 1598918 +Ref: changes version-0-5-1599017 +Ref: 340599017 +Node: Version 0 5600341 +Ref: changes version-0-5600442 +Ref: 341600442 +Ref: Version 0 5-Footnote-1603696 +Node: Version 0 4 1603758 +Ref: changes version-0-4-1603857 +Ref: 342603857 +Node: Version 0 4605222 +Ref: changes version-0-4605323 +Ref: 343605323 +Node: Version 0 3 1607088 +Ref: changes version-0-3-1607187 +Ref: 344607187 +Node: Version 0 3607349 +Ref: changes version-0-3607448 +Ref: 345607448 +Node: Version 0 2609497 +Ref: changes version-0-2609594 +Ref: 346609594 +Node: Version 0 1611765 +Ref: changes version-0-1611842 +Ref: 347611842 +Node: Python Module Index611954 +Node: Index612702  End Tag Table