【问题标题】:React and Django session problem that works on Postman but not in browser在 Postman 上有效但在浏览器中无效的 React 和 Django 会话问题
【发布时间】:2021-06-04 11:47:52
【问题描述】:

我想知道我做错了什么。我正在尝试使用 React 前端和 Django 后端实现最简单的会话。我知道我的方法不安全而且很糟糕,但它只是一个大学项目,我需要一些可行的东西,所以我应该在我的项目中做其他需要会话的东西。

这就是我的后端查找 Login 和 SessionInfo 的方式:

@api_view(['POST'])
def login(request):
    data = request.data
    try:
        user = MyUser.objects.get(username=data.get('username'), 
                                  password=data.get('password'))
        request.session['uuid'] = user.id
        request.session.modified = True
    except MyUser.DoesNotExist:
        return HttpResponse("User does not exist.")
    return HttpResponse(request.session['uuid'])
@api_view(['GET'])
def getsession(request):
    if request.session.has_key('uuid'):
        return HttpResponse(request.session['uuid'])
    else:
        return HttpResponse(False)

当我尝试使用 Postman 对其进行测试时,它总是可以工作,并且我得到了想要的会话 ID,但是当我尝试使用 Axios 发布方法来做同样的事情时,它总是返回 False。我不知道为什么?看起来Django在调用登录函数后破坏了会话,或者它甚至没有创建它。 这就是我的 post 方法在 React 中的样子:

function login(){
        axios.post('http://127.0.0.1:8000/evidencija/login/',{
            username: 'admin',
            password: 'admin'
        }).then(
            (response) =>{
                console.info(response.data)
                getSession()
            },
            (error) =>{
                console.log(error)
            }
        )
    }

【问题讨论】:

    标签: python reactjs django authentication


    【解决方案1】:

    某些浏览器(例如 Chrome)提供的设置允许用户在关闭并重新打开浏览器后继续浏览会话。在某些情况下,这可能会干扰 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置并防止会话在浏览器关闭时过期。请在测试启用了 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置的 Django 应用程序时注意这一点。

    文档:https://docs.djangoproject.com/en/3.2/topics/http/sessions/#browser-length-vs-persistent-sessions

    【讨论】:

    • 我尝试了您的解决方案,但它似乎不起作用。我尝试调试它,我的登录函数从 React 获取数据,它甚至创建了一个我尝试记录的会话,但是每当我从 React 运行 getsession 时,它都会返回 false。它看起来像它立即被摧毁?但是当我在邮递员中这样做时它工作得很好。
    • @filipvista 更新了答案。检查你的 settings.py SESSION_COOKIE_HTTPONLY=True
    • 某些浏览器(例如 Chrome)提供允许用户在关闭并重新打开浏览器后继续浏览会话的设置。在某些情况下,这可能会干扰 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置并防止会话在浏览器关闭时过期。请在测试启用了 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置的 Django 应用程序时注意这一点。
    • 问题是会话在您关闭邮递员后立即被删除。所以在浏览器上你没有活动会话。
    猜你喜欢
    • 2021-04-03
    • 2023-02-01
    • 1970-01-01
    • 2021-11-12
    • 2021-09-19
    • 2016-07-11
    • 2020-07-31
    • 1970-01-01
    • 2018-06-30
    相关资源
    最近更新 更多