
## cookie和session
1.cookie:在網站中,http請求是無狀態的。也就是說即使第一次和服務器連接后并且登錄成功后,第二次請求服務器依然不能知道當前請求是哪個用戶。cookie的出現就是為了解決這個問題,第一次登錄后服務器返回一些數據(cookie)給瀏覽器,然后瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動的攜帶給服務器,服務器通過瀏覽器攜帶的數據就能判斷當前用戶是哪個了。cookie存儲的數據量有限,不同的瀏覽器有不同的存儲大小,但一般不超過4KB。因此使用cookie只能存儲一些小量的數據
2.session: session和cookie的作用有點類似,都是為了存儲用戶相關的信息。不同的是,cookie是存儲在本地瀏覽器,session是一個思路、一個概念、一個服務器存儲授權信息的解決方案,不同的服務器,不同的框架,不同的語言有不同的實現。雖然實現不一樣,但是他們的目的都是服務器為了方便存儲數據的。session的出現,是為了解決cookie存儲數據不安全的問題的。
3.cookie和session使用:web開發發展至今,cookie和session的使用已經出現了一些非常成熟的方案。在如今的市場或者企業里,一般有兩種存儲方式
>3.1 存儲在服務端:通過cookie存儲一個sessionid,然后具體的數據則是保存在session中。如果用戶已經登錄,則服務器會在cookie中保存一個sessionid,下次再次請求的時候,會把該sessionid攜帶上來,服務器根據sessionid在session庫中獲取用戶的session數據。就能知道該用戶到底是誰,以及之前保存的一些狀態信息。這種專業術語叫做server side session。Django把session信息默認存儲到數據庫中,當然也可以存儲到其他地方,比如緩存中,文件系統中等。存儲在服務器的數據會更加的安全,不容易被竊取。但存儲在服務器也有一定的弊端,就是會占用服務器的資源,但現在服務器已經發展至今,一些session信息還是綽綽有余的。
>3.2 將session數據加密,然后存儲在cookie中。這種專業術語叫做client side session。flask框架默認采用的就是這種方式,但是也可以替換成其他形式。
## 在django中操作cookie和session
### 操作cookie
#### 設置cookie
設置cookie是設置值給瀏覽器的。因此我們需要通過response的對象來設置,設置cookie可以通過response.set_cookie來設置,這個方法的相關參數如下:
```
key:這個cookie的key。
value:這個cookie的value。
max_age:最長的生命周期。單位是秒。
expires:過期時間。跟max_age是類似的,只不過這個參數需要傳遞一個具體的日期,比如datetime或者是符合日期格式的字符串。如果同時設置了expires和max_age,那么將會使用expires的值作為過期時間。
path:對域名下哪個路徑有效。默認是對域名下所有路徑都有效。
domain:針對哪個域名有效。默認是針對主域名下都有效,如果只要針對某個子域名才有效,那么可以設置這個屬性.
secure:是否是安全的,如果設置為True,那么只能在https協議下才可用。
httponly:默認是False。如果為True,那么在客戶端不能通過JavaScript進行操作
```
```
from datetime import datetime
from django.utils.timezone import make_aware
def cookie_test(request):
response = HttpResponse("index")
expires = make_aware(datetime(year=2018,month=12,day=27,hour=3,minute=20,second=0))
response.set_cookie("username","juran",expires=expires,path="/cms/")
return response
def get_cookie_test(request):
cookies = request.COOKIES
username = cookies.get('username')
return HttpResponse(username)
```
#### 刪除cookie
通過delete_cookie即可刪除cookie。實際上刪除cookie就是將指定的cookie的值設置為空的字符串,然后使用將他的過期時間設置為0,也就是瀏覽器關閉后就過期。
```
def delete_cookie(request):
response = HttpResponse('delete')
response.delete_cookie('username')
return response
```
#### 獲取cookie
獲取瀏覽器發送過來的cookie信息。可以通過request.COOKIES來或者。這個對象是一個字典類型。比如獲取所有的cookie
```
cookies = request.COOKIES
for cookie_key,cookie_value in cookies.items():
print(cookie_key,cookie_value)
```
### 操作session
django中的session默認情況下是存儲在服務器的數據庫中的,在表中會根據sessionid來提取指定的session數據,然后再把這個sessionid放到cookie中發送給瀏覽器存儲,瀏覽器下次在向服務器發送請求的時候會自動的把所有cookie信息都發送給服務器,服務器再從cookie中獲取sessionid,然后再從數據庫中獲取session數據。但是我們在操作session的時候,這些細節壓根就不用管。我們只需要通過request.session即可操作。
```
def index(request):
request.session['username'] = 'jr'
request.session.get('username')
return HttpResponse('index')
```
session常用的方法如下:
<ol>
<li><p><code>get</code>:用來從<code>session</code>中獲取指定值。</p>
</li>
<li><p><code>pop</code>:從<code>session</code>中刪除一個值。</p>
</li>
<li><p><code>keys</code>:從<code>session</code>中獲取所有的鍵。</p>
</li>
<li><p><code>items</code>:從<code>session</code>中獲取所有的值。</p>
</li>
<li><p><code>clear</code>:清除當前這個用戶的<code>session</code>數據。</p>
</li>
<li><p><code>flush</code>:刪除<code>session</code>并且刪除在瀏覽器中存儲的<code>session_id</code>,一般在注銷的時候用得比較多。</p>
</li>
<li><p><code>set_expiry(value)</code>:設置過期時間。</p>
<ul>
<p>整形:代表秒數,表示多少秒后過期。</p>
<p><code>0</code>:代表只要瀏覽器關閉,<code>session</code>就會過期。</p>
<p><code>None</code>:會使用全局的<code>session</code>配置。在<code>settings.py</code>中可以設置<code>SESSION_COOKIE_AGE</code>來配置全局的過期時間。默認是<code>1209600</code>秒,也就是2周的時間。</p>
<p>-1:代表已經過期</p>
</ul>
</li>
<li><p><code>clear_expired</code>:清除過期的<code>session</code>。<code>Django</code>并不會清除過期的<code>session</code>,需要定期手動的清理,或者是在終端,使用命令行<code>python manage.py clearsessions</code>來清除過期的<code>session</code>。</p>
</li>
</ol>
### 修改session的存儲機制
默認情況下,session數據是存儲到數據庫中的。當然也可以將session數據存儲到其他地方。可以通過設置SESSION_ENGINE來更改session的存儲位置,這個可以配置為以下幾種方案
1. django.contrib.sessions.backends.db:使用數據庫。默認就是這種方案。
2. django.contrib.sessions.backends.file:使用文件來存儲session。
3. django.contrib.sessions.backends.cache:使用緩存來存儲session。想要將數據存儲到緩存中,前提是你必須要在settings.py中配置好CACHES,并且是需要使用Memcached,而不能使用純內存作為緩存。
4. django.contrib.sessions.backends.cached_db:在存儲數據的時候,會將數據先存到緩存中,再存到數據庫中。這樣就可以保證萬一緩存系統出現問題,session數據也不會丟失。在獲取數據的時候,會先從緩存中獲取,如果緩存中沒有,那么就會從數據庫中獲取。
5. django.contrib.sessions.backends.signed_cookies:將session信息加密后存儲到瀏覽器的cookie中。這種方式要注意安全,建議設置SESSION_COOKIE_HTTPONLY=True,那么在瀏覽器中不能通過js來操作session數據,并且還需要對settings.py中的SECRET_KEY進行保密,因為一旦別人知道這個SECRET_KEY,那么就可以進行解密。另外還有就是在cookie中,存儲的數據不能超過4k
**配置文件**
```
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION':'127.0.0.1:11211'
}
}
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
```
**在memcached中查看**
```
stats items
stats cachedump 4 0
```
session和cookie:https://www.cnblogs.com/sss4/p/7071334.html
- 空白目錄
- 1-Django前導知識
- 1-1-虛擬環境
- 1-2-Django框架介紹與環境搭建
- 2-URL與視圖
- 2-1-URL與視圖
- 3-模板
- 3-1-模板介紹
- 3-2-模板變量
- 3-3-常用標簽
- 3-4-模板常用過濾器
- 3-5-模板結構優化
- 3-6-加載靜態文件
- 4-數據庫
- 4-1-操作數據庫
- 4-2-圖書管理系統
- 4-3-ORM模型介紹
- 4-4-ORM模型的增刪改查
- 4-5-模型常用屬性
- 4-6-外鍵和表
- 4-7-查詢操作
- 4-8-QuerySet的方法
- 4-9-ORM模型練習
- 4-10-ORM模型遷移
- 5-視圖高級
- 1-Django限制請求method
- 2-頁面重定向
- 3-HttpRequest對象
- 4-HttpResponse對象
- 5-類視圖
- 6-錯誤處理
- 6-表單
- 1-用表單驗證數據
- 2-ModelForm
- 3-文件上傳
- 7-session和cookie
- 1-session和cookie
- 8-memcached
- 1-memcached
- 9-阿里云部署
- 阿里云部署