django URL常用配置方法

1:直接导入视图函数
    from django.conf.urls.defaults import *
    from mysite.views import hello
    urlpatterns = patterns('',
        (r'^hello/$', hello),
        (r'^time/$', time),
    )
2:导入包函模块名和函数的客串,而不是函数本身
    from django.conf.urls.defaults import *
    from mysite import views
    urlpatterns = patterns('',
        (r'^hello/$', 'views.hello'),
        (r'^time/$', 'views.time'),
    )
3:不用导入任何视图内容,写清楚字符串描述
    from django.conf.urls.defaults import *
    urlpatterns = patterns('',
        (r'^hello/$', 'mysite.views.hello'),
        (r'^time/$', 'mysite.views.time'),
    )
4:提取一个公共视图前缀
    from django.conf.urls.defaults import *
    urlpatterns = patterns('mysite.views',
        (r'^hello/$', 'hello'),
        (r'^time/$', 'time'),
    )
5:partterns()返回对对象的相加
    旧:
    from django.conf.urls.defaults import *
    urlpatterns = patterns('mysite.view',
        (r'^hello/$', 'hello'),
        (r'^time/$', 'time'),
        (r'^other/$', 'mysite.others.other'),
    )
    新:
    from django.conf.urls.defaults import *
    urlpatterns = patterns('mysite.view',
        (r'^hello/$', 'hello'),
        (r'^time/$', 'time'),
    )
    urlpatterns += patterns('mysite.others',
        (r'^other/$', 'other'),
    )
6:到目前为止,在所有URLconf例子中,我们使用的很简单,即“无命名”正则表达式组,在我们
想要捕获的URL部分加上小括号,django会将捕获的文本作为位置参数传递给视图函数。在更
高级的用法中,还可以使用“命名”正则表达式组来捕获URL,并且将其作为“关键字”参数 传给视图。

    在python正则表达式中,命名的正则表达式组的语法是(?ppattern),这里name是组的名字,而pattern是匹配的某个模式。

    下面是一个使用无名组的URLconf的例子:
    from django.conf.urls.defaults import *
    from mysite import views
    urlpatterns = patterns('',
        (r'^arcticles/(\d{4})/$',views.year_archive),
        (r'^arcticles/(\d{4})/(\d{2})/$', view.moth_archive),
    )
    下面是相同的URLconf,使用命名组进行了重写:
    from django.conf.urls.defaults import *
    from mysite import views
    urlpatterns = patterns('',
        (r'^arcticles/(?P\d{4})/$', veiws.year_archive),
        (r'^arcticles/(?P\d{4})/(?P\d{2})/$', veiws.month_archive),
    )
    如果不带命名组,请求/arcticle/2006/03/将会等于这样的函数调用:
    month_archive(request, '2006', '03')
    而带命名组,同样的请求就是这样的函数调用:
    month_archive(request, year='2006', month='03')
    从中可以看出,使用命名组可以让你的URLconf更加清晰,减少参数次序可能搞混潜在的Bug,
    还可以让你的定义中对参数重新排序。

7:视图冗余:
    # urls.py

    from django.conf.urls.defaults import *
    from mysite import views

    urlpatterns = patterns('',
        (r'^(foo)/$', views.foobar_view),
        (r'^(bar)/$', views.foobar_view),
    )

    # views.py

    from django.shortcuts import render_to_response
    from mysite.models import MyModel

    def foobar_view(request, url):
        m_list = MyModel.objects.filter(is_new=True)
        if url == 'foo':
        template_name = 'template1.html'
        elif url == 'bar':
        template_name = 'template2.html'
        return render_to_response(template_name, {'m_list': m_list})
利用上面的方法可以减少视图冗余
8:为url里传入固定的参数:
        # urls.py

        from django.conf.urls.defaults import *
        from mysite import views

        urlpatterns = patterns('',
            (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
            (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
        )

        # views.py

        from django.shortcuts import render_to_response
        from mysite.models import MyModel

        def foobar_view(request, template_name):
            m_list = MyModel.objects.filter(is_new=True)
            return render_to_response(template_name, {'m_list': m_list})
    一些URL参数详解:
    /mydata/jan/01/
    /mydata/jan/02/
    /mydata/jan/03/
    以上为三个url我们可以用不同的方式实现
        1: (r'^mydata/(/w{3})/(/d/d)', views.mydata)                        mydata(request, 'jan', '01')
        2:  (r'^mydata/(?P/w{3})/(?P/d/d)', view.mydata)         mydata(request, month='jan', day='01')
        3:  (r'^mydata/birthday/$', views.mydata, {month:'jan', day:'01'})   mydata(request, month='jan', day='01')
9:include导入:
    from django.conf.urls.defaults import *
    urlpatterns = patterns('',
        (r'^weblog/', include('mysite.blog.urls')),
        (r'^photos/', include('mysite.photos.urls')),
        (r'^about/$', 'mysite.views.about'),
    )
10:实例:
    验证用户是否登录:
        以下是三个视图
        def my_view1(request):
        if not request.user.is_authenticated():
        return HttpResponseRedirect('/accounts/login/')
        # ...
        return render_to_response('template1.html')

    def my_view2(request):
        if not request.user.is_authenticated():
        return HttpResponseRedirect('/accounts/login/')
        # ...
        return render_to_response('template2.html')

    def my_view3(request):
        if not request.user.is_authenticated():
        return HttpResponseRedirect('/accounts/login/')
        # ...
        return render_to_response('template3.html')
    以下是对视图进行包装:
    def requires_login(view):
        def new_view(request, *args, **kwargs):
        if not request.user.is_authenticated():                        #如果用户没有登录,跳转到登录界面
            return HttpResponseRedirect('/accounts/login/')
        return view(request, *args, **kwargs)                          #否则返回传进来的方法
        return new_view                                                    #返回new_view值:登录视图或者是传进来的视图
    以下为URL配置:
    from django.conf.urls.defaults import *
    from mysite.views import requires_login, my_view1, my_view2, my_view3

    urlpatterns = patterns('',
        (r'^view1/$', requires_login(my_view1)),
        (r'^view2/$', requires_login(my_view2)),
        (r'^view3/$', requires_login(my_view3)),
    )

你可能感兴趣的:(Django)