備忘録です。
今回は後にアプリへのアクセスを色々と制限したりするためにユーザーを登録するための備忘録です。ユーザー登録はユニークさとか、パスワードとか色々設定があるので分割して投稿。今回は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')))
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 %}
ユーザーの登録①は以上です。