跳转到内容

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 消息。

一旦收到一条消息,它将遵循以下步骤

  1. 调用每个应用的 parse 方法,并将 Message 对象传递给它。
  2. 调用每个应用的 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:实际的文本消息。这可以是 strunicode 文本。没有大小限制。
  • 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 的方式显示网页,您需要完成三个步骤:

设置 URL

[编辑 | 编辑源代码]

文件 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 函数

[编辑 | 编辑源代码]

视图只是一个返回要显示在访问者浏览器上的 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 管理员。Django 提供了一个 Web 界面来管理其某些功能,以及开发人员创建的模型。

它可以通过 http://<server>/admin 访问。

请参阅 自定义管理员用户界面 以了解如何为您的应用程序启用它。

运行 RapidSMS · SMS 和关键词器

  1. https://docs.django.ac.cn/en/1.1/topics/db/models/#topics-db-models
华夏公益教科书