跳转到内容

RapidSMS 开发人员指南/创建 RapidSMS 应用

来自 Wikibooks,开放世界中的开放书籍

应用结构

[编辑 | 编辑源代码]

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 代码

[编辑 | 编辑源代码]

应用的 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.iniapps= 字符串的顺序中完成;然后它调用每个类的 start 方法,然后调用每个类的 configure 消息。

收到消息后,它会遵循以下步骤

  1. 调用每个 App 的 parse 方法,将 Message 对象传递给它。
  2. 调用每个 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: 实际的文本消息。这可以是 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()

此模型包含 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 的方式显示网页,您需要完成三个步骤

设置 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
华夏公益教科书