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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

470閲覧

シリアライザーの有効期限が検出できません

jyansinkai

総合スコア66

Flask

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/04/04 04:14

いつもお世話になっております。

PythonのFLASKを用いて、アカウント登録機能を作成しています。
ユーザー名をメールアドレスとし、新規アカウント登録があったらそのメールアドレスへ確認のメールを送信、メールに記載されたリンクを踏んで登録完了、という流れを作りたいです。

BlueprintでAとBのフォルダに分けた機能のうち、Aの方でアカウント登録機能を作ろうとしています。
以下のようにコードを作成しましたが、何故か期限切れでも全てOKと判断してしまいます。

ディレクトリ構造は以下の通りです。
main
┣server.py
┣config.py
┣modules
┃ ┗common.py

┣A
┃┗A.py
┣B
┃┗B.py

コードを抜粋したものが以下の通りです。

server.py

1#!/usr/local/bin/python3 2# -*- coding: utf-8 -*- 3 4from flask import Flask, render_template, url_for, request, redirect, Blueprint 5from flask_login import LoginManager, login_user, logout_user, login_required, UserMixin, login_required 6 7# 分割したモジュールをインポート 8from A.A import A_app 9from B.B import B_app 10 11# Flask使用準備 12app = Flask(__name__) 13 14# ログインマネージャー準備 15login_manager = LoginManager() 16login_manager.init_app(app) 17app.config.from_pyfile('config.py') 18 19## 分割先のコントローラー(Blueprint)を登録 20app.register_blueprint(A_app, url_prefix='/A') 21app.register_blueprint(B_app, url_prefix='/B') 22 23if __name__ == '__main__': 24 app.run(debug=True)

common.py

1#!/usr/local/bin/python3 2# coding: utf-8 3 4from itsdangerous import URLSafeTimedSerializer 5from config import SECRET_KEY 6 7ts = URLSafeTimedSerializer(SECRET_KEY) 8 9def url_safe_timed_serializer(ts,email_address): 10 return ts.dumps(email_address, salt='email-confirm-key')

A.py

1from flask import Flask, render_template, request,Response, abort, redirect, session, Blueprint, url_for 2from flask_login import LoginManager, login_user, logout_user, login_required, UserMixin, login_required 3from modules.common import url_safe_timed_serializer, ts 4 5# Blueprintオブジェクトを生成 6A_app = Blueprint('A', __name__,template_folder='templates', static_folder='static') 7 8@A_app.route('A/send_confirm_mail', methods=["GET","POST"]) 9def send_confirm_mail(): 10 if(request.method == "POST"): 11 #create.htmlから情報受け取り 12 address = request.form["username"] 13 password = request.form["password"] 14 #addressを暗号化してURLにしたものを載せたメールをaddressへ送る 15 token = url_safe_timed_serializer(ts,address) #modules/common.pyに書いた関数です 16 confirm_url = url_for('A.confirm_ok',token=token,_external=True) 17 html = render_template('A/send_confirm_mail.html',confirm_url=confirm_url) 18 subject = "アカウント登録はもう少しで完了です" 19 send_email(address, subject, html) 20 return render_template("A/please_check_mail.html") 21 else: 22 return render_template("A/error.html") 23 24@A_app.route('/cofirm_ok/<token>') 25def confirm_email(token): 26 try: 27 email = ts.loads(token, salt="email-confirm-key", max_age=10)#max_ageを極端に少なくしても通ってしまいます 28 except: 29 abort(404) #期限切れのURLならここで例外処理が行われると思っています 30 user = User.query.filter_by(email=email).first_or_404() 31 user.email_confirmed = True 32 return redirect(url_for('confirm_ok'))#登録完了しましたのページへ

どこに過不足があるかご教授下さいます様、何卒宜しくお願い申し上げます。

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

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

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

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

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

FiroProchainezo

2022/04/04 06:13

確認してみようかな?と思いましたが、補間が必要なコードが多すぎて諦めました。 コードを記載する場合は、手直ししないでそのままで動作する最小限のコードを貼り付けて下さい。 以下を確認すると良い質問ができるかもしれません。 https://teratail.com/help/question-tips 低評価が2件付いているようですが、上記ページにある以下が記載されていないことが原因と考えられます。 1. 投稿前に検索し、できるところまで自分でやってみましょう 何をしてどうダメだったのか、それについてどのように確認し、調べ、何がわからないのか、の記載が無いと回答者がデバッグするのと同義です。 丸投げはやめましょう。 質問する前に、掲載したコードだけで動作させてみれば動くかどうかはわかると思います。
jyansinkai

2022/04/04 08:33

ご指導誠に有難うございます。 confirm_url = url_for('A.confirm_ok',token=token,_external=True) と、tokenを受け取るconfirm_okという関数名が、def confirm_email(token):と定義されており、なおかつ、@confirm_okのrouteが設定されていたことが原因で、max_ageに関係なくconfirm_okが表示されていたことが原因でした。お騒がせして申し訳ございませんでした。
guest

回答1

0

自己解決

confirm_url = url_for('A.confirm_ok',token=token,_external=True)
と、tokenを受け取るconfirm_okという関数名が、def confirm_email(token):と定義されており、なおかつ、@confirm_okのrouteが設定されていたことが原因で、max_ageに関係なくconfirm_okが表示されていたことが原因でした。

url_for('ここには@routeで定義した関数名が入ります')。
どなたかの参考となりますように。

投稿2022/04/04 08:36

jyansinkai

総合スコア66

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問