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

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

完成品

 「Flaskを使って Webアプリを作成して、AWS Elastic Beanstalkにデプロイしてみた」というテーマで第3弾まで記事を書いてきましたが、Elastic Beanstalkを複数デプロイすると月額費用が発生してしまうので、今回は「第3.1弾」と題しまして、「第2弾の掲示板」と「第3弾のメモ帳アプリ」を統合することにしました。

完成品は以下の通りです。

http://flask-env-memo.eba-ri4xsmz4.ap-northeast-1.elasticbeanstalk.com/

第2弾と第3弾の記事は、以下のリンクから確認してください。

Flaskのソースコード

 application.pyのソースコードは以下の通りです。
掲示板の表示ディレクトリを/bbs(このディレクトリはFlaskが生成します)にし、htmlファイルをそれぞれ編集して、掲示板とメモ帳が切り替えられるようにしました。
※htmlファイルの詳細は割愛します。

from flask import Flask, request, render_template, send_from_directory
from flask_sqlalchemy import SQLAlchemy
from flaskext.markdown import Markdown
import os
import codecs
from datetime import datetime, timedelta, timezone


application = Flask(__name__)
Markdown(application)

# flask_sqlalchemyによるデータベースへの接続情報
# MAMP用
# db_uri = 'mysql+pymysql://root:root@127.0.0.1:8889/memo?charset=utf8'
# EB(クラウド)用
db_uri = 'mysql+pymysql://' + os.environ['RDS_USERNAME'] + ':' + os.environ['RDS_PASSWORD'] + '@' + os.environ['RDS_HOSTNAME'] + ':' + os.environ['RDS_PORT'] + '/' + os.environ['RDS_DB_NAME'] + '?charset=utf8'
application.config['SQLALCHEMY_DATABASE_URI'] = db_uri
application.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(application)

# dbデータベースをPythonのオブジェクトにします
class Post(db.Model):
    __tablename__ = 'posts'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.Text())
    content = db.Column(db.Text())

# メモの一覧画面
@application.route('/')
def list():

    message = 'bond.motherメモ帳'
    posts = Post.query.all()

    return render_template('list.html', message = message, posts = posts)

# faviconを設定
@application.route('/favicon.ico')
def favicon():
     return send_from_directory(os.path.join(application.root_path, 'static'),
                               'favicon.ico', mimetype='image/vnd.microsoft.icon')

# id番目のメモを表示
@application.route('/show/<int:id>')
def show_post(id):

    message = 'Your memo ' + str(id)
    post = Post.query.get(id)

    return render_template('show.html', message = message, post = post)

# 新規メモ受付のための画面
@application.route('/new')
def new_post():

    message = 'New memo'
    return render_template('new.html', message = message)

# 新規メモの投稿を行う
@application.route('/create', methods=['POST'])
def create_post():

    message = 'Create your memo'

    new_post = Post()
    new_post.title = request.form['title']
    new_post.content = request.form['content']
    db.session.add(new_post)
    db.session.commit()

    post = Post.query.get(new_post.id)

    return render_template('show.html', message = message, post = post)

# メモの削除
@application.route('/destroy/<int:id>')
def destroy_post(id):

    message = 'Destroy your memo ' + str(id)

    destroy_post = Post.query.get(id)
    db.session.delete(destroy_post)
    db.session.commit()

    posts = Post.query.all()

    return render_template('list.html', message = message, posts = posts)

# メモの編集のための画面
@application.route('/edit/<int:id>')
def edit_post(id):

    message = 'Edit your memo ' + str(id)
    post = Post.query.get(id)

    return render_template('edit.html', message = message, post = post)

# メモの編集を行う
@application.route('/update/<int:id>', methods=['POST'])
def update_post(id):

    message = 'Update your memo ' + str(id)

    post = Post.query.get(id)
    post.title = request.form['title']
    post.content = request.form['content']
    db.session.commit()

    return render_template('show.html', message = message, post = post)

@application.route("/bbs")
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()

ディレクトリ構造

 統合したディレクトリ構造は以下の通りです。

これで上手く統合できて、AWSの料金も節約できました。

コメント

プロフィール

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

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