为什么在路由中插入函数与在 Flask 中的函数中插入代码不同?
Why does inserting a function inside a route differ from inserting the code inside the function in Flask?
我正在尝试制作一个带有登录系统的网络应用程序。我想让用户在登录之前无法访问某些页面。
我想要的是,当您在未登录的情况下单击转到另一个页面时,您将被重定向到登录页面,并在该页面上收到一条消息。
这是有效的方法:
@app.route("/home", methods=['GET', 'POST'])
def home():
#some form
if not current_user.is_authenticated:
flash('You need to be logged in to access this page.', 'info')
return redirect(url_for('login'))
#rest of the code
但我还需要将所有这些添加到其他路线。所以我创建了函数并将其添加到路由中:
@app.route("/home", methods=['GET', 'POST'])
def home():
#some form
require_login()
#rest of the code
def require_login():
if not current_user.is_authenticated:
flash('You need to be logged in to access this page.', 'info')
return redirect(url_for('login'))
但这并不像我想要的那样有效。它而是重定向到主页,然后闪烁消息。我该如何解决这个问题?
您需要return函数
return require_login()
但请注意,在那之后您将无法获得代码。您应该为此创建一个装饰器。网上有例子 Google "flask authorized decorator"
你的优势在于你可以将 auth 逻辑移出视图,你可以轻松地装饰你的视图并且每个视图中都没有这些东西 View/route
问题是 redirect(...)
本身并不进行重定向。它 return 是 Flask 的一个值,告诉 Flask 它需要进行重定向。
在您的第一段代码中,您正确地处理了这个问题。您将 redirect(...)
和 return 的结果放入烧瓶中。在您的第二段代码中,您采用 require_login
编辑的重定向 return 并在 home
.
中忽略它
您可以尝试类似的方法:
value = require_login()
if value:
return value
我正在尝试制作一个带有登录系统的网络应用程序。我想让用户在登录之前无法访问某些页面。
我想要的是,当您在未登录的情况下单击转到另一个页面时,您将被重定向到登录页面,并在该页面上收到一条消息。
这是有效的方法:
@app.route("/home", methods=['GET', 'POST'])
def home():
#some form
if not current_user.is_authenticated:
flash('You need to be logged in to access this page.', 'info')
return redirect(url_for('login'))
#rest of the code
但我还需要将所有这些添加到其他路线。所以我创建了函数并将其添加到路由中:
@app.route("/home", methods=['GET', 'POST'])
def home():
#some form
require_login()
#rest of the code
def require_login():
if not current_user.is_authenticated:
flash('You need to be logged in to access this page.', 'info')
return redirect(url_for('login'))
但这并不像我想要的那样有效。它而是重定向到主页,然后闪烁消息。我该如何解决这个问题?
您需要return函数
return require_login()
但请注意,在那之后您将无法获得代码。您应该为此创建一个装饰器。网上有例子 Google "flask authorized decorator"
你的优势在于你可以将 auth 逻辑移出视图,你可以轻松地装饰你的视图并且每个视图中都没有这些东西 View/route
问题是 redirect(...)
本身并不进行重定向。它 return 是 Flask 的一个值,告诉 Flask 它需要进行重定向。
在您的第一段代码中,您正确地处理了这个问题。您将 redirect(...)
和 return 的结果放入烧瓶中。在您的第二段代码中,您采用 require_login
编辑的重定向 return 并在 home
.
您可以尝试类似的方法:
value = require_login()
if value:
return value