相关工具

代码部署

SAE Python使用SVN作为部署工具。使用SVN部署代码到SAE需要遵循以下规则:

SVN根目录下只允许存在以正整数命名的目录,不允许有文件存在, 这些目录为应用的版本目录,每个版本目录下才可以放应用对应版本的代码。

以应用longtalk为例,这个应用有6个版本:

jaime@westeros:~/longtalk$ ls
1  2  3  4  5  6
jaime@westeros:~/longtalk/1$ ls
index.wsgi myapp.py

SVN限制:

  • 文件名或目录名不允许含有以下字符:”,*,?,<,>,|,另外文件或文件名的开始与结束也不允许有空格。
  • 上传单个文件大小不超过20M
  • 单个目录下的文 件个数不能超过2000个
  • 每个应用代码总大小不超过100M
  • 单个版本代码总大小不超过50M

Warning

  1. 不要使用svn cp,mv,目前还不支持这两个操作。
  2. 建议使用命令行工具中的saecloud deploy命令来部署代码。

本地开发环境

本地开发环境仅为应用开发便利之用,对sae python环境的模拟并不完全。

安装

直接使用 pip 或者 easy_install 安装 sae-python-dev 包即可。

或者可以选择从github下载源码安装。

$ git clone http://github.com/saepython/saepythondevguide.git
$ cd saepythondevguide/dev_server
$ python setup.py install

基本使用

进入应用的本地开发目录,也就是index.wsgi和config.yaml所在的目录。运行如下的命令启动测试server:

$ dev_server.py
MySQL config not found: app.py
Start development server on http://localhost:8080/

访问 http://localhost:8080 端口就可以访问你的应用了。

使用MySQL服务

首先配置好MySQL本地开发server。然后使用 –mysql 参数运行dev_server.py。

$ dev_server.py --mysql=user:password@host:port

现在你可以在应用代码中像在SAE线上环境一样使用MySQL服务了。 dev_server.py默认使用名为 app_应用名 的数据库。

使用storage服务

使用 –storage-path 参数运行dev_server.py。

$ dev_server.py --storage-path=/path/to/local/storage/data

本地的storage服务使用以下的目录结构来模拟线上的storage。

storage-path/
      domain1/
            key1
            key2
      domain2/
      domain3/

–storage-path配置的路径下每个子文件夹会映射为storage中的一个domain, 而每个子文件夹下的文件映射为domain下的一个key,其内容为对应key的数据。

Note

为方便调试,dev_server自带的sae.storage在某个domain不存在的情况下会自动创建该domain。 线上环境中的domain需要在sae后台面板中手动创建。

使用pylibmc

dev_server自带了一个dummy pylibmc,所以无须安装pylibmc就可以直接使用memcache服务了。 该模块将所有的数据存贮在内存中,dev_server.py进程结束时,所有的数据都会丢失。

使用kvdb

kvdb默认数据存在内存中,dev_server.py进程结束时,数据会全部丢失,如果需要保存数据, 请使用如下命令行启动dev_server.py。

$ dev_server.py --kvdb-file=/path/to/kvdb/local/file

命令行工具saecloud

部署代码

进入应用目录(也就是config.yaml和index.wsgi所在的目录)。

$ cat config.yaml
name: memorystone
version: 2
$ saecloud deploy

saecloud从config.yaml文件获得信息,判断将要把代码部署到哪个应用的哪个版本。上面的命令会将应用部署到memorystone的版本2上。 saecloud deploy命令接受一个可选参数: app代码所在路径,默认为当前目录’.’。

Note

  1. 删除应用版本目前仍然只能在前端管理界面中操作。
  2. 如果代码量较大,则上传时间较慢,请耐心等待
  3. 不推荐混合使用saecloud deploy和svn,虽然saecloud deploy部署之前会自动更新代码,但是如果有代码冲突则会导致本地状态不一致。解决办法为删除本地cache目录: rm -rf ~/.saecloud

