当我还在纠结是否继续用Nodejs
构建博客API的时候(可以参考下重构个人网站的畅想),想起当时研究RESTful
的时候,除了Laravel RESTful(创建RESTful,详解Laravel的RESTful),最先用的就是Django-REST-Framedowk。于是,想起当时没有用到的其他框架,也就是Tastypie
。
Tastypie is a webservice API framework for Django. It provides a convenient, yet powerful and highly customizable, abstraction for creating REST-style interfaces.
中文简介版
Tastypie是Django框架的一个webservice接口。它提供了一个方便、强大而且高定制化的REST风格接口。
Tastypie非常容易显示您的模型,但也能完全让你控制你所期望得到的信息。只要你需要,能让你远离抽象的数据库。Tastypie也能让你非常容易的集成非ORM的数据源。
似乎用RESTify没有什么不好的,但是缺点是我们离抽象数据库很近
。
详细的内容可以看这篇 nodejs restify sqlite3网站重构二,生成RESTful接口
1.pip的话自然就是
sudo pip instal django-tastypie
或者
sudo easy_install django-tastypie
2.添加到settings.py
中的INSTALLED_APPS
'tastypie',
3.同步数据库
sudo manage.py syncdb
由于我使用的是Mezzanine
的CMS,相比于自己动手写的优点是:
最后程序的目录结构如下所示
blogapi/
├── __init__.py
├── __init__.pyc
├── api.py
└── api.pyc
主要的也就是__init__.py
和__api__.py
,有意思的是__init__.py
很早以前在写Django 扩展
的时候没有意识到这个,当时死活不工作,这是一个空文件
。
修改urls.py,添加下面的内容
from tastypie.api import Api
from blogapi.api import AllBlogSlugResource,EntryResource
v1_api = Api(api_name='v1')
v1_api.register(AllBlogSlugResource())
v1_api.register(EntryResource())
urlpatterns += patterns('',
(r"^api/", include(v1_api.urls)),
)
或者直接添加到博客的URL上方,如官方的示例
# urls.py
from django.conf.urls.defaults import *
from myapp.api import EntryResource
entry_resource = EntryResource()
urlpatterns = patterns('',
# The normal jazz here...
(r'^blog/', include('myapp.urls')),
(r'^api/', include(entry_resource.urls)),
)
一个简单的示例代码如下如下,大致就是从mezzanine
中读出包括keywords_string
,slug
,title
的内容,资源的名字是url
。
第二个则是构建博客的内容,这样我们就可以同上次一样,构建出一个可以调用的API。
from tastypie.resources import ModelResource
from mezzanine.blog.models import BlogPost, BlogCategory
class AllBlogSlugResource(ModelResource):
class Meta:
queryset = BlogPost.objects.published()
resource_name = "url"
fields = ['keywords_string', 'slug', 'title']
allowed_methods = ['get']
class EntryResource(ModelResource):
class Meta:
queryset = BlogPost.objects.published()
resource_name = "blog"
fields = ['keywords_string', 'slug', 'title', 'content', 'description']
allowed_methods = ['get']
用于获取url的json结果
curl -H "Accept: application/json" http://127.0.0.1:8000/api/v1/url/
用于获取blog的json结果
curl -H "Accept: application/json" http://127.0.0.1:8000/api/v1/blog/
围观我的Github Idea墙, 也许,你会遇到心仪的项目