Django内置身份验证系统
介绍:
在本文中,我将向您解释如何创建具有基本登录和注销身份验证过程的简单 Django 项目。Django 具有内置身份验证系统和内置视图,您可以使用它们使用自己的模板快速轻松地创建用户身份验证。
创建 Django 项目:
在 IDE 或终端中创建一个新项目,然后转到您创建的文件夹。创建一个虚拟环境。
现在在虚拟环境中安装依赖项:
pip install django python-decouple ipyhton
您可以将多个依赖项链接在一起。为项目安装 Django。`python-decouple` 用于 `.env` 文件,您可以在其中放置所有秘密环境变量,例如 `SECRET_KEY` 或所有电子邮件配置等。而 `ipython` 是 shell 的一个好工具。
成功安装依赖项后,将它们存储在根目录中的文件中:
pip freeze > requirements.txt
`pip freeze` 列出终端中的所有依赖项
`> requirements.txt` 这会将所有已安装的依赖项保存在名为 `requirements.txt` 的文件中或创建该文件。
现在使用以下命令在虚拟环境中构建你的 Django 项目:
django-admin startproject authentication .
项目名称后面的“。”是在根目录中创建Django项目目录。
在 Django 项目中创建第一个应用程序后:
python manage.py startapp accounts
该应用程序必须添加到“authentication”项目目录内的“settings.py”文件中的“INSTALLED_APPS”中。
# authentication/settings.py
# Application definition
INSTALLED_APPS = [
"accounts",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
]如果您想创建自己的自定义身份验证模板,您需要确保您创建的应用程序“accounts”位于“django.contrib.admin”应用程序之前。
确保项目的安全:
为了确保项目的安全,您应该将`SECRET_KEY`,`DEBUG`,`ALLOWED_HOSTS`等存储在本地存储的`.env`文件中。
在你的终端中输入上述命令来创建一个安全的“SECRET_KEY”:
python manage.py shell -c 'from django.core.management import utils; print(utils.get_random_secret_key())'
在根目录中创建一个 `.env` 文件并添加:
# general project variables: SECRET_KEY="r^=cy=8w8$^p)!gd6#%*c)s-u4h!ua9r6!i317qt^6l47)94t^" DEBUG=True ALLOWED_HOSTS=localhost,127.0.0.1
为了能够启动开发服务器,您需要有权访问项目变量,例如“SECRET_KEY”。您需要确保您的“settings.py”文件可以访问存储在“.env”文件中的环境变量。
通过安装“python-decouple”,第一步已经完成。现在更新“settings.py”文件:
# authentication/settings.py
from decouple import config
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = config("SECRET_KEY")
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = config("DEBUG")
ALLOWED_HOSTS = config("ALLOWED_HOSTS", default="").split(",")`ALLOWED_HOSTS` 应该是一个列表。我们已将值作为逗号分隔的字符串存储在 `.env` 文件中。在 `settings.py` 文件中,我们在 `,` 处拆分逗号分隔的字符串,并从中创建一个列表。
您需要创建的下一个文件是“.gitignore”文件,以避免将您的环境变量发送到 GitHub 或 GitLab。
# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # Django stuff: *.log *.pot *.pyc # virtual environment .venv # IDE .idea # Local configuration .env
这个 `.gitignore` 文件仅仅是一个示例,根据您的 IDE,您的文件可能会有所不同。
创建用户模型:
使用“AbstractUser”创建自己的用户模型是一种很好的做法:
# accounts/models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass如果有必要,您可以在“User”类中添加其他属性。
下一步是将“User”模型添加到管理面板。这样,您就可以轻松地从管理面板创建“User”实例。您还可以在 Python shell 中创建“User”实例。
# accounts/models.py from django.contrib import admin from django.contrib.auth import get_user_model from django.contrib.auth.admin import UserAdmin UserModel = get_user_model() admin.site.register(UserModel, UserAdmin)
在“settings.py”文件中,我们需要设置我们创建的“User”,以告诉项目我们想要使用我们自定义的“User”模型。
# authentication/settings.py # set the User AUTH_USER_MODEL = "accounts.User"
下一个命令在“accounts”应用程序中创建迁移文件,并在 SQLite 数据库中创建数据库表。
python manage.py makemigrations python manage.py migrate
现在,是时候在终端中创建一个管理员用户了:
python manage.py createsuperuser Username: Admin Email address: admin@mail.com Password: Password (again): Superuser created successfully.
记住或保存这些身份验证详细信息以供将来使用。
设置身份验证 URL 并创建自定义身份验证模板:
当我们将“accounts”名称添加到“settings.py”中的“INSTALLED_APPS”列表时,新的应用程序已经添加到项目中,但我们需要将“accounts”应用程序的所有未来 URL 模式集成到项目 URL 文件中:
# authentication/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("accounts/", include("accounts.urls", namespace="accounts")),
]我们将包含“accounts”应用程序的所有 url 模式,这些 url 模式将位于“accounts”命名空间下。
在“accounts”应用程序中,创建一个名为“urls.py”的新文件并添加以下内容:
# accounts/urls.py
from django.urls import path, include
app_name = "accounts"
urlpatterns = [
path("", include("django.contrib.auth.urls")),
]`app_name` 应该与身份验证 `urls.py` 文件中 `path()` 函数内的 `namespace` 属性相同。
如果你使用以下命令启动开发服务器:
python manage.py runserver
并导航到 URL:“http://127.0.0.1:8000/accounts/”,您将可以访问以下 URL 模式:
admin/ accounts/ login/ [name='login'] accounts/ logout/ [name='logout'] accounts/ password_change/ [name='password_change'] accounts/ password_change/done/ [name='password_change_done'] accounts/ password_reset/ [name='password_reset'] accounts/ password_reset/done/ [name='password_reset_done'] accounts/ reset// / [name='password_reset_confirm'] accounts/ reset/done/ [name='password_reset_complete']
让我们创建一个测试用户并导航到 `http://127.0.0.1:8000/admin/`。输入我示例中的 `username`:Admin 以及使用 `python manage.py createsuperuser` 命令设置的 `password`。
在“帐户”标题下,您可以添加新“用户”。输入用户名和两次密码并保存。然后您必须输入其他信息,例如姓和名以及电子邮件地址,然后再次保存。
登录和注销视图:
我们将创建的第一个模板是“accounts”应用程序中的“base.html”模板。首先在“accounts”应用程序内创建一个名为“templates”的目录,然后在“templates”目录中创建一个名为“base.html”的文件:
{% block title %}{% endblock %} Authentication {% if request.user.is_authenticated %} {% endif %} {% if request.user.is_authenticated %} Hello {{ request.user.first_name|default:request.user.username }}, {% else %} Log-in {% endif %}{% block content %} {% endblock %}
在我的案例中,URL 语法始终在 URL 名称前加上应用程序名称 `accounts`,否则将找不到 URL 名称。如果身份验证 URL 在命名空间中,则必须添加应用程序名称。
我们将创建三个附加模板,一个登录模板、一个logging_out模板和一个用户成功登录后的模板,即仪表板。
{% extends "base.html" %}
{% block title %}Log-in{% endblock %}
{% block content %}
Log-in
{% if form.errors %}
Your username and password didn't match.
Please try again.
{% else %}
Please, use the following form to log-in.
{% endif %}
{% endblock %}
{% extends "base.html" %}
{% block title %}Logged out{% endblock %}
{% block content %}
Logged out
You have been successfully logged out.
You can log-in again.
{% endblock %}确保使用模板名称:“logged_out”,否则该模板将被忽略。
{% extends "base.html" %}
{% block title %}Dashboard{% endblock %}
{% block content %}
Dashboard
Welcome to your dashboard.
{% endblock %}这还没有完成。我们需要为仪表板创建视图和 URL,并在“settings.py”文件中设置一些变量。
# accounts/views.py
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
@login_required
def dashboard(request):
return render(request, "dashboard.html", {"section": "dashboard"})只有经过身份验证的用户才能访问此视图,我们使用“login_required”装饰器来确保这一点。
# accounts/urls.py
from django.urls import path, include
from accounts.views import dashboard
app_name = "accounts"
urlpatterns = [
path("", include("django.contrib.auth.urls")),
path("", dashboard, name="dashboard"),
]在“settings.py”文件中,我们必须设置一些变量来确保登录后重定向到我们的仪表板 URL:
# authentication/settings.py LOGIN_REDIRECT_URL = "accounts:dashboard" LOGIN_URL = "login" LOGOUT_URL = "logout"
`LOGIN_REDIRECT_URL` 指向 `accounts` 应用程序内的仪表板 URL 模式。