TurboGears – RESTful 应用程序

REST 代表 REpresentational State Ttransfer。REST 是基于 Web 标准的架构,使用 HTTP 协议进行数据通信。它围绕资源展开,其中每个组件都是资源,并且资源通过通用接口使用 HTTP 标准方法进行访问。REST 最初由 Roy Fielding 于 2000 年提出。

什么是 RestController

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

为了解释 RESTful 如何与 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()

转到 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)