《web接口开发与自动化测试》--基于Python语言第二章

本章主要用一个简单的发布会签到系统来介绍get、post两种请求方式,以及cookies和session两种登录机制,并且还介绍了Django的认证系统,我们怎么应用Django自带的认证系统去处理登录网页。

一、 登录功能

为了更好的去了解get和post请求,先来写一个登录功能吧!
在第一章的基础上我们先将……/sign/temlates/index.html的内容修改一下,改成一个登录系统的网页显示。
在这里插入图片描述
浏览器中输入127.0.0.1:8080/index,即可看到如下的网页显示。
在这里插入图片描述现在这个页面是不能正常登录的,我们想要登录要该怎么提交给服务器呢?这时候就需要通过get或者post请求了,接下来,我们来继续学习!

二、get和post请求

1、get请求

现在我们修改index.html来用get方式访问服务器,在标签里添加请求方式,添加完之后我们访问127.0.0.1:8080/index,随便输入账号:admin,密码:123456,点击登录看看。仔细瞅瞅,你会发现地址栏暴露了你输入的一切,哈哈哈~
在这里插入图片描述

在这里插入图片描述

2、post请求

刚才用get请求方式是不是很容易暴露我们的隐私,一不小心将自己卖了都不知道。为了更安全一些,我们可以使用post请求~
现在将index.html的form标签页的方式改为post即可,,这时在127.0.0.1:8080/index输入账号密码点击登录。是不是发现会报异常“CSRF verication failed.Request aborted”,不要方,CSRF是跨站伪造请求,解决的办法有以下几种方式:
在这里插入图片描述
1、在index.html表单中添加{% csrf_token %};
在这里插入图片描述
2、将……/guest/seetings.py中以下标红的一行注释掉就好
在这里插入图片描述
解决完报错的问题,我们刷新页面输入账号密码点击登录向服务器发送post请求,我们按F12抓包看看发送的请求,你会发现除了username和password两个参数外,还多了一个csrfmiddlewaretoken参数。

3、处理登录请求

现在我们知道了get和post请求,那么Django服务器是如何接收请求的数据并加以处理的呢?可以通过form表单的action属性来制定提交的路径。打开inddex.xml添加一下内容,,然后打开……/guest/urls.py文件添加login_action/路由。

urlpatterns = [
  ……
    path(r'login_action/',views.login_action),
    ]
登录

请求由views.py文件的login_action函数来处理,打开……/sign/views.py添加login_action函数。

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
……
def login_action(request):
    if request.method =='POST': #用request获取请求的方式
        username = request.POST.get('username','')#获取用户名
        password = request.POST.get('password','')#获取密码
        #若返回的账号和密码正确就返回字符串“login SUCCESS!”,否则返回index.html,并提示用户名或者密码错误
        if username == 'admin' and password == 'admin123':
            response = HttpResponse('login SUCCESS!')
            
            return response
        else:
            return render(request,'index.html',{'error':'username or password error!'})

