From 986629f0a507bbf808af441b50e79242f3396048 Mon Sep 17 00:00:00 2001 From: ScriptSorcerer20 Date: Sun, 8 Mar 2026 22:24:13 +0100 Subject: [PATCH] Functional login and logout, login system should be fucntionally implemented. Testing and polishing are next. --- app/__init__.py | 9 +++- app/__pycache__/__init__.cpython-311.pyc | Bin 1696 -> 2405 bytes app/app.db | Bin 0 -> 16384 bytes app/models/__pycache__/user.cpython-311.pyc | Bin 1402 -> 1475 bytes app/models/user.py | 3 +- .../__pycache__/login_routes.cpython-311.pyc | Bin 3090 -> 3503 bytes .../__pycache__/main_routes.cpython-311.pyc | Bin 583 -> 1006 bytes app/routes/login_routes.py | 15 ++++-- app/routes/main_routes.py | 6 +++ app/templates/dashboard.html | 51 ++++++++++++++++++ app/templates/index.html | 2 +- app/templates/login.html | 6 +-- app/templates/sign_up.html | 6 +-- 13 files changed, 84 insertions(+), 14 deletions(-) create mode 100644 app/app.db create mode 100644 app/templates/dashboard.html diff --git a/app/__init__.py b/app/__init__.py index 962ebc1..5fd7acc 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,4 +1,5 @@ from flask import Flask +import os from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager @@ -8,8 +9,11 @@ login_manager = LoginManager() def create_app(): app = Flask(__name__) - app.config["SQLALCHEMY_DATABASE_URI"] = "" + BASE_DIR = os.path.abspath(os.path.dirname(__file__)) + + app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + os.path.join(BASE_DIR, "app.db") app.config["SECRET_KEY"] = "dev-secret-key" + app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False db.init_app(app) login_manager.init_app(app) @@ -17,6 +21,9 @@ def create_app(): from .models.user import User + with app.app_context(): + db.create_all() + @login_manager.user_loader def load_user(user_id): return db.session.get(User, int(user_id)) diff --git a/app/__pycache__/__init__.cpython-311.pyc b/app/__pycache__/__init__.cpython-311.pyc index 2e91d73ebe681622671ba764148efcd05be020f6..7124496d8c86a27c42540541fabdbb5374b3b83e 100644 GIT binary patch delta 1242 zcmZ`(K}-`t6rI_f-EJ3_RSKn61c?VlkRry2+C;IHfC@y=1Ld$5w#4EV>h2~G0%>DN z1cD*W#uyDoPIw?DCf zVAm>)yhL1p@w+fVXkNaD6>>2^WbA)eBWdc zy31ug9QB!mZph0B^*ORktSI*EL;vw|)XO5XH1o-q`6BPfD*g}CMVShk!YZ=@F;`*a zWfG<-G$It%DjNh-B}EwLV0;ngqL^7;*oV-vNMl&%aE0Xk2kJSZ3g!-nQd%IXZdKHz zMAkhbQlc^WelC z`Hbu>p2?^R_U}!Y(Y^*qluWJ*vyz=lVsGqX}h9>M&3~4I`vZ4 za9pD-GBOq)wFqgig22kq*r*wsFl}*2k44Rx64f-TgIrJXHVbZBxX{*jQ3-eU>K=%t zS5ieQrk8*+XcHf#a$cuh@aK?ZQf~mjO-T>o{@ZD^A$TkjG--uWG zc%n5Onz^(l2ePEua&hNVo9@!Z+WFe7+n;m$w-Dxhj@l5!MQL7|lNaP!d5bN;j_(^~ z{rFA&vuT&Ly}i8)ah5-M#CvjF%@%{X7OR&VJ8aMrylwV}z3e+L3Hx2|4q(vrqRkD{ xAAs{(y3bnYTKI!N)f+64_lwP7(he~UtBJ36xzo;Pb@0LJYAkP|zm;AA^k0zR2Uq|A delta 635 zcmZWm&ubGw6n^t-cd~7=nl@4-Xc57tv=#&pN|BaI52ZvT2(p(Ybhc>R(Xxq%kZ2A8 ztB4o|@meocDR}X}@F4ae$bz7U9@I<0i+J+Qwnb|{c#rqK_q~~UZ?=kS`NGS5-UGzR z7q71Wp#8$g{i~Qg2L+16ph-Z8jcH6Z3s@Gjm}?OT0u&;)j_M72K!(6UPW;EYiuWLp zO4Oj@e6zX=NyU6zZ{EPbt6g54jhC)P`YvXJi~TnvK0}SQpZ5sB1K$5QKA}h(8q_vh zC^~ID+sARswHyGGC&$bcTI4MpZ8sUx!e)C2QMLo+C^vSse8dU-t7zo*6svrhDA|+y z$LbL5%*CD_=uljXqr7-f=R3HfHmnuQEG?DjIzE2`Z3llVrp1O_+{QpP1@n%beLKo0 z2^lt3aq*C!*vV5FhBxav3PbZ=%$rH4=7^NlS60kZr*ui6ViYlx6s^`)*IW4Dk8SeGr{l=<7FOGvyll?7Gi*x~&9-~z za59XI)k-cE%l3y7W}e71<42Lq&VCJVOdd diff --git a/app/app.db b/app/app.db new file mode 100644 index 0000000000000000000000000000000000000000..479ce3a3ce8b1227654035b3a039b314d6429240 GIT binary patch literal 16384 zcmeI$O-ma=7zgm#L|PNj^cJL0=HMZLTK4@VQ0N-BHJGHjZUj$Z-nK*%W3wx*N2Q;n z->1+|Q+n{w%~~zCNbm9=c6N53d1jdTv6tDygZ?B}G@UPIET({ zFSMu4W>fp}JZF5W&NH>h%3GxyM`04tB;4*tv<%T!y*81wH%y{;QA~&L6FMCA`!8v| zw(LJ;GewWWxVsz1EmLpbOE_a$_G!M5e-a$$eukQ{$@H$?Pg5)Ss41Ews?$J6i{@AE(7}eaz1DdHFsrUB+hFth6itPc_Qa zYVl32F2Ad_qH2u}DJ~QUKmY;|fB*y_009U<00Izz00jOKxa?}HWaH|9SmZ=4<};Ov z#l>0Pu}shPJATL5>|I2AyW8Cpk&DOFfvV^&X{Mw#E{C8#R`%I0U(l|18i*kvN+5;1g&|6CGdGh6BO~8r1!fgSp~c9>x+WwR|M53FJSRwRGa*sMS@Xl hG6$=l#GucnJ-wRi^PEL0|0!9ImG|~ delta 178 zcmX@i{fmotIWI340}w2jz9N%*BJT{ww28|;Ocr4jn!JKBmMw+5g&|5{vni7ZBO~u* zFJ=`+!O8i|J(Jm46c~?9)?jJka=pOgbdksD3Xjv|Ei5XNU$gi~sRE5F5(5z;K;jpN pO>TZlX-=wLk>=z;REM$Hclm_&!=grq4MA3-u-ut" diff --git a/app/routes/__pycache__/login_routes.cpython-311.pyc b/app/routes/__pycache__/login_routes.cpython-311.pyc index 0e5e1549b34827875fff64e0d52f43921485c27b..1b6cba17cad548f85c93d767e1173fe1dfb453fc 100644 GIT binary patch delta 1239 zcmb7@&2Jk;6u@V8XFt4a$98ROH=)j!wrV%7ogxKPAzHXqNW=)Ws>&Xy0y{~qdhK@B zE+Q%pL8VDoPgFk)bWf+mC%)1)0@E{tl$T28YTF8I z&koXFI>>k#&@o?Yj|EvTn~e2#F35X%N)*DWZ}0yBYj+`=nEsA_EKMIKSHD6yh zsn%DTD#RG+Exj#{Uxe5i7olGn^h`7TSBwEf3`l&z*H$PO#BdsLL< zEjE)@L@&|F`&rFW7<)Z?XHj)wMoW6FBi2-)(IHkqVNy-L+Xrd z=cj=3?c8Zr`~wcY`}0ao%wt z#sc>pxcG>*I`dsI0oz5V(&=zh`_{>)FXYAoR|j9tI)$4z%qHJ6D{|}?8@x& z>=Tw6SV!;9Z?gK3)d#HpLTwiG(!GyU$lCkisa(4*pZD7`s!tf-|CEto(6T2aAXHvpSQyXmO8nv2w%%1YjO$S z#i-txv1lOnPP1da2^;%uepZ|Y1O8y)8^Bnllx~st2LGpRk#`3FYKK9!Mcx|xcazub zX1PdfF#&9=M0tHkUyBvgG~{D@`t2%FtgotHR&S*?>G+V2Z_#Y5sPtq^0JtHyQpL{% N*kbnFkXVzG{sY)58}0xA delta 926 zcma))Pe>F|9LL{#GjC>gcV?V*bvOUyF8-+o7Y(uKkYZ3!7Y_;%dx@o)WN}90jhiHz z1|2-MKB0~hWQu`@4jsA(-8!iVEfXC()M<_KP?z3s)G+AK>cx}~NLToVmgdV+YnL0LFu!{5g8ji0Q{vi`x!?OM5&%#LO6 zS@t63L&`|HTA!(@azlI{348}EYCrVXFO&gdLH#E*)BKw@IG+(t+hickngGp!7Jv?D z1)K)70idYE&fxnn6`%lQ0sBPfp$vlxVCcDAj&(wgd5jKW1X}_Nd^5JCo)Olt-N4rp zxocr^+GXQ2Zh5RHaPO2^Y3c!sh6c)E;;vT=#&1Wzgh2&i!k=_pFX#casNxXj+p1^h zVTO_9I%1#@)$mihEFP3ScaZf7AN-}@K%gdJjH~GS_W$iFy0QJQT}AENM_WCz_(y#> flg8aOB(N_ba&Zq|s1fk=@gbwvLJP(*$>u_3bWb@DQY6 zkKWp&r-;NJJ$m(=Kn`I~1@+)961?Q(yv>g$)Zx9^dGq_t%zj9x6+rs({k;B!0DKdV zImt6&{1t^$pg@TQHYpQZDoaGXB`adfW!a9FqXZ;ighp7bBLQ^rPN^Jc@%M@O>)$Vx zJ6N%ccS_4^a|M)>|Ba0;$1<75SEE;QDKt?6E%{Sq*Q6kM-}0Hm>kThh=d3{) zH#}xLmgzCHu361z^@hRO3%|}84N_H~qnBs+F5`i0oAt(o>{S;?QHad$_$CUc;4S(B zoZB*5#32=1N*$}d%-1~I(g+vB{s?2_FgdK=(M#2uZ!!H*=}3S0;PE}(tk%37HEq_& zc|PMd%Q?JRv6!u!j-&IY?=e>wxQwZscU}c@t!Xo!#*{ITw!&uA#20$7^F6Po3}pi_S8aOEezB`PcDR^MNJK&Pc74Z&IQ^q zd!U92BU~hp3bm*gBn+d0Q#6bq9!{&`1krF};he&vE0`vUeY;6<8F%?r%pmsao+BGY z2q8n*?Ok?;aJzTexll4E+PlNEqrS2|P`2Cg3zB%7eUm+L`y?|UnUO?@HUeb7A|PE^ qXks8GL%-L3vNa%EL$WSh4~XzRAi{a$_=fmo(K?dAGIWI340}vElo|n0lVIrSIeHM^6ogsxGg)xUAmobVlmnn*gk%5UJl`(}W zm3bKx1H)<{hJYxRRF(y-Fdj0U!n}+Ts1k@FAcducVHuFQ8YaLH#g@Vv%%I8k5+tI@ zbc@p|r!=*oXfh+C$YfK-Bu3}SGZ=l0xq*@(3yKARL<7T9ZmAhI7r8aAaBEy((J0~s z3i@fX-(pS6Ni5DTVg_=HSSG(?lG6a`E8+kVAT>oGKmOvd$<0qG%}KQ@0vQH!T5;TD VOJ;@1h0GRw42+DLA3y|H0|49HGfe;h diff --git a/app/routes/login_routes.py b/app/routes/login_routes.py index a7143d7..a849065 100644 --- a/app/routes/login_routes.py +++ b/app/routes/login_routes.py @@ -1,6 +1,6 @@ -from flask import Blueprint, render_template, request, url_for, redirect +from flask import Blueprint, render_template, request, url_for, redirect, flash from werkzeug.security import generate_password_hash, check_password_hash -from flask_login import login_user +from flask_login import login_user, login_required, logout_user from ..models.user import User from .. import db @@ -11,7 +11,6 @@ def register(): if request.method == "POST": username = request.form.get("username") password = request.form.get("password") - email = request.form.get("email") if User.query.filter_by(username=username).first(): return render_template("sign_up.html", error="Username already taken!") @@ -20,8 +19,7 @@ def register(): new_user = User( username=username, - password=hashed_password, - email=email + password=hashed_password ) db.session.add(new_user) @@ -47,3 +45,10 @@ def login(): return render_template("login.html", error="Invalid username or password") return render_template("login.html") + +@login_bp.route('/logout') +@login_required +def logout(): + logout_user() + flash('You have been logged out', 'info') + return redirect(url_for('login.login')) diff --git a/app/routes/main_routes.py b/app/routes/main_routes.py index c67ef5d..5909e0a 100644 --- a/app/routes/main_routes.py +++ b/app/routes/main_routes.py @@ -1,7 +1,13 @@ from flask import Blueprint, render_template +from flask_login import login_required, current_user main_bp = Blueprint("main", __name__) @main_bp.route("/") def home(): return render_template("index.html") + +@main_bp.route('/dashboard') +@login_required +def dashboard(): + return render_template('dashboard.html', user=current_user) diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html new file mode 100644 index 0000000..96397ba --- /dev/null +++ b/app/templates/dashboard.html @@ -0,0 +1,51 @@ + + + + + + + + Dashboard + + + + + + +
+ + ``` +

Dashboard

+ +

Welcome back {{ current_user.username }} 👋

+ + + +
+
+ +
+
+ ``` + +
+ + + + \ No newline at end of file diff --git a/app/templates/index.html b/app/templates/index.html index cab8a34..3d2f07b 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -27,7 +27,7 @@ Dashboard Logout {% else %} - Login + Login {% endif %} diff --git a/app/templates/login.html b/app/templates/login.html index 419978c..70581a9 100644 --- a/app/templates/login.html +++ b/app/templates/login.html @@ -19,8 +19,8 @@

Login to your account

@@ -29,7 +29,7 @@

{{ error }}

{% endif %} -
+ diff --git a/app/templates/sign_up.html b/app/templates/sign_up.html index 09e9a04..51fcb5a 100644 --- a/app/templates/sign_up.html +++ b/app/templates/sign_up.html @@ -19,8 +19,8 @@

Create an account

@@ -29,7 +29,7 @@

{{ error }}

{% endif %} - +