1. 程式人生 > >Django入門-6:檢視-HttpResponse物件

Django入門-6:檢視-HttpResponse物件

HttpResponse物件

  1. django.http模組中定義了HttpResponse物件的API
  2. HttpRequest物件由Django自動建立,HttpResponse物件由程式設計師建立
  • 不呼叫模板,直接返回資料
    1. #coding=utf-8
    2. from django.http importHttpResponse
    3. def index(request):
    4. returnHttpResponse('你好')
  • 呼叫模板
    1. from django.http importHttpResponse
    2. from django.template importRequestContext, loader
    3. def detail(request, id):
    4. # return HttpResponse("DETAIL %s" % id)
    5. book =BookInfo.objects.get(pk=id)
    6. template = loader.get_template('booktest/detail.html')
    7. # context = RequestContext(request, {'book': book})
    8. context ={'book': book}
    9. returnHttpResponse(template.render(context))

屬性

  1. content表示返回的內容,字串型別
  2. charset表示response採用的編碼字符集,字串型別
  3. status_code響應的HTTP響應狀態碼
  4. content-type:指定輸出的MIME型別

方法

  1. init 使用頁內容例項化HttpResponse物件
  2. write(content):以檔案的方式寫
  3. flush():以檔案的方式輸出快取區
  4. set_cookie(key, value='', max_age=None, expires=None):設定Cookie
    1. keyvalue都是字串型別
    2. max_age是一個整數,表示在指定秒數後過期
    3. expires是一個datetimetimedelta物件,會話將在這個指定的日期/時間過期,
    4. 注意datetimetimedelta值只有在使用PickleSerializer時才可序列化
    5. max_ageexpires二選一
    6. 如果不指定過期時間,則兩個星期後過期
      1. from django.http importHttpResponse
      2. from datetime import*
      3. defcookieTest(request):
      4. response =HttpResponse()
      5. # 讀cookie
      6. if request.COOKIES.has_key('h1'):
      7. response.write('<h1>'+ request.COOKIES['h1']+'</h1>')
      8. # 寫cookie
      9. response.set_cookie('h1','你好',120)
      10. # 寫cookie
      11. # response.set_cookie('h1', '你好', None, datetime(2016, 10, 31))
      12. return response
  • delete_cookie(key):刪除指定的key的Cookie,如果key不存在則什麼也不發生

子類HttpResponseRedirect

  • 重定向,伺服器端跳轉
  • 建構函式的第一個引數用來指定重定向的地址
    1. views1.py
    2. from django.shortcuts import render,redirect 【簡寫】
    3. from django.http importHttpResponse,HttpResponseRedirect
    4. def index(request):
    5. # returnHttpResponseRedirect('js/')
    6.    returnredirect('js/')
    7. def index2(request,id):
    8. returnHttpResponse(id)
    9. 在應用的urls.py中增加一個url物件
    10. url(r'^([0-9]+)/$', views1.index2, name='index2'),
  • 請求位址列如圖:
    1. 127.0.0.1:8000/
  • 請求結果的地址欄如圖:
    1. 127.0.0.1:8000/js/
  • 推薦使用反向解析
    1. from django.core.urlresolvers import reverse
    2. def index(request):
    3. returnHttpResponseRedirect(reverse('booktest:index2', args=(1,)))

子類JsonResponse

  1. 返回json資料,一般用於非同步請求
  2. _init _(data)
  3. 幫助使用者建立JSON編碼的響應
  4. 引數data是字典物件
  5. JsonResponse的預設Content-Typeapplication/json
  1. from django.http importJsonResponse
  2. def index2(requeset):
  3. returnJsonResponse({'list':'abc'})

簡寫函式

render

  1. render(request, template_name[, context])
  2. 結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的HttpResponse物件
  3. request:該request用於生成response
  4. template_name:要使用的模板的完整名稱
  5. context:新增到模板上下文的一個字典,檢視將在渲染模板之前呼叫它
  1. from django.shortcuts import render
  2. def index(request):
  3. return render(request,'booktest/index.html',{'h1':'hello'})

重定向

  1. redirect(to)
  2. 為傳遞進來的引數返回HttpResponseRedirect
  3. to推薦使用反向解析
  1. from django.shortcuts import redirect
  2. from django.core.urlresolvers import reverse
  3. def index(request):
  4. return redirect(reverse('booktest:index2'))

得到物件或返回404

  1. get_object_or_404(klass, args,*kwargs)
  2. 通過模型管理器或查詢集呼叫get()方法,如果沒找到物件,不引發模型的DoesNotExist異常,
  3. 而是引發Http404異常
  4. klass:獲取物件的模型類、Manager物件或QuerySet物件
  5. **kwargs:查詢的引數,格式應該可以被get()和filter()接受
  6. 如果找到多個物件將引發MultipleObjectsReturned異常
  1. from django.shortcuts import*
  2. def detail(request, id):
  3. try:
  4. book =get_object_or_404(BookInfo, pk=id)
  5. exceptBookInfo.MultipleObjectsReturned:
  6. book =None
  7. return render(request,'booktest/detail.html',{'book': book})
  8. settings.py中的DEBUG改為False
  9. 將請求地址輸入2100檢視效果

得到列表或返回404

  1. get_list_or_404(klass, args,*kwargs)
  2. klass:獲取列表的一個ModelManagerQuerySet例項
  3. **kwargs:查尋的引數,格式應該可以被get()和filter()接受
  1. from django.shortcuts import*
  2. def index(request):
  3. # list = get_list_or_404(BookInfo, pk__lt=1)
  4. list = get_list_or_404(BookInfo, pk__lt=6)
  5. return render(request,'booktest/index.html',{'list': list})
  6. settings.py中的DEBUG改為False