內容目录

上一个主题

入门指南

下一个主题

使用 RQ 实现后台任务

运行环境

新浪云 Python 应用运行于沙箱环境之中,前端负载均衡会根据负载在后端的多个节点中选择一个来处理 HTTP 请求。新浪云 Python 应用支持标准 WSGI 应用。

请求处理

新浪云的负载均衡会使用请求的域名来决定处理的应用。比如 http://your_app_name.sinaapp.com 的请求会被路由给名为 your_app_name 的应用来处理。

每个应用可以同时运行多个版本,版本以数字为标示,默认版本为 1。如果需要访问非默认版本,需要在域名的前面加上版本号作为子域名: http://version.your_app_name.sinaapp.com

默认 URL 符合以下规则的请求会作为静态文件处理:

  • /static/*
  • /favicon.ico

其他所有请求,都被路由到 /index.wsgi:application,即应用根目录 index.wsgi 文件,名为 application 的 callable,不可修改。

application 使用下列方式创建

sae.create_wsgi_app(app)

将标准 wsgi 应用封装为适宜在新浪云上运行的应用

import sae

def app(environ, start_response):
    # Your app
    ...

application = sae.create_wsgi_app(app)

所有请求的最大执行时间为 300s ,超过该时间的请求会被系统强制结束,可能会导致返回 502。

对于每个应用的请求,系统会为其维护一个队列,如果出现请求在一定的时间里得不到处理,服务器会自动给该应用增加 instance。如果某一个 instance 在一段时间里没有任何请求,会被系统回收。

基本环境

Python 运行环境使用的是 Python 2.7.9。

  • 仅支持运行纯 Python 的应用,不能动态加载 C 扩展,即.so,.dll 等格式的模块不能使用
  • 进程,线程操作受限
  • 本地文件系统只读。应用可以读取本应用目录,Python 标准库下的内容,如需读写临时文件建议使用 StringIO 或者 cStringIO 来替代。

Python 默认的模块搜索路径为:当前目录 > 系统目录。添加模块搜索目录的方法为:

import sys
sys.path.insert(0, your_custom_module_path)

注意:Python 当前目录下的子目录只有包含__init__.py 才会被 Python 认为是一个 package,才可以直接 import。

用户可以上传和使用 .pyc 文件,注意 .pyc 文件必须是 python2.7.9 生成的,否则无效。

Python 运行环境设置了一些自定义的环境变量,这些环境变量可以通过 os.environ 这个 dict 获取。

  • APP_NAME:应用名。
  • APP_VERSION: 当前应用使用的版本号。
  • SERVER_SOFTWARE: 当前 server 的版本(目前为 direwolf/0.1)。 可以使用这个环境变量来区分本地开发环境还是在线环境,本地开发环境未设置这个值。

外网访问

直接使用 urllib, urllib2、httplib 或者 socket 模块访问网络资源即可。

注解

外网访问出口 IP 列表:

  • 220.181.136.56
  • 220.181.136.57
  • 220.181.129.102
  • 220.181.129.119
  • 220.181.129.89
  • 220.181.129.126
  • 220.181.129.121
  • 220.181.129.92
  • 220.181.129.99
  • 220.181.84.185
  • 220.181.136.120
  • 220.181.136.141
  • 123.125.23.211
  • 123.125.23.212
  • 123.125.23.213
  • 123.125.23.214
  • 61.172.201.27
  • 61.172.201.28
  • 183.60.187.57
  • 183.60.187.58
  • 221.179.190.238
  • 221.179.190.240

如果你需要给访问的外部接口添加 IP 访问授权,建议添加以下七个 CIDR 规则:

  • 220.181.129.0/24
  • 220.181.136.0/24
  • 220.181.84.0/24
  • 123.125.23.0/24
  • 61.172.201.0/24
  • 183.60.187.0/24
  • 221.179.190.0/24

由于出口IP会变动,建议您使用 域名解析方式 获取出口IP地址:

  • dig iplist.sinacloud.com A

日志系统

打印到 stdout 和 stderr 的内容会记录到应用的日志中心中,所以直接使用 print 语句或者 logging 模块来记录应用的日志就可以了。

日志内容在 『应用 / 日志中心/HTTP 』 中查看,类别为 错误日志

注解

logging 默认设置的 level 是 WARNING,也就是 level >= WARNING 的消息才会被输出。

应用缓存

新浪云 Python 运行环境会对应用导入的模块(包括 index.wsgi)进行缓存,从而缩短请求响应时间,对于缓存了的应用,请求处理只是取出 index.wsgi 中 application 这个 callable 并调用。

应用配置

应用程序的配置文件为应用目录下的 config.yaml 文件。

使用预装模块

Python 环境中已经预装了很多的第三方模块,你可以直接使用。

  • 对于存在默认版本的第三方模块,如果没有在 config.yaml 中配置,将使用对应模块的默认版本。
  • 对于没有默认版本的模块,在应用的 config.yaml 文件中添加 libraries 段,指定你需要用的预装模块以及其对应的版本。 name 为模块的名称, version 为需要使用的版本,这两个字段为必填字段。
libraries:
- name: django
  version: "1.4"
- name: numpy
  version: "1.6.1"

以下是当前预装的第三方模块列表:

名称 支持的版本 默认版本
django 1.2.7, 1.4, 1.5, 1.8.3 1.2.7
flask 0.7.2 0.7.2
flask-sqlalchemy 0.15 0.15
werkzeug 0.7.1 0.7.1
jinja2 2.6 2.6
tornado 2.1.1, 2.4.1, 3.1.1 2.1.1
bottle 0.9.6 0.9.6
sqlalchemy 0.7.10, 0.9.7 0.7.10
webpy 0.36 0.36
PIL 1.1.7 1.1.7
MySQLdb 1.2.3 1.2.3
numpy 1.6.1
lxml 2.3.4
PyYAML 3.10 3.10
misaka 1.0.2
matplotlib 1.1.1
PyCrypto 2.6
py-bcrypt 0.2
greenlet 0.4.0 0.4.0
gevent 1.0rc2 1.0rc2
markupsafe 0.15
bitarray 0.8.0

注解

  1. 如果模块不存在默认版本或者需要使用非默认版本请在应用配置文件 config.yaml 中指定。
  2. 该配置只能指定上表里列出的模块,如果要使用其它第三方模块,请参考: 添加第三方依赖包

静态文件处理

handlers:
- url: /robots.txt
  static_path: robots.txt
- url: /favicon.ico
  static_path: favicon.ico
- url: /static/
  static_path: static

url 为 URL 的前缀,static_path 为静态文件所在的目录(相对于应用目录)。

当请求的 url 为目录时,服务器会首先尝试 static_path 下的 index.html,当 index.html 存在时,返回 index.html 的内容,否则返回 404。

gzip 压缩

handlers:
- url: /static/
  gzip: on

- url: /a-big-file.txt
  gzip: on

url 为 URL 的前缀。

注意,当客户端支持 gzip(HTTP 请求的 Accept-Encoding 中包含 gzip)时,服务端才会开启压缩。

注解

  1. 部分第三方库已经包含在默认搜索路径中,可以不在 config.yaml 中指定直接使用。
  2. 如果 config.yaml 中没有设置静态文件相关的 handlers,系统会默认将 /static 为前缀 的 URL 转发到应用目录下的 static 目录。
  3. 以上两条规则仅为兼容性考虑保留,不推荐使用,请在 config.yaml 明确配置。
  4. 对于 PHP 运行环境支持但是 Python 运行环境不支持的应用程序配置,请考虑使用 wsgi middleware 来完成,参见 设置基于主机的访问控制