1. 程式人生 > >Django-請求與響應

Django-請求與響應

-----請求Requst 1、請求的幾種方式:(利用HTTP協議向伺服器傳參有幾種路徑) * 提取URL的特定部分,如/weather/beijing/2018,可以在伺服器端的路由中用正則表示式擷取; * 查詢字串(query string),形如key1=value1&key2=value2; * 請求體(body)中傳送的資料,比如表單資料、json、xml; * 在http報文的頭(header)中。   2、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')     3、Django中的QueryDict物件 方法get():根據鍵獲取值 如果一個鍵同時擁有多個值將獲取最後一個值 如果鍵不存在則返回None值,可以設定預設值進行後續處理   dict.get('鍵',預設值) 可簡寫為 dict['鍵']       方法getlist():根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值 如果鍵不存在則返回空列表[],可以設定預設值進行後續處理 dict.getlist('鍵',預設值)       4、查詢字串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獲取請求中的查詢字串資料   5、請求體 Django預設開啟了CSRF防護,會對上述請求方式進行CSRF防護驗證,在測試時可以關閉CSRF防護機制,方法為在settings.py檔案中註釋掉CSRF中介軟體   5-1、表單型別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-2、非表單型別 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')   6、請求頭 #  可以通過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')   7、其他常用HttpRequest物件屬性 * method:一個字串,表示請求使用的HTTP方法,常用值包括:'GET'、'POST'。 * user:請求的使用者物件。 * path:一個字串,表示請求的頁面的完整路徑,不包含域名和引數部分。 * encoding:一個字串,表示提交的資料的編碼方式。 如果為None則表示使用瀏覽器的預設設定,一般為utf-8。 這個屬性是可寫的,可以通過修改它來修改訪問表單資料使用的編碼,接下來對屬性的任何訪問將使用新的encoding值。 * FILES:一個類似於字典的物件,包含所有的上傳檔案。   -----響應Response 檢視在接收請求並處理後,必須返回HttpResponse物件或子物件。HttpRequest物件由Django建立,HttpResponse物件由開發人員建立   1、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   2、HttpResponse子類 * HttpResponseRedirect 301 * HttpResponsePermanentRedirect 302 * HttpResponseNotModified 304 * HttpResponseBadRequest 400 * HttpResponseNotFound 404 * HttpResponseForbidden 403 * HttpResponseNotAllowed 405 * HttpResponseGone 410 * HttpResponseServerError 500   3、JsonResponse from django.http import JsonResponse   def demo_view(request): return JsonResponse({'city': 'beijing', 'subject': 'python'})     4、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-1、安裝擴充套件 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-1、 以鍵值對的格式寫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來設定全域性預設值。