阿里云ACE引擎+Django 开发微信公众平台

96
软体动物Ai
2016.02.14 20:46* 字数 1825

现在网上大部分教程都是基于新浪 SAE 平台的,但是我发现 SAE 虽然免费,但是好像不太好用。最后选择的 ACE 平台,按量付费,可以用来开发,没人访问就不要钱哦,自己访问调试,我几天才花了1块钱。好了,现在进入正题。。

本文重点介绍几个大家比较关心的问题:

  • ACE引擎如何使用及付费
  • ACE引擎是否能够进行微信公众平台开发
  • ACE引擎如何配合Django工作,如何安装依赖库,如何编写index.py
  • ACE引擎如何执行Python manage.py makemigrations/migrate
  • ACE引擎如何进行调试

注册和配置 ACE 平台

  1. 进入阿里云官网,注册登录。进入控制台

  2. 在产品与服务里面选择云引擎 ACE,就可以进入 ACE 的管理界面。

  3. 点击应用列表,创建应用。然后会让你选择付费方式,这里我们点击一下上面的选项卡,切换到按量付费,然后点击立即购买。


  4. 完成购买之后,初始化应用。在语言里面选择 Python。因为我们将使用 Django 框架。


    1455069120361.png

    初始化之后,选择一键部署,系统会自动为我们创建 svn 以及 demo app。

至此,ACE 平台的注册和基本初始化配置就已经完成了。

参考链接:官方文档-快速开始 Python

发布 Django 项目

1.下载示例代码

我们点击版本管理来管理我们的应用

1455069298882.png
这里我们可以看到 svn 的地址,我们需要把它 checkout 到本地。
在本地我们创建一个文件夹,执行 svn checkout 地址,就可以把代码下载下来。

    1
    ├── app.yaml
    ├── default.html
    └── index.py

初始的目录结构是这样的。其中 app.ymalindex.py 是必须的。我需要修改这两个文件来配置我们的站点。

2.创建 Django 应用

可以直接在我们下载下来的文件夹中创建 django 应用。当然如果您已经创建好了 django 应用,可以直接拷贝过来。文件目录结构如下。

├── app.yaml
├── default.html
├── favicon.ico
├── index.py
├── manage.py
├── pinche #Django 项目名
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── pincheBasic #APP
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── migrations
│   ├── models.py
│   ├── templates
│   ├── tests.py
│   ├── views.py
├── requirements.txt
└── static

这里我们需要注意 requirements.txt 的位置,ACE 会根据这个文件的内容帮我们安装依赖的库。

3.编写index.py

这里主要是讲 index.py的编写,该文件负责启动我们的应用

删掉默认的代码,替换为如下。注意官方文档中的代码有问题,没有 import os

1455070454465.png

实际代码如下,代码中的 pinche是我的 django 项目名称,你替换一下就可以。

from django.core.wsgi import get_wsgi_application
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'pinche.settings'
application = get_wsgi_application()

4.安装依赖包

需要安装哪些库,直接写在 requestments.txt 即可,有些库是需要编译的,如果安装失败是因为ACE 上面没有相应的 LIB,这需要你提交工单让他们给你装。不过一般的都有。

Django
arrow
django-bootstrap3
MySQL-python
alibaba-python-sdk
requests

除非一定需要依赖某个版本,否则最好别写版本,不然有的版本找不到就装不上。发布的时候就会自动安装。

5.使用静态文件

作为一个Web应用,不可避免的要使用css, js,图片等镜头资源。或许,你的框架提供了访问静态文件的方法,或者,你打算自己提供静态文件访问功能。但是,ACE默认支持静态文件,而且更简单,性能更好。

version: 1
static:
    - path: /static/
      files: /static/
      expire: 30d
    - path: /favicon.ico
      files: /favicon.ico
      expire: 1y

默认的配置如上,这种情况下,static 目录要放在根目录。

6.发布及部署

本地代码配置好之后,就可以上传代码了。
运行svn commit -m "init"来上传代码,代码上传后,点击重新发布。重新发布后不会立刻生效,我们点击左侧应用信息,可以查看运行状态(正在启动 || 运行中)

可以在版本管理里面点击查看来看看效果。

7.数据库创建和迁移

众所周知,django 在本地进行数据库的创建,是运行命令

python manage.py makemigrations
python manage.py migrate

但是在 ACE 上如何执行makemigrations呢,我们又不能执行命令。其实命令还是在本地执行的,只要settings.py中配置数据库为远端数据库即可。

首先,我们创建数据库。回退到上一级菜单,选择扩展服务--数据库服务。可以免费开通一个共享性 Mysql 数据库。

空间:1G
数据库类型:共享型(免费使用)
用户名:****
数据库名:****
数据库地址:***.mysql.rds.aliyuncs.com
端口:3306

然后我们在settings.py中配置我们的数据库。

if DEBUG:
    name = "pincheBasic"
    user = "root"
    password = ""
    host = ""
    port = ""

else:
    name = "rg****"
    user = "rg****ux"
    password = "rg****50"
    host = "rrg****3ed.mysql.rds.aliyuncs.com"
    port = "3306"

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': name,
        'USER': user,
        'PASSWORD':password,
        'HOST':host,
        'PORT':port,
    }
}

这里我们可以通过 DEBUG 变量来控制使用本地数据库还是 ACE 的数据库。

我们把 DEBUG 设置成 False,然后运行

python manage.py makemigrations
python manage.py migrate

就可以完成 ACE 数据库的创建和更新。

在产品与服务里面选择云数据库 RDS,进入控制面板
点击登录数据库,就可以进行数据库的管理。

我们可以查看数据表的创建情况,也可以执行 sql 语句等对数据库进行操作。

8.查看运行日志

有时候app 无法正常运行或者是输出了错误的信息。我们都可以通过日志系统来查看。

注意: 如果你使用Django框架,要把时区改成中国地时区,否则会日志时间不对,ACE日志收集程序无法采集日志。请确保settings.py文件里,TIME_ZONE='Asia/Shanghai'

日志可以查询某个时间范围,也可以直接下载某天的日志到本地进行分析。同时,查询日志的级别也是可以控制的。另外在控制面板里面还提供了查看实时日志的入口,打开之后就和终端一样,可以显示当前操作产生的日志。

我们可以在app.yaml里配置日志级别:

log:
    level: INFO

从微信获取的用户信息中文乱码问题

假设我们获取的 json 中包括一个
u'\xe6\x90\xac\xe9\x93\x81\xe5\xb0\x91\xe5\xb9\xb4ai'
它虽然是一个 unicode,但是如果直接打印或者存放到数据库里面,则会乱码,我们必须把 u 去掉,再放到数据库里面,此时应该使用:
.encode('raw_unicode_escape')

举例来看:

>>> uni_a = u"软体动物小艾"
>>> uni_a
u'\u8f6f\u4f53\u52a8\u7269\u5c0f\u827e'
>>> print uni_a
软体动物小艾

正常来讲,我们在 python 2 里面使用中文字符串会以这样的方式进行。

但是从微信拿到的用户信息,实际上先进行了 utf-8的编码。然后却当做了 unicode 传了过来。
相当于

uni_a.encode("utf-8") =
'\xe8\xbd\xaf\xe4\xbd\x93\xe5\x8a\xa8\xe7\x89\xa9\xe5\xb0\x8f\xe8\x89\xbe',如果 print 这个字符串,也是正确的,但是微信传过来的时候,用它替换了前面的\u8f6f\u4f53\u52a8\u7269\u5c0f\u827e
这里就相当于了一个 u,所以我们去掉这个 u 就对了

《边城Programming》