再次输入账号密码登录后,会提示“login success!”```
在这里插入图片描述

4、登录成功页

我们刚才登录成功只是给出了一个简单的提示,正常情况下应该是需要返回网页,现在我们就来做一个返回的网页。
在……/sign/templetes文件下添加一个event_manage.html,

<html>
<head>
    <meta charset="utf-8" />
    <title>Event Manage Page</title>
</head>
<body>
    <h1>Login success</h1>
    <div style="float:right;">
        <a>嘿!欢迎</a><hr/></div>
</body>
</html>

添加完之后记得在guest/urls.py下添加URL声明urlpatterns = [
path(r’event_manage/’,views.event_manage),],接下来在sign/views.py下创建event_manage函数,这时候通过抓包发现登录成功后会跳转到event_manage.html,

 def event_manage(reguest):
    return render(reguest,'event_manage.html')

在这里插入图片描述

三、cookie和session

上面我们event_manage.html只是显示了欢迎,为了显示得更加友好,我们来实现显示“hi,xxx,欢迎登陆”,接下来我们分别使用cookie和session两种方式来实现。
**cookie:**浏览器生成的,浏览器按照一定的原则在后台自动发送给服务器。
**session:**一种服务端的机制,保存在服务器中。

1、cookie的使用

修改sign/views.py文件

……
def login_action(request):
    if request.method =='POST':
        username = request.POST.get('username','')
        password = request.POST.get('password','')
        if username == 'admin' and password == 'admin123':
            response = HttpResponseRedirect('/event_manage/')
            response.set_cookie('user',username,3600) #添加cookie
            return response
        else:
            return render(request,'index.html',{'error':'username or password error!'})
#发布会管理
def event_manage(reguest):
    username= reguest.COOKIES.get('user','')#读取浏览器的cookie
    return render(reguest,'event_manage.html',{'user':username})

用set_cookie()给浏览器添加cookie,传了3个参数,第一个参数user为cookie名,第二个参数username是客户在登录页输入的用户名,第三个参数3600是cookie在浏览器中保持时间,默认为秒。
event_manageh()函数通过request.cookies.get()来读取cookie,并通过render将它和event_manage.html一起返回。
修改event_manege.html

<html>
<head>
    <meta charset="utf-8" />
    <title>Event Manage Page</title>
</head>
<body>
    <h1>Login success</h1>
    <div style="float:left;">
        <a>hi,{{ user }},欢迎!</a><hr/></div>
</body>
</html>

再次登录后的效果如下:
在这里插入图片描述
2、session的使用
刚才我们使用的是cookie,cookie固然好,但是不是很安全。cookie就像一张银行卡,存取钱都会记录在存折上,很不安全,很有可能被别人篡改数据。session则就像一张一张银行卡,客户只是知道自己的卡号,所有的数据都保存在银行系统中,比较安全。
修改sign/view.py文件

def login_action(request):
    if request.method =='POST':
        username = request.POST.get('username','')
        password = request.POST.get('password','')
        if username == 'admin' and password == 'admin123':
            response = HttpResponseRedirect('/event_manage/')
            #response.set_cookie('user',username,3600) #添加cookie
            request.session['user']= username  #将session信息存储到浏览器
            return response
        else:
            return render(request,'index.html',{'error':'username or password error!'})
#发布会管理
def event_manage(request):
    #username= request.COOKIES.get('user','')#读取浏览器的cookie
    username = request.session.get('user','')
    return render(request,'event_manage.html',{'user':username})

用session和cokie实现的效果一致,更为session有可能会报错,我们要做下数据迁移,在guest文件下执行命令python manage.py migrate
在这里插入图片描述

四、Django认证系统

我们只是使用If语句判断用户名和密码是否为“admin/admin123”,接下来我们使用Django的认证系统来实现真正的用户信息验证。

1、登录admin后台

首先使用Python manage.ppy createsuperuser命令创建admin后台的管理员账号。
在这里插入图片描述
浏览器访问127.0.0.1:8000/admin/,输入刚才创建的账号密码
在这里插入图片描述

2、引用Django认证登录

修改views.py文件的login_action函数

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)
            response = HttpResponseRedirect('/event_manage/')
            request.session['user']= username  #将session信息存储到浏览器
            return response
        else:
            return render(request,'index.html',{'error':'username or password error!'})
            

使用authenticate()函数认证给出的用户名和密码,接受两个参数,并且会在用户名密码正确的情况下返回一个user对象,否则authenticate()返回None。
通过IF语句判断authenticate()返回对象,如果不为None,则说明用户认证通过,调用login()函数进行登录。login()函数接收HttpRequest对象和一个user对象。

3、登录成功

正常情况下是输入正确的账户密码登录成功后才返回event_manage.html显示登录成功,但是我们直接访问127.0.01:8000/event_manage/是不是也会显示登录成功,那么我们就要修改下views.py

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

def event_manage(request):
    #username= request.COOKIES.get('user','')#读取浏览器的cookie
    username = request.session.get('user','')
    return render(request,'event_manage.html',{'user':username})

修改后再次访问127.0.01:8000/event_manage/,是不是已经访问不了。接下来我们让它直接跳到登录页面,修改urls.py

urlpatterns = [
……
    path('',views.index),
    path('accounts/login/',views.index),
    path(r'admin/', admin.site.urls),]

现在访问不存在的路径都会跳转到登录页面,这样就比较友好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值