治大國若烹小鮮。以道蒞天下
——老子《道德經》
本節內容
- 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