django系列7.2--django中的cookie和session基本操做,瀏覽器登錄驗證的不一樣實現

django中的cookie和session(02)–操做

一.Django中的cookie操做

ctrl + shift + del 是谷歌瀏覽器中清除頁面緩存和cookie的快捷鍵javascript

1.設置cookie

語法:html

# 獲得須要返回的的操做
rep = HttpResponse(...)
rep = render(request, ...)

# 設置cookie
rep.set_cookie(key,value,...)
# 設置加密cookie
rep.set_signed_cookie(key,value,salt='加密鹽', max_age=None, ...)

# 參數:
	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獲取(不是絕對,底層抓包能夠獲取到也能夠被覆蓋)

<br/>java

2.獲取cookie

語法:python

# 普通獲取
request.COOKIES['key']  
# 獲取加密cookie
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)  

# 參數:
	default: 默認值
	salt: 加密鹽
	max_age: 後臺控制過時時間

<br/>數據庫

3.刪除cookie

request.COOKIES["KEY"]  # 直接獲取cookie的方法
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)  # 獲取加密cookie的方式

def logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("user")  # 刪除用戶瀏覽器上以前設置的usercookie值
    return rep

jQuery中操做cookiedjango

$.cookie('the_cookie', 'the_value');  // 添加一個"會話cookie
$.cookie('the_cookie');  //讀取cookie
$.cookie('the_cookie', null);   //刪除cookie 經過傳遞null做爲cookie的值便可

<br/>瀏覽器

4.使用cookie實現簡單的登錄校驗:

數據庫內有tom和bob兩個用戶名,密碼均爲123緩存

views.pycookie

def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")

        query_list = models.UserInfo.objects.filter(username=username,password=password)
        if query_list.exists():
            ret = redirect('index')

            # ret.set_cookie("is_login", True, max_age=10)  # max_age=10  10秒以後失效
            # ret.set_cookie("username", username, max_age=10) # 10秒以後失效

            # 加密cookie的寫法
            ret.set_signed_cookie("is_login", True, "salt", max_age=10)
            ret.set_signed_cookie("username", username, "salt", max_age=10)

            return ret  # 登錄成功後跳轉主頁
        else:
            return render(request,"login.html")  # 登錄失敗以後返回登錄頁

def index(request):
    print(request.COOKIES)  # 打印看一下如今的cookie
    # is_login = request.COOKIES.get("is_login", False)
    # username = request.COOKIES.get("username")

    is_login = request.get_signed_cookie("is_login", False, "salt")
    username = request.get_signed_cookie("username",salt="salt")
    print(is_login)  # True
    print(type(is_login))  # <class 'str'>
    if is_login != 'True':
        return redirect('login')
    else:
        return render(request,"index.html",{"username":username})

login.htmlsession

<form action="{% url 'login' %}" method="post">
    {% csrf_token %}
<table>
    <tr>用戶名<input type="text" name="username" id="username"></tr>
    <tr>密碼<input type="password" name="password" id="password"></tr>
    <tr><input type="submit" value="登陸"></tr>
    </table>
</form>

index.html

<h1>歡迎{{ username }}來到主頁</h1>

數據庫中的表

<br/>

二.Django中的session操做

不一樣的網站session是不同的,這些操做都只是django提供的方法,其餘的框架不適用,須要本身來寫關於cookie和session的方法.

1.獲取session

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

request.session這句是從cookie裏面將sessionid的值取出來,將django-session表裏面的對應sessionid的值的那條記錄中的session-data字段的數據給取出來(並解密),get方法就取出k1這個鍵對應的值.可是django-session這個表,不能經過orm來直接控制,由於app中本身定義的models.py裏面沒有這個對應關係

<br/>

2.設置session

生成隨機字符串,自動將這個隨機字符串和用戶數據(加密後)和過時時間保存到了django-session表裏面,以後會自動將這個隨機字符串以sessionid:隨機字符串的形式添加到cookie裏面返回給瀏覽器,這個sessionid名字是能夠改的

request.session['k1'] = 100
request.session.setdefault('k1', 10) # 默認值存在則不設置

<br/>

3.刪除session

經常使用:

# 刪除當前的會話數據並刪除會話的Cookie。
request.session.flush()

上面的方法經常使用,會清空全部cookie---刪除session表裏的這個會話的記錄,這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問例如django.contrib.auth.logout() 函數中就會調用它。

其餘刪除方法:

# django-session表裏內會同步刪除
del request.session['k1']  

# 刪除當前會話的全部Session數據
request.session.delete()

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

<br/>

4.其餘的session相關方法

# 全部 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()

# 會話session的key
session_key = request.session.session_key  獲取sessionid的值

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

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

# 刪除當前會話的全部Session數據
request.session.delete()
  
# 刪除當前的會話數據並刪除會話的Cookie。
request.session.flush()  #經常使用,清空全部cookie

# 設置會話Session和Cookie的超時時間
request.session.set_expiry(value)
    * 若是value是個整數,session會在些秒數後失效。
    * 若是value是個datatime或timedelta,session就會在這個時間後失效。
    * 若是value是0,用戶關閉瀏覽器session就會失效。
    * 若是value是None,session會依賴全局session失效策略。

<br/> ## 5.Django中的Session配置

django中默認支持session, 其內部提供了5種類型的session供開發者使用

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

<br/> ## 6.使用session實現簡單的登錄校驗,註銷

def login(request):
    if request.method == 'GET':
        return render(request,"login.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")
		# 查詢用戶名和密碼
        ret_obj_list = models.UserInfo.objects.filter(username=username,password=password)
        if ret_obj_list.exists():
            request.session['session_login'] = True
            request.session['username'] = username

            # session中的數據至關於data = {"session_login":True,"user":username}
            return redirect("index")
        else:
            return render(request,"login.html")

def index(request):
    print(request.COOKIES)

    ret = request.session.get("session_login")  # 也能夠這麼寫 ret = request.session["session_login"]
    print(ret, type(ret))

    if ret!=True:
        return redirect("login")
    else:
        username = request.session.get("username")
        return render(request, "index.html",{"username":username})

def logout(request):
    request.session.flush()
    return redirect('logout')

login.html

urls中login頁面的別名爲login,註銷的url別名爲‘logout’

<form action="{% url 'login' %}" method="post">
    {% csrf_token %}
<table>
    <tr>用戶名<input type="text" name="username" id="username"></tr>
    <tr>密碼<input type="password" name="password" id="password"></tr>
    <tr><input type="submit" value="登陸"></tr>
    <tr><a href="{% url 'logout' %}">註銷</a></tr>
    </table>
</form>

index.html

<h1>歡迎{{ username }}來到主頁</h1>

相關文章
相關標籤/搜索