一、在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配置读书笔记的更多相关文章

  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. python下载文件的三种方法

    Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件.此外Python还提供了另外一种方法 ...

  2. docker入门——构建镜像

    前面我们已经介绍了如何拉取已经构建好的带有定制内容的Docker镜像,那么如何构建自己的镜像呢? 构建Docker镜像有以下两种方法: 使用docker commit命令. 使用docker buil ...

  3. [ kvm ] 四种简单的网络模型

    1. 隔离模式:虚拟机之间组建网络,该模式无法与宿主机通信,无法与其他网络通信,相当于虚拟机只是连接到一台交换机上.    2. 路由模式:相当于虚拟机连接到一台路由器上,由路由器(物理网卡),统一转 ...

  4. 破解无线网络密码-BT3如何使用2

    本教程只作学习和交流使用,任何其它商用与本人无关, 在开始教程之前, 首先需要用到几个软件,感兴趣的朋友看完贴子后可以去百度搜一下下载地址, 虚拟机: VMware Workstation 6.5 正 ...

  5. iOS \U7ea2 乱码 转换

    通常网络请求的数据,如果不做处理在输出时显示是 \U 之类的编码的: 不需要导入别的类库解决方法 - (NSString *)replaceUnicode:(NSString *)unicodeStr ...

  6. wepy - 与原生有什么不同(事件更改)

    对于repeat,详情见官方文档 <style lang="less"> .userinfo { display: flex; flex-direction: colu ...

  7. ubuntu 下安装配置open-iscsi并自动挂载

    1.安装open-iscsi apt-get install open-iscsi 2.发现iscsi-target(ISCSI服务器IP:192.168.1.104) iscsiadm -m dis ...

  8. 实战c++中的vector系列--将迭代器转换为索引

    stl的迭代器非常方便 用于各种算法. 可是一想到vector.我们总是把他当做数组,总喜欢使用下标索引,而不是迭代器. 这里有个问题就是怎样把迭代器转换为索引: #include <vecto ...

  9. crontab 格式

  10. 获取List对象的泛型类(原创)

    群里一个伙计的需求,最后我提出了这种解决方案,不过他觉得多写俩括号增加了调用方的难度.还是先记下来吧,有时间看看还能不能再改造.   1.直接获取时获取不到的,类型被虚拟机擦除了2.利用子类实现父类的 ...