Menu
CoddyTech

خاص افتراضيًا

جزء من قسم المستخدمون والحسابات في رحلة 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.

challenge icon

التحدي

سهل

اجعل كل صفحة خاصة افتراضيًا.

  1. في settings.py، أضف "django.contrib.auth.middleware.LoginRequiredMiddleware" إلى MIDDLEWARE في الموضع المناسب.
  2. في 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 = "/"
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المستخدمون والحسابات

تدرّب بنفسك: Playground لـ Django