将API数据发送到Django视图

时间:2015-06-18 19:04:59

标签: jquery python ajax django

更新:借助karthikr的帮助(谢谢!),我能够让服务器确认ajax POST请求。一如既往,解决一个问题 - 遇到另一个问题。

这里是views.py中的相关代码:

def index(request):
    if request.is_ajax():
        print('ajax request')
        data = json.loads(request.body, parse_float=Decimal)

这是index.html中的AJAX请求:

$("#btn1").click(function() {
    $.ajax({
        url: "https://api.github.com/",
        type: "GET",
        dataType: 'json',
        success: function(data) {
            $.ajax({
                url: "{% url 'index' %}",
                type: "POST",
                data: JSON.stringify(data),
                contentType: false,
                success: function(data) {
                    console.log("success");
                },
                error: function(data) {
                    alert("There was an error posting the data to the server.");
                },
            });
        },
        error: function(data) {
            alert("There was an error retrieving the data from the API.");
        },
    });
});

如果我评论data = json.loads(request.body, parse_float=Decimal),则Javascript控制台会说成功。当我取消注释时,我得到了#34;将数据发布到服务器时出错了#34;以及500内部服务器错误。我认为这可能与我尝试访问数据的方式有关。我有几种不同的方式来访问已发布的JSON,但它们似乎都没有用。我做错了什么?

原始问题如下。

现在我有一个可用的Django应用程序,用户可以上传MongoDB转储并按下一个按钮,从该转储中提取信息并使用openpyxl将其放入各种电子表格中。

这就是views.py中的方法看起来像上传的JSON并将其放入电子表格中。

def index(request):
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            uploadedfile = request.FILES['docfile']
            data = json.load(uploadedfile)
            num_lines = sum(len(v) for v in data.itervalues())
            generate_report(data, num_lines)

            zip_subdir = 'locationsreport'
            zip_filename = '%s.zip' % zip_subdir

            s = StringIO.StringIO()
            zf = z.ZipFile(s, 'w')
            zf.write('Bing.xlsx')
            zf.write('Facebook.xlsx')
            zf.write('Foursquare.xlsx')
            zf.write('Google.xlsx')
            zf.close()

            response = HttpResponse(s.getvalue(), content_type='application/x-zip-compressed')
            response['Content-Disposition'] = 'attachment; filename=%s' % zip_filename
            return response
    else:
        form = DocumentForm()

    return render_to_response(
        'report/index.html',
        {'form': form,},
        context_instance=RequestContext(request)
    )

generate_report(data, num_lines)调用单独文件(tasks.py)中的方法,该文件只是遍历JSON并将内容放入电子表格的单元格中。

我试图更新它,以便用户只需按下一个按钮,该按钮就可以向外部API发出AJAX调用(按照我的经理的请求)并解析将数据放入电子表格中的数据。但是,我无法解决这个问题。

这是我的AJAX调用(在index.html中):

$(function() {
    $("#btn1").click(function() {
        $.ajax({
            url: "https://api.github.com/",
            type: "GET",
            dataType: 'json',
            success: function(data) {
                $.ajax({
                    url: "{% url 'index' %}",
                    type: "POST",
                    data: data,
                    dataType: 'json',
                    contentType: false,
                    success: function(data) {
                        console.log("success");
                    },
                    error: function(data) {
                        alert("There was an error posting the data to the server.");
                    },
                });
                // alert(JSON.stringify(data));
            },
            error: function(data) {
                alert("There was an error retrieving the data from the API.");
            },
        });
    });
});

我只是使用该GET请求网址进行测试。 GET正常工作 - 最初,成功语句只是注释掉的行(alert(JSON.stringify(data)),它会从URL中吐出数据。但是,当我尝试对索引进行POST时,我得到警告说"将数据发布到服务器时出错。"我如何成功地向服务器发帖,以便我在views.py中的功能可以获取此信息并放入它是一个电子表格?

另外,我是否可能最好放弃这个AJAX请求,转而采用其他方法从API获取信息?

对不起,如果不清楚的话 - 很难准确描述我想要做的事情。如果有人有建议,我会尝试回答有关它的任何问题。

0 个答案:

没有答案