ajax间歇出现的Flask登录问题

2024-04-24 17:19:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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和{}。似乎问题在于客户端接收到会话/cookie,但不确定为什么会出现间歇性问题。在

谁在看这个。我找不到一个好的解决办法。但是经过调试并意识到,这肯定是由于Chrome中的一些错误,从Ajax请求更新cookie/session数据。 我通过使用redis而不是客户端转到服务器端会话来解决这个问题。确保请求始终具有正确的会话信息。在


Tags: 代码信息trueurl客户端return服务器端username
3条回答

尝试检查它是否与在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的代码:

from werkzeug.security import generate_password_hash, \
     check_password_hash
@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 check_password_hash(user.password, 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}$

默认情况下,Flask中的URL路由器只响应GET方法。您正在使用POST方法在AJAX中发出请求。在

似乎您的view函数应该同时处理GET和{}(当登录用户访问此URL时,只需重定向到index页面?)在

因此,您必须显式地将methods参数设置为@app.route,更改这一行

@app.route('/login')

收件人:

^{pr2}$

再试一次。在

如果不起作用,请评论,我会不断更新。在

相关问题 更多 >