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.
Thử thách
DễMặc định, hãy đặt mọi trang ở chế độ riêng tư.
- Trong
settings.py, thêm"django.contrib.auth.middleware.LoginRequiredMiddleware"vàoMIDDLEWARE, đúng vị trí. - Trong
notes/views.py, xóa ba dòng@login_requiredvà để 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 = "/"
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