توی این قسمت، می خوایم model ها رو در Flask بررسی کنیم و بعد سراغ Flask Login برای احراز هویت بریم.
برای ساختن مدل ها، فلسک یک ORM خوب و فابل اعتماد در اختیارمون قرار داده.
این ORM به صورت خودکار جلوی تزریق ها، باگ های SQL و SQLite و... رو می گیره و از SQLite استفاده می کنه.
برای استفاده از این ORM اول باید اونو نصب کنید:
pip install Flask-SQLAlchemy
بعد باید اونو به پروژه وارد کنید و یک نمونه ازش بسازین:
from flask_sqlalchemy import SQLAlchemy app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///base.db" db = SQLAlchemy(app)
این کد( به غیر از بخش ایمپورت) باید زیر تعریف متغییر app در کد های پست های قبلی قرار بگیره.
app.config["SQLALCHEMY_DATABASE_URI"] یک config رو برای app تنظیم می کنه که محل database رو نمایش می ده، با این محل دیتابیس در پوشه instance قرار می گیره
هر model در SQLAlchemy یک Table در Database هست، و هر متغییر در اون model یک ستون در اون جدول
برای مثال این model کاربر ها هست:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String, unique=True, nullable=False) password = db.Column(db.String, unique=False)
حالا می توانید با استفاده از این کلاس، از این مدل استفاده کنید.
برای افزودن مقادیر به دیتابیس، باید یک مدل از کلاس را ایجاد کنین و بعد اونو توی دیتابیس اضافه کنین.
برای این کار:
u = User(username=<Ali>, password=<123>) db.session.add(u) db.sessin.commit()
اینجا، بعد از ساختن مدل، اونو با استفاده از db به session اضافه کردیم.
(ر)session چیه؟
سشن یه بخشی از SQLAlchemy هست، اگه با git آشنا باشین، session یه چی مثل همونه، اول توی استوریج ذخیره می شه و بعد به دیتابیس اصلی commit میشه.
اینم همونه، شما می تونین هر چند تا تغییر رو ایجاد کنین، و بعد از همه ی اونا برای اینکه دیتابیس تغییر کنه، باید اونا رو توش کامیت کنین.
حالا باید به اون دسترسی پیدا کنیم
برای گرفتن مقادیر باید از query که مدلمون از SQLAlchemy ارث برده استفاده کنیم، چند راه برای این کار وجود دارد که الان می گیم:
u = User.quey.filter_by(username=<ali>).first() u = User.query.get(1) u = User.query.get_or_404(1)
توی کد اول، اولین کاربری که نام کاربری اش ali باشه رو میگیریم، در مقابل اون .all وجود داره که یک نوع لیست از تمامی مقادیر پیدا شده می ده، چند تا دیگه هم برای گرفتن آخری و... هست.
کد دوم، با استفاده از آی دی یک کاربر رو می گیره، که در این کد اولین کاربر هست، از اونجا که آی دی ها unique هستن نیازی به .first نیست. ولی توجه داشته باشین که حتی اگر فیلد های دیگه هم Unique باشن، بازم نیاز به .first دارن.
کد سوم در صورتی که در یک route استفاده بشه، در صورت وجود نداشتن آی دی، خطای 404 می ده، با استفاده از کد دوم، در صورت وجود نداشتن خطای 500 داده می شه.
حالا....
همونطور که شاید خودتون حدس زده باشید، برای حدس مقادیر باید از session.delete استفاده کنیم، دیگه کدش رو نمی نویسم.
برای تغییر مقادیر، کافیه اون مدلی که از کلاس ساختیم رو تغییر بدیم و بعد هم commit کنیم.
برای مثال:
u = User.query.get(1) u.password = <321> db.commit()
با اینکار مقادیر داخل دیتابیس تغییر می کنن
فلسک لاگین، یکی از کتابخانه های مربوط به فلسک است که برای توسعه احراز هویت ها و مدیریت کاربران استفاده می شود، برای استفاده از این کتابخانه باید اول آن را نصب کنید.
pip install Flask-login
بعد از نصب این کتابخانه، باید اول یک مدل از manager اش ایجاد کنیم و بعد یک فانکشن برای احراز هویت بنویسیم تا بتونیم توی route ها ازش استفاده کنیم.
Login_mg = LoginManager(app)
این کد رو زیر بخش کانفیگ های app بنویسین، حالا باید مدل کاربر رو به این لینک کنیم.
حالا این کد رو بالای بخش model ها قرار بدین
@Login_mg.user_loader def load_user(user_id): return User.query.get(int(user_id))
حالا می تونیم با ایمپورت کردن چند تا چیز، از این کتابخانه استفاده کنیم، ولی اول باید توی مدل user ها یه تغییر ایجاد کنیم.
from flask_login import UserMixin class User(db.Model, UserMixin): .... # ----------------------------------------------------------------
from flask_login import login_user, login_requiredlogin_required, current_user, logout_user
کلاس user رو مثل بخش اول تغییر بدین.
(ر) logjn_user یک مدل از کلاس user ها می گیره و اونو login می کنه، حالا می تونین از current_user برای دسترسی به کاربر لاگین شده استفاده کنین.
دقت کنین که current_user دقیقا مثل مدلی هست که از کلاس کاربران می گیرین، مثلا برای تغییر مقادیر، به جای گرفتن مدل از داخل دیتابیس، می تونین از همین current_user استفاده کنین و بعدم commit کنین.
یه نکته دیگه هم اینه که برای فهمیدن این که الان کاربری login کرده یا نه، میتونین از current_user.is_authenticated که یک متغییر بولین هست استفاده کنین، اما برای قطع کردن دسترسی کابران وارد نشده به صفحات، نیازی به این کار نیست...
برای جلوگیری از ورود کاربران لاگین نشده، باید اول چند تا کانفیگ انجام بدین.
این کد رو زیر کد loginmanager قرار بدین:
Login_mg.login_view = "/login" Login_mg.login_message = ""
بخش اول کانفیگ، میگه که اگر کاربری وارد یک صفحه شد، و باید بعد از لاگین به آن وارد می شد، به صفحه /login منتقل شود.
کد دوم پیامی که نمایش داده می شود را می گوید، ما هنوز به بخش پیام ها نرسیده ایم، پس این بخش را خالی میگذاریم.
حالا کافی است در هر route، علاوه بر استفاده از دکوریتور app.route، از دکوریتور login_required هم استفاده کنین.
برای مثال
@login_required @app.route('/settings') def settings(): ...
برای این پست بسه، بقیه مباحث بمونه برای پست بعدی..
❤️💬