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限制:
Warning
本地开发环境仅为应用开发便利之用,对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本地开发server。然后使用 –mysql 参数运行dev_server.py。
$ dev_server.py --mysql=user:password@host:port
现在你可以在应用代码中像在SAE线上环境一样使用MySQL服务了。 dev_server.py默认使用名为 app_应用名 的数据库。
使用 –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后台面板中手动创建。
dev_server自带了一个dummy pylibmc,所以无须安装pylibmc就可以直接使用memcache服务了。 该模块将所有的数据存贮在内存中,dev_server.py进程结束时,所有的数据都会丢失。
kvdb默认数据存在内存中,dev_server.py进程结束时,数据会全部丢失,如果需要保存数据, 请使用如下命令行启动dev_server.py。
$ dev_server.py --kvdb-file=/path/to/kvdb/local/file
进入应用目录(也就是config.yaml和index.wsgi所在的目录)。
$ cat config.yaml
name: memorystone
version: 2
$ saecloud deploy
saecloud从config.yaml文件获得信息,判断将要把代码部署到哪个应用的哪个版本。上面的命令会将应用部署到memorystone的版本2上。 saecloud deploy命令接受一个可选参数: app代码所在路径,默认为当前目录’.’。
Note
导出memorystone应用版本2到本地目录:
$ saecloud export memorystone 2 --username fooxxx@gmail.com --password barxxx
Exporting to memorystone
第一个参数为应用名字,第二个参数为版本,可选,默认为版本1。 第一次使用时,请指定你的代码访问帐号信息:username 安全邮箱, password。之后的命令不用在输入此信息。
Note
deploy 和 export 命令需要用到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是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是一个wsgi中间件,提供了一个在线的interactive shell,便于在线调 试app,查看系统信息等。(由 shellpy 修改而来)。
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。