いつもお世話になっております。
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'))#登録完了しましたのページへ
どこに過不足があるかご教授下さいます様、何卒宜しくお願い申し上げます。
確認してみようかな?と思いましたが、補間が必要なコードが多すぎて諦めました。
コードを記載する場合は、手直ししないでそのままで動作する最小限のコードを貼り付けて下さい。
以下を確認すると良い質問ができるかもしれません。
https://teratail.com/help/question-tips
低評価が2件付いているようですが、上記ページにある以下が記載されていないことが原因と考えられます。
1. 投稿前に検索し、できるところまで自分でやってみましょう
何をしてどうダメだったのか、それについてどのように確認し、調べ、何がわからないのか、の記載が無いと回答者がデバッグするのと同義です。
丸投げはやめましょう。
質問する前に、掲載したコードだけで動作させてみれば動くかどうかはわかると思います。
ご指導誠に有難うございます。
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が表示されていたことが原因でした。お騒がせして申し訳ございませんでした。
回答1件
あなたの回答
tips
プレビュー