} } }

    Django进修笔记(10):URL的常用设备与技能

    添加时间:2013-5-14 点击量:

    一、师法资料



    Django材料少之又少,光荣有很多优良的教程,如:http://djangobook.py3k.cn/2.0/chapter08/;本文博取此中常识点,并加以总结和拓展。


    若是你也是个Django、Python爱好者,请参加【Django中国社区】或者【下方QQ群】吧


    二、Url常用设备办法



    看这篇文章的总结吧!



    Django零散常识(1):浅近地解读url




    1、有些小题目:

    比如说,我的项目里面有两个app,在url中都如许导入:



    1  login.views import 
    
    2 demo.views import


    正好,在一个url中,我应用了一个视图函数叫做demo1,当然我可以如许写:



    1 .........
    
    2 urlpatterns +=patterns(
    3 (r^demo1/¥,demo1),
    4


    固然简洁,然则里面隐蔽着BUG,比如说,两个views中都有一个同名的视图函数,如demo1,如下:



    1 login.views:
    
    2 def demo1(request):
    3 return HttpResponse(I am a login.views.demo1



    1 demo.views:
    
    2 def demo1(request):
    3 return HttpResponse(I am demo.views.demo1


    那么该调用哪一个呢,事实是如许的,因为Url从上倒下,雷同的项目组会被后者覆盖掉,所以它只调用最后面的视图函数,也便是: demo.views import
    总结:


    这个例子告诉我们:对于多个app下的视图函数,尽量包管不要重名,或者传入一个包含模块名和函数名的字符串情势,或传入模块名.函数名的情势显式界定。


    2、应用定名组


    这里须要弄清楚三点:
    (1)、关键字参数和地位参数
    (2)、语法布局
    (3)、匹配算法以及重视事项


    第一点DjangoBook说的很清楚,第二点,在 Python 正则表达式中,定名的正则表达式组的语法是(?P<name>pattern);这里 name 是组的名字,而 pattern 是匹配的某个模式。


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


    URLconf里面的每一个模式都可以包含第三个参数: 一个关键字参数的字典:



     1  urls.py
    
    2
    3 django.conf.urls.defaults import
    4 mysite import views
    5
    6 urlpatterns = patterns(
    7 (r^foo/¥, views.foobar_view, {template_name: template1.html}),
    8 (r^bar/¥, views.foobar_view, {template_name: template2.html}),
    9
    10
    11 views.py
    12
    13 django.shortcuts import render_to_response
    14 mysite.models import MyModel
    15
    16 def foobar_view(request, template_name):
    17 m_list = MyModel.objects.filter(is_new=True)
    18 return render_to_response(template_name, {m_list: m_list})


    4、捏造捕获到的URLconf值


    这个很灵活,让一个视图函数办多件事,其实也就是哄骗额外参数进行特定处理惩罚罢了,如下:



    1 urlpatterns +=patterns(
    2 (r^mydata/birthday/¥demo.views.mydata,{month:Janday:06}), My Birthday
    3 (r^mydata/(?P<month>\d{1,2})/(?P<day>\d{1,2})/¥demo.views.mydata), Other Date
    4



    1 def mydata(request,month,day):
    
    2 return HttpResponse(%s/%s %(month,day))


    5、捕获值与额外参数之间的优先级


    6、从URL中捕获的文本


    看上方实例中,可能回想怎么不是日期时候类型或整型而是应用%s呢,因为每一个被捕获的参数作为Python字符串来发送,而不管正则表达式中的格局,所以若是用的话,还要进行恰当处理惩罚才行。


    7、include()的工作道理及重视事项


    应用法度基于多个django站点,应当推敲到URLConfig包含【include】的体式格式来处理惩罚urls。



    1  django.conf.urls.defaults import  
    
    2 urlpatterns = patterns(
    3 (r^weblog/, include(mysite.blog.urls)),
    4 (r^photos/, include(mysite.photos.urls)),
    5 (r^about/¥mysite.views.about),
    6


    首要的处所:指向 include() 的正则表达式并不包含一个 ¥ (字符串结尾匹配符),然则包含了一个斜杆。每当 Django 碰到 include() 时,它将截断匹配的URL,并把【残剩】的字符串发往被包含的 URLconf 作进一步处理惩罚。 



    1 被包含的 URLconf mysite.blog.urls : 
    
    2 django.conf.urls.defaults import
    3 urlpatterns = patterns(
    4 (r^(\d\d\d\d)/¥mysite.blog.views.year_detail),
    5 (r^(\d\d\d\d)/(\d\d)/¥mysite.blog.views.month_detail),
    6


    当恳求:/weblog/2011/ 时,起首是 (r^weblog/, include(mysite.blog.urls))匹配/weblog/ , 因为应用include,正则停止匹配,并将 2011/发送到mysite.blog.urls中;


    (r^(\d\d\d\d)/¥, mysite.blog.views.year_detail) 可以匹配 2011/ ,于是将履行 mysite.blog.views.year_detail 视图,并传递参数 2011


    2. 捕获的参数如何和include()协同工作


    一个被包含的URLconf 接管任何来自parent URLconfs 的被捕获的参数,比如: 




     1  root urls.py 
    
    2 django.conf.urls.defaults import
    3
    4 urlpatterns = patterns(
    5 (r^(?P\w+)/blog/, include(foo.urls.blog)),
    6
    7
    8 foo/urls/blog.py
    9
    10 django.conf.urls.defaults import
    11
    12 urlpatterns = patterns(
    13 (r^¥foo.views.blog_index),
    14 (r^archive/¥foo.views.blog_archive),
    15






    在这个例子中,被捕获的 username 变量将传递给被包含的 URLconf,进而传递给那个




    URLconf 中的 每一个 视图函数。 




    重视,这个被捕获的参数 老是 传递到被包含的URLconf 中的 每一 行,不管那些行对应的




    视图是否须要这些参数。是以,这个技巧只有在你确切须要那个被传递的参数的时辰才显得




    有效。 



    3.
    额外的URLconf如何和include()协同工作


    类似的,你可以传递额外的 URLconf 选项到 include() , 就像你可以经由过程字典传递额外的URLconf 选项到通俗的视图。当你如许做的时辰,被包含 URLconf 的 每一 行都邑收那些额外的参数。 比如,下面的两个 URLconf 在功能上是相等的。



     1  urls.py 
    
    2 django.conf.urls.defaults import
    3
    4 urlpatterns = patterns(
    5 (r^blog/, include(inner), {blogid: 3}),
    6
    7
    8 inner.py
    9 django.conf.urls.defaults import
    10
    11 urlpatterns = patterns(
    12 (r^archive/¥mysite.views.archive),
    13 (r^about/¥mysite.views.about),
    14 (r^rss/¥mysite.views.rss),
    15
    16
    17
    18
    19 urls.py
    20 django.conf.urls.defaults import
    21
    22 urlpatterns = patterns(
    23 (r^blog/, include(inner)),
    24
    25
    26 inner.py
    27 django.conf.urls.defaults import
    28
    29 urlpatterns = patterns(
    30 (r^archive/¥mysite.views.archive, {blogid: 3}),
    31 (r^about/¥mysite.views.about, {blogid: 3}),
    32 (r^rss/¥mysite.views.rss, {blogid: 3}),
    33






    这个例子和前面关于被捕获的参数一样(在上一节就申明过这一点),额外的选项将 老是传递到被包含的 URLconf 中的 每一
    行,不管那一行对应的视图是否确切作为有效参数接这些选项,是以,这个技巧只有在你确切须要那个被传递的额外参数的时辰才显得有效。

    容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永
    分享到: