我使用Ajax登录,使用Flask登录扩展。这是我的服务器端代码:
@app.route('/login', methods=["POST"])
def login():
if current_user.is_authenticated:
redirect_url = url_for('index')
return jsonify(loggedIn=True, redirectUrl=redirect_url)
username = request.form.get('username', '').strip()
password = request.form.get('password', '').strip()
user = User.query.filter_by(username=username).first()
if user and util.encrypt_password(password, user.salt) == user.password:
logged_in_user = CurrentUser(user)
login_user(logged_in_user)
redirect_url = url_for('index')
return jsonify(loggedIn=True, redirectUrl=redirect_url)
else:
return jsonify(loggedIn=False, error='Invalid Email/Password')
我的客户端代码:
^{pr2}$不知道出了什么问题,我最近开始看到这个问题,而且失败的次数超过50%。如果失败,它只会重定向到新页面,但不存在会话信息。所有内容都托管在同一个域中。在
编辑:
更多信息:即使登录不间断地工作,后端也会传递登录信息,而前端接收到loggedIn=True
和{
谁在看这个。我找不到一个好的解决办法。但是经过调试并意识到,这肯定是由于Chrome中的一些错误,从Ajax请求更新cookie/session数据。
我通过使用redis而不是客户端转到服务器端会话来解决这个问题。确保请求始终具有正确的会话信息。在
尝试检查它是否与在Ajax请求中使用cookie相关的jQuery错误:https://stackoverflow.com/a/7189502/882187
另外,尝试在短超时之后进行重定向,以确保它发生在ajax回调处理程序之外。由于JS中的回调,此问题可能是间歇性的。如果用'window.location.href'中断cookie处理处理程序?'?。。在
你能修改代码来使用werkzeug库吗?在
除非您的util具有check_password方法。在内部,createhash方法可以为每次调用同一salt返回不同的密码哈希。这解释了间歇性问题,因为有时返回的哈希匹配,有时不匹配。我相信这完全可以依赖于随机函数(通常与时钟有关)和内部哈希算法。在
不需要用werkzeug存储密码散列,因为它存储在散列本身中并进行盐析。我自己使用了werkzeug库进行登录,下面的代码应该可以工作。如果您使用werkzeug提供的generate_password_hash生成密码哈希并将其存储在数据库中。Werkzeug library
您使用werkzeug的代码:
控制台示例:
^{pr2}$默认情况下,Flask中的URL路由器只响应
GET
方法。您正在使用POST
方法在AJAX中发出请求。在似乎您的view函数应该同时处理}(当登录用户访问此URL时,只需重定向到
GET
和{index
页面?)在因此,您必须显式地将
methods
参数设置为@app.route
,更改这一行收件人:
^{pr2}$再试一次。在
如果不起作用,请评论,我会不断更新。在
相关问题 更多 >
编程相关推荐