ایجاد اپلیکیشن «نمونه کار» با استفاده از جنگو - کار با اپلیکیشن
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 11 دقیقه

ایجاد اپلیکیشن «نمونه کار» با استفاده از جنگو - کار با اپلیکیشن

در بخش قبلی ما با قسمت‌های مختلفی از کلیت پروژه آشنا شدیم و با ساختار فرم‌ها و دیتابیس آشنایی پیدا کردیم. حال بعد از پیاده سازی این مراحل تصمیم داریم تا خود پروژه را اجرا کرده و ببینیم که به چه صورتی کار می‌کند. 

کار با پروژه

پس از اجرا کردن پروژه از طریق manage.py شما به آدرس لوکال‌هاست با پورت ۸۰۰۰ باید مراجعه بکنید. اولین صفحه‌ای که با آن روبرو خواهید بود یک صفحه Welcome است که به شکل زیر به شما راهنمایی لازم را برای وارد شدن، ثبت‌نام کردن و یا برقراری ارتباط با قسمت پشتیبانی را می‌دهد:

حال شما دو کار را می‌توانید انجام دهید. می‌توانید در وبسایت ثبت نام کنید که برای اینکار لازم است روی دکمه ثبت نام کلیک کنید.

و یا در صورتی که قبلا ثبت نام کرده‌اید می‌توانید از دکمه ورود استفاده نمایید.

در صفحه ثبت نام نکاتی وجود دارد که باید بدانید: ابتدای کار شما باید از یک username منحصر به فرد استفاده بکنید، یعنی نباید تکراری باشد. همچنین انتخاب رمز عبور شما باید هوشمندانه باشد، چرا که رمزهای عبور ساده در این حالت پذیرفته نخواهد شد. فیلد ایمیل شما نیز باید به درستی وارد شود و از قالب اصلی ایمیل پشتیبانی کند، در غیر اینصورت اجازه ثبت نام به شما داده نخواهد شد.

بعد از فرایند ثبت نام حال می‌توانید وارد پروژه شوید. بعد از وارد شدن شما به صفحه اصلی پروژه یعنی همان 127.0.0.1:8000 ارسال می‌شوید. اما این بار یک تفاوت وجود دارد، شما وارد شده‌اید و با این کار لینک‌ها تغییر پیدا کرده است:

حال به جای لینک ثبت نام و ورود با سه لینک پروفایل، ویرایش و خروج همراه هستید. قسمت پروفایل یک آدرس منحصر به فرد از وبسایت را در اختیار شما می‌گذارد که اطلاعات شما در آنجا قرار دارد. قسمت ویرایش نیز برای تغییر مشخصات خودتان است. و دکمه خروج نیز باعث می‌شود که شما از پروژه خارج شوید.

صفحه پروفایل

هر کاربری که در وبسایت ثبت نام می‌کند، بلافاصله چنین صفحه‌ای برای‌ش بوجود خواهد آمد. این صفحه از آدرس 127.0.0.1:8000/arastoo برخوردار است که در این حالت arastoo نام کاربری بنده یا کاربر ثبت نام کننده خواهد بود.

در این قسمت شما اطلاعاتی را مشاهده می‌کنید که می‌توان این اطلاعات را از طریق پنل ویرایش، تغییر داد. در حقیقت پنل ویرایش نشان داده شده، ارتباط مستقیمی با فرم‌ها و مدل‌های بانک‌ اطلاعاتی ساخته شده برقرار می‌کند.

در این صفحه شما قابلیت تغییر داده‌های بانک اطلاعاتی‌تان را خواهید داشت. «البته ظاهر این صفحه به دلیل نبود وقت کافی چندان زیبا نیست، اما از نظر کارایی می‌تواند به خوبی عمل کند».

کار با پنل ادمین

برای پروژه‌های مبتنی بر جنگو یک پنل ادمین وجود دارد که در آن کاربران مختلف با مجوزهای دسترسی متفاوت می‌توانند به قسمت‌های مختلف دسترسی داشته باشند.

در ابتدای امر تنها فردی که می‌تواند به این پنل دسترسی داشته باشد یک کاربر با نام SuperUser است که مجوزهای کاملی برای انجام هر کاری را دارد.

