欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python Web框架之Django框架cookie和session用法分析

 更新時(shí)間:2019年08月16日 10:20:08   作者:寧生信  
這篇文章主要介紹了Python Web框架之Django框架cookie和session用法,結(jié)合實(shí)例形式分析了Django框架cookie和session的常見使用技巧與操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Python Web框架之Django框架cookie和session用法。分享給大家供大家參考,具體如下:

part 1 概念

在Django里面,cookie和session都記錄了客戶端的某種狀態(tài),用來跟蹤用戶訪問網(wǎng)站的整個(gè)回話。

兩者最大的區(qū)別是cookie的信息是存放在瀏覽器客戶端的,而session是存放在服務(wù)器端的。

兩者使用的方式都是request.COOKIES[XXX]request.session[XXX],其中XXX是您想要取得的東西的key。

Cookie——保存在客戶端瀏覽器上的鍵值對

只要是HTTP協(xié)議,就會有COOKIE這個(gè)東西; 只要您的瀏覽器沒有禁用Cookie,就可是使用它。而且是不分用什么語言,用什么框架,因?yàn)檫@是在HTTP協(xié)議的層面支持的,瀏覽器會把您設(shè)置的XXX的這個(gè)Cookie在Response之后保存到您的本地機(jī)器,在下次您向服務(wù)器提交或者瀏覽的時(shí)候會把上次保存下來的COOKIE帶上發(fā)送向服務(wù)器;說到這里我們應(yīng)該澄清一個(gè)概念,就是BS結(jié)構(gòu)理論上是沒有同步的服務(wù)器-客戶端的狀態(tài)維持的,所以Cookie本質(zhì)上就是一種異步的狀態(tài)維護(hù),所有這一切瀏覽器都幫我們搞定了,所以不用關(guān)心。 當(dāng)然如果使用是Django的話,最終的HttpRequest也許是WSGIRequest(調(diào)試的時(shí)候使用WSGI方式),也許是ModPythonRequest(使用Apache+Mod_python的方式),他們都是一個(gè)HTTP協(xié)議要求的Requset的實(shí)現(xiàn);

Session是保存在服務(wù)器端的鍵值對,session內(nèi)部機(jī)制依賴于cookie

我們都知道Django可以通過meddleware來修改requset和response,如果想使用Django當(dāng)中Session,

首先必須要求您的Django工程的settiongs.py文件里面的MIDDLEWARE_CLASSES設(shè)置里面已經(jīng)包含有django.contrib.sessions.middleware.SessionMiddleware(其實(shí)默認(rèn)就是有的)。

接下來我們看看/django/contrib/sessions/middleware.py這個(gè)文件,里面定義了一個(gè)SessionMiddleware的class,

其中的process_request函數(shù)有一句話:

session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)

我們所使用的request.session當(dāng)中的sesson這個(gè)變量就是在這一刻誕生的

這個(gè)類是根據(jù)得到COOKIES里面的settings.SESSION_COOKIE_NAME來生成

如果瀏覽器不支持Cookie的話,Django的Session也就無從用起了,因?yàn)镾ession的生成是根據(jù)Cookie里面記錄的SESSION_COOKIE_NAME來生成的

part 2  cookie

1,views視圖函數(shù)

user_info = {
  'user1': {'pwd': "123123"},
  'user2': {'pwd': "kkkkkkk"},
}
def login(request):
  if request.method == "GET":
    return render(request,'login.html')
  if request.method == "POST":
    u = request.POST.get('username')
    p = request.POST.get('pwd')
    dic = user_info.get(u)
    if not dic:
      return render(request,'login.html')
    if dic['pwd'] == p:
      res = redirect('/index/')
      # res.set_cookie('user1',u,max_age=10)
      # import datetime
      # current_date = datetime.datetime.utcnow()
      # current_date = current_date + datetime.timedelta(seconds=5)
      # res.set_cookie('user1',u,expires=current_date)
      res.set_cookie('user1',u)
      res.set_cookie('user_type',"asdfjalskdjf",httponly=True)
      return res
    else:
      return render(request,'login.html')
def auth(func):
  def inner(reqeust,*args,**kwargs):
    v = reqeust.COOKIES.get('user1')
    if not v:
      return redirect('/login/')
    return func(reqeust, *args,**kwargs)
  return inner
