bugfix> python-3.x > 投稿

ブループリントモジュールと一緒にFlaskを使用しています。私のアプリケーションでは、ページをにリダイレクトしようとしています page/home ログインに成功した後( user/login )LDAPを使用しますが、リダイレクトはエラーをスローせずに永久にかかります。

私はいくつかの異なるバリエーションを試しました redirect(url_for('page.home'))redirect(url_for('page/home.html')) 。ただし、これらの各コマンドはリダイレクトされません。何が間違っているのかわかりません。親切に助けてください。

フォルダー構造:

user/views.py:

from flask import Flask, Blueprint, request, render_template, redirect, url_for, session
from ldap3 import Server, Connection, ALL, NTLM
from snakeeyes.blueprints.page.views import page
import config.settings as p
user = Blueprint('user', __name__, template_folder='templates')
user.secret_key = 'dev key'
# @user.route('/')
# @user.route('/login')
# def login():
#     return render_template('user/login.html')
def connect_ldap(username, password):
    if not username or not password:
        return False
    # try:
    #     from ldap3 import Server, Connection, ALL, NTLM
    # except ImportError as importException:
    #     print("LDAP3 import not found, run 'sudo pip install ldap3 && sudo pip3 install ldap3'")
    #     print(importException)
    #     return False
    # define the server
    server = Server('us01ds', port=389,  get_info=ALL)
    # define the connection
    user = 'uid=%s,ou=people,ou=users,dc=global,dc=COMPANY,dc=com' % username
    conn = Connection(server, user, password, auto_bind=True)
    # perform the Bind operation
    if not conn.bind():
        print('error in bind', conn.result)
        return False
    else:
        return True
@user.route('/', methods=['GET', 'POST'])
@user.route('/login/', methods=['GET', 'POST'])
def login():
    # global username
    # username = None
    # If POST, redirect to dashboard
    if request.method == 'POST':
        username = request.form['username'].encode('utf8').decode("utf-8")
        password = request.form['password'].encode('utf8').decode("utf-8")
        # Try to login using ldap
        test = connect_ldap(username, password)
        # Invalid credentials
        if not test:
            return render_template(
                'login.html',
                isinvalid='is-invalid',
                error='Username or Password is incorrect'
            )
        else:
            # session['user_id'] = request.form['username']
            print('redict to home page')
            return redirect(url_for('page.home'))
    # If GET, render the login page
    else:
        return render_template('user/login.html')   

page/views.py:

from flask import Blueprint, render_template
page = Blueprint('page', __name__, template_folder='templates')
@page.route('/home')
def home():
    return render_template('page/home.html')
@page.route('/terms')
def terms():
    return render_template('page/terms.html')
@page.route('/privacy')
def privacy():
    return render_template('page/privacy.html')

回答 1 件
  • この問題の修正を見つけました。

    HTTPSURLを利用するURLの生成をより容易にするため このパッチは、この特定の目的を念頭に置いてパラメーターを追加します。に これを達成するには、パラメータを明示的に渡します。 _scheme='https' 、次に設定します url_scheme 私たちの属性 MapAdapter インスタンスを適切に。

    重要なのは、 _external=True これが正しく機能するために設定する必要があります。 そのため、そうしないと、 ValueError 育てられている。

    だから、私はただ交換します return redirect(url_for('page.home')) => return redirect(url_for('page.home', _external=True, _scheme='https'))

    参照:https://github.com/pallets/flask/commit/b5069d07a24a3c3a54fb056aa6f4076a0e7088c7

あなたの答え