9

我有一个使用 Flask 的非常简单的 python 程序,如下所示。它通过弹出和注销处理登录。问题是浏览器中的 url 没有被 redirect(url_for()) 调用更新。

@app.route('/')
def index():
    if not 'username' in session:
        # contains a button showing a login popup form with action set to '/login'
        return render_template('welcome.html')
    else:
        # contains a logout button with a href to '/logout'
        return render_template('webapp.html') 


@app.route('/login', methods=['POST'])
def login():
    session['username'] = request.form['username']
    return redirect(url_for('index'))


@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect(url_for('index'))

访问“/”时会显示欢迎页面。当我单击该按钮时,会显示登录弹出窗口,并且其表单操作会重定向到“/login”。这有效,并且 login() 函数被调用并执行。重定向也是如此,但浏览器不会更新显示的 url。

所以 webapp 页面显示为 /logon url。当我单击重新加载时,我收到一个错误,因为它尝试重新加载 /logon,而它应该重新加载已重定向的“/”。

/logout 也是如此。当显示 webapp 页面并单击注销按钮时,将加载 /logout 页面,该页面执行 logout() 函数并重定向到 index.html。但是该网址留待注销。

如果我然后重新加载页面,它会成功,因为 /logout 接受 GET 方法,然后 url 更新为 / ,因为它应该首先出现。

我的印象是这是一个 jQuery 移动问题,但无法找出问题所在。从 python 和 Flask 的角度来看,它与我能找到的所有登录示例匹配。

4

1 回答 1

10

写完问题后终于解决了。

该问题是由 jQuery mobile 和缺少 data-url 属性引起的。

通过在页面 div 中添加 data-url 属性,浏览器中的 url 会更新并且一切正常。

<div data-role="page" id="welcome" data-url="{{ url_for('index') }}">
于 2012-12-13T20:45:48.963 回答