上文我們講到django創建項目的流程以及項目的整體結構,但是,是不是覺得點東西沒什么卵用呢?就像用Xcode創建一個iOS項目,系統自動生成了appdelegate、storyboard等文件,程序是可以運行,然后如何展示我想要的頁面呢?本節主要講解在django下如何將你想要的內容展示出來。
1. django的頁面是如何顯示的?
用戶在訪問一個網址,實際上時發送了一個request請求,比如說“http://www.baidu.com”時,對應的DNS服務器將其解析為公網上的一個IP地址,然后訪問該IP對應的那臺服務器上的Web服務器,Web服務器將對應的程序事先設定好的響應內容返回,即返回一個response,瀏覽器將response顯示出來,即瀏覽器顯示的界面。這個就是用瀏覽器訪問Web的整個流程。
那么,django要做的是什么?就是定義用戶需要訪問的request,以及定義每個request需要做出的響應(response)。
2. 在django下創建app
2.1 django下的app指的是什么?
django下的app即是一個功能相對獨立的模塊,一個django項目可以包含多個app。
2.2 django下如何創建app?
打開終端,進入到上文中創建的testblog目錄下,輸入以下命令:
python3manage.pystartappblog
回車即可在該項目下創建一個名為blog的應用,但是,但是,成功的前提是你創建的應用名blog不能與系統的應用名相同,否則一定報錯,有興趣你可以創建一個名為os的應用試試。
還記得前文說到setting中的配置項么?新增加了一個app,一定要setting中增加以下,打開setting.py文件,在INSTALLED_APPS中增加‘blog’:
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','blog',]
2.3 django下app的目錄結構
用PyCharm打開testblog項目,你會發現在tesgblog下多了一個blog文件夾:
1.png
migrations:
用于數據遷移
admin:
django自動生成的后臺管理頁面,無須在此作修改
apps:
當前app的配置文件
models:
數據模型,和其他語言的一樣
views:
定義前臺顯示的界面
2.3 django顯示app中的內容
我想訪問‘127.0.0.1:8000/index’這樣一個頁面,然后在頁面上顯示一行文字“天行健,君子自強不息!”,該怎么做呢?我們按照用戶訪問的順序倒推程序該如何寫。
首先,訪問url實際上是調用web服務器上對應目錄下的方法,此例中,127.0.0.1:8000指的是web服務器,index指的是該服務器下的對象(可以是文件、類、方法等),所以我們先要在程序中定義index這個對象,在該對象中輸出需要顯示的內容,如上文說的,這個定義是在該app下的views中定義的:
2.png
第二,index已經定義了,該怎么讓web服務器找到index呢?
上文提到,所有定義的界面都是在系統的urls.py文件里配置的
fromdjango.conf.urlsimporturlfromdjango.contribimportadminurlpatterns = [? ? url(r'^admin/', admin.site.urls),]
我們需要將index配置到該數組中即可,如下:
fromdjango.conf.urlsimporturlfromdjango.contribimportadminfromblog.viewsimportindexurlpatterns = [? ? url(r'^admin/', admin.site.urls),? ? url(r'^index/', index),]
好了,此時重新運行一下服務器,訪問‘127.0.0.1:8000/index’,是不是已經看到你想要的結果了呢!
如果,testblog下面有10個app,每個app中有100個頁面,那么urls.py文件中
urlpatterns數組要增加1000條記錄,你還要記住每條記錄屬于哪個app,而且這1000條記錄還不能重名,是不是很酸爽?不怕,我們有其他辦法:我們在每一個app下新建一個urls.py文件,該文件的作用域就是該app,然后再在系統生成的urls.py文件中引用各app中的urls.py,這樣維護起來就比較簡單了。
首先,在blog文件夾下新建一個名為blog_urls.py的文件,將系統urls.py中的內容全部復制過來,去掉不需要的東西,如下:
fromdjango.conf.urlsimporturlfrom.importviewsurlpatterns = [? ? url(r'^index/', views.index),]
然后在系統的urls.py文件中使用include函數將blog_urls的路徑引用進來,如下:
fromdjango.conf.urlsimporturl, includefromdjango.contribimportadminfromblog.viewsimportindexurlpatterns = [? ? url(r'^admin/', admin.site.urls),? ? url(r'^index/', include('blog.blog_urls')),]
此時運行程序,訪問一下 127.0.0.1:8000/index/,我靠,是不是報404錯誤?
我們來分析一下,程序接收到頁面的請求后先去系統的urls.py文件中找名為index的路徑,找到了 url(r'^index/', include('blog.blog_urls'))這條記錄,這個紀錄中include函數又去blog下找到blog_urls.py函數,然后又找到了一條記錄url(r'^index/', views.index),該記錄中還有一個index,此時的路徑就成了index/index/,不信,你可以訪問127.0.0.1:8000/index/index/,一定可以看到你想要的記錄。
blog是第一個獨立的app,我們訪問blog下的index,最好把urls.py文件改為
fromdjango.conf.urlsimporturl, includefromdjango.contribimportadminfromblog.viewsimportindexurlpatterns = [? ? url(r'^admin/', admin.site.urls),? ? url(r'^blog/', include('blog.blog_urls')),]
這樣,可以訪問 127.0.0.1:8000/blog/index/來訪問頁面。