Django的用户模块

本文深入探讨Django的用户认证系统,包括用户对象的基本属性、创建用户和超级用户的方法、密码管理、用户认证流程以及登录和登出操作。此外,还介绍了如何限制未登录用户访问特定页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

默认情况下Django认证系统的使用
  • Django支持扩展和自定义认证
  • Django的认证同时提供认证和授权,并通常统一称为认证系统,因为这些功能某些地方是耦合的
Use对象

User对象是认证系统的核心。它们通常表示与你的站点进行交互的用户,并用于启用限制访问、注册用户信息和给创建者关联内容等。在Django的认证框架中只存在一种类型的用户,因此诸如’superusers’或管理员’staff’用户只是具有特殊属性集的user对象,而不是不同类型的user对象。
默认user的基本属性有:

  • username
  • password
  • email
  • first_name
  • last_name
创建users
  • 创建users最直接的方法就是使用create_user()辅助函数:
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')

# At this point, user is a User object that has already been saved
# to the database. You can continue to change its attributes
# if you want to change other fields.
>>> user.last_name = 'Lennon'
>>> user.save()
  • 如果你已经安装了Django admin,你也可以交互式地创建users.
创建superusers

使用createsuperuser命令创建superusers:

$ python manage.py createsuperuser --username=joe --email=joe@example.com

将会提示你输入一个密码。在你输入一个密码后,该user将会立即创建。如果不带–username和–email选项,将会提示你输入这些值。

修改密码

修改密码有以下几种选择:

  • manage.py changepassword * uername *提供一种命令行修改User密码的方法。它提示你修改一个给定user的密码,你必须输入两次。如果它们匹配,新的密码将会立即修改。如果你没有提供user,命令行将尝试修改与当前系统用户匹配的用户名的密码。
  • 你也可以通过程序修改密码,使用set_password():
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
Django中User的一些常用的方法

https://yiyibooks.cn/xx/django_182/ref/contrib/auth.html#django.contrib.auth.models.User.set_password

认证Users

authenticate(**credentials)[source]

  • 请使用authenticate(),认证一组给定的用户名和密码。它接收关键字参数形式的凭证,使用默认配置时参数是username和password,如果密码能够匹配给定的用户名,它将返回一个User对象。如果密码无效,authenticate()返回None。例子:
from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
    # the password verified for the user
    if user.is_active:
        print("User is valid, active and authenticated")
    else:
        print("The password is valid, but the account has been disabled!")
else:
    # the authentication system was unable to verify the username and password
    print("The username and password were incorrect.")
  • 注意:这是认证一系列凭证的初级的方法;例如,它被RemoteUserMiddleware使用。除非你正在编写你自己的认证系统,否则你可能不会使用到它。当然如果你在寻找一种登录user的方法,请参见login_required()装饰器。
Web请求中的认证
  • Django使用会话和中间件来拦截request对象到认证系统中。
  • 它们在每个请求上提供一个request.user属性,表示当前的用户。如果当前的用户没有登入,改属性将设置User的实例。

你可以通过is_authenticated()区分它们,像这样:

if request.user.is_authenticated():
    # Do something for authenticated users.
    ...
else:
    # Do something for anonymous users.
    ...
如何登录一个用户

如果你有一个authenticated(认证:即经过了登录校验)了的用户,你想把它附着到当前的session(会话)中-这可以通过**login()**函数完成

login()[source]
  • 从view(视图)中登入一个用户,请使用login()。它接收一个HttpRequest对象和一个User对象。login()使用Django的session框架来将用户的ID进行保存在session中。
  • 注意:任何在匿名session中设置的数据,都会在用户登入后被保留在session总。

下面的实例向你演示如何使用authenticate()和login():

from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)
            # Redirect to a success page.
        else:
            # Return a 'disabled account' error message
            ...
    else:
        # Return an 'invalid login' error message.
        ...
  • 先调用authenticate():
  • 当你是手动(即非自动的,通过人工输入)登入一个用户时,你必须在调用login()之前通过authenticate()确认该用户已经成功登陆。authenticate()在用户上设置一个属性,通过这个属性,authentication backend(后端认证程序)可以验证该用户已经成功地登陆(相关的详细信息,请参阅后端文档),并且,这个信息在后面的登录过程中仍然需要。如果你试图(不经认证)直接login(登入)一个从数据库中取出的user object(用户对象),将会有出错提示。
如何登出一个用户

logout()[source]

  • 若要登出一个已经通过django.contrib.auth.login()登入的用户,可以在你的视图中使用django.contrib.auth.logout()。 它接收一个HttpRequest对象且没有返回值。例如:
from django.contrib.auth import logout

def logout_view(request):
    logout(request)
    # Redirect to a success page.
  • 注意,即使用户没有登入,logout()也不会抛出任何错误。
  • 当你调用logout()时,当前请求的会话数据将被完全清除。所有存在的数据都将清除。这是为了防止另外一个人使用相同的Web浏览器登入并访问前一个用户的会话数据。如果你想在用户登出之后>可以立即访问放入会话中的数据,请在调用django.contrib.auth.logout()之后放入。
只允许登录的用户访问
  • 如果是函数的话,可以使用Django的login_required装饰器
  • 如果是类的话,可以使用Django中mixin的as_view()方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值