深入理解Django中内置的用户认证

深入理解Django中内置的用户认证攻略

Django是一款非常流行的开源Web框架,可以用于构建高效且安全的Web应用程序。Django内置了用户认证系统,可以方便地实现用户登录、注册等功能。本文将深入探讨Django中内置的用户认证系统,并提供两个示例说明。

用户认证系统概述

Django中的用户认证系统是通过Django自带的auth模块实现的,该模块提供了用户认证、用户管理等功能。用户认证系统的核心是User模型和AuthenticationMiddleware中间件。

User模型是Django中内置的用户模型,它保存了用户的基本信息(如用户名、密码、电子邮件等)。AuthenticationMiddleware中间件则用于验证用户是否已经登录,并在需要时将用户信息添加到请求对象中。

Django中的用户认证系统支持多种方式的登录认证,包括基于表单的认证、基于HTTP的认证、基于OAuth的认证等。我们将分别介绍这些认证方式。

基于表单的用户认证

基于表单的用户认证是Django中最常用的认证方式,也是最容易实现的。要启用基于表单的用户认证,可以在urls.py文件中添加以下代码:

from django.contrib.auth import views as auth_views

urlpatterns = [
    # ...
    path('login/', auth_views.LoginView.as_view(), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
    # ...
]

这段代码将会将/login//logout/路径映射到auth_views.LoginViewauth_views.LogoutView视图上。我们可以通过编写templates/registration/login.html模板文件来自定义登录页面的样式。

{% extends 'base.html' %}

{% block content %}
  <h2>Login</h2>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Login</button>
  </form>
{% endblock %}

此外,我们还需要在settings.py文件中配置登录和登出重定向的路径:

LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/login/'

现在,我们已经可以在应用程序中使用基于表单的用户认证了。用户可以在登录页面中输入用户名和密码进行登录,一旦登录成功,Django会将用户的信息添加到请求对象中,并重定向到LOGIN_REDIRECT_URL所定义的路径。

基于HTTP的用户认证

基于HTTP的用户认证是Django中的另一种常用的认证方式。该方式利用HTTP的基本认证和摘要认证机制对用户进行认证。要启用基于HTTP的用户认证,可以在urls.py文件中添加以下代码:

from django.contrib.auth.decorators import login_required
from django.contrib.auth.views import LoginView, logout_then_login
from django.urls import path

urlpatterns = [
    # ...
    path('protected/', login_required(lambda request: HttpResponse('Protected')), name='protected'),
    path('login/', LoginView.as_view(template_name='login.html'), name='login'),
    path('logout/', logout_then_login, name='logout'),
]

这段代码使用login_required装饰器保护/protected/路径,并将登录和登出视图分别映射到/login//logout/路径上。我们可以自定义模板文件来定制登录页面的样式。

{% extends 'base.html' %}

{% block content %}
  <h2>Login</h2>
  <form method="post">
    {% csrf_token %}
    <input type="text" name="username" placeholder="Username">
    <input type="password" name="password" placeholder="Password">
    <button type="submit">Login</button>
  </form>
{% endblock %}

此外,我们还需要在settings.py文件中配置登录和登出后的重定向路径:

LOGIN_REDIRECT_URL = '/protected/'
LOGOUT_REDIRECT_URL = '/login/'

现在,我们已经可以在应用程序中使用基于HTTP的用户认证了。用户必须输入正确的用户名和密码才能访问/protected/路径。

示例说明

我们将使用一个基于表单的用户认证示例和一个基于HTTP的用户认证示例来说明Django中的用户认证系统。

示例1:基于表单的用户认证

考虑一个简单的博客应用程序,我们需要为博客添加用户认证功能。为此,我们需要完成以下步骤:

  1. urls.py文件中定义/login//logout/路径:
from django.contrib.auth import views as auth_views

urlpatterns = [
    # ...
    path('login/', auth_views.LoginView.as_view(), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
    # ...
]
  1. settings.py文件中配置LOGIN_REDIRECT_URLLOGOUT_REDIRECT_URL路径:
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/login/'
  1. 自定义登录页面的样式。我们可以创建templates/registration/login.html模板文件,并添加如下内容:
{% extends 'base.html' %}

{% block content %}
  <h2>Login</h2>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Login</button>
  </form>
{% endblock %}

现在,用户就能够在博客应用程序的登录页面中输入用户名和密码,以此登录并访问受保护的页面。

示例2:基于HTTP的用户认证

假设我们正在开发一个基于RESTful API的应用程序,并使用Django REST framework。我们需要为API添加基于HTTP的用户认证功能,以确保API只能被授权的用户访问。为此,我们需要完成以下步骤:

  1. urls.py文件中定义/api/路径:
from django.urls import path, include
from rest_framework import routers, serializers, viewsets

from django.contrib.auth.decorators import login_required

from django.conf.urls import (handler400, handler403,handler404, handler500)

from .views import join,activate,logout_view, index, current_user

router = routers.DefaultRouter()


urlpatterns = [
    path('api/', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('api/current_user/', current_user),
    path('api/login/', join),
    path('api/register/', activate),
    path('api/logout/', logout_view),
]

handler400 = 'rest_framework.exceptions.bad_request'
handler403 = 'rest_framework.exceptions.forbidden'
handler404 = 'rest_framework.exceptions.not_found'
handler500 = 'rest_framework.exceptions.server_error'
  1. 使用login_required装饰器保护需要授权的URL。我们可以在视图函数中使用该装饰器,也可以在urls.py中使用该装饰器:
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse

@login_required
def protected_view(request):
    return HttpResponse('Hello, World!')

或者:

from django.contrib.auth.decorators import login_required
from django.urls import path
from .views import protected_view

urlpatterns = [
    # ...
    path('protected/', login_required(protected_view), name='protected'),
    # ...
]

这样,只有登录用户才能访问使用login_required装饰器保护的URL。

以上就是基于Django内置的用户认证系统实现用户认证的完整攻略,包含基于表单的用户认证和基于HTTP的用户认证两种示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解Django中内置的用户认证 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Django笔记十四之统计总数、最新纪录和空值判断等功能

    本篇笔记将介绍一些 Django 查询中统计总数、最新纪录和空值判断等功能。 count in_bulk latest、earliest first、last exists contains、icontains gt、gte、lt、lte startswith、istartswith isnull 1、count 返回查询的 QuerySet 的总数。 比如…

    2023年4月10日
    00
  • Django项目中表的查询的操作

    在 Django 项目中进行表的查询操作是开发过程中非常常见的任务,可以用来获取表中的特定实例或者实例集合,以便将它们展示给用户、对它们进行修改,等等。在本篇文章中,我们将深入探讨 Django 中表的查询操作的完整攻略。 一、查询操作的基本语法 Django 中查询操作是通过模型对象(即 models.py 中的模型定义)来实现的。最简单的查询方法是对模型…

    Django 2023年5月16日
    00
  • django 开发之给admin 模块添加富文本编辑器

    第一步下载kindeditor  http://kindeditor.net/demo.php 下载下来后放到静态文件static 下面的js下面   接着在admin 模块文章类下引入这富文本编辑器: class ArticleAdmin(admin.ModelAdmin): 下面   接着添加一个文件名字为config.js  添加一些配置  

    2023年4月9日
    00
  • Django模板标签完整攻略(详解版)

    Django模板标签是用于在模板中动态地展示或操作数据的一种方式。Django自带了许多标签,如 {% if %}、{% for %}、{% url %}等,同时也支持自定义标签。下面详细介绍Django模板标签的语法和用法。 模板标签语法 Django模板标签以“{%”开头,“%}”结尾,如下所示: {% tag %} 其中,tag是标签的名称,具体使用方…

    Django 2023年3月13日
    00
  • Django Cannot assign “A1”: “B1” must be a “C1” instance. 错误信息

    常见报错 Cannot assign “A1”: “B1” must be a “C1” instance. 告诉我们 必须使用 C1 模型类的 实例,而不是具体的参数值。 1 这个错误信息,是我写入数据库时,表中使用了外键造成的 2 3 如果外键用fid表示,关联 用户表 User的话 4 5 6 写入数据库时 Book.objects.create(fi…

    Django 2023年4月9日
    00
  • 如何分离django中的媒体、静态文件和网页

    在 Django 中,通常将静态文件和媒体文件分别存储在不同的目录中,以提高应用程序的效率和灵活性。下面是如何分离 Django 中的静态文件、媒体文件和网页的完整攻略: 1. 创建静态文件目录 首先,要在 Django 应用程序的根目录中创建一个名为 static/ 的目录。添加一个名称为 staticfilesfolders.py 的文件,其中包含以下代…

    Django 2023年5月16日
    00
  • Django使用celery异步发邮件

    Celery是Python开发的分布式任务调度模块,包含以下组件: Celery Beat: 任务调度器,自带的 Celery Worker: 执行任务的消费者,通常设置多个 Broker: 消息代理,就是任务队列,我们使用redis Producer: 任务生产者,要执行的函数加上@app.task Result Backend: 结果保存,还是redis…

    Django 2023年4月11日
    00
  • [TimLinux] django 全局变量在WSGI多进程多线程环境中的研究

    场景1: 2个进程,每个进程1个线程,请求函数中设置了10秒sleep,9个请求同一URL: 结果: 1. 全局变量ID值,在每一个进程中相同,不同进程中不相同 2. 并行只能接受2个请求,同时发起多个请求,则需要排队等待处理   场景2: 1个进程,每个进程2个线程,请求函数中设置了10秒sleep,9个请求同一URL: 结果: 1. 全局变量ID值,在单…

    Django 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部