Flask Tutorial やったらまたハマった話(マイクロブログ作成編)

f:id:cyclemem:20180804225938p:plain

こんばんは。今日は勉強ログです。前回の続きです。

www.taikomegane.com

前回のあらすじ

前回ふと思いたちFlask Tutorialを始めたものの、環境構築でめちゃくちゃつまづいて、それを解決したところまでで終了してます。 今回はこの章を終わらせようと思っています。

2. Flaskチュートリアル — study flask 1 ドキュメント

今回やったこと

  • flaskrというマイクロブログアプリ?の開発準備
  • flaskrの最低限の機能開発(投稿機能+表示機能)

ひっかかったところ

今回は1箇所だけ引っかかったものの、他はすいすいと進みましたので、躓いたところだけ紹介します。 今回ひっかかったのは「データベース連携の部分(FlaskでSQLAlchemyを利用するのにつまづいた)」でした。

チュートリアルでいうと、Step1のこの超序盤。 f:id:cyclemem:20180804230437p:plain

ここで散々ひっかかりました。

前提条件

まずはStep1を記載の通りにコピペして、実行もチュートリアル通り進めました。 エラーが出たのは「from flaskr.models import init」の実行時です。

ちなみにinit.pyの中身はこの通り。

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_object('flaskr.config')

db = SQLAlchemy(app)

import flaskr.views

エラー1

>>> from flaskr.models import init

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/taikomegane/tutorial/flaskr/__init__.py", line 2, in <module>
    from flask.ext.sqlalchemy import SQLAlchemy
ModuleNotFoundError: No module named 'flask.ext'

なるほど。init.pyの2行目でインポートしている部分、flask.extなんてものはないとのこと。

エラー2

ちょっと勘で次のように書き換える。

from flask import Flask
from sqlalchemy import SQLAlchemy

(あとは同じ)

まあ勘だから期待してないものの、念の為実行。

>>> from flaskr.models import init

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/taikomegane/tutorial/flaskr/__init__.py", line 2, in <module>
    from sqlalchemy import SQLAlchemy
ImportError: cannot import name 'SQLAlchemy'

勘でやった割にはエラーが変わっている。sqlalchemyはあるけど、SQLAlchemyなんて名前のものはインポートできないそう。

エラー3

勘でやったエラー2は無視して、エラー1のコードを調べてみるとこんな記事が。

www.limemo.net

どうも次のように書き換えればいけるらしいので、修正する。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

(あとは同じ)

これでいけるはずと期待して実行するも下記。

>>> from flaskr.models import init

/usr/local/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py:794: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '

また出来ない!と嘆きながらエラーコードを調べる。

正解

実はエラー3はエラーではなくwarningとのこと。確かにエラー文よく見ると書いてある。

Flaskにさわってみた | blog.PanicBlanket.com

こちらの記事に書いてあるように、config.pyで許可を出してあげればいけるらしい。

SQLALCHEMY_DATABASE_URI = 'sqlite:///flaskr.db'
SECRET_KEY = 'secret key'
SQLALCHEMY_TRACK_MODIFICATIONS = True

こんな感じで「SQLALCHEMY_TRACK_MODIFICATIONS = True」を一文追加して改めて実行する。

>>> from flaskr.models import init
>>> init()

無事エラー出ない!これで解決した。

今日の成果

上のえラーで躓いた以外は特に問題なく2章は終了。今画面はこんな感じ。 f:id:cyclemem:20180804231547p:plain

ちなみにですが、Dockerからこの環境にアクセスしているので、manage.pyの中身は書き換えてます。これが後々のエラーにつながらなければいいけど。 詳しくはこちら

www.taikomegane.com

またこの状態になってると、一つ一つのアクションにステータスコードが返ってきて楽しい。

f:id:cyclemem:20180804231655p:plain

ちょうど今「WEBを支える技術」という本でステータスコードについて勉強したところなので、こういう実際に動いているシステムで確認ができるのはいいね。

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

それでは本日はここまで。また続き頑張っていきます。 最後までお付き合いいただきありがとうございました。