@auth
def index(reqeust):
  # 獲取當(dāng)前已經(jīng)登錄的用戶
  v = reqeust.COOKIES.get('user1')
  return render(reqeust,'index.html',{'current_user': v})
from django import views
from django.utils.decorators import method_decorator
@method_decorator(auth,name='dispatch')
class Order(views.View):
  # @method_decorator(auth)
  # def dispatch(self, request, *args, **kwargs):
  #   return super(Order,self).dispatch(request, *args, **kwargs)
  # @method_decorator(auth)
  def get(self,reqeust):
    v = reqeust.COOKIES.get('user1')
    return render(reqeust,'index.html',{'current_user': v})
  def post(self,reqeust):
    v = reqeust.COOKIES.get('user1')
    return render(reqeust,'index.html',{'current_user': v})
def order(reqeust):
  # 獲取當(dāng)前已經(jīng)登錄的用戶
  v = reqeust.COOKIES.get('user1')
  return render(reqeust,'index.html',{'current_user': v})
def cookie(request):
  # request.COOKIES
  # request.COOKIES['user1']
  request.COOKIES.get('user1')
  response = render(request,'index.html')
  response = redirect('/index/')
  # 設(shè)置cookie,關(guān)閉瀏覽器失效
  response.set_cookie('key',"value")
  # 設(shè)置cookie, N秒只有失效
  response.set_cookie('user1',"value",max_age=10)
  # 設(shè)置cookie, 截止時(shí)間失效
  import datetime
  current_date = datetime.datetime.utcnow()
  current_date = current_date + datetime.timedelta(seconds=5)
  response.set_cookie('user1',"value",expires=current_date)
  response.set_cookie('user1',"value",max_age=10)
  # request.COOKIES.get('...')
  # response.set_cookie(...)
  obj = HttpResponse('s')
  obj.set_signed_cookie('username',"kangbazi",salt="asdfasdf")
  request.get_signed_cookie('username',salt="asdfasdf")
  return response

代碼詳解:

1.1 login函數(shù)渲染登錄頁面,同時(shí)設(shè)置cookie

1.2 裝飾器

FBV(function base views) 就是在視圖里使用函數(shù)處理請求。

auth裝飾器相當(dāng)于下面的index函數(shù)

def index(reqeust):
  # 獲取當(dāng)前已經(jīng)登錄的用戶
  v = reqeust.COOKIES.get('user1')
  if not v:
    return redirect('/login/')
  return render(reqeust,'index.html',{'current_user': v})

CBV(class base views) 就是在視圖里使用類處理請求。

@method_decorator(auth,name='dispatch')#寫在這里表示對dispatch裝飾
class Order(views.View):
  # @method_decorator(auth) #寫在這里,規(guī)則要通過dispatch,dispatch不符合就下面也用不上
  #dispath方法在執(zhí)行下面方法之前執(zhí)行
  def dispatch(self, request, *args, **kwargs):
    return super(Order,self).dispatch(request, *args, **kwargs)
  # @method_decorator(auth)寫在這里只能對get做驗(yàn)證,對post無用
  def get(self,reqeust):
    v = reqeust.COOKIES.get('user1')
    return render(reqeust,'index.html',{'current_user': v})

1.4 cookie增刪改查操作:

1、設(shè)置Cookies

response.set_cookie("cookie_key","value")

2、獲取Cookies

value = request.COOKIES["cookie_key"]
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

參數(shù):

  • default: 默認(rèn)值
  • salt: 加密鹽
  • max_age: 后臺控制過期時(shí)間

3、刪除Cookies

response.delete_cookie("cookie_key",path="/",domain=name)

4、檢測Cookies

if "cookie_name" is request.COOKIES :

5、設(shè)置加密的cookie

rep.set_signed_cookie(key,value,salt='加密鹽',...) 

參數(shù):

  •         key,              鍵
  •         value='',         值
  •         max_age=None,     超時(shí)時(shí)間,表示多少秒數(shù)之后失效
  •         expires=None,     超時(shí)時(shí)間,表示失效的時(shí)間點(diǎn)。支持datetime 和 time.time
  •         path='/',         Cookie生效的路徑,/ 表示根路徑,特殊的:跟路徑的cookie可以被任何url的頁面訪問
  •         domain=None,      Cookie生效的域名
  •         secure=False,     https傳輸
  •         httponly=False    只能http協(xié)議傳輸,無法被JavaScript獲?。ú皇墙^對,底層抓包可以獲取到也可以被覆蓋)

