Flask-Login:在本地机器上不起作用,但在托管上很好

Posted

技术标签:

【中文标题】Flask-Login:在本地机器上不起作用,但在托管上很好【英文标题】:Flask-Login: Does not work on local machine but fine on hosting 【发布时间】:2015-09-23 03:29:33 【问题描述】:

我有一个烧瓶应用程序,我使用烧瓶登录,遵循教程(这里没什么花哨的)

在托管上运行良好 在我的本地 MAC 计算机上运行良好(在家) 无法在我的本地 Linux 计算机上运行(在办公室,可能位于防火墙后面,但我可以进行端口转发并连接到数据库) 不适用于 Chrome 或 Firefox 如果我在 localhost 而不是 127.0.0.1 上服务,则不起作用。
from flask.ext.login import LoginManager 

login_manager = LoginManager()
login_manager.session_protection = "strong"
login_manager.init_app(app)
login_manager.login_view = 'login'

def login():
    error = None
    form = LoginForm()

    if request.method == 'POST':
        user = db.users.find_one("username": form.username.data)
        pass_hash = generate_password_hash(form.password.data)

        if user and User.validate_login( pass_hash,  user['password'] ):
            user_obj = User(user['username'])
            session['logged_in'] = True
            login_user(user_obj,remember=True)
            flash("Logged in successfully", category='success')
            print 'logged in: OK'

            #return redirect(request.args.get("next") or url_for("index"))
            return redirect( url_for("index"))
        error = 'Invalid credentials'
    return render_template('login.html', title='login', **locals())

好吧,当我输入错误的密码时,它会出现“无效凭据”错误。当我正确输入密码时,我没有看到 “登录成功” 闪烁,但在控制台上我看到 “登录成功”。所以数据库连接没有问题。但是我没有登录。例如,

g.user.is_authenticated()

在模板中给出 false (这仅在我的本地 Linux 上发生,另一方面托管和 MAC 成功登录用户)。

【问题讨论】:

看起来你正在使用 mongodb(但我可能错了)。如果 user 和 User.validate_login( pass_hash, user['password'] ): 或者使用 python 调试器检查数据库是否返回了你所期望的,你可以添加打印语句来打印用户和 pass_hash 吗? @skippy 是的,我正确地得到了所有这些,我也正确地得到了用户对象。 嗯,所以通过查看您的代码,如果您可以通过检查 "if user and User.validate_login( pass_hash, user['password'] ):" ,您应该能够看到“登录成功”。因此,如果您能够按预期从您的 db 正确获取您的对象,那么您的“if 子句”就失败了。准确地说,您没有通过此检查“User.validate_login(pass_hash, user['password'])”。你能进入这段代码并验证它是否返回 False 吗? @skippy 谢谢,但是,我在 if 子句上没有失败。正如我在问题中提到的,在控制台上我可以看到“登录:OK”,所以 if 子句很好。一定有别的东西,我不知道。 哦,我错过了你的描述。我的错 !好吧,如果网页上没有显示 flash msg,您可能可以查看其 html 源代码并检查 msg 是否确实出现在那里。我猜你在客户端使用 jinja 作为模板引擎,到目前为止我还没有在 linux/mac 上看到任何 jinja 异常。但是,如果 html 源确实没有扩展 flash 消息,我将使用 Firebug/chrome-debugger 等客户端调试器来检查是否生成了任何异常。我会在 Firefox 和 Chrome 上做同样的事情并检查行为是否一致 【参考方案1】:

会话带来会话管理...

您是否使用基于客户端的会话管理? cookie 可能存在的问题,例如cookie size, too much data in cookie 服务器密钥可能存在的问题,例如每次生成一个新的密钥 您是否使用基于服务器的会话管理(例如flask-kvsession)? 尝试访问与 prod 相同的后端时可能出现的问题,例如防火墙阻止访问 redis 服务器

您可能在访问开发服务器时尝试存储更多会话数据(例如更长的服务器 url、调试数据等),当在客户。

【讨论】:

【参考方案2】:

您在浏览器中的何处以及如何保存会话?

考虑存储在生产域 example.com 的浏览器 cookie 中的会话,您也在本地配置了该会话(通过向您的 /etc/hosts 文件添加覆盖)。

如果您的办公服务器配置为使用不同的子域,例如office.example.com,并且REMEMBER_COOKIE_DOMAIN 设置为example.com,办公服务器将无法读取 cookie。解决方法是使用跨域 cookie:REMEMBER_COOKIE_DOMAIN=.example.com(注意前面的点)。

参考:https://flask-login.readthedocs.org/en/latest/#cookie-settings

【讨论】:

以上是关于Flask-Login:在本地机器上不起作用,但在托管上很好的主要内容,如果未能解决你的问题,请参考以下文章

Heroku postgresql 查询在 Heroku 上不起作用,但在本地工作

代码在服务器 VS 上不起作用 [重复]

silverlight 插件在服务器上不起作用

上传文件(图像)在实时服务器上不起作用,但在dev上工作

在 WCF 中启用了 Cors,但在实时服务器上不起作用

在 Ionic 中,为啥路由在 iPhone 上不起作用,但在构建版本和离子服务上起作用