質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

117閲覧

python flask sessionが保存されない。

two_

総合スコア10

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2025/01/12 17:06

実現したいこと

/login又は/verify-code(signup)でsessionを保存させてますが、ログイン処理を終えた後もセッションの値がnoneになってしまっています。sessionを/loginで確実に保存させるようにしたいです

発生している問題・分からないこと

session['sds']にユーザーidが保存されず、/checksession出、常にログインしてない
が返されてしまう。

エラーメッセージ

error

1ログインされていません

該当のソースコード

python

1#login 2@app.route('/login', methods=['GET', 'POST']) 3def logins(): 4 line_notify('ログインページ') 5 if request.method == 'POST': 6 line_notify('postのログインページ') 7 email = request.form.get('email') 8 line_notify(email) 9 password = request.form.get('password') 10 11 # SQLite データベース接続 12 conn = sqlite3.connect('test.db') 13 cursor = conn.cursor() 14 line_notify('ログイン認証行います') 15 user_id = loginn(email, password) # loginの処理は仮の関数 16 17 line_notify('ログイン認証行いました。ユーザーID⬇️') 18 line_notify(user_id) 19 if user_id: 20 session["sds"] = user_id 21 session["afiid"] = user_id # 仮の処理 22 app.permanent_session_lifetime = timedelta(days=365000) 23 session.permanent = True 24 return jsonify({"success": True}) 25 26 else: 27 line_notify('ログイン情報違う') 28 return jsonify({"error": "ユーザー名またはパスワードが正しくありません。"}) 29 30 return render_template('login.html') # GETリクエストの場合のHTML表示 31 32

python

1#/signupと認証フローも一応 2@app.route('/signup', methods=['GET', 'POST']) 3def signup(): 4 gamelist = read_gameslist() 5 if "sds" in session: 6 annid = session["sds"] 7 else: 8 annid = "mpmgigmpmgmmpmgdgmg" 9 announcements = get_announcements_by_user(annid, page=1) 10 11 if "sds" in session: 12 return redirect('/') 13 14 if request.method == 'POST': 15 try: 16 username = request.form.get('username') 17 email = request.form.get('email') 18 password = request.form.get('password') 19 20 if check_mail(email): 21 print("存在するので。") 22 return jsonify({"error": "このメールアドレスは既に登録されています。別のメールアドレスを使用してください。"}) 23 24 25 # SQLite データベース接続 26 27 28 # 新しいデータを挿入(仮保存、確認コード認証後に確定) 29 # SQLite データベース接続 30 31 32 33 34 35 # 新しいデータを挿入(仮保存、確認コード認証後に確定) 36 37 # 確認コード生成 38 session.permanent = False 39 verification_code = random.randint(10000, 99999) 40 session["verification_code"] = verification_code 41 session["username"] = username 42 session["email"] = email 43 session["password"] = password 44 app.permanent_session_lifetime = timedelta(seconds=120) 45 # メール送信 46 context = {"username": username, "code": verification_code} 47 send_email( 48 subject="Your Verification Code", 49 recipient=email, 50 template_path="mail/verification_email.html", 51 context=context, 52 ) 53 54 return jsonify({"success": "成功"}) 55 56 if "next" in session: 57 rid = session["next"] 58 return redirect(f'/{rid}') 59 session.pop("next", None) 60 return redirect(url_for("verify_code")) 61 62 except Exception as e: 63 conn.rollback() # トランザクションをロールバック 64 print(e) 65 return str(e) 66 67 return render_template("signup.html", announcements=announcements) 68 69 70@app.route('/verify-code', methods=['GET', 'POST']) 71def verify_code(): 72 if request.method == 'POST': 73 verification_code = request.form.get('verificationCode') 74 75 # セッションに保存された確認コードと照合 76 if session.get('verification_code') == int(verification_code): 77 # 確認コードが一致した場合、ユーザーのサインアップを完了 78 79 username = session.get('username') 80 email = session.get('email') 81 password = session.get('password') 82 if check_mail(email): 83 return jsonify({"error": "このメールアドレスは既に登録されています。別のメールアドレスを使用してください。"}) 84 85 86 try: 87 # SQLite データベースに接続してユーザーの情報を確定 88 89 90 91 session.pop('verification_code', None) # 確認コードをセッションから削除 92 session.pop('username', None) # ユーザー名をセッションから削除 93 session.pop('email', None) # メールアドレスをセッションから削除 94 session.pop('password', None) # パスワードをセッションから削除 95 96 97 ID = generate_random_string(13) 98 date1 = datetime.now().strftime('%Y-%m-%d %H:%M:%S') 99 100 # SQLite データベース接続 101 conn = sqlite3.connect('test.db') 102 cursor = conn.cursor() 103 104 # テーブル作成 105 cursor.execute(''' 106 CREATE TABLE IF NOT EXISTS test ( 107 id TEXT NOT NULL, 108 name TEXT NOT NULL, 109 mail TEXT NOT NULL, 110 pass TEXT NOT NULL, 111 icon TEXT NOT NULL, 112 date TEXT, 113 afi TEXT DEFAULT NULL, 114 afikinngaku INT DEFAULT 0, 115 zanndaka INT DEFAULT 0, 116 data3 TEXT DEFAULT NULL, 117 accountcount TEXT DEFAULT 0, 118 allrev INT DEFAULT 0, 119 goodrev INT DEFAULT 0, 120 badrev INT DEFAULT 0, 121 data8 TEXT DEFAULT NULL 122 ) 123 ''') 124 125 # 新しいデータを挿入(仮保存、確認コード認証後に確定) 126 cursor.execute(''' 127 INSERT INTO test ( 128 id, name, mail, pass, icon, date 129 ) VALUES (?, ?, ?, ?, ?, ?) 130 ''', (ID, username, email, password, 'https://rofl10.com/image/gues.jpg', date1)) 131 conn.commit() 132 133 134 session["sds"]= ID 135 app.permanent_session_lifetime = timedelta(days=365000) 136 session.permanent = True 137 if "next" in session: 138 rid = session["next"] 139 session.pop("next", None) 140 return redirect(f'/{rid}') 141 return jsonify({"success": "成功"}) 142 143 return redirect(url_for('home')) # サインアップ成功後のリダイレクト先(ホームページ) 144 145 except Exception as e: 146 return str(e) 147 148 else: 149 # 確認コードが一致しない場合 150 return jsonify({"error": "コードが違うか、期限切れです。"}) 151 152 return render_template('verify_code.html') # 確認コード入力フォームを表示 153 154

