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 ...
随机推荐
- Eclipse 创建文件快捷菜单、避免格式化时自动换行、.properties文件中文乱码、在线安装FreeMarker
创建文件快捷菜单设置 打开窗口“Customize Perspective - Java EE”,切换选项卡到“Shortcuts”: 进行一下配置: “Generate”:如上图勾选方式 " ...
- connect-proxy rpm文件的安装
1. rpm文件下载 http://rpm.pbone.net/index.php3?stat=3&search=connect-proxy&srodzaj=3 2. rpm的安装 h ...
- 机器视觉之 ICP算法和RANSAC算法
临时研究了下机器视觉两个基本算法的算法原理 ,可能有理解错误的地方,希望发现了告诉我一下 主要是了解思想,就不写具体的计算公式之类的了 (一) ICP算法(Iterative Closest Poin ...
- const char * 转换为char*
可以用const_cast const char* aa = "this is a const string."; char* bb = const_cast< ...
- 将War发布到Tomcat7上遇到的问题及其解决
用MyEclipse做了一个app,在其自带的Tomcat里运行正常,做成war后却出现如下错误: [ServletException in:/page/jsp/template/block.jsp] ...
- Java File 与 Bytes相互转换
public static byte[] fileToBytes(String filePath) { byte[] buffer = null; File file = new File(fileP ...
- 嵌入式Linux的web视频服务器的构建
http://blog.sina.com.cn/s/blog_53d02d550102v8bu.html随着嵌入式处理器和开源Linux 的广泛应用,各种视频服务在嵌入式系统中逐渐发展起来. 1.引言 ...
- How to Analyze Java Thread Dumps
When there is an obstacle, or when a Java based Web application is running much slower than expected ...
- C++ union使用注意
union在我们敲代码的时候的使用概率远远小于struct.所以我们常常不太关心她.就知道他是使用内存复用技术.同一个时刻,他仅仅能存在一个成员的值. C中,我们在union中能够包括struct的, ...
- html字符转义
常用表: No. 文字表記 10進表記 16進表記 文字 Comment 001 " " " """ quotation mark ...