From 05b33baf9f9b2ee5f93e70b8a6d2d668d1a954bf Mon Sep 17 00:00:00 2001 From: nico Date: Wed, 18 Jun 2025 15:11:14 +0100 Subject: [PATCH] Application - Error Message --- Notes.docx | Bin 38495 -> 37678 bytes blog-app/blogapp/__init__.py | 7 +- blog-app/blogapp/forms.py | 12 +++- blog-app/blogapp/routes.py | 17 +++-- blog-app/blogapp/static/main.css | 3 + blog-app/blogapp/templates/layout.html | 24 ++++--- blog-app/blogapp/templates/login.html | 8 +-- blog-app/blogapp/templates/register.html | 82 +++++++++++------------ blog-app/instance/blogsite.db | Bin 20480 -> 20480 bytes 9 files changed, 90 insertions(+), 63 deletions(-) diff --git a/Notes.docx b/Notes.docx index 3995121cceb99f90cfc93f6da8e99f18f67c86d6..8d0c737c09728f69be454eec9b935811ef62fddc 100644 GIT binary patch delta 25415 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

Vx+O1Dat_{?{12(_rkKewk z^FD!tcu>tDC-B%R^Z8`}1d&!&qfxLMrW3>ZRKL*bMP)y@$d@#_U0kA;%oIuDuQcd&Bp|Qv>McwI@4WGf? zT3#pLnUg>~E}O=eU=9gA7Bk)I!AXZgjd{a;7i-W!NRf6iQ;^r34K=cAHbQ%_yjiU$0ODJ zMu3?mO5Wg39~LaE6Ozv}Z*VHMb{LSS7l8?-PTzKy;OD-^L6zoa1;_4Pcfk?I@9pvj z%?U_3^eDg8mH8*6H*Y1qY&;pS4v6E-aaqPx#|;!J zs?_h@gbbN|O?yQS zJl9{dzP9yYW8=qLIg{1NAR|iZPf+gakoQJFuWaMIWm^Q;^RDXWHSBv3;?};fYH%xx zd5rd_f)rqrqzO+pB#KZVZBd@K4!uf^qLNnOW--#*&S zof1n>9h&+WB>i0;^z9L+#@fgX>wGa$H|SvSKgi&XbMNa*%}ZjyzvIxy`yAPTi*a=0 z*Oxc=8zmrhL%O0lO3fNvIOZT?Ge;5Q4IbhltBg587vvCh=CuDTrTS9z*UZ5l+499$ zUJ2*ipwsxq_6~ILnlAL|Vp;!^LRtO`Te-RNia{CvV82I!L3Rhh=-(nQ3e_9F9L47L zOw`BMwS(DcbZYwBZ6l$ecHnCwu0X}*I`~&CCp9oW`%o2|E&ysg+hOg%esZ*=L(Jj% z0ZIJ~t159P=TfqBGH1p$3B!6LC@+*ZZ(Nrle+y7jNEW7~Jd@?SD2MScQ*4{4fbI+` z+T&Y0mct~LV|=xM9^1_D&`q_X0@?4q6{P-H{Pu`BQL1?uNp_CyGo-dr_En+D3CP_` zLr-9G>V)h>JxP?~WASW!bBPASIw@UA@BD+^_M|8T7Uf2xMN-xBcJAR?U$URyBiDhSrs2;)OWohfDQ&FhC4D4YLT!CHuq^GI za1sbOV(2D!^x!{hEo(hYea#bkL~%5qw*lcZzMSkpB&Kv&QoUO@7pafkEnS2&zC|>x#}<{0u0fRHbaiZ=+qgdrC*$LYf6^Ce>q~6 zEkbRG`)AqJ)hjyk1-2OCau^qDXaR8;NL1zTh=Y``SiXTi9^{-qKGUF8#gaW7PP~_g zT-yk$8R*8H8Roj?{N(S3)P-^)Ff0U7*+ZM&kCa@u7c3Or5<{9_S^M3{`*)fIz5?5h{I5hF z@3%r~jNfi7d|REG_F<9aPa>_9(5V#EePuz}$Q$A{t+` z9)KCke9_dc;3Uz&`VQ3!Hr;%dR34&rV<(+{;oX_6!3p;|zg{%W23zKobK>eF@1d~O zNiTW4?(emrB)}r8S>jtj%>c7Z>eNW0zWTJFsH9Mgm`VxL3c|Rq@7&WM7Bq(AC39KE z3T~64V41mp8U5EN;Mp=IUn1*O(E`-Gp)}C+V^fw5ISUF}CRX-{pBiDRJmtm**b6z__Na1q-)*r+>Te#pcD^?A{Q1I!WOaaS$w(U=ajUWL8#m+qxRU>!$<~Cg8XqfPBm4e9OTd#d! zC{o9eFev2ZBst@&zXJ)6f}hEl1fh~RW}}+9qTXOMe&(}gM6d&rK_nA84@T&ek*(m+ z0k9VT%`f=3obL(ZRyAWBbVbJ6$?o|sIs=xz+bySi73{(0^xD@P` zWw-_U!4}RW4>wkfZQvXwVjMGf}6N$oR4QOLOQ zE?hmSMwZc1JD_o`LX#5wFF4u+NDPlk#=w8ZNy_t3%HkF9{>zPBpqq9JLQb-c#_3#=phtIKCt+`SS;Z-eNhpUjPkiw& z6Bc^8bu|y|KR6r&e)#`!7kOYd+De$vgK>iE`w3x&l2blQ>Mm6L5;wr67|`CF+SpSq zGeov^ohgAbST4t&80QO>Zc&eU+Amty%%391f!O*c7L9J>H^ip{evSFP%Tb7c0zxoD*}FR_Fwxuzb=dJ z`@X(RJmEVnP0IY9)dxGa6^0F)N&DWp8=6A`vwO#^zws`D-wvyEYJV+6W}I5~wDl66 zumFi_aX`iunI_d<#25sk54d1DJTt%D8M1{Ph6dhY`)$VU*_KT*P2uG@g@Af~R@Zlu z+Q+1aW#c%~HFEUJ`>Z*b01>h`?rAz1NT5sFdwVeizXTmqcQ6G#5kT%E9kmD2G6!DvPe}|2UKyS$`YiEB@MVTVLt(o4r3YszM}Q?_ChIEUxE%KHhEF8 zM#{q`xrH7%2!}Ii#6Xp-_E~2R!4lPh_NaZq87;KL zxx}tK-FJ12A1_Bt5VQ{7nz#l>HV&g9jQ7WI!oyG@8~eeNeuG^aM9U_Jlbvq;KXdjf z4wIv(8KKFZp(0aQVI5?yN&8#ZqkC*4cUJOV-%#*>Lzu;!e=ntr0qiYgTLE`nLlcNe z)+yPZeR*v^{>?j_cDMb#^wWl{&N-zF4T0U4$77eo>1(jvRST54AC(=49!n+N2u0w4$pG5gi5H`S=fZ zWbHv*3nxBN(pCOBC$PjDYh!ii_@V6WOB)2)%7)9_VJnOtOaHO=JElMvvV9+)@rcurAU=OXs1i=uT8>`4DA+~{;z&Z9= z+MN@$OXzLM1XE7clj{}5Rc=cso=*rBAe@Npgg-c@O5fE5TzP4!j_uAmM3%kU)972u z$dyVD9JE16-kxaDZ*|r@SS*m)ANEc(83{f6`>xSmU!c~ZwomMxqLXt8sJdJ2Tgj$&2i(+waci2BnxR($-jH^& z`8XBSFcGlv9s>1kYfZ>ULWBnUU}(=ZPthf$?gfxhoBJ~jt$kM3{I)elSsScDvf!qj zp>=1I{0*BW3#b)*fjLmor>S5d*l?tM`y_=ftf1+Tz2)Duxxy)+jntXwlGWJo*nT>MXI2DF7#4$}&sA{DK>YFyUswZ=R@6 zhQMIsKSC~|y?ZqQ2f8->!KWKMPAe_0-$$vIF`~t7`J;bvmnoZRsuN(bWThN_}AUt4bGD*YcSeY`5H`nr&{aUWI83c&X8YJ6hr|w$(qpxD2zXej`BS zG!0imToX$98zfvx7aBofe-BtHzLTXjK?f2JgkU9owRi2srK-FD8#%J`?witEMMX6m zr^sSh|2D}uyT_JQa$ZX-;d|wOo}NxmCtrwA;zv&WysC{F&1815X9LG=`haY`P%(!74h)%{OQ!< zf0)Oz!IXe#dYZEc0v+;7JE6m&ax-ipNpwL7vpLJLC+RX<@|ijqm%LzOV<6E{hy`Zq zBs??}V0FvO%J!4&vi;<8($jxbgU#(MeuZVqF|~G+TaOf${BbSb@u(&>q>+EGcX*VQ zPbxTGPLo4lymc5m6Z?=(jwgih<<3@I+RcOV;6h50@@ZdPbIMd>v&C4K!nxRq!l8pZn*@#5RlMJp^ zKJ_io1{sdw)5{XVuT1LjSBoI8+}+;b$9wG1A%F;YZ@T%OZKhu{7R@0(%^|2?b%%w4 zO=s?p79%MflcGPokaFd}$b+A>Q&^YG-dxUBHv}b(Vg^$!=9t3TBB!X|nys*YA0!5ytDA9!h~tGZ2NYRV1N z>a7|uW9p4@CrNqMG~o*%2vjygn(=gITjumukfHkc=2!2s@2ex^*{B?o^AG!KG|}WG z;Q{S961Qi7+#32ym~^*9Hy+_CggOoa~_o`86k`5oIxfu#goc-@47jb{KmBkBf+XS2_!nii>5tDbyFx;OFZ1T1~E52)`PYzgf1u4EbebZ3>lbg zi6%p5py!AMSsy)%V=JHOEEZ-qbUCN`k3m`HMb*6I7{otIO)AFr#rdL@C?m2+W*hUr zEa;Rmw23PcH2keAI3Q@)ksOU6DNIH>)H~o>?oFBMYLy{_QZxy-VSLEqZB7;wUjded zG*8*NReoFEBeRRYgWMVkFZFPSq7!R;(4ZH}fWq_{zURN5Te2uPt_jzhwC}6{C{e8U z^Xu}ejvf>FPRcAeP=(SGOnHujRo=~xyyq8Q+;aaGTeGEk^e+AHso!eI)d&k5jDGBV zoD&8j4D{ik06l-cTMN(Ndw+mgh2HYPC&qy)vR|Z|N19)K__CE{yeDVZ-;aMdE$nFV zi_JV#2^%L$FAj{VG*&!ko)N|Ty~mvBra;Cpiht3cUYaFCS!@lpHL1aBY_H4^8+`TU z>v(Z^R~5GXbe&K?gZ0LZ+01I%z*+$WN1pi=g z_dFIUaYN^%%k6xf47YPL zN}awRzJ086IAX=mOH-m`+%Atj>OM^u>3)0fBv;8%)0P|7o5LSJdgx$l@n zuT0-2-mZk}>*fJAH(f6p*4o=TC0sD9dNMk;Ggd9^)K>hCIs!ZuaCOv#Wn_`2q?U9bA3VaQOduZr{l>qBr=D6&V-# z<*B`jZ3PBCsOfYA?4?gE+Bp~ExcN#H^PG1~csIt3V2?#lnJ8Xj`#auQzt(^7GA(b5 zUcJ=?APapeQESeIZ5J6p5{06nuDM4Y@DxJ#LG~rEm^r_+w75NTyVM&9y>aYV6Vtj= zI%}4h&pXmwP-bsro?LdxG&z^9e#~WA=c)-GJc|)!8CbQ{Oo@3_6We=mUork=-58k* zN5L5%V*guwXD9H$yJusG3J+XpWbuSVJ!#_0zC9wvJSBv?u;jtgDlR0?X;9Va9&CN+ zQ70tmW&Th%1J&E%0O{R4cPka;{9$+lsjVac4V4b83KmViyEsYoyNY`4yNu9C@?%{J zvb75*i+g{(WhZlF4XVz(|B$@ccR4uyj`VD1b{v_gz|0$`BEgt3^FdqcP)ov_4C zzeQ0bCvJ=c0I|x-9jCkrNAF=S@!cXz1hKxRu(L|uyX^B(5;>yz=2_AmV6#dyX2K7| z&yU@x4q-Zpp)`lTC}Hd)aQzOSBqg6F-DgiP?0GQENBk>DMhy-q6Oj-k3UA|@jVG|n z$w-bXpuIO@L$A>=QT&dZV~5Csuk~;sg{Mha8JxU}qHgk`6Hy(P4=T6xbY!AA~qz zW8qJ?vi$_dB^Ecr72SUIb2(F8S>mrC zJ+5Aeeo{x6I?4AOyjEshD(kNY$!rpVNfD-y+0nL=;_&gdNYBcy`9qV}@9An8H04cG zN8b~zWk;lLZX;aTFH&k-?oX+&^<@#x)8s(I~)%{{AX&0W%^CCz^ zTHK3-*L!2Cn3|O)-^3ImTu%rc>#;Cup~ z=K~i<1|$Lq`h+L;#YE1xbF>~RfFV~CP-GVi)h!zNf6~?;oV`8iH@!$8y;cv+_0m@1 z75wm!dy#CNBFH=K`OQ4~PNGmnEO*Fpyi{U2<7b*={%vI)=i54z)^o2?JhI7^KBP3tHxoAudYpGCT2}&J1MgrFylW zY&4V~8GSegqjfuP7>)Y}HmN*3==Qb;G8BF|aZH<>(N0N>h%}ab)Fovk}PP8nGL8Q;o zdmek??dlBh$^TXrd~FI_JMC~p3oyi-O(Z$EuZ_L_QDOZDy~gS& zTpZA76hjLMR2g8y2;NnCB~R~3bdtcxV8`MXlryK2{%v53PFF3mfOq`v--#L#3+UOt z?+NNQ&YA9!!X)X}{dI^l9Et!-QDJWARC*G~hfYgZmmn*RL}M1iP-m0AyJM+Yrb+0- zEg$Mi;;^T*P^zgizrvSi?f}MvsfSjPH8EtQj=HM=uA3^IR^2h!bi({>ZraoUrRXW0_Z>!=ml$sq*cyH-~o@^jV9fZ4o z8+~%Wxm_{jK5WRxg-!hySDMfXb&FymPQE^92fx%jX>?#=7yQ-gmK1|fR#{8Tfr1f( zaiQ)H&`;=DNV9}v%1?pyjsRK#b#Sk|Dy33-uw4ek~Is@x3*s0?!~_3)ek`8 z6>;%o~6=eOrM|_alp^zg@XM1*22c2;v7U8{#6tY;r$Os+<~IKd5lZ(B8Qd z22aeg0O0L5XF=o*xqG0)J2V8u#|Jcossc0&NZ$qtadH&9@(>aN;;0cjo&^%vNMQ>l zJ)C5IVrBq6K`$Lv-nyV4I|W-Z>&J)ch)_Jk_d? z?{Ke~AjtFVn^TgBn0joE9P5;r$oyBOupsg?Ahsp*|?v&SMDzW;6Wr1Vn*ucbVU`DbPv>CS49!@C%*fp(zx?Y-X+_v;Hghk=>Q?v34% z{dU&0-d=pa(U)s3a=Fx&%!H{SRB*DO|MdPBgA3t7 diff --git a/blog-app/blogapp/__init__.py b/blog-app/blogapp/__init__.py index f44d1bd..c774037 100644 --- a/blog-app/blogapp/__init__.py +++ b/blog-app/blogapp/__init__.py @@ -1,10 +1,15 @@ + from flask import Flask from flask_sqlalchemy import SQLAlchemy # type: ignore +from flask_bcrypt import Bcrypt # type: ignore + + app = Flask(__name__) app.config['SECRET_KEY'] = 'db3746b2ffa650b3804e4316d227f853' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blogsite.db' db = SQLAlchemy(app) +bcrypt = Bcrypt(app) -from blogapp import routes \ No newline at end of file +from blogapp import routes diff --git a/blog-app/blogapp/forms.py b/blog-app/blogapp/forms.py index 47ac3ff..16d0797 100644 --- a/blog-app/blogapp/forms.py +++ b/blog-app/blogapp/forms.py @@ -1,6 +1,7 @@ from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField, BooleanField -from wtforms.validators import DataRequired, Length, Email, EqualTo +from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError +from blogapp.models import User class RegistrationForm(FlaskForm): @@ -14,6 +15,15 @@ class RegistrationForm(FlaskForm): validators=[DataRequired(), EqualTo('password')]) submit =SubmitField('Sign Up') + def validate_username(self, username): + user = User.query.filter_by(username=username.data).first() + if user: + raise ValidationError('That username is taken. Please choose a different one') + + def validate_email(self, email): + user = User.query.filter_by(email=email.data).first() + if user: + raise ValidationError('That email is taken. Please choose a different one') class LoginForm(FlaskForm): email = StringField('Email', diff --git a/blog-app/blogapp/routes.py b/blog-app/blogapp/routes.py index 93eae17..5e2585e 100644 --- a/blog-app/blogapp/routes.py +++ b/blog-app/blogapp/routes.py @@ -1,5 +1,5 @@ from flask import render_template, url_for, flash, redirect -from blogapp import app +from blogapp import app, db, bcrypt from blogapp.forms import RegistrationForm, LoginForm from blogapp.models import User, Post @@ -28,8 +28,15 @@ def home(): def register(): form = RegistrationForm() if form.validate_on_submit(): - flash(f'Account created for {form.username.data}!') - return redirect(url_for('home')) + hashed_password = bcrypt.generate_password_hash( + form.password.data).decode('utf-8') + user = User(username=form.username.data, + email=form.email.data, password=hashed_password) + db.session.add(user) + db.session.commit() + + flash(f'Your account has been created !!') + return redirect(url_for('login')) return render_template('register.html', title='register', form=form, pagetitle=pagetitle) @@ -38,8 +45,8 @@ 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 !') + flash(f'You have been log in !') return redirect(url_for('home')) else: - flash('Login Unsuccessful') + flash(f'Login Unsuccessful') return render_template('login.html', title='login', form=form, pagetitle=pagetitle) diff --git a/blog-app/blogapp/static/main.css b/blog-app/blogapp/static/main.css index e69de29..eb75506 100644 --- a/blog-app/blogapp/static/main.css +++ b/blog-app/blogapp/static/main.css @@ -0,0 +1,3 @@ +.invalid { + color:red; +} \ No newline at end of file diff --git a/blog-app/blogapp/templates/layout.html b/blog-app/blogapp/templates/layout.html index 61a302b..63ea8ac 100644 --- a/blog-app/blogapp/templates/layout.html +++ b/blog-app/blogapp/templates/layout.html @@ -13,7 +13,7 @@ - +

{% block navbar %} {% endblock %} +
- {% with messages = get_flashed_messages(with_categories=true) %} - {% if messages %} - {% for caterogy, message in messages %} -
- {{ message }} -
- {% endfor %} - {% endif %} - {% endwith %} +
{% for head in pagetitle %} {% if title == head.title %} @@ -38,10 +31,21 @@ {% endif %} {% endfor %}
+ {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + {% for caterogy, message in messages %} +
+ {{ message }} +
+ {% endfor %} + {% endif %} + {% endwith %} {% block content %} {% endblock %}
+ +
\ No newline at end of file diff --git a/blog-app/blogapp/templates/login.html b/blog-app/blogapp/templates/login.html index 1ae6c4f..d9d19c1 100644 --- a/blog-app/blogapp/templates/login.html +++ b/blog-app/blogapp/templates/login.html @@ -11,8 +11,8 @@ {{ form.email.label() }} {% if form.email.errors %} {{ form.email() }} -
- {% for errors in form.email.errors %} +
+ {% for error in form.email.errors %} {{ error }} {% endfor %}
@@ -27,8 +27,8 @@ {{ form.password.label() }} {% if form.password.errors %} {{ form.password()}} -
- {% for errors in form.password.errors %} +
+ {% for error in form.password.errors %} {{ error }} {% endfor %}
diff --git a/blog-app/blogapp/templates/register.html b/blog-app/blogapp/templates/register.html index 6778f1b..4e4017f 100644 --- a/blog-app/blogapp/templates/register.html +++ b/blog-app/blogapp/templates/register.html @@ -1,7 +1,5 @@ {% extends "layout.html" %} - - {% block content %}
@@ -11,62 +9,62 @@ Join Today
{{ form.username.label() }} - {% if form.username.errors %} - {{ form.username()}} -
- {% for errors in form.username.errors %} - {{ error }} - {% endfor %} -
- {% else %} - {{ form.username() }} - {% endif %} + {% if form.username.errors %} + {{ form.username()}} +
+ {% for error in form.username.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {{ form.username() }} + {% endif %}

{{ form.email.label() }} - {% if form.email.errors %} - {{ form.email() }} -
- {% for errors in form.email.errors %} - {{ error }} - {% endfor %} -
- {% else %} - {{ form.email() }} - {% endif %} + {% if form.email.errors %} + {{ form.email() }} +
+ {% for error in form.email.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {{ form.email() }} + {% endif %}

{{ form.password.label() }} - {% if form.password.errors %} - {{ form.password()}} -
- {% for errors in form.password.errors %} - {{ error }} - {% endfor %} -
- {% else %} - {{ form.password() }} - {% endif %} + {% if form.password.errors %} + {{ form.password() }} +
+ {% for error in form.password.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {{ form.password(class="form-control") }} + {% endif %}

{{ form.confirm_password.label() }} - {% if form.confirm_password.errors %} - {{ form.confirm_password()}} -
- {% for errors in form.confirm_password.errors %} - {{ error }} - {% endfor %} -
- {% else %} - {{ form.confirm_password() }} - {% endif %} + {% if form.confirm_password.errors %} + {{ form.confirm_password()}} +
+ {% for error in form.confirm_password.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {{ form.confirm_password() }} + {% endif %}
diff --git a/blog-app/instance/blogsite.db b/blog-app/instance/blogsite.db index dadbd8eb04da1c66353ae64657d739757c7d44ee..4c0108d01ac7a42763194fb75ea528f30f80eafe 100644 GIT binary patch delta 191 zcmZozz}T>Wae_1>^F$eEM&^wPOZeFs`R6h4&)Y00Foi!Sfsvg-R8zT;H7_$cAA}v! za}zUj^pf*)Q&Q6sOLI!}vI^2wjFMCgjZ^|FGlQM4_2DzlQqD!eL^ES!o{y@G=S zQVfEP+|$B~ODmGRtHQHOEdvVzid>vbUEIvL7#J8B`F}9*{{Y(fj$eqKS(FoG5k&kQ W1OGdq_!E91L1s;`IKlyo1Ox!9q&Y?a delta 41 rcmZozz}T>Wae_1>(?l6(My8DkOZYdlIQ-#f