完成品
「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の料金も節約できました。
コメント