Django進階(Cookie和Session)

  HTTP協議是無狀態的,因此在客戶端向服務端發起請求後,服務端在響應頭加入cookie給客戶端瀏覽器,以此記錄客戶端狀態;cookie是來自服務端,保存在瀏覽器的鍵值對,主要應用於用戶登陸。
  好比liao用戶登陸了服務器,服務器返回了一個鍵值對:html

{ "is_login": "etrashdkjndas6ioiwdgvqjbwhkje"}

一、Django Cookie應用

設置cookie
rep = HttpResponse(...) 或 rep = render(request, ...)
 
一、普通 rep.set_cookie(key,value,...)
二、加鹽 rep.set_signed_cookie(key,value,salt='加密鹽',...)
    參數:
        key,              鍵
        value='',         值
        max_age=None,     超時時間
        expires=None,     超時時間(IE requires expires, so set it if hasn't been already.)
        path='/',         Cookie生效的路徑,/ 表示根路徑,特殊的:跟路徑的cookie能夠被任何url的頁面訪問
        domain=None,      Cookie生效的域名
        secure=False,     https傳輸
        httponly=False    只能http協議傳輸,沒法被JavaScript獲取(不是絕對,底層抓包能夠獲取到也能夠被覆蓋)
 
獲取cookie
一、普通 request.COOKIES['key'] 或者 request.COOKIES.get('key')
二、加鹽 request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
    參數:
        default: 默認值
           salt: 加密鹽
        max_age: 後臺控制過時時間前端

因爲cookie保存在客戶端的電腦上,因此,JavaScript和jquery也能夠操做cookiepython

<script src='/static/js/jquery.cookie.js'></script>
$.cookie("list_pager_num", 30,{ path: '/' });

 示例:jquery

#設置cookie
def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    elif request.method == 'POST':
		u = request.POST.get('username') 
		p = request.POST.get('pwd') 
		dic = user_info.get(u) 
		if not dic: 
			return render(request, 'login.html') 
		if dic['pwd'] == p: 
			res = redirect('/index/') 
			res.set_cookie('username', u) 
			return res 
		else: 
			return render(request, 'login.html')

 二、Django Session應用

cookie看似解決了HTTP(短鏈接、無狀態)的會話保持問題,但把所有用戶數據保存在客戶端,存在安全隱患,
因而cookie+session出現了!咱們能夠 把關於用戶的數據保存在服務端,在客戶端cookie里加一個sessionID(隨機字符串)數據庫

session做用:
會話保持,記住用戶的登陸狀態(WEB網站,分佈式架構)

和cookie的區別:
避免了敏感信息保存在客戶端,防止客戶端修改cookie信息django

要使用session,必須先作如下的步驟建立django_sesseion表:
python manage.py makemigrations
python manage.py migrate瀏覽器

Django中默認支持Session,其內部提供了5種類型的Session供開發者使用:
一、數據庫(默認)
二、緩存
三、文件
四、緩存+數據庫
五、加密cookie緩存

數據庫Session安全

Django默認支持Session,而且默認是將Session數據存儲在數據庫中,即:django_session 表中
a. 配置 settings.py
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默認)     
    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路徑(默認)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默認)
    SESSION_COOKIE_SECURE = False                            # 是否Https傳輸cookie(默認)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http傳輸(默認)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默認)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否關閉瀏覽器使得Session過時(默認)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次請求都保存Session,默認修改以後才保存(默認)
