8

我正在尝试构建一个超级简单的网络应用程序供我自己使用。我将是唯一的用户,所以我觉得不需要涉及数据库来进行用户管理。我正在尝试使用烧瓶登录,但即使我的调用login_user成功,在重定向到带有@login_required. 这是我的应用程序的全部内容:

from flask import Flask, render_template, request, flash, redirect, url_for
from flask.ext.login import LoginManager, login_user, logout_user, current_user, login_required, UserMixin

app = Flask(__name__, static_url_path="")
app.secret_key = "[redacted]"

login_manager = LoginManager()
login_manager.init_app(app)
#login_manager.login_view = "login"

class User(UserMixin):
    def __init__(self, id):
        self.id = id

nathan = User('nathan')

@login_manager.user_loader
def load_user(userid):
    if userid == 'nathan':
        return nathan
    else:
        return None

@app.route("/logout")
@login_required
def logout():
    logout_user()
    return redirect(url_for('login'))

@app.route('/')
@login_required
def index():
    return render_template('index.html')

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == 'POST':
        if request.form['username'] == 'nathan'\
                and request.form['password'] == '[redacted]':
            login_user(nathan, remember=True)
            flash('logged in...', 'success')
            return redirect(request.args.get("next") or url_for("index"))
        else:
            flash('Incorrect username or password. Try again.', 'error')

    return render_template("login.html");

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

我已经验证登录实际上成功(login_user返回 true)并且load_user正在返回nathan对象。

[编辑] 另外,我目前正在使用 Flask 开发服务器,以防万一。

不知道我哪里错了。提前致谢!

4

1 回答 1

4

更新:

由于 Flask-Login 的更新版本(0.2.2),这不再是一个问题。查看提交中的更改。

如果您使用的是旧版本,请继续阅读。


这里的问题是static_url_path=""。为了让 Flask-Login 工作,你不能有一个空字符串static_url_path

Flask-Login 源代码(旧版本)中的以下几行揭示了这一点:

if (current_app.static_url_path is not None and
    request.path.startswith(current_app.static_url_path)
):
    # load up an anonymous user for static pages
    _request_ctx_stack.top.user = self.anonymous_user()
    return

由于您的static_url_pathis ""if 条件评估为True,因此您访问的每个页面都像静态页面一样,因此 Flask-Login 始终加载匿名用户,而不是继续加载实际用户(使用load_user回调)。


也不要忘记取消注释#login_manager.login_view = "login"


如果您仍想将应用程序本身的根文件夹用作静态文件夹,请查看解决方案,使用SharedDataMiddleWare

app.debug = True
if app.config['DEBUG']:
    from werkzeug import SharedDataMiddleware
    import os
    app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
      '/': os.path.dirname(__file__)
    })

if __name__ == "__main__":
    app.run(host="0.0.0.0")
于 2013-05-19T11:02:55.607 回答