1. 程式人生 > >django學習記錄之建立應用,檢視,路由

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)