Django学习笔记之登录功能(4)

       在前面的文章体系中介绍了如何获取数据,并且把数据展示在前台的功能,今天这里对这功能进一步的完善,

新增登录注册的功能,以及登录成功后,系统能够退出,同时在登录后,点击拉钩网的链接,可以看到之前文章

中提到的招聘的数据。

      不管是登录还是注册,这里都会使用到数据库,在Django中可以支持多种数据库,这里使用MySQL的数据库,

在MySQL的数据库中创建数据库blog,然后在settings.py中配置MySQL,见配置的信息源码:

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, '../../db.sqlite3'),
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog',
        'USER':'root',
        'PASSWORD':'123456',
        'HOST':'localhost',
        'PORT':3306
    }
}

配置MySQL后,在moudle.py模块文件中编写类,也就是需要创建的表,前面很早之前就说过,Django它是基于MTV

模式的,那么这地方的M就是moudle,见module的源码:

from django.db import models

# Create your models here.

class UserInfo(models.Model):
    username=models.CharField(max_length=20,unique=True,verbose_name='账号')
    password=models.CharField(max_length=12,verbose_name='密码')

 

编写成功后,执行如下的命令,就会创建表userinfo,执行的命令是:

                                                      pyhton manage.py makemigrations 

                                                      python manage.py migrate

执行成功后,就会创建成功表,在数据库中执行show tables就会看到创建的表,见如下的显示:

     下面开始写注册的功能,注册的时候字段比较简单,就是账号和密码,注册成功后,用户就可以登录到系统,在views.py

的模块中编写注册的函数,注册的时候,如果是账号已经被注册了,就提示用户,如果是没注册的用户,就注册成功,见

views.py注册的源码:

def register(request):
    '''用户注册'''
    msg=''
    if request.method=='GET':
        return render(request,'login/register.html',locals())
    else:
        username=request.POST.get('username',None)
        password=request.POST.get('password',None)
        c = UserInfo.objects.filter(username=username).count()
        if c==1:
            msg = '该账户已被注册,请使用其他的昵称'
            return render(request,'login/register.html',locals())
        else:
            UserInfo.objects.create(username=username, password=password)
            return redirect(to='login:login')

在注册中,也需要模板文件register.html,见register.html的源码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css">
    <title>账户注册</title>
</head>
<body>
<br>
<center>
    <div class="container">
    <form  action="{% url 'login:register' %}" method="post">
        {% csrf_token %}
        <div class="form-group">
            <label for="exampleInputEmail1">账号</label>
            <input type="text"  name="username" placeholder="请输入您的账号">
        </div>
        <p><span style="color: red">{{ msg }}</span></p>
       <div class="form-group">
            <label for="exampleInputPassword1">密码</label>
            <input type="password" name="password" placeholder="请输入账号的密码">
       </div>
            <input type="submit" value="注册" class="btn btn-default">
    </form>
    </div>
</center>
</body>
</html>

这样就实现了注册的功能,启动服务后,在浏览器中输入已经注册的账号,就会有提示,见如下显示:

    下来就来实现登录的功能,登录成功后,一定要记录下登录成功后的账户信息,在接口自动化测试的知识体系中,

本人对于cookie和session其实有很详细的介绍,那么这里使用session的方式,同时登录成功后,跳转到首页,也就

是index页面,当然登录也做了判断,账号错误,或者是没注册的。关于登录成功的判断,因为username字段它是唯

一性的约束,所以只要判断数据库中该字段查询出来它的count是1,那么就是登录成功,见views.py中登录的源码:

def login(request):
    msg=''
    if request.method=='GET':
        return render(request,'login/login.html',locals())
    else:
        username=request.POST.get('username',None)
        password=request.POST.get('password',None)
        c=UserInfo.objects.filter(username=username,password=password)
        if c:
            request.session['is_login']=True
            request.session['username']=username
            return redirect(to='login:index')
        elif c==0:
            msg='您登录账号不存在,请注册账号,谢谢!'
        else:
            msg='账号或者密码错误,请联系管理员'
    return render(request,'login/login.html',locals())

见登录的login.html的源码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css">
    <title>登录</title>
