使用Django创建你的Python BAE 程序

写在前面的扯淡之语

BAE全称Baidu App Enigine: 百度程序引擎。跟Google App Engine差不多。笔者也曾试用过其他几款,分别是:
谷歌家的,新浪家的,阿里家的。当然,如果你买得起虚拟主机,这篇就不用看了,燃烧你的毛爷爷总是能取暖的。

谷歌大多数时候都在抽风,虽然高大上,但是无奈,实在无缘。

新浪家的感觉并不好用,功能也有限。

阿里家的呢,嗯,比较贵!!!

网上一大把的是在百度搞活动的时候领了券的,笔者后知后觉,没赶上好时候。贡献了李厂长12块钱(乞丐版,先体验2个月。) 支持主流语言:Nodejs, php, java, python.因为选择的硬件配置比较低,对js和php也不是很熟,所以创建app的时候选了python。支持django,pip上有的库都能用(requirements.txt 定义)。也还比较方便。唯一不便的是,port服务并不是免费的,而且数据库只能使用公有数据库不支持长连接,30s会断开一次。

闲话扯了这么多,也该说正题了。

与Django集成

默认创建app之后差不多有这3个文件:

app.conf favicon.ico index.py

app.conf app的配置,参考这里: 点我 这个文件一会儿是要修改的,暂时搁这里。

favicon.ico 这个是图标啦,自己换吧。

index.py 这个文件后面需要修改,以bridge BAE和Django。

安装

pip安装你的django lib, 如果有代理:

pip install --proxy serve_ip:port package_name

初始化本地工程

然后在你的工程目录下初始化你的Django init 版本:

django-admin startproject xtest

然后得到类似这样的目录结构:

$ tree
.
├── manage.py
└── xtest
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files

导入bae工作目录

将这几个文件移到上一层目录:

    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

删除xtest目录中的xtest目录,然后将顶层xtest目录移动到checkout的代码文件夹

这时,你checkout的代码看起来是这样的:

$ tree
.
├── app.conf
├── xtest
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   ├── urls.pyc
│   ├── wsgi.py
│   └── wsgi.pyc
├── favicon.ico
├── index.py
└── manage.py

1 directory, 12 files

Bridge Django to BAE

然后修改app.conf:

handlers:
    - url : /.*
         script: index.py

这里是将所有的url都重定向给index.py wrap的框架来处理。

index.py 参见:BAE2.0文档

看起来像这样:

#-*- coding:utf-8 -*-
import os
import sys

os.environ['DJANGO_SETTINGS_MODULE'] = 'xtest.settings'

path = os.path.dirname(os.path.abspath(__file__)) + '/xtest'
if path not in sys.path:
    sys.path.insert(1, path)

from django.core.wsgi import get_wsgi_application
from bae.core.wsgi import WSGIApplication

application = WSGIApplication(get_wsgi_application())

注意:本人使用的是1.9.1版本的Django,所以如果是使用的1.7+的版本这样是没问题的。如果1.7一下,请参照:

import os
import sys
 
os.environ['DJANGO_SETTINGS_MODULE'] = 'djangodemo.settings'
 
path = os.path.dirname(os.path.abspath(__file__)) + '/djangodemo'
if path not in sys.path:
    sys.path.insert(1, path)
 
from django.core.handlers.wsgi import WSGIHandler
from bae.core.wsgi import WSGIApplication
 
application = WSGIApplication(WSGIHandler())

需要说明的是,BAE3.0已经不在使用bae.core.const模块,所以关于数据库的配置请参考:BAE3.0文档

配置需要的lib

在目录下添加requirements.txt文件,文件中加入依赖:

django==1.9.1
djangorestframework==3.3.2

版本号自己修改。上传代码,访问你的app页面,如果提示url不能匹配成功,则表示Django已经在工作了。导入eclipse,继续剩下的coding。

写在后面

总是有人在吐槽功能不好,性能不行,一天两毛钱,说老实话,我是没啥图的了,很满意。