今天来总结一下关于表单中涉及到的cookie和session
首先,什么是cookie呢?用我自己的理解来说,就是浏览器为了维持web的状态,将用户信息储存在本地的一个小文件里面,当浏览器再次访问的时候会首先查看你是否有着之前的用户信息,这样就可以维持上次的状态~但是只有cookie,也有安全隐患,再就是大量的cookies也会占用服务器的带宽,所以,session就横空出世,它与cookies有着密不可分的关系。在本地或者浏览器中的cookies会存有一组sessionid,当请求到服务器时,这个sessionid和当前的用户会形成一个映射表格,即不同的用户会有着不同的sessionid,而且这个sessionid唯一,这样访问的时候,如果id和用户匹配,就可以维持上次的登录状态,当然,cookies有它的维持时限,时限一过,cookies就会被删除~
好了,在这个知识的基础上,我们来用django框架做一下,关于cookies的表单。
这次主要实现一下几个小功能
1.如果用户没有登录而访问主页,直接跳转到登录页面
2.如果用户登录成功,跳转到主页
3.如果用户之前已经登录了,那么再次访问主页时不会跳转到登录页面,可以直接成功登陆
好了,先上代码~
1 #urls.py 2 from django.conf.urls import url 3 from django.contrib import admin 4 from blog import views 5 6 urlpatterns = [ 7 url(r‘^admin/‘, admin.site.urls), 8 url(r‘^$‘,views.index,name=‘index_page‘), 9 url(r‘login‘,views.login,name=‘login_page‘), 10 ] 11 12 13 14 #views.py 15 # -*- coding: utf-8 -*- 16 from __future__ import unicode_literals 17 import uuid 18 from django.shortcuts import render,reverse 19 from django.http import HttpResponse,HttpResponseRedirect 20 from django.db import models 21 from models import UserModel 22 # Create your views here. 23 24 ‘‘‘ 25 1.如果用户要登录,跳转到登录页面 26 2.如果用户已登录,跳转到index 27 3.如果用户已经登录,访问index主页 28 ‘‘‘ 29 def index(request): 30 mysessionid = request.COOKIES.get(‘mysessionid‘) 31 print ‘index:‘,mysessionid 32 username = request.session.get(mysessionid,None) 33 if username: 34 return HttpResponse("这是博客主页") 35 else: 36 return HttpResponseRedirect(‘login_page‘) 37 38 def login(request): 39 if request.method == ‘GET‘: 40 return render(request,‘login.html‘) 41 else: 42 username = request.POST.get(‘username‘) 43 password = request.POST.get(‘password‘) 44 userModel = UserModel.objects.filter(name=username,password=password).first() 45 46 if userModel: 47 #1.给客户端设置cookie 48 response = HttpResponseRedirect(reverse(‘index_page‘)) 49 mysessionid = str(uuid.uuid4()) 50 response.set_cookie(‘mysessionid‘,mysessionid) 51 #2。设置session 的值 52 request.session[mysessionid] = userModel.name 53 return response 54 else: 55 return HttpResponse("用户名或密码错误") 56 57 #models.py 58 from __future__ import unicode_literals 59 60 from django.db import models 61 62 # Create your models here. 63 class UserModel(models.Model): 64 name = models.CharField(max_length=100) 65 password = models.CharField(max_length=100) 66 67 def __unicode__(self): 68 return self.name
接下来是html代码:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>登录页面</title> 6 </head> 7 <body> 8 <form action="" method="post"> 9 {% csrf_token %} 10 <input type="text" name="username" placeholder="请输入用户名"><br> 11 <input type="password" name="password" placeholder="请输入密码"> 12 <input type="submit" value="点我提交"> 13 </form> 14 </body> 15 </html>
结果如下图:
第一次输入127.0.1:8000 跳转到该页面
输入用户名和密码点击点我提交(之前已经在数据库中创建好)
3.新开一个页面,然后输入127.0.0.1就直接到了主页
有几个方面的问题要注意:
1.在request.session:返回一个QueryDict的类字典类型的集合,这个属性要有效,必须添加SessionMiddleware这个中间件。一般seetings.py里面都带有该中间件
2.程序的流程是,首先通过路由登录网址,然后由index函数来渲染,由于刚开始没有登录,所以直接跳转到登录页面。在登录页面中由login函数来渲染,首先是get方法,然后进入index.html的templates文件进行渲染。这个时候,输入用户名和密码,点击提交后,为post方法,也是在当前页面进行,也就是由login函数进行渲染。此时,通过request.POST.get方法拿到用户输入的用户名和密码,并与数据库中的进行比对,若存在,则向下进行,若不存在,则输出用户名或密码错误。
如果该用户存在,且密码正确。则在httpresponse函数中,给用户设置cookie_sessionid的值。然后接下来在服务器端建立一个mysessionid和userModel.name(数据库中的用户名)的字典(映射关系)。然后返回到主页127.0.0.1:8000中。由index函数进行渲染。此时的index函数中,会拿到cookies中的sessionid的值并看能否由这个sessionid得到用户名,若能得到,则不用再次登录,若得不到,则返回到登录页面。