zoukankan      html  css  js  c++  java
  • django1.8高级视图和URL配置读书笔记

    一、在url配置中可以通过导入视图函数来将url模式和对应的函数对象进行映射,也可以通过字符串的形式进行映射。字符串包含应当是模块名、函数名的组合例如:

    之前:

    from mysite import views
    
    urlpatterns = patterns('',
        (r'^hello/$', views.hello),
        (r'^time/$', views.current_datetime),
        (r'^time/plus/(d{1,2})/$', views.hours_ahead),
    )

    现在:不用再导入模块

    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('',
        (r'^hello/$', 'mysite.views.hello'),
        (r'^time/$', 'mysite.views.current_datetime'),
        (r'^time/plus/(d{1,2})/$', 'mysite.views.hours_ahead'),
    )

    2、在同一个app中,url对应的处理函数前面可能是相同的,这是可能会需要重复的输入相同的字符串。比如上面的‘mysite.views’,我们可以将它提取出来,放到第一个字符串

    如:

    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('mysite.views',
        (r'^hello/$', 'hello'),
        (r'^time/$', 'current_datetime'),
        (r'^time/plus/(d{1,2})/$', 'hours_ahead'),
    )

    django系统会自动帮我们用‘.’将这两个字符串连接起来。

    注意:此时需要将包名、模块名、函数名都加上,才可以被搜索到。他会在系统环境设置的path变量中查找相应函数。

    3、如果使用字符串形式来表示响应函数的话,可能遇到不同的前缀,也有相应的办法,就是用多patterns前缀来处理。

    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('mysite.views',
        (r'^hello/$', 'hello'),
        (r'^time/$', 'current_datetime'),
        (r'^time/plus/(d{1,2})/$', 'hours_ahead'),
    )
    
    urlpatterns += patterns('weblog.views',
        (r'^tag/(w+)/$', 'tag'),
    )
    View Code

    pattens()函数返回的对象是可以相加的。

    4、调试模式中的特例

    from django.conf import settings
    if settings.DEBUG:
        urlpatterns += patterns('',
            (r'^debuginfo/$', views.debug),
        )

    5、使用命名组(?P<name>pattern) 

    例如:(r'^articles/(?P<year>d{4})/(?P<month>d{2})/$', views.month_archive),访问 /articles/2006/03/ 会在函数中

    month_archive(request, year='2006', month='03')

    6、理解匹配分组·算法

    • 如果有任何命名的组,Django会忽略非命名组而直接使用命名组
    • 否则,Django会把所有非命名组以位置参数的形式传递。
    • 在以上的两种情况,Django同时会以关键字参数的方式传递一些额外参数

    7、传递额外参数; URLconf里面的每一个模式都可以包含第三个数据: 一个关键字参数的字典:

    # 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})
    View Code

    这个例子中,URLconf指定了 template_name 。 而视图函数会把它当成另一个参数。

    技巧:可以通过关键字参数传递的方式伪造捕捉到的URLconf值

    urlpatterns = patterns('',
        (r'^mydata/birthday/$', views.my_view, {'month': 'jan', 'day': '06'}),
        (r'^mydata/(?P<month>w{3})/(?P<day>dd)/$', views.my_view),
    )

    注意:1.当关键字参数和捕捉值冲突时,关键字参数的优先级高。即会忽略掉捕捉值。

    2.捕捉到的参数信息都是字符串,因此需要使用其他数据类型,比如数字,需要将其转换成数字类型

    8、根据请求方法的不同(get、post)使用不同的处理方法。不一样的分配方法

    # views.py
    
    from django.http import Http404, HttpResponseRedirect
    from django.shortcuts import render_to_response
    
    def method_splitter(request, GET=None, POST=None):
        if request.method == 'GET' and GET is not None:
            return GET(request)
        elif request.method == 'POST' and POST is not None:
            return POST(request)
        raise Http404
    
    def some_page_get(request):
        assert request.method == 'GET'
        do_something_for_get()
        return render_to_response('page.html')
    
    def some_page_post(request):
        assert request.method == 'POST'
        do_something_for_post()
        return HttpResponseRedirect('/someurl/')
    
    # urls.py
    
    from django.conf.urls.defaults import *
    from mysite import views
    
    urlpatterns = patterns('',
        # ...
        (r'^somepage/$', views.method_splitter, {'GET': views.some_page_get, 'POST': views.some_page_post}),
        # ...
    )
    View Code

    注意:如果需要向处理函数传递一些参数,可以使用(*args,**kwargs)例如:

    def method_splitter(request, *args, **kwargs):
        get_view = kwargs.pop('GET', None)
        post_view = kwargs.pop('POST', None)
        if request.method == 'GET' and get_view is not None:
            return get_view(request, *args, **kwargs)
        elif request.method == 'POST' and post_view is not None:
            return post_view(request, *args, **kwargs)
        raise Http404
    9、对视图函数进行包装
    #views.py
    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


    #urls.py
    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)),
    )

    10、包含其他urlconf,使用include(),例子中的指向 include() 的正则表达式并  包含一个 $ (字符串结尾匹配符),但是包含了一个斜杆。 每当Django遇到 include() 时,它将截断匹配的URL,并把剩余的字符串发往包含的URLconf作进一步处理。
    url(r'^student/', include('studentInfo.urls')),

    11、向urlconf传递捕获参数,捕获的参数如何和include()协同工作

    # root urls.py
    
    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('',
        (r'^(?P<username>w+)/blog/', include('foo.urls.blog')),
    )
    
    # foo/urls/blog.py
    
    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('',
        (r'^$', 'foo.views.blog_index'),
        (r'^archive/$', 'foo.views.blog_archive'),
    )

    捕获的username传递给一个包含文件,此时他会将这个参数传递给包含文件里面的每个视图函数,

    12、可以向urlconf传递关键字参数

    # urls.py
    
    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('',
        (r'^blog/', include('inner'), {'blogid': 3}),
    )
    
    # inner.py
    
    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('',
        (r'^archive/$', 'mysite.views.archive'),
        (r'^about/$', 'mysite.views.about'),
        (r'^rss/$', 'mysite.views.rss'),
    )

    和下面的效果相同

    # urls.py
    
    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('',
        (r'^blog/', include('inner')),
    )
    
    # inner.py
    
    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('',
        (r'^archive/$', 'mysite.views.archive', {'blogid': 3}),
        (r'^about/$', 'mysite.views.about', {'blogid': 3}),
        (r'^rss/$', 'mysite.views.rss', {'blogid': 3}),
    )


     





  • 相关阅读:
    [Android Pro] 超能RecyclerView组件使用
    [Android Pro] UI设计师不可不知的安卓屏幕知识
    [Android Pro] Android Support 包里究竟有什么
    [Android Pro] fragment中嵌套viewpager,vierpager中有多个fragment,不显示
    [Android Pro] 横竖屏切换时,禁止activity重新创建,android:configChanges="keyboardHidden|orientation" 不起作用
    [Android Pro] sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别
    [Android Pro] AndroidStudio导出jar包
    [Java] Java 打包成jar包 和 解压jar包
    [Android Pro] 通过IMSI判断手机是移动、联通、电信
    [MACOS] Mac上的抓包工具Charles
  • 原文地址:https://www.cnblogs.com/zhaopengcheng/p/5442013.html
Copyright © 2011-2022 走看看