Webから変更できるアプリの設定用Pythonライブラリ

PaPeRo i用に限らず業務で使用する様なアプリでは、通常、設定によってアプリの動作を変えられる様にする必要が出てくるものだと思います。
PaPeRo iであればWebで設定を変えられる様にするのが便利だと思います。
そこで、設定を定義するだけでWebで変更ができ、アプリ内から設定値を参照出来るPython用のライブラリを公開します。
ユーザに見せるためのきれいな画面を作るのでは無く、メンテナンス用の設定変更を極力手間をかけずにできるようにすることを意図したものです。

何ができるか

本ライブラリで何ができるかを例で説明します。
本ライブラリをインストールして以下のプログラムを実行すると、座布団のボタンを押したときにしゃべる内容をlocalhost:8860/confから参照したり変更したりできる様になります。

import sys

from webconf.webconf import WebThread, Page, ConfDef, Item, Text, Button
import pypapero


class MyConf(ConfDef):
    def __init__(self, filename=None, doload=True):
        # 設定の定義
        self.speech_l = Text('左ボタンでしゃべる内容', val='左ボタン')
        self.speech_c = Text('中ボタンでしゃべる内容', val='中ボタン')
        self.speech_r = Text('右ボタンでしゃべる内容', val='右ボタン')
        # 「保存」「ファイルから読み直す」「デフォルト値」ボタン
        Item.set_item_default(eot=' ', eol='')
        self.save_btn = Button('保存', onclick=self.dump)
        self.load_btn = Button('ファイルから読み直す', onclick=self.load)
        self.default_btn = Button('デフォルト値', onclick=self.init)
        # enumの表示文字列定義
        self.enumdic = {}
        # 最後にsuper()__init__()を呼び出す必要がある
        super(MyConf, self).__init__(filename=filename, doload=doload)


def start_web(confobj):
    page = Page('/conf', title='設定', conf_obj=confobj, enumdic=confobj.enumdic)
    page.run_thread()
    WebThread.run_thread(8860)


if __name__ == "__main__":
    confobj = MyConf('conf.json')
    start_web(confobj)
    simulator_id, robot_name, ws_server_addr = pypapero.get_params_from_commandline(sys.argv)
    #simulator_id, robot_name = '', ''
    #ws_server_addr = 'ws://192.168.1.1:8088/papero'
    papero = pypapero.Papero(simulator_id, robot_name, ws_server_addr)
    while papero.errOccurred == 0:
        msg = papero.papero_robot_message_recv(1.0)
        if (msg is not None) and (msg[0]["Name"] == "detectButton"):
            if msg[0]["Status"]=="R":
                papero.send_start_speech(confobj.speech_l.val)
            elif msg[0]["Status"]=="C":
                papero.send_start_speech(confobj.speech_c.val)
            elif msg[0]["Status"] == "L":
                papero.send_start_speech(confobj.speech_r.val)

    papero.papero_cleanup()

class MyConfが設定の定義で、ここではアプリの設定項目として文字列のspeech_l,speech_c,speech_rという3項目を定義しています。
他に表示の制御と「保存」「ファイルから読み直す」「デフォルト値」のボタンを定義しています。

confobj = MyConf('conf.json')

が保存された設定ファイルから値を読み出している部分で、アプリ内から設定値を参照する場合、

confobj.speech_l.val

という形で参照でき、ここでは座布団のボタンが押された場合にpapero.send_start_speech()に渡して、設定した文字列をパペロに喋らせています。
また、start_web(confobj)でWebから編集出来るようにしています。
この様にWeb編集用のオブジェクトを直接参照すると、「保存」などを行わなくても画面上で変更が行われた時点で動作に反映されます。
それでは困る場合、「適用」ボタンを設置し、onclickハンドラでWeb編集用のオブジェクトからアプリ参照用にコピーするなどの処理を追加する必要があります。

インストール方法

ダウンロードしたファイルを解凍し、コマンドラインから

pip3 install webconf-0.0.1-py3-none-any.whl

とすることでインストールできます。ソース展開して

python3 setup.py install

だと現状インストールできません。

機能について

  • 本ライブラリでは静的なページでは無く、tornadoを使用したWebSocket通信によりイベントの通知・表示の更新を行っています。

  • onclickとonchangeイベントハンドラが利用できます。onclickは引数なし、onchangeは1引数の関数を指定して下さい。
    examples/alltype_example.pyもご参照下さい。

  • 設定項目の定義と画面上の表示:

例えば文字列の設定項目を定義する場合

self.speech_l = Text('左ボタンでしゃべる内容', val='左ボタン')

とすると、画面では項目名’左ボタンでしゃべる内容’の後改行(<br>)されて、テキストボックスが表示されます。改行したくない場合、

self.speech_l = Text('左ボタンでしゃべる内容', val='左ボタン', eot=' ')

とeotを指定して下さい。また、項目間には(正しくない使用方法ですが)<br><br>が入りますが、例えば改行したくない場合、

self.speech_l = Text('左ボタンでしゃべる内容', val='左ボタン', eot=' ', eol='')

とeolを指定して下さい。

Item.set_item_default(eot=' ', eol='')

とすることで、以降個々に指定しなくても改行が入らなくなります。この場合は、

self.add_br()

を入れることで任意の項目間に改行(<br>)を挿入できます。

  • className=”xxxx”と、style=”xxxx”によって、設定項目のhtmlタグのclassとstyle属性を設定できます。
    また、Page()でstyle=を指定することによってヘッダのstyleタグ内を設定できます。
    examples/alltype_example.pyもご参照下さい。

部品

すべて最初に項目名、val=でデフォルト値を指定して下さい。
なおIEには対応していません(IE未対応のinput type使用のため)。

画面で変更でき、デフォルトでjsonにvalが保存されるもの

  • Text() テキストボックス、文字列。
  • Date() date文字列。
  • Time() time文字列。
  • DateTimeLocal() datetime文字列。
  • Number() 数値。
  • TextArea() 複数行テキストボックスス、文字列。
  • CheckBox() チェックボックス、bool。
  • SelectBox() セレクトボックス、enum.value(数値)。
  • SelectBoxByList() セレクトボックス、文字列
  • RadioBox() ラジオボックス、enum.value(数値)。
  • ComboBox() コンボボックス、文字列。

画面で直接変更できないが、デフォルトでjsonにvalが保存されるもの

  • Label() ラベル、文字列。
  • Table() N行M列の表を表示。文字列のリストのリスト。[[‘h00’, ‘h01’, ‘h02’], [‘:’,], [‘s00’, ‘s01′, s02’],[‘s10’, ‘s11′, s12’],…]
  • Href() URL参照。FORMAT={‘url’:URL文字列, ‘text’:表記文字列, ‘target’:’_blank’または’_self’など}
  • Fieldset() 題付き囲テキストのリスト。FORMAT=[{‘legend’: ‘sl0’, ‘text’: ‘st0’}, {‘legend’: ‘sl1’, ‘text’: ‘st1’},…]

jsonに保存されないもの

  • Button() ボタン。ハンドラを登録する。
  • Html() 定義で固定のHTMLを入れたいとき用

ライセンス

(c) 2017 Sophia Planning Inc.
License: MIT

製品でご利用になる場合、マニュアルなどわかりやすい場所への著作権表示[(c) 2017 Sophia Planning Inc.]をお願いします。

ステータス

公開に当たり実製品で使用しているライブラリを統合整理したのですが、気になっていた使いづらい部分を手直ししている内にかなり手を入れることになってしまいました。
申し訳ありませんが充分評価した上でのご利用をお願いします。


0