Blog

Blog

PHODAL

Django Tastypie 构建Django RESTful API

当我还在纠结是否继续用Nodejs构建博客API的时候(可以参考下重构个人网站的畅想),想起当时研究RESTful的时候,除了Laravel RESTful(创建RESTful,详解Laravel的RESTful),最先用的就是Django-REST-Framedowk。于是,想起当时没有用到的其他框架,也就是Tastypie

Tastypie

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的数据源。

Tastypie VS Nodejs RESTify

似乎用RESTify没有什么不好的,但是缺点是我们离抽象数据库很近

详细的内容可以看这篇 nodejs restify sqlite3网站重构二,生成RESTful接口

Tastypie 安装

1.pip的话自然就是

  sudo pip instal django-tastypie

或者

  sudo easy_install django-tastypie

2.添加到settings.py中的INSTALLED_APPS

 'tastypie',

3.同步数据库

  sudo manage.py syncdb

Tastypie Django CMS

由于我使用的是Mezzanine的CMS,相比于自己动手写的优点是:

  • 自动生成的sitemap.xml
  • 已经集成博客系统
  • 可以方便地添加page
  • 添加模板很方便
当年的Django CMS没有这么强大,就这样已经用了差不多两年了。、

Tastypie实战

最后程序的目录结构如下所示

blogapi/
├── __init__.py
├── __init__.pyc
├── api.py
└── api.pyc

主要的也就是__init__.py__api__.py,有意思的是__init__.py很早以前在写Django 扩展的时候没有意识到这个,当时死活不工作,这是一个空文件

配置Resource

修改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)),
)

创建Resource

一个简单的示例代码如下如下,大致就是从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']

测试Resource

用于获取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: @phodal     微博:@phodal     知乎:@phodal    

微信公众号(Phodal)

围观我的Github Idea墙, 也许,你会遇到心仪的项目

QQ技术交流群: 321689806
comment

Feeds

RSS / Atom

最近文章

关于作者

Phodal Huang

Engineer, Consultant, Writer, Designer

ThoughtWorks 技术专家

工程师 / 咨询师 / 作家 / 设计学徒

开源深度爱好者

出版有《前端架构:从入门到微前端》、《自己动手设计物联网》、《全栈应用开发:精益实践》

联系我: h@phodal.com

微信公众号: 最新技术分享

标签