python,day22-sessin



Session:

  session 依賴於cookie

  流程: 用戶登陸之後,客戶端自動生成一個隨機字符串,發送給服務器端,服務器端將隨機字符串以及敏感信息保存在數據庫裏,cookie 保存隨機字符串 session 保存所有信息

  基於cookie 做用戶驗證時: 敏感信息不適合存放在cookie 中,  但優點是: 把存儲數據的壓力放在客戶端,服務端壓力小了

  Session 原理:

     cookie 是保存在用戶瀏覽器端的鍵值對

     session 是保存在服務端的鍵值對

  在做session 之前必須得先執行 python manage.py makemigrations 和 python manage.py migrate

   session 默認的超時時間爲2周 默認存儲在數據庫裏面


session超時實例

from django.shortcuts import render,redirect,HttpResponse
from django.views import View
from pro1 import models
# Create your views here.

class login(View):
    def get(self,request,**kwargs):
        return render(request, "login.html")

    def post(self,request):
        user = request.POST.get('username')
        pwd = request.POST.get('password')
        if models.Usersinfo.objects.filter(username=user,password=pwd).first():
            request.session['username'] = user  # 設置session值
            request.session['is_login'] = True
            if request.POST.get('rmb',None) == '1':
                # 超時時間
                request.session.set_expiry(10)
            # print(request.POST.get('rmb',None))
            return redirect('/index')
        else:
            return render(request,'login.html')

class index(View):
    def get(self,request):
        if request.session.get('is_login',None):
            return render(request,'index.html',{'username': request.session['username']})
        else:
            return redirect('/login')

class logout(View):
    def get(self,request):
        request.session.clear()
        return redirect('/login')


login.html

<div>
    <form action="/login" method="post">
        <p><span>用戶名:</span><input type="text" placeholder="username" name="username"></p>
        <p><span>密碼:</span><input type="password" placeholder="password" name="password"></p>
        <p><input type="submit" value="提交"><input type="checkbox" name="rmb" value="1">10秒免登錄</p>
    </form>
</div>


index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>歡迎登錄: {{ username }},{{ request.session.username }}</h1>
    <a href="/logout">註銷</a>
</body>
</html>


request.session.set_expiry(value) 設置超時時間

    * 如果value是個整數,session會在些秒數後失效。

    * 如果value是個datatime或timedelta,session就會在這個時間後失效。
    * 如果value是0,用戶關閉瀏覽器session就會失效。
    * 如果value是None,session會依賴全局session失效策略。

  默認值:

    SESSION_COOKIE_NAME = "sessionid"     # Session 的cookie保存在瀏覽器上時的key

    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周)  (默認)   set_cookie('k',123)

    SESSION_SAVE_EVERY_REQUEST = False  # 是否每次請求都保存Session 默認修改之後才保存(默認)

  如果想頁面在放置時間超過一定的時間才生效,需要在settings.py 裏面設置:

    session_save_every_request=True 

  使用:

    獲取session數據:

      request.session['k1']  如果沒有數據會報錯

      request.session.get('k1',None)

    設置session

      request.session['k1'] = 123

      request.session.setdefault('k1',123) 存在則不設置

    刪除session

      del request.session['k1']

    所有鍵、值、鍵值對

      request.session.keys()

      request.session.values()

      request.session.items()

      request.session.iterkeys()

      request.session.iteervalues()

      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')

  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,默認修改之後才保存(默認)


支持保存在緩存    緩存爲memcache django 不支持redis,但是有redis的相關插件

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,默認修改之後才保存


支持文件session

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,默認修改之後才保存


緩存 + 數據庫 session

數據庫用於做持久化,緩存用於提高效率
  
 配置 settings.py
  
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎


加密cookie Session

配置 settings.py
      
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎


session 驗證:

def login(func):
    def wrap(request, *args, **kwargs):
        # 如果未登陸,跳轉到指定頁面
        if request.path == '/test/':
            return redirect('http://www.baidu.com')
        return func(request, *args, **kwargs)
    return wrap


CSRF:

  django爲用戶實現防止跨站請求僞造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求僞造功能有分爲全局和局部。

  csrf 原理 使用隨機字符串 csrf_token

  在頁面上如果要顯示: ` csrf_token ` 隱藏: {% csrf_token %}

  ****注: 請求頭不能出現下劃線 X-CSRFtoken

  全局: 中間件 在settings.py 中 設置 django.middleware.csrf.CsrfViewMiddleware

  局部:

    * @csrf_protect 爲當前函數強制設置防跨站請求僞造功能,即便settings中沒有設置全局中間件。

    * @csrf_exempt 取消當前函數防跨站請求僞造功能,即便settings中設置了全局中間件。

  注: from django.views.decorators.csrf import csrf_exempt,csrf_protect

 

  應用:

    1、普通表單 Form  

veiw中設置返回值:
  return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))  
     或者
     return render(request, 'xxx.html', data)
   
html中設置Token:
  {% csrf_token %}


    2、Ajax

from django.template.context import RequestContext
# Create your views here.
   
   
def test(request):
   
    if request.method == 'POST':
        print request.POST
        return HttpResponse('ok')
    return  render_to_response('app01/test.html',context_instance=RequestContext(request))


html

全局配置csrf:
    $(function(){
         $.ajaxSetup({
            beforeSend: function(xhr,settings){
                xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'))
        }
      });
          $('#btn1').click(function(){
                *****
         })
          
    })
 
單個ajax
 
    $(function(){
           $('#btn').click(function(){
                $.ajax({
                   url: "/login/",
                   type: "POST",
                   data: {"user": 'root',"pwd": '123'}
                   headers: {'X-CSRFtoken': $.cookie('csrftoken')},
                   success: function(arg){
                  }   
            })
 
           })
    })









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章