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‘View Code^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 importHttpResponse,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>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得到用戶名,若能得到,則不用再次登錄,若得不到,則返回到登錄頁面。
django form (something about cookie and sessionid)