版本声明:转载请注明出处。未经允许,禁止商业用途。
9/10/11 使用Python Django开发web应用 用户管理 讲师:刘一凡
认证系统
第一步:
配置
确认settings.py中:
INSTALLED_APPS中有
'django.contrib.auth',
第二步:
定义urlpattern,
在blog/urls.py的urlpatterns中添加
path('regist/',views.regist),
path('login/',views.my_login),
path('logout/',views.my_logout),
第三步:定义Form
views.py中添加
class LoginForm(forms.Form):
#前台会自动限制,输入到了50个字符就输不进去了
username = forms.CharField(label='用户名',max_length=50)
#设置为密码输入字段widget,前台会将输入显示为圆点,点击小眼睛,可以显示真实输入
password = forms.CharField(label='密码',widget=forms.PasswordInput())
#RegistForm也需要username和password
#继承比去修改LoginForm类要方便
class RegistForm(LoginForm):
#前台会自动做邮箱格式检查,格式不正确时输入框会变红,而且提示“你必须输入有效电子邮件地址”
email = forms.EmailField(label='邮箱')
第四步:定义view函数
内置模型:
from django.contrib.auth.models import User
veiw支持:
注册:
from django.http.response import HttpResponse
import django.db
def regist(request):
if request.method == 'POST':
#使用request中的POST,实例化RegistForm得到userform
userform = RegistForm(request.POST)
#如果输入的内容合乎要求,则将输入的内容放在cleaned_data属性里
if userform.is_valid():
username = userform.cleaned_data['username']
password = userform.cleaned_data['password']
email = userform.cleaned_data['email']
try:
user = User.objects.create_user(username, email, password)
#如果用户名已经存在,则抛出异常
#UNIQUE constraint failed: auth_user.username
except django.db.IntegrityError:
return HttpResponse('注册失败!!!该用户名已经存在')
#注册成功后跳转到登录页面
return HttpResponseRedirect('/blog/login/')
else:
#method是GET,说明是获取注册页面,而不是提交注册信息,我们创建一个空的form
userform = RegistForm()
return render(request,'regist.html',{'userform':userform})
from django.contrib.auth import authenticate,login,logout
def my_login(request):
if request.method == 'POST':
userform = LoginForm(request.POST)
if userform.is_valid():
username = userform.cleaned_data['username']
password = userform.cleaned_data['password']
#认证成功则返回用户名,认证失败则返回None
user = authenticate(username=username, password=password)
if user:
#登录
#login()saves the user's ID in the session
login(request, user)
#跳转到主页
return HttpResponseRedirect('/blog/')
else:
return HttpResponse('用户名或密码错误,请重新登录')
#method是GET,说明是获取登录页面,而不是提交登录信息
else:
userform = LoginForm()
return render(request,'login.html',{'userform':userform})
#注销
def my_logout(request):
logout(request)
return HttpResponseRedirect('/blog/')
第五步:
定义模板,templates文件夹下建立新文件,内容如下
login.html
<!DOCTYPE html>
<html lang="zh-CN"><head> </head>
<body>
<h1>Login page</h1>
<form method = 'post' enctype="multipart/form-data">
{% csrf_token %}
{{userform.as_p}}
<input type="submit" value = "Login" />
</form>
</body>
</html>
regist.html
<!DOCTYPE html>
<html lang="zh-CN"><head> </head>
<body>
<h1>Register page</h1>
<form method = 'post' enctype="multipart/form-data">
{% csrf_token %}
{{userform.as_p}}
<input type="submit" value = "Regist" />
</form>
</body>
</html>
blog.html中添加相关逻辑和内容
{% if username %}
<p>{{ username }}</p>
<a href="/blog/logout">logout</a>
{% else %}
<a href="/blog/login">login</a>
<a href="/blog/regist">regist</a>
{% endif %}
第六步:
views.py的blog()中,需要把当前已经登录的username传递给blog.html
添加代码,向context里面添加username
if request.user.is_authenticated:
context['username']=request.user
return render(request,'blog.html',context)
第七步:
演示注册,前台登录和注销功能,注册后在后台查看和管理。
第八步:
但是截至目前,blog里面没有携带用户名。所以需要对model Blog进行扩展。
添加属性username。允许username为空,是因为之前提交的blog都没有携带username
username = models.CharField(max_length=50,null=True)
进行makemigrations,然后migrate
另外要将username从BlogForm中剔除掉
修改为exclude={'timestamp','username',}
blog()不用修改,因为form是从model Blog生成的。但是
add()里面需要添加
blog.username=request.user
blog.html需要添加内容,用以显示blog的username
<p>{{ blog.username }}</p>
第九步:
演示登录后发表文章