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訪問。
請參考自定義管理員使用者介面以將其啟用您的應用程式。