ランダムおすすめ記事

ホームページ作りました

(いちばんやさしいpython教本の改造)観客動員予測システム「ベルマーレ観客動員予測1号ちゃん」プログラム解説②

前回の記事

前回は改造前のプログラムの解説とcss部分だけで終わってしまいました。 今回はいよいよプログラム部分に入っていきますよ。

プログラム的に特に書きたいことを書いていく

まずURLにアクセスするとLINE風の会話部分が空欄になっており味気ないことが判明しました。
なのでpost意外でURLにアクセスした場合には

@route('/douinyosoku/1/')
def audience_mobilization():
    input_text = '観客動員予測や質問を入力してください'
    output_text='こんにちは!\n湘南ベルマーレ観客動員予測システムの\n「観客動員予測1号」です。\nよろしくお願いいたします!'
    return template('template', input_text=input_text, output_text=output_text, input_text_conversion='')



input_text_conversion=''は完全に僕が作った部分なので後ほど解説

 input_text = '観客動員予測や質問を入力してください'
 output_text='こんにちは!\n湘南ベルマーレ観客動員予測システムの\n「観客動員予測1号」です。\nよろしくお願いいたします!'

このように出力するようにしました。
実はbottleはこのままだと\nの改行が反映されないのですが

Python + Bottle + Jinja2で、Jinja2のカスタムフィルターを使う - メモ的な思考的な


この記事を参考に改行を反映させました。

from bottle import TEMPLATE_PATH
TEMPLATE_PATH.append("./path/to/templates")

の部分はなにか改造が必要かなと思いましたが丸写しでいけました。
html部分は

      {{input_text|nl2br }}
      {{output_text|nl2br }}



こんな感じで書けばおっけー。

フォーム送信後。つまりPOSTによるアクセスに関しては

@route('/douinyosoku/1/', method='POST')
def do_audience_mobilization():
    input_text = request.forms.input_text
    output_text = pybot(input_text)
    input_text_conversion = ''


このように書きます。
input_text_conversion = ''
以外は元のプログラムと全く同じですね。

input_text_conversionって何?

input_text_conversionについて説明しますね。
これを説明するにはここの機能について語らなくてはなりません。 f:id:sr2460:20190313120615p:plain
このアプリケーションの本丸部分ですね。


実は観客動員予測の呼び出しはcsvファイルから行っております。

1: 相手チーム, 北海道コンサドーレ札幌 晴れの場合の観客動員数, 14000 雨の場合の観客動員数, 13000 ...etc
2: 相手チーム, FC東京 ...etc


このようなデータが並んでおります。


html部分のセレクトボタンで

<strong class="douinyosokukiku">観客動員数の予測を聞く</strong>
<form class = "select-form" method="post" action="/douinyosoku/1/">
<select name="input_text">
<option value="audience_mobilization_anaritics 1">1節 北海道コンサドーレ札幌</option>
<option value="audience_mobilization_anaritics 2">2節:FC東京</option>
<option value="audience_mobilization_anaritics 3">4節:ベガルタ仙台</option>
<option value="audience_mobilization_anaritics 4">6節:ジュビロ磐田</option>
<option value="audience_mobilization_anaritics 5">7節:松本山雅FC</option>
<option value="audience_mobilization_anaritics 6">10節:名古屋グランパス</option>
<option value="audience_mobilization_anaritics 7">11節:大分トリニータ</option>
<option value="audience_mobilization_anaritics 8">14節:横浜F・マリノス</option>
<option value="audience_mobilization_anaritics 9">17節:セレッソ大阪戦</option>
<option value="audience_mobilization_anaritics 10">19節:ヴィッセル神戸</option>
<option value="audience_mobilization_anaritics 11">21節:鹿島アントラーズ</option>
<option value="audience_mobilization_anaritics 12">23節:サガン鳥栖</option>
<option value="audience_mobilization_anaritics 13">25節:浦和レッズ</option>
<option value="audience_mobilization_anaritics 14">27節:清水エスパルス</option>
<option value="audience_mobilization_anaritics 15">28節: 川崎フロンターレ</option>
<option value="audience_mobilization_anaritics 16">30節:ガンバ大阪</option>
<option value="audience_mobilization_anaritics 17">33節:サンフレッチェ広島</option>
</select></p>
<input type="submit" value="送信"><input type="reset" value="リセット">
</form>



hrmlから audience_mobilization_anaritics 11 のような文章が送信されると

            if 'audience_mobilization_anaritics' in command:
                response = douin_csv_open(command)


が動作し、

def douin_csv_open(command):
    """フォームから入力した動員 1のような言葉を引数として受け取った時にdouin, numberという変数に分割して受け取る"""
    douin, number  = command.split()
    with open('観客動員整理.csv', encoding='utf-8') as open_file:
        read_douin = open_file.read()
        douin_split = read_douin.splitlines()



まずaudience_mobilization_anaritics 17をふたつに分割した後csvを開いてキー17を呼び出していくのですが出力の際に問題があったのです。

input_text = request.forms.input_text


そう!input_textはformで入力した文章をそのまま呼び出すのです。なので観客動員のセレクトボックスを送信すると。
audience_mobilization_anaritics 17


と英語とキー番号を喋りだしてしまうのです。
これはさすがにおかしい。
input_text部分を改造しようと思ったのですが、 f:id:sr2460:20190313122652p:plain

入力した言葉をそのまま出力する機能も残す必要があったので以下のようにプログラムして

    if input_text == 'audience_mobilization_anaritics 1':
        input_text_conversion = 'コンサドーレ札幌戦の観客動員数を教えて'
        input_text = ''



特定の言葉がフォームに入力された場合にはinput_textを空欄にしてその代りにinput_text_conversionを出力するという風に変更を加えたのです。

余談ですが当初はhtmlのフォーム部分は

<option value="動員 1">1節 北海道コンサドーレ札幌</option>


としていてさらにべつのフォーム部分では、

<strong class="ベルマーレ観客動員予測1号ちゃんについて">ベルマーレ観客動員予測1号ちゃんについて</strong>



としていたのですが これをやってしまうと動員というキーワードが干渉してしまい、ベルマーレ観客動員予測1号ちゃんについてというキーワードに1や2といったdictのkeyが存在しないためoutput_textがNoneになるというエラーが発生しました。(なんか他にもエラーが出た気がする)
これだと日本語の質問が干渉を起こしまくってしまうため

<option value="audience_mobilization_anaritics 1">1節 北海道コンサドーレ札幌</option>
↓
    if input_text == 'audience_mobilization_anaritics 1':
        input_text_conversion = 'コンサドーレ札幌戦の観客動員数を教えて'
        input_text = ''



とすることで英語の文章を送り出力はinput_text_conversion = 'コンサドーレ札幌戦の観客動員数を教えて'
で行うという処置をとったのです。
なんか長いし分かりにくい説明ですかね?
今回はこのくらいにしておきましょう。