WEB接口开发与自动化测试-读书笔记6 如何使用Django认证系统来实现真正的用户信息验证

到目前,我们虽然实现了登录功能,但用户登录信息的验证是有问题的,目前我偿是简单地用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/

默认都会跳转到登录页面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>