RapidSMS 开发人员指南/创建 RapidSMS 应用
RapidSMS 应用是一个 Django 应用,其中包含一些特定于 RapidSMS 的文件,并遵循一些约定。一个典型的应用看起来像这样
__init__.py app.py models.py admin.py views.py urls.py static/ templates/
一个最小的应用将包含
__init__.py app.py
- app.py: SMS 代码
- models.py: Django 模型(数据库)
- admin.py: Django 管理员
- views.py: Django 视图(Web 界面)
- urls.py: Djangi URL 模式(用于 Web 界面)
- static/: 包含 Web 界面静态文件的文件夹。可访问于 http://<server>/static/<appname>/
- templates: Django 模板
应用的 SMS 代码由一个 rapidsms.app.App 类组成,该类将被路由器实例化并调用。
app.py 的骨架
import rapidsms class App(rapidsms.app.App): def parse(self, message): pass def handle(self, message): pass
路由器由 route 命令启动,实例化所有 App 的 App 类。这在 local.ini 中 apps= 字符串的顺序中完成;然后它调用每个类的 start 方法,然后调用每个类的 configure 消息。
收到消息后,它会遵循以下步骤
- 调用每个 App 的 parse 方法,将 Message 对象传递给它。
- 调用每个 App 的 handle 方法,将 Message 对象传递给它。
一旦其中一个 handle 方法返回 True,则该消息被认为已处理,因此不会传递给其他应用。这就是顺序重要的原因。
RapidSMS 提供在 local.ini 文件中为你的应用添加一些配置的能力。在你的 local.ini 中,为你的应用添加一个部分,其中包含键值对。
test 应用的示例
[test] country=ml
添加此类配置将使路由器在启动期间调用 test App 的 configure 方法。确保你的应用有一个 configure 方法可以响应它
def configure(self, country): pass
或者
def configure(self, **kwargs): pass
请注意,所有参数都作为字符串传递。
Message 对象是 RapidSMS 的核心。它负责承载从后端到路由器,然后又回到后端以传送到用户的 SMS。
- message.text: 实际的文本消息。这可以是 str 或 unicode 文本。没有大小限制。
- message.peer: 发送者/接收者身份。根据后端,这通常是表示电话号码或等效内容的字符串。
- message.date: 表示接收日期的 datetime 对象。
- message.status: 表示消息状态的字符串。没有被广泛使用。
- message.person: 一个 Person 对象,它保存对连接的引用。
- message.connection: 一个 Connection 对象,它保存对后端和身份的引用。
- message.send(): 将对象发送到适当的后端。
- message.respond(text, status): 创建一条消息,发送回此消息的发送者。实际发送将被延迟。
- message.flush_responses(): 发送所有使用 .respond() 创建的响应。
- message.forward(identity, text): 在相同后端上创建具有不同身份的新消息对象,然后调用 respond()。
大多数 RapidSMS 应用用于数据收集,并依赖于数据库。由于 RapidSMS 建立在 Django 之上,因此建议使用 Django 的模型来实现这一点。
由于这里没有特定于 RapidSMS 的内容,请参考 Django 文档[1]
模型驻留在 models.py 文件中,应该继承自 django.db.models.Model
from django.db import models class SMS(models.Model): number = models.CharField(max_length=30) text = models.TextField()
此模型包含 2 个属性:number 和 text,两者都是字符串。
Django 的模型是 ORM(对象关系映射)。这意味着在你的应用中,你将像实例化实时对象一样实例化这些对象,Django 将负责对数据库的存储/检索。
重要提示: 你的模型只是你数据的表示。你可以把它看作是你的表格字段列表。每次你修改它时,你都需要要求 Django 更新实际的数据库,它是独立的。
如上所述,Django 将完全负责数据库访问。只需确保你的 local.ini 关于数据库的 配置正确,然后重新同步数据库。
./rapidsms syncdb
此命令将创建每个新添加的模型。
如果你需要修改模型,则必须删除并重新创建数据库
./rapidsms reset <appname>
Django 包含一个用于备份和恢复数据库(模型)内容的工具。
./rapidsms dumpdata <appname>
这将显示应用程序appname中所有模型数据的序列化版本。您也可以选择特定的模型。
./rapidsms dumpdata <appname>.SMS > backup.json
之前的命令将仅保存 SMS 模型的内容并将其重定向到文件。Django 中数据转储和恢复的默认格式为 JSON。
要恢复备份文件,请使用以下命令
./rapidsms loaddata backup.json
在 Django 术语中,视图就是网页。
请参考 文档,因为以下内容都不特定于 RapidSMS。
要以 Django 的方式显示网页,您需要完成三个步骤
文件urls.py记录了您的应用程序的所有 URL。您需要在urls.py中定义每个视图(页面)才能访问它们。
名为test的应用程序的示例
from django.conf.urls.defaults import * import test.views as views urlpatterns = patterns('', url(r'^test/?$', views.index), )
上面的文件将为每个对http://<server>/test的 HTTP 请求调用index视图(目前不存在)。
为了节省开发人员在处理 HTML 方面的时间和精力,Django 提供了使用模板的功能。模板是一个 HTML 文件,它可以接受特定的语法来显示视图中的变量和其他数据。
在templates/文件夹中创建一个 RapidSMS 示例模板
{% extends base_template %} {% block content %} <p>Hello {{ name }}!</p> {% endblock %}
此模板扩展了base_template(这是 RapidSMS 的设计),并将块content的内容替换为一段文字。这段文字包含一个模板变量,我们将在视图中用一些文本替换它。
视图只是一个返回HTTP对象的函数,该函数将显示在访问者的浏览器上。
一个最小的views.py文件
from django.http import HttpResponse def index(request): return HttpResponse("hello")
使用此视图,在浏览器上显示相应的网页将导致一个空白页面,其中包含单词 hello。
我们不必在视图中编写 HTML,而是可以调用刚刚创建的模板。
在这方面,Django 和 RapidSMS 有一些区别。以下是 RapidSMS 的方法
from rapidsms.webui.utils import render_to_response def index(request): greeting = "Thomas" return render_to_response(request, 'templates/index.html', {'name': greeting})
这样,我们就显示了一个模板,并向它传递了一个context(哈希),其中包含模板变量列表及其关联值。
在浏览器中显示它将导致一个漂亮的 RapidSMS 用户界面,其中包含一句问候 Thomas 的句子。
要以可视方式访问与模型相对应的数据,您可以启用 Django 管理员。Django 提供了一个 Web 界面,用于管理其某些功能,以及开发人员创建的模型。
它可以通过http://<server>/admin访问。
请参考自定义管理员用户界面以将其启用您的应用程序。