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:短信代码
- models.py:Django 模型(数据库)
- admin.py:Django 管理
- views.py:Django 视图(网络界面)
- urls.py:Django URL 模式(用于网络界面)
- static/:包含用于网络界面的静态文件的文件夹。可通过 http://<server>/static/<appname>/ 访问。
- templates:Django 模板
一个应用的短信代码由一个 rapidsms.app.App 类组成,该类将被路由器实例化并调用。
app.py 的骨架
import rapidsms class App(rapidsms.app.App): def parse(self, message): pass def handle(self, message): pass
路由器,由 route 命令启动,实例化所有应用的 App 类。这在 local.ini 中的 apps= 字符串的顺序中完成;然后它调用每个类的 start 方法,然后调用每个类的 configure 消息。
一旦收到一条消息,它将遵循以下步骤
- 调用每个应用的 parse 方法,并将 Message 对象传递给它。
- 调用每个应用的 handle 方法,并将 Message 对象传递给它。
一旦某个 handle 方法返回 True,该消息就被认为已处理,因此不会传递给其他应用。这就是为什么顺序很重要。
RapidSMS 提供了在 local.ini 文件中为您的应用添加一些配置的功能。在您的 local.ini 中,添加一个用于您的应用的部分,其中包含键值对。
test 应用的示例
[test] country=ml
添加此类配置将使路由器在启动期间调用 test 应用的 configure 方法。确保您的应用具有一个可以响应它的 configure 方法。
def configure(self, country): pass
或
def configure(self, **kwargs): pass
请注意,所有参数都作为字符串传递。
Message 对象是 RapidSMS 的核心。它是承载来自后端、路由器,然后返回到后端以传递给用户的短信的载体。
- 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()
此模型包含两个属性: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 访问。
请参阅 自定义管理员用户界面 以了解如何为您的应用程序启用它。