Django在XMLHttpRequest后使用message重定向

3pmvbmvn  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(127)

我有一个模板,它通过POST XMLHttpRequest将JSON发送到我的后端。

var xmlhttp = new XMLHttpRequest();   // new HttpRequest instance 
    var theUrl = "newSeq";
    xmlhttp.open("POST", theUrl);
    xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
    xmlhttp.setRequestHeader("X-CSRFToken", csrftoken);
    xmlhttp.send(JSON.stringify(my_json));

Django后端管理请求

def newSeq(request):
    if request.method == "POST":
        print(request.body)
        messages.success(request, "Ricevuto")
        return redirect("newSeq")
    
    return render(
        request,
        'dashboard/newSeq.html',
        {

        }
    )

我的问题是重定向不起作用,在前端我有错误the cookies "messages" has been rejected because it is already expired
有没有办法删除特定的cookie,并使页面重定向正确的消息?

tzxcd3kk

tzxcd3kk1#

首先,我建议您将XMLHttpRequest替换为Fetch API。此外,您不需要自己处理Cookies,让框架用它的middlewares来处理它。
主要的问题是你返回了一个完整的HTML页面(在告诉框架renderdashboard/newSeq.html之后)。实际上,你只需要redirect到另一个视图,我们也可以用JavaScript来做。下面是一个简单的例子:
views.py

def fetch_new_seq(request):
    """Attach message and reverse resolve redirection URL"""
    messages.success(request, "Ricevuto")
    redirect_url = reverse('new-seq')
    return JsonResponse({'url': redirect_url})

template.html

...
<script>
    function getCookie(name) {
        ...
    }

    async function postData() {
        const url = "http://localhost:8000/fetch/new/seq/"
        const data = {some: "data"}
        const csrftoken = getCookie('csrftoken');
        
        const response = await fetch(url, {
            method: 'POST',
            headers: {
                'X-CSRFToken': csrftoken,
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(data)
        });
        return await response.json()
    }
    
    postData().then((data) => { 
        window.location.replace(data.url); 
    });
</script>
...

相关问题