如何将Django模型公开为RESTful Web服务?

时间:2009-07-20 10:59:01

标签: django web-services json rest

我正在尝试创建一个暴露以下Django模型的REST Web服务:

class Person(models.Model):
    uid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=40)
    latitude = models.CharField(max_length=20)
    longitude = models.CharField(max_length=20)
    speed = models.CharField(max_length=10)
    date = models.DateTimeField(default=datetime.datetime.now)

    def __unicode__(self):
        return self.name

到目前为止,这是我对此的看法:

获取所有人
网址: http://localhost/api/persons/
方法: GET
查询字符串:

  • startlat=
  • endlat=
  • startlng=
  • endlng=

用于获取指定坐标范围内的人员。

  • page=

用于获取响应的指定页面(如果响应包含多个页面)。

返回:

  • 200 OK& JSON
  • 404 Not Found

例:
请求:

GET http://localhost/api/persons/?startlat=10&endlat=15&startlng=30&endlng=60

响应:

{
  "persons":
  [
     { "href": "1" },
     { "href": "2" },
     { "href": "3" },
     ...
     { "href": "100" }
  ],
  "next": "http://localhost/api/persons/?startlat=10&endlat=15&startlng=30&endlng=60&page=2"
}


获取指定人员的信息
网址: http://localhost/api/persons/[id]
方法: GET
返回:

  • 200 OK& JSON
  • 404 Not Found

例:
请求:

http://localhost/api/persons/5/

响应:

{
  "uid": "5",
  "name": "John Smith",
  "coordinates": {
                   "latitude":"14.43432",
                   "longitude":"56.4322"
                 },
  "speed": "12.6",
  "updated": "July 17, 2009, 8:46 a.m."
}



到目前为止我的尝试有多正确?任何建议都非常感谢。

5 个答案:

答案 0 :(得分:3)

{ "href": "1" },

1几乎不是有效的网址。您应该使用完整的URL。 Google为HATEOAS

另外,请记住发送相关的Content-Type标头。您可能想要编写自己的mime类型来描述格式。这使您可以选择稍后更改内容类型(例如,在发布后更改格式)。见Versioning REST Web Services

答案 1 :(得分:2)

我认为查询参数可以更简单,更清晰。这将使URI更具可读性,并为将来的扩展提供更大的灵活性:

GET http://localhost/api/persons/?latitude=10:15&longitude=30:60

您可能希望将来启用这些功能:

GET http://localhost/api/persons/?latitude=10&longitude=60&within=5km

答案 2 :(得分:1)

似乎很酷。几天前,我甚至在同类事情上工作过。

唯一的变化,我很乐意在其中做,是与人员细节的直接联系。还有一些细节(比如 name )来识别这个人,并帮助我决定进一步导航。像...

{
  "persons":
  [
     { "name": "John Smith", "href": "http://localhost/api/persons/1/" },
     { "name": "Mark Henry", "href": "http://localhost/api/persons/2/" },
     { "name": "Bruce Wayne", "href": "http://localhost/api/persons/3/" },
     ...
     { "name": "Karl Lewis", "href": "http://localhost/api/persons/100/" }
  ],
  "next": "http://localhost/api/persons/?startlat=10&endlat=15&startlng=30&endlng=60&page=2"
}

通过这种方式,我提供所有内容,将数据显示为

  • John 史密斯
  • 马克 亨利
  • 布鲁斯 韦恩
  • ...
  • Karl Lewis

Next Page

答案 3 :(得分:0)

如果您提供一些模板系统,可以在JSON响应中提供速记URI。比如提供http://whatever.com/persons/ {id} /之类的基本URI,然后提供ID。然后使用python,您可以对字符串执行格式调用。您不希望让程序员真正查看并理解URI的含义,这在使用模板时是不必要的。

答案 4 :(得分:0)

您可能希望了解预先存在的REST中间件。我知道他们为我节省了很多时间。我正在使用http://code.google.com/p/django-rest-interface/。还有urls.py

的片段
json_achievement_resource = Collection(
    queryset = Achievement.objects.all(),
    permitted_methods = ('GET',),
    responder = JSONResponder(paginate_by = 10)
)

urlpatterns += patterns('',
    url(r'^api/ach(?:ievement)?/(.*?)/json$', json_achievement_resource),
)