よくわkラン letting users login Section 11, Lecture 49

ログイン機能を改善する。

models.pyに以下を追記する ユーザーが入力したpasswordを渡すことでdbにあるハッシュと一致するかをチェックする。

    def check_password(self, password):
        return bcrypt.check_password_hash(self.user_password, password)

もし、一致しなかった場合はroutes.pyで一致しませんでしたとflashメッセージを表示させる。
user = User.query.filter_by(user_email=form.email.data).first()
user_email=form.email.dataについては、user_emailはDBの情報でform.email.dataはフォームからくる情報。
.first() でもし一致するものがない場合はnoneで返答される。
not userはもしユーザーがいない場合という意味である。
not user.check_passwordはパスワードが違う場合という意味である。

        if not user or not user.check_password(form.password.data):
            flash('Invalid Credentials, Please try again')
            return redirect(url_for('authentication.do_the_login'))

f:id:yukking3:20210504225144p:plain

一致した場合はリダイレクトさせる。

        login_user(user, form.stay_loggedin.data)
        return redirect(url_for('main.display_books'))

return redirect(url_for('authentication.do_the_login'))とする事でもう一度ログインをさせることが出来る。init.pyにイニシャライズする。 f:id:yukking3:20180506193032p:plain

session_protectionをstrongにする f:id:yukking3:20180506192907p:plain

SESSION_PROTECTION setting to None, "basic", or "strong"の3段階である。 https://flask-login.readthedocs.io/en/latest/

Flask-loginの説明 login manager and usermixin classes Section 11, Lecture 48

Flask Loginに関して f:id:yukking3:20180506184118p:plain

models.pyに以下を記述することで
login managerのloaderが使える。
int(id)にする必要がある。

今回はこの4つについて学ぶ
1. LoginManager
2. @login_manager.user_loader
3. load_user()custom method
4. UserMixin()

auth/forms.pyに関して
BooleanFieldを使うと次回以降自動ログインをすることが可能になる。

class LoginForm(FlaskForm):
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    stay_loggedin = BooleanField('stay logged-in')
    submit = SubmitField('LogIn')
  1. LoginManager
  2. @login_manager.user_loader
    1.2.についてはよくわからない。

    models.pyに以下を記述する事でセッションを行うことが出来る。
@login_manager.user_loader
def load_user(id):
    return User.query.get(int(id))
  1. UserMixin() ユーザーモデルに UserMixin を追加することでFlask-loginが使えるようになるらしい。 f:id:yukking3:20180506191209p:plain

重複確認 writing custom validations Section 11, Lecture 47

すでにデータが存在しているかを確認する方法

forms.pyで文字数や有効性を確認をしていた。
forms.pyに関数を作る→forms.pyのチェック機能に重複確認関数を追加する必要がある。

def email_exists(form, field):
    email = User.query.filter_by(user_email=field.data).first()
    if email:
        raise ValidationError('Email Already Exists')

forms.py側は email_existsを追加するだけである。

変更後:email = StringField('E-mail', validators=[DataRequired(), Email(), email_exists])
変更前:email = StringField('E-mail', validators=[DataRequired(), Email()])

また、from app.auth.models import Userのdbをimportして置く必要がある。

f:id:yukking3:20180506181025p:plain

実際に試すとこうなる。 f:id:yukking3:20180506181051p:plain

ユーザー登録のコード作成2 capturing user credentials using forms part 2 Section 11, Lecture 46

login.htmlを作る。
falseの場合はregistration.htmlに飛ばしてあげる。その場合はformも渡す。
f:id:yukking3:20180506174944p:plain

flashメッセージ

get_flash_messageに全てのメッセージが登録されている。
layout.htmlにflashを追加することで全てのページでflashメッセージを容易に表示させることが出来る。
f:id:yukking3:20180506174151p:plain

ユーザー登録のコード作成1 capturing user credentials using forms part 1 Section 11, Lecture 45

route.pyのまとめ

次の順で処理される。
1. localhost/registerにアクセスする。
2. return render_template('registration.html', form=form)でページを表示させる。
3. HTMLからPOSTでname,emai,passwordが飛んでくる。 4. if form.validate_on_submit():で問題ないかチェックする。
5. 問題なければmodel.pyのuserクラスとcreate_user関数を呼び出してdbで保存する。
4. returnがTrueならflash('Registration Successful')が表示する。
5. returnがFalseならリダイレクトするreturn redirect(url_for('authentication.do_the_login'))


順位に説明

GETでとってフォームを表示する。 f:id:yukking3:20180506172218p:plain
次にIF文を追加してvalidationでチェックする。

f:id:yukking3:20180506172401p:plain
userクラスをimportする f:id:yukking3:20180506172452p:plain

forms.pyからroutes.pyにデータが送られる。 f:id:yukking3:20180506172818p:plain

flashをimportするとメッセージを表示させうることができる。

フォームの作り方 adding data validation to the registration process Section 11, Lecture 44

validatorsを使う事でルール通りしか受け付けないようにする。 f:id:yukking3:20180506171537p:plain

まとめ f:id:yukking3:20180506171416p:plain この4つの順に作ればフォームはできる。
1.フォームを作る
2.routeで登録する
3.dbのテーブルを定義する
4.htmlを作成する