日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python后台返回cookie_Django框架设置cookies与获取cookies操作详解

發布時間:2025/3/15 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python后台返回cookie_Django框架设置cookies与获取cookies操作详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文實例講述了Django框架設置cookies與獲取cookies操作。分享給大家供大家參考,具體如下:

在Django里面,使用Cookie和Session看起來好像是一樣的,使用的方式都是request.COOKIES[XXX]和request.session[XXX],其中XXX是您想要取得的東西的key, 很久以前,寫過一篇 django怎么處理session 的文章:django 自定義session 處理, 今天對cookies 進行了同樣的操作:

from django.template import loader ,Context

from django.http import HttpResponse

def main(request):

#不用模板

response= HttpResponse('test')

response.set_cookie('my_cookie','cookie value')

return response

def main(request):

#用模板

response= render_to_response('xxxx.html', {})

response.set_cookie('my_cookie','cookie value')

return response

使用模板的情況和不使用模板的情況都做了測試, 可以向瀏覽器設置cookies, 在客戶端可以用javascript 取出來:

function getCookie(c_name)

{

if (document.cookie.length>0)

{

c_start=document.cookie.indexOf(c_name + "=")

if (c_start!=-1)

{

c_start=c_start + c_name.length+1

c_end=document.cookie.indexOf(";",c_start)

if (c_end==-1) c_end=document.cookie.length

return unescape(document.cookie.substring(c_start,c_end))

}

}

return ""

}

用上面的javascript 函數可以取出cookies, 如果需要在django 里面取出 cookies 呢,也很簡單:

value = request.COOKIES["cookie_key"]

同樣的道理,也可以用 javascript 寫 cookies,

function setCookie(c_name,value,expiredays)

{

var exdate=new Date()

exdate.setDate(exdate.getDate()+expiredays)

document.cookie=c_name+ "=" +escape(value)+

((expiredays==null) ? "" : ";expires="+exdate.toGMTString())

}

上面總結了用 django 讀寫cookies 與 用javascript 讀寫cookies. 根據不同的情況, 這兩種方法是經?;旌显谝黄鹗褂玫?

一.Django authentication

django authentication 提供了一個便利的user api接口,無論在py中 request.user,參見Request and response objects.還是模板中的{{user}}都能隨時隨地使用,如果從web開發角度來看,其實無非就是cookie與session的運用.

在項目首頁,在登陸和注銷狀態下分別輸出所有session,如:

print request.session.items()

# 登陸狀態下輸出

[('domain', 'http://beginman.sinaapp.com'), ('_auth_user_backend', 'django.contrib.auth.backends.ModelBackend'), ('_auth_user_id', 1L)]

# 注銷狀態下輸出

[('domain', 'http://beginman.sinaapp.com')]

從輸出結果中可知曉,如果項目中settings.py配置如下:

#中間件

MIDDLEWARE_CLASSES = (

'django.middleware.common.CommonMiddleware',

'django.contrib.sessions.middleware.SessionMiddleware', #看這里

# 'django.middleware.csrf.CsrfViewMiddleware',

'django.contrib.auth.middleware.AuthenticationMiddleware', #看這里

'django.contrib.messages.middleware.MessageMiddleware',

'django.middleware.gzip.GZipMiddleware', # 處理gzip壓縮,減輕服務器壓力

'pagination.middleware.PaginationMiddleware', # django 第三方分頁

'common.mymiddleware.Mymiddleware',

# Uncomment the next line for simple clickjacking protection:

# 'django.middleware.clickjacking.XFrameOptionsMiddleware',

)

#TEMPLATE_CONTEXT_PROCESSORS

# 注意django1.5的這個玩意兒與低版本的不同

# 參考:https://docs.djangoproject.com/en/1.3/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = (

"django.contrib.auth.context_processors.auth",

"django.core.context_processors.debug",

"django.core.context_processors.i18n",

"django.core.context_processors.media",

"django.core.context_processors.static",

"django.core.context_processors.request",

"django.contrib.messages.context_processors.messages"

)

