Django用户注册、登录、注销及扩展详解

橘子海
橘子海
发布时间:2026-10-13 | 2人浏览过
原创

本文详细讲解Django中用户系统的核心功能,包括利用auth框架实现登录与注销,通过User模型处理注册及密码加密,并重点介绍使用Profile方式扩展用户信息(如手机号)。内容涵盖视图编写、表单验证、数据库同步及Admin后台配置,帮助开发者构建完整的用户管理体系。

用户模块是网站的基础功能之一,Django对此提供了完善的封装。我们只需在Django原有基础上进行少量修改,即可实现预期的用户管理效果。

本文假设您已具备Django中Session、Cookie、数据库操作及Admin后台的基本知识。若对这些概念尚不熟悉,建议先参考相关教程:http://djangobook.py3k.cn/2.0/。

1、用户登录功能:

首先,假设存在如下所示的登录界面:

处理登录请求的视图代码如下:

def userLogin(request): 
  curtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()); 
     
  if request.method=='POST': 
    print("POST") 
    username=request.POST.get('name','') 
    password=request.POST.get('password','') 
    user= auth.authenticate(username=username,password=password)#a*********** 
    if user and user.is_active: 
      auth.login(request, user)#b************ 
      return HttpResponseRedirect("/user") 
        
  return render_to_response("blog/userlogin.html",RequestContext(request,{'curtime':curtime}))  

注:a、此处使用Django内置的auth框架验证用户名和密码。有人可能认为这种方式不够灵活,例如希望支持邮箱登录。后续我们将介绍如何直接使用django.contrib.auth.models.User模型操作用户数据,从而实现自定义验证逻辑。 b、用户信息验证通过后,需将登录状态写入Session中。

2、用户注销功能:

注销操作相对简单,只需从Session中删除对应的user信息即可。

def userLogout(request): 
  auth.logout(request) 
  return HttpResponseRedirect('/user') 

3、用户注册功能:

注册界面如下所示:

用户名、密码和邮箱是Django自带的注册基本信息。下方的电话号码属于扩展的用户信息,关于如何扩展用户信息,下文将详细说明。此处我采用的是Profile扩展方式(个人偏好,认为此方式简单明了)。

注册视图(View)代码如下:

def userRegister(request): 
  curtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()); 
   
  if request.user.is_authenticated():#a******************* 
    return HttpResponseRedirect("/user") 
  try: 
    if request.method=='POST': 
      username=request.POST.get('name','') 
      password1=request.POST.get('password1','') 
      password2=request.POST.get('password2','') 
      email=request.POST.get('email','') 
      phone=request.POST.get('phone','') 
      errors=[] 
       
      registerForm=RegisterForm({'username':username,'password1':password1,'password2':password2,'email':email})#b******** 
      if not registerForm.is_valid(): 
        errors.extend(registerForm.errors.values()) 
        return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime,'username':username,'email':email,'errors':errors})) 
      if password1!=password2: 
        errors.append("两次输入的密码不一致!") 
        return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime,'username':username,'email':email,'errors':errors})) 
         
      filterResult=User.objects.filter(username=username)#c************ 
      if len(filterResult)>0: 
        errors.append("用户名已存在") 
        return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime,'username':username,'email':email,'errors':errors})) 
       
      user=User()#d************************ 
      user.username=username 
      user.set_password(password1) 
      user.email=email 
      user.save() 
      #用户扩展信息 profile 
      profile=UserProfile()#e************************* 
      profile.user_id=user.id 
      profile.phone=phone 
      profile.save() 
      #登录前需要先验证 
      newUser=auth.authenticate(username=username,password=password1)#f*************** 
      if newUser is not None: 
        auth.login(request, newUser)#g******************* 
        return HttpResponseRedirect("/user") 
  except Exception,e: 
    errors.append(str(e)) 
    return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime,'username':username,'email':email,'errors':errors})) 
   
  return render_to_response("blog/userregister.html",RequestContext(request,{'curtime':curtime})) 

注:

a、首先验证用户是否已登录,若已登录则无需再次注册(这仅是练习用途,实际生产环境逻辑可能不同)。

b、注册表单提交的数据需要进行基本验证,关于如何验证表单数据,可参考教程:http://djangobook.py3k.cn/2.0/chapter07/。

c、使用User模型查找待注册的用户名是否存在,若用户已存在,则提示客户更换用户名。

d、直接利用User模型将通过验证的用户数据存入数据库。需注意,保存密码时必须使用set_password方法,因为涉及加密过程。

e、存储用户的扩展信息(此处为电话号码),这里使用了自定义的用户扩展模型UserProfile,具体扩展方法将在后文讲解。

f、用户登录前需先进行验证,否则可能会出错。

g、用户登录逻辑。

4、用户扩展:

网上关于Django用户扩展的方式有多种,个人更倾向于Profile方式,因其步骤简单清晰。扩展步骤如下:

A、在App的models.py中新建一个UserProfile模型。

from django.contrib.auth.models import User 
     
class UserProfile(models.Model): 
  user=models.OneToOneField(User,unique=True,verbose_name=('用户'))#a****** 
  phone=models.CharField(max_length=20)#b****** 

注:a、UserProfile本质上是一个普通Model,通过以下语句与Django的User模型建立关联。

b、扩展的用户信息字段。

B、执行python manage.py syncdb命令,在数据库中创建userprofile表。

C、如何调用user的扩展信息?方法很简单,先获取user对象,然后通过user提供的get_profile()方法获取profile对象,例如:

user.get_profile().phone

D、如何更新和存储user的profile信息?在之前的用户注册部分我们已经使用了此功能。UserProfile也是一个Model,只要通过user模型获取user的id,即可通过UserProfile模型操作对应的profile信息:

user=User() 
user.username=username 
user.set_password(password1) 
user.email=email 
user.save() 
#用户扩展信息 profile 
profile=UserProfile() 
profile.user_id=user.id 
profile.phone=phone 
profile.save() 

E、既然我们能在程序中操作用户扩展信息,那么在Admin后台中编辑扩展信息该如何操作呢?

很简单,只需在APP的admin.py中添加以下语句即可:

class UserProfileInline(admin.StackedInline): 
  model=UserProfile 
  fk_name='user' 
  max_num=1 
   
class UserProfileAdmin(UserAdmin): 
  inlines = [UserProfileInline, ] 
   
admin.site.unregister(User) 
admin.site.register(User,UserProfileAdmin) 

这是我学习Django时的一些经验,或许并不完全正确,仅供参考,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表