2014年11月5日 星期三

Django筆記(10)- Cookie 與 Session


cookie是儲存在客戶端瀏覽器中的暫時性訊息,負責讓伺服端和客戶端溝通更有效率。


使用Cookie

步驟一
修改 helloWorld/view.py(完整代碼如下)

from django.http import HttpResponse

def set_cookie(request):
    response = HttpResponse('Set username as Jacky')
    response.set_cookie('username','Jacky')
    return response

def get_cookie(request):
    if  'username' in request.COOKIES:
        return HttpResponse('username is %s'%request.COOKIES['username'])
    else:
        return HttpResponse('No cookies.')

步驟二
修改 mysite/mysite/urls.py(完整代碼如下)

from django.conf.urls import patterns, include, url
from django.contrib import admin

#引入app目錄下 views.py 的函數
from helloWorld.views import set_cookie, get_cookie

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^set_cookie/$', set_cookie),
    url(r'^get_cookie/$', get_cookie),
)

步驟三
開啟 server 後~
在網址列打上 127.0.0.1:8000/set_cookie/ 設置cookie

步驟四
開啟 server 後~
在網址列打上 127.0.0.1:8000/get_cookie/ 觀看cookie

※Cookie 有以下兩種問題
第一 : 用戶可關閉cookies的功能
第二 : cookie以明文傳輸,容易被攔截、竄改、偽造

為了解決cookies的弱點,我們還有一個更強大的機制:Session

使用Session
Session之所以能夠解決cookie的問題,是因為他把資訊存在伺服端

步驟一
修改 helloWorld/view.py(完整代碼如下)

def use_session(request):
    if  'name' in request.session:
        return HttpResponse('your name is %s'%request.session['name'])
    else:
        request.session['name'] = 'Jacky'
        return HttpResponse('Set name as Jacky')

步驟二
修改 mysite/mysite/urls.py(完整代碼如下)

from django.conf.urls import patterns, include, url
from django.contrib import admin

#引入app目錄下 views.py 的函數
from helloWorld.views import use_session

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^use_session/$', use_session),
)

步驟三
開啟 server 後~
在網址列打上 127.0.0.1:8000/use_session/ 設置session

步驟四
重新整理頁面後可看到session已經成功儲存

※進入Django Shell可刪除session
> python manage.py shell
>>> from django.contrib.sessions.models import Session
>>> Session.objects.all().delete()


使用 session 防止表單重複提交

步驟一
在 mysite/mysite/settings.py 添加以下代碼

#決定Session是否在瀏覽器關閉時失效,預設為False
SESSION_EXPIRE_AT_BROWSER_CLOSE = True 

步驟二
修改 helloWorld/view.py(完整代碼如下)

def helloWorld(request):
    if 'ok' in request.POST:
        name = request.POST['name']
        phone = request.POST['phone']
        f = checkForm(request.POST)
        if f.is_valid() and name != '請輸入名字':
            #如果session沒有被設置,才將資料加入資料庫
            if 'ok' not in request.session:
                request.session['ok'] = 'ok'
                Vendor.objects.create(name=name, phone=phone)
            else:
                return HttpResponse('成功防止按F5重複提交表單!')
            #觀看資料庫
            vendors = Vendor.objects.all()
            return render_to_response('dataBase.html',locals())
        else:
            return render_to_response('test.html',locals())
    else:
        f = checkForm(initial={'name':'請輸入名字'})
        return render_to_response('test.html',locals())

步驟三
修改 mysite/mysite/urls.py(完整代碼如下)

from django.conf.urls import patterns, include, url
from django.contrib import admin

#引入app目錄下 views.py 的函數
from helloWorld.views import helloWorld

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^helloWorld/$', helloWorld),
)

步驟四
開啟 server 後~
在網址列打上 127.0.0.1:8000/helloWorld/ 新增資料並設置session


步驟五
按F5刷新頁面後可看到表單並不會重複提交


                                                                    上一篇    回目錄    下一篇

沒有留言:

張貼留言