بعد از وارد کردن نام کاربری و پسورد معتبر شما به پنلی شبیه به زیر ارجاع داده می‌شوید:

تمام کارهایی که شما در قسمت edit پروژه اصلی می‌توانستید انجام دهید را در اینجا نیز می‌توانید انجام دهید، البته در اینجا همه دسترسی‌ها کامل‌تر است و همه چیز تحت کنترل شما قرار گرفته. همچنین بخش لاگ این پنل به شما کمک می‌کند تا از آخرین اتفاقات وبسایت خبردار شوید:

درک بحث اعتبارسنجی و احراز هویت

با پیشرفت کردن دنیای وبسایت‌ها و مدرن‌تر شدن آن‌ها، تعاملات کاربری بیشتری شکل گرفته است. حال این تعاملات می‌تواند از قرار دادن یک کامنت ساده در وبسایت شروع شود و به مواردی مانند قرار دادن محتوای جدید، پرداخت آنلاین و... ادامه یابد. حال اگر وبسایت شما به هر شکلی مانند یک شبکه آنلاین خرید یا فروشگاه اینترنتی باشد، سیستم‌های تعاملات کاربران که نیازمند احرازهویت و اعتبارسنجی هستند بسیار پیچیده‌تر خواهد شد.

مدیریت کاربران حتی در یک سطح عادی – فراموشی رمز عبور، فراموشی نام کاربری، بروزرسانی اطلاعات کاربری و...- نیز دشوار است، حال نوشتن چنین سیستمی از ابتدا می‌تواند واقعا دردسرساز و سخت باشد.

خوشبختانه برای ما توسعه‌دهندگان پایتون، جنگو از یک پیاده‌سازی پیشفرض استفاده می‌کند که در آن همه چیز از قابلیت مدیریت کاربران، گروه‌ها، مجوزهای دسترسی و کوکی‌ها به سادگی انجام پذیر است.

درست مانند تمام گزینه‌های دیگری که جنگو به ما می‌دهد، این پیاده‌سازی از سیستم احراز هویت و... نیز توسعه پذیر همراه با قابلیت شخصی‌سازی بالاست.

بررسی کلی

سیستم احراز هویت جنگو هم موضوع احراز هویت و هم موضوع اعتبارسنجی را بررسی می‌کند. اگر به صورت کوتاه بگوییم، احراز هویت سیستمی است که بودن یا نبودن یک کاربر را از نظر وجود در سیستم تایید می‌کند و اعتبارسنجی سطح دسترسی کاربر را بررسی می‌نماید. در این مطلب احراز هویت به هر دو حالت اطلاق می‌شود.

سیستم احراز هویت به صورت کلی شامل موارد زیر است:

  • کاربران
  • دسترسی‌ها: از طریق باینری (True/False) مدیریت می‌شود.
  • گروه‌ها: راهی بسیار مناسب برای دادن دسترسی به حجمی بالا از کاربران.
  • سیستم هشینگ پسورد
  • فرم‌هایی برای مدیریت اعتبارسنجی و احرازهویت کاربران
  • ابزارهای View در مدل MVT برای مدیریت ورود کاربران
  • سیستم قابل توسعه در بک‌-اند

در نسخه‌های ابتدای جنگو قابلیت‌های امنیتی زیادی برای سیستم احرازهویت وجود نداشت، حال اما در نسخه ۲ این موارد تا حدی حل شده اما هنوز برخی از آن‌ها به صورت پیشفرض می‌توانند مشکل آفرین باشند. اما به لطف داشتن جامعه توسعه کاربری بسیار بزرگ جنگو، ابزارهای بسیار زیادی وجود دارد که این مسئله را به خوبی حل می‌کند. برای مثال Oauth که پروتکلی امنیتی برای احراز هویت است از طریق ابزارهای مخصوص جنگو می‌تواند پیاده‌سازی شود.

استفاده از سیستم احراز هویت جنگو

User Objects

