View没有返回响应

时间:2016-09-15 11:34:33

标签: django

我正在开发一个python django网络应用程序,我希望在其中实现国际化并将整个应用程序自动翻译成法语或中文。

我参考了这个网站https://www.metod.io/en/blog/2015/05/05/django-i18n-part-1/

但每当我尝试运行该应用时,都会显示以下错误:

  

500:/ en / get_dashboard_data /视图中的ValueError   dashboard.views.getDashboardData未返回HttpResponse对象。   它改为返回None。

url get_dashboard_data通过ajax获取数据。

url(r'^get_dashboard_data/$', views.getDashboardData, name='getDashboardData'),

视图

@login_required(login_url='/')
def getDashboardData(request):
    dbname = request.user.username
    if request.method == 'POST' and request.is_ajax():
        if request.POST.get('action') == 'sale_chart_data':
            data = DashboardData(dbname).getSaleChartData()
            channel_list = data[0]
            data_list = data[1]
            print 123, data_list, channel_list
            return HttpResponse(json.dumps({'channel_list':channel_list, 'data_list':data_list}), content_type='application/json')

        if request.POST.get('action') == 'get_sale_numbers':
            sale_data = DashboardData(dbname).getSaleNumbers()
            return HttpResponse(json.dumps({'sale_number_data':sale_data}), content_type='application/json')

        if request.POST.get('action') == 'get_inventory_numbers':
            inventory_data = DashboardData(dbname).getInventoryData()
            return HttpResponse(json.dumps({'inventory_data':inventory_data}), content_type='application/json')

        if request.POST.get('action') == 'get_order_numbers':
            order_data = DashboardData(dbname).getOrderData()
            return HttpResponse(json.dumps({'order_data':order_data}), content_type='application/json')

        if request.POST.get('action') == 'get_hourly_data':
            order_data = DashboardData(dbname).getHourlyData()
            sale_data = order_data[1]
            count_data = order_data[0]
            return HttpResponse(json.dumps({'sale_data':sale_data, 'count_data':count_data}), content_type='application/json')

        if request.POST.get('action') == 'top_performers':
            data = DashboardData(dbname).getTopPerformers()
            inventory_count_dict = data[0]
            current_month_dict = data[1]
            last_month_dict = data[2]
            current_quarter_dict = data[3]
            current_year_dict = data[4]
            channel_list = data[5]
            return HttpResponse(json.dumps({'inventory_count_dict':inventory_count_dict,'current_month_dict':current_month_dict,'last_month_dict':last_month_dict,'current_quarter_dict':current_quarter_dict,'current_year_dict':current_year_dict,'channel_list':channel_list}), content_type='application/json')

        if request.POST.get('action') == 'top_products':
            product_data = DashboardData(dbname).getTopProducts()
            return HttpResponse(json.dumps({'product_data':product_data}), content_type='application/json')

的javascript

function getSaleChart(){
    $.ajax({
        url : "/get_dashboard_data/",
        type : "POST",
        data : {action:'sale_chart_data'},

        success : function(response) {
            channel_list = response.channel_list;
            data_list = response.data_list;
            c3.generate({
                bindto: '#sale-chart-30-days',
                data:{
                    x: 'dates',
                    xFormat: '%b %d',
                    columns: data_list,
                    colors:{
                        Flipkart: '#1AB394',
                        Paytm: '#BABABA'
                    },
                    type: 'bar',
                    groups: [ channel_list ]
                },
                axis: {
                    x: {
                        type: 'timeseries'
                    }
                }
            });
        },

        error : function(xhr,errmsg,err) {
            toastr["error"]("Something Broke.", "Oops !!!.");
            console.log(xhr.status + ": " + xhr.responseText);
        }
    });
}

2 个答案:

答案 0 :(得分:3)

这就是为什么你应该真正练习更多的防御性编程。虽然您坚持请求方法是POST并且它是ajax并且操作是sale_chart_data,但这三者中的一个不是您期望的那样。

你的功能真的应该如下。这是一个古老的好习惯。

def getDashboardData(request):
    dbname = request.user.username
    if request.method == 'POST' and request.is_ajax():
        action = request.POST.get('action') 
        if action == 'sale_chart_data':
            data = DashboardData(dbname).getSaleChartData()
            ....
        ... 
        # other if conditions here
        else :
            return HttpResponse(json.dumps({'message':'Unknown action {0}'.format(action)}), content_type='application/json')

    else :
            return HttpResponse(json.dumps({'message':'Only ajax post supported'}), content_type='application/json')

然后你应该设置断点并评估请求,以弄清楚这个特定请求到底发生了什么。

答案 1 :(得分:0)

我的猜测是你的JavaScript确实向/en/get_dashboard_data/发出POST请求,但由于某种i18n中间件,它会收到/en/get_dashboard_data/的重定向响应(HTTP 301或302)。

浏览器遵循重定向,但对<script>var dashBoardDataUrl = "{% url "name-of-dashboard-url" %}"</script>的新请求是GET请求。

编辑:

当遵循重定向时,浏览器将始终执行第二个请求作为GET,没有办法阻止它。您有几种方法可以解决这个问题:

  • 向正确的应用程序发出初始请求。这意味着您必须将i18n URL传递给JavaScript而不是硬编码。您可以在模板中添加以下内容:

    {{1}}

  • 因为您的“操作”只是获取代码,您可以接受GET请求并从查询参数中读取操作

  • 将该视图拆分为几个接受GET请求的较小视图,以便您拥有类似于REST API的内容。