Куда идут дела, когда я «печатаю» их из своего приложения Django? - PullRequest
6 голосов
/ 06 июля 2010

У меня есть приложение Django на сервере Linux.В одном из представлений выполняется некоторая форма команды print, и выводится некоторая строка.Как я могу узнать, какой была напечатанная строка?Есть ли какой-нибудь журнал, в котором хранятся эти вещи?

Ответы [ 4 ]

4 голосов
/ 06 июля 2010

Выход должен быть в терминале, где был запущен django.(если вы не запустили его напрямую, я не верю, что есть способ его прочитать)

Как указывалось в ссылках, лучше не использовать print, потому что это может вызвать исключения!Но это не единственная причина: существуют модули (например, logging ), созданные для таких целей, и у них гораздо больше возможностей.

Этот сайт (даже когда онс 2008 г.) подтвердите мои утверждения:

Если вы хотите знать, что происходит внутри представления, самый быстрый способ - добавить оператор печати.Сервер разработки выводит любые операторы печати непосредственно на терминал;это серверная альтернатива предупреждению JavaScript ().

Если вы хотите быть немного более изощренным с ведением журналирования, стоит обратиться к модулю журналирования Python (часть стандартабиблиотека).Вы можете настроить его в вашем settings.py: здесь он описывает, что делать (смотрите на сайте)

Для целей отладки вы также можете включить режим отладки или используйте django-debug-toolbar .

Надеюсь, это поможет!:)

3 голосов
/ 13 июля 2010

Никогда не используйте print , так как после развертывания он будет печататься на стандартный вывод, и WGSI сломается.

Используйте logging . Для целей разработки действительно прост в настройке. На вашем проекте __init__.py:

import logging
from django.conf import settings

fmt = getattr(settings, 'LOG_FORMAT', None)
lvl = getattr(settings, 'LOG_LEVEL', logging.DEBUG)

logging.basicConfig(format=fmt, level=lvl)
logging.debug("Logging started on %s for %s" % (logging.root.name, logging.getLevelName(lvl)))

Теперь все, что вы регистрируете, отправляется на stderr, в данном случае на ваш терминал.

logging.debug("Oh hai!")

Кроме того, вы можете контролировать многословие в settings.py с настройкой LOG_LEVEL.

1 голос
/ 06 июля 2010

Отпечаток прекрасно отображается с "./manage.py runserver" или другими вариантами - как упоминает Джошуа, он отображается в терминале, где вы его запустили. Если вы используете FCGI из cron или чего-то подобного, это просто сваливается в небытие, и вы теряете его полностью.

Для мест, где я хочу «печатать», например, предупреждения или уведомления, я использую экземпляр регистратора python, который отправляет syslog, чтобы захватить вывод и поместить его куда-нибудь. Я создаю экземпляр экземпляра входа в один из модулей по мере его загрузки - именно для этого я выбрал models.py, и я знал, что он всегда будет оцениваться до поступления запросов.

import logging, logging.handlers

logger = logging.getLogger("djangosyslog")
hdlr = logging.handlers.SysLogHandler(facility=logging.handlers.SysLogHandler.LOG_DAEMON)
formatter = logging.Formatter('%(filename)s: %(levelname)s: %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)

Затем, когда вы хотите вызвать сообщение для регистратора в ваших представлениях или что-то еще:

logger = logging.getLogger("djangosyslog")
logging.warning("Protocol problem: %s", "connection reset", extra=d)

Есть .error (), .critical () и другие - проверьте http://docs.python.org/library/logging.html для подробностей.

Панель инструментов отладки Роба Хадсона хороша, если вы ищете эту отладочную информацию - я часто использую ее в разработке самостоятельно. Он предоставляет вам данные о текущем запросе и ответе, включая SQL, используемый для генерации любой данной страницы. Вы можете ввести в эти данные, как печать, нажав Строки, которые вас интересуют в контексте / ответе - но я обнаружил, что с этим немного сложно иметь дело.

0 голосов
/ 11 июля 2010

Предупреждение: если вы попытаетесь развернуть код с операторами print в WSGI, ожидайте, что что-то сломается.Вместо этого используйте модуль регистрации.

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