到目前,我们虽然实现了登录功能,但用户登录信息的验证是有问题的,目前我偿是简单地用if语句判断用户名和密码是否为“admin/admin123”,本节我们使用D的证证系统来实现真正的用户信息验证。
一、登录Admin后台
在此之前先来创建登录Admin后台的管理员账号。
cmd.exe
\guest> python manage.py createsuperuser
Username (leave blank to use 'administrator'): admin #输入用户名
Email address: admin@163.com #输入邮箱
Password: #输入密码
Password (again): #重复输入密码
Superuser created successfully.
创建的超级管理员账号/密码为:admin/admin123456
Admin管理后台登录地址:http://127.0.0.1:8000/admin
二、引用Django认证登录
Django已帮我们封装好了用户认证和登录相关方法,只需拿来使用即可。并且,同样使用auth_user表中的数据进行验证,前面已经通过Admin后台向该表中添加了用户信息。
打开.../sign/views.py 文件,修改login_action函数。
views.py
......
from django.contrib import auth
......
# 登录动作
def login_action(request):
if request.method == 'POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
user = auth.authenticate(username=username, password=password)
if user is not None:
auth.login(request, user) #登录
request.session['user'] = username #将session信息记录到浏览器
response = HttpResponseRedirect('/event_manage/')
return response
else:
return render(request,'index.html',{'error':'用户名密码错误!'})
使用authenticate()函数认证给出的用户名和密码。它接受两个参数:username和password,并且会在用户名密码正确的情况下返回一个user对象,否则authenticate()返回None。
通过if语句判断authenticate()返回对象,如果不为None,则说明用记认证通过,调用login()函数进行登录。login()函数接收HttpRequest对象和一个user对象。
使用前面超级管理员账号(admin/admin123456),或者通过Admin管理后台创建用户账户来验证登录功能。
1)先用超级管理员账号(admin/admin123456),登录
2)通过Admin管理后台创建的账号(python/python23456),登录
都可以登录成功!!!!!
三、关上窗户
我们为系统开发了一个需要用户认证的登录,然而,不需要通过登录也可以直接访问到登录成功的页面。
现在,直接在浏览器中访问:http://127.0.0.1:8000/event_manage/
是不是直接打开了登录成功页,接下来我们把这些”窗户“都关上,只能通过用户来登录。
打开.../sign/views.py 文件
......
from django.contrib.auth.decorators import login_required
......
# 发布会管理
@login_required
def event_manage(request):
username = request.session.get('user', '') #读取浏览器session
return render(request,"event_manage.html",{"user":username})
就是这么简单,如果想限制某个视图函数必须登录才能访问,则只需要在这个函数的前面加上@login_required 的装饰即可。
我们再次尝试下访问http://127.0.0.1:8000/event_manage/(不要忘记清理浏览器缓存再试!),
是不是提示访问的页面不存在(Page not found (404))
我们来分析下,在访问被@login_required 装饰的视图时,默认跳转的URL中会包含”/accounts/login/“,为什么不让它直接跳转到登录页面呢?来我们修改下.../urls.py 文件,增加新路径配置,直接指引用户到门的位置登录。
urls.py
from sign import views #导入sign应用views文件
urlpatterns = [
url('admin/', admin.site.urls),
url(r'^$', views.index),
url('index/$',views.index), #添加index/路径配置
url(r'^accounts/login/$', views.index),
url(r'login_action/$',views.login_action),
url(r'event_manage/$',views.event_manage),
]
此时,当用户访问:
http://127.0.0.1:8000/
http://127.0.0.1:8000/index/
http://127.0.0.1:8000/event_manage/
默认都会跳转到登录页面。