TurboGears – RESTful 应用程序


REST 代表RE表现性状态传输。REST 是基于 Web 标准的架构,并使用 HTTP 协议进行数据通信。它围绕着一个资源,其中每个组件都是一个资源,并且资源可以通过使用 HTTP 标准方法的公共接口进行访问。REST 是由Roy Fielding 于 2000 年首次提出的。

什么是 RestController

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

为了解释 RESTful 如何与 TurboGears 配合使用,我们将定义一个简单的 Web 服务来公开学生列表。

学生模型的代码如下 -

模型\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 格式列出学生列表。

控制器\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()

访问http://localhost:8080/students它将提供以 json 格式编码的学生列表。

我们使用 post 方法来定义如何将学生保存到数据库中。每当使用 POST 请求访问http://localhost: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)

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

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