django-高級視圖和url配置

高級視圖和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同時會以關鍵字參數的方式傳遞一些額外參數;

六、傳遞額外的參數到視圖函數中

當咱們的視圖函數被複用只有少數部分不一樣,如須要使用不一樣的模板,

相關文章
相關標籤/搜索