非理性繁荣

JSON,面向对象视图,启动一个真正的应用程序

6月22日2008。根据django蟒蛇

欢迎来到《被解放的姜戈》第三集,由威尔·拉尔森主持。金沙手机网就像我在第一部分,这里是以前与Django合作过的人可以收听的地方。我们会继续的杰森以及面向对象的视图,然后再启动一个真正的(如果很小的话)应用程序。

我们将使用一些代码django-webapp,这是我发现对webapp开发有用的代码和设计模式的集合。我提取了一些作为代码段,但你可能会发现,它最方便的只是抓取代码:

SVN结帐http://django-webapp.googlecode.com/svn/trunk/django webapp

杰森

上次我们只返回了一个原始数字,但是很容易返回更多的结构化数据。我们可以使用XML,但这是一种沉重而缓慢的(在某些实现中)编码。非官方的快速标准,轻量级的编码杰森,在python中生成非常简单。这是计算上次的函数,而是返回json。

dwa.serialize系列进口json响应DEF计算(请求人事处):进口操作人员操作=getattr(操作人员人事处=浮动(请求.得到(“A”b=浮动(请求.得到(“b”结果=操作(b返回json响应(双关语(人事处=人事处=b=b结果=操作(b)))

我更喜欢dict (abc = de)符号对于大多数双关语有多个项目的。它避免了引用键,通常用于关键字参数,我一般都很喜欢。但它和{“人事处”:op,a:},等。

dwa.serialize系列的一部分django-webapp同时也是片段801(哪些需要)代码段800)。和json响应只需执行JSON编码并将结果包装为httpresponse。(默认情况下,它用安全性的javascript注释包围结果;大多数JavaScript框架都可以处理这一点。)请注意,顶级对象必须是双关语(甚至不是数组)用于JSON。

但是有一个更简单的方法。Django支持“中间件”,它只是提供了一组连接到请求和响应过程的各个部分的钩子。我们可以拦截响应处理并在必要时对其进行json编码。这正是片段803做。(这是在django-webapp也一样。)要启用中间件,将此添加到设置.py

中间件类=('dwa.middleware.jsonEncodingMiddleware'最后一个!

那么你的观点就可以回归双关语S它们将被编码为JSON。

Ajax错误中间件

如果服务器在处理Ajax请求时出错,即使是可靠的火虫使得实际的错误很难看到。你可能想补充一下半自动或半自动,该补丁。我的中间件类看起来像:

中间件类=('dwa.middleware.ajaxerrormiddleware''dwa.middleware.jsonEncodingMiddleware'

记住要保持jsonEncoding中间件最后,这样它就可以首先了解您的视图返回的内容。

面向对象的观点

Django视图就是一个简单的可调用的得到一个HTT请求作为第一个参数。什么样的东西是合格的?

1.功能

DEFmy_view(请求* *关键字参数

2。

MyVIEW(YourView):DEF__call__(自己请求* *关键字参数):返回超级的(MyVIEW自己请求* *关键字参数

3.一个实例方法

MyResource公司(资源):DEF列表(自己请求):返回{“内容”列表(自己.查询集)}

也许还有更多我没想到的。不管怎样,django教程——包括本教程——通常从视图开始功能.有时查看是一种更先进的技术。我还没看到实例方法任何地方使用,但我发现它们非常有用,所以我要让他们在这里飞行。

举个小例子,让我们重写我们的小数学应用程序,使用面向对象的视图:

django.conf.urls.defaults进口网址handler404handler500dwa.serialize系列进口json响应数学API(对象):DEF执行操作(自己人事处b):进口操作人员操作=getattr(操作人员人事处返回操作(bDEF计算(自己请求人事处):=浮动(请求.得到(“A”b=浮动(请求.得到(“b”返回json响应(双关语(人事处=人事处=b=b结果=自己.执行操作(人事处b)))DEFURL_模式(自己):返回(网址(正则表达式=r ' ^计算/ P (?
         
          \ W+)/$'
         看法=自己.计算)]urlpattern=数学API().URL_模式()urlpattern.追加(网址(R′^ $'django.views.static.serve'双关语(文档根目录=“公共”路径='索引.html')))

一些观察:

1.我们清晰地分离了与此API配套的所有URL模式。对于一般的解决方案,我们可能要加上a前缀允许轻松更改API所在位置的参数。我们甚至可以子类化Django内部URL解析器,但这并不是为了方便扩展而设计的。

2。实际计算(执行操作)与它的Web界面分离(计算),所以您可以独立地对其中一个进行子类划分。举个愚蠢的例子:

htamapi公司(数学API):DEF执行操作(自己人事处b):返回超级的(htamapi公司自己.执行操作(人事处burlpattern=htamapi公司().URL_模式()

3.添加新功能很容易:

扩展的MathAPI(数学API):DEF得到常数(自己常量):如果常量=“π”返回三点一否则如果常量=“e”返回二点七DEF常数(自己请求常量):返回json响应(双关语(的名字=常量瓦尔=自己.得到常数(常量)))DEFURL_模式(自己):返回超级的(扩展的MathAPI自己.URL_模式()+(网址(r'^const/(?磷
         
          \W+)/
         自己.常数)]

真正的webapp

本系列的其余部分将致力于将这些思想充实为快速应用程序开发的有用技术。但说实话,我们应该做一些比简单数学更难、更有趣的事情。不可能是另一个博客,维基,或Reddit克隆…

所以我决定做一个最小版本的网络应用程序,我一直想建立一段时间。我爱上帝的话语因为它告诉我他是谁(他真的很好!)我是谁。我经常非正式地记住其中的一些部分,因为在很多情况下回忆起来都很有用。但我经常忘记一些话,或者通道所在的地方,所以我想要一些东西来帮助我复习。它应该是我可以在任何地方使用的工具,所以这个工具最好的实现就是穿孔卡片。好吧……HTML怎么样?CSS,javascript,DOM,DHTMLJSON,阿贾克斯姜戈,webapp流行语汤。

一提到上帝,很多人都很生气,不管观点如何。如果你觉得你有话要说,(a)在发帖前思考,和(b)发布我的博客,所以在威尔的博客上,重点仍然是姜戈。

我将在下一篇文章中详细介绍,但是我将通过下面显示我的整个服务器端接口代码(无数据库模型)来激励它:

django.conf.urls.defaults进口网址handler404handler500dwa.resource进口资源ResourceCollectiondwa.api进口阿贾沙皮dwa.util工具进口静态URLscripmem.models进口MemoryPassage活动日志项内存访问源(资源):网址=“段落”查询集=MemoryPassage.对象.全部的()DEF细节(自己请求OBJ):D=OBJ.就像你所说的()如果布尔(请求.得到.得到(“HTML”):D(“HTML”]=OBJ.通道.HTML返回DDEF列表项(自己OBJ):返回OBJ.就像你所说的()DEF列表查看日志(自己请求):通道=MemoryPassage.对象.从参考创建(请求.(“ref”返回自己.细节(请求通道DEFnext_view(自己请求):to_review=MemoryPassage.对象.订购人(“last_reviewed”)[]返回自己.细节(请求to_reviewDEFURL_模式(自己前缀=):url_prefix=前缀+自己.网址返回超级的(内存访问源自己.URL_模式(前缀+\(网址(^% s/下/ $ '%url_prefix自己.next_view)]ActivityLogResource(资源):网址=“日志”查询集=活动日志项.对象.全部的()斯克里普梅马皮(阿贾沙皮):@阿贾沙皮.出口DEF完整的(自己请求通道ID分数):通道=MemoryPassage.对象.得到(身份证件=通道ID活动日志项.对象.创造(通道=通道分数=int(分数返回{“状态”“好吧”}scripmem_collection=ResourceCollection((内存访问源ActivityLogResourceurlpattern=scripmem_collection.URL_模式()+斯克里普梅马皮().URL_模式()#静态服务静态页面=('索引.html'“scripmem.js”'样式.css'urlpattern+ =(静态URL(页面页面页面静态页面]urlpattern.追加(静态URL('索引.html'

现在还没有完成(缺乏用户管理,一个!)但它展示了基本思想。我认为这是一个通常有用的设计策略:找到并实现你想法的核心要素,然后玩它,完善它。

下一次,我们来看看我使用的一些技术django-webapp启用我和你的应用程序。

如果有人真的对这个应用程序的合作感兴趣,请直接联系我;当然可以用手。