[Python Flask] パスワードを使用したログインページの作成方法

Flask
スポンサーリンク

こんにちは。

この記事では、PythonのFraskを使用したログインページの作成方法を書きます。

IDとパスワードが一致していたらログイン、一致していなかったらログインできないような
普段良く見るページを作成しました。

この記事が誰かの役に立ったら幸いです。

スポンサーリンク

概要

作成したログインページは以下です。
(デザインはダサいので、後日デザインのレベルアップはしようと思っています)

良くみるページですね。

これにIDとパスワードを入れて、一致していればログイン、一致してなければその旨を表示するようなページを作りました。

例えば、↑のようにIDとパスワードを打ち込んでみます。
(パスワードが・・・・になるのは、標準でHTMLに用意されており、かなり簡単に作成できました。)

成功すると、Login完了!!の文字と、Logoutできるような機能を実装しました。

もし、IDもしくはパスワードを間違えた場合は、「パスワードが違います」と表示できるよにしています。

それでは、実際にどのようなコードで実装したのか解説していきたいと思います。
全てのコードは一番下に載せておきますので、もし見たい人がいればご参考ください。

実装したコードと解説:ログイン画面

Fraskスクリプト①:GET

@app.route(‘/login’, methods=[‘GET’])
def login(): 
   return render_template(‘login.html’,\
        titile=’Login’,\
        message=’IDとPasswordを入力してください:’,\ 
         id=”                )

まず、このコードで、関数loginを定義して、login画面のurlと呼び出すHTMLを定義します。

Fraskスクリプト②:POST

@app.route(‘/login’, methods=[‘POST’])
def login_post():
    global menber_data
    id = request.form.get(‘id’)
    pswd = request.form.get(‘pass’)
    if id in member_data:
        if pswd == member_data[id]:
            session[‘login’] = True
        else:           
   session[‘login’] = False
    else:
       member_data[id] = pswd 
       session[‘login’] = True
        session[‘id’] = id
    if  session[‘login’]:
        return redirect(‘/’)
    else:
          return render_template(‘login.html’,\
        titile=’Login’,\ 
           err=False,\
        message=’パスワードが違います’,\ 
               id=”            )

次に、このIDとパスワードが入力された後の動作を記述しています。

主な内容

IDが登録済みの場合
パスワードとIDが一致していれTrue(ログインする)し、そうでなけばFalse(ログインしない)とする

IDが登録未の場合
新規に登録し、True(ログインする)とする

True(ログインする)の場合、URL ./に移動し、Falseの場合 URLは./login/のままで、パスワードが違いますと
表示させる。

実装したコードと解説:ログイン後の画面

Fraskスクリプト③:GET

@app.route(‘/’, methods=[‘GET’])
def index():
global message_data
if ‘login’ in session and session[‘login’]:
msg = ‘login ID:’ + session[‘id’]
return render_template(‘messages.html’,\
titile=’Messages’,\
message=msg, \
data=message_data)
else:
return redirect(‘/login’)

このコードでindex関数を定義して、messages.htmlを表示させるようにしています。
また、sessionを利用して、保存している入力したIDを表示させるようにしています。

実装したコードと解説:ログアウト後の画面

Fraskスクリプト④:POST

@app.route(‘/logout’,methods=[‘GET’])
def logout():
session.pop(‘id’,None)
session.pop(‘login’)
return redirect(‘/login’)

このコードで./logutにアクセスした場合、保存しているIDを削除して、./loginのページへ移動するように記述しています。

実装いたコードと解説:グローバル変数

member_data={}
message_data=[]

今回グローバル変数として上記2つを定義しました。

全コード:Frask,HTML,CSS

如何でしたでしょうか?上記では、今回作成したコードで肝となる箇所の説明を実施しました。

HTML/CSS含めて全てのコードも一応載せておきたいと思います。
もし、誰かの参考になったら嬉しいなー

Fraskの全コード

Fraskの全コードは以下になります。

