خاص افتراضيًا
جزء من قسم المستخدمون والحسابات في رحلة Django على Coddy. الدرس 7 من 16.
تطبيق تدوين الملاحظات خاص: ينبغي ألا يكون أي شيء تقريبًا متاحًا للزوار. عند استخدام @login_required في كل عرض، فإن نسيان إضافته إلى عرض جديد يجعل تلك الصفحة عامة.
البرمجيات الوسيطة هي شيفرة تمر عبرها كل طلبات الاستجابة في طريقها إلى عرض؛ وتسرد MIDDLEWARE في settings.py هذه البرمجيات بالترتيب. يرسل LoginRequiredMiddleware كل زائر لم يسجّل الدخول إلى LOGIN_URL، أيًا كانت الصفحة التي طلبها. يقرأ request.user، لذا يأتي بعد AuthenticationMiddleware الذي يعيّنه.
بعد ذلك، تحدد الصفحات التي ستظل متاحة للعامة. يتيح نادٍ للأعضاء ساعات العمل لأي شخص:
from django.contrib.auth.decorators import login_not_required
@login_not_required
def opening_hours(request):
return render(request, "club/hours.html")صفحة تسجيل الدخول في Django محددة مسبقًا. أصبحت كل العروض الأخرى محمية الآن، لذا يمكن حذف أسطر @login_required.
التحدي
سهل- فعِّل
"django.contrib.auth.middleware.LoginRequiredMiddleware"فيMIDDLEWARE، في الموضع الصحيح. - أزل أسطر
@login_requiredالثلاثة. - لا يزال بإمكان الزائر فتح
/signup/وإنشاء حساب.
اضغط على «تشغيل»: تُفتح / على صفحة تسجيل الدخول. ثم اتبع رابط التسجيل.
جرّب بنفسك
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = "django-insecure-change-me"
DEBUG = True
ALLOWED_HOSTS = []
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"notes",
]
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
ROOT_URLCONF = "mysite.urls"
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
AUTH_PASSWORD_VALIDATORS = [
{"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator"},
{"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator"},
{"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator"},
{"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator"},
]
LANGUAGE_CODE = "en-us"
TIME_ZONE = "UTC"
USE_I18N = True
USE_TZ = True
STATIC_URL = "static/"
LOGIN_REDIRECT_URL = "/"
LOGOUT_REDIRECT_URL = "/"
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المستخدمون والحسابات
تدرّب بنفسك: Playground لـ Django