Menu
CoddyTech

Standardmäßig privat

Teil des Abschnitts Benutzer und Konten der Django-Journey von Coddy. Lektion 7 von 16.

Eine Notiz-App ist privat: Fast nichts sollte für Besucher zugänglich sein. Wenn du jede Ansicht mit @login_required versiehst, ist die Seite öffentlich, sobald du es bei einer neuen Ansicht einmal vergisst.

Middleware ist Code, den jede Anfrage auf dem Weg zu einer Ansicht durchläuft; MIDDLEWARE in settings.py führt sie in der richtigen Reihenfolge auf. LoginRequiredMiddleware leitet alle Besucher, die nicht angemeldet sind, zu LOGIN_URL weiter, unabhängig davon, welche Seite sie aufrufen wollten. Sie liest request.user aus und muss deshalb nach AuthenticationMiddleware kommen, die diesen Wert setzt.

Dann markierst du die Seiten, die öffentlich bleiben. Ein Mitgliederclub hält seine Öffnungszeiten für alle zugänglich:

from django.contrib.auth.decorators import login_not_required


@login_not_required
def opening_hours(request):
    return render(request, "club/hours.html")

Djangos Anmeldeseite ist bereits markiert. Alle anderen Ansichten sind jetzt geschützt, daher können die Zeilen mit @login_required entfernt werden.

challenge icon

Aufgabe

Einfach

Mache standardmäßig jede Seite privat.

  1. Füge in settings.py "django.contrib.auth.middleware.LoginRequiredMiddleware" an der richtigen Stelle zu MIDDLEWARE hinzu.
  2. Entferne in notes/views.py die drei Zeilen mit @login_required und lasse signup für Besucher zugänglich.

Öffne /, während du abgemeldet bist: Du landest auf der Anmeldeseite, und der Link Sign up öffnet weiterhin das Registrierungsformular.

Probier es selbst

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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Benutzer und Konten

Übe selbstständig: Django-Playground