INSTALLED_APPS = (

'django.contrib.auth', #this

'django.contrib.contenttypes', #this

'django.contrib.sessions', #this

'django.contrib.sites',

'django.contrib.messages',

'django.contrib.staticfiles',

# Uncomment the next line to enable the admin:

'django.contrib.admin',

# Uncomment the next line to enable admin documentation:

# 'django.contrib.admindocs',

'mysite',

)

那么就會有這樣的輸出,當然這只是針對單用戶(這里拿我的博客開刀).在登陸后同時在首頁輸出cookies:

print request.COOKIES

{'csrftoken': '9fBE9Kh0uuzXEMzWdc4z4aIOoZg1EaoI', 'sessionid': 'lf4dd7xjlyzrh4yvzbtltlbujy3ipp1f', 'Hm_lvt_c65358e73ce306691a49ae5119f58783': '1405408338'}

登陸成功后Django會自動在客戶端生成一個sessionid,且這個sessionid在未注銷前一直不變,當注銷后就改變了該sessionid了. Cookie中保存一個Session的索引編號(sessionid),其重要信息都保存在服務器端,Session控制.即可.

通過Cookie保存的sessionid與服務器端比較,當等于時則表示用戶已登陸,若不等于或兩者有一方不存在或都不存在則用戶處于注銷狀態.

二.Session 與Cookie

cookie機制采用的是在客戶端保持狀態的方案,而session機制采用的是在服務器端保持狀態的方案,由于采用服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要借助于cookie機制來達到保存標識的目的.

補充:關于session和cookie的區別:

二者的定義:

當你在瀏覽網站的時候,WEB 服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇,

都紀錄下來。當下次你再光臨同一個網站,WEB 服務器會先看看有沒有它上次留下的 Cookie 資料,有的話,就會依據 Cookie

里的內容來判斷使用者,送出特定的網頁內容給你。 Cookie 的使用很普遍,許多有提供個人化服務的網站,都是利用 Cookie

來辨認使用者,以方便送出使用者量身定做的內容,像是 Web 接口的免費 email 網站,都要用到 Cookie。

具體來說cookie機制采用的是在客戶端保持狀態的方案,而session機制采用的是在服務器端保持狀態的方案。

同時我們也看到,由于采用服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要借助于cookie機制

來達到保存標識的目的,但實際上它還有其他選擇。

cookie機制。正統的cookie分發是通過擴展HTTP協議來實現的,服務器通過在HTTP的響應頭中加上一行特殊的指示以提示

瀏覽器按照指示生成相應的cookie。然而純粹的客戶端腳本如JavaScript或者VBScript也可以生成cookie。而cookie的使用

是由瀏覽器按照一定的原則在后臺自動發送給服務器的。瀏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用范圍

大于等于將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給服務器。

cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用范圍。若不設置過期時間,則表示這

個cookie的生命期為瀏覽器會話期間,關閉瀏覽器窗口,cookie就消失。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。

會話cookie一般不存儲在硬盤上而是保存在內存里,當然這種行為并不是規范規定的。若設置了過期時間,瀏覽器就會把cookie

保存到硬盤上,關閉后再次打開瀏覽器,這些cookie仍然有效直到超過設定的過期時間。存儲在硬盤上的cookie可以在不同的瀏

覽器進程間共享,比如兩個IE窗口。而對于保存在內存里的cookie,不同的瀏覽器有不同的處理方式

session機制。session機制是一種服務器端的機制,服務器使用一種類似于散列表的結構(也可能就是使用散列表)來保存信息。

當程序需要為某個客戶端的請求創建一個session時,服務器首先檢查這個客戶端的請求里是否已包含了一個session標識

(稱為session id),如果已包含則說明以前已經為此客戶端創建過session,服務器就按照session id把這個session檢索出來

