1. 程式人生 > >django form (something about cookie and sessionid)

django form (something about cookie and sessionid)

post方法 out view some 密碼錯誤 輸入密碼 csr ews dmi

今天來總結一下關於表單中涉及到的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(rlogin,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得到用戶名,若能得到,則不用再次登錄,若得不到,則返回到登錄頁面。

django form (something about cookie and sessionid)