欢迎来到这一系列的最后一批,这研究了Django宽松的装订哲学的优势。首先,我们看着用Jinja2取代Django的模板系统。接下来,我们查看了使用Sqlalchemy而不是Django的ORM,以及我们将要查看使用的第三部分CouchdB.而不是传统的对象关系数据库,用于数据存储。
CouchDB是我在过去一年中遇到的最令人兴奋的项目之一——以它激发的半真半假的白日梦的数量来衡量。它是关系数据库在意识形态上的竞争对手,它不是专注于高度详细的模式(长int、长度为25的varchar和二进制数据的blob,哦,天哪),而是处理文档。这些文档可能由相同的字段组成,但也可能包含不同的字段,允许与Google的BigTable一样的灵活性。除此之外,CouchDB还带来了其他一些意想不到的好处,比如文档版本控制1。
在我们开始之前,您将需要安装couchdb.,本教程不会涵盖哪些(在OS X上安装那在Windows上安装那在Ubuntu上安装)。
我们的项目
在本教程中,我们将使用CouchDB来存储一个简单的Django WebApp的数据,这将允许我们在线发布和编辑简单的文本文档。在我们开始之前,我们有一点设置要做。
首先,我们需要拥有Django安装了。我们将使用SVN版本,可以如此安装(请注意,您可以替换网站包 - DIR
使用您的Python的Site-Packages目录):
svn co http://code.djangoproject.com/svn/django/trunk/ django-trunk ln -s`PWD`/ django-trunk / django站点 - 包 - dir / django
接下来,我们需要安装Python库,couchdb-python.,哪个与couchdb的接口。
三,我们需要创建一个Django项目(对于那些不想通过所有步骤自己的人来说,你可以下载包含本教程中创建的代码的zip文件)。
django-admin.py startproject comfy_django_example.
你可能没有django-admin.py.
在您的系统路径中,在这种情况下,您需要将其从当地的Django结账中运行它。对我来说看起来像:
〜/ svn / django-trunk / django / bin / django-admin.py startproject comfy_django_example
现在,我们需要在我们的内部创建一个django应用程序comfy_django_example.
项目。
光盘comfy_django_example python manage.py startap couch_docs
我们几乎完成了设置,只需要配置一些设置。去吧,打开门settings.py.
文件在comfy_django_example.
文件夹。我们会做出这一变化:
已安装_apps.=('comfy_django_example.couch_docs'那)
我们也会编辑comfy_django_example / urls.py.
文件看起来像这样:
URLPatterns.=图案('comfy_django_example'那(r'^'那包括('couch_docs.urls')),)
了解CouchDB
在我们继续启动WebApp之前,让我们在Python命令行使用几分钟的时间使用CouchDB。
首先,我们需要开始运行CouchDB。如果正确设置符号链接,则应该像:
一些计算机:〜用户$couchdb apache couchdb 0.8.0孵化(Loglevel.=信息)apache couchdb正在启动。apache couchdb已启动。是时候放松。
现在射击一个Python翻译。
首先,您需要创建一个实例服务器
这表示在计算机上运行的本地CouchDB服务器。
>>>从CouchdB.进口*>>>S.=服务器('http://127.0.0.1:5984/')>>>S.>>>Len.(S.)0.
现在,允许创建几个数据库,遍历所有数据库,并删除数据库。
>>>S.。创造('用户')>>>S.。创造('docs')>>>Len.(S.)2>>>为了X在S.:......打印X......译文用户>>>delS.['用户']>>>delS.['docs']>>>Len.(S.)0.
现在让我们创建另一个数据库,实际上存储一些数据。
>>>D b=S.。创造('docs')>>>Len.(D b)0.>>>D b。创造({'类型':'文档'那'标题':'文件一个'那'文本文件':“这是一些文字。”})U'FD179491F0D95268EB1761E0439CF3E2'>>>Len.(D b)1
我们也可以创建命名文档。
>>>D b['宣言']={'类型':'文档'那'标题':'个人宣言'那'文本文件':“我强烈地相信某事。我认为。'}>>>D b['宣言']
从文档中检索和提取数据也很容易。
>>>一种=D b['宣言']>>>一种['标题']U'Personal Manifesto'>>>一种['标题']=“ehm。蹩脚的标题。”>>>一种
如果我们想运行一个特定的查询,我们就为此编写一个JavaScript函数。例如,假设要检索标题长度大于4的所有文档,我们将编写以下JavaScript:
功能(D.){如果(D.。标题。长度>4.)发出(D.。名称那空值);}
现在,要在Python中运行该查询,我们必须这样做:
>>>func_str.=“函数(d){if(d.title.length> 4)发射(d.title,null);}”>>>为了排在D b。询问(func_str.):......打印排。钥匙......文件一个人宣言
它有点难以理解在该查询中发生了什么,所以让我们打破它。发出
用于返回所需的数据;第一个论点是钥匙在结果集中,第二个论点是价值在结果集中。下一个例子应该有助于澄清事物。
>>>func_str.=“函数(d){if(d.title.length> 4)发射(d.title,d);}”>>>结果=D b。询问(func_str.)>>>结果 4)发射(d.title,d);'没有> {}>>>>为了排在结果:......打印排。钥匙......打印排。价值......文件一{u'txt':你是一些文字。',U'_rev':U'_id':U'_id':U'FD179491F0D95268EB1761E0439CF3E2',U'Type':U'Document',U'title':u'document一个'}个人宣言{u'txt':u'i坚信某事。我想。',U'_REV':U'_id':U'Manifesto',U'manifesto',U'Type':U'Document',U'Title':U'Personal Manifesto'}
我们还可以使用列表的全局访问数据。
>>>[X。钥匙为了X在结果][u'document一个',u'personal宣言']
现在,在最后一个例子中,我们将立即行走所有步骤。
>>>从CouchdB.进口*>>>S.=服务器('http://127.0.0.1:5984/')>>>D b=S.。创造('软件')>>>D b['firefox']={'类型':'浏览器'那'标题':'firefox'}>>>D b['苹果浏览器']={'类型':'浏览器'那'标题':'苹果浏览器'}>>>D b['aquamacs']={'类型':'编辑'那'标题':'aquamacs'}>>>Len.(D b)3.>>>仅限武器='功能(d){if(d.type ==“浏览器”)发射(d.title,d);}'>>>[X。钥匙为了X在D b。询问(仅限武器)][U'Firefox',U'Safari']>>>delS.['软件']
通过该命令线在我们的腰带下实验,它很容易想象如何使用CouchDB进行大多数数据存储,检索和操作需求。现在到了我们的政变阁下2:将CouchDB与Django集成。
与Django集成CouchDB
我们将汇总一个非常简单的应用程序。它有两个意见:指数视图将显示所有可用文档的列表,并允许您创建新文档,以及细节查看将允许您编辑现有文档。
首先,让我们创建couch_docs / urls.py.
文件。
从django.conf.urls.defaults.进口*URLPatterns.=图案('comfy_django_example.couch_docs.views'那(r'^ doc /(?p \ w +)/'那'细节'),(r'^ $'那'指数'),)
接下来,我们需要编辑couch_docs / aigument.py.
文件。我们将从导入开始,也是一些代码来创建名为的CouchDB数据库译文
如果它尚不存在。
从django.http.进口http404.那httpresponseredirect.从django.shortcuts.进口render_to_response.从CouchdB.进口服务器从couchdb.client.进口resourcenotfound.服务器=服务器('http://127.0.0.1:5984')如果(Len.(服务器)==.0.):服务器。创造('docs')
如果您是遵循最佳实践,您可能需要创建一个couchdb_server
进入你的settings.py.
文件然后做这样的事情:
从django.conf.进口设置服务器=服务器(getattr.(设置那'couchdb_server'那'http://127.0.0.1:5984')))
但是,对于我们将坚持更简单的时间,尽管更灵活,请解决在于指定服务器的解决方案观点
文件本身。现在,让我们写下视图。
这指数
查看做两件事。在A.得到
请求它显示数据库中的所有现有文档,以及邮政
请求它为该文档创建新文档并重定向细节
看法。
def指数(要求):译文=服务器['docs']如果要求。方法==.“邮政”:标题=要求。邮政['标题']。代替(''那'')译文[标题]={'标题':标题那'文本':“}返回httpresponseredirect.(U“/ doc /%S./“%标题)返回render_to_response.('couch_docs / index.html',{'行':译文})
请注意,我们通过了行
作为额外的背景index.html.
模板以完全相同的方式,我们将通过Django Orm查询数据。
这细节
视图也有两个功能。如果它得到了一个得到
请求,然后它将显示文档(以及用于编辑的表单),以及邮政
请求它将更新文档。如果有人请求不存在的文档,我们还希望抛出404个错误代码。
def细节(要求那ID):译文=服务器['docs']尝试:博文=译文[ID]除了resourcenotfound.:增加http404.如果要求。方法==.“邮政”:博文['标题']=要求。邮政['标题']。代替(''那'')博文['文本']=要求。邮政['文本']译文[ID]=博文返回render_to_response.('couch_docs / detail.html',{'排':博文})
请注意那个文件[id]=文件
行不是可选的,如果更新文档密钥,则不会在没有该行的情况下更新文档的条目。我不确定这是否是图书馆的监督或故意决定削减HTTP请求,但它可能是一个令人困惑的GOTCHA。
现在我们只需编写模板。首先,创建模板目录comfy_django_example / couch_docs /
文件夹。
光盘comfy_django_example / couch_docs / mkdir模板mkdir templates / couch_docs光盘模板/ couch_docs /
然后创建index.html.
模板。
<头部>Comfy Django. title> head>你知道吗Couchdb在Django h1><形式方法=“邮政”行动=“。”><表>新文件的标题 Td> | <输入类型=“文本”名称=“标题”> td> | <输入类型=“提交”> td> tr>表> form>
{%为了排在行%} ID =“标题”href =“/ doc /{{排}}/“>{{排}} li>{%终止%} OL> body> html>
和细节.html. 模板也是如此。
<头部>Django的CouchDB:{{row.title.}} title> head>你知道吗Django的CouchDB:{{row.title.}} h1>href =“/”>返回索引<表>标题 Td> | ID =“标题”>{{row.title.}} Td> tr>文本 Td> | ID =“文本”>{{row.text.}} Td> tr>表> <形式方法=“邮政”行动=“。”><表>新文件的标题 Td> | <输入类型=“文本”名称=“标题”价值=“{{row.title.}}“> td> tr>文本 Td> | | | |