使用(檢索不到,會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session并且生成一個與此session相

關聯的session id,session id的值應該是一個既不會重復,又不容易被找到規律以仿造的字符串,這個session id將被在本次響應

中返回給客戶端保存。保存這個session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發送給

服務器。一般這個cookie的名字都是類似于SEEESIONID。但cookie可以被人為的禁止,則必須有其他機制以便在cookie被禁止時

仍然能夠把session id傳遞回服務器。

經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的后面。還有一種技術叫做表單隱藏字段。就是服務器

會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務器。比如:

實際上這種技術可以簡單的用對action應用URL重寫來代替。

cookie 和session 的區別:

1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。

2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙

考慮到安全應當使用session。

3、session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能

考慮到減輕服務器性能方面,應當使用COOKIE。

4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。

5、所以個人建議:

將登陸信息等重要信息存放為SESSION

其他信息如果需要保留,可以放在COOKIE中

三.Django對于Cookie的處理方式

每個HttpRequest對象都對應一個COOKIES對象,該對象是字典形式.

request.COOKIES['sessionid'] # 獲取

request.COOKIES.get('sessionid', None) # 獲取

對COOKIES的設置通過HttpResponse對象的set_cookie來完成,文檔傳送門

HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)

參數如下:

(1).`max_age默認:None ,cookie需要延續的時間(以秒為單位) 如果參數是\ None`` ,這個cookie會延續到瀏覽器關閉為止。

(2).`expires默認None ,cookie失效的實際日期/時間。 它的格式必須是:\ "Wdy, DD-Mth-YY HH:MM:SS GMT"。如果給出了這個參數,它會覆蓋\max_age`` 參數。

(3).path 默認是"/" ,cookie生效的路徑前綴。 瀏覽器只會把cookie回傳給帶有該路徑的頁 面,這樣你可以避免將cookie傳給站點中的其他的應用,當你不是控制你的站點的頂層時,這樣做是特別有用的。

(4).domain 默認None,這個cookie有效的站點。 你可以使用這個參數設置一個跨站點(cross-domain)的cookie。 比如,\ domain=".example.com" 可以設置一個在\ www.example.com 、\ www2.example.com 以及\ an.other.sub.domain.example.com 站點下都可讀到的cookie。

如果這個參數被設成\ None ,cookie將只能在設置它的站點下可以讀到。

(5).False 默認False ,如果設置為 True ,瀏覽器將通過HTTPS來回傳cookie。

四.Django對Session的處理

如果想讓django項目支持session,則必須在settings.py中指定,見上.默認情況django使用 django.contrib.sessions.models.Session將session存儲在你的數據庫中.,這里我們查看下,如一個多用戶的網站的django_session表:

mysql> select * from django_session;

+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+

| session_key | session_data | expire_date |

+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+

| 1x5fxr1upboyiw4ny640tgdl2mto6i6i | NjJkNzBiYjE2NjBlYTBkMGZmY2QzYmIxOGE5MDRmNTE1YTgzM2FmNzqAAn1xAS4= | 2014-07-16 02:21:35 |

..................

很長一大段,這里省略了.如果在settings.py的 INSTALLED_APPS中添加了django.contrib.sessions則運行manage.py syncdb將會生成數據庫級別的session,表名為django-session.

為了提升性能,我們可以使用緩存級別的session,這點會在后面提及.

1.在views中使用session

每個HttpRequest對象都有session屬性,那么我們可以在views中使用:

fav_color = request.session['fav_color'] #get

request.session['fav_color'] = 'blue' #set

del request.session['fav_color'] #del

'fav_color' in request.session #contains

fav_color = request.session.get('fav_color', 'red')

fav_color = request.session.pop('fav_color') # pop

session對象字典形式,有keys(),items(),setdefault(),clear()等方法,以下方法是常用的:

(1).flush()

從session中刪除數據,然后再生數據,比如django的logout()函數就會調用它.

(2).set_test_cookie()

設置一個test cookie來判斷用戶瀏覽器是否接受cookie.

(3).test_cookie_worked()

當設置了test cookie后返回True或Flase判斷用戶瀏覽器是否接受cookie.所以要先執行set_test_cookie()來下個套.

(4).delete_test_cookie()

刪除test cookie,測試完成后要收回自己下的套.

(5).set_expiry(value)

設置過期時間,如果value是整數則表示N秒后過期,如果是時間或時間戳對象則表示指定到某一時間過期;如果value是0則在瀏覽器關閉后過期(會話session); 如果value 是None則使用全局session過期策略.

(6).get_expiry_age()