from flask import Flask, render_template, request, session, url_for, redirect
from flask.views import MethodView
import random

app = Flask(__name__)
app.secret_key = b'random string...'

member_data ={}
message_data = []

@app.route('/', methods=['GET'])
def index():
    global message_data
    if 'login' in session and session['login']:
        msg = 'login ID:' + session['id']
        return render_template('messages.html',\
            titile='Messages',\
            message=msg, \
                data=message_data)
    else:
        return redirect('/login')

@app.route('/login', methods=['GET'])
def login():
    return render_template('login.html',\
        titile='Login',\
            err=False,\
        message='IDとPasswordを入力してください:',\
                id=''
                )

@app.route('/login', methods=['POST'])
def login_post():  
    global menber_data
    id = request.form.get('id')
    pswd = request.form.get('pass')
    if id in member_data:
        if pswd == member_data[id]:
            session['login'] = True
        else:
            session['login'] = False
    else:
        member_data[id] = pswd
        session['login'] = True
        session['id'] = id

    if  session['login']:
        return redirect('/')
    else:  
        return render_template('login.html',\
        titile='Login',\
            err=False,\
        message='パスワードが違います',\
                id=''
            )

@app.route('/logout',methods=['GET'])
def logout():
    session.pop('id',None)
    session.pop('login')
    return redirect('/login')
    
if __name__ == '__main__':
    app.debug=True
    app.run()

HTMLの全コード

htmlの全コードを載せておきます。
今回htmlとしてはログイン画面、ログイン後画面、共通レイアウトの3つ用意しています。

ログイン画面のHTML

{% extends "layout.html" %}
{% block title %}
Login
{% endblock %}
{% block headline %}
{{title}}
{% endblock %}
{% block content %}
<p>{{message}}</p>
    <form method="post" action="/login">
        <div>
        ID
        <input type="text" name="id" value="{{id}}" style="height:30px;">
        Password
        <input type="password" name="pass"  style="height:30px;">
        <input type="submit" value="login" style="font-size: 20px;">
        </div>
    </form>
{% endblock %}
{% block footer %}
<br>coryright 2020 Rope_blog</br>
{% endblock %}

ログイン後画面のHTML

{% extends "layout.html" %}
{% block title %}
message
{% endblock %}

{% block headline %}
{{title}}
{% endblock %}

{% block content %}
<div class="logout"><a href="/logout">Logout</a></div>
<p>{{message}}</p>
<form method="post" action="/">
Login 完了!!
<!-- <input type="test" name="comment"width="80">
<input tyep="submit" value="POST NOW!"> -->
</form>
<u1>
    {% for item in data | reverse %}
    <li>{{item[1]}}({{item[0]}})</li>
    {% endfor %}
</u1>
{% endblock %}

{% block footer %}
coryright 2020 Rope_blog
{% endblock %}

共通レイアウト

<!doctype html>
<html lang="ja">
<head>
    <title>{% block title %}{% endblock %}</title>
    <meta charset="utf-8"/>
    <link rel="stylesheet"
        href="{{url_for('static', filename='style.css')}}">
</head>
<body>
    <div class="test">
        <div class="target">
            <h1 style="font-size: 50px;">{% block headline %}{% endblock %}</h1>
                <div style="font-size: 40px;">{% block content %}{% endblock %}</div>
                <div class="footer">
                    {% block footer %}{% endblock %}
                </div>
        </div>
    </div>
</body>
</html>

CSS

最後い共通のCSSのコードも載せておきます。

html,body {height:100%;}
div.test{
    display:table;
    width:100%;
    height:100%;
    background-color:rgb(135, 219, 252);
    text-align:center;
    }
  div.test .target{
    display:table-cell;
    vertical-align:middle;
    font-size: 30px;
    } 
div.footer{
    font-size: 20px;
    border-bottom: 10px solid rgb(135, 250, 196);
    text-align:right;
    } 

コメント

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