</head>
<body>
<br>
<center>
    <div class="container">
    <form  action="{% url 'login:login' %}" method="post">
        {% csrf_token %}
        <div class="form-group">
            <label for="exampleInputEmail1">账号</label>
            <input type="text"  name="username" placeholder="请输入您的账号">
        </div>
       <div class="form-group">
            <label for="exampleInputPassword1">密码</label>
            <input type="password" name="password" placeholder="请输入账号的密码">
       </div>
        <p><span style="color: red">{{ msg }}</span></p>
            <input type="submit" value="登录" class="btn btn-default">
        <a href="{% url 'login:register' %}" class="btn btn-primary">注册</a>
    </form>
    </div>
</center>
</body>
</html>

登录成功后,需要跳转到首页,那么需要写index的函数,同时在登录要记录下登录账号的session的信息,见views.py中

index函数的源码:

def index(request):
    current_user = request.session.get('username', None)
    return render(request, 'login/index.html', locals())

见index.html的源码:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css">
    <meta charset="UTF-8">
    <title>无涯课堂</title>

    <style>
        body{
            margin: 0;
        }
        .hide{
            display: none;
        }
        .menu .item{
            display: block;
            padding: 5px 10px;
            border-bottom: 1px solid #dddddd;
        }
        .menu .item:hover{
            background-color: black;
            color: white;
        }
        .menu .item.active{
            background-color: black;
            color: white;
        }

        .modal{
            position: fixed;
            top: 50%;
            left: 50%;
            width: 500px;
            height: 400px;
            margin-top: -250px;
            margin-left: -250px;
            z-index: 100;
            background-color: white;
        }
        .remove{
            position: fixed;
            top: 50%;
            left: 50%;
            width: 400px;
            height: 200px;
            margin-top: -100px;
            margin-left: -200px;
            z-index: 100;
            background-color: white;
        }
        .shade{
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background-color: black;
            opacity: 0.5;
            z-index: 99;
        }

        .right .exit:hover{
            background-color: block;
            color: white;
        }

        .pagination a{
            display: inline-block;
            padding: 8px;
        }

        <!--选中的页面添加背景色-->
            .pagination a.active{
            background-color: black;
            color: white;
        }
    </style>
    {% block css %} {% endblock %}
</head>
<body>
    <div style="height: 48px;background-color: black;color: white" class="right">
        <div style="float: right">
            用户名:{{ current_user }} | <a class="exit"  href="{% url 'login:logout' %}">退出</a>
        </div>
    </div>

    <div>
        <div class="menu" style="position: absolute;top: 48px;left: 0;bottom:0;width: 200px;background-color: #eeeeee">
            <a class="item" href="{% url 'login:lagou' %}" >拉钩网招聘数据</a>
    </div>
</body>
</html>

有了登录必然就有退出,其实在Django中退出某些是写的是删除session的信息,其实晚上是没必要的,可以直接使用logout

的函数,退出成功后跳转到登录的页面,见退出的源码:

def logout(request):
    from django.contrib.auth import logout
    logout(request)
    return redirect(to='login:login')

下来我把完整的views.py源码分享出来,见如下:

from django.shortcuts import render,redirect
from django.http import  HttpResponse

# Create your views here.

import  requests
from .models import UserInfo

def index(request):
    current_user = request.session.get('username', None)
    return render(request, 'login/index.html', locals())

