Request請求
http協(xié)議向客戶端傳參四種形式
- URL地址拼接傳參
- 傳參示例:傳遞名字和年齡
http://127.0.0.1:8000/user/index/xiaowang/26
- 解析方式:
路由正則內(nèi)增加匹配:url(r'users/index/(?P<name>[a-zA-Z]+)/(?P<age>\d+)', views.index)
對應(yīng)視圖函數(shù)寫法:
- 傳參示例:傳遞名字和年齡
def index(request,name,age):
print("name: %s, age: %s" % (name,age))
- URL查詢字符串傳參
寫法:?key=value&...
- 傳參示例:傳遞名字和年齡
http://127.0.0.1:8000/user/index/?name=xiaozhang&age=26
- 解析方式:
- 傳參示例:傳遞名字和年齡
def index(request):
querydict = request.GET
name = querydict.get("name")
age = querydict.get("age")
- 請求體傳參
- 可以發(fā)送請求體數(shù)據(jù)的請求方式有POST镰踏、PUT蹬音、PATCH、DELETE。
- Django默認(rèn)開啟了CSRF防護(hù)征椒,會對上述請求方式進(jìn)行CSRF防護(hù)驗(yàn)證,在測試時可以關(guān)閉CSRF防護(hù)機(jī)制湃累,方法為在settings.py文件中注釋掉CSRF中間件行:
django.middleware.csrf.CsrfViewMiddleware
-
POST表單請求
- 請求體傳參不顯示在url信息中
- 解析方式:
def get_postbody(request): name = request.POST.get("name") password = request.POST.get("password)
重要:request.POST
只能用來獲取POST
方式的請求體表單數(shù)據(jù)勃救,其余請求體獲取數(shù)據(jù)均采用下述的request.body
-
非表單類型 Non-Form Data
- 非表單類型的請求體數(shù)據(jù),Django無法自動解析治力,可以通過request.body屬性獲取最原始的請求體數(shù)據(jù)蒙秒,自己按照請求體格式(JSON、XML等)進(jìn)行解析宵统。request.body返回
bytes
類型晕讲。 - 解析方式:例如獲取json數(shù)據(jù):
import json def get_body_json(request): json_str = request.body json_str = json_str.decode() # python3.6 無 需執(zhí)行此步 req_data = json.loads(json_str) print(req_data['a']) print(req_data['b']) return HttpResponse('OK')
- 非表單類型的請求體數(shù)據(jù),Django無法自動解析治力,可以通過request.body屬性獲取最原始的請求體數(shù)據(jù)蒙秒,自己按照請求體格式(JSON、XML等)進(jìn)行解析宵统。request.body返回
請求頭
可以通過request.META
屬性獲取請求頭headers中的數(shù)據(jù),request.META為字典類型马澈。
其中包含HTTP_USER_AGENT
瓢省、SERVER_NAME
等許多信息。
- 獲取示例:
def get_headers(request): print(request.META['CONTENT_TYPE']) return HttpResponse('OK')
其他HttpResponse對象屬性
- method: 獲取請求使用的HTTP方法痊班,常用的包括"GET"净捅、"POST"
- user: 請求的用戶對象
- path: 請求頁面的完整路徑,不包含域名和參數(shù)部分
- encoding:一個字符串辩块,表示提交的數(shù)據(jù)的編碼方式
- 如果為None則表示使用瀏覽器的默認(rèn)設(shè)置蛔六,一般為utf-8。
- 這個屬性是可寫的废亭,可以通過修改它來修改訪問表單數(shù)據(jù)使用的編碼国章,接下來對屬性的任何訪問將使用新的encoding值。
- FILES:一個類似于字典的對象豆村,包含所有的上傳文件液兽。
Response響應(yīng)
HttpResponse
可以使用django.http.HttpResponse來構(gòu)造響應(yīng)對象。
-
設(shè)置方式:
- 傳參方式:
HttpResponse(content=響應(yīng)體, content_type=響應(yīng)體數(shù)據(jù)類型, status=狀態(tài)碼)
- 屬性設(shè)置方式:
response = HttpResponse() response.content = 響應(yīng)體 response.status_code = 404
- 響應(yīng)頭設(shè)置:
# 可增加新的或修改已有請求頭 response = HttpResponse() response['Itcast'] = 'Python' # 自定義響應(yīng)頭 Itcast, 值為Python
- 總示例:
from django.http import HttpResponse def demo_view(request): return HttpResponse('itcast python', status=400) 或者 response = HttpResponse('itcast python') response.status_code = 400 response['Itcast'] = 'Python' return response
HttpResponse子類
Django提供了一系列HttpResponse的子類掌动,可以快速設(shè)置狀態(tài)碼
- HttpResponseRedirect 301
- HttpResponsePermanentRedirect 302
- HttpResponseNotModified 304
- HttpResponseBadRequest 400
- HttpResponseNotFound 404
- HttpResponseForbidden 403
- HttpResponseNotAllowed 405
- HttpResponseGone 410
- HttpResponseServerError 500
cookie設(shè)置和讀取
- Cookie以鍵值對Key-Value形勢進(jìn)行信息的存儲四啰。
- Cookie基于域名安全,不同域名的Cookie是不能互相訪問的
1. 設(shè)置cookie
可以通過HttpResponse對象中的set_cookie方法來設(shè)置cookie粗恢。
HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
- max_age 單位為秒柑晒,默認(rèn)為None。如果是臨時cookie眷射,可將max_age設(shè)置為None匙赞。
2. 讀取cookie
可以通過HttpRequest對象的COOKIES屬性來讀取本次請求攜帶的cookie值佛掖。request.COOKIES為字典類型。
cookies = request.COOKIES
session設(shè)置和儲存
session可保存在數(shù)據(jù)庫涌庭、本地緩存中芥被。
-
為提高性能,常將session存在Redis中坐榆,此處以Redis為例
1) 安裝擴(kuò)展pip install django-redis
2)配置
settings.py文件中如下設(shè)置:CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
注意:
如果redis的ip地址不是本地回環(huán)127.0.0.1拴魄,而是其他地址,訪問Django時席镀,可能出現(xiàn)Redis連接錯誤匹中,需要在redis配置文件中添加特定ip地址。
-
redis://127.0.0.1:6379/1確定使用的數(shù)據(jù)庫為第二個愉昆,查看時在redis使用
select 1
選擇职员。3)session操作
通過HttpRequest對象request的session屬性進(jìn)行會話的讀寫操作麻蹋。- 以鍵值對格式寫session:
request.session[key] = value
- 根據(jù)鍵讀取值:
request.session.get(key,默認(rèn)值)
- 設(shè)置session的有效期
request.session.set_expiry(value)
注:
如果value是一個整數(shù)跛溉,session將在value秒沒有活動后過期。
如果value為0扮授,那么用戶session的Cookie將在用戶的瀏覽器關(guān)閉時過期芳室。
如果value為None,那么session有效期將采用系統(tǒng)默認(rèn)值刹勃,默認(rèn)為兩周堪侯,可以通過在settings.py中設(shè)置SESSION_COOKIE_AGE來設(shè)置全局默認(rèn)值。