python 終極篇 cookie與session

(1)cookie與session---------->>>>>>>>>>>>>>>>>>>>.>>>>>
    1,爲何http協議是無狀態的就能夠直接訪問任何頁面.
        由於http協議無狀態,因此他誰也不認識,只要你給請求,我就返回頁面.
        若要解決這個問題,能夠設置cookie與session.
    2. cookie
        1. cookie是什麼?
            cookie是服務器讓瀏覽器保存在瀏覽器上一組組鍵值對
            
        Cookie的原理:
            cookie的工做原理是:由服務器產生內容,瀏覽器收到請求後保存在本地;
                  當瀏覽器再次訪問時,瀏覽器會自動帶上Cookie,這樣服務器就能經過Cookie的內容來判斷這個是「誰」了。

            
        2. 特性:
            1. 是服務器讓瀏覽器設置的。瀏覽器有權利不設置。
            2. 訪問其餘頁面的時候攜帶着cookie。
        
        3. 能幹什麼?
            1. 作登陸
            2,限制訪問頻率
            3.記錄瀏覽習慣
            4.簡單的投票
    3,爲何瀏覽器屏蔽掉cookie以後就不能登陸???
        由於你提交的時候,服務器會讓瀏覽器設置一個cookie,可是你不設置,因此就不讓你登陸.
        
        django中操做cookie
                1. 設置cookie
                    rep = redirect('/index/')
                    rep.set_cookie(key,value,max_age=1000)
                    rep.set_signed_cookie(key,value,max_age=1000,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獲取(不是絕對,底層抓包能夠獲取到也能夠被覆蓋)

                2. 獲取cookie
                    request.COOKIES['key']   
                    request.COOKIES.get('key')        ——》推薦的取法
                    
                    request.get_signed_cookie('key',salt='')  加鹽方式
                    
                        get_signed_cookie方法的參數:
                        •default: 默認值
                        •salt: 加密鹽
                        •max_age: 後臺控制過時時間

                    
                    request.method 
                    request.POST        ——》POST請求提交的數據  {}
                    request.GET            ——》URL上的參數    /?id=11&name=xx
                    request.FILES         ——》上傳的文件
                3. 刪除cookie
                    rep.delete_cookie('key')
            獲取用request,刪除和設置都用response對象操做.

    注意:form表單中action=""  什麼也別填了,填了有可能出問題,有深坑.
        http://127.0.0.1:8000/login/?retuen=/home/     action="/login/"這樣提交的地址實際上是/login/,不加的話地址纔是/login/?retuen=/home/  
        
    4,cookie的缺點???
        保存在瀏覽器上不安全;請求的時候發的時候,cookie有長度限制64,若是無限大的話 卡死了就
        
    5,session: 都是request操做的,
        session是保存在服務器上的鍵值對,依賴於cookie
        
        django中操做session
                1. 設置session
                    request.session['key'] = value 
                    request.session.setdefault(key,value)            ——》 存在就不設置
                2. 獲取session
                    request.session['key']
                    request.session.get(key,'')
                3. 刪除session
                    request.session.pop(key)        ——》 刪除某一個鍵值對
                    del request.session['key']
                    
                    request.session.delete()        ——》刪除全部的session鍵值對
                    request.session.flush()            ——》刪除全部的session鍵值對.刪除了cookie
                4. 設置超時時間
                    request.session.set_expiry()
                5. 清除當前過時的session
                    request.session.clear_expired()
                    
            # 獲取、設置、刪除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的key
                request.session.session_key

                # 將全部Session失效日期小於當前日期的數據刪除
                request.session.clear_expired()

                # 檢查會話session的key在數據庫中是否存在
                request.session.exists("session_key")

                # 刪除當前會話的全部Session數據
                request.session.delete()
                  
                # 刪除當前的會話數據並刪除會話的Cookie。
                request.session.flush() 
                    這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問
                    例如,django.contrib.auth.logout() 函數中就會調用它。

                # 設置會話Session和Cookie的超時時間
                    request.session.set_expiry(value)
                    * 若是value是個整數,session會在些秒數後失效。
                    * 若是value是個datatime或timedelta,session就會在這個時間後失效。
                    * 若是value是0,用戶關閉瀏覽器session就會失效。
                    * 若是value是None,session會依賴全局session失效策略。
        
    6,流程----->>>>> 瀏覽器首次訪問服務器的時候沒有cookie,而後訪問服務器,服務器會生成一個session_ID字典,字典的值爲瀏覽器的數據和cookie(一個隨機字符串),
                    而後返回session_ID給瀏覽器,下次瀏覽器再來的時候攜帶session_ID訪問服務器,能夠惟一找到對應的服務器存儲的session,而且
                    打開這個字典,並從中取到值作對應校驗,檢驗是否正確可否訪問
                    注意:一個session對應一個cookie,而且一個瀏覽器對應一個session數據
                    
        session存在數據庫中,默認存在django_session表中,也能夠存在一個文件當中,或者緩存當中,這個取決於你的設置.

django中的session配置:html

1. 數據庫Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默認)

2. 緩存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的緩存別名(默認內存緩存,也能夠是memcache),此處別名依賴緩存的設置

3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 緩存文件路徑,若是爲None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() 

4. 緩存+數據庫
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

其餘公用設置項:
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,默認修改以後才保存(默認)

Django中Session相關設置
session配置

登陸校驗實例:數據庫

 

from django.shortcuts import render,redirect,HttpResponse

# Create your views here.

def login(request):
    err_msg = ""
    if request.method == "POST":
        username = request.POST.get("username")
        pwd = request.POST.get("pwd")
        if username == "alex" and pwd == "123":
            print(request.get_full_path())
            path = request.GET.get("retuen","/index/")
            ret = redirect(path)
            # ret.set_cookie("is_login","True")
            request.session["is_login"] = "True"
            return ret
        else:
            err_msg = "用戶名或密碼錯誤"
    return render(request,"login.html",{"err_msg":err_msg})

def aaa(fn):
    def inner(request,*args,**kwargs):
        return_path = request.path_info
        # if request.COOKIES.get("is_login","") == "True":
        if request.session.get("is_login","") == "True":
            ret = fn(request,*args,**kwargs)
            return ret
        else:
            return redirect("/login/?retuen={}".format(return_path))
    return inner

@aaa
def index(request):
    return render(request,"index.html")

@aaa
def home(request):
    return HttpResponse("這是home頁面")
views文件

 

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login),
    url(r'^index/', views.index),
    url(r'^home/', views.home),
]
urls文件
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>用戶名:<input type="text" name="username"></p>
    <p>密碼:<input type="password" name="pwd"></p>
    <button>提交</button>
    {{ err_msg }}
</form>

</body>
</html>
login.html
相關文章
相關標籤/搜索