




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
URLURLconfURLconfDjangoPython流线型化(Streamlining)看下这个URLconf,fromdjango.conf.urls.defaultsimportfromdjango.conf.urls.defaultsimportfrommysite.views o,current_datetime,urlpatterns=patterns('', (r'^time/$',current_datetime),(r'^time/plus/(\d{1,2})/$',hours_ahead),)正如第三章中所解释的,在URLconf中的每一个但随着Django应用变得复杂,它的URLconf也在增长,并且这些导入可viewsURLconffromdjango.conf.urls.defaultsimportfromdjango.conf.urls.defaultsimport**frommysiteimporturlpatterns= o/$',**views. o**),(r'^time/$',**views.current_datetime**),(r'^time/plus/(d{1,2})/$',**views.hours_ahead**)Django还提供了 法可以在URLconf中为某个特别的模式指定视图fromdjango.conf.urls.defaultsimportfromdjango.conf.urls.defaultsimporturlpatterns= o/$',**'mysite.views. o'**),(r'^time/$',**'mysite.views.current_datetime'**),(r'^time/plus/(d{1,2})/$',**'mysite.views.hours_ahead'**)'mysite.views.current_datetime'mysite.views.current_datetime使用这个技术,就不必导入视图函数了;Django``\们可以把公共的前缀提取出来,作为第一个参数传给\``函数:SystemMessage:WARNING/2(<string>,line99);Inlinelilstart-stringwithoutend-fromdjango.conf.urls.defaultsimportfromdjango.conf.urls.defaultsimporturlpatterns=patterns(**'mysite.views'**, o/$',**' o'**),(r'^time/$',**'current_datetime'**),(r'^time/plus/(d{1,2})/$',**'hours_ahead'**)注意既不 号。Django如果你的视图函数存在于几个不同的Python模块的话,它可以使得更容易对视图函数进行包装(wrap)更Pythonic,就是说,更符合Python的传统,如把函数当成对象传递。URLconfURLconf少重复。只要增加多个patterns()对象,象这样:fromdjango.conf.urls.defaultsimportfromdjango.conf.urls.defaultsimporturlpatterns= o/$','mysite.views. (r'^time/$','mysite.views.current_datetime'),(r'^time/plus/(\d{1,2})/$','mysite.views.hours_ahead'),(r'^tag/(\w+)/$','weblog.views.tag'),)urlpatternsurlpatterns=patterns('mysite.views', o/$',' (r'^time/$','current_datetime'),(r'^time/plus/(\d{1,2})/$',)urlpatterns+=patterns('weblog.views',(r'^tag/(\w+)/$','tag'),)整个框架关注的是存在一个名为urlpatterns,patterns()返回的对象是可URLconfDEBUGfromdjango.confimportfromdjango.confimportfromdjango.conf.urls.defaultsimport*frommysiteimportviewsurlpatterns=patterns('',(r'^$',views.homepage),(r'^(\d{4})/([a-z]{3})/$',)ifurlpatterns+=patterns('',(r'^debuginfo/$',views.debug),)在这个例子中,URL/debuginfo/只在你的DEBUG配置为True时URLconfURL,Django会将捕获的文本作为位置参数传递给视图函数。在更高级的用法中,还可以使用命名正则表达式组来捕URL,并且将其作为关键字参数传给视图。defsell(item,defsell(item,print"Selling%sunit(s)of%sat%s"%ty,item,sell('Socks','$2.50',sell('Socks','$2.50',sell(item='Socks',sell(item='Socks',sell(item='Socks',ty=6,sell(price='$2.50',item='Socks',ty=6)sell(price='$2.50',ty=6,item='Socks')sell(ty=6,item='Socks',price='$2.50')sell(ty=6,price='$2.50',sell('Socks','$2.50', sell('Socks','$2.50', sell('Socks',price='$2.50', ty=6,在Python(?P<name>pattern)namepattern下面是一个使用无名组的URLconf的例子:fromfromdjango.conf.urls.defaultsimport*frommysiteimportviewsurlpatterns=patterns('',(r'^articles/(\d{4})/$',views.year_archive),(r'^articles/(\d{4})/(\d{2})/$',)下面是相同的URLconf,fromfromdjango.conf.urls.defaultsimport*frommysiteimportviewsurlpatterns=patterns('',(r'^articles/(?P<year>\d{4})/$',views.year_archive),)/articles/2006/03/month_archive(request,'2006',month_archive(request,'2006',month_archive(request,year='2006',month_archive(request,year='2006',URLconfsBUG,URL前面,而不使用命名组的话,我们就不得不去修改视当然,命名组的代价就是失去了简洁性:一些开发者觉得命名组的语法和显得冗余。命名组的另一个好处就是可读性强。URLconfURLURLconf否则,Django##fromdjango.conf.urls.defaultsimport*frommysiteimportviewsurlpatterns=patterns('',(r'^foo/$',views.foo_view),(r'^bar/$',)#fromdjango.shortcutsimportrender_to_responsefrommysite.modelsimportMyModeldefm_list=return te1.html',{'m_list':defdefm_list=return te2.html',{'m_list':##fromdjango.conf.urls.defaultsimport*frommysiteimportviewsurlpatterns=patterns('',(r'^(foo)/$',views.foobar_view),(r'^(bar)/$',)#fromdjango.shortcutsimportrender_to_responsefrommysite.modelsimportMyModeldeffoobar_view(request,m_list=MyModel.objects.filter(is_new=True)ifurl=='foo': te_name='tem elifurl=='bar': te_name= return te_name,{'m_list':这种解决方案的问题还是老缺点,就 的URL耦合进你的代码里面了。/foo//fooey/URLURLconf包含第三个数据:一个关键字参数的字典:##fromdjango.conf.urls.defaultsimport*frommysiteimportviewsurlpatterns=(r'^foo/$',views.foobar_view,{'tem (r'^bar/$',views.foobar_view,{'tem (r'^bar/$',views.foobar_view,{'tem )#fromdjango.shortcutsimportrender_to_responsefrommysite.modelsimportMyModeldeffoobar_view(request, m_list=return te_name,{'m_list':如你所见,这个例子中,URLconf指定了temte_name。而视图函数会把URLconf额外信息的一个好方法。正因如此,这技术已被很多Django的应用使用,其中以在第11章讨论的通用视图系统最为明显。URLURLconfURL例如,你可能有一个显示某一个特定日子的某些数据的应用,URL#...URLconf(使用命名组的方法urlpatterns=patterns('',(r'^mydata/(?P<month>\w{3})/(?P<day>\d\d)/$',urlpatterns=patterns('',(r'^mydata/(?P<month>\w{3})/(?P<day>\d\d)/$',views.my_view),)defdefmy_view(request,month,day):#用my_viewmonthdayURLURL,/mydata/birthday/URL/mydata/jan/06/URLconfurlpatterns=urlpatterns=(r'^mydata/birthday/$',views.my_view,{'month':'jan','day':(r'^mydata/(?P<month>\w{3})/(?P<day>\d\d)/$',)monthdayPythondefprinto,%s'defsay_goodbye(print'Goodbye,%s'%defdef_name,print'%s,%s'% URLconfDjango示一系列的Event对象,那个视图显示一系列的BlogEntry对象,并它##fromdjango.conf.urls.defaultsimport*frommysiteimportviewsurlpatterns=patterns('',(r'^events/$',views.event_list),(r'^blog/entries/$',)#fromdjango.shortcutsimportrender_to_responsefrommysite.modelsimportEvent,BlogEntrydefdefobj_list=defobj_list=return{'entry_list':##fromdjango.conf.urls.defaultsimport*frommysiteimportmodels,viewsurlpatterns=(r'^events/$',views.object_list,{'model':models.Event}),(r'^blog/entries/$',views.object_list,{'model':)#fromdjango.shortcutsimportrender_to_responsedefobject_list(request,model):obj_list= te_name='mysite/%s_list.html'%model.name.lower()returnrender_to_response(tem te_name,{'object_list':modelURLconfmodel.objects.all()(我们使用model.name.lower()Python一个name的这种情况下很有用。比如,BlogEntry'BlogEntry'
nameblogentry_listevent_list因为数据库驱动的都有一些通用的模式,Django提供了一个通用视图的集合使用它可以节省你的时间。会在下一章讲讲Django的内置通用视图。URLconfdefmy_view(request,tem defmy_view(request,tem var=do_something()return te_name,{'var':当出现的时候额外URLconf参数优先于捕捉值。也就是说如果URLconfURLconfURLconffromfromdjango.conf.urls.defaultsimport*frommysiteimportviewsurlpatterns=(r'^mydata/(?P<id>\d+)/$',views.my_view,{'id':)id(额外字典的)id(/mydata/2//mydata/432432/)都会作id设置为3URLid##fromdjango.conf.urls.defaultsimport*frommysiteimportviewsurlpatterns=patterns('',(r'^blog/$',views.page),(r'^blog/page(?P<num>\d+)/$',))#defpage(request,#Outputtheappropriatepageofblogentries,accordingtonum.#...page()num"1"page()num(``‘1’````1``为了保持一致,因为捕捉给``num``的值总是字符串。defmy_view(request,tem defmy_view(request,tem var=do_something()return te_name,{'var':URLURLconf位的线性处理方式。urlpatternsurlpatterns=patterns('',#...('^([^/]+)/([^/]+)/add/$',views.add_stage),#...)这将匹配像/myblog/entries/add/和/auth/groups/add/URL显示所有的表单域,它显示两个域等等。我们可以在视图中特别以defadd_stage(request,app_label,defadd_stage(request,app_label,ifapp_label=='auth'andmodel_name=='user':#dospecial-casecode#donormalURLURLconfurlpatternsurlpatterns=patterns('',#...('^auth/user/add/$',views.user_add_stage),('^([^/]+)/([^/]+)/add/$',views.add_stage),#...)/auth/user/add/的请求将会被user_add_stageURL()URL每个获的参数将被作为纯Python字符串来发送,而不管正则表达式中的格URLConf(r'^articles/(?P<year>\d{4})/$',(r'^articles/(?P<year>\d{4})/$',尽管\d{4}将只匹配整数的字符串,但是参数yearviews.year_archive()Python类型的对象。一个典型的的错误就是用字符串值而不是整数值来创建datetime.date对象:>>>import>>>import>>>datetime.date('1993','7','9')Traceback(mostrecentcalllast):TypeError:anintegeris>>>datetime.date(1993,7,datetime.date(1993,7,URLconf##fromdjango.conf.urls.defaultsimport*frommysiteimportviewsurlpatterns=patterns('',(r'^articles/(\d{4})/(\d{2})/(\d{2})/$',views.day_archive),)#views.pyimportdatetimedefday_archive(request,year,month,##ThefollowingstatementraisesaTypeError!date=datetime.date(year,month,day)因此,day_archive()defday_archive(request,year,month,defday_archive(request,year,month,date=datetime.date(int(year),int(month),注意,当你传递了一个并不完全包含数字的字符串时,int()URLconf参数或。它也不包括第一个斜杠,因为每个URL必定有一个斜杠。例如,在向http myapp/。在向http /myapp/?page=3的请求中,Django同样会去匹配myapp/。URLconf(POSTGETHEAD)被考虑这个URLconf/view设计:##fromdjango.conf.urls.defaultsimport*frommysiteimportviewsurlpatterns=patterns('',#...(r'^somepage/$',views.some_page),#...)#fromdjango.httpimportHttp404,HttpResponseRedirectfromdjango.shortcutsimportrender_to_responsedefifrequest.method=='POST':returnHttpResponseRedirect('/someurl/')elifrequest.method=='GET':returnrender_to_response('page.html')raise在这个示例中,``some_page()``视图函数对``POST``和``GET``求方法的处理完全不同。它们唯一的共同点是共个URL地址:个分开的视图函数——一个处理``POST````GET``帮我们改进前边那个简单的``some_page()``视图的:##fromdjango.httpimportHttp404,HttpResponseRedirectfromdjango.shortcutsimportrender_to_responsedefmethod_splitter(request,GET=None,POST=None):ifrequest.method=='GET'andGETisnotNone:returnelifrequest.method=='POST'andPOSTisnotNone:returnPOST(request)raisedefassertrequest.method=='GET'returndefassertrequest.method=='POST'returnHttpResponseRedirect('/someurl/')#urls.pyfromdjango.conf.urls.defaultsimport*frommysiteimportviewsurlpatterns=patterns('',#...(r'^somepage/$',views.method_splitter,views.some_page_get,views.some_page_get,'POST':views.some_page_post}),#...)``method_splitter()````request.method``返回的值来调用相应的视图。可以看到它带有两个关键参数,``GET``和``POST``**``request.method````GET``那它就会自动调用``GET``视图。如果``request.method``返回的是``POST``,那它调用的就是``POST``视图。如果``request.method``返回的是其它值(如:``HEAD``,或者是没有把``GET``或``POST``提交给此函数,那它就会抛出一个``Http404``错误。URLconf``/somepage/````method_splitter()``并把视图函数额外需要用到的``GET``和``POST``参数传递给它。最终,我们把``some_page()``视图分解到两个视图函数中``some_page_get()````some_page_post()``method_splitter()``(比如,``some_page_post()``调用的时候,我们可以确信``request.method````post``)当``request.method``defmethod_splitter(request,*args,**kwargs):get_view=kwargs.pop('GET',None)post_view=kwargs.pop('POST',None)ifrequest.method=='GET'andget_viewdefmethod_splitter(request,*args,**kwargs):get_view=kwargs.pop('GET',None)post_view=kwargs.pop('POST',None)ifrequest.method=='GET'andget_viewisnotNone:returnget_view(request,*args,**kwargs)elifrequest.method=='POST'andpost_viewisnotNone:returnpost_view(request,*args,**kwargs)raisemethod_splitter(),GETPOST持使用*args**kwargs(注意*Python参数前面加一个*号,所有传递给函数的参数将会保存为一个元组.如果你在函deffoo(*args,deffoo(*args,print"Positionalargumentsare:"printargsprint"Keywordargumentsare:"printkwargs>>>foo(1,2,>>>foo(1,2,Positionalarguments(1,2,Keywordarguments>>>foo(1,2,name=' ',framework='Django')Positionalargumentsare:(1,Keywordarguments{'framework':'Django','name': None,KeyError)python视图里重复了大量代码,就像这个例子:defdefifnotreturnHttpResponseRedirect('/accounts/login/')#...return defifnotreturnHttpResponseRedirect('/accounts/login/')#...return defifnotreturnHttpResponseRedirect('/accounts/login/')#...returnreturn request.user用户已经成功登陆站点否则就重定向/accounts/login/request.user,但是14章将要讲到它.就如你所想像的,request.user当前用户是登陆的还是)defdefdefnew_view(request,*args,ifnotreturnHttpResponseRedirect('/accounts/login/')returnview(request,*args,**kwargs)returnrequires_login,view,new_view.new_viewrequires_loginviewsifnotrequest.user.is_authenticated()URLconfrequires_loginfromdjango.conf.urls.defaultsimportfromdjango.conf.urls.defaultsimportfrommysite.viewsimportrequires_login,my_view1,my_view2,urlpatterns=(r'^view1/$',requires_login(my_view1)),(r'^view2/$',requires_login(my_view2)),(r'^view3/$',requires_login(my_view3)),)URLconfDjangoURLconf在任何时候,你的URLconf都可以包含其他URLconf模块。对于根 URLconffromdjango.conf.urls.defaultsimportfromdjango.conf.urls.defaultsimporturlpatterns=(r'^weblog/',include('mysite.blog.urls')),(r'^photos/',include('mysite.photos.urls')),(r'^about/$','mysite.views.about'),)URLconf,includeinclude()的正则表达式并不包含一个$(字符串结尾匹配符Djangoinclude()URLconfmysite.blog.urls:fromd
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 现场急救培训讲座
- 店铺人员培训课件
- 课题研究报告的内容
- 云南大学本科论文系统
- 酒店设计培训
- 指挥部流程建设标准化实施路径
- 幼儿园教师讲故事培训
- 泌尿外科护理要点与操作规范
- 铲车安全培训知识
- 胸外伤病人的护理
- 【语文】福建省厦门市演武小学小学二年级下册期末试题
- 工程项目移交交接单
- 2021-2022学年山东省东营市广饶县七年级(下)期末英语试卷(五四学制)(附答案详解)
- 卧式常压热水锅炉使用说明书
- (完整版)新人教版英语七年级下册单词听写表
- 酒店住宿水单模板2020
- 23J916-1:住宅排气道(一)
- 第十章开箱包检查课件
- 树兰中学拱墅校区2021分班考卷
- 物业公司权责手册市场拓展
- 小学生小升初中自荐信5篇
评论
0/150
提交评论