2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PythonanywhereでFlaskを完全に理解する

Last updated at Posted at 2021-09-03

この記事は以下のような人向け

  • Pythonがほんの少しだけ読み書きできる
  • Flaskなんて見たことも使ったこともない
  • SQLAlchemyなんて見たことも使ったこともない
  • なんかわからんけどとりあえず動かしてみたい

Pythonanywhereアカウント作成~Flask導入

Pythonanywhereというレンタルサーバ?統合開発環境?が無料が使えます。
日本語版などもちろんありませんが、高校卒業レベルの英語が読めれば十分です。メッセージに従ってボタンを押すだけでFlask導入までやってくれます。
以下の記事で詳しく紹介されています。

DatabasesからMySQLを使えるようにしておいてください。(PostgreSQLは有料)

とりあえずflask_app.pyをいじってみる

PythonもFlaskもようわからんので、まずは最初から置いてある flask_app.py でDB接続ができるようにしてみます。

/home/cress/mysite/flask_app.py
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.pyrender_template()count という引数を渡しているので、これをHTML出力できるようにする。

/home/cress/mysite/templates/index.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ボタンを押してアプリケーションを再読み込みします。
これを忘れると反映されません。

2021-09-03.png

とりあえず画面が出ました。

課題

アプリケーションを再読み込み後、しばらく経ってからアクセスするとInternal Server Errorになる場合があり、再度アクセスすると解消します。そのうち対応します。

Lost connection to MySQL server during query

以下の方法で解決しました。

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?