cookie和session

cookie和session

因爲HTTP協議是無狀態的,沒法記錄,也就是說每次訪問都會把訪問者當成一個新的對象,那瀏覽器來講,若是瀏覽器關閉cookie,全部須要登陸的功能都不能用。css

瀏覽器關閉方式:html

打開瀏覽器設置》高級設置》》網站設置》cookie關閉前端

查看方式:python

打開瀏覽器》F12》選擇Application》jquery

​ cookie是保存在客戶端瀏覽器上的鍵值對django

​ 是服務端設置在客戶啊短瀏覽器上的鍵值對也就意味着瀏覽器實際上是能夠拒絕服務端命令的,默認狀況下瀏覽器都是直接讓服務器設置鍵值對bootstrap

​ Django三板斧:後端

return  HTTPResponse()

​               return  render()

​               return  redirect()

​               變形:

​                   obj1 = HTTPResponse()

​                   return  obj1

​                   obj2 = render()

​                   return obj2
​                   obj3 = redirect()
​                   return obj3

設置cookie

obj.set_cookie()瀏覽器

rep = HttpResponse(...)
rep = render (request, ...)
rep.set_ cookie(key,value,...)
rep.set_ signed cookie (key,value,3a1t='加密鹽',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獲取 (不是絕對,底層抓包能夠獲取到也能夠被覆蓋)緩存

獲取

request.COOKIES.get()

request.COOKIES['key']
request.get_signed_cookie{key,default=RAISE_ERROR, salt='', max_age=None}

​ 參數:

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

刪除

​ obj.delete_cookie

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

session

session是保存在服務器上的鍵值對

django session默認的過時時間是14天

session
session是保存在服務器上的鍵值對

django session默認的過時時間是14天

操做session

設置session
request.session['key'] = value # 僅僅只會在內存產生一個緩存
"""
1.django內部自動生成了隨機的字符串
2.在django_session表中存入數據
session_key session_data date
隨機字符串1 數據1 ...
隨機字符串2 數據2 ...
隨機字符串3 數據3 ...
3.將產生的隨機字符串發送給瀏覽器 讓瀏覽器保存到cookie中
sessionid:隨機字符串

"""
獲取session
request.session.get('key')
"""
1.瀏覽器發送cookie到django後端以後 django會自動獲取到cookie值
2.拿着隨機字符串去django_session表中比對 是否有對應的數據
3.若是比對上了 就講隨機字符串所對應的數據 取出賦值給request.session
若是對不上 那麼request.session就是個空

"""

django session表是針對瀏覽器的
不一樣的瀏覽器來 纔會有不一樣的記錄

刪除session
request.session.delete() # 只刪除服務端的session

request.session.flush() # 瀏覽器和服務端所有刪除

session也能夠設置超時時間
request.session.set_expiry(value多種配置)

  • 若是value是個整數,session會在些秒數後失效。
  • 若是value是個datatime或timedelta.session就會在這 個時間後失效。
  • 若是value是0,用戶關閉瀏覽器session就會失效。
  • 若是value是None, session會依賴全局session失效策略。
    刪除後:

總結:總結而言: Cookie彌補了HTTP無狀態的不足,讓服務器知道來的人是」誰」;可是Cookiel以文本的形式保存在本地,自身安全性較差;因此咱們就經過Cookie識別不一樣的用戶,對應的在Session裏保存私密的信息以及超過4096字節的文本。另外,上述所說的Cookie和Session實際上是共通性的東西, 不限於語言和框架。

代碼實現以上功能:

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login),
    url(r'^home/', views.home),
    url(r'^index/', views.index),
    url(r'^logout/', views.logout),
    url(r'^set_session/', views.set_session),
    url(r'^get_session/', views.get_session),
    url(r'^delete_session/', views.delete_session),
]

settings.py

註釋'django.middleware.csrf.CsrfViewMiddleware',
配置: STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

views.py

from django.shortcuts import render, HttpResponse, redirect

# Create your views here.


def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'zhang' and password == '123':
            old_path = request.GET.get('next')
            if old_path:
                # 保存用戶登陸狀態
                obj = redirect(old_path)
            else:
                obj = redirect('/home/')
            obj.set_cookie('name', 'zhang') # 讓客戶端瀏覽器 記錄一個鍵值對
            return obj
    return render(request, 'login.html')


from functools import wraps


def login_auth(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        if request.COOKIES.get('name'):
            res = func(request, *args, **kwargs)
            return res
        else:
            target_url = request.path_info
            return  request('/login/?next=%s'%target_url)
    return inner


@login_auth
def home(request):
    return HttpResponse('請先登陸')


@login_auth
def index(request):
    return HttpResponse('index也須要先登陸')


@login_auth
def logout(request):
    obj = redirect('/login/')
    obj.delete_cookie('name')
    return obj


def set_session(request):
    request.session['username'] = 'li'
    request.session.set_expiry(value=0)
    request.session['password'] = '123'
    return HttpResponse("設置session")


def get_session(request):
    print(request.session.get('username'))
    print(request.session.get('password'))
    return HttpResponse('獲取session')


def delete_session(request):
    request.session.flush()
    return HttpResponse("刪除session")

tests.py

from django.test import TestCase

# Create your tests here.
from functools import wraps
def login_auth(func):
    @wraps(func)
    def inner(*args,**kwargs):
        """我是inner函數"""
        res = func(*args,**kwargs)
        return res
    return inner

@login_auth  # login(變量名) = login_auth(真正的login函數內存地址)
def login():
    """
    我是login函數
    :return:
    """
    ...
print(login)
print(help(login))

前端文件login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</head>
<body>
<form action="" method="post">
    <p>username:<input type="text", name="username"></p>
    <p>password:<input type="text", name="password"></p>
    <input type="submit">
</form>
</body>
</html>
相關文章
相關標籤/搜索