FlaskLogin、会话管理和AJAX

2024-09-30 08:21:29 发布

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

我在使用Flask登录current_user对象和@login_required装饰器时遇到问题。我认为这与会议没有通过有关。在

目标是让用户单击一个链接,该链接对路由URL进行AJAX调用,该URL将通过SOAP服务提供SSO会话ID。SOAP服务需要传递一个emp_id,该id可以通过current_user.emp_id属性进行访问。在

我最初尝试在没有@login_required修饰符的情况下进行AJAX调用,只传递了一条简单的消息,该消息成功返回:

应用程序js

const ssoLinks = document.querySelectorAll('.sso');

ssoLinks.forEach((ssoLink) => {
  ssoLink.addEventListener('click', (e) => generateSSOLink(e, ssoLink.id));
});


function generateSSOLink(e, page) {
  e.preventDefault();

  fetch("/get_bpm_sso_link")
    .then(response => response.json())
    .then(data => console.log(data))
}

视图.py

^{pr2}$

我的下一次尝试是访问current_user中的emp_id:

视图.py

@app.route('/get_bpm_sso_link')
def get_bpm_sso_link():
    data = {
        'msg': 'success'
    }

    print('*'*75)
    print(current_user.emp_id)
    print('*'*75)

    return jsonify(data)

这给了我一个错误:

AttributeError: 'AnonymousUserMixin' object has no attribute 'emp_id'

好的,然后我决定尝试访问初始索引页上的相同emp_id属性(AJAX也在其中),并且能够这样做。听起来像是在AJAX请求期间,Flask登录LoginManager无法识别current_user的会话。为了进一步说明这一点,我在路由中添加了@login_required装饰器,JSON响应返回到登录页面的重定向。在

如何让Flask Login在AJAX调用期间识别用户?如果没有,还有哪些库可以无缝地处理用户会话管理和AJAX请求?在


Tags: 用户idflaskdatagetrequiredlinklogin
2条回答

您需要为每个请求登录using request loader as per this example on flask

可能是disable setting the Flask Session cookie

然后使用带有基本身份验证的fetch-add头

    fetch('/get_bpm_sso_link', { 
    method: 'get', 
    //or whichever method you are using
    headers: new Headers({
     'Authorization': 'Basic '+btoa('username:password') 
     //btoa base64 encodes your credentials, the flask example above shows how to decode
     })
 });

理想情况下,由于凭证不是散列的,所以在生产中应该通过https传递

因此,本周我在克利夫兰的pycon2018上做了一些挖掘,发现了一个关于fetchapi的值得注意的话题。默认情况下,API似乎不发送任何用户凭据。为了解决这一问题,可以归结为在API中设置一个选项:

应用程序js

function generateSSOLink(e, page) {
  e.preventDefault();

  fetch("/get_bpm_sso_link", {
    credentials: 'include'
  })
    .then(response => response.json())
    .then(data => console.log(data))
}

现在,即使使用@login_required修饰符,AJAX请求也会击中我的视图。在

相关问题 更多 >

    热门问题