Django用户注册、登录、注销及扩展详解
本文详细讲解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时的一些经验,或许并不完全正确,仅供参考,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









