Menu
CoddyTech

Privado de forma predeterminada

Parte de la sección Usuarios y cuentas del Journey de Django de Coddy. Lección 7 de 16.

Una aplicación de notas es privada: casi nada debería estar abierto a los visitantes. Si usas @login_required en cada vista, el día que se te olvide en una vista nueva, esa página será pública.

El middleware es código por el que pasa cada solicitud antes de llegar a una vista; MIDDLEWARE en settings.py lo enumera en orden. LoginRequiredMiddleware envía a LOGIN_URL a todos los visitantes que no hayan iniciado sesión, sin importar qué página hayan solicitado. Lee request.user, así que va después de AuthenticationMiddleware, que lo establece.

Después marcas las páginas que siguen siendo públicas. Un club para socios mantiene su horario de apertura disponible para todo el mundo:

from django.contrib.auth.decorators import login_not_required


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

La página de inicio de sesión de Django ya está marcada. Ahora todas las demás vistas están protegidas, así que puedes quitar las líneas @login_required.

challenge icon

Desafío

Fácil

Haz que todas las páginas sean privadas de forma predeterminada.

  1. En settings.py, añade "django.contrib.auth.middleware.LoginRequiredMiddleware" a MIDDLEWARE, en el lugar correcto.
  2. En notes/views.py, elimina las tres líneas @login_required y deja signup abierto a los visitantes.

Abre / mientras no hayas iniciado sesión: llegarás a la página de inicio de sesión, y el enlace Sign up seguirá abriendo el formulario de registro.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Usuarios y cuentas

Practica por tu cuenta: Playground de Django