- 浏览: 63061 次
- 性别:
- 来自: 广东省惠州市
最新评论
-
wl6179:
很不一样的视角,谢谢yzjklove的解说!
Python学习笔记(实用技巧) -
wl6179:
貌似不错哦,如能上传一张效果图就完美了~
在Django中实现验证码 -
wl6179:
谢谢,受教了!
[Django学习]事务处理 -
fire01312:
这个不错!
如何根据已有数据自动产生Model
一、库文件导入问题
1. from django.conf.urls.defaults import *
from website.contact.views import contact, thanks
#这种方法导入不好,因为随着views数量的增多,在每次加入
#新的view函数时还得确认是否已经导入了这个函数。
#如果项目非常大 则管理起来非常困难。
#另外导入语句过长也影响了代码的美观程度。
urlpatterns = patterns('',
(r'^contact/$', contact),
(r'^thanks/$', thanks),
)
2. from django.conf.urls.defaults import *
#一种不需要导入函数的更好的写法
urlpatterns = patterns('website.contact.views',
#这种写法不需要导入view函数,django会自动导入需要的视图函数
#但是这里组要必须用字符串'contact’,而不是函数
(r'^contact/$', 'contact'),
(r'^thanks/$', 'thanks'),
)
#如果多个共通头,还可以这样
urlpatterns = patterns('website.contact.views',
(r'^contact/$', 'contact'),
(r'^thanks/$', 'thanks'),
)
#if xxx:#在这里加上条件判断还可以有选择的将app加入到web中。
urlpatterns += patterns('website.blog.views',
(r'^index/$', 'index'),
)
例如:
from django.conf import settings
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^$', views.homepage),
(r'^(\d{4})/([a-z]{3})/$', views.archive_month),
)
if settings.DEBUG:
urlpatterns += patterns('',
(r'^debuginfo/$', views.debug),
)
3. from website.contact.views import *
#* 表示,该模块的所有公共对象(public objects)都被导入到 当前的名称空间,
#也就是任何只要不是以”_”开始的东西都会被导入,views里面所有的代码,包括import的东
#西都会import的,所以这个方法是绝对不能用的。
urlpatterns = patterns('',
(r'^contact/$', contact),
(r'^thanks/$', thanks),
)
4.from website.contact import views
#推荐方法,这个更pyhtonic
#而且控制起来也方便。
from website.contact import views
urlpatterns = patterns('',
(r'^contact/$', views.contact),
(r'^thanks/$', views.thanks),
)
二、给views函数传递参数
1.传递参数的两种方法
1)Using Named Groups, non-named regular expression groups
也叫Keyword Arguments vs. Positional Arguments。位置参数和关键字参数
2)Passing Extra Options to View Functions(见本节2中的例子)
别名英语称呼:从正则表达式传递过来的参数Captured Values,从额外字典传递的参数Extra Options
2. 正则表达式可以用在URLconf中。
URLconf parameter可以起名字,也可以用位置参数传递给views函数。
这里的正则表达式没有啥特殊的,需要传递的参数用小括号括起来。有一点要注意,
定义参数名时用?P例如定义一月中的某一天 (?P<day>\d\d)
3.不把变量放在URL中
如下所述bar_view同foo_view处理内容是相同的,只是模板不同而已,下面例子中
变量不用放在网址中即可显示不同的参数。即网址r'^foo/$'的变动不会影响处理。
该方法在某些方面用起来非常方便,最好的例子应该是generic views system的应用了。
# 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})
3.字典参数传递的变量比正则表达式变量优先级高
例子:
urlpatterns = patterns('',
(r'^mydata/(?P<id>\d+)/$', views.my_view, {'id': 3}),
)
虽然请求url中值为22 ,http://127.0.0.1/mydata/22 但是传递的ID参数为3
三、URLPattern技巧
1.不要将URL逻辑处理放在Views中
URL是多变的,views的处理最好不要包含URL逻辑的处理。
不多说,看下面的例子:
urlpatterns = patterns('',
#...........
('^auth/user/add/$', views.user_add_stage),#1
('^([^/]+)/([^/]+)/add/$', views.add_stage),#2
#..........
显然,#2模式是包括#1的URL的,但是,这里/auth/user/add这个
网址需要特殊处理,如果是在views中处理应该是这样子的。显然
如果对应的URL变化了,views函数很快就不适应了。所以这样子不好。
def add_stage(request, app_label, model_name):
if app_label == 'auth' and model_name == 'user':
# do special-case code
else:
# do normal code
(r'^somepage/$', views.method_splitter, {'GET': views.some_page_get, 'POST': views.some_page_post}),
# ...
2.封装view函数
如下面代码,很冗余
def my_view1(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/accounts/login/')
# ...
return render_to_response('template1.html')
def my_view2(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/accounts/login/')
# ...
return render_to_response('template2.html')
def my_view3(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/accounts/login/')
# ...
return render_to_response('template3.html')
怎么样把他简化呢?看下面这个封装函数
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
经过封装后,代码可以极大的简化,URLPattern应该是这个样子
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)),
)
四、包含其他URLConfs
1.gotcha
用include的正则表达式,不能包含$来表示结尾,另外结尾必须有/
例如:"r^/http/" -OK "r^/http/$"NG
2.参数传递
如果被包含的urls接受了一个参数,那么他会传递给任意一个include里面
的views函数。
同样 Extra URLconf Options 也会传递下层被包含的每一个url中。
例子:下面的两个是等同的。
Set one:
# 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'),
)
##############################################################
Set two:
# 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}),
)
1. from django.conf.urls.defaults import *
from website.contact.views import contact, thanks
#这种方法导入不好,因为随着views数量的增多,在每次加入
#新的view函数时还得确认是否已经导入了这个函数。
#如果项目非常大 则管理起来非常困难。
#另外导入语句过长也影响了代码的美观程度。
urlpatterns = patterns('',
(r'^contact/$', contact),
(r'^thanks/$', thanks),
)
2. from django.conf.urls.defaults import *
#一种不需要导入函数的更好的写法
urlpatterns = patterns('website.contact.views',
#这种写法不需要导入view函数,django会自动导入需要的视图函数
#但是这里组要必须用字符串'contact’,而不是函数
(r'^contact/$', 'contact'),
(r'^thanks/$', 'thanks'),
)
#如果多个共通头,还可以这样
urlpatterns = patterns('website.contact.views',
(r'^contact/$', 'contact'),
(r'^thanks/$', 'thanks'),
)
#if xxx:#在这里加上条件判断还可以有选择的将app加入到web中。
urlpatterns += patterns('website.blog.views',
(r'^index/$', 'index'),
)
例如:
from django.conf import settings
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^$', views.homepage),
(r'^(\d{4})/([a-z]{3})/$', views.archive_month),
)
if settings.DEBUG:
urlpatterns += patterns('',
(r'^debuginfo/$', views.debug),
)
3. from website.contact.views import *
#* 表示,该模块的所有公共对象(public objects)都被导入到 当前的名称空间,
#也就是任何只要不是以”_”开始的东西都会被导入,views里面所有的代码,包括import的东
#西都会import的,所以这个方法是绝对不能用的。
urlpatterns = patterns('',
(r'^contact/$', contact),
(r'^thanks/$', thanks),
)
4.from website.contact import views
#推荐方法,这个更pyhtonic
#而且控制起来也方便。
from website.contact import views
urlpatterns = patterns('',
(r'^contact/$', views.contact),
(r'^thanks/$', views.thanks),
)
二、给views函数传递参数
1.传递参数的两种方法
1)Using Named Groups, non-named regular expression groups
也叫Keyword Arguments vs. Positional Arguments。位置参数和关键字参数
2)Passing Extra Options to View Functions(见本节2中的例子)
别名英语称呼:从正则表达式传递过来的参数Captured Values,从额外字典传递的参数Extra Options
2. 正则表达式可以用在URLconf中。
URLconf parameter可以起名字,也可以用位置参数传递给views函数。
这里的正则表达式没有啥特殊的,需要传递的参数用小括号括起来。有一点要注意,
定义参数名时用?P例如定义一月中的某一天 (?P<day>\d\d)
3.不把变量放在URL中
如下所述bar_view同foo_view处理内容是相同的,只是模板不同而已,下面例子中
变量不用放在网址中即可显示不同的参数。即网址r'^foo/$'的变动不会影响处理。
该方法在某些方面用起来非常方便,最好的例子应该是generic views system的应用了。
# 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})
3.字典参数传递的变量比正则表达式变量优先级高
例子:
urlpatterns = patterns('',
(r'^mydata/(?P<id>\d+)/$', views.my_view, {'id': 3}),
)
虽然请求url中值为22 ,http://127.0.0.1/mydata/22 但是传递的ID参数为3
三、URLPattern技巧
1.不要将URL逻辑处理放在Views中
URL是多变的,views的处理最好不要包含URL逻辑的处理。
不多说,看下面的例子:
urlpatterns = patterns('',
#...........
('^auth/user/add/$', views.user_add_stage),#1
('^([^/]+)/([^/]+)/add/$', views.add_stage),#2
#..........
显然,#2模式是包括#1的URL的,但是,这里/auth/user/add这个
网址需要特殊处理,如果是在views中处理应该是这样子的。显然
如果对应的URL变化了,views函数很快就不适应了。所以这样子不好。
def add_stage(request, app_label, model_name):
if app_label == 'auth' and model_name == 'user':
# do special-case code
else:
# do normal code
(r'^somepage/$', views.method_splitter, {'GET': views.some_page_get, 'POST': views.some_page_post}),
# ...
2.封装view函数
如下面代码,很冗余
def my_view1(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/accounts/login/')
# ...
return render_to_response('template1.html')
def my_view2(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/accounts/login/')
# ...
return render_to_response('template2.html')
def my_view3(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/accounts/login/')
# ...
return render_to_response('template3.html')
怎么样把他简化呢?看下面这个封装函数
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
经过封装后,代码可以极大的简化,URLPattern应该是这个样子
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)),
)
四、包含其他URLConfs
1.gotcha
用include的正则表达式,不能包含$来表示结尾,另外结尾必须有/
例如:"r^/http/" -OK "r^/http/$"NG
2.参数传递
如果被包含的urls接受了一个参数,那么他会传递给任意一个include里面
的views函数。
同样 Extra URLconf Options 也会传递下层被包含的每一个url中。
例子:下面的两个是等同的。
Set one:
# 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'),
)
##############################################################
Set two:
# 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}),
)
发表评论
-
Django: 初始化数据及安装时代码
2009-12-09 03:00 4780PS:The B-List是个很牛的Django博客,大量的技 ... -
Django的最佳系统结构
2009-12-09 02:58 1314Django也用了一段时间了 ... -
Python学习笔记 (常用模块)
2009-12-09 02:54 46041.os模块 os模块包装了不同操作系统的通用接口,使用户 ... -
将Django models 和views拆分程多个文件
2009-12-09 02:51 1594大多数Django教程都是将models放在models.py ... -
django中使用json做级联选择
2009-12-09 02:51 6102使用JSON代替XML做为数据传输是个不错的选择,下面我们看看 ... -
django中使用cursor.execute更新数据库问题?
2009-12-09 02:49 6844执行数据库删除,使用了django的cursor.execut ... -
基于django框架,模板中样式 图片 路径问题
2009-12-09 02:47 2964django 框架, 模板在templates中 ,样式和图片 ... -
如何根据已有数据自动产生Model
2009-12-09 02:45 1435今天在Google Talk上碰到mryanyi,他最近在将一 ... -
使用django的总结
2009-12-09 02:44 3348为大漫使用django进行开发已经有几个月了,总算没白白浪费时 ... -
django 数据库 API 参考
2009-12-09 02:43 1797一旦 数据模型 创建完毕, 自然会有存取数据的需要.本文档介绍 ... -
在Django中实现验证码
2009-12-09 02:42 3663在项目中用到验证码,懒得去找,自己随便写了一个: views ... -
python set 简单应用
2009-12-09 02:37 2632set也是python里一个重要类型,有时候还是蛮好用的。详细 ... -
Django强大的URL机制
2009-12-09 02:35 3756最近使用Django开发了大卫粘贴系统, 了解到了Django ... -
[Python学习]decorator的使用
2009-12-09 02:34 1810在我以前介绍 Python 2.4 特性的Blog中已经介绍过 ... -
[Django学习]事务处理
2009-12-09 02:34 3249[Django学习]事务处理 其实事务处理已经在 django ...
相关推荐
资源来自pypi官网。 资源全名:django-urlconf-export-1.0.0.tar.gz
1、基于Django+Django -Rest-Framework+Python的在线考试系统后端(源码).zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目...
Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目Django-商城项目...
django-vue-admin发布教程.docx
django-admin-bootstrap-master.zip
为支持django3对django_cas_ng进行修改 **Features** - Support CAS version 1.0, 2.0, 3.0 - Support Single Sign Out - Configuration of services via the django Admin application - Fine control on ...
资源分类:Python库 所属语言:Python 资源全名:Django-3.2.11-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Python在线考试系统后端-大学毕业设计-基于Django+Django -Rest-Framework 适合大学生计算机专业的毕业设计,课程设计。 Python在线考试系统后端-大学毕业设计-基于Django+Django -Rest-Framework 适合大学生...
Django14-1.4.14-1.sdl6.noarch.rpm Django14-1.4.14-1.sdl6.noarch.rpm
python库。 资源全名:django-database-views-0.1.2.tar.gz
Django学习笔记--阉割版
django-extra-views, 基于 Django的通用视图类非常棒,让我们来更多 django-extra-views-- Django的基于类的通用视图基于 Django 通用视图的类很好,它们让你可以在相对较少的代码行中完成大量的web应用程序设计模式...
资源来自pypi官网。 资源全名:django-extra-views-0.5.0.tar.gz
基于Django+Django -Rest-Framework+Python的在线考试系统后端(开发源码).zip基于Django+Django -Rest-Framework+Python的在线考试系统后端(开发源码).zip基于Django+Django -Rest-Framework+Python的在线考试...
资源分类:Python库 所属语言:Python 资源全名:django-admin-volt-0.0.5.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Python在线考试系统-大学毕业设计-基于Django+Django -Rest-Framework
资源来自pypi官网。 资源全名:Django-3.1.1-py3-none-any.whl
django-db-views 如何安装? pip install django-db-views 如何使用? 将django_db_views添加到INSTALLED_APPS 使用makeviewmigrations命令为视图模型创建迁移 如何在数据库中创建视图? 要使用DBView类创建视图...
django-cas-ng, Django ( 中央身份验证服务) 客户端 Django CAS django-cas-ng 是中央认证服务( CAS ) 客户端实现。 这里项目继承自 django-cas ( 自从 2013年04月 之后还没有更新过) 。 NG代表"下一代"。 我们的...
Daniel-Roy-Greenfeld-Audrey-Roy-Greenfeld-Two-Scoops-of-Django_-Best-Practices-for-Django-1.8-Two-Scoops-Press-2015.pdf 高清无水印版