Django - 檢視層 - 檢視函式及快捷方式

學習中的小菜鳥.發表於2021-01-03

簡單的檢視

返回當前日期和時間作為HTML文件的檢視

from django.http import HttpResponse
import datetime

def current_time(request):
	now = datetime.datetime.now()
	html = '<p>It is now %s.</p>' % now
	return HttpResponse(html)
  • 首先從django.http模組匯入了HttpResponse類, 以及Python的datetime
  • 然後定義了current_time檢視函式
  • 每個檢視函式都接收一個HttpRequest物件作為第一位置引數, 一般取名為request.
  • 該檢視返回一個HttpResponse物件, 其中包含生成的HTML頁面.

自定義各種錯誤頁面

首先在根URLconf中額外增加錯誤頁面的條目

from django.contrib import admin
from django.urls import path
from app import views

...

# 增加的條目
handler400 = views.bad_request
handler403 = views.permission_denied
handler404 = views.page_not_found
handler500 = views.error

app/views.py

from django.shortcuts import render
from django.views.decorators.csrf import requires_csrf_token

@requires_csrf_token
def bad_request(request, exception):
	return render(request, '400.html')

@requires_csrf_token
def permission_denied(request, exception):
	return render(request, '403.html')

@requires_csrf_token
def page_not_found(request, exception):
	return render(request, '404.html')

@requires_csrf_token
def error(request, exception):
	return render(request, '500.html')

然後根據自己的需求, 建立對應的400,403,404,500四個頁面.

只有當DEBUG設定為False時, 這些錯誤檢視才會被自動執行

非同步檢視

Django3.1開始支援非同步檢視函式
編寫非同步檢視函式, 只需要用Python的async def 關鍵字語法

from django.http import HttpResponse
import datetime

async def current_time(request):
	now = datetime.datetime.now()
	html = '<p>It is now %s.</p>' % now
	return HttpResponse(html)

內建的快捷方法

render()

render(request, template_name, context=None, content_type=None, status=None, using=None)

結合一個給定的模板給一個給定的上下文字典, 返回一個渲染後的HtppResponse物件
必要引數 :

  • request : 檢視函式處理的當前請求
  • template_name : 要使用的模板的完整名稱或者模板名稱的列表, 如果是一個列表, 將使用其中能夠查詢到的第一個模板

可選引數

  • context : 新增到模板上下文的一個資料字典. 使用Python內建的locals()方法, 可以將函式作用域內的所有變數一次性新增進去
  • content_type : 用於生成的文件的MIME型別, 預設為’text/html’.
  • status : 響應的狀態碼. 預設為200
  • using : 用於載入模板使用的模板引擎的NAME

redirect()

redirect(to, args, permanent=False, *kwargs)

根據傳遞進來的url引數, 返回HttpResponseRedirect

引數to可以是 :

  • 一個模型例項 : 將呼叫模型的get_absolute_url()函式, 反向解析出目的url.
  • URL的name名稱 : 可能帶有引數 : reverse()將用於反向解析url.
  • 一個絕對的或相對的URL : 將原封不動的作為重定向的目標位置.

示例 :

  • 呼叫物件的get_absolute_url()方法來重定向URL
from django.shortcuts import redirect

def my_view(request):
	obj = MyModel.objects.get(...)
	return redirect(obj)
  • 傳遞URL的name名稱, 內部會自動使用reverse()方法反向解析url.
def my_view(request):
	return redirect('index_name', foo='bar')

get_object_or_404()

get_objects_or_404(klass, args, **kwargs)
  • klass : 要獲取的物件的Model類名或者Queryset等.
  • **kwargs : 查詢的引數

查詢某個物件, 找到了則進行下一步處理, 沒找到則返回404

示例 :

  • 從MyModel中使用主鍵1獲取物件
from django.shortcuts import get_object_or_404

def my_view(request):
	return get_object_or_404(MyModel, pk=1)
  • 還可以傳遞一個QuerySet例項
get_object_or_404(Book, title__startswith='M', pk=1)

get_list_or_404()

返回一個給定模型管理器上filter()的結果, 並將結果對映為一個列表, 如果結果為空則彈出Http404異常

示例 :
從MyModel中獲取所有釋出出來的物件

from djang.shortcuts import get_list_or_404

def my_view(request):
	my_objects = get_list_or_404(MyModel, published=True)

檢視裝飾器

require_http_methods()

用於限制可以訪問該檢視的HTTP方法

from django.viewsdecorators.http import require_http_methods

@require_http_methods(["GET", "POST"])
def my_view(request):
	....

serve()檢視

使用者上傳的圖片,檔案等, 統稱為MEDIA

為了方便在開發過程中, 對MEDIA資源的使用和測試, Django內建了一個serve()檢視, 幫我們實現了通用的功能.

serve()檢視只能用於開發環境

使用步驟 :

根路由urls

from django.conf import settings
from django.urls import re_path
from djang.views.static import serve

if setting.DEBUG:
	urlpatterns += [
		re_path(r'^media/(?P<path>.*)$', serve, {
			'document_root': settings.MEDIA_ROOT,
		}),
	]

在settings中新增下面的配置

MEDIA_URL = '/media/'
MEDIA_ROOT = '/media/'

在Django專案的根目錄下, 新建一個media資料夾, 將MEDIA資源放進去.

相關文章