# 第三節:HttpRequest對象
# WSGIRequest對象
Django在接收到http請求之后,會根據http請求攜帶的參數以及報文信息創建一個`WSGIRequest`對象,并且作為視圖函數第一個參數傳給視圖函數。也就是我們經常看到的`request`參數。在這個對象上我們可以找到客戶端上傳上來的所有信息。這個對象的完整路徑是`django.core.handlers.wsgi.WSGIRequest`。
## WSGIRequest對象常用屬性和方法:
### WSGIRequest對象常用屬性:
`WSGIRequest`對象上大部分的屬性都是只讀的。因為這些屬性是從客戶端上傳上來的,沒必要做任何的修改。以下將對一些常用的屬性進行講解:
1. `path`:請求服務器的完整“路徑”,但不包含域名和參數。比如`http://www.baidu.com/xxx/yyy/`,那么`path`就是`/xxx/yyy/`。
2. `method`:代表當前請求的`http`方法。比如是`GET`還是`POST`。
3. `GET`:一個`django.http.request.QueryDict`對象。操作起來類似于字典。這個屬性中包含了所有以`?xxx=xxx`的方式上傳上來的參數。
4. `POST`:也是一個`django.http.request.QueryDict`對象。這個屬性中包含了所有以`POST`方式上傳上來的參數。
5. `FILES`:也是一個`django.http.request.QueryDict`對象。這個屬性中包含了所有上傳的文件。
6. `COOKIES`:一個標準的Python字典,包含所有的`cookie`,鍵值對都是字符串類型。
7. `session`:一個類似于字典的對象。用來操作服務器的`session`。
8. `META`:存儲的客戶端發送上來的所有`header`信息。
9. `CONTENT_LENGTH`:請求的正文的長度(是一個字符串)。
10. `CONTENT_TYPE`:請求的正文的MIME類型。
11. `HTTP_ACCEPT`:響應可接收的Content-Type。
12. `HTTP_ACCEPT_ENCODING`:響應可接收的編碼。
13. `HTTP_ACCEPT_LANGUAGE`: 響應可接收的語言。
14. `HTTP_HOST`:客戶端發送的HOST值。
15. `HTTP_REFERER`:在訪問這個頁面上一個頁面的url。
16. `QUERY_STRING`:單個字符串形式的查詢字符串(未解析過的形式)。
17. `REMOTE_ADDR`:客戶端的IP地址。如果服務器使用了`nginx`做反向代理或者負載均衡,那么這個值返回的是`127.0.0.1`,這時候可以使用`HTTP_X_FORWARDED_FOR`來獲取,所以獲取`ip`地址的代碼片段如下:```
<pre class="calibre12">```
<span class="hljs-keyword">if</span> request.META.has_key(<span class="hljs-string">'HTTP_X_FORWARDED_FOR'</span>):
ip = request.META[<span class="hljs-string">'HTTP_X_FORWARDED_FOR'</span>]
<span class="hljs-keyword">else</span>:
ip = request.META[<span class="hljs-string">'REMOTE_ADDR'</span>]
```
```
18. `REMOTE_HOST`:客戶端的主機名。
19. `REQUEST_METHOD`:請求方法。一個字符串類似于`GET`或者`POST`。
20. `SERVER_NAME`:服務器域名。
21. `SERVER_PORT`:服務器端口號,是一個字符串類型。
### WSGIRequest對象常用方法:
1. `is_secure()`:是否是采用`https`協議。
2. `is_ajax()`:是否采用`ajax`發送的請求。原理就是判斷請求頭中是否存在`X-Requested-With:XMLHttpRequest`。
3. `get_host()`:服務器的域名。如果在訪問的時候還有端口號,那么會加上端口號。比如`www.baidu.com:9000`。
4. `get_full_path()`:返回完整的path。如果有查詢字符串,還會加上查詢字符串。比如`/music/bands/?print=True`。
5. `get_raw_uri()`:獲取請求的完整`url`。
## QueryDict對象:
我們平時用的`request.GET`和`request.POST`都是`QueryDict`對象,這個對象繼承自`dict`,因此用法跟`dict`相差無幾。其中用得比較多的是`get`方法和`getlist`方法。
1. `get`方法:用來獲取指定`key`的值,如果沒有這個`key`,那么會返回`None`。
2. `getlist`方法:如果瀏覽器上傳上來的`key`對應的值有多個,那么就需要通過這個方法獲取。
- Introduction
- 第一章:學前準備
- 第一節:虛擬環境
- 第二節:準備工作
- 第三節:Django介紹
- 第四節:URL組成部分
- 第二章:URL與視圖
- 第一節:第一個Django項目
- 第二節:視圖與URL分發器
- 第三章:模板
- 第一節:模板介紹
- 第二節:模板變量
- 第三節:常用標簽
- 第四節:常用過濾器
- 第五節:自定義過濾器
- 第七節:模版結構優化
- 第八節:加載靜態文件
- 第四章:數據庫
- 第一節:MySQL相關軟件
- 第二節:數據庫操作
- 第三節:ORM模型
- 第四節:模型常用字段
- 第五節:外鍵和表關系
- 第六節:增刪改查操作
- 第七節:查詢操作
- 第八節:QuerySet API
- 第九節:ORM模型遷移
- 第十節:ORM作業
- 第十一節:ORM作業參考答案
- 第十二節:Pycharm連接數據庫
- 第五章:視圖高級
- 第一節:限制請求method
- 第二節:頁面重定向
- 第三節:HttpRequest對象
- 第四節:HttpResponse對象
- 第五節:生成CSV文件
- 第六節:類視圖
- 第七節:錯誤處理
- 第六章:表單
- 第一節:表單概述
- 第二節:用表單驗證數據
- 第三節:ModelForm
- 第四節:文件上傳
- 第七章:cookie和session
- 第八章:上下文處理器和中間件
- 第一節:上下文處理器
- 第二節:中間件
- 第九章:安全
- 第一節:CSRF攻擊
- 第二節:XSS攻擊
- 第三節:點擊劫持攻擊
- 第四節:SQL注入
- 第十章:信號
- 第一節:什么是信號
- 第十一章:驗證和授權
- 第一節:概述
- 第二節:用戶對象
- 第三節:權限和分組
- 第十二章:Admin系統
- 第十三章:Django的緩存
- 第十四章:memcached
- 第十五章:Redis