2,index頁面

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <h1>歡迎登錄:{{ current_user }}</h1>
</body>
</html>

3,login頁面

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <form action="/login/" method="POST">
    <input type="text" name="username" placeholder="用戶名" />
    <input type="password" name="pwd" placeholder="密碼" />
    <input type="submit" />
  </form>
</body>
</html>

運(yùn)行django之后,訪問index,會自動(dòng)跳轉(zhuǎn)到login頁面,輸入賬戶密碼之后,自動(dòng)跳轉(zhuǎn)到index,并從cookie中取出username,打印出來

part 3  session

正常情況下,你無需任何設(shè)置就可以使用session功能。如果你刪除或修改過請檢測一下配置

1、編輯settings.py中MIDDLEWARE_CLASSES 配置,確保 'django.contrib.sessions.middleware.SessionMiddleware'存在,如果沒有則添加。

2、編輯settings.py中INSTALLED_APPS配置,確保'django.contrib.sessions' (如果你是剛打開這個(gè)應(yīng)用,別忘了運(yùn)行 manage.py syncdb )

Django中默認(rèn)支持Session,其內(nèi)部提供了5種類型的Session供開發(fā)者使用:

只需要更改settings/py文件中的SESSION_ENGINE

數(shù)據(jù)庫配置settings.py(默認(rèn)):

Django默認(rèn)支持Session,并且默認(rèn)是將Session數(shù)據(jù)存儲在數(shù)據(jù)庫中,即:django_session 表中。

1.配置settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.db'
SESSION_COOKIE_NAME = "sessionid"                   # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串(默認(rèn))
SESSION_COOKIE_PATH = "/"                           # Session的cookie保存的路徑(默認(rèn))
SESSION_COOKIE_DOMAIN = None                         # Session的cookie保存的域名(默認(rèn))
SESSION_COOKIE_SECURE = False                        # 是否Https傳輸cookie(默認(rèn))
SESSION_COOKIE_HTTPONLY = True                       # 是否Session的cookie只支持http傳輸(默認(rèn))
SESSION_COOKIE_AGE = 1209600                         # Session的cookie失效日期(2周)(默認(rèn))
SESSION_EXPIRE_AT_BROWSER_CLOSE = False              # 是否關(guān)閉瀏覽器使得Session過期(默認(rèn))
SESSION_SAVE_EVERY_REQUEST = False                   # 是否每次請求都保存Session,默認(rèn)修改之后才保存(默認(rèn))

緩存配置settings.py:

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的緩存別名(默認(rèn)內(nèi)存緩存,也可以是memcache),此處別名依賴緩存的設(shè)置
SESSION_COOKIE_NAME = "sessionid"                        # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串
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                   # 是否關(guān)閉瀏覽器使得Session過期
SESSION_SAVE_EVERY_REQUEST = False                        # 是否每次請求都保存Session,默認(rèn)修改之后才保存

文件配置settings.py:

SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = None   # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個(gè)臨時(shí)地址tempfile.gettempdir()
SESSION_COOKIE_NAME = "sessionid"                          # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串
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                     # 是否關(guān)閉瀏覽器使得Session過期
SESSION_SAVE_EVERY_REQUEST = False                          # 是否每次請求都保存Session,默認(rèn)修改之后才保存

緩存+數(shù)據(jù)庫配置settings.py:

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

加密cookie配置settings.py:

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'

sessions使用:

1.獲取、設(shè)置、刪除Session中數(shù)據(jù)

def index(request):
request.session['k1']                  #獲取session,如果沒有會報(bào)錯(cuò)
request.session.get('k1',None)       #獲取session,如果沒有會返回None
request.session['k1'] = 123             #設(shè)置session,如果k1存在就覆蓋
request.session.setdefault('k1',123) #設(shè)置session,如果存在則不設(shè)置
del request.session["k1"]              #只刪除k1,隨機(jī)字符串和其他session值還存在
request.session.session_key             #當(dāng)前用戶隨機(jī)字符串

2.所有 鍵、值、鍵值對

