五 Django 1.5.4 User Authentication 用户认证
一.創(chuàng)建drinker app
?
./manage.py startapp drinker在INSTALL_APPS添加drinker
用戶(hù)的Profile模型,django里面是可以自定義的。
通過(guò)在settings.py里面指定AUTH_PROFILE_MODULE變量的值就可以了。
AUTH_PROFILE_MODULE = ‘package.model_name’?? # profiles.Profile
用戶(hù)可以使用user.get_profile()來(lái)獲取自己的profile信息。
在settings.py中添加
?
AUTH_PROFILE_MODULE='drinker.Drinker'?
里面有一個(gè)@login_required標(biāo)簽。其作用就是告訴程序,使用這個(gè)方法是要求用戶(hù)登錄的。
1.如果用戶(hù)還沒(méi)有登錄,默認(rèn)會(huì)跳轉(zhuǎn)到‘/accounts/login/’。這個(gè)值可以在settings文件中通過(guò)LOGIN_URL參數(shù)來(lái)設(shè)定。(后面還會(huì)自動(dòng)加上你請(qǐng)求的url作為登錄后跳轉(zhuǎn)的地址,如:/accounts/login/?next=/polls/3/ 登錄完成之后,會(huì)去請(qǐng)求/poll/3)
2.如果用戶(hù)登錄了,那么該方法就可以正常執(zhí)行
添加
?
LOGIN_URL='/login/' LOGIN_REDIRECT_URL='/profile/'二.修改drinker/models.py
?
from django.db import models from django.db.models.signals import post_save from django.contrib.auth.models import User# Create your models here. class Drinker(models.Model):user??????? =models.OneToOneField(User)birthday??? =models.DateField()name??????? =models.CharField(max_length=100)def __unicode__(self):return self.name運(yùn)行
./manage.py syncdb三.修改drinker/admin.py
?
from django.contrib import admin from drinker.models import Drinkeradmin.site.register(Drinker)Meta作用
抽象類(lèi)
?
class CommonInfo(models.Model):name = models.CharField(max_length = 100)age = models.PositiveIntegerField()class Meta:Abstract = Trueclass Student(CommonInfo):home_group = models.CharField(max_length = 5)
這樣Student就有三個(gè)字段:name, age, home_group,所以CommonInfo不可以用作正常的Django model,因?yàn)樗皇且粋€(gè)抽象基類(lèi),它并不生成一個(gè)數(shù)據(jù)庫(kù),不能直接實(shí)例化或直接保存數(shù)據(jù)。所以這種抽象基類(lèi)是非常有用的,它以python的方式提供了一種方法來(lái)提取出公共信息,同時(shí)僅當(dāng)子model在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)才會(huì)創(chuàng)建相應(yīng)的數(shù)據(jù)。
?
四.修改drinker/forms.py
最終,如果一個(gè)Form實(shí)體的數(shù)據(jù)是合法的,它就會(huì)有一個(gè)可用的cleaned_data屬性。 這是一個(gè)包含干凈的提交數(shù)據(jù)的字典。 Django的form框架不但校驗(yàn)數(shù)據(jù),它還會(huì)把它們轉(zhuǎn)換成相應(yīng)的Python類(lèi)型數(shù)據(jù),這叫做清理數(shù)據(jù)。
?
from django import forms from django.contrib.auth.models import User from django.forms import ModelForm from drinker.models import Drinkerclass RegistrationForm(ModelForm):username=forms.CharField(label=(u'User Name'))email?? =forms.EmailField(label=(u'Email Address'))password=forms.CharField(label=(u'Password'),widget=forms.PasswordInput(render_value=False))password1=forms.CharField(label=(u'Verify Password'),widget=forms.PasswordInput(render_value=False))class Meta:model=Drinkerexclude=('user',)def clean_username(self):username=self.cleaned_data['username']try:User.objects.get(username=username)except User.DoesNotExist:return usernameraise forms.ValidationError("That username is already taken,please select another.")def clean(self):if self.cleaned_data['password'] != self.cleaned_data['password1']:raise forms.ValidationError("The passwords did not match. Please try again.")return self.cleaned_data class LoginForm(forms.Form):username??? =forms.CharField(label=(u'User Name'))password??? =forms.CharField(label=(u'Password'),widget=forms.PasswordInput(render_value=False))五.修改drinker/views.py
?
from django.http import HttpResponseRedirect from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required from django.shortcuts import render_to_response from django.template import RequestContext from drinker.forms import RegistrationForm,LoginForm from drinker.models import Drinker from django.contrib.auth import authenticate,login,logoutdef DrinkerRegistration(request):if request.user.is_authenticated():return HttpResponseRedirect('/profile/')if request.method == 'POST':form =RegistrationForm(request.POST)if form.is_valid():user =User.objects.create_user(username=form.cleaned_data['username'],email=form.cleaned_data['email'],password=form.cleaned_data['password'])user.save()drinker=Drinker(user=user,name=form.cleaned_data['name'],birthday=form.cleaned_data['birthday'])drinker.save()return HttpResponseRedirect('/profile/')else:return render_to_response('register.html',{'form':form},context_instance=RequestContext(request))else:form =RegistrationForm()context={'form':form}return render_to_response('register.html',context,context_instance=RequestContext(request)) @login_required def Profile(request):if not request.user.is_authenticated():return HttpResponseRedirect('/login/')drinker=request.user.get_profilecontext={'drinker':drinker}return render_to_response('profile.html',context,context_instance=RequestContext(request)) def LoginRequest(request):if request.user.is_authenticated():return HttpResponseRedirect('/profile/')if request.method == 'POST':form=LoginForm(request.POST)if form.is_valid():username=form.cleaned_data['username']password=form.cleaned_data['password']drinker=authenticate(username=username,password=password)if drinker is not None:login(request,drinker)return HttpResponseRedirect('/profile/')else:return render_to_response('login.html',{'form':form},context_instance=RequestContext(request))else:return render_to_response('login.html',{'form':form},context_instance=RequestContext(request))else:form=LoginForm()context={'form':form}return render_to_response('login.html',context,context_instance=RequestContext(request)) def LogoutRequest(request):logout(request)return HttpResponseRedirect('/')Django的User對(duì)象提供了一系列的屬性和方法,其中password存儲(chǔ)的是加密后的密碼,is_staff記錄用戶(hù)是否有管理員權(quán)限,其他的屬性可以參考官方文檔。同時(shí)django.contrib.auth模塊中提供了authenticate()、login()、logout()等函數(shù),分別實(shí)現(xiàn)認(rèn)證、登錄、登出等功能。Django還為我們提供了內(nèi)置的處理login、logout的view函數(shù),但是因?yàn)槠涮峁┑男袨榕c我們這里要的不一樣,所以還需要自己實(shí)現(xiàn)view函數(shù)。
六.修改templates/register.html
?
{% extends "base.html" %} {% block extrahead %}<script src="http://libs.baidu.com/jquery/1.7.1/jquery.min.js" type="text/javascript"></script><script src="http://libs.baidu.com/jqueryui/1.8.18/jquery-ui.min.js" type="text/javascript"></script><script>$(function() {$( "#id_birthday" ).datepicker();});</script> {% endblock %} {% block content %} <form action="" method="post">{% csrf_token %}{% if form.errors %}<p> Please correct the following fields: </p>{% endif %}<div class="register_div">{% if form.username.errors %} <p class="error"> {{ form.username.errors }} </p> {% endif %}<p><label for="username" {% if form.username.errors %} class="error" {% endif %}>Username:</label></p><p>{{ form.username }}</p></div><div class="register_div">{% if form.email.errors %} <p class="error"> {{ form.email.errors }} </p> {% endif %}<p><label for="email" {% if form.email.errors %} class="error" {% endif %}>Email:</label></p><p>{{ form.email}}</p></div><div class="register_div">{% if form.password.errors %} <p class="error"> {{ form.password.errors }} </p> {% endif %}<p><label for="password" {% if form.password.errors %} class="error" {% endif %}>Password:</label></p><p>{{ form.password}}</p></div><div class="register_div">{% if form.password1.errors %} <p class="error"> {{ form.password1.errors }} </p> {% endif %}<p><label for="password1" {% if form.password1.errors %} class="error" {% endif %}>Verify Password:</label></p><p>{{ form.password1}}</p></div><div class="register_div">{% if form.birthday.errors %} <p class="error"> {{ form.birthday.errors }} </p> {% endif %}<p><label for="birthday" {% if form.birthday.errors %} class="error" {% endif %}>Birthday:</label></p><p>{{ form.birthday}}</p></div><div class="register_div">{% if form.name.errors %} <p class="error"> {{ form.name.errors }} </p> {% endif %}<p><label for="name" {% if form.name.errors %} class="error" {% endif %}>Name:</label></p><p>{{ form.name}}</p></div><p><input type="submit" alt="register"></p> </form> {% endblock %}templates/login.html
?
{% extends "base.html" %} {% block content %} <form action="" method="post">{% csrf_token %}{% if form.errors %}<p> Please correct the following fields: </p>{% endif %}<div class="register_div">{% if form.username.errors %} <p class="error"> {{ form.username.errors }} </p> {% endif %}<p><label for="username" {% if form.username.errors %} class="error" {% endif %}>Username:</label></p><p>{{ form.username }}</p></div><div class="register_div">{% if form.password.errors %} <p class="error"> {{ form.password.errors }} </p> {% endif %}<p><label for="password" {% if form.password.errors %} class="error" {% endif %}>Password:</label></p><p>{{ form.password}}</p></div><p><input type="submit" alt="register"></p> </form> {% endblock %}templates/base.html
?
<html> <head><link rel="stylesheet" type="text/css" href="/static/css/video1.css" />{% block extrahead %}{% endblock %} </head> <body> <div id="pageContainer"><div id="nav_top_right">{% if user.is_authenticated %}<p><a href="/logout/">Logout</a></p>{% else %}<p><a href="/login/">login</a></p>{% endif %}</div>{% block content %}{% endblock %} </div> </body> </html>templates/profile.html
?
{% extends "base.html" %} {% block content %} <p>Name: {{ drinker.name }}</p> <p>Birthday: {{ drinker.birthday }}</p> {% endblock %}urls.py中添加
(r'^register/$','drinker.views.DrinkerRegistration'),(r'^login/$','drinker.views.LoginRequest'),(r'^logout/$','drinker.views.LogoutRequest'), (r'^profile/$','drinker.views.Profile'),?總結(jié)
以上是生活随笔為你收集整理的五 Django 1.5.4 User Authentication 用户认证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 不错的东西: AutoMapper
- 下一篇: CocoStudio资源区导入Plist