Django之cookie、session、token


cookie 與session

目的:是為了保存客戶端的狀態

原因:因為HTTP協議是無狀態的

由於http協議是無狀態的 所以我們需要發明一些能夠保存用戶的技術

cookie:

​ cookie是保存在客戶端瀏覽器上的鍵值對,是由服務端生成,然后發送給客戶端瀏覽器保存的。因此,瀏覽器有權限禁止寫入cookie,這個功能可以在瀏覽器中設置。

django如何操作cookie:

	obj = HttpResponse()  # 利用obj對象才能操作cookie
    return obj

	obj = render()
    return obj

	boj = redirect()
    return obj 

設置cookie:obj.set_cookie('k1','v1')

	obj.set_cookie('k1','v1')  # 告訴瀏覽器設置

獲取cookie:request.COOKIES.get('k1')

request.COOKIES.get('k1')	# 獲取瀏覽器攜帶過來的cookie值

設置超時時間:obj.set_cookie('k1','v1',max_age=3)

obj.set_cookie('k1','v1',max_age=3)  # 針對谷歌瀏覽器,用max_age
obj.set_cookie('k1','v1',expires=3)	 # 針對IE瀏覽器,用expires

刪除cookie(注銷,退出登錄),一般不會刪除。

基於cookie實現用戶登錄校驗

裝飾器
	用戶在沒有登錄之前如果訪問了一個需要登錄之后才能訪問的頁面
	那么會先跳轉到登錄頁面 用戶輸入用戶名和密碼並正確的情況下
	再自動跳轉到之前用戶想要訪問的頁面
		1.request.path_info
		2.利用get請求攜帶參數的方法

session:

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

​ session的工作機制是需要依賴於cookie的

設置session:request.session['k1'] = 'v1'

request.session['k1'] = 'v1'
#  第一次設置的時候會報錯,是因為你沒有執行數據庫遷移命令 生成django需要用到的一些默認表(django_session)
# django默認的session失效時間是14天  2周
request.session['k1'] = 'v1'

"""
執行上面這一句代碼會發生了哪些事兒
1.djang內部自動幫你調用算法生成一個隨機的字符串
2.在django_session表中添加數據(數據也是加密處理)
隨機字符串         加密之后的數據           失效時間
ashdjsad            jsadsada
3.將產生的隨機字符串返回給客戶端瀏覽器 讓瀏覽器保存
sessionid:隨機字符串
"""

獲取session:request.session.get('k1')

request.session.get('k1')
"""
1.django內部會自動去請求頭里面獲取cookie
2.拿着sessionid所對應的隨機字符串去django_sessoion表中一一比對
3.如果比對上了 會將隨機字符串對應的數據獲取出來 自動放入request.session中供程序員調用
如果沒有就是一個空字典
"""

刪除session:request.session.delete()

request.session.delete()
# 客戶端和服務端全部刪除  只會根據瀏覽器的不同刪對應的數據

設置失效時間:request.session.set_expiry(value)

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

session版的登錄校驗:

from functools import wraps


def check_login(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        next_url = request.get_full_path()
        if request.session.get("user"):
            return func(request, *args, **kwargs)
        else:
            return redirect("/login/?next={}".format(next_url))
    return inner


def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")

        if user == "alex" and pwd == "alex1234":
            # 設置session
            request.session["user"] = user
            # 獲取跳到登陸頁面之前的URL
            next_url = request.GET.get("next")
            # 如果有,就跳轉回登陸之前的URL
            if next_url:
                return redirect(next_url)
            # 否則默認跳轉到index頁面
            else:
                return redirect("/index/")
    return render(request, "login.html")


@check_login
def logout(request):
    # 刪除所有當前請求相關的session
    request.session.delete()
    return redirect("/login/")


@check_login
def index(request):
    current_user = request.session.get("user", None)
    return render(request, "index.html", {"user": current_user})

Session版登錄驗證

django session在創建數據的時候是針對瀏覽器的

能夠作為數據庫的有如下幾種:

數據庫軟件

文件

內存

token:加密字符串

用加密算法將字符串處理成密文字符

django中間件

django中間件簡介

在django項目文件中的settings.py文件中,有一列表MIDDLEWARE就是中間件,默認有7項:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

只要你想要做一些網站的全局性功能 你都應該考慮使用django的中間件
1.全局的用戶登錄校驗
2.全局的用戶訪問頻率校驗
3.全局的用戶權限校驗() 20行代碼 100+ RBAC

據說:在所有框架中,django的中間件是最完善的

5個自定義方法

django支持用戶自定義中間件,給出了5個可以自定義的方法:

1、process_request

請求來的時候會按照從上往下的順序 依次執行settings配置文件中每一個中間件內部定義的process_request方法,如果中間件內部沒有該方法 直接跳過執行下一個中間件.

任意中間件一旦返回了HttpResponse對象,name請求會立即停止前進,然后原路返回

2、process_response

2.1 響應走的時候會按照從下往上的順序,依次執行settings配置文件中每一個中間件內部定義的process_response方法。
2.2 該方法必須有兩個形參, 並且必須返回response形參,不返回就會報錯
2.3 該方法返回什么(HttpResponsed對象) 前端獲得的就是什么

注意:當process_request方法直接返回HttpResponse對象之后 會直接從當前中間件里面的process_respone往回走,沒有執行的中間件都不會再執行

3、process_view(self, request, view_name, *args, **kwargs)

3.1 路由匹配成功之后執行視圖函數之前觸發
3.2 如果該方法返回了HttpResponse對象 那么會從下往上一次經過每一個中間件里面的process_response方法

4、process_template_respose

1.當你返回的對象中含有render屬性指向的是一個render方法的時候才會觸發 從下往上的順序

def mdzz(request):
	print('我是視圖函數mdzz')
	def render():
		return HttpResponse('你好呀 我是奇葩')
	obj = HttpResponse('我很好 好的像個傻逼一樣')
	obj.render = render
	return obj

5、process_exception

當視圖函數中出現錯誤,會自動觸發 ,順序是從下往上。發

CRM 客戶關系管理系統

Customer Relationship Managment


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM