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'),
- )
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})
这个例子中,URLconf指定了 template_name 。 而视图函数会把它当成另一个参数。
技巧:可以通过关键字参数传递的方式伪造捕捉到的URLconf值
- urlpatterns = patterns('',
- (r'^mydata/birthday/$', views.my_view, {'month': 'jan', 'day': ''}),
- (r'^mydata/(?P<month>\w{3})/(?P<day>\d\d)/$', 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}),
- # ...
- )
注意:如果需要向处理函数传递一些参数,可以使用(*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': }),
- )
- # 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': }),
- (r'^about/$', 'mysite.views.about', {'blogid': }),
- (r'^rss/$', 'mysite.views.rss', {'blogid': }),
- )
django1.8高级视图和URL配置读书笔记的更多相关文章
- Django笔记 —— 高级视图和URL配置
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- django-高级视图和url配置
高级视图和url配置 一.URLconf技巧 1.流线型化函数导入 对于配置url,我们可以使用以下几种方式: (1)引入view中的函数 from firstSite.view import cur ...
- 视图和URL配置
视图和URL配置 实验简介 上一章里我们介绍了如何创建一个Django项目并启动Django的开发服务器.本章你将学到用Django创建动态网页的基本知识. 同时,也教会大家怎么在本地机器上建立一个独 ...
- 视图的URL配置,找不到我设置的第一个Page
问题:视图的URL配置,找不到我设置的第一个Page 我的代码如下: 结果访问/test/时说找不到这个page 原因:patterns方法的参数有两个,一个是prefix,一个是参数元祖,详见下 ...
- Django学习day4——视图和URL配置
创建一个简单的hello world 在day3中我们第一次运行了服务器,里面是一个django的欢迎页面,那是因为我们没有配置URL和视图,django在底层会自动跳转这个页面上 我们在mysite ...
- 测试开发之Django——No8.Django中的视图与URL配置
在Django中,页面内容是靠views function(视图函数)来产生,URL定义在URLconf中. 这是一个纯净项目的url配置文件,他存在的目录,是与setting文件在同一个目录中. u ...
- Django之视图和URL配置
1.在创建项目时,Django会自动创建URL配置,在urls.py文件中 文件的默认内容如下所示: """mysite URL Configuration The ur ...
- Django框架1——视图和URL配置
三个命令 1.创建一个django项目 在cmd中:django-admin.py startproject project_name D:\python\django_site>django- ...
- 【二】Django 视图和url配置
在新建的Django项目下,新建一个views的python文件,编辑如下代码 from django.http import HttpResponse def hello(request): ret ...
随机推荐
- [mysql] C++操作mysql方法总结(1)
From: http://www.cnblogs.com/magicsoar/p/3817518.html C++通过mysql的c api和通过mysql的Connector C++ 1.1.3操作 ...
- [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 ...
- python input 与raw_input函数的区别
转自:http://blog.csdn.net/sruru/article/details/7790436 以前没有深入考虑过raw_input与input函数的区别,所以一直比较困惑,今天测试之后, ...
- 使用Git下载Hadoop的到本地Eclipse开发环境
使用Git下载Hadoop的到本地Eclipse开发环境 博客分类: Hadoop *n*x MacBook Air hadoopgitmaveneclipsejava 问题场景 按照官网http: ...
- 调整UIPickerView高度
Advantages: Makes setFrame of UIPickerView behave like it should No transform code within your UIVie ...
- Druid register mbean error
key: [com.alibaba.druid.stat.DruidDataSourceStatManager.addDataSource(DruidDataSourceStatManager.jav ...
- webservice系统学习笔记8-简单的权限校验
服务端handler.java package com.ws01; import java.util.Set; import javax.xml.namespace.QName; import jav ...
- 不止是动态化:Weex项目和阿里无线技术开源方向
这是开发者正在书写的峥嵘岁月.受益开源,回馈社区.阿里巴巴集团已经开源115个项目,并正式加入FSF基金会,Apache基金会,linux 基金会和Xen的顾问团队,并在云栖大会北京峰会宣布AliSQ ...
- AWK中的OFS的问题
echo a b c d |awk '{OFS = ":";print $0}' 我的理解是应该把输出显示为如下的方式 a:b:c:d dan但执行的结果不是这样的 a b c d ...
- C#利用反射机制调用dll
利用反射进行动态加载和调用. Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll Ass ...