python

1#このcodeでセッションが保存されているか確認します 2@app.route('/checksession', methods=['GET', 'POST']) 3def sgvsvb(): 4 if "sds" in session: 5 id = session["sds"] 6 afi = session["afiid"] 7 print (id) 8 return id 9 else: 10 return "ログインされていない"

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

特に変化なしです。。

補足

python flask

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teamikl

2025/01/14 10:12

セッションの期限が1000年後ですが、 ブラウザもしくはサーバーが32ビット環境だったりしませんか? (2038年問題) 違うとは思うけど、気になったので念のため確認。
guest

回答1

0

書かれていないことが多いので、とりあえず動くところだけ試してみました。

試したコード

app.py

py

1# app.py 2from flask import Flask, session, request, jsonify, render_template 3from datetime import timedelta 4app = Flask(__name__) 5 6app.secret_key = 'secret' 7 8@app.route('/login', methods=['GET', 'POST']) 9def logins(): 10 if request.method == 'POST': 11 email = request.form.get('email') 12 user_id = email 13 if user_id: 14 session["sds"] = user_id 15 session["afiid"] = user_id # 仮の処理 16 app.permanent_session_lifetime = timedelta(days=365000) 17 session.permanent = True 18 return jsonify({"success": True}) 19 else: 20 return jsonify({"error": "ユーザー名またはパスワードが正しくありません。"}) 21 return render_template('login.html') # GETリクエストの場合のHTML表示 22 23 24@app.route('/checksession', methods=['GET', 'POST']) 25def sgvsvb(): 26 if "sds" in session: 27 id = session["sds"] 28 afi = session["afiid"] 29 print (id) 30 return id 31 else: 32 return "ログインされていない" 33

templates/login.html

html

1<html lang="ja"> 2<head> 3 <title>title</title> 4</head> 5<body> 6 <form action="/login" method="post"> 7 <input type="text" name="email"> 8 <input type="password"> 9 <input type="submit"> 10 </form> 11</body> 12</html>

手順

  1. 上記コードを実行。
  2. localhost:5000/loginにアクセス
  3. inputボックスのtextとpasswordにaを入力し、送信ボタンを押下
  4. success表示
  5. localhost:5000/checksessionにアクセス
  6. aと表示

結果

上記、手順の通りで、セッションに保存されていました。
ブラウザを閉じて再度起動し、/checksessionを確認しても同じでした。

セッションの保存と確認に関係なさそうなコードは読んでいませんが、sign-upが関係しているとは思えないので(フロー上前のはずなので)、セッション保存と確認あたりで余計なことをしている可能性があります。
私が確認したコード以外の部分で何かしていませんか?

例えば、DBにユーザ登録後、確認時に削除してしまっていたり、SELECTできていなかったり、UPDATEが発生して別の値に変わってしまい必ずログイン失敗していたり、自分が思いもよらない何らかの理由はあったりしませんか?

投稿2025/01/14 01:46

FiroProchainezo

総合スコア2441

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問