この記事は以下のような人向け
- Pythonがほんの少しだけ読み書きできる
- Flaskなんて見たことも使ったこともない
- SQLAlchemyなんて見たことも使ったこともない
- なんかわからんけどとりあえず動かしてみたい
Pythonanywhereアカウント作成~Flask導入
Pythonanywhereというレンタルサーバ?統合開発環境?が無料が使えます。
日本語版などもちろんありませんが、高校卒業レベルの英語が読めれば十分です。メッセージに従ってボタンを押すだけでFlask導入までやってくれます。
以下の記事で詳しく紹介されています。
DatabasesからMySQLを使えるようにしておいてください。(PostgreSQLは有料)
とりあえずflask_app.pyをいじってみる
PythonもFlaskもようわからんので、まずは最初から置いてある flask_app.py
でDB接続ができるようにしてみます。
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://cress:password@cress.mysql.pythonanywhere-services.com/cress$default?charset=utf8'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class Count(db.Model):
id = db.Column(db.Integer, primary_key = True)
count = db.Column(db.Integer, nullable = False)
def __repr__(self):
return '<Count %r>' % self.id
@app.route('/')
def hello_world():
count = Count.query.filter_by(id = 1).first()
if count is None:
count = Count(id = 1, count = 1);
db.session.add(count)
else:
count.count = count.count + 1
db.session.commit()
return render_template('index.html', count = count)
まずは初歩の初歩でアクセスカウンタのようなものを作ってみます。
countテーブルにレコードがあったらカウント+1、なかったらカウント1でレコード生成します。
いずれはMySQLのupsert機能で実現したいですね。
O/Rマッパーは一般的と思われるSQLAlchemyを採用しましたが、まったくわからんので以下のドキュメントを参考にしました。というかほとんどそのまんまです。
flask_app.py
に全部書くと肥大化して管理が大変になるのは目に見えていますが、まずは動かすところを目標にします。モジュール分割とかはそのうち。
テンプレートを作る
flask_app.py
の render_template()
で count
という引数を渡しているので、これをHTML出力できるようにする。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8"/>
<title>cress.py</title>
</head>
<body>
<h1>cress.py</h1>
<p>pythonanywhereのテストです。</p>
<p>あなたは{{count.count}}番目のお客様です。</p>
</body>
</html>
参考にしたのは以下のドキュメント。
データベースを初期化する
コンソールから以下のように入力するとテーブルが生成されます。
なお、テーブル削除するときは db.drop_all()
です。
from flask_app import db
db.create_all()
ModuleNotFoundError: No module named 'pymysql'
生成されませんでした。
pymysqlが無いと言われます。なのでインストールします。
bash起動してpipコマンドを実行するだけ。
pip install pymysql
インストールが済んだら、再度 db.create_all()
を実行します。
Reloadしてブラウザからアクセス
Web → Reloadボタンを押してアプリケーションを再読み込みします。
これを忘れると反映されません。
とりあえず画面が出ました。
課題
アプリケーションを再読み込み後、しばらく経ってからアクセスするとInternal Server Errorになる場合があり、再度アクセスすると解消します。そのうち対応します。
Lost connection to MySQL server during query
以下の方法で解決しました。