HttpResponse對(duì)象
視圖在接收請(qǐng)求并處理后,必須返回HttpResponse對(duì)象或子對(duì)象庶骄。在django.http模塊中定義了HttpResponse對(duì)象的API。HttpRequest對(duì)象由Django創(chuàng)建,HttpResponse對(duì)象由開發(fā)人員創(chuàng)建诚纸。
屬性
- content:表示返回的內(nèi)容窜觉。
- charset:表示response采用的編碼字符集谷炸,默認(rèn)為utf-8。
- status_code:返回的HTTP響應(yīng)狀態(tài)碼禀挫。
- content-type:指定返回?cái)?shù)據(jù)的的MIME類型旬陡,默認(rèn)為'text/html'。
方法
- init:創(chuàng)建HttpResponse對(duì)象后完成返回內(nèi)容的初始化语婴。
- set_cookie:設(shè)置Cookie信息描孟。
set_cookie(key, value='', max_age=None, expires=None)
cookie是網(wǎng)站以鍵值對(duì)格式存儲(chǔ)在瀏覽器中的一段純文本信息,用于實(shí)現(xiàn)用戶跟蹤砰左。
- max_age是一個(gè)整數(shù)匿醒,表示在指定秒數(shù)后過期。
- expires是一個(gè)datetime或timedelta對(duì)象缠导,會(huì)話將在這個(gè)指定的日期/時(shí)間過期廉羔。
max_age與expires二選一。
如果不指定過期時(shí)間僻造,在關(guān)閉瀏覽器時(shí)cookie會(huì)過期憋他。
- delete_cookie(key):刪除指定的key的Cookie孩饼,如果key不存在則什么也不發(fā)生。
- write:向響應(yīng)體中寫數(shù)據(jù)
調(diào)用模板簡寫函數(shù)
from django.shortcuts import render
...
def index3(request):
return render(request, 'booktest/index3.html', {'h1': 'hello'}
JsonResponse
在瀏覽器中使用javascript發(fā)起ajax請(qǐng)求時(shí)竹挡,返回json格式的數(shù)據(jù)镀娶,此處以jquery的get()方法為例。類JsonResponse繼承自HttpResponse對(duì)象此迅,被定義在django.http模塊中汽畴,創(chuàng)建對(duì)象時(shí)接收字典作為參數(shù)。
Ajax登錄示例
打開settings.py文件耸序,在文件最底部忍些,配置靜態(tài)文件查找路徑,并且要求開啟調(diào)試
DEBUG = True
...
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
- 發(fā)起ajax請(qǐng)求:jquery發(fā)起
- 執(zhí)行相應(yīng)的視圖函數(shù)坎怪,返回json內(nèi)容
- 執(zhí)行相應(yīng)的回調(diào)函數(shù)罢坝。通過判斷json內(nèi)容,進(jìn)行相應(yīng)處理搅窿。
Ajax登錄案例
編寫視圖
def index(request):
return render(request,'booktest/index.html')
def get_ajax_check(request):
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'admin' and password == 'admin':
return JsonResponse({'res':1})
else:
return JsonResponse({'res':0})
編寫html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄界面</title>
<script src="/static/js/jquery-1.12.4.min.js"></script>
<script>
$(function () {
$('#butlogin').click(function () {
username = $('#username').val()
password = $('#password').val()
$.ajax({
'url':'/get_ajax_check/',
'type':'post',
'data':{'username':username,'password':password},
'dataType':'json'
}).success(
function (data) {
if (data.res ==0){
$('#errmeg').show().html('錯(cuò)誤')
}else {
location.href = '/'
}
}
)
})
})
</script>
<style>
#errmsg{
color:red;
}
</style>
</head>
<body>
用戶名: <input type="text" id ="username"> <br>
密 碼 : <input type="text" id ="password"> <br>
<input type="button" id="butlogin" value="登錄"> <br>
<div id="errmeg"></div>
</body>
</html>
編寫路由
urlpatterns = [
url(r'^$', views.index),
url(r'^get_ajax_check/$',views.get_ajax_check)
]
運(yùn)行輸入正確的密碼嘁酿,跳轉(zhuǎn)回登錄頁
運(yùn)行輸入錯(cuò)誤的密碼
HttpResponseRedirect
當(dāng)一個(gè)邏輯處理完成后,不需要向客戶端呈現(xiàn)數(shù)據(jù)男应,而是轉(zhuǎn)回到其它頁面闹司,如添加成功、修改成功沐飘、刪除成功后顯示數(shù)據(jù)列表游桩,而數(shù)據(jù)的列表視圖已經(jīng)開發(fā)完成,此時(shí)不需要重新編寫列表的代碼耐朴,而是轉(zhuǎn)到這個(gè)視圖就可以借卧,此時(shí)就需要模擬一個(gè)用戶請(qǐng)求的效果,從一個(gè)視圖轉(zhuǎn)到另外一個(gè)視圖筛峭,就稱為重定向铐刘。
Django中提供了HttpResponseRedirect對(duì)象實(shí)現(xiàn)重定向功能,這個(gè)類繼承自HttpResponse影晓,被定義在django.http模塊中镰吵,返回的狀態(tài)碼為302。
示例
在booktest/views.py文件中定義視圖red1俯艰,代碼如下:
from django.http import HttpResponseRedirect
...
# 定義重定義向視圖捡遍,轉(zhuǎn)向首頁
def red1(request):
return HttpResponseRedirect('/')
重定向簡寫函數(shù)redirect
在django.shortcuts模塊中為重定向類提供了簡寫函數(shù)redirect。
修改booktest/views.py文件中red1視圖竹握,代碼如下:
from django.shortcuts import redirect
...
def red1(request):
return redirect('/')
狀態(tài)保持
瀏覽器請(qǐng)求服務(wù)器是無狀態(tài)的画株。無狀態(tài)指一次用戶請(qǐng)求時(shí),瀏覽器、服務(wù)器無法知道之前這個(gè)用戶做過什么谓传,每次請(qǐng)求都是一次新的請(qǐng)求蜈项。無狀態(tài)的應(yīng)用層面的原因是:瀏覽器和服務(wù)器之間的通信都遵守HTTP協(xié)議。根本原因是:瀏覽器與服務(wù)器是使用Socket套接字進(jìn)行通信的续挟,服務(wù)器將請(qǐng)求結(jié)果返回給瀏覽器之后紧卒,會(huì)關(guān)閉當(dāng)前的Socket連接,而且服務(wù)器也會(huì)在處理頁面完畢之后銷毀頁面對(duì)象诗祸。
有時(shí)需要保存下來用戶瀏覽的狀態(tài)跑芳,比如用戶是否登錄過,瀏覽過哪些商品等直颅。 實(shí)現(xiàn)狀態(tài)保持主要有兩種方式:
- 在客戶端存儲(chǔ)信息使用Cookie博个。
- 在服務(wù)器端存儲(chǔ)信息使用Session。
Cookie
Cookie功偿,有時(shí)也用其復(fù)數(shù)形式Cookies盆佣,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行session跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)械荷。Cookie最早是網(wǎng)景公司的前雇員Lou Montulli在1993年3月的發(fā)明共耍。Cookie是由服務(wù)器端生成,發(fā)送給User-Agent(一般是瀏覽器)吨瞎,瀏覽器會(huì)將Cookie的key/value保存到某個(gè)目錄下的文本文件內(nèi)痹兜,下次請(qǐng)求同一網(wǎng)站時(shí)就發(fā)送該Cookie給服務(wù)器(前提是瀏覽器設(shè)置為啟用cookie)。Cookie名稱和值可以由服務(wù)器端開發(fā)自己定義颤诀,這樣服務(wù)器可以知道該用戶是否是合法用戶以及是否需要重新登錄等佃蚜。服務(wù)器可以利用Cookies包含信息的任意性來篩選并經(jīng)常性維護(hù)這些信息,以判斷在HTTP傳輸中的狀態(tài)着绊。Cookies最典型記住用戶名。
Cookie是存儲(chǔ)在瀏覽器中的一段純文本信息熟尉,建議不要存儲(chǔ)敏感信息如密碼归露,因?yàn)殡娔X上的瀏覽器可能被其它人使用。
Cookie的特點(diǎn)
- Cookie以鍵值對(duì)的格式進(jìn)行信息的存儲(chǔ)斤儿。
- Cookie基于域名安全剧包,不同域名的Cookie是不能互相訪問的,如訪問neuedu.cn時(shí)向?yàn)g覽器中寫了Cookie信息,使用同一瀏覽器訪問baidu.com時(shí)往果,無法訪問到neuedu.cn寫的Cookie信息疆液。
當(dāng)瀏覽器請(qǐng)求某網(wǎng)站時(shí),會(huì)將瀏覽器存儲(chǔ)的跟網(wǎng)站相關(guān)的所有Cookie信息提交給網(wǎng)站服務(wù)器陕贮。
典型應(yīng)用:記住用戶名堕油,網(wǎng)站的廣告推送。
設(shè)置Cookie
打開booktest/views.py文件,創(chuàng)建視圖cookie_set掉缺。
def cookie_set(request):
response = HttpResponse("<h1>設(shè)置Cookie卜录,請(qǐng)查看響應(yīng)報(bào)文頭</h1>")
response.set_cookie('h1', bytes('你好', 'utf-8').decode('ISO-8859-1'))
return response
2)打開booktest/urls.py文件,配置url眶明。
url(r'^cookie_set/$',views.cookie_set),
讀取Cookie
Cookie信息被包含在請(qǐng)求頭中艰毒,使用request對(duì)象的COOKIES屬性訪問。
1)打開booktest/views.py文件搜囱,創(chuàng)建視圖cookie_get丑瞧。
def cookie_get(request):
response = HttpResponse("讀取Cookie,數(shù)據(jù)如下:<br>")
if 'h1' in request.COOKIES:
response.write('<h1>' + request.COOKIES['h1'].encode("iso-8859-1").decode('utf8') + '</h1>')
return response
2)打開booktest/urls.py文件,配置url蜀肘。
url(r'^cookie_get/$',views.cookie_get),
3)在瀏覽器輸入如下網(wǎng)址绊汹。
http://127.0.0.1:8000/cookie_get/
Session
對(duì)于敏感、重要的信息幌缝,建議要儲(chǔ)在服務(wù)器端灸促,不能存儲(chǔ)在瀏覽器中,如用戶名涵卵、余額浴栽、等級(jí)、驗(yàn)證碼等信息轿偎。
在服務(wù)器端進(jìn)行狀態(tài)保持的方案就是Session典鸡。
啟用Session
Django項(xiàng)目默認(rèn)啟用Session。
打開settings.py文件坏晦,在項(xiàng)MIDDLEWARE_CLASSES中啟用Session中間件萝玷。
禁用Session:將Session中間件刪除。
存儲(chǔ)方式
打開settings.py文件昆婿,設(shè)置SESSION_ENGINE項(xiàng)指定Session數(shù)據(jù)存儲(chǔ)的方式球碉,可以存儲(chǔ)在數(shù)據(jù)庫、緩存仓蛆、Redis等睁冬。
- 存儲(chǔ)在數(shù)據(jù)庫中,如下設(shè)置可以寫看疙,也可以不寫豆拨,這是默認(rèn)存儲(chǔ)方式。
SESSION_ENGINE='django.contrib.sessions.backends.db'
- 存儲(chǔ)在緩存中:存儲(chǔ)在本機(jī)內(nèi)存中能庆,如果丟失則不能找回施禾,比數(shù)據(jù)庫的方式讀寫更快。
SESSION_ENGINE='django.contrib.sessions.backends.cache'
- 混合存儲(chǔ):優(yōu)先從本機(jī)內(nèi)存中存取搁胆,如果沒有則從數(shù)據(jù)庫中存取
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
如果存儲(chǔ)在數(shù)據(jù)庫中弥搞,需要在項(xiàng)INSTALLED_APPS中安裝Session應(yīng)用邮绿。
遷移后會(huì)在數(shù)據(jù)庫中創(chuàng)建出存儲(chǔ)Session的表。
由表結(jié)構(gòu)可知拓巧,操作Session包括三個(gè)數(shù)據(jù):鍵斯碌,值,過期時(shí)間
寫session
打開booktest/views.py文件肛度,創(chuàng)建視圖session_test傻唾,代碼如下:
def session_test(request):
request.session['h1']='hello'
return HttpResponse('寫session')
刪除session
打開booktest/views.py文件,修改session_set視圖如下:
def session_test(request):
del request.session['h1']
return HttpResponse('del')
del 并未把數(shù)據(jù)庫中的值刪除而是把它變成了空承耿,如果想把數(shù)據(jù)庫中的刪除用下面
def session_test(request):
request.session.flush()
return HttpResponse('del')