From 1294564127f2bac9365142aad65932c3dd7cecde Mon Sep 17 00:00:00 2001 From: Nyemba Ambela Jean Nicolas Date: Mon, 2 Jun 2025 21:31:42 +0100 Subject: [PATCH] Flask, deploiement serveur/structuration de l'application en package | git, ajout d'une branche design --- Rapport.docx | Bin 32415 -> 36116 bytes blog-app/blogapp.py | 97 ------------------ blog-app/blogapp/__init__.py | 10 ++ blog-app/{ => blogapp}/forms.py | 0 blog-app/blogapp/models.py | 27 +++++ blog-app/blogapp/routes.py | 58 +++++++++++ blog-app/{ => blogapp}/static/main.css | 0 blog-app/{ => blogapp}/templates/about.html | 0 blog-app/{ => blogapp}/templates/home.html | 0 blog-app/{ => blogapp}/templates/layout.html | 0 blog-app/{ => blogapp}/templates/login.html | 0 .../{ => blogapp}/templates/register.html | 0 blog-app/instance/blogsite.db | Bin 20480 -> 20480 bytes blog-app/run.py | 5 + 14 files changed, 100 insertions(+), 97 deletions(-) delete mode 100644 blog-app/blogapp.py create mode 100644 blog-app/blogapp/__init__.py rename blog-app/{ => blogapp}/forms.py (100%) create mode 100644 blog-app/blogapp/models.py create mode 100644 blog-app/blogapp/routes.py rename blog-app/{ => blogapp}/static/main.css (100%) rename blog-app/{ => blogapp}/templates/about.html (100%) rename blog-app/{ => blogapp}/templates/home.html (100%) rename blog-app/{ => blogapp}/templates/layout.html (100%) rename blog-app/{ => blogapp}/templates/login.html (100%) rename blog-app/{ => blogapp}/templates/register.html (100%) create mode 100644 blog-app/run.py diff --git a/Rapport.docx b/Rapport.docx index 6004db9ab672328c154a0406c711911e94f56d1d..1b6e009c156f70edbbdd8574ec09932bf2d64e62 100644 GIT binary patch delta 24924 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 Ry&skc@uxw4iTtnD{{kNs*ew76 delta 21220 zcmV)RK(oJ;ngXBw0kF*me=ruRM?gdX0Be*301*HH0C#V4WG`fIV|8t1ZgehqZEWm) z+mf3~mgxJ5n13LuBgS@2xr$3B7tgpRxb}98x9zcO@18lQPgEcYRk4jg22^Exq9ghr z&QrhjV|za1)SvX1OlATSAP}i*352`1Eg?v9-7mRv<-h#v*NMm6e>-912L9_a?t(pI z9Df*$T>tj<*)P}DOZkk6V%s0tUf?^g&%Qa)*}q=>!~go1hgYLuIGZ?r%%CCs=+(n? z`1X~V!(eh5jK}WKxqJx1(IwAvEcrAIgP{{e=zY5F z-`mkyI^6Ip-DsoGe||s@;{n0t@Xiin=j&n&ZtX$frE)1R55#XU5Q32BmWLA79!k8# zvsxMmY%~y>)zV0Cvym!*6E_=)Umi)?Y$RcMBzd!ume^^s%;3S)@zIatAe`7S`WoI| zPVDgWZ2A%nJhfwY;CgQS4UNf)*)X>2f8Jn5=&AV#6JfOWe+bg$Bp5lKFv>;=UZ2fE z|5f_@%lY$o>aUXL(|@ujLK^s!M~qZC5Xdh>$3wUX{OHb|&Lw=Z>1gQ3yKIpARY2TN zyzIV*DMu+Tb?V7TP`Mb8X8I}qCtfo1)gy8&1x4@>^CxJgP<&@LlL_L&#fvvWO%Ayn zr2@$Y;Fksve}@jG!q3K#(=jfG3kk*JxRj!ijgwFXkK-;7%TemF@?>%YM5B0gx7H|p zhSy8{tR35Tb~I;nJfgGSq~LtGZ<8F3rnlP(!tcXiHeHP7Za3PSg<5;S4#pZ|r2>@~ z@@Tuse7duzNZU<@uio7HL1+&=G$SM)4B~KxPyqjpe;5V-Lq0lR$#qO?2J4u!E94ms zg3&kp?-cz8UQO-LeuJ1&lvq|VO#O^pMRp~|S0$kFA}|be^%e5MMjv0Fv8)6*la=R} zK7{z9tckLr%`Y0x*q(VY{sqVafM)i~2YgAhcnEYdo9TxT|MS}r{eEwIug``^lRDwq zCB7Oae?Jb$mw_IUf1~f&trDNy7Jb*F;U$vi4>&T@tTCAElifm0-vHx~%bVT=~%#oO1wd4{m+3G*D}5TleP zETw-66E0GHe@wD^!kl7?f+n-Y33I9lRY|45e=sL=insu5T?{v{mLM*(R&uS8f76NW z?<>iQ9Kpdu`>%JJkto>?fTI$e{@5qcE)(VCNEkBSK?CzNU~t$xy2$dPB|dN0->E`wwYlgnX-f$uv*WLlVMFvEXE z`18n#7!+%}Ll1q3W~(8}33+@q^PP3(L0BB|d{G%!i?|2`dz zp*_7z?3q8Cq`c_ed)a;L{I@rw>>5bXkUoF`ORYfy`A;zldi1D>mm2UDUgl*LmcW-) z0~%^e!T-G*Q$Wt@0uMPBo2tBPf2=?enp)9utMoKe6+(xObc6$=qgLnDXonBq;ya{K zpA%DbPNReB-*9F6_il)l9m$cS&+*Lh>V~A9A@lr`?T-e**B3?YTTNo1a+aYM^&|*R4gDRk$z!P$VVgZ6DFki6Yw#mt?0_9+o1sy3uPU zXD=zqRdu&RTKQ?_$g-iSGjJ+v5QHNp*pB`_6FRqchzLok=T?k$eA;qN zS(qZj8X>-31|fOTs-zs{D-v-@jcJ-?BcUOM)Zmm6P_~R}5 z7mblXE%QpYe-M+qC9Yz?VwlOXlEummy7oHpL^VmWgoJ@J@d|%(+}pc2LkAQ{2#9Bq z-7!r5&c3B&R9KEAG4?|y{QmTfCDQ_R$$$qEk{rHh12C6xvFD8On1z@uv;wSp9$wke z&~;y*>A@^?k)Qw0dB88dQ~hZ9>M$x^A_Ee9W^=H}f1f!X^#s=gq%v>AVCIi9bW((V z95UJ>5U}OT;g$uQA(|4-b8cu4JA=ke^A|af?)ag=cIqE*J?1i5fx09MP?xK8K_R_>>os1Y=)U+wHS&N3M9YLF8u#%@ zaz`JZRL3VGgr))n>=B+qd?Im*0#&)UNZA~Ae;A*Ls$sCYR9c$iWdSIHwLs)*?cK*G zc#=h?>*Euu+3z7fX%EV$t9*(|Ro1$oBdOteIbrUR=S50cv1>%(8F9QND*%=Y0C?F_ zETLEc&@26Yh9QzHDzd?)F39c{p0@TzOZ>tD9fct!CjkIX!`aQkG+9AZrNvrQZkokk zf5#6lNdv^36COSly|5t^n_3|;Cqf4&7p6`Zy+kTW$2)1^2$1Qa?JDk@L1+Pb}U z{n^)-Kik7sH05wbFgp>URY19afcChkbZ`#b4QV3umSM70k2qBW*S{oApB)$L(yCRN z1fb3VSgva~B@4(x(M%K-RuNy>#a_R)PrqIL0UE+!vcHa84fo2oSH4e2f0|6| z{_)c=bfGoX{D4f3R;IEp+V91UvB+?uAgDy>p_Nr1+{#cYHNot!{H~ zuid3mJ+O;Q7W`nsjArx7g|y%ScVe({ccnXrdHiddc#I$aJ0=|^Je%>{Tc3O$29t@6 z0A|qdA#OSmq7QeEe~W0eCyyKlo#m*~8%5eSrZ<)eoHEz2-vooJ_tvc3UW z2uM7UBLuH<2*Ek56JFSBe@}urg0~5+G?~|+LKQsjHOANlFsvl#x=xDka=@^h4mqJj znYDn~*niHcrsa_3>b+m3eCu=`-h_}9LPXAFfQznAtmnXD%Pc87Pqw#K29_5^h^pB| z)D79vNOQ2A@_rv~btT;5dBqT=Qwg^u2{{PJxUDY_O(8)`!>xrge@AD3B%b4SsFe4l zsF0N;e&Kr6BCuY|^mXERl0|Iw;ntc=eB$9&O(UUs47R!uW|hFUhXwK0T-x2NPyj$R z50jzp*Y`5-q=FD4uk*TsJ2K`2f05S|O)U1n+i!^0VEiOeVoes?|9tSpD!ihS0_epw z>m7ySF9~Zbbji~Ne_tr@7|y1Te+&Bvj4}daBHW7*AK>FKm>C>~G*U-6!)t3;%0lPM z%nivy(M9}~Mkk4;B3ryk6R{nJ$Fgbm5!>M-wi1QwE9XVX%g{6%cENThjMG(BR!y3n z@s%j7H{4Z{b6Trr0#sQ`D6^6vYP_t_;I@zO`Ur35v)^-se^<%K-H7l8$n@cJEnmBnVu?ZI0R6OKd2`R*{7e^>iu3!Irm)g%~8 zJtCr_N>v7$stQ^ucIj==RzxeBDB=gC?nve^EfWHWg21cg?y{AH*uI2vgVo~{>)Whk z0*TWNtz?=}f0Qc&lVmX#5VmjeFYV##FhghdmC3bkj*{btmK!6}EPx4`h{B8VdZ{S0 zydc2E2@u2-*B*sd{AD)_V5MnFk^(v62{-ZXQ%;lPL<{Ov3A44PnLA7=oo1r7NEr6k z#fObbtX$%}oJZk1FdVKZnfBm(}Xy!Y!JVvG7pqNhin5PDb zpkQxF2AUwTSe*Av5PFS}z-m1Hh?33*;i}dK4l}mhI8B_`i-O~5=HA;r-TpXP)>J6a zoLN(O6i~eZ-X&tPx%X+5!>3W^bj+(VNj4P`Hb_oqGA29=EM6zk_x^?C)Y>@9B5$cy z%3$l`e|ANkaa(aqxo0$IHHs+d(;`%}-(y;&ldIe4=;0kWWCnGn2en5=G=O2+94QLmqN5pvG4zC}@jsHhxL3>z%J?LB{h zvjqOVU0GM9FEcl3sWhEB zxPIXhpJs4*j$14FxMxy?XE6@^5iVaye+$HulK5n3G$a51f<&$ zRg;vEV~ktgXXPi4Kh6oEozTvRh3S{%nxc8KDJn1J*QjBZHB3>b>FV~BDL?^*f1tX$ z)F@{^)}qggWxjvg^J4RQ?!1l?0Sh?3AyL$wyqL(#f=2d!^?nw$pGD_bNUXxjg4B>= zU0->27LA!zJf4}=T4xg2)EWNN^R;-q-{klpx=N19Svt3h_;TtH7^5yocGnnT)#f!CtBDbu*aCu_~t>h7eDZca=0w0era=7bgJIkU()W z*uk=aMI5pQuK<;d6kmNT2@~Vv<{48boH%hD+RUg*Y1AlACu>&n184Ure_M;J7_VIo zO6Hl$bYmPM%{cIfIDws}H%GYh|I%)`H_2H9?qnK-v7Ou&+4q4PGWINrT;|K{?|=S_ z>*1_5Vvv~m&7RmUdWnZ-kf1s3YZBqkC-_LK`HQAu@SBsS#?gGT)cE}O%Jl0wGqhK2 z4#Km=sat{qJl5#($GzhPf75AlU+iE|@D@RmgHLz~-!~@LaK1K1V?-AeiklNSLlcj_ zSW|+QEQm@eQ_E?Js6$en^#nq{f>(8C>i8qfYi@cF24S=*W{;$|P__tAo1z~gv*h@A zh!`u3Qxo=Sl53dDJQF1nAAO4u`=2xR*iDwLkZ8DZDyB#p2j1h~e%HTEAklcIs`lcfiS_1yz3IO`fN@jIwD;O;&kXO==U`k=!8Jv(%x;7B9$OFJC6^ z#LEb|5HB-BOJN3Cf8OK`h26N!tWS6BDBU5LvZ_LL<8+55u>!X^(Q;jXWczFeVgo4Y zu)zxMNOe6)^B$-Q=>KNP@Ckxx8Kzb2L{r&pxE{h?bo6<6_1iG}aS+5igPH?C1Ozv8vW0B%vCojP!+$vb|-0O%{t?Eg)>lwUNKm8kpJHe}}sRCo; ze(X=#8=NyWe^oS%k}D)yti)Psk@-s@OjBHwPBcIF-8BqPUrWeTokMw(q@L#a5{s0} zu41X?F-e}7f-4j5S&>4fU@9ORf{LsS1yij_nBp(HVX8h=bNEzEQNYTfNnw!ySEZ4( zNn@%eF9ew$Y+I_v6jca08ZYJvB&Xe}8c{WM3mB#9e<#7@1X<&Y=Ax24*E*ZF9k}g# zMrD8Pb@qGSa@?L)+E>q4!I4XH9MP1QN{m~J{c6@~IH78lnQ4#Q7dP;hK&;gEtpm|r z6w;CHbp?p4EutWroC%ateoSP6rOJu((t8_g)1v5v5Kk|4I5U@cnGh^137k+q{8`d? zRbW9ee^FUt*407l(;WVc;t)mCN(=R(Dyk|c6^|6(o~v?Vy7#dBz0ce~{s`T%>oAd9 z+2deE=4bgWS0t=27Vgi-iDG8pI{7k`WN$347xQB$#Ajy3&MZtIASdr(0CVGCU#S zv$^+S|KY>_IUV!5k2fq<*6~{#Bm6EDV_2*v=oZZ$ob83=)V8l0yrr9ZDVYrnOG8?T zyrK@bCxS-$IKLee#wID*8cJcFI86e8mGCR`++hMv({rVhJ$H18J8;4$|6f{*PaPrw zf7P(yQeQKUGZmc^7c1vI({!3?oUbm;Ry5w^G|QlB+1lIoy|w^jRVavBgHK5aVQ8YF zS9bd<{<4n+Y)LV7+yCynBEB(PY#QAKt#v$wdmO7erN4 z6mn*Ij*3t)fFXk7x>9MzIVu)^*@}v5fUaGDGJ@B6TK!~Vq#5tuy)#Yb!~0)8ZiGOf z0m+i25(1I@Nl1)~(z=S|bXd*tM~bk#R!l?pJEV|Y|2Fxa6XP5ME^%A#5Hq}Mf6Df} zz>gMttsG`xN6D7D!1vL``Bp;oVHKA{Rn)a?OXqBmZJCMA>mFL3SO;5R3Z z=KDFPAtJ$-nKR#f89C_RV20CdQ)d>ZC`IG?INL@%PP}2#@t9lmJl-{$ZkJqUiU_7nC6(1ovW}R~^JpsaBjm+KPK?Gh zHmksS@fU(~S>$D2&*QwDkw_+9ZFF;CAo1-TAH}oI=!1RhXrW_&Cb)=k?MfDhdh=fR zBz#?J#!;s@2!99w=vmNt&Y-Y&=EkJFWYJUxGq&q9_qb_MW!?j^f4^JmS6O-uYlwoJ z92Z&}>Qg*l#8ht3ltI_(hLSaYDt1Joh2m)NVN(Q4HQxP2&k^kPb*bs*$8 zIY~k{X`OWPMP%0p_{G~3t+N2XN&;AtgeS4;Th~WGap?}Ylr{tMr8*6eL3ik|9^Ih@ zAri%id<&-8i~PWMfAIa$_jK%(P~>wycubTS!oX%v4uUuiCYwDQ=7Z$*9z`bF9XUU3 z^YE{mJe(-)9LlLHLy(g zBS)$KnDlmY2e==kOVzxFlXQcZ1T2UfiPMpieD@K_QnnHbimCG(>!Gy*l6E3)NsMw} z>}~!)V-xkBf1kfS9HPj891gPG4Dq_`4U~( zaRQQ#6z5DxvJE%5E3jwB&N(v+y_<0mo)Ze+;TuM7=nQF!=UA18vS!hA((6@R3iEPG z<0xe04*C6F-uEAP2;QBkze7MxN40GLU8Ndt78&9Oe=XTX4xrJXo#ug0|Nd58T@Td} zGeTh&c->$DF!i&7SrCB2=~`~BV+R&sr@?mb8266x1_FUg4(r==^^Wn;6Y!&Rixda0 z4-I?^5%ZjR8{E3&BZabqvY-OZz~1hft1hb-SWZXTRpV7+EnZL*oL0_Pn46lUC|a@D zt8z7~e?IR-wVJgr#C0*%I84tFpEp1Bp4F{)R@0i36q%FslEXkFLpz~0ZG(*#N)ccU zsHn;Y+UcmJXs^E30R&7oRW;cfwrs2yOI~XlYb0~4E%gBa+pnd5-QZ@mm2xCC*A?2; zH;ijHk#25$d*a;ObcRmF@}_G00S!f#M7gwke}gr6TvxZ)+uGZY9LzZ|+Gam45?5|D ziyr{KU9tH8dG_?6>?1D!Wa=Ny>zjWw|FbisdiH;jdG9E>Mgu_t;(#BIZ4t5qL1uvi z1Wp|Byfl`f&=n$9yKT>Ca>jzeN2Jf ze}x|?iiSJqs+XhKg}xR7>Tn3skmRY%>Y zldz*Sc`Z(rRmd-usPGct;i5Ae(V_dOe_ZT$=+2FqYKo#Dl#Cg#iJ~Z#4uo5)0nswf z6O`t*B+6V7vs)~)@w%=HB8TypheA+fU6;tdra2Vp*5M*MajGD2m1jB@Z%=wFB{wgD zw)W=Z`kwh^J&_33FxfARcasc}#79nanRMAAJ-Y4@U*es%W7l^>+>0xU!`U#Ne}sftG8SxUUp=-}mjpHJ#B(OD^|X~5t?>GW_Y3A$it3&XnF zAQgY9F-ZGD#-cE(4Dphk%T4NVf3v~X?03w&V0Q0#46%)uiKSdL4$Zgjd_F@am&RQc z3{J8%sy)pm$~E~HM@r6WGyooXdP4a)$kwA_-$Bt+%E*&N`$X;<>V*yfzYLV5sd)i@ z%({EYrT&7Te{z@)5#&D~4K7ZNxIYJ@(plbJrS6MY6h@KNOb9essu1t3e?e~zmaPGU z{+yb+a7U-0D>f_@?jE_DmUcQ~8ZLB_g=tv7>B-wAX});l$Ih)2o}ZjhPeXTNhu>~K zI}Q8FJ0jh$ufv%`lM#_bSuzBwGdcI+{N-0%AnEqMIDiI!C(!mDV(%dywRXYjN4%+} z_Y-?ZqW2Sf^0wYj{1k`Ce*{10*%znhD$aa-zS-##pSX^vM|OYadAK0vB$WDV%l0Cw z_y7uquA&g(tWOTFgJg`%-t|8Lwc$)`_axSmdcQxVc<=XjoV*vOE6%Ck&-IS~2@=0| z{Cmeg@AwO{YMP~m0oD*83oJsNeqo@G4*KX|eMGnu`_{P`yPos(fB1MhW7EeCouqcZ zUT}iKeA4R$C+I((Go#dqFaVNc%9xQ1fy8lHq}NVN+avWm$=jPjfh$O$GZ^46jmQ2X7z-lgkZI^@y?QC#fM zb6OJ9qm0*$2e@&rZ+sV?>9}_;lIe^)q`G-v!|b(%!Sb_nXX$ zZT)z_=@P`#X-fJ59-uqtmvRnY@s}1meAPIDnr5hmLerY4grkI~(spEYh)XXW0C8({ zn#wg)JKStA@BWTa$76SRXW!zciqYz>ilzRiqNd0?+?Zva6b}q-ZWnpz^g!)C%SGuh9vn7#N6&=#Fc&hZX>(^jAo{|HG z2rW_7C=gd!t5|A}zk2cd$U5O~g*X9?^h&W&ZRufpEfVk=-1ZojiafCp6=>UjZ zBbS+*)Zu1>H9tB)J0t!o-$IjD ze`7f${47h;u$<)tC{`k|_{;i8%%+y|Y5oxVg1BB|eU8tpPgn^3{0D{{2%i{LavD52 z={@`T4SDB7^1}Ho^8@429a<2MoG>Eaf@$_5KkyxVfAl>aJ0%PGOr$seA`H`JPY!}O z4knvD8|Dq>dXKtDQ;nRTwt4v1O&(5Ee^CzQ(H*7_8E5D@c36G}eI2`=hx;Jm{}B>m zC25h1m|L+OSzJr3lxEGz`!)zZXK!GEN=6vFVHAH15Lb|gk)ce!Eq+Wqirnwn1#*iY z{G{1FmYw9=ugN!}rxOV0+>3b?f4oKiqA?i4i%8zY#l6`ramdswtkhx4cE9ASe^pow zXc~vBN><44HF-WKlX2!gg+DoYK7v9fnDaY^$=}(xRN@E_81+So+9yGYSxc>W(Qjil zsB0!x`D%O-J~Ho{Q-zN;t2(4wYee{6%6|Icp?Nit605gQ z!b82+x|vE3!b#J%nBHqWe_{fDbZ(Ir2}#!1Lc~00-UhcW`ADJpI2I_f!D1cv6b@=% zQZXllEbFGpl_Le76BS{DkmtV&HK2pOJJ47 zPW>GNAajSU39)|*X1FATEDMD`5`>6({NX+Rm^fIRNbQFcGeaa?e~v$6zRX1q zKx_ytbK`vQk&<&?fBii~OIJ8x(6mFTMAw#n+A#-&wepe!qm=xSXDhV65g=o8Q zH0||lr&ep)&)FiwL)XHgC(|(s*P=heYB-Owi*6(J@;xUyeNy7@E6)?aXRlW6uNSBk%DyRmbXaU=v$_+76eeBYL?$Y z=V143IgirP?0$z4u28ta>n%=uQW1x5N!2-KXpyZuK!?hnyj>FJ3j^u2Yj@%_`8eGp zd)xef3aIz6#h*g5B~Fz^Kxzu}lC6oBDOf9u!8}W*#7{GURUg|j>qos&c1a>>%>vu`;R}Ux+QX& z%3Bc7970)1we_0*wLFS#*_V)2_c-l5I3WhV> zNhpCP=@*(d3q405xzU#y9?efro=OIsI+1Ja%NthP#1;Af2&1PloVApq|zCEl}aA)K$jMcwF*F1$ZPTT z_2o62Z{L=xZ%b8phB?)?RHgPwrF3-O-kPGRA^A(L)(LgD+fo5ll4N};J65IGD)CzH zh*b2dYUN2`P!j;hsSW4JRjK~fT0XsW0A#GOQgwjsMjN%I%9-mZanvY`wj?P~e>Yj0 zGu|qVc6}eVBPC}w8i2x@P@p=HrVfC zw4-P@)lMQ&w3})Xm8g~(0aOKDRyU3ido6p+JV2Qt?uhuhqpryAh6T^QMb zU72%Frel;Y+ICp&q+YHaR%fK`e>H78EJ1=m5dcl+;(a(d`7}5r9Xwy%A=q61Hu+AV z?LDF16WW=y<5ZJxm(Km|9`$;EsP~6@GVMvavUXp5bGNUSDoNk{GV8dCBrZ}n$w#+Y zuTAc(MY~TA@G39qJbq`NwCi2fR*SJSvE9z(+b{mghXuT5e{oLc$+1k^1^s`r+cY>FqPB1BwkxVogau>+^iQXVh}(p4w6L5QKe+UT<4_7pN!GRxXg( zyFi^w6|uUi8=72dZzEY6f6#Qx#50-uI+Z&*dtax0^4wBiXRFRnxbZ_nKaJxd>mJT4 zXr+U+*Ta;$Ozw*??WGglxzp#*aPPurtu)6ImOkOuYi93&9ZLg+Xy@uu#pg^dv2DcuCK;$%8pp?+g zv{j{3bdt!ahQea(!lMk#KK7gyspf4#Z=xZO0l#Hj)YG=hNR zhXPxLf4q(VxyqpIclIo+rERS?PKlH!U8Fg3j~q)QaN438ir#c?|n z=fDeY?df#2e;Vor*%)^+4Z@f~;GQ$3#B8;oLrYaTsFwu2I^^yJz0Dj`lxf5v7wEs6 zA(}EG`tuhT(^+))oT}=bg}Mb;oK9Rb23VInPRu23H%E;I7sJrO=f2pUN5@EzzW}ktkGDf7KND5+QigR1Lu-X$H!~2uXlaod##&IOa$ny%?#3XV0H*-mOl)9=H8|d zBA{y$&`gZ|Jna--<8`eFr6@pFE*F-RF6N*t{z9NkFRdd){%n%s!@I``xFi;v|Mq5{ zuOj=Ee=c(mq#Q6Hw+_;CC!+7!{Q{p15`EXPB<8L)D%uBR#`ss^D`=9A@nJkN=HN(;49_vZSm3!`}5YH*PEWuflqV zf33WFYa4$^fS7};KoH!WRFauWW=~sNDUHM#E3qlB{!B7^%GXHM9^N(YyqCT1e3N{V z1wcw7A(Db@NwzFhB{R095z*b~?q4^$8`;`lw=A<1-%e|r5?k+oG;Pv7Y}ov+m1xt|o{fA@+m#pPi1WHn`fUp3mmLe)(g#n5(`1xMwQ*ZuOzkU0#?&tUDF54DRo5$HVqxiIURM zpqRNv_%!2!g3M)GSrOaTDvid+_p{f0Jahbbrd8~1@eED?%HqTVq4rjKG4TwHXe7eu zIGS^A@eIruph$DE&Rc;fe+4eQ?T%+ombX5hS^ja_@l3TfpBE+98xzHz+4^+D&I$6h zeTV$@)s{U{!%3&1t7Yd=Q1xP5-ZzIvwA*;ZSQy1XKi&J!rwo7*$YM#eEx7H;BTE9~ zP(W%oCJ2!#5W5}=(6V0+w9HC(Rb=_+Z@&-5!CjSTAoc_PRH@jThRSRZOnDW$y z+dc_kKH-x9J0t-@f0`o6OqIcTBmp9U0dgsj@gQc$BmfWzh-G5)HjOwHrmbuXZ+#M= z<|KR);J8Tu@%_7R{+7J7IPaeZclR$bDRX)Ox1wxg5bsF{B6Yx{MCdN`#HR-Kxow)x z)*zY+SS_L7rXVQK!j#x8X)ui=A+09c?wGrU=X*XI$1p-Ef6A<75|(0|nWIgYWgevL z^c$TTs2$kOObD6lv*F-B7Ye5bI;b3sv^w`j_I<5%wf$G`JKL^{x0B)E_GU7h2d`oZ zfW!0qzHPGT4N)IQ!S&62em{G4bv4RAT`DEGxW5@+4kve4cb_kM#=kf&z0Hz#9qlV_ zxjyZBFdXV^e}-=CTMmTW;Za+hR;?tWg?HP#4tEyTBOf@N6d%SP7p4nWS-W7aSgC%t zYZ`vZw~QQrko7Elo^F! z%b|rgh=*@;RUtcM*ur#(B~)bbn(HlsI4bT230GStv?fMiAVZi%uHnH!@(r(V%><>v zLLq7ue`Qs%=O_<848~@D(M-i#qw$9-*qZ49NwY~&3~t9WGoNhmDIW&6d2KwB)}l)X zB_b@$XejM5b8#4om^`BLf6ua`P%uKE6*B=IaRTF}gFenOSF#i3Xt;WNvXRE32#U#F zQ&KKQEvB3$=>r-@9?)RqJC#o`K5Fk&UcOk{e@amr3ds|_8O|X-!YGM}pbu`%+sSU6 zU3`Qhn%Lt9sZ6QzmF5wiw-1I|zidyHK5xk0J+8i-)KTQWobIUlcH%C&ixy8)hOHC% zJ8(1vh+}S@+j&E~7h_Pe+&H<)*Dle(rXU~`JY?p+wVEJQBu0>oo&prN@0U8g8IW0YZP$pC)a_6E}C<0sbm5mLfkU5Fa-$3v|0V=dFwIje~ZDa zgWzJm9JS%#r=yT1AciidSzb*Jie7~jK$)keAfklBl%VxN`|$yjWmY*?PZ2KB&QmTE zB9>*TU2cL23eyy>*L1vPRyL%=@Vxo*zb-}XG!COIGYv}5i}@Z@KNC>Bx{b4LSs;!f zqvryuF_Uq|Ol{JGJenYgn{h|pf1|l#ZOoE5OR!~aLxi#@F7>yc<|qF(n0zq5R2kLhErbqw zzAA$GBq;s{n_aRevhn|;vFLVB2I82L#4fe);c&1&@L+&jg&&s)cT*5if0i(qVk#*my#ITnm5e?Ta5$rJXo&_%z_>}U%CiQ?6mf+cTBC>a6$?&O?#>m%_~ zKic|P*`AAKMao6GDfJ53Gvnw$~XkA%RkHZ@8JRLC@#TiM3ou|eW6DgWaf9TJj7!>kEGMku) z6ON-=IJ`44)k`&Esm1U z3#ZI$Eu3%aOpT03KSXa;@xA2lUcdP+NdNrp_kUA=$+vIb1>d|8{F^|&3)0s=yyM?F zZEHy+#?YGY2nB;snAEU~+yJ6%Jq*&wt$L{@w>l=GV9ERXe@5*v0k4bke5{9klv6QB z{litm7z)YFgXh>Z5W%dt$-QdBbk7`dVz#eodG^_~RQVOi-h=d>pEb0}+9#MAt9-$G7cotcy z6%b350mP5Av`PWz*Kdko{IQr!b2C6>q{lYq(^+t(f3@~1$mhY;k3Zgj9_qHuAAh`Z zPyw8wFh$fQQ|xiL$KicA9P<>02qa6(Ug-diAL7BxISx&H38!Sq!tC!rh!IqMT=EsNTD>>FxS5MUe>6T*4 zmy-=oS(t=oiqPSeZ@b;`J`9jY;U0xQ6$)<>RNK0z z0nK%ad@ve0U=W4K8Nu7;1$gs%a70c8fKVbkPa7pN3(a7wW5C|_Jpy8gp=8$5KqfPe zp2iU&*WMUK})rfS6^}6kU4MekeF- ze;#%6sJ-DsT86bife2B0(Z7{m43tMS;~B%+Vt8M(XDCk)jscc-3pF9Bh@=sAKW_;n zfUNr!ydUp{@)fsEgNjbC=K$r8M(DAi{HaOKK>6Y1?oR!6aTomg+kf{V9g3rjn1`M+ z$;ORWME6lEmGcbO(D+2DwME))-yzFbe-axn`5@ov?fbq?PFNyB8CpkJkOLHn+9bIa zLF^$;TQT)9eQ{JpbBS;{gOe%Ez`F0R-l)=er)*RyU+O2o#iN$jpPF8WKJB-5^yb%e zgnB*g6D>>WXrS23LX;K_iuq-rBHCH=^tAm6eP1@s6|-lHsZHCBg80+haq)97e|T+V6aIDiAlts(%;)#BS65e~{L`gU)r|N#B_sI6|Zj#mWt>%8b3%lcc{XNS|f6bZW za5}zU_W#^ZCqL!o&QZ)CkMe)kf2DzWFfoMliOOt;5_yYm1AibK%Q zVx>?BX^>JJN^y!74=$lVDDD=DyS4ZO0g6+c6m4mX6WraM%lqDY-{;QVFT1nn%zij? z&g}kY&iz4bCjN zQg*3(`8q%?#-s$7&*)u*li<$7YrWKF{cSWM4RiP8_b&6;pM*{v&3C&^okm&w74=E# z;bhW}(~OU;ghA3~=ryjF{RCE?4NgnQ{I)XL8`Gl`BRG8B?bjn^ejj^GuL3{~h5Jln zvNh*}%(?HK;E7*23`|TJmoNupAsP_nn}CGrxl}KhcIJKxqHsnWEsi34Uo`r#&XVF#)O%#;H2Z5d@?kOh>K)UmwpuXMnl(mIdeMuGGl=ucV;>pW{s;&RW^tCWCqCzJ zq~9k z=Zs|sra0{>kCyQZ%S3R+20?yu?-O@Bbi-tw+M=P4USYu3g51?z}V_3d|Ub-o760s}|dBx}XKLmH-ij%+% z;VnotOdUdn)}3+vjI&9ROBQHMjHTuPH`#^{=)+ZRaUe4z-@0vZ zTD1-o7hPQ2S)f!)Z>kp$%)^~O8ZBL`K|%~v$A^pw^}aTWXbmK@2&lp^oRU%8+-p*0 zzQjSwJXFq7!7#2lzjX+eU(-Z~F4bjf2LYIm53yC1-H=nr{Ydt;e-!WUX`DGN{uKEQ zrr0Z|(dbC+M3H*C2G?i4nWawFi|WmuFzER!#x0iFIrz+I-&Qdrlg!!4h~#) zJAbUP>B6!gf@pV)5f)bmI^YOE4dQ6R<@aReC%ZGB zH6lo&>L^%nY3si4=UbgBiIhKnpP6BA+gBRuUKf(a3`A?m4l6kmupV1wPy~R?2kJG! zss6)=yR(+P3<;ryuiufax#UrcYS$rd@vS-7a08}dCU|JR977sWgi&JZl^I9b{1uIY zX~=>+EA$LGGu#E687l}B56H$j!X`2&LVS}rqNaj&N#)L?`rW z7@r@<9BGh8Bw_b)ux0Z=8w}cV&D;)LL?-MbH#&ro)O~l z`LFZPK$}aKJ1=X-$Mi?RS4v@a97z=!tEYzq{-~xti-dIL>S~zBv0+SkS@Cte6^8u8 zeGU2H)R%#A;K}a<>)Y*Xw4ZE~(YtRfOhw0c>5g!?x|nj#h~e6vrquj(+zlzc{E;; zGAMzGjQUDnMkO9-R4f2n(834`R5_mybLi=I$IcFDXDt705R_n@`!aZGI#K?kw;-wM zZRK>vh*fceQF`>DP3_odq;wh=KSr-W!oR1Oj@w1k^P$kB;pK>cUrd25X!P8Cx|&OhdbNzK`U|Bc$_p6*d#MpI;6$LX9lPNKysArCwX^X7*^#s_UUXLa*8lWI68Vpn`* zga{TOCkWyI%*)x&vtcK65{9@x?&)FQm?4j(Uy|YSc<4$2?`R|pk-tbbl5b1SmyV@o z?6>Uj5As8G^bV1W*0J^wsfZ>+UfM0>*CU@K74rsjnQ_S8@NOuxGWwI z-j3f?QuEo*?U7ij2(^L;2^-*kqybe(zQ&nN&_1*zp6q3>_MN{cd=RA)t$HSjVrF+U& z9@lx)x2ZQYsLapZ+>Fl*TUe&v>+g31TMRTyTNFN-03G%-d;R9E9gK<*bDta>AA_ol zjf!Qn8oZDBo$gzl=dG&jwciOw*B;C~=a%P@PCrw6Gi$GFb=EexCt!4)f7@Dbt?A+U z6_f$1Zn&hXk99aM@l4-sev(thd|FobCD$qtOj8zB;hAl8S^gx=Bp$zXjCnw_?0Yr# zk|frZs@(gtLrJo>@wD(1gibaGSY1hWllD@6y>3Jmw|RDbyYS6M&UUMF=9Ndb*LG=v zOqI@(GR){Srp)nh#$JJWC;Zcof_1W<1pL+j; zv!su(u#+@36@+PL1<4dyr#YZotI1G{g(jE&Lh!QNmPVrv&091=d{n?W`@HI^MAlFpbiuj&Ecr?4H_9G_?2Y9i(@_#Hk?L|RYo=f0GM@`Sm(r0d znxvQ3oR}dfp2QU4*7*tlo3yNm&wBu`C@%fwzyj159kXb>Xh@UUTJ)0AK1A*)5lw*M z7XvctWfHFRFUyu*1?)mDN@Fw)6J325K=ShAk0;;T)6lfytzrX!BX}D)^gXXa$(OTE z-Wf(o{tiMdlvDW`ALP;Ep_7YV$%?>B{-U(tUBgR6tGq-MuYDWqR|FvJUA{{$zS(hq zMyf8nn@1*&U&qps4RJS~WR9}uizr!^;Llj@T6-e6LiYM~|bSM3)dh zEHxDx6EDp49S_)&so52OZuWG^QNZ6mNm142G*^P!y_j)qx<%ccpT~C_7^c9E zCs;e;?2-56?#EyN%I4z?Hj(^<+Y%fL0JuY`gs@>DVv&)8Wu* z!5{8zan)KYFLbjc3_Gbk7skq(TY1y@(i#qI>#?@+8hO)_1=0)(D$h&4P1Xp#+Del9 zqIom+7NO0m-O?FWD>DZeA#CcRezE#XXO_fL^wAFpda6h)x8V_PmbtB5&=L7(SwN=A?(xXx6*n1+CiIP&96M!Fo?}>EZes$=VSHLZuEjEK{IA%RM*8p z&hjHvs2o8hf{@~dJrLuu9)BHuDlOy}d6)YJF3YB4%2FbGM)-nwoWF01ML_s+*Q8BR zSFu(>mCn`6Nuk)$iq=80mnZxmk8PIZ6;Rz-hRTa}t1IdQ`CF)tK7d0|sqZ({eQKR2|7LXjFq$TJf$U`d74D%-wixP<`RG*g zYAn=_aV}UNWY4e4j`=Pl|8(6E_XZuBvQ*AptT^_5iP;3vL!*4gVA}WO0J}i zrOdaT3KQn8;0O>kmJOWbbNCKIPKF>B2zdh^=&)Cz-Vzv5lwS&(CD^1WvQ6YtXUFi_ znL&9X)H4XPZq*K?6YRbjl_I-1tK#y;LOHhHi7gG*Ua)g=ZU0%-!WR-sv7BKboxF&E zh%u76Y8(QN8<@AZSC$D!n8MA*sN*pt`8D=UWIP4_RtJ(qoj zg`N-b$dlj4P_(;#wS(OG_~Z=X-xnSJeXRXMGbMLx+Yhgn8ly#Ln6W9A%-6ZULDX49 zvQaSyy`Da9NJ!aoy+K)+j+XHYnWPk|rO6^M$dKoe2_*jq4v9>PQpX0VAeW+EVHc_) z1*3t?|6fo&B*_1aFAv>X(K6U>hRCXDS?pDF`{901_GA^<@9zn=e|*I`J3 z7&+`4H>6Vx7xRB=AN#*`+CQ${p2*4=PUipQ;KN~*|5zVZ?moz!7!Lf15C7WzF9L4} AIRF3v diff --git a/blog-app/blogapp.py b/blog-app/blogapp.py deleted file mode 100644 index faaf81e..0000000 --- a/blog-app/blogapp.py +++ /dev/null @@ -1,97 +0,0 @@ - - -from datetime import datetime -from flask import Flask, render_template, url_for, flash, redirect -from flask_sqlalchemy import SQLAlchemy # type: ignore -from forms import RegistrationForm, LoginForm -app = Flask(__name__) - -app.config['SECRET_KEY'] = 'db3746b2ffa650b3804e4316d227f853' -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blogsite.db' - -db = SQLAlchemy(app) - - -class User(db.Model): - id = db.Column(db.Integer, primary_key=True) - username = db.Column(db.String(20), unique=True, nullable=False) - email = db.Column(db.String(120), unique=True, nullable=False) - image_file = db.Column(db.String(20), nullable=False, - default='default.jpg') - password = db.Column(db.String(60), nullable=False) - posts = db.relationship('Post', backref='author', lazy=True) - - def __repr__(self): - return f"User('{self.username}', '{self.image_file}')" - - -class Post(db.Model): - id = db.Column(db.Integer, primary_key=True) - title = db.Column(db.String(100), nullable=False) - date_posted = db.Column(db.DateTime, nullable=False, - default=datetime.utcnow) - content = db.Column(db.Text, nullable=False) - user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) - - - def __repr__(self): - return f"Post('{self.title}', '{self.date_posted}')" - - -posts = [ - { - 'pagetitle': 'home page' - } -] - -navbaritems = [ - - { - 'name': 'home', - 'url': 'home' - }, - { - 'name': 'login', - 'url': 'login' - }, - { - 'name': 'register', - 'url': 'register' - } -] - - -@app.route("/") -@app.route("/home") -def home(): - return render_template('home.html', posts=posts, navbaritems=navbaritems) - - -@app.route("/about") -def about(): - return render_template('about.html', title='About', posts=posts, navbaritems=navbaritems) - - -@app.route("/register", methods=['GET', 'POST']) -def register(): - form = RegistrationForm() - if form.validate_on_submit(): - flash(f'Account created for {form.username.data}!') - return redirect(url_for('home')) - return render_template('register.html', title='Register', form=form) - - -@app.route("/login", methods=['GET', 'POST']) -def login(): - form = LoginForm() - if form.validate_on_submit(): - if form.email.data == 'admin' and form.password.data == 'admin': - flash('You have been log in !') - return redirect(url_for('home')) - else: - flash('Login Unsuccessful') - return render_template('login.html', title='Login', form=form) - - -if __name__ == '__main__': - app.run(debug=True, host='0.0.0.0', port=8700) diff --git a/blog-app/blogapp/__init__.py b/blog-app/blogapp/__init__.py new file mode 100644 index 0000000..f44d1bd --- /dev/null +++ b/blog-app/blogapp/__init__.py @@ -0,0 +1,10 @@ + +from flask import Flask +from flask_sqlalchemy import SQLAlchemy # type: ignore + +app = Flask(__name__) +app.config['SECRET_KEY'] = 'db3746b2ffa650b3804e4316d227f853' +app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blogsite.db' +db = SQLAlchemy(app) + +from blogapp import routes \ No newline at end of file diff --git a/blog-app/forms.py b/blog-app/blogapp/forms.py similarity index 100% rename from blog-app/forms.py rename to blog-app/blogapp/forms.py diff --git a/blog-app/blogapp/models.py b/blog-app/blogapp/models.py new file mode 100644 index 0000000..68b3a68 --- /dev/null +++ b/blog-app/blogapp/models.py @@ -0,0 +1,27 @@ +from datetime import datetime +from blogapp import db + + +class User(db.Model): + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(20), unique=True, nullable=False) + email = db.Column(db.String(120), unique=True, nullable=False) + image_file = db.Column(db.String(20), nullable=False, + default='default.jpg') + password = db.Column(db.String(60), nullable=False) + posts = db.relationship('Post', backref='author', lazy=True) + + def __repr__(self): + return f"User('{self.username}', '{self.image_file}')" + + +class Post(db.Model): + id = db.Column(db.Integer, primary_key=True) + title = db.Column(db.String(100), nullable=False) + date_posted = db.Column(db.DateTime, nullable=False, + default=datetime.utcnow) + content = db.Column(db.Text, nullable=False) + user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) + + def __repr__(self): + return f"Post('{self.title}', '{self.date_posted}')" diff --git a/blog-app/blogapp/routes.py b/blog-app/blogapp/routes.py new file mode 100644 index 0000000..172366f --- /dev/null +++ b/blog-app/blogapp/routes.py @@ -0,0 +1,58 @@ +from flask import render_template, url_for, flash, redirect +from blogapp import app +from blogapp.forms import RegistrationForm, LoginForm +from blogapp.models import User, Post + +posts = [ + { + 'pagetitle': 'home page' + } +] + +navbaritems = [ + + { + 'name': 'home', + 'url': 'home' + }, + { + 'name': 'login', + 'url': 'login' + }, + { + 'name': 'register', + 'url': 'register' + } +] + + +@app.route("/") +@app.route("/home") +def home(): + return render_template('home.html', posts=posts, navbaritems=navbaritems) + + +@app.route("/about") +def about(): + return render_template('about.html', title='About', posts=posts, navbaritems=navbaritems) + + +@app.route("/register", methods=['GET', 'POST']) +def register(): + form = RegistrationForm() + if form.validate_on_submit(): + flash(f'Account created for {form.username.data}!') + return redirect(url_for('home')) + return render_template('register.html', title='Register', form=form) + + +@app.route("/login", methods=['GET', 'POST']) +def login(): + form = LoginForm() + if form.validate_on_submit(): + if form.email.data == 'admin' and form.password.data == 'admin': + flash('You have been log in !') + return redirect(url_for('home')) + else: + flash('Login Unsuccessful') + return render_template('login.html', title='Login', form=form) diff --git a/blog-app/static/main.css b/blog-app/blogapp/static/main.css similarity index 100% rename from blog-app/static/main.css rename to blog-app/blogapp/static/main.css diff --git a/blog-app/templates/about.html b/blog-app/blogapp/templates/about.html similarity index 100% rename from blog-app/templates/about.html rename to blog-app/blogapp/templates/about.html diff --git a/blog-app/templates/home.html b/blog-app/blogapp/templates/home.html similarity index 100% rename from blog-app/templates/home.html rename to blog-app/blogapp/templates/home.html diff --git a/blog-app/templates/layout.html b/blog-app/blogapp/templates/layout.html similarity index 100% rename from blog-app/templates/layout.html rename to blog-app/blogapp/templates/layout.html diff --git a/blog-app/templates/login.html b/blog-app/blogapp/templates/login.html similarity index 100% rename from blog-app/templates/login.html rename to blog-app/blogapp/templates/login.html diff --git a/blog-app/templates/register.html b/blog-app/blogapp/templates/register.html similarity index 100% rename from blog-app/templates/register.html rename to blog-app/blogapp/templates/register.html diff --git a/blog-app/instance/blogsite.db b/blog-app/instance/blogsite.db index 31bc1ac0958a3e9aecc1c0aad601e7644dfb9b4a..dadbd8eb04da1c66353ae64657d739757c7d44ee 100644 GIT binary patch delta 40 ocmZozz}T>Wae}lU69WSSD-go~(?lI(My8DktL-;)3w-4V0Fh7!$N&HU delta 50 vcmZozz}T>Wae}lUI|Bm)D-go~+e95>M)r*ftL-^ifMU!*%(Pih;0-?j&u|Cj diff --git a/blog-app/run.py b/blog-app/run.py new file mode 100644 index 0000000..df9930f --- /dev/null +++ b/blog-app/run.py @@ -0,0 +1,5 @@ + +from blogapp import app + +if __name__ == '__main__': + app.run(debug=True, host="0.0.0.0", port=8700)