【问题标题】:Django is not redirecting after receiving a POST requestDjango 在收到 POST 请求后没有重定向
【发布时间】:2018-02-07 00:24:50
【问题描述】:

我正在尝试将一些值从前端发送到 Django 应用程序。我想操纵这些值,然后重定向到另一个视图,但似乎 Django 没有重定向,也没有呈现任何内容。

这是我的 urls.py

from django.conf.urls import url
from . import settings
from personality_form import views

urlpatterns = [
    url(r'^$', views.home, name="home"),
    url(r'^apiLogin/(?P<_id>\d+)$', views.apiLogin,name="apiLogin"),
    url(r'^formulario/(?P<_id>\d+)$', views.formulario, name="formulario"),
]

这是我的观点.py

from django.shortcuts import render, redirect
from personality_form.models import *
from personality_form.forms import *
from django.views.decorators.csrf import csrf_exempt

def home(request):  
    return render(request, 'index.html')

def formulario(request, _id):
    if (request.method == 'POST'):
        form = personalityForm(request.POST)
    else:
        form = personalityForm()

    return render(request, 'formulario.html', {'form': form})

@csrf_exempt
def apiLogin(request, _id):
    if (request.method == 'POST'):        
        return redirect('/formulario/'+_id)

这是我用来从前面发送 POST 请求的 javascript 函数。

function test() {
            var http = new XMLHttpRequest();
            http.open('POST', '/apiLogin/1234', true);
            http.setRequestHeader('Content-type', 'application/json');
            var payload = {userID: "1234", access: "4567"};
            var params = JSON.stringify(payload);

            // Send request
            http.send(params);
        }

我尝试将 POST 发送到 apiLogin 视图。我检查它是否正在进入该视图,但是当我尝试重定向到公式视图时,它进入公式代码但似乎没有执行渲染指令。我尝试更改渲染的重定向功能,但也不显示新的 html。

不重定向url和换前面有什么原因吗?

我正在使用 Django 1.11 和 Python 3.6。

【问题讨论】:

  • 您是否看到任何错误或堆栈跟踪?
  • 没有。 POST返回“POST /apiLogin/1234 HTTP/1.1”302,然后从“formulario”视图执行代码,但它似乎忽略了渲染指令,并且不更改url。
  • 我明白了,你是用javascript函数测试代码吗??它正确地重定向到 URL,但是 javascript 没有对该重定向指令做任何事情。
  • 您正在从 javascript 发出 HTTP 请求,因此您的 AJAX 调用会收到响应。由于您只是在做http.send(params),甚至没有查看响应,因此似乎什么都没有发生。但是,如果您查看您的 javascript 控制台,您会看到响应 HTTP 302 重定向。
  • 是的,我正在使用测试 javascript 函数将客户端与服务器通信。我应该怎么做才能管理来自 javascript 的响应?我看着它就像从 HTML 发送一个表单,当 django 应用程序收到它时,你可以更改视图或渲染文件。这个愿景错了吗?

标签: javascript python django redirect


【解决方案1】:

您必须稍微更改您的代码。 在您的 api_login() 中,创建一个带有参数的反向 url。然后在您的 JavaScript 中将窗口 url 本身更改为重定向。

首先,在您的def apiLogin(request, _id) 中:

from django.core.urlresolvers import reverse
from django.http import JsonResponse

@csrf_exempt
def apiLogin(request, _id):
    if (request.method == 'POST'):        
        #create a url string using reverse.
        url = reverse('formulario' , kwargs = {'_id' : _id})
        #if the above way doesn't work then try: url = request.build_absolute_uri(reverse('formulario' , kwargs = {'_id' : _id}))
        #Now simply return a JsonResponse. Ideally while dealing with ajax, Json is preferred. 
        return JsonResponse(status = 302 , data = {'success' : url })

然后在你的 JavaScript 中:

function test() {
    var http = new XMLHttpRequest();
    //The onreadystatechange function is called every time the readyState changes.
    //4: request finished and response is ready
    //basically the below function gets called every time your the response of you request request is returned from the server.
    http.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 302) {
            var json = JSON.parse(this.responseText); 
            console.log(json.success);
            //following line would actually change the url of your window.  
            window.location.href = json.success; 
        }
    };
    http.open('POST', '/apiLogin/1234', true);
    http.setRequestHeader('Content-type', 'application/json');
    var payload = {userID: "1234", access: "4567"};
    var params = JSON.stringify(payload);

    // Send request
    http.send(params);     
}

我希望这有效。如果没有,请检查控制台内打印的内容。如果它有效,那么只需删除控制台语句。

希望这会有所帮助。谢谢。

【讨论】:

  • 谢谢!这可行,但我不得不更改 javascript 上的状态代码,因为您将 302 放在 views.py 中,将 301 放在 javascript 函数中。如果可以,请编辑您的答案,我会接受。
  • @MaríaVictoria 为错字道歉。你是对的。在代码 sn-ps 中它应该是状态 302。 301 用于永久重定向,在这种情况下不是。
猜你喜欢
  • 2021-09-13
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 2016-06-18
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
相关资源
最近更新 更多