request.session.keys()         #獲取所有鍵
request.session.values()     #獲取所有值
request.session.items()        #獲取所有的鍵值
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

request.session.session_key # 用戶session的隨機(jī)字符串

request.session.clear_expired() #將所有Session失效日期小于當(dāng)前日期的數(shù)據(jù)刪除

request.session.exists("session_key") # 檢查 用戶session的隨機(jī)字符串 在數(shù)據(jù)庫中是否

request.session.delete("session_key") # 刪除當(dāng)前用戶的所有Session數(shù)據(jù)

request.session.set_expiry(value)

  •         * 如果value是個(gè)整數(shù),session會在些秒數(shù)后失效。
  •         * 如果value是個(gè)datatime或timedelta,session就會在這個(gè)時(shí)間后失效。
  •         * 如果value是0,用戶關(guān)閉瀏覽器session就會失效。
  •         * 如果value是None,session會依賴全局session失效策略。

希望本文所述對大家基于Django框架的Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Python虛擬環(huán)境venv實(shí)戰(zhàn)過程詳解

    Python虛擬環(huán)境venv實(shí)戰(zhàn)過程詳解

    Python的虛擬環(huán)境可以幫助我們在同一臺機(jī)器上,同時(shí)使用不同的Python版本和庫,方便管理和開發(fā),下面這篇文章主要給大家介紹了關(guān)于Python虛擬環(huán)境venv的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • 圖神經(jīng)網(wǎng)絡(luò)GNN算法基本原理詳解

    圖神經(jīng)網(wǎng)絡(luò)GNN算法基本原理詳解

    這篇文章主要為大家介紹了圖神經(jīng)網(wǎng)絡(luò)GNN算法基本原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 詳解如何利用Pytest?Cache?Fixture實(shí)現(xiàn)測試結(jié)果緩存

    詳解如何利用Pytest?Cache?Fixture實(shí)現(xiàn)測試結(jié)果緩存

    這篇文章主要為大家詳細(xì)介紹了如何利用Pytest?Cache?Fixture實(shí)現(xiàn)測試結(jié)果緩存,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-09-09
  • 三個(gè)Python常用的數(shù)據(jù)清洗處理方式總結(jié)

    三個(gè)Python常用的數(shù)據(jù)清洗處理方式總結(jié)

    這篇文章主要為大家詳細(xì)介紹了python數(shù)據(jù)處理過程中三個(gè)主要的數(shù)據(jù)清洗說明,分別是缺失值/空格/重復(fù)值的數(shù)據(jù)清洗,感興趣的小伙伴可以了解一下
    2022-12-12
  • numpy數(shù)組切片的使用

    numpy數(shù)組切片的使用

    本文主要介紹了numpy數(shù)組切片的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Kwargs傳遞給Python 中的另一個(gè)函數(shù)實(shí)現(xiàn)方法

    Kwargs傳遞給Python 中的另一個(gè)函數(shù)實(shí)現(xiàn)方法

    Python 列出了可以傳遞給程序中的函數(shù)的兩種類型的參數(shù), 非關(guān)鍵字參數(shù)**args和關(guān)鍵字參數(shù) **kwargs ,在本文中,我們將討論如何使用關(guān)鍵字參數(shù)及如何將關(guān)鍵字參數(shù)傳遞給另一個(gè)函數(shù),感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • python數(shù)據(jù)分析apply(),map(),applymap()用法

    python數(shù)據(jù)分析apply(),map(),applymap()用法

    這篇文章主要介紹了python數(shù)據(jù)分析apply(),map(),applymap()用法,可以方便地實(shí)現(xiàn)對批量數(shù)據(jù)的自定義操作。用法歸納如下,需要的朋友可以參考一下
    2022-03-03
  • Pygame的程序開始示例代碼

    Pygame的程序開始示例代碼

    這篇文章主要介紹了Pygame的程序開始的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • python輕松查到刪除自己的微信好友

    python輕松查到刪除自己的微信好友

    這篇文章主要介紹了python腳本快速查看自己被多少微信好友刪除的方法,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 詳解pytest+Allure搭建方法以及生成報(bào)告常用操作

    詳解pytest+Allure搭建方法以及生成報(bào)告常用操作

    本文主要介紹了詳解pytest+Allure搭建方法以及生成報(bào)告常用操作,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論