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

之前:

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

现在:不用再导入模块

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

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

如:

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

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

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

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

  1. from django.conf.urls.defaults import *
  2.  
  3. urlpatterns = patterns('mysite.views',
  4. (r'^hello/$', 'hello'),
  5. (r'^time/$', 'current_datetime'),
  6. (r'^time/plus/(\d{1,2})/$', 'hours_ahead'),
  7. )
  8.  
  9. urlpatterns += patterns('weblog.views',
  10. (r'^tag/(\w+)/$', 'tag'),
  11. )

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

4、调试模式中的特例

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

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里面的每一个模式都可以包含第三个数据: 一个关键字参数的字典:

  1. # urls.py
  2.  
  3. from django.conf.urls.defaults import *
  4. from 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. from django.shortcuts import render_to_response
  14. from 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})

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

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

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

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

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

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

  1. # views.py
  2.  
  3. from django.http import Http404, HttpResponseRedirect
  4. from django.shortcuts import render_to_response
  5.  
  6. def method_splitter(request, GET=None, POST=None):
  7. if request.method == 'GET' and GET is not None:
  8. return GET(request)
  9. elif request.method == 'POST' and POST is not None:
  10. return POST(request)
  11. raise Http404
  12.  
  13. def some_page_get(request):
  14. assert request.method == 'GET'
  15. do_something_for_get()
  16. return render_to_response('page.html')
  17.  
  18. def some_page_post(request):
  19. assert request.method == 'POST'
  20. do_something_for_post()
  21. return HttpResponseRedirect('/someurl/')
  22.  
  23. # urls.py
  24.  
  25. from django.conf.urls.defaults import *
  26. from mysite import views
  27.  
  28. urlpatterns = patterns('',
  29. # ...
  30. (r'^somepage/$', views.method_splitter, {'GET': views.some_page_get, 'POST': views.some_page_post}),
  31. # ...
  32. )

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

  1. def method_splitter(request, *args, **kwargs):
  2. get_view = kwargs.pop('GET', None)
  3. post_view = kwargs.pop('POST', None)
  4. if request.method == 'GET' and get_view is not None:
  5. return get_view(request, *args, **kwargs)
  6. elif request.method == 'POST' and post_view is not None:
  7. return post_view(request, *args, **kwargs)
  8. raise Http404
    9、对视图函数进行包装
    #views.py
  1. def requires_login(view):
  2. def new_view(request, *args, **kwargs):
  3. if not request.user.is_authenticated():
  4. return HttpResponseRedirect('/accounts/login/')
  5. return view(request, *args, **kwargs)
  6. return new_view
  7.  
  8. #urls.py
  1. from django.conf.urls.defaults import *
  2. from mysite.views import requires_login, my_view1, my_view2, my_view3
  3.  
  4. urlpatterns = patterns('',
  5. (r'^view1/$', requires_login(my_view1)),
  6. (r'^view2/$', requires_login(my_view2)),
  7. (r'^view3/$', requires_login(my_view3)),
  8. )
  9.  
  10. 10、包含其他urlconf,使用include(),例子中的指向 include() 的正则表达式并  包含一个 $ (字符串结尾匹配符),但是包含了一个斜杆。 每当Django遇到 include() 时,它将截断匹配的URL,并把剩余的字符串发往包含的URLconf作进一步处理。
  1. url(r'^student/', include('studentInfo.urls')),

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

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

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

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

  1. # urls.py
  2.  
  3. from django.conf.urls.defaults import *
  4.  
  5. urlpatterns = patterns('',
  6. (r'^blog/', include('inner'), {'blogid': }),
  7. )
  8.  
  9. # inner.py
  10.  
  11. from django.conf.urls.defaults import *
  12.  
  13. urlpatterns = patterns('',
  14. (r'^archive/$', 'mysite.views.archive'),
  15. (r'^about/$', 'mysite.views.about'),
  16. (r'^rss/$', 'mysite.views.rss'),
  17. )

