خاص افتراضيًا
جزء من قسم المستخدمون والحسابات في رحلة 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.
التحدي
سهلاجعل كل صفحة خاصة افتراضيًا.
- في
settings.py، أضف"django.contrib.auth.middleware.LoginRequiredMiddleware"إلىMIDDLEWAREفي الموضع المناسب. - في
notes/views.py، أزل الأسطر الثلاثة التي تحتوي على@login_required، واتركsignupمتاحًا للزوار.
افتح / أثناء تسجيل الخروج: ستصل إلى صفحة تسجيل الدخول، وسيظل رابط Sign up يفتح نموذج التسجيل.
جرّب بنفسك
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