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:在本地机器上不起作用,但在托管上很好的主要内容,如果未能解决你的问题,请参考以下文章