【FLASK + PYTHON】DBにユーザー登録②

PYTHON

FLASKの環境で、データベースにユーザー登録するプログラムです。

前回はパスワードの登録が無かったので今回はパスワードを登録し、またログイン画面も加えます。

メインファイル

main.pyとして保存します。

from flask import Flask, render_template, request, redirect, url_for
from werkzeug.security import check_password_hash, generate_password_hash
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), nullable=False)
    email = db.Column(db.String(120), nullable=False)
    password = db.Column(db.String(256), nullable=False)


@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':

        username = request.form['username']
        email = request.form['email']
        password = request.form['password']

        hashed_password = generate_password_hash(password, method='sha256')

        user = User.query.filter_by(username=username).first()
        if user:
            return 'ユーザーが存在しています'

        new_user = User(username=username, email=email,
                        password=hashed_password)
        db.session.add(new_user)
        db.session.commit()

        return redirect(url_for('user_login'))

    return render_template('register.html')


@app.route('/login', methods=['GET', 'POST'])
def user_login():
    if request.method == 'POST':

        username = request.form['username']
        password = request.form['password']

        user = User.query.filter_by(username=username).first()
        if not user:
            return 'ユーザーが見つかりません'

        if not check_password_hash(user.password, password):
            return '無効なパスワード'

        return redirect(url_for('home'))

    return render_template('login.html')


@app.route('/')
def home():
    return 'ホームページ画面'


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

データベースが存在していなければ、作成しています。

登録画面 register.html

ユーザー登録する画面になります。templatesのフォルダに保存します。

<!DOCTYPE html>
<html>
  <head>
    <title>ユーザー登録</title>
  </head>
  <body>
    <h1>ユーザー登録</h1>
    <form method="POST" action="{{ url_for('register') }}">
      <label for="username">ユーザー名:</label>
      <input type="text" name="username" id="username" /><br /><br />

      <label for="email">Email:</label>
      <input type="email" name="email" id="email" /><br /><br />

      <label for="password">パスワード:</label>
      <input type="password" name="password" id="password" /><br /><br />

      <input type="submit" value="Register" />
    </form>
  </body>
</html>

ログイン画面 login.html

ログイン画面になります。templatesのフォルダに保存します。

<!DOCTYPE html>
<html>
  <head>
    <title>ログイン画面</title>
  </head>
  <body>
    <h1>ログイン画面</h1>
    <form method="POST" action="{{ url_for('user_login') }}">
      <label for="username">ユーザー名:</label>
      <input type="text" name="username" id="username" /><br /><br />

      <label for="password">パスワード:</label>
      <input type="password" name="password" id="password" /><br /><br />

      <input type="submit" value="Login" />
    </form>
  </body>
</html>
PYTHON
スポンサーリンク
シェアする
フォローする
タイトルとURLをコピーしました