python: FlaskでDBにデータを登録する

プログラミング
スポンサーリンク




こんにちは、おみです。

Flaskで、webページの入力値をDBに登録する機能を作成しました。

スポンサーリンク

環境

  • macOS: 10.12.6
  • python: 3.7.4

ライブラリ

下記のライブラリを使用しますので、anacondaやpipでインストールしておいてください。

  • Flask
  • PyMySQL
  • SQLAlchemy
  • mysql-connector-python

画面フロー

ログイン画面で

  • usernameに”admin”
  • passwordに”default”

を入力し、Loginボタンを押すとログインできます。

作業名称に入力し、Registrationボタンを押すと、DBに作業名が登録されます。

登録している作業は、リスト形式で一覧表示されます。

ソースコード

DBにデータ登録を行っている部分は赤色で記述しています。

↓ファイル構造です。(gitを使っているため、不要なものもあります)

flask.py

# all the imports
import dao
from flask import Flask, request, session, g, redirect, url_for, \
    render_template, flash

# configuration
DATABASE = 'mysql+pymysql://root:@127.0.0.1/example_db'
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'

# create our little application :)
app = Flask(__name__)
app.config.from_object(__name__)

app.config.from_envvar('FLASKR_SETTINGS', silent=True)


# 画面表示用メソッド

@app.route('/')
def show_entries():
    task_dao = dao.Dao()
    list = task_dao.get()
    return render_template('show_entries.html', entries=list)


# ログイン用メソッド

@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] != app.config['USERNAME']:
            error = 'Invalid username'
        elif request.form['password'] != app.config['PASSWORD']:
            error = 'Invalid password'
        else:
            session['logged_in'] = True
            flash('ログインしています')
            return redirect(url_for('show_entries'))
    return render_template('login.html', error=error)


# ログアウト用メソッド

@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    flash('ログアウトしています')
    return redirect(url_for('show_entries'))


# 作業登録用メソッド

@app.route('/registration', methods=['GET', 'POST'])
def registration():
    error = None
    if request.method == 'POST':
        if request.form['name'] is None:
            error = '作業名称を入力してください'
        else:
            task_dao = dao.Dao()
            task_dao.add(request.form["name"])
            list = task_dao.get()
            return render_template('show_entries.html', entries=list)
    return render_template('login.html', error=error)


if __name__ == '__main__':
    app.run()

dao.py

# ①必要なモジュールをインポート
import sqlalchemy.ext.declarative
import sqlalchemy.orm


# クラス
class Dao(object):
    # メタクラスの生成
    Base = sqlalchemy.ext.declarative.declarative_base()

    # テーブル: Task用クラス
    class Tasks(Base):
        __tablename__ = "tasks"
        id = sqlalchemy.Column(
            sqlalchemy.Integer, primary_key=True, autoincrement=True
        )

        name = sqlalchemy.Column(
            sqlalchemy.String(30)
        )

    # コンストラクタ
    def __init__(self):
        # エンジンの生成
        self.engine = sqlalchemy.create_engine("mysql+pymysql://root:@127.0.0.1/example_db")

        # 定義したテーブル情報をDBと紐付ける(紐づくテーブルがない場合、生成される。)
        self.Base.metadata.create_all(self.engine)

        Session = sqlalchemy.orm.sessionmaker(bind=self.engine)
        self.session = Session()

    # レコード一覧を取得する
    def get(self):
        return self.session.query(self.Tasks).all()

    # レコードを登録する
    def add(self, name):
        task = self.Tasks(name=name)
        self.session.add(task)
        self.session.commit()

layout.html

<!doctype html>
<title>作業リスト</title>
<div class=page>
<h1>作業リスト</h1>
<div class=metanav>
{% if not session.logged_in %}
<a href="{{ url_for('login') }}">log in</a>
{% else %}
<a href="{{ url_for('logout') }}">log out</a>
{% endif %}
</div>
{% for message in get_flashed_messages() %}
<div class=flash>{{ message }}</div>
{% endfor %}
{% block body %} {% endblock %}
</div>

login.html

{% extends "layout.html" %}
{% block body %}
<h2>Login</h2>
{% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
<form action="{{ url_for('login') }}" method=post>
<dl>
<dt>Username:
<dd><input type=text name=username>
<dt>Password:
<dd><input type=password name=password>
<dd><input type=submit value=Login>
</dl>
</form>
{% endblock %}

show_entries.html

{% extends "layout.html" %}
{% block body %}
  {% if session.logged_in %}
  <ul class=entries>
  {% for entry in entries %}
    <li>{{ entry.id }}:{{ entry.name }}
  {% else %}
    <li><em>登録されている作業はありません。</em>
  {% endfor %}
  </ul>
  <form action="{{ url_for('registration') }}" method=post>
    <dl>
      <dt>作業名称:
      <dd><input type=text name=name>
      <dd><input type=submit value=Registration>
    </dl>
  </form>
  {% endif %}

{% endblock %}

オススメの書籍

Pythonフレームワーク Flaskで学ぶWebアプリケーションのしくみとつくり方

webアプリケーションの開発に必要な、

  • サーバサイドの開発技術
  • フロントエンドの開発技術
  • データベース技術

を学ぶ事ができ、開発を行うために必要な知識を一通り手に入れる事ができます。

ソシムの書籍はどれも初心者にわかりやすく書かれているのでお勧めの1冊です。

コメント

タイトルとURLをコピーしました