高級視圖和url配置python
1、URLconf技巧
正則表達式
一、流線型化函數導入算法
對於配置url,咱們可使用如下幾種方式:django
(1)引入view中的函數app
from firstSite.view import current_datetime,hour_ahead from django.conf.urls import url,include,patterns
urlpatterns = patterns('', (r'^time/$',current_datetime), (r'^time/plus/(\d{1,2})/$',hour_ahead), )
(2)引入view文件:函數
from django.conf.urls import url,include,patterns from firstSite import view urlpatterns = patterns('', (r'^time/$',view.current_datetime), (r'^time/plus/(\d{1,2})/$',view.hour_ahead), )
二、url嵌套url
若是咱們引入了多個app下名爲views.py的多個文件,以函數引入太麻煩以文件引入又不方便,這種狀況下咱們可使用"include"來分紅根url文件和各個app的子url文件;spa
使用咱們以前的例子,名爲firstSite的文件下有兩個分別名爲books和contact的app,則咱們的根URL能夠爲這樣:(注意:沒有「$」終止符,否則的話不會讀取到子urls文件)debug
from django.conf.urls import url,include,patterns from firstSite import view urlpatterns = [ url(r'^information/$',view.info), url(r'^time/$',view.currentTime), url(r'^time/plus/(\d{1,2})$',view.hour_ahead), url(r'^current_time/$',view.current_datetime), url(r'^meta/$',view.display_meta), url(r'^books/',include('books.urls')), #引入books的urls.py url(r'^contact/',include('contact.urls')), #引入Contact的url.py ]
兩個子urls文件:調試
#books.urls.py # -*- coding:utf-8 -*- from django.conf.urls import url from django.contrib import admin from . import views urlpatterns = [ url(r'^admin/', admin.site.urls), #url(r'^operation$',views.addData), url(r'^operation/plus/(\w{2,6})$',views.delete_data), url(r'^all$',views.all_data), url(r'^search/$',views.search), ] #contact.urls.py # -*- coding:utf-8 -*- from contact import views from django.conf.urls import url urlpatterns = [ url(r'^contact/$',views.contact), ]
配置完成以後,訪問是隻要加上父url裏的域名和子url裏的域名就能夠了:如:127.0.0.1:60500/contact/contact
三、調試模式中的特例
在Django調試模式下能夠修改URLconf,咱們只要在運行時檢查DEBUG配置項的值
例如:
from django.conf import settings from django.conf.urls import url,patterns from . import view urlpatterns = patterns('', (r'^$',view.homePage), (r'^time/$',view.current_datetime), ) if settings.DEBUG: urlpatterns += patterns('', (r'^debuginfo$',view.debuginfo), )
——>
或者使用partterns列表:
from django.conf import settings from django.conf.urls import url,patterns from . import view urlpatterns = [ url(r'^information/$',view.info), url(r'^time/$',view.currentTime), ] if settings.DEBUG: urlpatterns .append(url(r'^debuginfo/$',view.debuginfo),)
四、使用命名組
以前的例子中咱們都使用的無命名的正則表達式組,接下來咱們來使用命名正則表達式組來捕獲url,並將其做爲關鍵字參數傳送給視圖,在python正則表達式中,命名的正則表達式組的語法是(?P<name>pattern),其中name是組的名字 而pattern是匹配的某個模式,
from django.conf.urls import url #導入 django.conf.urls 模塊下的url類 #from . import view #綁定 URL 與視圖函數(view.py文件) from django.contrib import admin from firstSite.view import current_datetime,hour_ahead admin.autodiscover() from django.conf.urls import url,include,patterns from firstSite import view urlpatterns = [ url(r'^time/plus/(\d{1,2})$',view.hour_ahead),#url(r'^time/plus/(?P<offset>\d{1,2})$',view.hour_ahead), url(r'^ago/(\d{2})/(\d{2})$',view.Month_archive)#url(r'^ago/(?P<year>\d{2})/(?P<month>\d{2})/$',view.Month_archive), ]
這兩種方式第一種就是使用無名組的URLconf,第二種就是使用命名組的URLconf;他們的做用是同樣的,惟一的差異就是:第二種取得值是以關鍵字參數 的方式而不是以位置參數的方式傳遞給視圖函數;
函數的調用則爲:
Month_archive(request,'2017','03')
Month_archive(request,year='2017',month='03')
使用命名組的好處:
(1)使你的URLconf顯得更加清晰,減小搞混參數次序的潛在的bug
(2)在函數定義中對參數進行從新排序
(3)可讀性強
五、理解匹配/分組算法
(1)若是有任何命名組,Django會自動忽略非命名組使用命名組;
(2)不然,Django會把全部非命名組以位置參數的形式傳遞;
(3)在以上兩種狀況,Django同時會以關鍵字參數的方式傳遞一些額外參數;
六、傳遞額外的參數到視圖函數中
當咱們的視圖函數被複用只有少數部分不一樣,如須要使用不一樣的模板,