软件测试 | Django认证系统
  p1prOQge3cDY 2023年11月02日 23 0

到目前为止,虽然实现了登录功能,但用户登录信息的验证是有问题的,目前的做法只是简单地用if语句判断用户名和密码是否为“admin/admin123”

登录Admin后台

3.2节在使用“migrate”命令进行数据迁移时,Django同时也生成了auth_user表,该表中存放的用户信息可以用来登录Django自带的Admin管理后台。在此之前先来创建登录Admin后台的管理员账号。

\guest> python3 manage.py createsuperuser
Username (leave blank to use 'fnngj'):admin #输入用户名
Email address: admin@mail.com    #输入邮箱
Password:                        #输入密码
Password (again):                #重复输入密码
Superuser created successfully.

创建的超级管理员账号/密码为:admin/admin123456.

Admin管理后台登录地址:http://127.0.0.1:8000/admin/

如图3.9和图3.10所示,通过创建的超级管理员账号登录Admin后台,单击“Add”链接添加新的用户,并用创建的用户再次登录后台,尝试一下吧!相信你可以做到。

软件测试 | Django认证系统_用户认证

软件测试 | Django认证系统_用户名_02

引用Django认证登录

Django已帮我们封装好了用户认证和登录的相关方法,只需拿来使用即可。并且,同样使用auth_user表中的数据进行验证,前面已经通过Admin后台向该表中添加了用户信息。

打开.../sign/views.py文件,修改login_action函数。

.....
from django.contrib import auth

.....
def login_action(request):
  if requset.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信息记录到浏览器
        respone = HttpResponseRedirect('/event_manage/')
        return response
     else:
        return render(request,'index.html',{'error':'username or password error!'})

使用authenticate()函数认证给出的用户名和密码。它接受两个参数:username和password,并且会在用户名和密码正确的情况下返回一个user对象,否则authenticate()返回None。

通过if语句判断authenticate()返回对象,如果不为None,则说明用户认证通过,调用login()函数进行登录。login()函数接收HttpRequest对象和一个user对象。

使用前面超级管理员账号(admin/admin123456),或则通过Admin管理后台创建用户账号来验证登录功能吧!

关上窗户

“上帝为你关上了一扇门,也一定会为你打开一扇窗”,我们为系统开发了一个需要用户认证的登录,然而,不需要通过登录也可以直接访问到登录成功的页面。

现在,尝试直接在浏览器中访问:http://127.0.0.1:8000/event_manage/

看!是不是直接打开了登录成功页,那么为什么还需要通过登录来访问这个页面呢?因此,我们需要把这些“窗户”都关上,使用户只能通过登录来访问。

再次感受一下Django的强大之处吧!一秒钟让你关好“窗户”。

......
from django.contrib.auth.decorators import login_required

......
# 发布会管理
@login_required
def event_manage(request):
    username = request.session.get('user','')
    return render(request,"event_manage.html",{"user":username})

是的,就是这么简单,如果想限制某个视图函数必须登录才能访问,则只需要再这个函数的前面加上@login_required的装饰即可。

你可以再次尝试访问/event_manage/目录(不要忘记清理浏览器缓存再试!),看看还能否直接访问到。

如图3.11所示。Django会告诉访问的页面不存在(Page not found 404)。

软件测试 | Django认证系统_用户名_03

如果你足够细心,就可以发现在访问被@login_required装饰的视图时,默认跳转的URL中会包含“/accounts/login”,为什么不让他直接跳转到登录页面呢?不仅要告诉用户窗户是关着的,还指引用户到门的位置登录,这样岂不是更好?

修改.../urls.py文件,增加新的路径配置

.....
from sign import views

urlpatterns = {
   url(r' ^$',views.index),
   url(r'^accounts/login/$',view.index),
   ......
]

此时,当用户访问:

http://127.0.0.1:8000/

http://127.0.0.1:8000/index/

http://127.0.0.1:8000/event_manage/

默认都会跳转到登录页面。但是,如果你访问的是其他不存在的路径,比如/abc/,则依然会显示如图3.11所示的页面。这个时候需要设置默认的404页面,我们会在项目部署一章来添加这个页面。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
p1prOQge3cDY