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.
Aufgabe
EinfachMache standardmäßig jede Seite privat.
- Füge in
settings.py"django.contrib.auth.middleware.LoginRequiredMiddleware"an der richtigen Stelle zuMIDDLEWAREhinzu. - Entferne in
notes/views.pydie drei Zeilen mit@login_requiredund lassesignupfü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 = "/"
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