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'), ]
这样如上就实现了注册,登录成功后,点击拉钩网,能够看到获取招聘到的数据。如您对接口自动化测试感兴趣,
可扫描如下二维码关注本人的课程,谢谢!