TurboGears – RESTful 应用



REST 代表 **表述性状态转移**。REST 是基于 Web 标准的架构,并使用 HTTP 协议进行数据通信。它围绕资源展开,其中每个组件都是一个资源,并且可以通过使用 HTTP 标准方法的通用接口访问资源。REST 最初由 **Roy Fielding 于 2000 年** 引入。

什么是 RestController

TurboGears 中的 RestController 提供了一种机制来访问请求的方法,而不仅仅是 URL。标准 HTTP 术语包括:GET、POST、PUT 和 DELETE。RestController 支持这些,并且还添加了一些用于 URL 调度的快捷方式,这使得对于用户来说,将数据显示为表单和列表变得更容易。

为了解释 REST 如何与 TurboGears 一起工作,我们将定义一个简单的 Web 服务,该服务公开学生列表。

学生模型的代码如下所示:

model\student.py

# -* - coding: utf-8 -*-
from sqlalchemy import *

from sqlalchemy.orm import mapper, relation, relation, backref
from sqlalchemy import Table, ForeignKey, Column
from sqlalchemy.types import Integer, Unicode, DateTime
from hello.model import DeclarativeBase, metadata, DBSession
from datetime import datetime

class student(DeclarativeBase):
   __tablename__ = 'student'
   
   uid = Column(Integer, primary_key = True)
   name = Column(Unicode(20), nullable = False, default = '')
   city = Column(Unicode(20), nullable = False, default = '')
   address = Column(Unicode(100), nullable = False, default = '')
   pincode = Column(Unicode(10), nullable = False, default = '')

现在,基于 RestController 创建一个控制器,并提供一个视图函数以 JSON 格式列出学生列表。

Controllers\student.py

from tg import RestController
from tg import expose
from hello import model
from hello.model import DBSession
from hello.model.student import student
from tg.decorators import with_trailing_slash

class StudentController(RestController):
   @expose('json')
   def get_all(self):
      students = DBSession.query(student).all()
      return dict(students=students)

通过在 **root.py** 中合并以下几行,将此 StudentController 装载到应用程序的 RootController 中:

from hello.controllers.student import StudentController

class RootController(BaseController):

   students = StudentController()

转到 **https://127.0.0.1:8080/students**,它将以 JSON 格式提供我们的学生列表。

我们使用 post 方法来定义如何将学生保存到数据库。每当使用 POST 请求访问 **https://127.0.0.1:8080/student** URL 时,都会调用此方法:

@expose('json')
def post(self, name, city, address, pincode):
   newstudent = student(name = name, city = city, address = address, pincode = pincode)
   DBSession.add(newstudent)
   DBSession.flush()
   return dict(student = newstudent)

使用 **get_one()** 方法,我们可以将数据库中的一个项目显示给用户:

@expose('json')
def get_one(self, movie_id):
   newstudent = DBSession.query(student).get(uid)
   return dict(movie = movie)

PUT 是使用 REST 更新现有记录的方法:

@expose('json')
def put(self, name = name, city = city, address =  address, pincode = pincode, **kw):
   newstudent = DBSession.query(student).get(name)
   newstudent.name = name
   newstudent.city = city
   newstudent.address = address
   newstudent.pincode = pincode
   return dict(student = newstudent)

delete 的主力连接到 post_delete 方法。在这里,我们实际上从数据库中删除记录,然后重定向回列表页面:

@expose('json')
def post_delete(self, uid, **kw):
   newstudent = DBSession.query(student).get(uid)
   DBSession.delete(newstudent)
   return dict(movie = newstudent.uid)
广告