Как отладить AJAX View в производстве? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть это представление, которое отвечает только на запросы 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)

Этот код работает на локальном сервере dev, но выдает 500 error в консоли dev-tools, когда я пытаюсь получить доступ к странице с этим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 есть все необходимые индексы.Они генерируются на моей локальной машине, а затем загружаются в продукт.Но я думаю, что это может сработать, потому что я тестировал для копирования индексов, и они работали на локальных.
Как я могу проверить, на каком этапе происходит сбой этого представления AJAX?

1 Ответ

0 голосов
/ 16 мая 2018

Бедное мужское решение: вернуть исключение в ответ

A плохое решение состоит в том, чтобы вернуть исключение в качестве ответа (делайте это только на этапе тестирования! Так как оно потенциально предоставляет информацию, которую может использовать хакер).

<b>from traceback import format_exc</b>

def ajax_product_details_like_prods(request, product_id):
    <b>try:</b>
        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)
    <b>except Exception as e:
        return JsonResponse({'error': repr(e), 'traceback': format_exc()})</b>

Средства ведения журнала

Это, конечно, не очень хорошее решение для рабочего сервера: оно раскрывает детали, которые вы, вероятно, хотите скрыть. Кроме того, пользователь только запутается.

Вы можете использовать такие инструменты регистрации, как Sentry и добавить приложение в вашу установку Django. В этом случае это создаст новую проблему, если есть исключение, которое вы не перехватили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...