返回session過期時間

def login(request):

if request.method == 'POST':

if request.session.test_cookie_worked(): # 測套

request.session.delete_test_cookie() # 收套

return HttpResponse("You're logged in.")

else:

return HttpResponse("Please enable cookies and try again.")

request.session.set_test_cookie() # 下套

return render_to_response('foo/login_form.html')

2.在模板中使用session

如果在views設置了session,如request.session['ms'], 那么在模板中可以通過{{ request.session.key }}的形式使用:

{{ request.session.ms }}

3.在views外使用session

從mysql檢索出來的django_session表來看,包含字段如下:

mysql> describe django_session;

+--------------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+--------------+-------------+------+-----+---------+-------+

| session_key | varchar(40) | NO | PRI | NULL | |

| session_data | longtext | NO | | NULL | |

| expire_date | datetime | NO | MUL | NULL | |

+--------------+-------------+------+-----+---------+-------+

3 rows in set (0.01 sec)

那么可以使用django 數據庫API來訪問session,注意使用get_decoded() 來讀取實際的session數據,如下:

>>> from django.contrib.sessions.models import Session

>>> s=Session.objects.all()

>>> s

[, , , , ,....]

>>> for i in s:

... print i.get_decoded()

...

{'domain': 'http://beginman.sinaapp.com'}

{'domain': 'http://beginman.sinaapp.com', '_auth_user_backend': 'django.contrib.auth.backends.ModelBackend', '_auth_user_id': 1L}

{'domain': 'http://beginman.sinaapp.com'}

....

4.其他細節

ession 字典接受任何支持序列化的Python對象。 參考Python內建模塊pickle的文檔以獲取更多信息。

Session 數據存在數據庫表 django_session 中

Session 數據在需要的時候才會讀取。 如果你從不使用 request.session , Django不會動相關數據庫表的一根毛。11

Django 只在需要的時候才送出cookie。 如果你壓根兒就沒有設置任何會話數據,它不會 送出會話cookie(除非 SESSION_SAVE_EVERY_REQUEST 設置為 True )。

Django session 框架完全而且只能基于cookie。 它不會后退到把會話ID編碼在URL中(像某些工具(PHP,JSP)那樣)。

這是一個有意而為之的設計。 把session放在URL中不只是難看,更重要的是這讓你的站點 很容易受到攻擊——通過 Referer header進行session ID”竊聽”而實施的攻擊。

五.Session之存取Redis Django實現

session可以在數據庫級別,緩存級別,文件級別,cookie級別基礎上存取,對于緩存級別而言無疑是最提升性能的,我們可以放在django緩存系統中,也可以在memcache中,也可以在Redis中. 這里比較推薦Redis.我們完全可以用Redis實現Session功能.

1.我們知道session其實是在cookie中保存了一個sessionid,用戶每次訪問都將sessionid發給服務器,服務器通過ID查找用戶對應的狀態數據。在這里我的處理方式也是在cookie中定義一個sessionid,程序需要取得用戶狀態時將sessionid做為key在Redis中查找。

2.同時session支持用戶在一定時間不訪問將session回收。

思路參考:https://www.jb51.net/article/99370.htm

第三方庫:django-redis-sessions,github地址,提供了Redis database backend for your sessions. 另一個第三方庫Redis Django Cache Backend ,A cache backend for Django using the Redis datastructure server.用Redis存儲緩存數據.

對此我們可以應用到自己的項目中,如之前一篇Redis key的設計模式 & django登陸 提到的實例,那么接下來我們在此基礎上實現session,cookie,Redis定制的用戶系統.

注意要實現配置好Redis服務.

1.安裝&配置

(1).首先安裝配置django-redis-sessions:

pip install django-redis-sessions

在settings.py中設置SESSION_ENGINE,它默認是: django.contrib.sessions.backends.db 這里設置如下:

SESSION_ENGINE = 'redis_sessions.session'

然后在settings.py中設置Redis數據庫信息:

SESSION_REDIS_HOST = 'localhost'

SESSION_REDIS_PORT = 6379

SESSION_REDIS_DB = 0

SESSION_REDIS_PASSWORD = 'password'

