Menu
CoddyTech

По умолчанию — приватно

Часть раздела Пользователи и учетные записи путешествия по Django на Coddy. Урок 7 из 16.

Приложение для заметок — личное: почти всё должно быть закрыто для посетителей. Если добавить @login_required к каждому представлению, то в тот день, когда вы забудете сделать это для нового представления, эта страница станет общедоступной.

Middleware — это код, через который проходит каждый запрос на пути к представлению; в settings.py список MIDDLEWARE задаёт порядок его выполнения. 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Проверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Пользователи и учетные записи

Потренируйтесь самостоятельно: Песочница Django