导出应用代码

导出memorystone应用版本2到本地目录:

$ saecloud export memorystone 2 --username fooxxx@gmail.com --password barxxx
Exporting to memorystone

第一个参数为应用名字,第二个参数为版本,可选,默认为版本1。 第一次使用时,请指定你的代码访问帐号信息:username 安全邮箱, password。之后的命令不用在输入此信息。

Note

deployexport 命令需要用到svn,请先安装svn命令行工具。 windows用户可以在这里下载:http://sourceforge.net/projects/win32svn/

安装依赖的第三方包

在应用目录中执行下面的命令安装依赖的第三方包。

saecloud install package [package ... ]

如果应用的依赖关系比较多,也可以这些依赖关系写到依赖文件中,例如:

Framework==0.9.4
Library>=0.2

假设上面的依赖文件的文件名为requirements.txt,你可以执行下面的命令安装所有的依赖包。

saecloud install -r requirements.txt

该命令会安装依赖包到应用目录下名为 site-packages 的目录里。如果文件比较多的话,推荐压缩site-packages目录。

cd site-packages/
zip -r ../site-packages.zip .

修改index.wsgi文件,在导入其它模块之前,将 site-packages 目录或者 site-packages.zip 添加到module的搜索路径中。

import os
import sys

root = os.path.dirname(__file__)

# 两者取其一
sys.path.insert(0, os.path.join(root, 'site-packages'))
sys.path.insert(0, os.path.join(root, 'site-packages.zip'))

这样就可以在应用中使用这些依赖包了。

Tip

安装指定版本的package:saecloud install package==version

cloudsql.py

cloudsql.py是SAE MySQL服务的一个命令行客户端,用户可以使用cloudsql.py来直接操作应用的线上数据库。

alan@sina:~/python$ cloudsql.py -u ACCESSKEY -p SECRETKEY APP_NAME
SAE MySQL Client

Type "help" or "?" for help.

Connecting to Cloud SQL database "app_shellpy" on host w.rdc.sae.sina.com.cn.
Using readline for history management.
Loading history file "/home/alan/.saecloud/app_shellpy.hist"
mysql>

如果想要在代码中直接操作线上的数据库,在 import MySQLdb (并不一定要安装MySQLdb包)之前执行以下的代码即可:

# 只在本地开发环境中执行
import os
if 'SERVER_SOFTWARE' not in os.environ:
    from sae._restful_mysql import monkey
    monkey.patch()

可用插件

SAE Python Shell

SAE Python Shell是一个wsgi中间件,提供了一个在线的interactive shell,便于在线调 试app,查看系统信息等。(由 shellpy 修改而来)。

class sae.ext.shell.ShellMiddleware(app, password=None)

app: 你的应用callable

password: 可选,登录shell时需要输入的口令,用于保护shell不被非法访问。

使用步骤:

  • 该插件需要使用 memcache 服务,请事先开启。

  • 修改index.wsgi,启用shell插件,示例如下:

    import sae
    from sae.ext.shell import ShellMiddleware
    
    def app(environ, start_response):
        status = '200 OK'
        response_headers = [('Content-type', 'text/plain')]
        start_response(status, response_headers)
        return ["Hello, world!"]
    
    application = sae.create_wsgi_app(ShellMiddleware(app))
    
  • 访问地址 https://<your-app-name>.sinaapp.com/_sae/shell ,根据提示输入你设置的口令

  • 或者你也可以在命令行下面使用 saecloud shell <your-app-name> [-p PASSWORD] 来访问在线shell。

    alan@sina:~/shellpy$ saecloud shell pylabs -proot
    Python 2.7.3 (default, Mar 27 2013, 18:11:21)
    [GCC 4.4.6 20120305 (Red Hat 4.4.6-4)]
    Type "help", "copyright", "credits" or "license" for more information.
    
    >>>

Warning

测试期间请谨慎使用,建议不使用时从源码中注释掉此shell。