مشخصات مقاله
-
500
-
0.0
-
4639
-
0
-
0
آموزش session در Django
آموزش session (سشن) در Django
این آموزش زیر مجموعه ای از وبسایت LocalLibrary است که در آن یک visit-counter مبنی بر session به صفحه home اضافه میکنیم. این مثال به سادگی نشان میدهد که چگونه میتوانید با استفاده از session framework یک محیط پایدار، برای کاربران ناشناس، در وب سایت خود بسازید.
پیش نیاز آموزش Sessions framework در جنگو
تمامی بخش های قبل، شامل generic list و detail view ، را مطالعه کنید.
هدف :
آشنایی روش استفاده از session ها
نگاه کلی
در وب سایت LocalLibrary، که در بخش های قبل ساخته شد، کاربران میتوانند لیستی از کتاب ها و نویسندگان را مطالعه کنند. با اینکه محتوا به شکل پویا از دیتابیس استخراج میشود، اما تمامی کاربران، در هنگام استفاده از سایت، به اطلاعات یکسانی دسترسی پیدا میکنند.
در یک کتابخانه واقعی، کاربران با توجه به مراجعات قبلی به سایت، اولویت ها و ... داده ها را به شکل شخصی سازی شده مشاهده خواهند کرد. برای مثال، میتوانید برخی هشدار ها را به تشخیص کاربر قطع کرده و یا تعداد نتایج نمایش داده شده در هر صفحه را به سلیقه کاربر تغییر دهید.
session framework پیاده سازی این علمکرد ها را ممکن میکند و اجازه ایجاد تغییرات به ازای هر کاربر را به شما میدهد.
session چیست ؟
تمامی ارتباطات بین جستجوگر وب و سرور از طریق HTTP، که یک پرتکل stateless است، انجام میشود. stateless بودن پروتکل به این معناست که پیام های رد و بدل شده بین client و server کاملا مستقل از یکدیگر بوده و به شکل توالی عمل نمیکنند ( هر پیام مستقل از پیام قبلی است). پس اگر میخواهید وب سایت تان درخواست های کاربر را پی گیری کند، باید این عملکرد را در وب سایت خود پیاده سازی کنید.
session ها در Django ( و اینترنت ) مکانیزم هایی هستند که از طریق آنها میتوان “state” بین سایت و یک جستجو گر خاص را پی گیری کرد. با کمک session ها میتوانید اطلاعات را به ازای هر جستجوگر ذخیره کرده و همواره از این اطلاعات استفاده کنید. داده های شخصی مرتبط با session ها، که برای ذخیره و بازیابی اطلاعات استفاده میشوند، “key” نام دارند.
Django با استفاده از یک cookie ، که دارای یک session id خاص است ، جستجو گر ها و session های مرتبط با آنها در سایت را شناسایی میکند. به شکل پیش فرض، داده های session در دیتابیس سایت ذخیره میشوند( زیرا این کار امنیت بیشتری نسبت به ذخیره اطلاعات در cookie دارد). البته میتوانید این تنظیمات را تغییر داده و داده های session را در مکان دیگری ( cache، file، cookie امن) ذخیره کنید، اما گزینه ی پیش فرض مکانی مناسب و نسبتا امن است.
فعال کردن session
با ایجاد وب سایت پایه(skeleton website) ، session ها به شکل اتوماتیک فعال شده اند.
تنظیمات این بخش، همانطور در شکل زیر نمایش داده شده است، در فایل locallibrary/locallibrary/settings.py در section های INSTALLED_APPS و MIDDLEWARE قرار دارند:
INSTALLED_APPS = [
...
'django.contrib.sessions',
....
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
....
استفاده از session ها در جنگو
میتوانید از طریق پارامتر request به صفت session موجود در view دسترسی پیدا کنید ( یک HttpRequest به عنوان اولین آرگومان به view پاس داده میشود). این session ارتباط خاص با کاربر حال حاضر را نشان میدهد ( و یا به شکل دقیق تر، ارتباط با جستجو گر حال حآضر که به وسیله ی یک session id در cookie های جستجوگر برای این وب سایت مشخص شده است).
صفت session یک شی شبیه به dictionary است که میتوانید به تعداد دفعات لازم آن را در view خود read یا write کرده و به شکل دلخواه خود تغییرش دهید. همچنین میتوانید از تمامی عملیات معمول بر dictionary، مانند حذف تمام داده ها، تست وجود key، ایجاد حلقه بر داده ها و ...، استفاده کنید. اما اکثر مواقع تنها به standard dictionary API برای get و set کردن مقادیر نیاز خواهید داشت.
قطعه کد زیر به شما نشان میدهد که چگونه میتوانید با استفاده ازکلید “my_car” داده های مربوط به session مورد استفاده (جستجوگر) را get، set و حذف کنید:
یکی از مهمترین ویژگی های Django ، عدم نیاز به بررسی مکانیزم هایی است که session را در view با request شما مرتبط میکند. در قطعه کد زیر، اطلاعات my_car تنها با جستجوگری که درخواست را ارسال کرده در ارتباط است.
# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']
# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')
# Set a session value
request.session['my_car'] = 'mini'
# Delete a session value
del request.session['my_car']
API همچنین متد هایی برای مدیریت cookie های session در اختیار ما قرار میدهد. برای مثال، میتوانیم با استفاده از این متد ها، پشتیبانی جستجوگر از cookie ها را تست کنیم، تاریخ انقضا برای cookie ها تعیین کرده و آن را بررسی کنیم و session های منقضی شده را از داده های ذخیره شده حذف کنیم.
نحوه ذخیره داده های session در Django
به شکل پیش فرض، Django تنها در زمان تغییر و یا حذف session ، آن را در دیتابیس ذخیره کرده و session cookie را به client ارسال میکند. اگر مانند مثال قبل، با استفاده از session key داده ها را به روز رسانی کنید، با مشکلی مواجه نخواهید شد. مثلا:
# This is detected as an update to the session, so session data is saved.
request.session['my_car'] = 'mini'
اما اگر اطلاعات موجود در داده های session را به روز رسانی کنید، Django متوجه تغییری نشده و آن را ذخیره نمیکند ( مثلا، تغییر داده های “wheels” در “my_car” که در بخش زیر نمایش داده شده است). در این حالت باید ویرایش شدن session را صریحا مشخص کنید:
API همچنین متد هایی برای مدیریت cookie های session در اختیار ما قرار میدهد. برای مثال، میتوانیم با استفاده از این متد ها، پشتیبانی جستجوگر از cookie ها را تست کنیم، تاریخ انقضا برای cookie ها تعیین کرده و آن را بررسی کنیم و session های منقضی شده را از داده های ذخیره شده حذف کنیم.
نحوه ذخیره داده های session در Django
به شکل پیش فرض، Django تنها در زمان تغییر و یا حذف session ، آن را در دیتابیس ذخیره کرده و session cookie را به client ارسال میکند. اگر مانند مثال قبل، با استفاده از session key داده ها را به روز رسانی کنید، با مشکلی مواجه نخواهید شد. مثلا:
# Session object not directly modified, only data within the session. Session changes not saved!
request.session['my_car']['wheels'] = 'alloy'
# Set session as modified to force data updates/cookie to be saved.
request.session.modified = True
با اضافه کردن SESSION_SAVE_EVERY_REQUEST = True به تنظیمات پروژه (locallibrary/locallibrary/settings.py) میتوانید رفتار سایت را تغییر دهید و دیتابیس/ cookie های ارسالی را با هر درخواست به روز رسانی کنید.
مثال ساده – شمارش مراجعات
به عنوان یک مثال کاربردی، کتابخانه را به روز رسانی میکنیم تا تعداد دفعات مراجعه به صفحه اصلی LocalLibrary را به کاربر نمایش دهد.
/locallibrary/catalog/views.py را باز کرده و تغییرات زیر را بر آن اعمال کنید:
def index(request):
...
num_authors = Author.objects.count() # The 'all()' is implied by default.
# Number of visits to this view, as counted in the session variable.
num_visits = request.session.get('num_visits', 1)
request.session['num_visits'] = num_visits + 1
context = {
'num_books': num_books,
'num_instances': num_instances,
'num_instances_available': num_instances_available,
'num_authors': num_authors,
'num_visits': num_visits,
}
# Render the HTML template index.html with the data in the context variable.
return render(request, 'index.html', context=context)
در اینجا، ابتدا مقدار session_key ('num_visits') را دریافت کرده و آن را معادل 1 قرار میدهیم ( اگر قبلا مقدار دهی نشده باشد). با دریافت هر request، این مقدار را یک عدد افزایش داده، مقدار جدید را در session ذخیره کرده و درنهایت متغیر num_visits را در متغیر context به template ارسال میکنیم.
میتوانیم پشتیبانی از cookie ها در جستجو گر بررسی کرده و یا UI خود را طراحی کنیم که در این صورت پشتیبانی از cookie ها اهمیتی ندارد.
برای نمایش context variable، خط مشخص شده در انتهای بلوک زیر را به HTML template اصلی (/locallibrary/catalog/templates/index.html)، در انتهای بخش “Dynamic content” اضافه کنید:
Dynamic content
The library has the following record counts:
- Books: {{ num_books }}
- Copies: {{ num_instances }}
- Copies available: {{ num_instances_available }}
- Authors: {{ num_authors }}
You have visited this page {{ num_visits }} time{{ num_visits|pluralize }}.
تغییرات را ذخیره کرده و test server را restart کنید. با refresh کردن صفحه، این عدد به روز رسانی میشود.
خلاصه :
حالا میدانید که با استفاده از session ها میتوانید به راحتی با کاربران ناشناس ارتباط برقرار کنید.
در بخش بعد، framework های authentication و authorization را بررسی کرده و پشتیبانی از user accounts را به شما آموزش میدهیم .