[TOC]
利用HTTP協議向服務器傳參有以下幾種方式
1. 從url中截取
2. 使用查詢字符串
3. 在請求體中發送數據
4. 在http報文頭 `header` 中發送數據
## 1. 從url中獲取截取
在定義路由規則的時候,可以使用正則表達式截取數據,然后傳到視圖函數中,在視圖函數中使用參數接收。
例:
瀏覽器向后端發送了一個請求,url為 `/weather/beijing/20171001`
- 未命名參數
路由
```python
url(r'^weather/([a-z]+)/(\d{8})$', views.weather, name="weather")
```
```python
def weather(request, city, date):
content = city+date
return HttpResponse(content)
```
視圖函數要使用位置參數接收,位置要對應,響應結果 `beijing20171001`
- 命名參數
```python
url(r'^demo/', include("demo.urls", namespace="demo"))
```
```python
def weather(request, date, city):
content = city+date
return HttpResponse(content)
```
可以使用正則表達式給參數命名,參數接收的時候位置不需要照應,響應結果 `beijing20171001`
- 從url中截取參數不區分 get post請求方式。
## 2. QueryDict
在django的 `HttpRequest` 對象中,屬性 `GET` 和 `POST` 得到的都是 `django.http.QueryDict` 所創建的實例,這是django自定義的一個類似字典的類。
在Python的字典中,一個鍵只能有一個值,當一個鍵賦值多次的時候,只會保留最后一個值。而在 `HttpRequest` 對象中,一個鍵往往有多個值。而 `QueryDict` 就可以用來處理一個鍵帶多個值的情況。
### (1). QueryDict.get(key, [default])
```python
QueryDict.get(key, [default])
```
返回 key 的值。如果key 具有多個值,只返回最后(最新)的值。當key 不存在時返回一個默認值。
### (2). QueryDict.getlist(key, [default])
```python
QueryDict.getlist(key, [default])
```
返回 key 的值。如果key 具有多個值,以列表形式返回 key 的所有值。當key 不存在時返回一個空列表,設置了默認值則返回默認值。
## 3. 查詢字符串
在url中格式如 `?a=1&b=2` 的字符串叫做查詢字符串,可以用過 `request.GET` 獲取, `request.GET` 返回值是 `QueryDict` 對象。
url
```
/query?a=1&b=2&b=3
```
路由
```python
url(r'^query', views.query, name="query")
```
視圖函數
```python
def query(request):
query_dict = request.GET
a = query_dict.get('a')
b = query_dict.getlist('b')
context = "a=%s,b=%s" % (a, b)
return HttpResponse(context)
```
響應結果
```
a=1,b=['2', '3']
```
- 查詢字符串不區分 get post 請求方式。
## 4. 請求體
請求體獲得參數的各種有多種,例如 表單,json,xml...不同格式的數據要區別對待
可以發送請求體數據的請求方式有POST、PUT、PATCH、DELETE。
django默認開啟了csrf防護,會對上述的請求方式做驗證,測試時可以關閉驗證。
打開項目的配置文件 `settings.py` 注釋掉 scrf中間件
```python
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
```
### 4.1 Form表單
前端發送的表單類型的數據,可以使用 `request.POST` 獲取, `request.POST` 返回值是 `QueryDict` 對象。
url:
```
demo/form
```
路由
```
url(r'^form', views.form, name="form")
```
表單數據

視圖函數
```python
def form(request):
form_data = request.POST
name = form_data.get("name")
age = form_data.get("age")
context = "name=%s,age=%s" % (name, age)
return HttpResponse(context)
```
響應結果
```
name=xuanli,age=18
```
### 4.2 非表單類型
非表單類型的數據django無法自動解析,需要通過 `request.body` 獲取原始的請求體數據,然后自己根據數據類型解析。 `request.body` 返回值是 `bytes` 對象。
例如前端請求的是json數據:
url
```
demo/json
```
路由
```
url(r'^json', views.get_json, name="json")
```
json數據
```
{"name": "xuanli", "age": "18"}
```
視圖函數
```python
def get_json(request):
json_data = request.body
json_data = json_data.decode()
req_data = json.loads(json_data)
name = req_data.get("name")
age = req_data.get("age")
context = "name=%s,age=%s" % (name, age)
return HttpResponse(context)
```
響應結果
```
name=xuanli,age=18
```
- python3.6不需要使用 `decode()` 解碼
## 請求頭
```
```
## 其他
- 1.介紹
- 2.工程搭建
- 2.1.環境配置
- 2.2.創建工程
- 2.3.創建子應用
- 2.3.1.pycharm打開項目
- 2.4.創建視圖
- 3.基本配置
- 3.1.settings基本配置項
- 3.2.路由配置
- 4.請求響應
- 4.1.request
- 4.2.response
- 4.3.cookie
- 4.4.session
- 5.類視圖中間件
- 5.1.類視圖
- 5.2中間件
- 6.數據庫
- 6.1.數據庫配置
- 6.2定義模型類
- 6.3數據庫遷移
- 6.4數據庫操作
- 6.5查詢集
- 6.6模型管理器
- 7.模板表單
- 7.1使用模板
- 7.2模板標簽
- 7.3表單
- 8.后臺管理
- 8.1Admin
- 8.2自定義模型類樣式
- 8.3列表頁