در هسته سیستم احرازهویت جنگو User Objects وجود دارد. شما از طریق این شئ می‌توانید محدودیت‌های مختلفی را در پروژه‌تان اعمال کنید. ثبت کاربران، ملحق کردن آن‌ها به نوشته‌ای خاص و... نیز به صورت کامل از طرف این شئ مدیریت می‌شود. اما با وجود آنکه گروه‌های کاری مختلفی وجود دارد، در خصوصیات پایه‌ای آن‌ها تفاوتی نیست. برای مثال ما کاربرانی مانند superuser و staff  را داریم که عملا به صورت پایه‌ای برابر هستند. اما محدود کردن دسترسی از طریق یک سری باینری فلگ انجام می‌پذیرد که در این ارتباط صحبت کردیم.

به صورت کلی هر کاربری که در User Objects تعریف می‌شود دارای خصوصیات زیر است:

  • username
  • password
  • email
  • first_name
  • last_name

ایجاد یک Superuser

ایجاد superuser در جنگو با استفاده از دستور createsuperuser انجام می‌شود:

python manage.py createsuperuser --username=joe --email=joe@example.com

البته اطلاعات اضافی مورد نیاز برای ورود بعد از وارد کردن دستور بالا به صورت prompt از شما پرسیده می‌شود.

ایجاد کاربر جدید

راحت‌ترین و کم خطاترین راهکار برای اضافه کردن کاربر جدید به وبسایت استفاده کردن از ادمین جنگو است. جنگو همچنین Viewها و Formهایی را ایجاد کرده که به سادگی شما را قادر می‌سازند تا قابلیت‌هایی مانند ورود، فراموشی رمز عبور، ثبت‌نام کاربران و... را در اپلیکیشن‌تان پیاده‌سازی می‌کنید.

در این قسمت برای ایجاد کاربری جدید قصد داریم از Shell مربوط به جنگو استفاده کنیم. در این محیط ما قابلیت استفاده از دستورات پایتون را داریم، از این رو به سادگی می‌توانیم با مدل شئ‌گرای ORM جنگو نیز کار بکنیم:

from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com',  'johnpassword')

حال همانطور که می‌توانید مشاهد بکنید، ما کاربری جدید با نام کاربری john، ایمیل lennon@thebeatles.com و رمز عبور johnpassword ایجاد کرده‌ایم. حال اگر بخواهیم ویژگی‌های دیگر آن را تغییر دهیم می‌توانیم به سادگی از حالت زیر استفاده نماییم:

>>> user.last_name = 'Lennon'
>>> user.save()

برای تغییر دادن رمز عبور کاربران ما دو راهکار بسیار ساده را داریم که می‌شود از آن‌ها استفاده کرد. یکی از طریق فایل manage.py و دیگری از طریق Shell.

۱- با وارد کردن دستور python manage.py changepassword username می‌توانیم رمز عبور کاربر username را به سادگی تغییر دهیم.

۲- برای استفاده کردن از Shell برای تغییر پسورد، شما ابتدا باید کاربر مورد نظرتان را با متد get دریافت کنید:

>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')

بعد از آن می‌توانید با استفاده از متد set_password() پسورد جدیدی را برای کاربر تعیین نمایید:

>>> u.set_password('new password')
>>> u.save()

اگر در بخش middleware در قسمت settings جنگو SessionAuthenticationMiddleware را فعال کرده باشید، این تغییر پسورد به صورت یک لاگ ظاهر می‌شود.

مجوز‌ها و اعتبار سنجی

در پنل ادمین جنگو، ما قابلیت ایجاد مجوزهای دسترسی برای کاربران را داریم. هر کدام از این مجوزها نیز نامی دارند که می‌شود تنها با assign کردن آن‌ها به یک کاربر و یا یک گروه کاربری آن‌ها را محدود کرد. سه مورد موجود از این مجوزها را می‌توان در زیر مشاهده کرد:

  • استفاده کردن از view «add» برای افزودن از طریق فرم‌های موجود تنها برای کاربرانی مقدور است که مجوز add را دارند.
  • استفاده کردن از view «change» برای تغییر از طریق فرم‌ها تنها برای کاربرانی مقدور است که مجوز change را دارند.
  • استفاده کردن از view «delete» برای تغییر از طریق فرم‌ها تنها برای کاربرانی مقدور است که مجوز delete را دارند.

