- 注册action里,除了现实注册功能外,紧接着还进行了登录功能。
- _login(request,username,password)是我们写的可重用方法,因为在login里会用得到,所以我们抽象出来了,其中里面实现的东西,大多是应用auth模块的内置函数。代码:
- def _login(request,username,password):
- '''登陆核心方法'''
- ret=False
- user=authenticate(username=username,password=password)
- if user:
- if user.is_active:
- auth_login(request,user)
- ret=True
- else:
- messages.add_message(request, messages.INFO, _(u'用户没有激活'))
- else:
- messages.add_message(request, messages.INFO, _(u'用户不存在'))
- return ret
- 其中authenticate和auth_login事关键的函数,需要在auth模块里import出来:
- from django.contrib.auth import authenticate, login as auth_login ,logout as auth_logout
- auth_login是我们起的一个别名,原名是login,我们起别名是防止命名冲突,再者更好理解点。authenticate顾名思义,是通过昵称和密码 验证该用户,返回一个User实体;login内部进行不少的操作(初始化必要的request字段),但我们暂且不用关心这些,我们只需知道传一个用户实体,它会帮我们做好登录操作即可。
- _login(request,username,password)抽象出来,我们接下来做登录视图的时候,用到它。代码如下:
- def login(request):
- '''登陆视图'''
- template_var={}
- form = LoginForm()
- if request.method == 'POST':
- form=LoginForm(request.POST.copy())
- if form.is_valid():
- _login(request,form.cleaned_data["username"],form.cleaned_data["password"])
- return HttpResponseRedirect(reverse("index"))
- template_var["form"]=form
- return render_to_response("accounts/login.html",template_var,\
- context_instance=RequestContext(request))
- 这个视图流程和注册流程相似,首先初始化未绑定的相应的表单,当点击登录按钮的时候,views会验证输入的数据是否合格,合格后才做相应的操作,也就是登录操作,我们上面已经写好了登录的方法_login,直接引用即可。
- 其中LoginForm 是登录的form,这是我们在写views时预先做好的,仅仅两个字段:昵称和密码:
- class LoginForm(forms.Form):
- username=forms.CharField(label=_(u"昵称"),max_length=30,widget=forms.TextInput(attrs={'size': 20,}))
- password=forms.CharField(label=_(u"密码"),max_length=30,widget=forms.PasswordInput(attrs={'size': 20,}))
- 这个比注册的form简单些,没有做手动的验证,只是生成表单用。
- 这样登录功能就算完成了。
Django auth登录
最新推荐文章于 2024-08-01 14:20:54 发布