From 3d719f35f5c1ee4ce3dc01fb2167ef49c0180cf6 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sat, 10 Apr 2010 15:49:15 +0200 Subject: [PATCH] Added docs, fixed some bugs I introduced last commit --- artwork/logo-full.svg | 329 ++++++++++++++++++++++++ docs/_static/flask.png | Bin 0 -> 9925 bytes docs/_static/logo-full.png | Bin 0 -> 23478 bytes docs/_templates/sidebarintro.html | 7 + docs/_templates/sidebarlogo.html | 3 + docs/_themes/flasky/static/flasky.css_t | 239 +++++++++++++++++ docs/_themes/flasky/theme.conf | 3 + docs/becomingbig.rst | 54 ++++ docs/conf.py | 16 +- docs/flaskext.py | 96 +++++++ docs/foreword.rst | 57 ++++ docs/index.rst | 6 + flask.py | 8 +- 13 files changed, 808 insertions(+), 10 deletions(-) create mode 100755 artwork/logo-full.svg create mode 100644 docs/_static/flask.png create mode 100644 docs/_static/logo-full.png create mode 100644 docs/_templates/sidebarintro.html create mode 100644 docs/_templates/sidebarlogo.html create mode 100644 docs/_themes/flasky/static/flasky.css_t create mode 100644 docs/_themes/flasky/theme.conf create mode 100644 docs/becomingbig.rst create mode 100644 docs/flaskext.py create mode 100644 docs/foreword.rst diff --git a/artwork/logo-full.svg b/artwork/logo-full.svg new file mode 100755 index 00000000..43465a4d --- /dev/null +++ b/artwork/logo-full.svg @@ -0,0 +1,329 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/_static/flask.png b/docs/_static/flask.png new file mode 100644 index 0000000000000000000000000000000000000000..5c603cc22c086a9257ee1c91277c42413e6650c4 GIT binary patch literal 9925 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 literal 0 HcmV?d00001 diff --git a/docs/_static/logo-full.png b/docs/_static/logo-full.png new file mode 100644 index 0000000000000000000000000000000000000000..f255eece8157a0ce6baf7e2e0b297c31ce153405 GIT binary patch literal 23478 zcmXtg2RK{r`?o!7uiAT4C06Y%lqy<#(@=ZIsJ&+eMU0wVs1-X#tkQ~IYQ-omir9h} zukY`Fy}7RBBsnKfPVVcu@8|xEla%MrbScPK$Z&9QDD;3@CO9~_Rrk*;Nr>(rhg963 z+;0d1H1uAO+~3}ixFp}dCiMkc2HYR7{@)$9?ty0K{hQ2z+7^MPKA=FbqyH-$Fc|#k zwYNurv!m~;M?U_pMQ9}!92_njJuUSYA;o(oLG64)v)`gz88H07Lv2PdFe`zIB#)Yr zG>?FsRt)G%MM_)j&?nPQVD0JXmp_EcU+WYT6WzjYd<9*d??ZRq?{oxUyn82Rj3!>Z zG=FJsKKn%>XmGiN#}QP7yNf%DQ;O3a1CG{QzPZsL7d5WXN}*LI>P|%>k||m4sbcl_`}y@x*({6|`2bjQUozi(_?-yNFQyQhhd9^Es9w>k$@>Fx zg{GXJZ&JP<^S$$t>PHRZG2zbOMu{~b|8Jk>AaWdCyk0zS{9r$f&ysbGlQG|@x8IuZ8Yg01Cc6%e z9v~NP)=H5bKr#}Y6Sr11A*_F)e0=P`>YwrzEU+OQ5wd~HT6=5gt(Ffa;u?-(ir^?p zd762~kPiJONkpagJIe|!xC3akXn_Jjo=m}BDm3R|^naf|1qIU{DjW(b1T@cWUs<&< zChTY7AU*x1)waH7ZwiC$TO076=59L`EU2wnIBc+d*J;OQ%lv+t`#F`1pjFgY=&@!- z)j=nA+1BLCBaL#WRrIZL1Mak<{y?C1o_U3qc^?ua4Kt0-|7@6EcFt!~q4lz0f%@n0 zvyYLg|CX*;g2c)AfjH<}o(82u;C>Rcjf=LJhq@ zQL-=^#2EsS{`Q%hW6NS}9yKxej$U4Yznasx20FH!>i;xXhz!)43bmz7C&=VpMfdOl z`TzAJ^JHNG(Nr;jn4tiWWY2|F3zK$ggy50oyThPp3~~>DEsk1NhL-B!tyx(;Zd(VI zRJ?YT4eYGJ-UD6L1cGW{F4Mx3K)J((E=PDX(;+n z{tE*65f`nirAjIX^NE&7p%Grwbzm!89v-T5zZ1+V38_NWB*>)7Aw9F;Z%419q2k2F z#`%iOcE&@nt4 z;%h0ImKXZRqzE(MZhK+!9$;wJJ9|hsx#ZP;9gykwJEfE{&tQigyio~KlN4!b_=!=) zFill|JPUGfWS?hW|c6Ee{^4dx8uMgyqG_DRTa4ivUbONp@ zDoKh!_2RYStcZz>#vbp;3dM6l7oH(}9a?#g)7HrVHNoRAcz9!(i#|-EgG|&O#S*Nc zS&f%nrZz&b{HZbU)l>pduo~mT!XI^)EI|^|hFQqH`sBNn5wla#P0=qbj70CHVH;zf zeLDZlHGDA`R0N&F!2R@#QkN!T;y?79IG{fDUuES_Z-X3mRV+7d6XCq{rL~Lxq!wa*XrO=j8S7l46 zi4cb#cEPu1ZU4;)X?$MCSz9D3WoIuwv&FY@2HnK0;t@k09Z7@RBUuRx7MKtl$?RvG zUai(t?GUD(l(LNiEAa=!#ua3Q#MfukhK;>x=+Qzvr8To)GrOe8bMJ9oR?Ov*m+T zF=bLG4-~3LVmVv~+k}MSN&X-2h}gHsDEIPcRYj%5Q+qE3De) zRgB9wkD5K|z_(|HeSZ|B0-?koa&1$VeKDMRNA0$|5VP42wnC{~-DZNfrY_RHMpXxr z$_kwA`113}JiV$rnkQG*Z84olLgWl0Act=`;(@Otd>2B9zLjiv(jv}Hub+j-L9j9o z>2XI&~(-G;9ljJ;8oRQ<*E5@jXRL_9SV=zVZ>R!0f;=B zV(p6rwZ=lvym{X0kutTw@hoZL8P2~zs(fSVgZ1vd9|85U^rcgizCUyOFZW-U69I~{ z17FSmqBibKzj|{g9K8+-W-erNRsUwDE_=v9df81=hnjQ*%k0tD)sOAjt?_}QxJI!C z7277~)-YcTY;5l>Lc*lNx=|DF$$MmKHrG2h67;Qeg9LP_^Nn8CZ<6;E^%@mDdSV9W z15c=p7bR_c@V4;V@CNX$g+*qvls}6VFz$~;dVrYlv4o?9{7$|YNzgen!$un&ex?r3 zmfjmw#j(nFNb7x>EbRMbP(kp;G0*n!bs)nuyE|h&E)#wf5u-mQ2HlecU!|eprMto# z%^K&awY25ixJ!k4*^?<(Ik~_^v*_A*WPNGBE^@yk_@ZULUX#8fun*t^6b&I;WnhXB z(=SRD4SroQTAgx4Ab$)YDuNZP%6jn=DPW{ReQ{C4jSXg!vp_#Ugd!q9bLqWB?~|42 zyq9RM1{#Hp`PD@v8!KPJuf5+Ih$#Y=h?q6J0%`B)+lkxB+gU?6X_6WPThrf2HN-=2 zc)pazn-R3(SXTzrT(Z_qh#<&8=PsXTY!L%!mDaxNFg$^8vvV&;fIc=%mG1{#D+_Yd zXY$-61S~y{g1|sfum~;r_|x?Fc$9=@x_@KdYbzGBW~D%lrse{hp~{Y+C^^{90PHD_ zYt`lx#bem%<4a2D%p`f^Eu~JPqi*2>>7Vh}ztsrJ2eI4tqt zaV!2_7I;)lFb*Vbm-OW=6_K43EQ#9V;NLX8F-C_PzjPG|!dD>!K^8MO7X+C9z`vEo$1&f*_skKs;LhwGDYZ%p<1#{dKk8>Wn5uhF?$$ z#!~QkV^yR|Zv{oPzQ~Qi``^cA<}qgKZV}kywQ=uK4#dK0o;`*|;gaKgDq2`VM_QBI zv6_5SR@_`5MXU57Rd6FYVn1?kOG6h(w6-7lVa(Wz^S7C|{phq)Xl-M{2zJB5B$JU(g?|vX} zXSNjO1c8`vl0s=BmGn>PPuo)}wA!@Z?z(;veFCs1z5F8&{hcxu04(=oaEONcpwamR zPSOtzPvN|J-5ZdV>7w#SSYC>o&Jo^^9w1R(;Oa@q@k!L4$ zu}P3V*5#$s?&T}d?jVt}4q&78=$%BK`(v^nzl;7amMr(NoQt_%q*b%9hdM{>O<|Ae zEw>{j4JG(2NbGS!WE(oa;n#PB&(wX|<(_Y}=9uTQN#jYQvF^maOlgjQXzye|Jl0Ex zE3n){tH!|V8wY@*V7rTiCDS;8-m1 zGRV}0eccVLO80u9ji66~ z!C}-??4!+*)h|!HpIPtqvSK@m>7=T_Yy8bvD8AmR_B?yzviHGh7FK@kps{QK;*t6q za=HSg_}MLjhik)T!Tr-u-2Ex>in+u@LryrK4Ypt*b|iOdg1YEn#oLL$Obh$Jc%x{Q z>q@m1s{k?27+dk})X>A6I<9K=xCNHk$zlW#WMJ0Os{(?q060BOsdY^E{mR;71S+tU z(0WMBv!14&%-$yb*z(=5iuRT^ApY(d{?-e136UD_7b$w=%H9=1#ucKI!$?LQ9iyBO zYWZo@LEZ6Qy0D`Wp7kf{%2k|Rswg?)JOJ$73;~!FRH^z7AU`c6zH{>OH9f#EIrG8|q_u zJo$cP_5OaHh7YG~XE-8QpeZgk&x7{5BkK&PookGjnDCL=(N>`oW=;B6_W$Wi$D}w_kZ=^{XV~IT;RO*%%YG|d zfR6Ye0V^Ms>wC z^(UF@>%%l_dC0jxU}+L{U=(i@S2dg6K8j?-o1^$u?b5~|M_Y2xl}a>xIzqI<@I4-V zE3BaEPT&{&qJs4vBI)D+Y3XKS%a@+f_v!!mJEC}U9F&dG)^c~?c@y}2Lw*IdD%O*i z(TBX^PQZFa-|^mAuDn<;l;az8o?YY24$u88YKl3O(R?7V8dBwx2iLi7FEm!3G#wih62||1q(0kd(h*!RtF{q#fM+on^{A# z3pNx=rUW3(_bmS^@<;8K^cov_3l?ZcD%9hF*+Qyp+m#BQ9IZlp2Z_*; z2KrZtj-Z*c{cB7#an0YUH8IQJOUQLF#Q^dOy5Io7QcY_<)x19!tM&zHP%zmcw=c(; zWx&|)hXCvPp;v+T0Fz)D-*a~M)r@lB@8fe=QkLX)utTPUVp7)Gc^Hi|xllXJO10t zk>}^Q1as_8&hox5;h}5$JtI+xKi~Z#D2tMFtE@fiE~5x4!flt+RBc-8-z(lAwaRP!{ZsTONRN?{%2_nIMOgypW#{wryb*^zB}6;5Y^^Af z3Ao4qL2R%MXA3++gZ0(d18rNIdc(Z5Y&OwP<(l= zLz^t|Y9vbRv1QTlZ&t#*4jfvO*Dh}&DQxI_M#Hwn>dOgTia&u_8MLQBl9r!0Rij^_ zB6ON#t?5X0tB&8GZdzi07-^n*EApCZ;u{mkXTSP|n)(`KXEMou-?#5NgUoS$amfi; z9tudIUNWFnR#0!XuM~Z@KAVj0Ya|9#hHZ_?;V6a_yoT{~VcsG95mCE*2l!$T!8^vX zhDgT0D@rTmky`&`i||wfFkZ_y_UOnWc<(=oChsU7;G^|KQP%H#FCL}5i|)lWFIxDA zzU5y8^%B>5flkavk;pLfG!MLkB&^8D%8F^Sw&eT!Mn;IyHYhQW(Q3+dh`@n$VtaNT zWnTd^?6WH9Lw+2E^w3;WmRQd9udl=>q)e)?8n5cwzzJE&c3u0D&!?HQZ%NoFkiXIQ z|P7? z?!{f77~G)j%-Cv|TT8=nQ+z)g(6AP=VzLTBNR*rQlpyytArCeBD7kZM< zV{Dtc_r04+b8wP0)0yD9nb7bp^L}D>D3ugU7}lg_9sQ9c8~Qc2E5>|-`X)K>#ofxw zg92G!wElHe;g$9I_pF6X-Ko5*W|1AUPnAi(tl-(VBg&T)pgfSM1f5jFr3wjV+DcR9 zO^IM5{B8|x--%5^-zLJ}`eJfW5zPPUmq*!6TsNOY-_QCa8LQ{>{1L^Hp`uSHV6T7x zP2UpJhc+thvXzzI0&ceku<&0m-P%i`3+KSMH7t^0RHRkx^X~}cGPsm=h7OQV-OdWN z3pbrb{w7vi`XtM(!4P&b$JU$_oku{|3S%)7K^2~?KTk}G*3frlPEFNBPE@_68C2Mzr(k$L8XJRe2sV zqS&4k7d;@&RZ1=PV$@^n9H125^{$feErEXhhpwl$i~$XPw~j{Mh&4$1;1SINgJm16 z6;~S>)qmg-qtzIx=J-$?bF=8%wg;ignPzIlWwv9SF-yoj<~1#_k52AM{fIUf*3 zfL8g5e9wd8oF0s?qjtwZpjL5iR|vH;#tQ1*DOSm4HG47ky5mRF^o{JTb|((+raXk+ z&%qnc?8K6CeOh8lUrZF^%SIhzueEeFrRlK8r|THq!ryHltG;|o>_h%`S{CH_QZq~w zb@B{sPeuy#bOeRVl|RO6WVIM+R;~Zn$i=Xl^xyNuSjg;!`>5G3$3O2~hi9nfsY1q( ztz%AJVLY0sNDxS|(onPI(&s^gHkeE2c>)(<&vrNSi3JgRtZi(t9!(;54asXdgZQ|y zJx>7ZHag!#lC(+qumZYImuo@ghskl@G^In|=E0+k`4wnQ#Ys&th{<5{GMrPb*xcEr zfSLv63=$e-tmjgEi@;$S^n3px^BOTR%tXm zq_d8IaqaT0=;yIZw>dB;kL#_-z%-GyG;MS!(l0k+UB8|?{8E^RN_o%`%=(iDNX2*i zRtr6v(=Jdj4=j}YB3P;_*Pt7McBi^?*XEdOK8D?nEaK!6e6i-* z8<)@{aGj0Wd9? zd+6rmk5NS3fYChx=jK1|`}GZUIQNzhtgRxQmSVm1MXf=UMg(s@ibDBcZ9noaFC1E& zht9&wcTp{r(a=+;Da=2uJqL_B#Z*3h9<&z! z&V8ABV{_!feYtGSf^YIMEi^i1AUbW#Qyj1~jm&%u3ypn)-AX1=PTm_W$*_2X|N3pj zXQr4Pq^BC|k4KPbcoZ6a!t<0J))@{+o!VD>JI@VmAfh#^4x*&d9o0^Z6K>=sM>bJ4 zh#%f7Gb~-z&mI(fL*_}t`rImgxwC#PUMac3ro`{d1~{tZq6cW*u}EA@X_?&3w!_o? z8YIVa`}b?$&nK3|&3I(^<%NuXqSRldk88#Bn;)WY)%!Z7Z4*)o@5utOn6x7nDT$n6 z6&v%NhHHvTYtg2tQyubMrm;N{fORdR%Q|5=%eoY_r_M1wbmH~$Cok}OK$Uwk>x=8e z)BV$(k$?RPK$E{#fx+~Sbq)K={Cne>KSVz=+t~08D0u0Pd8%o|D>e1b`V%|z3y>PT zAP`PZGDPkL0>Wv8`#6%~agHmVGE&EUh$1Y~_Gi&yDQ@=Ph@Ohpx$}n#R3mZA5n!+?$vh$ZN87ZnHaoiMWwtk2T6hoI@J9!X z`iU(Yv>v}z5Ao*mjnwb_6N3vnA1)(r@g@0Bcj1}*dN2Eoxq(=r3$H=vO0+B;M0&5p zZLm9?+a}^sU`|T0%&vS!3QgCI3FyL{_(-p!qXfXZ4fXD`UeW>pctqgEZtyxal@>jR+B^?6S0BY$3D2=_FN1vs}H-@1ZvHN zdc6X@4E=z<&4Nc!lUtEMEAQSxhs3k)n7Xl|>yctS4fjN`F+t}L<#(i+EbIhg_lv@f zyF>o#SNo;CvJULRcGhj_3nfPSl#J-DIBIq9x0?}x?K!vg5(fO}r%SJ=c%Jq_coyjq zNy#H(Nd`ARX}j6Tiy=-F7>7YJHZ_BVapYer%oCI2FqY7w2*waT!{RQoirGc>!9eTS zzM&^Eipw`27+Y?fsg{i_V38TS6;1noV)Wg^Ezn}AcjJhVFwqJdqU4Om7B}!@WPg5@P{6+u(pBa)2k3HZ z{}6WHj57VE)aHo+>;DV~HHUDNz@mP^R|r0O7?+%6YU@sC&6s~bSS}9DAdFndJa`FC z+6=2y>|dpr9E>nrlX-8kb@V-k9J$w3@M1~vXfF=YfAqr4%oT5Sz-YW`Ts`+r*~LT# zvGM=C0PfpX&A;Ko_^NW_6X*t$<2Ax5+Gk+@iTg_Q8;vc~-WQJV_<(~XXM6G7ZtS;+gK~Z3X`@`B zDy)L)kP|RkGxJlr>6nbS73GP@OBNE_LW6V0uF&TQ`+)<;7Zwqfn(SA!3SFZ^K`taM zR0_n44=r(4iITe>j%U1i|8rU@6JGl;KV2HuG1Z5jYiz!sc2i=V@x(r$8|2;#KF7SF zcjtm5w%5hzo;J8Ezf@MqWZ=_oN$}mst9Seg&LSEYj$nXCTS7j3s_t~yoz$jIu2rx! zD6M0%cM=s98ee^0XZxlP_YV6)! z>D0p1M)Is2uJE9?K!zFN_-EtD<>?EnKKgLB-AdFig%{GjPwyEN%jP#p^y5~XTIXD_ zH3Nr7;5*%ncY)$AK{wN1gMoVO*x@?B$0t(-K2_p821I)nz#*35+4t(9N}e3!<50{u zP^+o)tos8fiOGDU62~p27SW~MV;BSEpvv8XBjsh>-cST>Bxf`ckgpHJeH=o1-5k(C z)yObTU>ATfn$-8De(YSE&W`jP6*-H{CbO0tJN@p2`1t617qF|ldG7iB`Q>sEdW?go zr_#;EuV+x;APi@rP^&I=)xFyF0nQl{jEBXymn)c6NO)N-x!E|^&B?$DvGi+#iWiRuuVzO&ETF4ycicOQ`{^)5%I0@=vxRho6o6X91~ z$yEo{j`nLEhuA5t<*$e>(3~js2MAECRVxKFDHTgUZsSwY*-^)rNun4Fg1qAjdYWe| z(~fO>v=x{JK@r=qjkZo@47rBR*P&I&^lbk+q6{f*UbB~cX?+k%GCkY4dQuipGMd$r z5N3gMsnj`(tayp4heQv^AyP+v^e4D|k~05&88_z1zgfAHN-fLSq0l>pvadGtrT#I` zBtL`7iQlDMJDJbJ&^Tmzdy7-AG~4ZhUe5C!NmSuT!Jas0ju}>3}?&)~vx%)rh90R!u2b4=A`58o`1V zFQG@>JgZ90W}stGC;NS~lpS@{z;H>(>(70V)J=K8a~_rNYZP{2;6$N7MlMEF%g6#^ z;!|&9VK}$zXl&`_>!=*=g##PTGX+$qMuRuVJ6WfLG3oEwgiN16^4`Ntcd&L#{Gs z1Y;eg@()V}wuat=f?v@6G1KP#DKp+$L?$o47wG*tyN5+K70c(3!KXG(ZFp>QRk)1O z{W- zZTjuTq+ZCayO>C7GVkC?@#1Cm*O>cun`CEOue`R0{Er|c>}@PqApKn*l{wo(-& zE0f)xM(?#stb)VQS{EeDMpMOYYXO2ohL#Ozb8=}Gi)nRWEkJ|wqT-!2Ho2KOBRuH? zBVmfyo(SPAQkdEM2++}hZ0a89U6a$dE4@e!Q`$cC?ZXUF42K6OG~V-H#neFG#iK8( zP49i>7>0h;%1A3{jr7ky)4WwYmVcn`g4Q3}p1L1>9VIUumzmY_E)rrn<+E{L(HNYuBe$C_oW-u7Jk7b)X-RSWtX;I z%`>V^+Y>szo9blEp>^xb^t@Mo0+}fV`-}P_=Ptme=O!=J+^LxT4~kDyPzxHT(x$un zxIK`mKloOSK!i-Sf`o31dBv;r`N~UMV>?9&t-ax`3((XV!DJii?4Un*QNk7b1|MnW z%YN>;rr1q@TvfBg&)TUwU=;$4o@r!udX{ka*2j#IdG3+}axWPt>(_kV_>Tv_A=rNT ze8IFV0H)KsbAo6xoGnlJAwes0qIhFeQC$CvtgnKoPJRD$~GdXfTafXCAeJtwqWTGW2?e)@hR04(yG@TUD+GviV9+ z_Ld(P)n3Py(?)4r&mD~<|8r#)RVA`0(_fkS7Rjlet~S)4uPu8#{ho7vFr3-H5q*!H z982mHZATs$!g7Ah038G7f_sg~mv-6(7Po9Sn}*1$N7)U3zQXfwy?ktlH8o;o;B!zt+g-5Yb7ysvBF67L$l1MoS+ zA8!{jfr4e+kxR=FH#*1LbtHH^Q95BH+I=*v2d`Zo{d?zohbY={@rs9zrJb&ueEq&P znC8|WN*{tmt$H>*ds-%orY(IcX&}^q1jpF7WAB>yWMQu+p9EAs%rLv*g>0gM%^t-v z!DB{4dalaLl%7AgmuZurhH1ech_j8B6)7Mbe@H|&4qhF&afo|#%jz`YY3t4OWPU?n z*TYaKpS|2_9QP~v!gN^;4YE+-oqUAPzuYM%nFjn(rVc5++!-o)nd_C5AJzUnX73hW zGSRXuFj$)SY$88TdC)gK>*l8W4yE%i^5>UYTdEGeBxuJ8y+T^|I>Wb@4Andrf~Kk> zoN+HpGIN(tx(*PJ_Ug~-JcQSlg}P>#5pA~5w?088HCBRE8-~uTYD}So(tBatC&L4G z!~QR}$p>2lHZ`0)st-A)I>w&@X{%<;I4>lmG^GtMR+%m=@efYOOj0wbV(Au@^<*zI z9_{zzTJLt&p}ZjFU!Qqs!acKKnTbfRmTHyN_+SezV{dyFSLPnF+UYepD5TC->x1oT zCG5ir;b~(i#Im9;GHHPI^X`y%?F4Sg4^cO2U9IiAEbG)-1_eUBt)T%G4Og9#i_CK8 zTPnRgn}lM+{iKWfsgufRFO4g}cj29QF}?%FNL^Y%`$-<$R5SbSEPoAFg{Z|dOZZad zGi!0w$JWl;n9g%`lj^bKtBqgeBO-UwGCxXEQzwn{cK5SfP5aqLZvR9rokk>@aOD$} zV49t;Gu+DRZu}z;l*~URSQt}uJri1c)*KdI7yTnso#55EmgTPCba!T;O7=uuddOWp z|Hi zGg;;f>d~CO*8j{+2?!^6vS`hGR8%j_=S-6ii*Z(-F9N_uzeG)5lQePN;wpS%*<%O~ zl5qqDbYjCn=d5@W1#EZ>C<>4)!3A%F(7V2K2KW5UgOGV4=}QBeI^o^rjb8N{jPd%d zlJ9$_&$D*Yu?aE5lYFXAOr942Vlz_?*1#~ z6Pjjt|1SUdI(YLL2IDA1vFxEsUkQuNyD7ZO%;?RAtJ?g5&?-Lw&9zx-Oi>cR!||s! zm2kv=tl+N%V7kr^n{r(`}jMW09O*l)U3vLLfPG2A!w^lS36-hKN>m=h&?hHfWX(_7Cr@z^l@u zaiDWXh5#L!#7=CL)3eY2*|9t6wRff1IMBM~B__(H%;x3n29Wj#?3<-=7G!=!mPG_5 z9}6GDENQUoC0ai_L3t@<@9upPS}AXY0+R?FKvdijRZp{umaS<@J6Je0vlY+ot-i6}Q960{G3zFJR*X9Tf5QN*6|kaD)T@og#YqMkwM2WIG;xSL$* zC>xz8$q7Rkuf?=Y;(cWv2b@@q2 zSP1jN@Dgd`2BjY+>V>eYqe}<(j`b_0rkZmhDJ3_z{9q3b;Yzn8`p8n8<#godJJ_wv+_cxa{LacFMoCUK4JYeQnKtsOu)_ii2p z>qyhRwToY0nt)DL8YURS)UVODyE`Q^g;`TR3~de%CEnr7(DsCtCb$^!Y}B@lJNIb( zh*Rvu)}%=N)ed8f(g{ASUUzr!0N-(A(q8;1q`R0#^-{Q+yKkXzX@qC)Np>$r4d#jYza&p0DT*I9pH3w6TQj~Ejk4mc*_nK_ zU6R|5J0cPw?nH2?xYk!Ti=tk>=}x{!F858kVBp^%FTka&Mg9TgY>!D}vb|2MSBn$} zu!fC}QyPa)@U$2B~gNlv)?O~{w-f{#|nL$tI1`>&N3Re#4dYc46WR10b^h#L1fC}rW1vG6GNT8ZTn?o#F$>#@C1 zfZ{Cjwm9G19rUzt;ktZJA|`^`xJ$@Lg|K{Xyh$s?Y(tVyERbEQ*2d}gw~>3!{tv+VdN_ZWq>s|{}}j5b&HUcPoRMB)5q0Nh68*#=z`0= zgPQr6pz{lqVJAk0oJRs~yRY0l$QSKvW_2&~PNVXJFov;YIw>ivs-gR`u)F}<=__+{ zLl;+5KlSTy0PAmm`z~Cm>jJ`I9>&?Rn3ws3j3XjicD49QP9Qya&=+6K1Y~w;!MP94 zl|P~jT_B?PS#GSw{`ua+D?|@!m7-M>k$he8As`i667%-%X=N$NlHP*_)}6)bFmWW#TAy|hRF6KI&le}CGgUr4X~Ld2##gwnJpG~n#FPf6J7 z@WwX-<~BO{X4OW9E$IZCOijW-9v2Qt5)y)&VP0P)c&?M_O{Zv&#^f1<wW!v=dIA~E2^hHRh^B+^XB%m76eYATMECLr9}SPt{IP7g zvUQ7N)d=rqJ+|Y4fF3KHWPBUEaYQ~KoYSi+VU#bRANCm$oO?ggskbTU(VH~^3>0`n zFwI>`sGc|Dm$V$3Z$ZCsEmM~Ni$006C zSGW%KY!gNqp3aesD*;lQ#tue-L~>%AsPERnVsC{tubyfw*~NW(Whht$yx3&h6hvoE z-u(hrrG&4b>H1qqBmPcLzBQtX2t?=h^yqF&*e7Dqh`^MwYO5?1s*wBY((T4Uf=OgxA?nE z)Iaxu3jfhPP++9^F%gplp-$$N{rz5ef;}UBmLvMX&-XODT==Hb2W-c0XlTkmIeP_r z@$7SHZR#YAzj^a{^)2E-%J|)DvC=61-zu3yCGSi=B|qehW8_|n?~$P_kb(r?J->yF zi0-Kl+#N&@1vFzg%8|Sp&?Rn-$3)xt)0A(Mf)$m2uJ^8A`XT&MPBlMM#~vXFxmORi zA~jjIt7>3;-9~z^uiHKB4DVv4Ul004CCB5?@*?m!SZQeiBn(c zclB^49ovyy>i7*ftzH4v1}v7%k5uSJqaOd;{e|zr<3y+27Vtysl7Ppbm3IIcMdkIz zG1EsC@DD?mrE$$&9!V*dFZtGT@;6Ud??^V17Z}0+e#Oi{V{fq7Vpj8)U3u=48vSo?{}hCU^2dFzm0UpT#~KBPS0iJN1^8yEm!Xp^mh zaPXe;s(QZz6K$6OSXiBm!Ag3L%P4^o5Fu7OwM#5Lg^U&omAWN$xO|@U2Lc{B=+{mC zR3tnMKh+~$QqBAIUEF(g|FZ#GZ+XSGlFZ_bR?ez_qw5^S`j+5vCx3h|jsYwAT~Mw{ zUN86PE|snq%hNkEp@0&Ld3^4-;&iXg%cLO1xye{UhF`maAG)v+Zfaxnyn4MX|7&3 zo7g6h(OluuY%*&uH@iV-locNvgIZ*h1qvy>q66{SLwa(vqi?J!UB&y``MH z6y@x=mDtexXT+6ED@3_#K&r7l^h^7zDCj&-(vPl7GWOw5#tT8|<<6@I86;~LpCdFc z#N0BK|5SF7wvij?2fFvTR)bj|FnLstj;Kk8~tr-;jH+Wefr?BtryC5jzaY?Lj_ zO3D{@tEeyCE!7OFCY$NsM6*w7vF*FR=c;|+-!riuFCMVXrRn^~YoeRniz9gk$dBY0KyUkpWb$RxxvW7E-cO(qvBpJav8SPIs zmdE%6ZnQe#IVGIpRu!a2iVipF2f>;lf5ZASyYxF@8lAh)Mcp0Hq&gTe0C zqmJ$H(zhW!ICqa>Una?vBh(3 z=BGD!?PJJ~!7UdDQ`O9Co&f8{7^Rak(-PZYY~6#Xt(a2e6LI=}6#y&(xo6kRa!1|B z!{~>>Y7`F9)Zd0nr_3eX`=ZbXx_4uqT#N5w6dY*}62c3y+f?p@B~1NM6kVR6EkTA) z`1j_yw_~1i0J!p|BFkBk_OfzK;9pC(H40oi8CX=2>07a6Y0 zM-V*pQ&4LH)Hc(iw}#sqD%yd)HFg5u5s33$;eNvLDOe~)iv3#NLUV>71EJ8d_`j6E zgI_Jw8NXaje%HMnl3@G668+PK>w{4TK_|}!j$f~TFBxXZe~xM}567@p2> zvPa&f{xGAF)+N_&({$hU09Bg0jo}ZXk_PRA;>gSggSs=Nht>^&2dm+tq+DaEkpsc^7%K24>XDm za_dUN$jE6~s+?~R)(@a=)17z)qbPHKjI(mmOJ{H|T}h)-?4qCUS`c7K#_aFu=MwIc zER7*9U!P|3u~doOP3$Wvt`8JMl|yUA8O`c=l>^-@>eUI$2ej0eN=x|6Mv*Myd`!NW zZq&_su4^k!FnQ>BriIr;!9qo-h$m>KXh9YfOwMzAlK5F?g>#xIdt=H8SH$aHBJ8SA zk$EX5#?lKN_I`k^C}BhNx_=(hde6wHwe>!NI?4UN3lOq_w~`*^UcA8n1dqt;XtTeg z+(m(w*8*P`nnSKLc<+WDxRabH*ryGmb&lPEy2g^|ay_sV;*9X*@ z#=LH_P(L7w+??Db~*GP`9Q~cx25%a$XjWNAX!Z z+IBgDnn9HDHGu$G(G&iX@zNh?fpen`a7XA|?M;Q*enztM%ySDeDpNLNqzbG1=h2696a4fT%w>RLDUhwGT8!IvCn41-0}k>K2Heo6;d{Ui*0j5WUX3;Ey=K- zJ{USsIRx-oG^D|MAHHHnzZU)OCWo!bZErE{zb{5(p1!B6sCqTgX5#3c&k|ZSV_OhsVfU8RWJrM`DPtK4XEkZCJntNI=l0UR&B@f#>m*$ z*vqBCo`($@RrA+AO%Ms8c)r+U$2Ce7U9w4Q%PmQ z#6LHDbtQA`rrDjD@*B|Siw||*lv6qv2c;$G+O_J^NOQUkooQ7 zm+zNk=8TmeM3cI;z#M z2pX8zA$Hj1B=pzNpc_erKwpU_%O6AEO4F}7JXXi2ktA9qDm@?Cc{vgr-VS*R2JMu0 zMg-Fli{}7hN{MyaAWdocf)GCeP3RBPQRI0RI*!e!kq6}{KCYntDboE}FvLYdOi}#b z=r}PCrqZv+hwr;kEPg3E>Slcx>iHpJ&Bqr2Q8}NZaeNBuZ{LyV>ovZ8KPtLXqeEM~ zj|4B`byzQBe#7b5*GD3$!naVrU%JY3`%)35em?ZOr%)d}gcJ#3v}lO*{l z%t)1EI;5`@)#*vp|0WCZ`z5~TslcouZb~Y|IVxv#xb7gfm<;Ksh`qOeobWEVII_}hao=xghaYQXhqoz5uyiB$J{)G-Ry~TldzrN0Ik}-1@3Y8 zS3=xkXmYzW{yt{5B>FCMptHk=fjg?TrNAP=m?FIMAoSfvp_TaqF8^$q z5XQ^q=o>sl7%yR534=j1h&xTh)9h?+uN$_ zD8ygQBYWQqvGQi5qC{8^lLJ?p*%4ton*}?f!|YwDD5&-Y&NQ?0vPk@tC{dzBPer#Q zNG|#HO^~SJZf15+2>-_2halG5W>nX`0a+Kgo9g12L+L2n58{V!k9gN-l8vAlI*7g^ zoaNL+I0G4iScOS!4-BtjZJVAXUPofpOCX7`Bmue*=?K(q)UcyE5{a6p5we?*a%tQB+?VJKGy63%IW@**Eu!1O zwk#FH$D;m8Wn{wr=!*EDUsOmB~)~8oSZHvkbcYC;n@$V z_zLmxdq;BkXezHR>63A5?k~5yJ}LE^4!9L@7+#Cj_1<>ZZBo9%oV6fQotO=AVy33W ze$(3YuDd4Y&M7iI*Y1jEe7RMrD3*?;;x)4m9hJHATwfqvjB!X}?w3fX<)A>Ienev0 zkH(%EO-vgb=`*C|eQ?hAn+6$r9aSa2dr5JeS6*%FkAsm)fdemgaoO`AM}H?)iSLWN z$i4*pEQAe0E+yg%;eUm?G?}Qg3D2{v@n)nHYThF zPYA?e0@(@D%SezQYP8YF)X-8P&vUEfcRdvi`7PO zu5NvXlteHWe4q5lCHo*k4@w7F7`O6@AFUE4qI2>e0o*;4YRp7MkU+k6kPWdF(5_*<_&^Aaa0c=Q z+iHA^Ox8RTuIGRcy)l;psR*WcevPCCSEAz2=oMgpcfYBqvYLgNEr`r8Er`z8t_99< z_ix);u@=DObny|iLt3KU^@(6+U!a}#Y+l8rQHc^=1v7K#!2}6@5+ghV_!FYQJG=XZ zi8Om5zIi(^7O^ruLuU<}xm-Uqg&<+Vct!pCnqN4B}m;;52+s9 z{YQ7-0a-W(xWLRV55_N}G$&JW;hn@?XeIwemH4laNcJfWR zM<9cpkuk-=$cNK&X11rvLui-5%oa!IaDSkq0o={e!Ddxsw><<|t#ou1x?6oFDg;Bw zmm}ek5?zdma)%U$$;0b)R1{sG0&YhZd4G=t50ZEnS=p_{`yYi|CoGH(D@u2xE~B(*?-db2HvN>(yZyMBJyZlH@Doav=9PT6afmhxDSm zFB-yjM+dp15IcE1I_o^$gQ4J%ZX+a}wl!M3tb`UBzeKu1XS(}Cq#zgoJ`h>@zAYBM z80zZ>grHNAq}>d_OG(zQnXQF{dKL|3UX273z9t7kJM07O5@V2? znZw=v*<@Z-^6!gmTh8e2N1E9*$amSVLfu~mj&t|7YUHsfVtFru7U8cU2Y3%B(yf8m z%+sN7cNG=S)2F$6++k&{I!}$h(TZqZ8j1`!Kc13yX2kKh)!lCoR>jv2?>9Z_W5;=I z3*f&(eP|FGbFU&R@$aRiT?M%=`N-W5OvKHH+@^fx?&qXDJ1ug75jhcj6wN_Trj-?* z`Dup~lz^lDun_tVhjeJyc1vOuB+W5vXqZOCza32=W9y`O6%D*A>!cfrh{3r?eEd=} z%HTKf-YXy>hgx+x8koNYWiN+_dabtjQ@i^{3;SH;@8`u>*y6E%_yc069z>9aL(0_g zetH5G@$nyG;p2f-6Xi{gtk_5Cj!DEXMQ7>EZ^AcvAd&WTr0Q@Oa(OX4q<@Bl^R*i9 zzc?NJTrHo7H>BJ58PZAFn2Lnpxf#n?3lXrWeU3uswi6Jch`;C0Ql6g-EhNVxzdR=( zDcR`R%i`~gCd>HuxCbq6Pb1+-u11{~LwbexqXqHNRHTEqNTl75ieI3o(OfYB5$^bR zyst`Gb0cE+12PnFA{ED@-vN6jzQ^!bp2zn@D%_Yh*a! z`owclo>zwNFe=s_9{S-=&IsE+unU|Z`XULtdc@~PDvGwz^)c0Tfbw3qBRAW66tRJI=;-io*+l%H z5PnG_e1GH@DN7r#N=E|z2C{QGW4QL9qMvwZ%JUHc+%pkAm!T2 zI`TOde`Wl-?*>{@;Omli9vA|s8FL$nEKLabJwZ;^G0Z5ydq=u}^Ya;oi+Zl?!opQp5g z6D&2L$@9}NKx?k1skjH%)jnRHS@+WBH-ESwU5RfzjfB7B3``*ivqXy+15q%+3C zH;npl1AQWLF@Iko{IJ+NoSlf|th0)iMwp&g-)-l_Gtv8f=m`(cVGP|7{w9T$qW8O~N?k4p_eB$9`h##!8=oVq z#Py@nuadftk#JQ#RhO?)!lJ(Z(>&5ACDB9=cYoZ>mI97L+vPOLqnl78E{RMA#qlm` zz&!dT^H5zfr#Iq%M_3UUXl5&U?64ca%w|N^zfT87hC|K`5L;(@WbWu`;2BToJGt~u z&P4u|W)9DMf>!R6p~-COMBQcqHVqfRH)i%Q;zd7*TyFnhW-B3nb@KTnc23r-hhtWx zsQfmt0C1t1t>IN%H)p{6;a+WF5b1Q)B0SYFf4E1irF#&YXeW37uz~!d`piJOtC!7? zki~vz(!bfvh5LLw=5)h(&#d2IFtgM7>N%Gdz~&QA7}0iKWot;7>5K0ceuA2bei% z!M_#i@>j%;JSo)mD>HlD%>EsSZwI*hC+_~ZyT9X-(CLj173*Od)am|#4&}c#vj-6y zt{yRhlum8JbU7RuVrE;K*$rkkOV(%FgmK6~?n-F&xiVT5G>dv;vk`*yY3%pr?*1Eh zKc@*|6i27;?(W}*o%_N_5*Fks`OpH&OCs4`pND(3MPi%?6{VW+akxM2?hCm4KJGre z31U?goHw2Hg8qMnz=1w|juRk-^)v?BQ$dLaj(ECTnUmC;6|+1`luN!o}syJelw zz1e1VPnfVrA@iYyzHLA>-co~PGs?TyA7umIU}o#g?9OtgJ{R?R46>0gN4E7!&;w1j zeJia0qM7}}%+{OPt7i5((&CN)r-Kk(VrDY}g|`XJte2U64>6!_0XCW00yCR#W>=Wm zKrySaseQgTl_ zpSy`bGPBXySakPY?mmlxndvrb|J{-E&nu%6Pd2ms-e&-}hBjN!>NZ1Wu4;`UlUMqf`9(Ca&LA^n_i#V= zm1uVut)f2C%(Li*Xtj^hbc=#YN=CaqM%&nl4Tvf967s#Rpy2RtZOQEJmv``3%ADW- zp(&$ke)zr-m{F!}MrHn7iDQGJ`}kmq<4eNvCrTXaPJz&Kdzov;4)*U-$Ot|P_&!R7 zHLeBEA#=J<%YFYOQm}gG`d14aY~eeb^>=8AEziZEz zw5t>pL$M}2j6FyYeF()V)F9JXZ^T5~$k`{rjw;WDzb6o_`!FymcOSDuokK|D9gIwT z**TsIFG9016v*E+2eAT6_2+S9BkxwC?FUf&#Z+W7e*ncrtVK5P#uDdiPLMrLF+D#n z$C3H-dLG-+$~}uyszORq)^-JvVu4n; z*`#qAZCTPQ9P5Kt^;z3@ki-8+@$Zimk>ydn2INn1q#R6Y!E^X}be?@g0v2sn=}7o4 zMO5U~;ofJr;2PhEuJHnq;6s9CRdoD5qIe{v@n?$VzYqc77syYynH*y*YWGSs##SPK z^A{`Z?*v2+$ojMw35R3h+OhId1yo0MmjG8r$45lJO)VlL#lPiU6j+t(k*WCi=)I{1 zE-ll?KT-U?91r8|Nc4Y9QI8pw?}U4qhkRv4F<_z1oT$ySL_!Q%T;dRjhkzknK2t+m zU}krqZ6Yp3g6PLcP~C-mOiR%qz7{?Fo6#UTgap|bIxkhrXWjkJX4caK8^_GDjNs!@ zFx_GlN0G-FWR}>5mfC-G_uZu~V#;D&O;c7+4Wjk7YOn;N##%I}K?A>vfOuSM>D$joM<-ywTe-B6(N!sr}5f!m^fyoJW|N_Q{mQw^knnP~O32l%VI z|DnQ1lVvpcJX)#LA_nH)^Vc)8xkzEm?yC;iES&bRFfV4%0PB$!`2?DzGiKllWC~ka=6r92wl!$77>Dk)oRjnfTBV&p zFGf~QATz~&q`lW7A)O7f!J+R(H0D-d2YP`9Q4mz+u*==AXoqViB%JpMKELHiK(0Un zegsk)hecHpF|UU9KBvi z*@kSnjvS7!SI}lFO}AVBClW-9D3}SZMZz_1x0&L!B!ScYxT9x`xR0iVTu1`j>frMr?vi1HJ*{6r0v_JEZzvrtR*r#_BN6?lWdGp^yUIzK>nd; zQC!h$9vp>cHV%;}#O0#M-&49j^Iqq7FU(*N_==|g0xU2uayK+%V1`gpcs@X$iLJZ`F*O9aH@&w_Cfsq zxfJqT9YMmW7OiMLg=oYHXUBH5VdBfcrnV0JgoK33VP?~S8Au@?iU>@*k#Jh(?UU^z z38c0lFi*xKEnx~`zwJSq`vwX*=k^AZ-G>n~Wq2qfke{kY=lA|SgM)~6x*iGWzKEc4 zBVzF#27ZXlq?M#TN=QiPK$uzgj(Qi9Kx#(>4*wJ+pe9hDCLcs`H9L?W=dI{(JzDx^ z0%|y7tz3v`==~4_upeUn?L#cOeH1p#x*3rux&n@($oUtLP5RAJl|o*>PoteQD@}8h zkdV-Ykpxl)A>{G89tF>i3gx57#24cL#X@Q)N~f`(3K7_T*Pyt7i;!O_E+>)js}G<1 zpj=d+KteFaP82_s?`vyu6h*v0g|?1vZ6@r5goJY#Ng#D1LbmH+6a-XOMpAn6KY;{P zk+4EZJzG4nhdvBIJI!8#vQ&&gk=uh&Ow&T-ujyIgY3oC~j1uq2zFdRMmur#`N=Qg( z4oM)r2M{*U8iMHJ7l$%1`h0Qj`z!-^JrY`3IbPy(Ju?4g0%$NT_gOWdTwuFG*`51) zpe69(XK!M)B_t$tH2wz-z<;Y* S^>upy0000About Flask +

+ Flask is a micro webdevelopment framework for Python. You are currently + looking at the documentation of the development version. Things are + not stable yet, but if you have some feedback, + let me know. +

diff --git a/docs/_templates/sidebarlogo.html b/docs/_templates/sidebarlogo.html new file mode 100644 index 00000000..3bc7f762 --- /dev/null +++ b/docs/_templates/sidebarlogo.html @@ -0,0 +1,3 @@ + diff --git a/docs/_themes/flasky/static/flasky.css_t b/docs/_themes/flasky/static/flasky.css_t new file mode 100644 index 00000000..05caf2f7 --- /dev/null +++ b/docs/_themes/flasky/static/flasky.css_t @@ -0,0 +1,239 @@ +/* + * flasky.css_t + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- flasky theme based on nature theme. + * + * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: 'Georgia', serif; + font-size: 100%; + background-color: #111; + color: #555; + margin: 0; + padding: 0; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.document { + background-color: #eee; +} + +div.body { + background-color: #ffffff; + color: #3E4349; + padding: 0 30px 30px 30px; + font-size: 0.9em; +} + +div.footer { + color: #555; + width: 100%; + padding: 13px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #444; + text-decoration: underline; +} + +div.related { + background-color: #774117; + line-height: 32px; + color: #fff; + text-shadow: 0px 1px 0 #444; + font-size: 0.9em; +} + +div.related a { + color: #E9D1C1; +} + +div.sphinxsidebar { + font-size: 0.75em; + line-height: 1.5em; +} + +div.sphinxsidebarwrapper { + padding: 20px 0 20px 0; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0 0 10px 0; + margin: 0; + text-align: center; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: 'Georgia', serif; + color: #222; + font-size: 1.2em; + font-weight: normal; + margin: 0; + padding: 5px 10px; + background-color: #ddd; + text-shadow: 1px 1px 0 white +} + +div.sphinxsidebar h4{ + font-size: 1.1em; +} + +div.sphinxsidebar h3 a { + color: #444; +} + + +div.sphinxsidebar p { + color: #555; + padding: 5px 20px; +} + +div.sphinxsidebar p.topless { +} + +div.sphinxsidebar ul { + margin: 10px 20px; + padding: 0; + color: #000; +} + +div.sphinxsidebar a { + color: #444; +} + +div.sphinxsidebar input { + border: 1px solid #ccc; + font-family: 'Georgia', serif; + font-size: 1em; +} + +div.sphinxsidebar input[type=text]{ + margin-left: 20px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #003B55; + text-decoration: none; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Georiga', serif; + background-color: #bbb; + font-weight: normal; + color: #212224; + margin: 30px 0px 10px 0px; + padding: 8px 0 5px 10px; + text-shadow: 0px 1px 0 white +} + +div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 150%; background-color: #ddd; } +div.body h3 { font-size: 120%; background-color: #eee; } +div.body h4 { font-size: 110%; background-color: #eee; } +div.body h5 { font-size: 100%; background-color: #eee; } +div.body h6 { font-size: 100%; background-color: #eee; } + +a.headerlink { + color: #c60f0f; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + line-height: 1.5em; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.highlight{ + background-color: white; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 10px; + color: #222; + line-height: 1.2em; + border: 1px solid #C6C9CB; + font-size: 1.1em; + margin: 1.5em 0 1.5em 0; + -webkit-box-shadow: 1px 1px 1px #d8d8d8; + -moz-box-shadow: 1px 1px 1px #d8d8d8; +} + +tt { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ + font-size: 1.1em; + font-family: monospace; +} diff --git a/docs/_themes/flasky/theme.conf b/docs/_themes/flasky/theme.conf new file mode 100644 index 00000000..cb9eb465 --- /dev/null +++ b/docs/_themes/flasky/theme.conf @@ -0,0 +1,3 @@ +[theme] +inherit = basic +stylesheet = flasky.css diff --git a/docs/becomingbig.rst b/docs/becomingbig.rst new file mode 100644 index 00000000..90cc0138 --- /dev/null +++ b/docs/becomingbig.rst @@ -0,0 +1,54 @@ +.. _becomingbig: + +Becoming Big +============ + +Your application is becoming more and more complex? Flask is really not +designed for large scale applications and does not attempt to do so, but +that does not mean you picked the wrong tool in the first place. + +Flask is powered by Werkzeug and Jinja2, two libraries that are in use at +a number of large websites out there and all Flask does is bringing those +two together. Being a microframework, Flask is literally a single file. +What that means for large applications is that it's probably a good idea +to take the code from Flask and put it into a new module within the +applications and expanding on that. + +What Could Be Improved? +----------------------- + +For instance it makes a lot of sense to change the way endpoints (the +names of the functions / URL rules) are handled to also take the module +name into account. Right now the function name is the URL name, but +imagine you have a large applications consisting of multiple components. +In that case, it makes a lot of sense to use dotted names for the URL +endpoints. + +Here some suggestions how Flask can be modified to better accomodate large +scale applications: + +- implement dotted names for URL endpoints +- get rid of the decorator function registering which causes a lot + of troubles for applications that have circular dependencies. It + also requires that the whole application is imported when the system + initializes or certain URLs will not be available right away. +- switch to explicit request object passing. This makes it more to type + (because you now have something to pass around) but it makes it a + whole lot easier to debug hairy situations and to test the code. +- integrate the `Babel`_ i18n package or `SQLAlchemy`_ directl into the + core framework. + +.. _Babel: http://babel.edgewall.org/ +.. _SQLAlchemy: http://www.sqlalchemy.org/ + +Why does not Flask do all that by Default? +------------------------------------------ + +There is a huge difference between a small application that only has to +handle a couple of requests per second and with an overall code complexity +of less than 4000 lines of code or something of larger scale. At one +point it becomes important to integrate external systems, different +storage backends and more. + +If Flask was designed with all these contingencies in mind, it would be a +much more complex framework and less easy to get started with. diff --git a/docs/conf.py b/docs/conf.py index 85c52700..9f417120 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -16,7 +16,7 @@ import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.append(os.path.abspath('.')) +sys.path.append(os.path.abspath('.')) # -- General configuration ----------------------------------------------------- @@ -80,7 +80,7 @@ exclude_patterns = ['_build'] #show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = 'flaskext.FlaskyStyle' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] @@ -90,7 +90,7 @@ pygments_style = 'sphinx' # The theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. -html_theme = 'nature' +html_theme = 'flasky' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -98,7 +98,7 @@ html_theme = 'nature' #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +html_theme_path = ['_themes'] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". @@ -108,7 +108,7 @@ html_theme = 'nature' #html_short_title = None # The name of an image file (relative to this directory) to place at the top -# of the sidebar. +# of the sidebar. Do not set, template magic! #html_logo = None # The name of an image file (within the static path) to use as favicon of the @@ -130,7 +130,11 @@ html_static_path = ['_static'] #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +html_sidebars = { + 'index': ['sidebarintro.html', 'sourcelink.html', 'searchbox.html'], + '**': ['sidebarlogo.html', 'localtoc.html', 'relations.html', + 'sourcelink.html', 'searchbox.html'] +} # Additional templates that should be rendered to pages, maps page names to # template names. diff --git a/docs/flaskext.py b/docs/flaskext.py new file mode 100644 index 00000000..85331eff --- /dev/null +++ b/docs/flaskext.py @@ -0,0 +1,96 @@ +# flasky extensions. flasky pygments style based on tango style +from pygments.style import Style +from pygments.token import Keyword, Name, Comment, String, Error, \ + Number, Operator, Generic, Whitespace, Punctuation, Other, Literal + + +class FlaskyStyle(Style): + background_color = "#f8f8f8" + default_style = "" + + styles = { + # No corresponding class for the following: + #Text: "", # class: '' + Whitespace: "underline #f8f8f8", # class: 'w' + Error: "#a40000 border:#ef2929", # class: 'err' + Other: "#000000", # class 'x' + + Comment: "italic #8f5902", # class: 'c' + Comment.Multiline: "italic #8f5902", # class: 'cm' + Comment.Preproc: "italic #8f5902", # class: 'cp' + Comment.Single: "italic #8f5902", # class: 'c1' + Comment.Special: "italic #8f5902", # class: 'cs' + + Keyword: "bold #004461", # class: 'k' + Keyword.Constant: "bold #004461", # class: 'kc' + Keyword.Declaration: "bold #004461", # class: 'kd' + Keyword.Namespace: "bold #004461", # class: 'kn' + Keyword.Pseudo: "bold #004461", # class: 'kp' + Keyword.Reserved: "bold #004461", # class: 'kr' + Keyword.Type: "bold #004461", # class: 'kt' + + Operator: "#582800", # class: 'o' + Operator.Word: "bold #004461", # class: 'ow' - like keywords + + Punctuation: "bold #000000", # class: 'p' + + # because special names such as Name.Class, Name.Function, etc. + # are not recognized as such later in the parsing, we choose them + # to look the same as ordinary variables. + Name: "#000000", # class: 'n' + Name.Attribute: "#c4a000", # class: 'na' - to be revised + Name.Builtin: "#004461", # class: 'nb' + Name.Builtin.Pseudo: "#3465a4", # class: 'bp' + Name.Class: "#000000", # class: 'nc' - to be revised + Name.Constant: "#000000", # class: 'no' - to be revised + Name.Decorator: "#999", # class: 'nd' - to be revised + Name.Entity: "#ce5c00", # class: 'ni' + Name.Exception: "bold #cc0000", # class: 'ne' + Name.Function: "#000000", # class: 'nf' + Name.Property: "#000000", # class: 'py' + Name.Label: "#f57900", # class: 'nl' + Name.Namespace: "#000000", # class: 'nn' - to be revised + Name.Other: "#000000", # class: 'nx' + Name.Tag: "bold #004461", # class: 'nt' - like a keyword + Name.Variable: "#000000", # class: 'nv' - to be revised + Name.Variable.Class: "#000000", # class: 'vc' - to be revised + Name.Variable.Global: "#000000", # class: 'vg' - to be revised + Name.Variable.Instance: "#000000", # class: 'vi' - to be revised + + # since the tango light blue does not show up well in text, we choose + # a pure blue instead. + Number: "bold #0000cf", # class: 'm' + Number.Float: "bold #0000cf", # class: 'mf' + Number.Hex: "bold #0000cf", # class: 'mh' + Number.Integer: "bold #0000cf", # class: 'mi' + Number.Integer.Long: "bold #0000cf", # class: 'il' + Number.Oct: "bold #0000cf", # class: 'mo' + + Literal: "#000000", # class: 'l' + Literal.Date: "#000000", # class: 'ld' + + String: "#4e9a06", # class: 's' + String.Backtick: "#4e9a06", # class: 'sb' + String.Char: "#4e9a06", # class: 'sc' + String.Doc: "italic #8f5902", # class: 'sd' - like a comment + String.Double: "#4e9a06", # class: 's2' + String.Escape: "#4e9a06", # class: 'se' + String.Heredoc: "#4e9a06", # class: 'sh' + String.Interpol: "#4e9a06", # class: 'si' + String.Other: "#4e9a06", # class: 'sx' + String.Regex: "#4e9a06", # class: 'sr' + String.Single: "#4e9a06", # class: 's1' + String.Symbol: "#4e9a06", # class: 'ss' + + Generic: "#000000", # class: 'g' + Generic.Deleted: "#a40000", # class: 'gd' + Generic.Emph: "italic #000000", # class: 'ge' + Generic.Error: "#ef2929", # class: 'gr' + Generic.Heading: "bold #000080", # class: 'gh' + Generic.Inserted: "#00A000", # class: 'gi' + Generic.Output: "italic #000000", # class: 'go' + Generic.Prompt: "#8f5902", # class: 'gp' + Generic.Strong: "bold #000000", # class: 'gs' + Generic.Subheading: "bold #800080", # class: 'gu' + Generic.Traceback: "bold #a40000", # class: 'gt' + } diff --git a/docs/foreword.rst b/docs/foreword.rst new file mode 100644 index 00000000..79243d3b --- /dev/null +++ b/docs/foreword.rst @@ -0,0 +1,57 @@ +Foreword +======== + +Read this before you get started with Flask. This hopefully answers some +questions about the intention of the project, what it aims at and when you +should or should not be using it. + +What does Micro Mean? +--------------------- + +The micro in microframework for me means on the one hand being small in +size, complexity but on the other hand also that the complexity of the +applications that are written with these frameworks do not exceed a +certain size. A microframework like Flask sacrifices a few things in +order to be approachable and to be as concise as possible. + +For example Flask uses thread local objects internally so that you don't +have to pass objects around from function to function within a request in +order to stay threadsafe. While this is a really easy approach and saves +you a lot of time, it also does not scale well to large applications. +It's especially painful for more complex unittests and when you suddenly +have to deal with code being executed outside of the context of a request +(for example if you have cronjobs). + +Flask provides some tools to deal with the downsides of this approach but +the core problem of this approach obviously stays. It is also based on +convention over configuration which means that a lot of things are +preconfigured in Flask and will work well for smaller applications but not +so much for larger ones (where and how it looks for templates, static +files etc.) + +But don't worry if your application suddenly grows larger than it was +initially and you're afraid Flask might not grow with it. Even with +larger frameworks you sooner or later will find out that you need +something the framework just cannot do for you without modification. +If you are ever in that situation, check out the :ref:`becomingbig` +chapter. + +Target Audience +--------------- + +Is Flask for you? Is your application small-ish (less than 4000 lines of +Python code) and does not depend on too complex database structures, Flask +is the Framework for you. It was designed from the ground up to be easy +to use, based on established principles, good intentions and on top of two +established libraries in widespread usage. + +Flask serves two purposes: it's an example of how to create a minimal and +opinionated framework on top of Werkzeug to show how this can be done, and +to provide people with a simple tool to prototype larger applications or +to implement small and medium sized applications. + +If you suddenly discover that your application grows larger than +originally intended, head over to the :ref:`becomingbig` section to see +some possible solutions for larger applications. + +Satisfied? Then head over to the :ref:`installation`. diff --git a/docs/index.rst b/docs/index.rst index ddb41da5..74397dbe 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,6 +1,10 @@ Welcome to Flask ================ +.. image:: _static/logo-full.png + :alt: The Flask Logo with Subtitle + :align: right + Welcome to Flask's documentation. This documentation is devided into different parts. I would suggest to get started with the :ref:`installation` and then heading over to the :ref:`quickstart`. If @@ -11,7 +15,9 @@ you want to dive into all the internal parts of Flask, check out the .. toctree:: :maxdepth: 2 + foreword installation quickstart patterns api + becomingbig diff --git a/flask.py b/flask.py index 4bb2d85d..344cae3b 100644 --- a/flask.py +++ b/flask.py @@ -288,7 +288,7 @@ class Flask(object): if session is not None: session.save_cookie(response, self.session_cookie_name) - def add_url_rule(self, endpoint, **options): + def add_url_rule(self, rule, endpoint, **options): """Connects a URL rule. Works exactly like the :meth:`route` decorator but does not register the view function for the endpoint. @@ -298,14 +298,14 @@ class Flask(object): def index(): pass - Is equivalent to the following: + Is equivalent to the following:: def index(): pass app.add_url_rule('index', '/') app.view_functions['index'] = index """ - options['endpoint'] = f.__name__ + options['endpoint'] = endpoint options.setdefault('methods', ('GET',)) self.url_map.add(Rule(rule, **options)) @@ -372,7 +372,7 @@ class Flask(object): setting for this rule. See above. """ def decorator(f): - self.add_url_rule(f.__name__, **options) + self.add_url_rule(rule, f.__name__, **options) self.view_functions[f.__name__] = f return f return decorator