شما جدای از پنل جنگو، می‌توانید این مجوزها را از طریق متدهای زیر نیز به User Object اعمال کنید:

  • has_add_permission()
  • has_change_permission()
  • has_delete_permission()

مجوزهای پیشفرض

در قسمت تنظیمات پروژه برای لیست INSTALLED_APPS می‌توانید django.contrib.auth را مشاهده کنید. این اپلیکیشن به صورت پیشفرض در تمام پروژه‌های جنگو وجود دارد. شما هر بار که عملیات migrate را روی مدل‌های دیتابیس خود اعمال کنید، این اپلیکیشن مجوز‌های پیشفرض add،  changeو delete را برای تمام مدل‌ها ایجاد می‌کند.

گروه‌ها

مدل‌ django.contrib.auth.models.Group یک راه منطقی و بسیار ساده برای دسته‌بندی کردن کاربران و قرار دادن آن‌ها در دسته‌بندی مشخصی است. شما می‌توانید از این طریق مجوز‌های کاربری را به صورت گروهی اعمال نمایید. شما می‌توانید یک کاربر را در هر چند گروه که بخواهید قرار دهید. مجوزهای دسترسی در این حالت override شده و چند مجوز به یک کاربر در این شرایط اعمال می‌شود.

ایجاد مجوز به صورت دستی

در حالیکه می‌شود از طریق class Meta در مدل‌های ساخته شده، مجوزهای دسترسی را به صورت دستی ایجاد کنید، اما یک روش مستقیم برای اینکار استفاده از خط فرمان است. برای مثال توسط بکنید که ما می‌خواهیم یک دسترسی can_publish را برای مدل BookReview در مدل books ایجاد کنیم. برای اینکار به صورت زیر عمل می‌کنیم:

from books.models import BookReview
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get_for_model(BookReview)
permission = Permission.objects.create(codename='can_publish',
                                       name='Can Publish Reviews',
                                       content_type=content_type

بعد از آن می‌شود از طریق خاصیت user_permissions مجوز مربوطه را به یک گروه و یا یک کاربر اعمال کرد.

بررسی وجود یک مجوز

اگر بخواهید به صورت سریع بعد از ارائه یک مجوز و یا ایجاد یک کاربر مجوزهای موجود برای آن کاربر را بررسی کنید، یکی از راحت‌ترین راه‌حل‌ها برای انجام چنین کاری استفاده کردن از رویکرد زیر است:

from django.contrib.auth.models import Permission, User
from django.shortcuts import get_object_or_404

def user_gains_perms(request, user_id):
    user = get_object_or_404(User, pk=user_id)
    # any permission check will cache the current set of permissions
    user.has_perm('books.change_bar')

    permission = Permission.objects.get(codename='change_bar')
    user.user_permissions.add(permission)

    # Checking the cached permission set
    user.has_perm('books.change_bar')  # False

    # Request new instance of User
    user = get_object_or_404(User, pk=user_id)

    # Permission cache is repopulated from the database
    user.has_perm('books.change_bar')  # True

    # ...

در پایان

هدف از ارائه این سه مقاله آشنا کردن شما با کلیت یک پروژه نسبتا ساده پایتون/جنگویی بود تا بتوانید با مهمترین بخش‌های توسعه چنین اپلیکیشنی آشنا شوید. مطمئنا همانطور که پیشتر گفته شد این پروژه صفر تا صد نبوده و تنها به چالش‌هایی پرداختیم که در این پروژه وجود دارد.

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
در انتظار ثبت رای

/@arastoo
ارسطو عباسی
کارشناس تولید و بهینه‌سازی محتوا

کپی رایتر، یوایکس رایتر، متخصص سئو محتوا و… عناوینی هستن که می‌تونم حرفه‌ام رو باهاشون خلاصه کنم اما جدای از این موارد، کتاب نوشتم، پادکست ضبط کردم، مارکتینگ محتوا انجام دادم و خلاصه تجربیات تا بخوایید در زمینه کلمات کسب کردم.

دیدگاه و پرسش

برای ارسال دیدگاه لازم است وارد شده یا ثبت‌نام کنید ورود یا ثبت‌نام

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

ارسطو عباسی

کارشناس تولید و بهینه‌سازی محتوا