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同时会以关键字参数的方式传递一些额外参数;

六、传递额外的参数到视图函数中

当咱们的视图函数被复用只有少数部分不一样,如须要使用不一样的模板,

相关文章
相关标签/搜索