在前面我們知道,Django啟動之前會執行admin.py
中的autodiscover()
方法.
def autodiscover():
autodiscover_modules('admin', register_to=site)
在這個方法里,既然autodiscover_modules
能執行admin.py
文件,那當然也可以執行別的py文件.
如果想讓autodiscover_modules
執行自定義的py文件,該怎么做呢?
在app01的apps.py文件的App01Config類中,定義ready方法
然后導入autodiscover_modules
模塊,讓autodiscover_modules
來執行自定義的py文件
from django.apps import AppConfig
class App01Config(AppConfig):
name = 'app01'
def ready(self):
from django.utils.module_loading import autodiscover_modules
autodiscover_modules("aaaa")
這樣,程序在啟動的時候就會在項目所有的目錄下查找並調用autodiscover_modules
方法來執行aaaa.py文件
在app01目錄下創建aaaa.py文件,在aaaa.py文件中打印"hello world!"
可以看到在項目啟動之前就會在后台打印"hello world!"了.
項目運行到這里,下一步就是要生成URL了,這里又是怎么實現的呢???
新建一個text_url項目,包含appo1的應用,在項目的urls.py中配置url
urlpatterns = [
url(r'^index/$',views.index),
]
在app01的views.py中定義相應的視圖函數index
from django.shortcuts import render,HttpResponse
def index(request):
return HttpResponse("ok")
以默認端口啟動項目,打開瀏覽器輸入地址http://127.0.0.1:8000/index/
我們既然可以在views.py生定義視圖函數,當然也可以直接在urls.py中定義視圖函數index
from django.shortcuts import render,HttpResponse
def index(request):
return HttpResponse("aaaaaa")
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/$',index),
]
重啟項目,刷新瀏覽器,可以看到
這樣也完成同樣的路由匹配.
除了上面的兩種路由定義方法,我們還可以使用include
方法來實現路由轉發功能.
from django.conf.urls import url,include
urlpatterns = [
url(r'^index/$',index),
url(r'^app01/',include("url_test1"))
]
在include
方法中,其參數表面是一個字符串,其實際是一個文件路徑.
按照上面定義的方式,在app01這個應用目錄下創建url_test1文件
url_test1文件內容如下
from django.conf.urls import url,include
urlpatterns = [
url(r'^index/$',index),
]
為什么使用include
方法也可以生成url,使用路由轉發的功能呢?
打開include
方法,可以看到
def include(arg, namespace=None, app_name=None):
... # 此處省略
if isinstance(urlconf_module, six.string_types):
urlconf_module = import_module(urlconf_module)
patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
app_name = getattr(urlconf_module, 'app_name', app_name)
if namespace and not app_name:
warnings.warn(
'Specifying a namespace in django.conf.urls.include() without '
'providing an app_name is deprecated. Set the app_name attribute '
'in the included module, or pass a 2-tuple containing the list of '
'patterns and app_name instead.',
RemovedInDjango20Warning, stacklevel=2
)
namespace = namespace or app_name
... # 此處省略
return (urlconf_module, app_name, namespace)
`include方法執行完成以后,返回的數據是一個元組類型.
既然include
方法返回的數據類型是元組類型,那么在app01應用目錄下的url_test1.py中,也可以直接以元組的方式取代include方法.
from django.conf.urls import url
from django.shortcuts import HttpResponse
def index(request):
return HttpResponse("bbbbbb")
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^index/$',index),
]
重啟項目,瀏覽器地址更改為http://127.0.0.1:8000/app01/index/
在include
方法中,返回的元組有三個元素,第一個元素是urlconf_module
在include
方法中,有一個判斷方法
if isinstance(urlconf_module, six.string_types):
urlconf_module = import_module(urlconf_module)
patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
app_name = getattr(urlconf_module, 'app_name', app_name)
由此可以知道如果urlconf_module
是字符串類型,就以字符串方式導入了urlconf_module
模塊.
導入模塊后,從模塊中獲取urlpatterns
,如果沒有urlpatterns
就使用默認值urlconf_module
所以include
方法返回的數據第一個元素就是urls.py中include
方法的參數.
而使用include
方法進行路由分發時,被分發的路由中也會有urlpatterns
所以進行路由分發時,urls.py文件也可以寫成下面的樣子
urlpatterns = [
url(r'^app01/',(url_test1,"test1","test2")),
]
在app01目錄的url_test1文件內容如下
from django.conf.urls import url
from django.shortcuts import HttpResponse
def index(request):
return HttpResponse("cccccc")
urlpatterns = [
url(r'^index/$',index),
]
重啟項目,刷新瀏覽器
在這里url_test1做為元組的一個元素,其可以是模塊名,也可以是列表
可以用url_test1文件中的urlpatterns替換urls.py文件中的url_test1,這樣一來項目的urls.py內容就跟下面的代碼一樣了
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
from app01 import url_test1
from django.shortcuts import render,HttpResponse
def index(request):
return HttpResponse("aaaaaa")
urlpatterns = [
# url(r'^admin/', admin.site.urls),
# url(r'^index/$',index),
# url(r'^app01/',include("app01.url_test1")),
url(r'^app01/',([
url(r'index/',index),
],"test1","test2")),
]
重啟項目,刷新瀏覽器,可以看到
可以看到,項目已經可以成功運行起來了
按照上面的步驟,一個項目的url可以再次進行分發
urlpatterns = [
url(r'^app01/',([
url(r'index1/',([
url(r'index2/',index),
],"test3","test4")),
],"test1","test2")),
]
重啟項目,瀏覽器打開http://127.0.0.1:8000/app01/index1/index2/index
現在有了index視圖函數,當然也可以有其他的視圖函數
urlpatterns = [
url(r'^app01/',([
url(r'index1/',([
url(r'index2/',index),
url(r'index2/add',index),
url(r'index2/(\d+)/delete',index),
url(r'index2/(\d+)/change',index),
],"test3","test4")),
],"test1","test2")),
]
這就是在Django后台進行數據表管理時使用的增刪查改的urlr的生成方式
/userinfo/
/userinfo/add
/userinfo/(\d+)/delete
/userinfo/(\d+)/change
再把上面urlpatterns中的url改變一下
urlpatterns = [
url(r'^admin/',([
url(r'app01/',([
url(r'userinfo/',index),
url(r'userinfo/add',index),
url(r'userinfo/(\d+)/delete',index),
url(r'userinfo/(\d+)/change',index),
],"test3","test4")),
],"test1","test2")),
]
把上面的url組合在一起,,就變成完完全全的Django后台進行數據表管理時使用的增刪查改的url了.