あちこちのサイトを見て回りなんとなく感触がつかめてきたので、本格的に作り込んでいこう。
まず、現状コードを1枚のスクリプトに全部乗っけているが、今後データベースなど拡張していくといらんところを弄って混乱を招く可能性が増えるので、パートごとに別ファイルとして相互にimportで参照する形にしていく。
manage.py→アプリの起動に関わる部分、全体を統括するスクリプト
models.py→データベースの定義など
view.py→web画面を描画するスクリプト
form.py→検索、入出力関係のスクリプト
の4つに分けてみる。
設定ファイルとしてconfig.pyを分けてもいいが、とりあえず各設定は関連するスクリプトに直接置くことにする。
いけるかな?とおもってやってみるとどうもうまくいかない。問題を切り分けるために、一度にあれこれ変えず、やはりステップバイステップでやるしかないのか。
これまでにできていたスクリプトを2分割してみる
models.py
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Role(db.Model): __tablename__ = 'roles' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) users = db.relationship('User', backref='role', lazy='dynamic') def __repr__(self): return '<Role %r>' % self.name class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, index=True) role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) sex = db.Column(db.String(64)) pos = db.Column(db.String(64)) test = db.Column(db.Float) test2 = db.Column(db.Float) score = db.Column(db.Integer) def __repr__(self): return '<User %r>' % self.username
分割する前は
db = SQLAlchemy(app)
だったところが
db = SQLAlchemy()
こうなっている。
また、こちらで定義した部分をインポートしてやる必要があるので
manage.pyの方は
from flask import Flask, render_template, session, redirect, url_for from flask_script import Manager, Shell from flask_bootstrap import Bootstrap from flask_moment import Moment from flask_wtf import FlaskForm from wtforms import StringField, SubmitField from wtforms.validators import Required from flask_migrate import Migrate, MigrateCommand from models import db, User, Role #ココでインポート app = Flask(__name__) app.config['DEBUG'] = True app.config['SECRET_KEY'] = 'hard to guess string' app.config['SQLALCHEMY_DATABASE_URI'] =\ 'mysql+pymysql://root:password@localhost/flaskdata' app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db.init_app(app) #ココが増えている manager = Manager(app) bootstrap = Bootstrap(app) moment = Moment(app) migrate = Migrate(app, db) class NameForm(FlaskForm): name = StringField('What is your name?', validators=[Required()]) submit = SubmitField('Submit') def make_shell_context(): return dict(app=app, db=db, User=User, Role=Role) manager.add_command("shell", Shell(make_context=make_shell_context)) manager.add_command('db', MigrateCommand) @app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404 @app.errorhandler(500) def internal_server_error(e): return render_template('500.html'), 500 @app.route('/', methods=['GET', 'POST']) def index(): form = NameForm() if form.validate_on_submit(): user = User.query.filter_by(username=form.name.data).first() if user is None: user = User(username=form.name.data) db.session.add(user) session['known'] = False else: session['known'] = True session['name'] = form.name.data return redirect(url_for('index')) return render_template('index.html', form=form, name=session.get('name'), known=session.get('known', False)) if __name__ == '__main__': manager.run()