Flaskで作ったWebアプリをAWS Elastic Beanstalkにデプロイしてみた〜第2弾〜

スポンサーリンク
作ってみた
スポンサーリンク
スポンサーリンク

完成品

「Flaskを使って Webアプリを作成して、AWS Elastic Beanstalkにデプロイしてみた」の第二弾の完成品を以下に貼り付けました。今回は掲示板アプリを作成してみました。
※完成品のリンク先は、現在は削除されています。

http://flask-env-bbs.eba-323wtq8c.ap-northeast-1.elasticbeanstalk.com

使い方

 掲示板の「投稿」欄と「名前」欄にそれぞれ入力をして「送信する」をクリックすると、タイムスタンプと共に投稿結果が表示されます。
「戻る」ボタンをクリックすると、投稿一覧に書き込んだエントリが表示されます。

     ⬇︎

     ⬇︎

Flaskで掲示板を作成

 掲示板のコードは以下の通りです。

application.py

from flask import Flask, request, render_template
import codecs
from datetime import datetime, timedelta, timezone
application = Flask(__name__)

@application.route("/")
def bbs():
    #lines = []
    message = "みんな書いてね"

    # 記事保存用のテキストファイルを開き、読み込みます
    file = codecs.open("articles.txt", "r", "utf-8")
    lines = file.readlines()
    file.close()

    # 読み込んだ記事をhtmlテンプレートで表示します
    return render_template("bbs.html", message = message, lines = lines)

@application.route("/result", methods=["POST"])
def result():
    message = "投稿ありがとうございます"

    article = request.form["article"]
    name = request.form["name"]

    # 日本標準時を取得します
    JST = timezone(timedelta(hours=+9), 'JST')
    now = datetime.now(JST)
    time = now.strftime('%Y-%m-%d %H:%M:%S %z')

    # 記事保存用のテキストファイルを開き、書き込みます
    file = codecs.open("articles.txt", "a", "utf-8")
    file.write(article + "," + name + "," + time + "\n")
    file.close()

    # 書き込んだ内容をhtmlテンプレートで表示します
    return render_template("bbs_result.html", message = message, article = article, name = name, time = time)

# アプリを実行
if __name__ == "__main__":
    # debugをTrueにセットするとdebug出力ができます。デプロイの際には除く
    # application.debug = True
    application.run()

layout.html 

htmlの共通部分を記述しています。

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>bond.mother掲示板</title>
        <style>body {padding: 10px;}</style>
    </head>
    <body>
        <p>時代はBond -layout.html</p>
        {% block content %}
        {% endblock %}
    </body>
</html>

bbs.html

メインのページです。

{% extends "layout.html" %}
{% block content %}
    <h1>bond.mother掲示板</h1>
    <p>{{ message }}</p>

    <form action="/result" method="post">
        <label for="article">投稿</label>
        <input type="text" name="article">
        <p></p>
        <label for="name">名前</label>
        <input type="text" name="name">
        <button type="submit">送信する</button>
    </form>

    <h2>投稿一覧</h2>

    <table>
    <tr><th>投稿</th><th>名前</th><th>時間</th></tr>
        {% for line in lines: %}
            {% set column = line.rstrip().split(",") %}
            <tr>
                {% for item in column: %}
                    <td>{{ item }}</td>
                {% endfor %}
            </tr>
        {% endfor %}
    </table>
{% endblock %}

bbs_result.html

投稿結果の表示をするページです。

{% extends "layout.html" %}
{% block content %}
    <h1>書き込みました</h1>
    <p>{{ message }}</p>
    <p>{{ article }} {{ name }} {{ time }}</p>

    <form action="/" method="get">
        <button type="submit">戻る</button>
    </form>
{% endblock %}

articles.txt

投稿されたデータを保存するカンマ区切りのテキストファイルです。

よろしくお願い致します.,bond.mother,2021-02-13 17:49:32 +0900
よろしくお願いします!,Bond,2021-02-13 18:01:37 +0900

AWS Elastic Beanstalkにデプロイ

 Elastic Beanstalkのインストール、設定については、「Flaskで作ったWebアプリをAWS Elastic Beanstalkにデプロイしてみた〜第1弾〜」の記事を確認してください。

ディレクトリ構成

 今回は、プロジェクトディレクトリとして ~/eb_bbs を作成しました。
ディレクトリ構成は以下の通りです。
「.ebignore」ファイルに関しては,第1回と同様に作成しました.

venvで仮想環境virtを作り、アクティブ化します。
その後、仮想環境下にFlaskをpipを使用してインストールします。

pipをupgradeした方が良いと表示されたので、とりあえずpip-21.0.1にアップグレードしました。

この段階でのディレクトリ構造は以下の様になっています。

「pip freeze」でインストールされたモジュールをチェックし、これをrequirements.txtに格納します。
そのときのディレクトリ構造も示しておきます。

動作確認

 それでは、ローカル環境で動作確認を行います。

少しエラーが出ていますが、掲示板としての動作には問題はありませんでした。
Ctrl+Cでサーバーを止めます。

デプロイ

 プロジェクトディレクトリで「eb init」 を実行し、EBアプリケーションを設定します。

プロンプト: の後に選んだ数字が表示されていない所は、デフォルトを選ぶために何も入力せずにreturnキーを押した所です。

この結果、プロジェクトディレクトリにEBの設定が作られます。この時点でディレクトリ構造は以下の様になっています。

それでは、EB環境を作成するために、「eb create [環境名]」を実行します.

エラーが出ました。
どうやら名前にアンダースコアが使用できない様です。アンダースコアの部分をハイフンに変えて実行します。

環境作成には2分39秒かかりました。
結果を、「eb open」で見てみましょう。

成功しました!

コメント

プロフィール

bond.fatherは、主にAI、Python、バイオインフォマティクスに関わっています。
bond.motherは、当ブログの管理者です。インフラから開発まで広く勉強中です。
当記事はbond.fatherが作成し、bond.motherが編集をしています。

bond.father & motherをフォローする
タイトルとURLをコピーしました