SESSION_REDIS_PREFIX = 'session'

# If you prefer domain socket connection, you can just add this line instead of SESSION_REDIS_HOST and SESSION_REDIS_PORT.

SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH = '/var/run/redis/redis.sock'

配置完成后可測試如下:

$ pip install django nose redis

# Make sure you have redis running on localhost:6379

(poem)[beginman@beginman poem]$ nosetests

----------------------------------------------------------------------

Ran 0 tests in 0.001s

OK

(2).安裝配置django-redis-cache

pip install django-redis-cache

然后在settings.py配置CACHES

#On Django < 1.3:

CACHE_BACKEND = 'redis_cache.cache://:'

#On Django >= 1.3:

# When using TCP connections

CACHES = {

'default': {

'BACKEND': 'redis_cache.RedisCache',

'LOCATION': ':',

'OPTIONS': {

'DB': 1,

'PASSWORD': 'yadayada',

'PARSER_CLASS': 'redis.connection.HiredisParser',

'CONNECTION_POOL_CLASS': 'redis.BlockingConnectionPool',

'CONNECTION_POOL_CLASS_KWARGS': {

'max_connections': 50,

'timeout': 20,

}

},

},

}

# When using unix domain sockets

# Note: ``LOCATION`` needs to be the same as the ``unixsocket`` setting

# in your redis.conf

CACHES = {

'default': {

'BACKEND': 'redis_cache.RedisCache',

'LOCATION': '/path/to/socket/file',

'OPTIONS': {

'DB': 1,

'PASSWORD': 'yadayada',

'PARSER_CLASS': 'redis.connection.HiredisParser'

},

},

}

MIDDLEWARE_CLASSES = (

'django.middleware.cache.UpdateCacheMiddleware', # This must be first on the list

'django.middleware.common.CommonMiddleware',

'django.contrib.sessions.middleware.SessionMiddleware',

(...)

'django.middleware.cache.FetchFromCacheMiddleware', # This must be last

注意關于TCP連接:

#這里是TCP連接

CACHES = {

'default': {

'BACKEND': 'redis_cache.RedisCache',

'LOCATION': '127.0.0.1:6379',

'OPTIONS': {

'DB': 0,

'PASSWORD': '', # 這里沒有設置密碼

# 'PARSER_CLASS': 'redis.connection.HiredisParser', # 這段可先注釋掉否則出現 :Hiredis is not installed的錯誤

'CONNECTION_POOL_CLASS': 'redis.BlockingConnectionPool',

'CONNECTION_POOL_CLASS_KWARGS': {

'max_connections': 50,

'timeout': 20,

}

},

},

}

接下來我們可以在django中使用cache,存儲在Redis中.如下:

# Start by importing your default cache:

from django.core.cache import cache

# Store data under a-unique-key:

cache.set('a-unique-key', 'this is a string which will be cached')

# Later on you can retrieve it in another function:

cache.get('a-unique-key') # Will return None if key is not found in cache

# You can specify a default value:

cache.get('another-unique-key', 'default value')

# You can store multiple values at once:

cache.set_many({'a': 1, 'b': 2, 'c': 3})

# And fetch multiple values:

cache.get_many(['a', 'b', 'c']) # returns {'a': 1, 'b': 2, 'c': 3}

# You can store complex types in the cache:

cache.set('a-unique-key', {

'string' : 'this is a string',

'int' : 42,

'list' : [1, 2, 3, 4],

'tuple' : (1, 2, 3, 4),

'dict' : {'A': 1, 'B' : 2},

})

如果我們選擇socket連接方式而非TCP,那么在運行中可能會出現如下錯誤:Error 2 connecting to unix socket: /var/run/redis/redis.sock. No such file or directory.

這是因為redis 默認沒有開啟unix socket,需要在/etc/redis/redis.conf中修改,如下:

unixsocket /var/run/redis/redis.sock

unixsocketperm 777

記住配置完成之后要重啟Redis服務:

$ sudo service redis-server restart

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

總結

以上是生活随笔為你收集整理的python后台返回cookie_Django框架设置cookies与获取cookies操作详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。