On this page... (hide)

  1.   1.  资源推荐
  2.   2.  基本安装
  3.   3.  要点速查
    1.   3.1  表现层
    2.   3.2  Controller 层
    3.   3.3  Model 层
    4.   3.4  Paster 脚本
    5.   3.5  更多解决方案
  4.   4.  服务部署
    1.   4.1  基本部署
    2.   4.2  部署优化
  5.   5.  架构调优
    1.   5.1  面向应用程序集群的 Session 支持
  6.   6.  其他

1.  资源推荐

2.  基本安装

关于 virtualenv :

  • 其实不一定所有 TG2 需要包都要让它的安装脚本自己去重新折腾一遍,可以用 add2virtualenv 命令(这个指令包括在 virtualenvwrapper 工具包中)让 virtualenv 使用一部分系统中已经有的公共包,比如使用系统中公用的 MySQLdb 。具体参考Help with installation of MySQLdb for Turbogears 2

大致步骤如下:

  1. 安装virtualenvwrapper:pip install virtualenvwrapper
  2. source /usr/local/bin/virtualenvwrapper.sh (不确定这一步是否是拥有 add2virtualenv 指令所必须的),另外这一步会要求设定“WORKON_HOME”环境变量。
  3. add2virtualenv /opt/local/lib/python2.5/site-packages (比如我的 /opt/local/lib/python2.5/site-packages 目录下有 MacPorts 安装的 MySQLdb ,那么这样以后就可以在 virtualenv 环境下周到这个库了。)
    • 如果是想引入 egg 包,那么可以类似 add2virtualenv /opt/local/lib/python2.5/site-packages/simplejson-2.0.9-py2.5-macosx-10.5-i386.egg 这样。
    • 其实 add2virtualenv 指令就是把指定的路径添加到了 site-packages/virtualenv_path_extensions.pth 文件中罢了,和 easy_install 的基本原理是一样的。

3.  要点速查

3.1  表现层

Genshi 模板相关:

表单自动生成:

3.2  Controller 层

3.3  Model 层

  • SQLAlchemy 0.5.8 官方文档
  • SQLAlchemy 自身提供的跨平台数据类型
  • SQLAlchemy 中 MySQL 特有的数据类型
  • 在 TG2 环境之外调用 Model 的方法
  • 调整、定制 Model 的属性:(Model 的属性一般对应数据库表中的一列,在处理遗留数据和复杂需求时难免要对 Model 和数据库表的对应关系做一些定制)SQLAlchemy 不但可以为属性建立别名,甚至可以利用 sqlalchemy.orm.synonym 把函数处理的输出结果封装成属性的形式来用。具体参照Mapper Properties
  • SATrigger?:以往数据库自动更新关联数据往往是依靠触发器的,但触发器中的性能问题难以调试,而且在不同数据库引擎中编写的具体语法也会有所差别,其实在 ORM 中完全可以实现类似触发器的效果。
  • 有时会遇到一些 Model 实例没法 Cache 的情况,这本质是因为这些对象没法 pickle ,可参考文档 Why can't I pickle this object? 中提供的解决方案。大致来说,主要是为对象增加以下两个接口的实现:
    def __getstate__(self): return self.__dict__
    def __setstate__(self, d): self.__dict__.update(d)

3.4  Paster 脚本

  • paster shell development.ini 这个指令需要在 development.ini 目录下执行,否则会报错找不到 shell 命令,这是因为 paster shell 需要用到 egg-info 目录下的信息。

3.5  更多解决方案

4.  服务部署

4.1  基本部署

  • TurboGears 2 Deployment:描述了 TG2 部署到 lighttpd 上的详细方法。
  • TG2 部署到 Apache 和 Nginx 上的方法在官方文档有详细说明。

4.2  部署优化

  • 静态文件处理:部署的基本原则是静态文件要交给 httpd 服务器直接处理。
  • gzip 压缩:我使用 fast-cgi 方式把 TG2 部署在 lighttpd 上时,lighty 的 gzip 压缩模块是无法处理 TG2 传过来的页面的。暂时利用 pastegzipper 中间件来实现对 TG2 输出内容的压缩。于是现在我的 dispatch.py 大致是这样的:
    #!/usr/bin/python
    # -*- coding: utf-8 -*-

    import sys

    prev_sys_path = list(sys.path)

    new_sys_path = []
    for item in list(sys.path):
        if item not in prev_sys_path:
            new_sys_path.append(item)
            sys.path.remove(item)
    sys.path[:0] = new_sys_path

    import os, sys
    sys.path.append('/srv/www/lighttpd/tg2env/ourspass')

    from paste.deploy import loadapp
    wsgi_app = loadapp('config:/srv/www/lighttpd/tg2env/ourspass/production.ini')
    from paste.gzipper import make_gzip_middleware
    wsgi_app = make_gzip_middleware(wsgi_app, None)

    if __name__ == '__main__':
        from flup.server.fcgi import WSGIServer
        WSGIServer(wsgi_app, minSpare=1, maxSpare=5, maxThreads=50).run()

5.  架构调优

5.1  面向应用程序集群的 Session 支持

一旦对 Web App 实施分布式集群来提高处理能力,则 Session 信息的同步和存储会成为一个麻烦的问题。虽然也可以干脆将 Session 存储在 Cookie 里来解决同步问题,但这样会有浏览器兼容性、数据容量、存取性能等方面的一些问题。

考虑使用高性能高并发的数据存储服务来保存 Session,参考Pylons with Tokyo Cabinet Beaker Sessions

6.  其他

GlossyBlue theme adapted by David Gilbert
Powered by PmWiki