和下面的效果相同

  1. # urls.py
  2.  
  3. from django.conf.urls.defaults import *
  4.  
  5. urlpatterns = patterns('',
  6. (r'^blog/', include('inner')),
  7. )
  8.  
  9. # inner.py
  10.  
  11. from django.conf.urls.defaults import *
  12.  
  13. urlpatterns = patterns('',
  14. (r'^archive/$', 'mysite.views.archive', {'blogid': }),
  15. (r'^about/$', 'mysite.views.about', {'blogid': }),
  16. (r'^rss/$', 'mysite.views.rss', {'blogid': }),
  17. )
  1.  
  1.  
  1.  
  1.  

django1.8高级视图和URL配置读书笔记的更多相关文章

  1. Django笔记 —— 高级视图和URL配置

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  2. django-高级视图和url配置

    高级视图和url配置 一.URLconf技巧 1.流线型化函数导入 对于配置url,我们可以使用以下几种方式: (1)引入view中的函数 from firstSite.view import cur ...

  3. 视图和URL配置

    视图和URL配置 实验简介 上一章里我们介绍了如何创建一个Django项目并启动Django的开发服务器.本章你将学到用Django创建动态网页的基本知识. 同时,也教会大家怎么在本地机器上建立一个独 ...

  4. 视图的URL配置,找不到我设置的第一个Page

    问题:视图的URL配置,找不到我设置的第一个Page 我的代码如下: 结果访问/test/时说找不到这个page   原因:patterns方法的参数有两个,一个是prefix,一个是参数元祖,详见下 ...

  5. Django学习day4——视图和URL配置

    创建一个简单的hello world 在day3中我们第一次运行了服务器,里面是一个django的欢迎页面,那是因为我们没有配置URL和视图,django在底层会自动跳转这个页面上 我们在mysite ...

  6. 测试开发之Django——No8.Django中的视图与URL配置

    在Django中,页面内容是靠views function(视图函数)来产生,URL定义在URLconf中. 这是一个纯净项目的url配置文件,他存在的目录,是与setting文件在同一个目录中. u ...

  7. Django之视图和URL配置

    1.在创建项目时,Django会自动创建URL配置,在urls.py文件中 文件的默认内容如下所示: """mysite URL Configuration The ur ...

  8. Django框架1——视图和URL配置

    三个命令 1.创建一个django项目 在cmd中:django-admin.py startproject project_name D:\python\django_site>django- ...

  9. 【二】Django 视图和url配置

    在新建的Django项目下,新建一个views的python文件,编辑如下代码 from django.http import HttpResponse def hello(request): ret ...

随机推荐

  1. [mysql] C++操作mysql方法总结(1)

    From: http://www.cnblogs.com/magicsoar/p/3817518.html C++通过mysql的c api和通过mysql的Connector C++ 1.1.3操作 ...

  2. [NPM] Use npx to run commands with different Node.js versions

    We will use npx to run a package using different versions of Node.js. This can become valuable when ...

  3. python input 与raw_input函数的区别

    转自:http://blog.csdn.net/sruru/article/details/7790436 以前没有深入考虑过raw_input与input函数的区别,所以一直比较困惑,今天测试之后, ...

  4. 使用Git下载Hadoop的到本地Eclipse开发环境

    使用Git下载Hadoop的到本地Eclipse开发环境 博客分类: Hadoop *n*x MacBook Air hadoopgitmaveneclipsejava  问题场景 按照官网http: ...

  5. 调整UIPickerView高度

    Advantages: Makes setFrame of UIPickerView behave like it should No transform code within your UIVie ...

  6. Druid register mbean error

    key: [com.alibaba.druid.stat.DruidDataSourceStatManager.addDataSource(DruidDataSourceStatManager.jav ...

  7. webservice系统学习笔记8-简单的权限校验

    服务端handler.java package com.ws01; import java.util.Set; import javax.xml.namespace.QName; import jav ...

  8. 不止是动态化:Weex项目和阿里无线技术开源方向

    这是开发者正在书写的峥嵘岁月.受益开源,回馈社区.阿里巴巴集团已经开源115个项目,并正式加入FSF基金会,Apache基金会,linux 基金会和Xen的顾问团队,并在云栖大会北京峰会宣布AliSQ ...

  9. AWK中的OFS的问题

    echo a b c d |awk '{OFS = ":";print $0}' 我的理解是应该把输出显示为如下的方式 a:b:c:d dan但执行的结果不是这样的 a b c d ...

  10. C#利用反射机制调用dll

    利用反射进行动态加载和调用. Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll Ass ...