HTTP-перенаправление пирамиды после сообщения AJAX

Можно ли перенаправить на другую страницу после поста jquery на сервер? Как только пользователь войдет в систему, я хочу вернуть ответ json или перенаправить на другую страницу. Я знаю, что вызывается правильное представление callable, потому что я могу видеть оператор журнала с сервера.

Вот мой пост jquery:

function postToServer(url, params) {
    $.ajax({
        type: 'POST',
        url: url,
        data: JSON.stringify(params),
        contentType: 'application/json; charset=utf-8',
        statusCode: {
            200: function (data, textStatus, jqXHR) {
                return data;
            },
            201: function (data, textStatus, jqXHR) {
                return data;
            },
            400: function(data, textStatus, jqXHR) {
                return data;
            }
        }
    });
}

Это довольно простой и, кажется, работает хорошо. Всякий раз, когда я возвращаю JSON, он обрабатывает ответ правильно.

Вот мои взгляды:

#LOGIN
class LoginView(object):
    def __init__(self, request):
        self.request = request
        self.ctx = core.context()

    @view_config(route_name="login", request_method='GET')
    def get(self):
        template = "project:templates/login/login.mak"
        context = {}
        return render_to_response(template, context, request=self.request)

    @view_config(route_name="login", request_method='POST')
    def post(self):
        url = self.request.route_url('dashboard')
        print 'url: ' + url        
        #log user in and get credentials

        json = getJsonCredentialsObject()
        return Response('json', json)

#DASHBOARD
class DashboardView(object):
    def __init__(self, request):
        self.request = request
        self.ctx = core.context()

    @view_config(route_name="dashboard", request_method='GET')
    def get(self):
        print "in dashboard"
        template = "project:templates/dashboard/dashboard.mak"
        session = self.request.session
        context = {}
        return render_to_response(template, context, request=self.request)

Мне бы хотелось, чтобы метод post в классе Login обрабатывал взаимодействие, но когда я пытаюсь перенаправить сюда с помощью "return HTTPFound(location=self.request.route_url('/dashboard'))", ничего не происходит. У меня также возникают проблемы с получением объекта request.json_body из запроса (он нулевой), но это еще одна проблема. Спасибо за любую помощь.

2 ответа

Решение

Я думаю, что для достижения того, чего вы хотите, вы не можете вернуть пирамиду Redirect в ajax call.

Вернуть данные JSON со статусом и перенаправить URL

Тогда на переднем конце вы можете перенаправить пользователя на успех

window.location = http://redirecturlhere

При использовании AJAX ваш браузер не запрашивает страницу для отображения.

Перенаправление - это просто указание клиенту другого URL-адреса для получения ответа, а при выполнении этого с AJAX браузер просто получает ответ AJAX из нового местоположения. Если вы загружали страницу, перенаправление означает, что данные просто загружаются из другого места.

Другими словами, ответ на запрос AJAX никогда не приведет к изменению самой страницы браузера. Вам нужно будет сделать это с помощью кода JavaScript. Верните URL из вашего обработчика POST, затем используйте window.location = newurl,

Другие вопросы по тегам