Django-請求與響應

-----請求Requst
一、請求的幾種方式:(利用HTTP協議向服務器傳參有幾種路徑)
* 提取URL的特定部分,如/weather/beijing/2018,能夠在服務器端的路由中用正則表達式截取;
* 查詢字符串(query string),形如key1=value1&key2=value2;
* 請求體(body)中發送的數據,好比表單數據、json、xml;
* 在http報文的頭(header)中。
 
二、URL路徑參數
在定義路由URL時,可使用正則表達式提取參數的方法從URL中獲取請求參數,Django會將提取的參數直接傳遞到視圖的傳入參數中。
 
#  未命名參數按定義順序傳遞
url(r'^weather/([a-z]+)/(\d{4})/$', views.weather),
 
def weather(request, city, year):
print('city=%s' % city)
print('year=%s' % year)
return HttpResponse('OK')
 
 
 
#  命名參數按名字傳遞
url(r'^weather/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.weather),
 
def weather(request, year, city):
print('city=%s' % city)
print('year=%s' % year)
return HttpResponse('OK')
 
 
三、Django中的QueryDict對象
方法get():根據鍵獲取值
若是一個鍵同時擁有多個值將獲取最後一個值
若是鍵不存在則返回None值,能夠設置默認值進行後續處理
 
dict.get('鍵',默認值)
可簡寫爲
dict['鍵']
 
 
 
方法getlist():根據鍵獲取值,值以列表返回,能夠獲取指定鍵的全部值
若是鍵不存在則返回空列表[],能夠設置默認值進行後續處理
dict.getlist('鍵',默認值)
 
 
 
四、查詢字符串Query String
# /qs/?a=1&b=2&a=3
 
def qs(request):
a = request.GET.get('a')
b = request.GET.get('b')
alist = request.GET.getlist('a')
print(a) # 3
print(b) # 2
print(alist) # ['1', '3']
return HttpResponse('OK')
 
 
#  重要:查詢字符串不區分請求方式,即假使客戶端進行POST方式的請求,依然能夠經過request.GET獲取請求中的查詢字符串數據
 
五、請求體
Django默認開啓了CSRF防禦,會對上述請求方式進行CSRF防禦驗證,在測試時能夠關閉CSRF防禦機制,方法爲在settings.py文件中註釋掉CSRF中間件
 
5-一、表單類型Form Data
#
def get_body(request):
a = request.POST.get('a')
b = request.POST.get('b')
alist = request.POST.getlist('a')
print(a)
print(b)
print(alist)
return HttpResponse('OK')
 
# 重要:只要請求體的數據是表單類型,不管是哪一種請求方式(POST、PUT、PATCH、DELETE),都是使用request.POST來獲取請求體的表單數據
 
 
5-二、非表單類型 Non-Form Data
import json
 
def get_body_json(request):
json_str = request.body
req_data = json.loads(json_str)
print(req_data['a'])
print(req_data['b'])
return HttpResponse('OK')
 
六、請求頭
#  能夠經過request.META屬性獲取請求頭headers中的數據,request.META爲字典類型。
常見的請求頭如:
* CONTENT_LENGTH – The length of the request body (as a string).
* CONTENT_TYPE – The MIME type of the request body.
* HTTP_ACCEPT – Acceptable content types for the response.
* HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
* HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
* HTTP_HOST – The HTTP Host header sent by the client.
* HTTP_REFERER – The referring page, if any.
* HTTP_USER_AGENT – The client’s user-agent string.
* QUERY_STRING – The query string, as a single (unparsed) string.
* REMOTE_ADDR – The IP address of the client.
* REMOTE_HOST – The hostname of the client.
* REMOTE_USER – The user authenticated by the Web server, if any.
* REQUEST_METHOD – A string such as "GET" or "POST".
* SERVER_NAME – The hostname of the server.
* SERVER_PORT – The port of the server (as a string).
 
 
def get_headers(request):
print(request.META['CONTENT_TYPE'])
return HttpResponse('OK')
 
七、其餘經常使用HttpRequest對象屬性
* method:一個字符串,表示請求使用的HTTP方法,經常使用值包括:'GET'、'POST'。
* user:請求的用戶對象。
* path:一個字符串,表示請求的頁面的完整路徑,不包含域名和參數部分。
* encoding:一個字符串,表示提交的數據的編碼方式。
若是爲None則表示使用瀏覽器的默認設置,通常爲utf-8。
這個屬性是可寫的,能夠經過修改它來修改訪問表單數據使用的編碼,接下來對屬性的任何訪問將使用新的encoding值。
* FILES:一個相似於字典的對象,包含全部的上傳文件。
 
-----響應Response
視圖在接收請求並處理後,必須返回HttpResponse對象或子對象。HttpRequest對象由Django建立,HttpResponse對象由開發人員建立
 
一、HttpResponse
Response(content=響應體, content_type=響應體數據類型, status=狀態碼)
 
也可經過HttpResponse對象屬性來設置響應體、響應體數據類型、狀態碼:
* content:表示返回的內容。
* status_code:返回的HTTP響應狀態碼。
* content_type:指定返回數據的的MIME類型。
 
response = Response()
response['Itcast'] = 'Python' # 自定義響應頭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子類
* HttpResponseRedirect 301
* HttpResponsePermanentRedirect 302
* HttpResponseNotModified 304
* HttpResponseBadRequest 400
* HttpResponseNotFound 404
* HttpResponseForbidden 403
* HttpResponseNotAllowed 405
* HttpResponseGone 410
* HttpResponseServerError 500
 
三、JsonResponse
from django.http import JsonResponse
 
def demo_view(request):
return JsonResponse({'city': 'beijing', 'subject': 'python'})
 
 
四、redirect重定向
 
-----Cookie
Cookie,有時也用其複數形式Cookies,指某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(一般通過加密)。Cookie最先是網景公司的前僱員Lou Montulli在1993年3月的發明。Cookie是由服務器端生成,發送給User-Agent(通常是瀏覽器),瀏覽器會將Cookie的key/value保存到某個目錄下的文本文件內,下次請求同一網站時就發送該Cookie給服務器(前提是瀏覽器設置爲啓用cookie)。Cookie名稱和值能夠由服務器端開發本身定義,這樣服務器能夠知道該用戶是不是合法用戶以及是否須要從新登陸等。服務器能夠利用Cookies包含信息的任意性來篩選並常常性維護這些信息,以判斷在HTTP傳輸中的狀態。Cookies最典型記住用戶名。
Cookie是存儲在瀏覽器中的一段純文本信息,建議不要存儲敏感信息如密碼,由於電腦上的瀏覽器可能被其它人使用。
 

Cookie的特色

* Cookie以鍵值對的格式進行信息的存儲。
* Cookie基於域名安全,不一樣域名的Cookie是不能互相訪問的,如訪問itcast.cn時向瀏覽器中寫了Cookie信息,使用同一瀏覽器訪問baidu.com時,沒法訪問到itcast.cn寫的Cookie信息。
* 當瀏覽器請求某網站時,會將瀏覽器存儲的跟網站相關的全部Cookie信息提交給網站服務器。
 
1 設置Cookie
HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
def demo_view(request):
response = HttpResponse('ok')
response.set_cookie('itcast1', 'python1') # 臨時cookie
response.set_cookie('itcast2', 'python2', max_age=3600) # 有效期一小時
return response
 
2 讀取Cookie
def demo_view(request):
cookie1 = request.COOKIES.get('itcast1')
print(cookie1)
return HttpResponse('OK')
 
 
-----Session
1 啓動Session
 
2 存儲方式
在settings.py文件中,能夠設置session數據的存儲方式,能夠保存在數據庫、本地緩存等。
 
2-1 數據庫
SESSION_ENGINE='django.contrib.sessions.backends.db'
 
'django.contrib.sessions' installed_apps 中 安裝session應用
 
2-2 本地存儲
SESSION_ENGINE='django.contrib.sessions.backends.cache'
 
2-3 混合存儲
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
 
2-4 Redis
2-4-一、安裝擴展
pip install django-redis
 
2-4-2 配置 settings.py 文件中作以下設置
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"
 
 
3 Session操做
3-一、 以鍵值對的格式寫session。
request.session['鍵']=值
 
3-2 根據鍵讀取值。
request.session.get('鍵',默認值)
 
3-3 清除全部session,在存儲中刪除值部分。
request.session.clear()
 
3-4 清除session數據,在存儲中刪除session的整條數據。
request.session.flush()
 
3-5 刪除session中的指定鍵及值,在存儲中只刪除某個鍵及對應的值。
del request.session['鍵']
 
3-6 設置session的有效期
request.session.set_expiry(value)
 
* 若是value是一個整數,session將在value秒沒有活動後過時。
* 若是value爲0,那麼用戶session的Cookie將在用戶的瀏覽器關閉時過時。
* 若是value爲None,那麼session有效期將採用系統默認值,默認爲兩週,能夠經過在settings.py中設置SESSION_COOKIE_AGE來設置全局默認值。
相關文章
相關標籤/搜索