为什么在路由中插入函数与在 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 是 Fl​​ask 的一个值,告诉 Flask 它需要进行重定向。

在您的第一段代码中,您正确地处理了这个问题。您将 redirect(...) 和 return 的结果放入烧瓶中。在您的第二段代码中,您采用 require_login 编辑的重定向 return 并在 home.

中忽略它

您可以尝试类似的方法:

value = require_login()
if value:
     return value