見出し画像

Flask Web Development P75~85 Summary

今まで作ったフォルダとコードを以下の構造に分けて、今後使いやすいように整理整頓していきましょう。
本記事を作成する際に参考にした答え合わせページ

|-flasky
  |-app/
    |-templates/
    |-static/
    |-main/
      |-__init__.py
      |-errors.py
      |-forms.py
      |-views.py
    |-__init__.py
    |-email.py
    |-models.py
  |-migrations/
  |-tests/
    |-__init__.py
    |-test*.py
  |-venv/
  |-requirements.txt
  |-config.py
  |-manage.py

①設定した内容を保存するconfig.pyを作ります。

import os
basedir = os.path.abspath(os.path.dirname(__file__))


class Config:
   SECRET_KEY = os.urandom(32)
   MAIL_SERVER = 'smtp.gmail.com'
   MAIL_PORT = 587
   MAIL_USE_SSL = False
   MAIL_USE_TLS = True
   MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
   MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
   FLASKY_MAIL_SUBJECT_PREFIX = 'Tanuki '
   FLASKY_MAIL_SENDER = 'Tanuki yo-ri'
   FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
   SQLALCHEMY_TRACK_MODIFICATIONS = False

   @staticmethod
   def init_app(app):
       pass


class DevelopmentConfig(Config):
   DEBUG = True
   SQLALCHEMY_DATABASE_URI = 'mysql://root:geomagnetic8@localhost/flask'


class TestingConfig(Config):
   SQLALCHEMY_DATABASE_URI = 'mysql://root:geomagnetic8@localhost/flasktest'


class ProductionConfig(Config):
   SQLALCHEMY_DATABASE_URI = 'mysql://root:geomagnetic8@localhost/flask'


config = {
   'development': DevelopmentConfig,
   'testing': TestingConfig,
   'production': ProductionConfig,
   'default': DevelopmentConfig
   }

・ここで、@staticmethod(staticmethod デコレータ)は、そのクラスでしか使わない関数を定義する時に使います。

・SQLALCHEMY_COMMIT_ON_TEARDOWNは公式ページから削除されていますので、削除しておきましょう。(公式ページ:https://flask-sqlalchemy.palletsprojects.com/en/2.x/config/)
・その代わり、SQLALCHEMY_TRACK_MODIFICATIONS=Tureとしておけば、SQLALCHEMY_COMMIT_ON_TEARDOWNの代わりに自動でdatabaseの更新を追いかけてもらえますが、メモリを食うので今のところFalseとしておきます。

今のことろ、init_app()は空のままにしています。

②hello.pyから
②-1 Database関連のコードmodels.py
②-2 Email関連のコードemail.py
を分離してappのフォルダ以下に保存します。

②-1: models.pyはこんな感じ

from .. import db


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')

   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'))

   def __repr__(self):
       return '<User %r>' % self.username

②-2: email.pyはこんな感じ

from threading import Thread
from flask import current_app, render_template
from flask_mail import Message
from . import mail


def send_async_email(app, msg):
   with app.app_context():
       mail.send(msg)


def send_email(to, subject, template, **kwargs):
   app = current_app._get_current_object()
   if app.config['FLAKY_ADMIN']:
       msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + subject,
                 sender=app.config['FLASKY_MAIL_SENDER'], recipients=[to])
       msg.body = render_template(template + '.txt', **kwargs)
       msg.html = render_template(template + '.html', **kwargs)
       thr = Thread(target=send_async_email, args=[app, msg])
       thr.start()
       return thr

・if app.config['FLAKY_ADMIN']のif文がindex関数ではなくemail.pyの方に含まれていることに注意してください。

つづく...




この記事が気に入ったらサポートをしてみませんか?