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 %}


  
{% if request.user.is_authenticated %} {% endif %} {% if request.user.is_authenticated %} Hello {{ request.user.first_name|default:request.user.username }},
{% csrf_token %}
{% 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 模式。

  • Django 文档:Django 身份验证系统身份验证视图
  • GitHub 存储库:URL 模式视图