b. 使用 
    def index(request):
        # 獲取、設置、刪除Session中數據
        request.session['k1']
        request.session.get('k1',None)
        request.session['k1'] = 123
        request.session.setdefault('k1',123) # 存在則不設置
        del request.session['k1']
 
        # 全部 鍵、值、鍵值對
        request.session.keys()
        request.session.values()
        request.session.items()
        request.session.iterkeys()
        request.session.itervalues()
        request.session.iteritems()
 
        # 用戶session的隨機字符串
        request.session.session_key
 
        # 將全部Session失效日期小於當前日期的數據刪除
        request.session.clear_expired()
 
        # 檢查 用戶session的隨機字符串 在數據庫中是否
        request.session.exists("session_key")
 
        # 刪除當前用戶的全部Session數據
        request.session.delete("session_key")
 
        request.session.set_expiry(value)
            * 若是value是個整數,session會在些秒數後失效。
            * 若是value是個datatime或timedelta,session就會在這個時間後失效。
            * 若是value是0,用戶關閉瀏覽器session就會失效。
            * 若是value是None,session會依賴全局session失效策略。

 緩存Session服務器

a. 配置 settings.py
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的緩存別名(默認內存緩存,也能夠是memcache),此處別名依賴緩存的設置
	
    SESSION_COOKIE_NAME = "sessionid"                        # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串
    SESSION_COOKIE_PATH = "/"                                # Session的cookie保存的路徑
    SESSION_COOKIE_DOMAIN = None                              # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False                             # 是否Https傳輸cookie
    SESSION_COOKIE_HTTPONLY = True                            # 是否Session的cookie只支持http傳輸
    SESSION_COOKIE_AGE = 1209600                              # Session的cookie失效日期(2周)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                   # 是否關閉瀏覽器使得Session過時
    SESSION_SAVE_EVERY_REQUEST = False                        # 是否每次請求都保存Session,默認修改以後才保存

b. 使用
 
    同上

 文件Session

a. 配置 settings.py
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 緩存文件路徑,若是爲None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
 
    SESSION_COOKIE_NAME = "sessionid"                          # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串
    SESSION_COOKIE_PATH = "/"                                  # Session的cookie保存的路徑
    SESSION_COOKIE_DOMAIN = None                                # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False                               # 是否Https傳輸cookie
    SESSION_COOKIE_HTTPONLY = True                              # 是否Session的cookie只支持http傳輸
    SESSION_COOKIE_AGE = 1209600                                # Session的cookie失效日期(2周)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                     # 是否關閉瀏覽器使得Session過時
    SESSION_SAVE_EVERY_REQUEST = False                          # 是否每次請求都保存Session,默認修改以後才保存
 
b. 使用
    同上

 緩存+數據庫Session

數據庫用於作持久化,緩存用於提升效率
a. 配置 settings.py
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
 
b. 使用
 
    同上

 加密cookie Session

a. 配置 settings.py     
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
 
b. 使用
 
    同上

 簡單示例:

def login_user(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            all_data = form.clean()   #獲取post數據,例如 {'username': u'yang1', 'password': 111}
            exist = User.objects.filter(username = all_data['Form_username'],password = all_data['Form_password']).first()
            if exist:
                request.session['IS_LOGIN'] = True  #設置session的隨機字段值
                request.session['uname'] = exist.username   #設置uname字段爲登陸用戶
                return HttpResponseRedirect('/polls/home')
            else:
                return HttpResponse("帳戶或密碼錯誤")
    else:
        form = LoginForm()
    return render(request, 'polls/login_user.html', {'form': form})

def home(request):
    is_login = request.session.get('IS_LOGIN', False)
    if is_login:
        username = request.session.get('uname', False)   #獲取登陸用戶名
        return render(request, 'polls/home.html', {'username': username}) #用戶名渲染到前端頁面
    else:
        return HttpResponseRedirect("/polls/login_user")

def logout(request):
    del request.session['IS_LOGIN']  #刪除session退出
    return HttpResponseRedirect('/polls/login_user')

 login_user.html

    <form action="/polls/login_user" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <p>用戶名:{{ form.Form_username }}</p>
        <p>密碼:{{ form.Form_password }}</p>
        <input type="submit" value="登陸" />
</form>

 home.html

    <div class="header">
        <div style="float: right">{{ username }}</div>
        <div style="float: right"><a href="/polls/logout">註銷</a></div>
    </div>
相關文章
相關標籤/搜索