- TurboGears 教程
- TurboGears - 首页
- TurboGears - 概述
- TurboGears - 环境
- TurboGears - 第一个程序
- TurboGears - 依赖项
- TurboGears - 服务模板
- TurboGears - HTTP 方法
- Genshi 模板语言
- TurboGears - 包含
- TurboGears - JSON 渲染
- TurboGears - URL 层次结构
- TurboGears - Toscawidgets 表单
- TurboGears - 验证
- TurboGears - 闪存消息
- TurboGears - Cookie 和会话
- TurboGears - 缓存
- TurboGears - Sqlalchemy
- TurboGears - 创建模型
- TurboGears - CRUD 操作
- TurboGears - 数据网格
- TurboGears - 分页
- TurboGears - 管理员访问
- 授权与身份验证
- TurboGears - 使用 MongoDB
- TurboGears - 脚手架
- TurboGears - 钩子
- TurboGears - 编写扩展
- TurboGears - 可插拔应用程序
- TurboGears - RESTful 应用
- TurboGears - 部署
- TurboGears 有用资源
- TurboGears - 快速指南
- TurboGears - 有用资源
- TurboGears - 讨论
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)