実現したいこと
/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