def getHeaders():
    headers={
        'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
        'Referer':'https://www.lagou.com/jobs/list_%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%B7%A5%E7%A8%8B%E5%B8%88?labelWords=&fromSearch=true&suginput=',
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
        'Cookie':'_ga=GA1.2.186012464.1544195085; user_trace_token=20181207230439-6b58f932-fa31-11e8-8ce7-5254005c3644; LGUID=20181207230439-6b58fd66-fa31-11e8-8ce7-5254005c3644; index_location_city=%E5%85%A8%E5%9B%BD; _gid=GA1.2.1553638128.1545207856; JSESSIONID=ABAAABAAAGFABEFDA17A850FC896FFEA4FD0408D8D48FE7; PRE_UTM=; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; TG-TRACK-CODE=index_search; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22167c6f1e2843ee-03f91923647488-5d1f3b1c-1049088-167c6f1e2852e8%22%2C%22%24device_id%22%3A%22167c6f1e2843ee-03f91923647488-5d1f3b1c-1049088-167c6f1e2852e8%22%7D; sajssdk_2015_cross_new_user=1; _gat=1; LGSID=20181219225013-64077f08-039d-11e9-ab57-525400f775ce; PRE_HOST=www.bing.com; PRE_SITE=https%3A%2F%2Fwww.bing.com%2F; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1544357580,1545207857,1545230956,1545231023; X_HTTP_TOKEN=e7159997603abc22a96c9d0230a58ad6; LG_LOGIN_USER_ID=029d880fdaa25ab1429acea6baed547394834a2c4d8a7ba1; _putrc=0057C29638877881; login=true; unick=%E6%9D%8E%E6%97%BA%E5%B9%B3; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=22; gate_login_token=4d1f9337decf3879c11e2ef74d509d33bbe644355091f623; SEARCH_ID=1d55be7683cf433a97361a420b6051f1; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1545231073; LGRID=20181219225104-82681c06-039d-11e9-94bc-5254005c3644'}
    return headers

from django.core.paginator import Paginator
from .pager import PagerPagination

def laGou(request):
    positions = []
    for item in range(1,10):
        r = requests.post(
            url='https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false',
            data={'first': False, 'pn': item, 'kd': '自动化测试'}, headers=getHeaders())
        for i in range(15):
            company = r.json()['content']['positionResult']['result'][i]['companyFullName']
            positionName = r.json()['content']['positionResult']['result'][i]['positionName']
            workYear = r.json()['content']['positionResult']['result'][i]['workYear']
            salary = r.json()['content']['positionResult']['result'][i]['salary']
            education = r.json()['content']['positionResult']['result'][i]['education']
            city = r.json()['content']['positionResult']['result'][i]['city']

            positions.append({
                'city': city,
                'company': company,
                'positionName': positionName,
                'salary': salary,
                'education': education,
                'workYear': workYear
            })
    current_page=request.GET.get('p',None)
    page_obj=PagerPagination(20,current_page)
    data_list=positions[page_obj.start():page_obj.end()]
    return render(request,'login/lagou.html',locals())

def register(request):
    '''用户注册'''
    msg=''
    if request.method=='GET':
        return render(request,'login/register.html',locals())
    else:
        username=request.POST.get('username',None)
        password=request.POST.get('password',None)
        c = UserInfo.objects.filter(username=username).count()
        if c==1:
            msg = '该账户已被注册,请使用其他的昵称'
            return render(request,'login/register.html',locals())
        else:
            UserInfo.objects.create(username=username, password=password)
            return redirect(to='login:login')


def login(request):
    msg=''
    if request.method=='GET':
        return render(request,'login/login.html',locals())
    else:
        username=request.POST.get('username',None)
        password=request.POST.get('password',None)
        c=UserInfo.objects.filter(username=username,password=password)
        if c:
            request.session['is_login']=True
            request.session['username']=username
            return redirect(to='login:index')
        elif c==0:
            msg='您登录账号不存在,请注册账号,谢谢!'
        else:
            msg='账号或者密码错误,请联系管理员'
    return render(request,'login/login.html',locals())

def logout(request):
    from django.contrib.auth import logout
    logout(request)
    return redirect(to='login:login')

在上面中说到很多的路由,主要是在app的login中的url.py中,见完整的路由源码:

from django.urls import path

from .views import  *

app_name='login'
urlpatterns = [
    path('', index,name='index'),
    path('lagou/',laGou,name='lagou'),
    path('register/',register,name='register'),
    path('login/',login,name='login'),
    path('logout',logout,name='logout'),
]

      这样如上就实现了注册,登录成功后,点击拉钩网,能够看到获取招聘到的数据。如您对接口自动化测试感兴趣,

可扫描如下二维码关注本人的课程,谢谢!

posted @ 2018-12-22 17:13  无涯(WuYa)  阅读(212)  评论(0编辑  收藏  举报