治大國若烹小鮮。以道蒞天下
——老子《道德經》
本節內容
- 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
大家可以自己試試哦~~
未完待續,下一節,將會是里程碑的一節內容,HTML頁面會出現在我們的web項目中
Django來敲門