ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

python: Flaskアプリの作成14 ユーザーの登録①

備忘録です。

今回は後にアプリへのアクセスを色々と制限したりするためにユーザーを登録するための備忘録です。ユーザー登録はユニークさとか、パスワードとか色々設定があるので分割して投稿。今回は1回目でメアドでユーザーのユニーク性を確認しつつフォームの下に登録したユーザーを表示してチェックするようにします。(パスワードは次回以降)

名前とメアドでユーザーを追加しDBに登録する

今回の備忘録では

  • 名前とメアドで登録
  • メアドでユニーク性を確認
  • 登録した人を表示

の3点を実装

 

その1 ユーザーテーブルの作成

# app.py

# ユーザー用モデル
class Users(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), nullable=False)
    email = db.Column(db.String(120), nullable=False, unique=True)
    u_created_at = db.Column(db.DateTime, default=datetime.now(pytz.timezone('Asia/Tokyo')))

    # Create A String
    def __repr__(self):
        return '<Name %r>' % self.name

※__repr__()はオブジェクトを文字列で返す特殊メソッド

repr(reprが入っているクラス())で呼び出せる。

 

こちらの記事がわかりやすい

Python __repr__メソッド | Delft スタック

 

その2 DBにプッシュ

$ flask db migrate -m 'add user model'
$ flask db upgrade

 

その3 フォームの作成

# app.py

# ユーザーを投稿するフォーム
class SchedulerForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])
    email = DateField('Email', validators=[DataRequired()])
    submit = SubmitField('Submit')

 

その4 各種ページの作成

ユーザーを登録するページ(パスワードなし)

※emailはユニークであるため同じemailのユーザーは存在しないように設定

# app.py

# ユーザーを登録するページ
@app.route('/user/add', methods=['GET', 'POST'])
def add_user():
    name = None
    form = UserFrom()
    if form.validate_on_submit():
        # ユニークチェック
        user = Users.query.filter_by(email=form.email.data).first()
        if user is None:
            user = Users(name=form.name.data, email=form.email.data)
            db.session.add(user)
            db.session.commit()
        name = form.name.data
        form.name.data = ''
        form.email.data = ''
    our_users = Users.query.order_by(Users.u_created_at)
    return render_template('add_user.html', form=form, name=name, our_users=our_users)

フォームが提出されると8行目でフィルタをかけてユーザーがユニークかどうかチェックさせている。それに合わせて条件分岐を行う。

 

add_user.html

{% extends "base.html"%}

{% block content %}
<br/>
<h1>ユーザー登録</h1>
<br/>
<div class="shadow p-3 mb-5 bg-body rounded">
  <form method="POST">
    {{ form.hidden_tag() }}

    {{ form.name.label(class="form-label") }}
    {{ form.name(class="form-control") }}
    <br/>

    {{ form.email.label(class="form-label") }}
    {{ form.email(class="form-control") }}
    <br/>

    {{ form.submit(class="btn btn-secondary") }}

  </form>
# formの下部に登録したユーザーを表示している {% for our_user in our_users %} {{ our_user.id }}-{{ our_user.name }} - {{ our_user.email }} <br/> {% endfor %} </div> {% endblock %}

 

ユーザーの登録①は以上です。