django學習記錄之建立應用,檢視,路由
1.在建立好虛擬環境之後,使用:
django-admin startproject my_project
會自動的生成一個工程目錄如下:
settings.py 是專案的整體配置檔案。
urls.py 是專案的URL配置檔案。
wsgi.py 是專案與WSGI相容的Web伺服器入口。
manage.py 是專案管理檔案,通過它管理專案。
可以直接使用:python manage.py runserver 【ip:port】來執行。
2.建立子應用:一個功能模組一個子應用。
建立:在doc視窗輸入:前提先進入到manage.py檔案所在的目錄,然後執行下面命令
python manage.py startproject users(子應用名稱)
miggrations:資料庫遷移歷史檔案。
admin.py:檔案跟網站的後臺管理站點配置相關。
apps.py:儲存子應用的配置資訊
models.py:儲存資料庫模型類
tests.py:用於開發測試用例,編寫單元測試
views:編寫檢視函式
urls.py:手動新增的,用於url路由
注意:在建立完子應用之後,需要註冊安裝才能使用。在工程配置檔案setting.py中,INSTALL_APPS中註冊路徑
3.APP應用的配置
每個應用中都包含了apps.py檔案,在建立時會預設寫入一個配置類,APPConfig.name屬性表示這個配置類(Userconfig)是載入Users這個應用的。APPConfig.verbose_name給它一個直觀的名字在Admin.py管理站點中顯示。
4.建立檢視:和flask一樣都是在views.py中建立。
5.定義路由
1.為了保證每個子應用的相對獨立,可以在每個子應用中新建一個urls.py檔案用於儲存該子應用的路由,在users/urls.py中定義路由資訊。然後在主路由檔案my_django.py中包含各子應用的子路由資料。
2.新增完成之後還需要在總工程my_django/urls中新增子應用的路由
再次啟動程式:python manage.py runserver
然後訪問:127.0.0.1:8000/users/index
7。路由定義位置:除了在子應用中新建urls.py檔案,定義子應用的路由之外,還可以在總路由中直接定義,不需要子應用的urls.py檔案
8.路由解析順序:需要注意定義路由的順序,避免出現遮蔽效應。
從主路由檔案中的urlpatterns列表中以由上至下的順序查詢對應路由規則,如果發現規則為include包含,則再進入被包含的urls中的urlpatterns列表由上至下進行查詢。
值得關注的由上至下的順序,有可能會使上面的路由遮蔽掉下面的路由,帶來非預期結果。如:
urlpatterns = [ url(r'^say', views.say), url(r'^sayhello', views.sayhello), ]
即使訪問sayhello/路徑,預期應該進入sayhello檢視執行,但實際優先查詢到了say路由規則也與sayhello/路徑匹配,實際進入了say檢視執行。
路由命名
在定義路由的時候,可以為路由命名,方便查詢特定檢視的具體路徑資訊。
1) 在使用include函式定義路由時,可以使用namespace引數定義路由的名稱空間,如
url(r'^users/', include('users.urls', namespace='users')),
名稱空間表示,凡是users.urls中定義的路由,均屬於namespace指明的users名下。
名稱空間的作用:避免不同應用中的路由使用了相同的名字發生衝突,使用名稱空間區別開。
2) 在定義普通路由時,可以使用name引數指明路由的名字,如
urlpatterns = [
url(r'^index/$', views.index, name='index'),
url(r'^say', views.say, name='say'),
]
3.2 reverse反解析
使用reverse函式,可以根據路由名稱,返回具體的路徑,如:
from django.core.urlresolvers import reverse # 注意導包路徑
def index(request):
return HttpResponse("hello the world!")
def say(request):
url = reverse('users:index') # 返回 /users/index/
print(url)
return HttpResponse('say')
- 對於未指明namespace的,reverse(路由name)
- 對於指明namespace的,reverse(名稱空間namespace:路由name)