Menu
CoddyTech

Riêng tư theo mặc định

Thuộc phần Người dùng và tài khoản trong hành trình Django của Coddy. Bài học 7 trên 16.

Ứng dụng ghi chú cần riêng tư: hầu như không trang nào nên mở cho khách truy cập. Nếu bạn thêm @login_required vào mọi view, chỉ cần quên thêm vào một view mới, trang đó sẽ công khai.

Middleware là code mà mọi yêu cầu đều đi qua trước khi đến view; MIDDLEWARE trong settings.py liệt kê middleware theo thứ tự. LoginRequiredMiddleware chuyển mọi khách truy cập chưa đăng nhập đến LOGIN_URL, bất kể họ yêu cầu trang nào. Middleware này đọc request.user, vì vậy nó phải đứng sau AuthenticationMiddleware, thành phần thiết lập giá trị đó.

Sau đó, bạn đánh dấu những trang vẫn mở công khai. Câu lạc bộ thành viên vẫn công khai giờ mở cửa cho tất cả mọi người:

from django.contrib.auth.decorators import login_not_required


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

Trang đăng nhập của Django đã được đánh dấu sẵn. Giờ đây, mọi view khác đều được bảo vệ, nên bạn có thể xóa các dòng @login_required.

challenge icon

Thử thách

Dễ

Mặc định, hãy đặt mọi trang ở chế độ riêng tư.

  1. Trong settings.py, thêm "django.contrib.auth.middleware.LoginRequiredMiddleware" vào MIDDLEWARE, đúng vị trí.
  2. Trong notes/views.py, xóa ba dòng @login_required và để khách truy cập vẫn mở được trang đăng ký.

Khi chưa đăng nhập, mở /: bạn sẽ đến trang đăng nhập, còn liên kết Sign up vẫn mở biểu mẫu đăng ký.

Tự làm thử

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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Người dùng và tài khoản

Tự luyện tập: Playground Django