首页 > 解决方案 > 如何在生产中调试 ajax 视图?

问题描述

我有这个视图,它只响应 AJAX 请求:

def ajax_product_details_like_prods(request, product_id):
    like_prods = None
    product = get_object_or_404(Product, product_id=product_id)
    # Haystack
    if product != None:
        like_prods = SearchQuerySet().more_like_this(product)[:15]    
    html = render_to_string('ajax/product_details.html', {"most_visited": like_prods})

    return HttpResponse(html)

此代码适用于本地开发服务器,500 error但当我尝试在生产服务器上使用该 AJAX 访问页面时,它会在开发工具控制台中抛出。
更多细节:
1)这个视图使用Haystack+Whoosh连接:

HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        'PATH': os.path.join(BASE_DIR, 'whoosh_index')
    },
}

这似乎没问题——当我跑步manage.py shell和打印时settings.HAYSTACK_CONNECTIONS——我看到了一条正确的道路。2)文件夹
中有所有需要的索引。whoosh_index它们是在我的本地机器上生成的,然后上传到 prod。但我认为这可能有效,因为我测试过复制索引并且它们在本地工作。
如何检查此 AJAX 视图在哪个阶段失败?

标签: pythonajaxdjangodebuggingdeployment

解决方案


穷人的解决方案:在答案中返回异常

一个糟糕的解决方案将异常作为答案返回(仅在测试阶段这样做!因为它暴露了黑客可以使用的潜在信息)。

from traceback import format_exc

def ajax_product_details_like_prods(request, product_id):
    try:
        like_prods = None
       product = get_object_or_404(Product, product_id=product_id)
        # Haystack
        if product != None:
            like_prods = SearchQuerySet().more_like_this(product)[:15]    
        html = render_to_string('ajax/product_details.html', {"most_visited": like_prods})

        return HttpResponse(html)
    except Exception as e:
        return JsonResponse({'error': repr(e), 'traceback': format_exc()})

记录工具

对于生产中的服务器来说,这当然不是一个好的解决方案:它暴露了您可能想要隐藏的细节。此外,用户只会感到困惑。

您可以使用Sentry等日志记录工具并将应用程序添加到您的 Django 安装中。在这种情况下,如果您没有捕获到异常,它将创建一个新问题。


推荐阅读