1. 程式人生 > >【6】Django檢視函式

【6】Django檢視函式

治大國若烹小鮮。以道蒞天下
——老子《道德經》


本節內容

  • Django web專案的執行流程分析
  • 檢視處理函式的定義
  • 多檢視處理函式及接收引數

1. web專案執行流程分析

通常情況下,完整的處理流程如下:

  • 瀏覽器發起請求(瀏覽器:大爺,我需要http://localhost:8000/polls這個資源,給我吧);
  • 伺服器接收到使用者請求,開始分析這個URL地址(伺服器:介個傢伙要什麼東東啊,掐掉URL預設的頭部http://localhost:8000,剩下的就是要訪問的東東了,原來是要訪問:polls/
  • 伺服器urls.py模組處理路由(伺服器:來來來,來我的mysite/urls.py
    中看看,有木有和你要的東東類似的,找啊找啊找啊找找到一個r"^polls/",就是它了,它是誰呢原來是隔壁老王啊include("polls.url")
  • 伺服器urls.py繼續查詢include包含的下一級路由(伺服器:隔壁老王,這個傢伙要申請polls/裡面的東東,你看看你家有木有這個東東,此時掐掉開頭的"polls/",開始查詢""(找的是一個空白字元), polls/urls.py的內容,找啊找啊找啊找~找到一個url(r"^$"),對應的就是views.index處理函數了)
  • 伺服器處理檢視的函式(伺服器:老王說在我家床上有個views檢視裡面有個index處理函式,就是它了,然後將床單index
    函式處理的結果,扔給了瀏覽器去展示了)

看到這裡是不是已經暈菜了,這就對了,接下來,看一張圖,就明白了

請求的處理過程

接下來,我們的重點就是檢視處理函式

2. 檢視處理函式的定義

在我們建立好的應用polls/中,可以定義檢視函式,專門用於接收和響應URL請求操作的函式;
該函式預設第一個引數接收的就是一個請求物件HttpRequest,通常我們會將第一個引數寫成request;函式後面的其他引數就是可以從URL路徑中接收的引數資料了。

接下來,先看我們之前定義的檢視處理函式如下:

  • 第一個檢視函式的定義和配置,修改mysite/polls/views.py檔案如下
from django.http import HttpResponse
# 訪問應用首頁
def index(request):
    return HttpResponse("Hello Django!")

polls/urls.py中新增路由配置

import django.conf.urls import url
from . import views
# 配置路由操作
urlpatterns = [
    url(r"^$", views.index, name="index")
]

mysite/mysite/urls.py中將應用中的路由檔案包含進去

urlpatterns = [
    url(r"^admin/", admin.site.urls),
    url(r"^polls/", include("polls.urls"))
]

OK,配置結束,此時就可以在瀏覽器中直接訪問我們的應用了
python3 manage.py runserver啟動專案
瀏覽器中訪問:http://localhost:8000/polls就OK了

3.多檢視處理函式及接收引數

接下來,我們定義多個檢視處理函式,並定義接收的引數

修改polls/views.py檔案,新增如下的幾個檢視函式

import django.http import HttpResponse
import .models import Question

# 首頁檢視處理函式
def index(request):
    # 查詢所有的問題
    question_list = Question.object.order_by("-pub_date")
    # 拼接所有的問題
    output = ", ".join([q.question_text for q in question_list])
    # 返回檢視
    return HttpResponse(output)

# 定義問題詳情檢視
def detail(request, question_id):
    # 根據主鍵查詢一個問題物件
    question = Question.objects.get(pk=question_id)
    # 返回檢視
    return HttpResponse("你要檢視編號為<%s>的問題是:%s" % (question_id, question.question_text))

# 定義結果檢視
def result(request, question_id):
    # 直接返回一個檢視
    return HttpResponse("您正在檢視編號為<%s>的問題的結果" % question_id)

# 定義投票處理
def vote(request, question_id):
    # 直接返回一個檢視
    return HttpResponse("您準備給編號為<%s>的問題投票嗎" % question_id)

接下來,修改polls/urls.py路由配置檔案

from django.conf.urls import url

urlpatterns = [
     url(r"^$", views.index, name="index"),
     url(r"^(?P<question_id>\d+)$", views.detail, name="detail"),
     url(r"^(?P<question_id>\d+)/results/$", views.results, name="results"),
     url(r"^(?P<question_id>\d+)/vote/$", views.vote, name="vote"),
]

OK,多個檢視的處理函式就配置完成了,訪問模式如下

瀏覽器請求:http://localhost:8000/polls/
處理函式:index
瀏覽器請求:http://localhost:8000/polls/1
處理函式:detail
瀏覽器請求:http://localhost:8000/polls/1/results
處理函式:results
瀏覽器請求:http://localhost:8000/2/vote
處理函式:vote