如何将页面从一个蓝图视图重定向到另一个?
How to redirect a page from one blueprint view to another?
我正在使用 Flask 和蓝图模块。在我的应用程序中,我尝试在使用 LDAP 成功登录 (user/login
) 后将页面重定向到 page/home
,但是重定向会一直持续下去而不会引发任何错误。
我尝试了 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')
我找到了解决此问题的方法。
为了更好地促进使用 HTTPS URL 的 URL 的生成
scheme 这个补丁添加了一个考虑到这个特定目的的参数。到
为此,我们显式传入一个参数 _scheme='https'
,然后设置
我们的 MapAdapter
实例的 url_scheme
属性适当。
重要的是,必须设置 _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
我正在使用 Flask 和蓝图模块。在我的应用程序中,我尝试在使用 LDAP 成功登录 (user/login
) 后将页面重定向到 page/home
,但是重定向会一直持续下去而不会引发任何错误。
我尝试了 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')
我找到了解决此问题的方法。
为了更好地促进使用 HTTPS URL 的 URL 的生成
scheme 这个补丁添加了一个考虑到这个特定目的的参数。到
为此,我们显式传入一个参数 _scheme='https'
,然后设置
我们的 MapAdapter
实例的 url_scheme
属性适当。
重要的是,必须设置 _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