Django知識(shí)第七天

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'),
]
  1. 發(fā)起ajax請(qǐng)求:jquery發(fā)起
  2. 執(zhí)行相應(yīng)的視圖函數(shù)坎怪,返回json內(nèi)容
  3. 執(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等睁冬。

  1. 存儲(chǔ)在數(shù)據(jù)庫中,如下設(shè)置可以寫看疙,也可以不寫豆拨,這是默認(rèn)存儲(chǔ)方式。
SESSION_ENGINE='django.contrib.sessions.backends.db'
  1. 存儲(chǔ)在緩存中:存儲(chǔ)在本機(jī)內(nèi)存中能庆,如果丟失則不能找回施禾,比數(shù)據(jù)庫的方式讀寫更快。
SESSION_ENGINE='django.contrib.sessions.backends.cache'
  1. 混合存儲(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')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冠骄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子加袋,更是在濱河造成了極大的恐慌凛辣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件职烧,死亡現(xiàn)場(chǎng)離奇詭異扁誓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蚀之,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蝗敢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人足删,你說我怎么就攤上這事寿谴。” “怎么了失受?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵讶泰,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么纳账? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮惠桃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辖试。我一直安慰自己,他們只是感情好劈狐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布罐孝。 她就那樣靜靜地躺著,像睡著了一般肥缔。 火紅的嫁衣襯著肌膚如雪莲兢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音改艇,去河邊找鬼收班。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谒兄,可吹牛的內(nèi)容都是我干的摔桦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼承疲,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼邻耕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起燕鸽,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤兄世,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后啊研,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體御滩,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年党远,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了削解。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡麸锉,死狀恐怖钠绍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情花沉,我是刑警寧澤柳爽,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站碱屁,受9級(jí)特大地震影響磷脯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娩脾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一赵誓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柿赊,春花似錦俩功、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胰挑,卻和暖如春蔓罚,著一層夾襖步出監(jiān)牢的瞬間椿肩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工豺谈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留郑象,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓茬末,卻偏偏與公主長得像厂榛,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子团南,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容