带有ajax的django应用程序用于处理数据帧

Posted

技术标签:

【中文标题】带有ajax的django应用程序用于处理数据帧【英文标题】:django app with ajax for processing dataframe 【发布时间】:2021-01-07 04:34:34 【问题描述】:

我试图在用户上传 excel 文件后立即显示繁忙的指示符图像。文件处理完成后,我想用已处理的表替换图像。 问题:

    ajax 成功块未执行(成功块内的警报消息不起作用) 上传的数据转换为json,但无法转换回dataframe进行处理。

在views.py中点击上传按钮时执行的代码

def indicator(request):
    excel_file = request.FILES["excel_file"]
    uploaded_data = pd.read_excel(excel_file)
    df_json = uploaded_data.to_json()
    
return render(request,'myapp/indicator.html','df':df_json)

indicator.html:

<script>
    var dataframe = JSON.parse("df|escapejs");
    var replace_data = function(data)
        alert('successs')
        $('#success').append(data.list_of_jsonstuffs);
        $('#loading').remove()
    
    $(document).ready(function()
        $.ajax(
            url: '/processing/',
            type:'GET',
            dataType: 'json',
            data: JSON.stringify(dataframe),
            success: function(data)
                alert('ajax done')
                replace_data(data)
            


        )
    )

    </script>

视图中触发和执行处理的函数。


@csrf_exempt
def processing_file(request):
    if request.is_ajax():
        excel_file1 = json.dumps(request.GET)
        e1 = json.loads(excel_file1)
        input_df = pd.DataFrame.from_dict([e1])
        print(input_df.shape)
        processed = gen.generate_output_columns(excel_file)
        output_validation = processed[const.OUTPUTCOLUMNSWITHVALIDATION]
        excel_data = output_validation.values.tolist()
        return excel_data

input_df 是 1 x 2,但上传的 excel 是 17 x 55。在 JSON Stringify 和 json 加载的某个地方,结构正在发生变化,但是当我尝试使用 POST 时,我曾经能够成功处理,但成功块永远不会被执行。有人可以帮我理解我的 json 到 django 中的数据帧解析和 ajax 成功有什么问题吗?

【问题讨论】:

【参考方案1】:

我能够使用 Ajax POST 而不是 Ajax GET 在 django 应用程序上实现加载动画。发布代码以防出现在搜索结果中。

fileprocessed.html

    <script>
        var dataframe = JSON.parse("df|escapejs");
        var replace_data = function(data)
            $('#loading').remove()
            $('#load_processed').DataTable(
                columns:[
                    title:'col1',
                    title:'col2',
                    title:'col3',
                    title:'col4',
                    title:'col5',
                    title:'col6',
                    title:'col7',
                    title:'col8',
                    title:'col9',
                    title:'col10',
                    title:'col11',
                    title:'col12',
                    title:'col13',
                    title:'col14',
                    title:'col15',
                    title:'col16',
                    title:'col17',
                    title:'col18',
                    title:'col19',
                    title:'col20'
                ],
                data: data
            );
    
        
        $(document).ready(function()
            $.ajax(
                url: '/processing/',
                type:'POST',
                data: JSON.stringify(dataframe),
                success: function(data)
                    replace_data(data)
                
            )
        )
        </script>
<div id="loading">
<div id="img_div">
    %  load static %<img src="%  static  "/img/hourGlass.gif" %" /></div>
    <p><b>Loading....</b></p>
</div>
<div id="success">
<table id="load_processed" class="display" >

</table>

用户点击UI按钮时触发的函数,

def busy_indicator(request):
    excel_file = request.FILES["excel_file"]
    uploaded_data = pd.read_excel(excel_file)
    df_json = uploaded_data.to_json()
    return render(request,'myapp/file_processed.html','df':df_json)

ajax调用下面的函数(url /processing如上ajax后代码所示),

@csrf_exempt
def processing_file(request):
    if request.is_ajax():
        e1 = json.loads(request.body) #parses incoming json data
        input_df = pd.DataFrame.from_dict(e1) #converts to df as my process script 
                                              #requires dataframe input
        processed = gen.generate_output_columns(input_df) 
        output_validation = processed[const.OUTPUTCOLUMNSWITHVALIDATION]
        excel_data = output_validation.values.tolist()
        return HttpResponse(json.dumps(excel_data), content_type='application/json')#sends 
                   #back json to ajax 
                                       

【讨论】:

以上是关于带有ajax的django应用程序用于处理数据帧的主要内容,如果未能解决你的问题,请参考以下文章

带有验证和多个表单处理的 Django Ajax 提交

如何使用多个 Django FBV 通过 Ajax+jQuery 捕获和保存数据

带有错误回调函数的 Ajax 响应

如何构建 django ajax 模态弹出表单(带有服务器端表单)?

带有ajax的Django过滤器功能不起作用

Django CSRF 令牌错误或缺少 Ajax POST 请求