在 Django 的开发中,有时候需要通过代码对用户进行操作,主要涉及用户的创建,密码管理以及用户的鉴权。本文将常用的代码片段记录如下:

用户管理部分

涉及用户的创建,登录以及判断登录状态,代码片段如下:

创建用户

from django.contrib.auth.models import User
new_user = User.objects.create_user('username', 'username@example.com', 'password')
new_user.save()

用户登录

from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    
    if user is not None:
        login(request, user)
    else:
        print("Cannot login")

用户登出

from django.contrib.auth import logout

def logout_view(request):
    logout(request)

网页请求认证

对于网页请求,Django 提供了一个 request.user 的对象,如果当前用户是登录状态,则会生成有一个 User 的实例,否则生成一个 AnonymousUser 的实例。

那么如何判断用户是否登录了呢?可以使用 is_authenticated()

if request.user.is_authenticated:
    print("Log in")
else:
    print("Not Log in")

判断登录

一般的方法:

def my_view(request):
    if not request.user.is_authenticated:
        print("Not login")

优雅的方式是使用装饰器 @login_required 或者 Mixin class MyView(LoginRequiredMixin, View)

自定义用户登录限制

如果需要验证一些特别的用户属性,比如用户是否具有手机号,可以使用 user_passes_test()

from django.contrib.auth.decorators import user_passes_test

def cellphone_check(user):
    return user.cellphone is not None
    
@user_pass_test(cellphone_check):
def my_view(request):
    pass

此外,还可以使用 permission_required() 来验证相应用户权限

from django.contrib.auth.decorators import permission_required

@permission_requried('polls.can_vote')
def my_view(request):
    pass

用户修改密码

from django.contrib.auth.models import User
current_user = User.objects.get(username='username')
current_user.set_password('new password')
current_user.save()

当用户修改密码以后,原来的 Session 就会失效,此时需要使用 update_setssion_auth_hash()

from django.contrib.auth import update_session_auth_hash

def password_change(request):
    if request.method == 'POST':
        form = PasswordChangeForm(user=request.user, data=request.POST)
        if form.is_valid():
            form.save()
            update_session_auth_hash(request, form.user)
    else:
        pass

判断用户鉴权状态

from django.contrib.auth import authenticate
user = authenticate(username='username', password='password')
if user is Not None:
    print("Success!")
else:
    print("Failed")