发布JSON和Python Flask - 有什么技巧可以使用Werkzeug调试器吗?

11

我正在使用一个RESTful后端来完成我的项目,并通过jquery提交数据。

我必须说,werkzeug调试器非常适用于调试,特别是当你像我一样是个糟糕的Python程序员时。您可以在您想要调查的地方故意抛出异常,并使用调试器呈现的HTML检查代码和变量。

然而,如果您发送的是post请求,而不是get请求,如果后端代码中出现异常,那么浏览器将不会呈现响应文本。

有没有什么技巧可以使用以呈现响应文本,考虑到它包含JavaScript和其他内容?

我正在尝试不同的方法,比如尝试将响应文本注入弹出窗口,例如:

           $.postJSON = function(url, data, callback, error_callback) {
                return jQuery.ajax({
                    'type': 'POST',
                    'url': url,
                    'contentType': 'application/json',
                    'data': JSON.stringify(data),
                    'dataType': 'json',
                    'success': callback,
                    'error': error_callback
                });
            };

            $.postJSON('/the_uri', {'foo': 'bar'}, 
            function(response) {
                var a = 0;
            }, 
            function(response) {
                var html = response.responseText;
                var my_window = window.open('', 'mywindow1', 'width=350,height=150');
                $(my_window.document).find('html').html(html);
            });
        });

但这样做并不能很好地处理JavaScript。

有人有任何建议吗?


你有解决方案了吗?我真的很希望能做到这一点。 - David
目前还没有解决方案,抱歉... 我不再寻求解决方法了,你可能想要做的是在服务器上附加调试器到你的Flask应用程序,并在那里逐步执行/跟踪你的代码。 - johnildergleidisson
4个回答

5

你的方法基本正确。我使用以下代码在新窗口中打开响应文本(与Werkzeug或Flask无关):

var w = window.open('', 'debug_stuff', 'width=540,height=150');
w.document.open();
w.document.write(response.responseText);
w.document.close();

最后一行是最重要的。没有它,代码就会像你的那样表现--它不会执行任何JavaScript,因为浏览器不知道DOM已完全加载。


1
不是JavaScript,但是您是否尝试使用Firebug,您可以使用在新选项卡中查看响应的选项(在新选项卡中打开响应)。

0

如果你准备在客户端和服务器端代码上做一些更改,可以尝试这个方法。在错误回调函数中,您可以将JSON数据重新发送,但作为同步表单提交。您可以使用jQuery创建表单,给它一个input标签,并将JSON放入其中,然后提交表单。类似于:

$('<form method="post" style="display:none;">')
    .attr('action', 'xxx')
    .append(
        $('<input>').val(JSON.stringify(data))
    ).appendTo('body')
    .submit();

在服务器端,当请求的内容类型为application/json时,您需要按照常规方式接受JSON,并将其作为表单数据处理,例如:
json_string = request.form.get('__json')
if json_string:
    data = json.loads(json_string)

我从未尝试过这个,但我知道你遇到的问题可能会浪费很多时间。如果你尝试了,我想知道它的效果如何。


我想我仍然想花一些时间思考这个问题,但从未真正找到足够的时间。几个月前,我曾尝试过这个解决方案,但它并没有真正起作用。 - johnildergleidisson

0

Markus的回答完美地解决了问题。非常感谢!这让我省去了很多麻烦。

还要考虑将处理程序分配给jqxhr对象。

http://api.jquery.com/jQuery.post/#jqxhr-object

var jqxhr = $.post(...)

然后你会写入你的新窗口

w.document.write(jqxhr.responseText);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接