亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 1537 0

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

part 1 概念

在Django里面,cookie和session都記錄了客戶端的某種狀態,用來跟蹤用戶訪問網站的整個回話。

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

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

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

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

Session是保存在服務器端的鍵值對,session內部機制依賴于cookie

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

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

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

其中的process_request函數有一句話:

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


          

我們所使用的 request.session 當中的sesson這個變量就是在這一刻誕生的

這個類是根據得到COOKIES里面的 settings.SESSION_COOKIE_NAME 來生成

如果瀏覽器不支持Cookie的話,Django的Session也就無從用起了,因為Session的生成是根據Cookie里面記錄的SESSION_COOKIE_NAME來生成的

part 2? cookie

1,views視圖函數

            
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):
  # 獲取當前已經登錄的用戶
  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):
  # 獲取當前已經登錄的用戶
  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/')
  # 設置cookie,關閉瀏覽器失效
  response.set_cookie('key',"value")
  # 設置cookie, N秒只有失效
  response.set_cookie('user1',"value",max_age=10)
  # 設置cookie, 截止時間失效
  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函數渲染登錄頁面,同時設置cookie

1.2 裝飾器

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

auth裝飾器相當于下面的index函數

            
def index(reqeust):
  # 獲取當前已經登錄的用戶
  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) #寫在這里,規則要通過dispatch,dispatch不符合就下面也用不上
  #dispath方法在執行下面方法之前執行
  def dispatch(self, request, *args, **kwargs):
    return super(Order,self).dispatch(request, *args, **kwargs)
  # @method_decorator(auth)寫在這里只能對get做驗證,對post無用
  def get(self,reqeust):
    v = reqeust.COOKIES.get('user1')
    return render(reqeust,'index.html',{'current_user': v})


          

1.4 cookie增刪改查操作:

1、設置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)


          

參數:

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

3、刪除Cookies

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


          

4、檢測Cookies

            
if "cookie_name" is request.COOKIES :


          

5、設置加密的cookie

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

參數:

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

2,index頁面

            
            
            
            

歡迎登錄:{{ current_user }}

3,login頁面

            
            
            
            

運行django之后,訪問index,會自動跳轉到login頁面,輸入賬戶密碼之后,自動跳轉到index,并從cookie中取出username,打印出來

part 3? session

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

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

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

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

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

數據庫配置settings.py(默認):

Django默認支持Session,并且默認是將Session數據存儲在數據庫中,即:django_session 表中。

1.配置settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.db'
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,默認修改之后才保存(默認)

緩存配置settings.py:

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'? # 引擎
SESSION_CACHE_ALIAS = 'default'??????????????????????????? # 使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置
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,默認修改之后才保存

文件配置settings.py:

SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = None?? # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()
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,默認修改之后才保存

緩存+數據庫配置settings.py:

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


          

加密cookie配置settings.py:

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


          

sessions使用:

1.獲取、設置、刪除Session中數據

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

2.所有 鍵、值、鍵值對

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

            
request.session.session_key # 用戶session的隨機字符串

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

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

request.session.delete("session_key") # 刪除當前用戶的所有Session數據


          

request.session.set_expiry(value)

  • ??????? * 如果value是個整數,session會在些秒數后失效。
  • ??????? * 如果value是個datatime或timedelta,session就會在這個時間后失效。
  • ??????? * 如果value是0,用戶關閉瀏覽器session就會失效。
  • ??????? * 如果value是None,session會依賴全局session失效策略。

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品久久久久久久久久久不卡 | 波多野结衣一区二区三区四区 | 麻豆成人久久精品二区三 | 亚洲精品www久久久久久久软件 | 欧美日韩加勒比一区二区三区 | 国产成人综合亚洲一区 | 亚洲欧美在线视频 | 国产精品久久久 | 中文字幕在线观看一区 | 久久综合九九亚洲一区 | 精品乱人伦一区二区 | 亚洲精品第一区二区在线 | 精品精品国产自在久久高清 | 九九涩 | 色狠狠婷婷97 | 天天舔天天射天天操 | 3d动漫精品成人一区二区三 | 真实国产精品视频国产网 | 欧美日韩国产在线成人网 | 五月天婷婷网址 | 护士日本xxxxx丰满hd4k | 免费在线黄色网址 | 大乳妇女bd视频在线观看 | 久久精品99久久香蕉国产色戒 | 中文字幕天天躁夜夜狠狠综合 | 99在线视频免费观看 | 久久久久国产精品免费 | 国产亚洲玖玖玖在线观看 | 午夜精品久久影院蜜桃 | 国外免费一级 | 天天操婷婷 | 国产或人精品日本亚洲77美色 | 天天做天天添婷婷我也去 | 日韩欧美aa级草草免费视频 | 天天操天天搞 | 成年女人免费看 | 人人爽天天碰天天躁夜夜躁 | 青青热久久久久综合精品 | 在线欧美亚洲 | 精久久| 日韩国产欧美在线观看 |