django form (something about cookie and sessionid)

今天来总结一下关于表单中涉及到的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
View Code

 

接下来是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>
View Code

结果如下图:

第一次输入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得到用户名,若能得到,则不用再次登录,若得不到,则返回到登录页面。

posted @ 2017-09-13 17:38  shadowsmile  阅读(245)  评论(0编辑  收藏  举报