takuminatyan
@takuminatyan

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Flask、おそらくsessionにきちんと保存されていません

初心者です。ロリポップのレンタルサーバーを借りてFlaskでwebアプリを作ろうとしているのですが、hogehoge.comにアクセスし、ログインページに正しいメアドとパスワードを入力してもログイン処理がうまく行きません。
うまくログインできるとtop.htmlの内容が表示されるはずですが、okashii.htmlの画面が表示されます。
ちなみに、自分のパソコンのターミナルからapp.pyをpythonで実行するとうまくログインできます。
おそらくsessionに情報が保存されていないと思うのですが、どのようにすれば解決できるのか、ご教授いただけますでしょうか。まだ初めたばかりで、くだらない質問かもしれませんが、よろしくおねがします。

階層
hogehoge.com
├templates
|| login.html
|| shippai.html
|| top.html
|└ okashii.html
|app.py
|login.py
|index.cgi
└.htaccess

app.py

from flask import Flask, render_template, redirect, request
import login
import secrets

app = Flask(__name__)
secret = secrets.token_urlsafe(32)
app.secret_key = secret

#最初のログイン画面
@app.route('/')
def login():
    return render_template('login.html')

#ログイン直後
@app.route('/try_login', methods=['POST'])
def try_login():
    mail = request.form.get('mail','')
    pw = request.form.get('pw','')
    if login.try_login(mail, pw):
        return redirect('/index.cgi/top')

    return render_template('shippai.html')

#ログイン後のトップページ
@app.route('/top')
def top():
    #ログインしてるかどうか
    if not login.is_login():
        return render_template('okashii.html')#これが何回やっても表示されます#

    return render_template('top.html')

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

login.py

from flask import session

# ログインしているか調べる
def is_login():
    return 'mail' in session

# ログイン処理
def try_login(mail, pw):
    # 該当ユーザーか?
    if mail != 'a@gmail.com': return False
    # パスワードが合っているか?
    if pw != 'aaaaaaaa': return False
    # ログイン処理
    session['mail'] = mail
    return True

index.cgi

#!/usr/local/bin/python3
from wsgiref.handlers import CGIHandler
from app import app
CGIHandler().run(app)

.htaccess

<ifmodule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$       https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTPS}     off
RewriteRule ^(.*)$       https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\index.cgi -f
RewriteRule ^(.*)$ $1index.cgi [L]
</ifmodule>

login.html

<!DOCTYPE html>
<html lang="ja"><head><meta charset="UTF-8">
  <meta name="viewport"
    content="width=device-width, initial-scale=1.0">
  <title>ログインページ</title>
</head><body><div>
  <h1>ログインページ<h1>
  <form action="/index.cgi/try_login" method="POST">
    <legend>メールアドレスとパスワードを入力してください</legend>
    <fieldset>
    <ul>
     <li>
      <label for="mail">メールアドレス</label>
      <input type="text" name="mail" id="mail">
     </li>

     <li>
      <label for="pw">パスワード</label>
      <input type="password" name="pw" id="pw">
     </li>
     </ul>

      <button type="submit">
      ログイン</button>
    </fieldset>
  </form>
</div></body></html>

shippai.htmlとokashii.htmlの内容はおそらく関係ありませんので省略させていただきます。

okashii.htmlが表示されるということは、おそらく、ログイン処理はうまくいっているのですが、/index.cgi/topにアクセスした際の、ログインしているかどうかの確認がうまくいっていないものと思われます。自分のパソコンのターミナルでapp.pyを実行するとうまくいくのですが、、、

0

1Answer

app = Flask(__name__)
secret = secrets.token_urlsafe(32)
app.secret_key = secret

の部分で起動時にapp.secret_keyにランダムなトークンを入れてますが、index.cgiからのアクセスでは毎回この値が変わってしまうため、セッションCookieの検証に失敗しているものと思われます。

app.secret_key = "secret key"

のようにsecret_keyを固定の(任意の)値にすることで改善するかもしれません。

1Like

Comments

  1. @takuminatyan

    Questioner

    ありがとうございます。
    うまく行きました!本当に助かりました!
    なるほど、index.cgiからでは毎回値が変わっていたのが原因だったのですね!
    勉強になります。ありがとうございました。

Your answer might help someone💌