Как я могу периодически запускать скрипт Python для импорта данных в приложение Django?

У меня есть скрипт, который сканирует почтовый ящик на наличие определенных писем. Эта часть работает хорошо, и я могу получить интересующие меня данные. Теперь я хотел бы взять эти данные и добавить их в приложение Django, которое будет использоваться для отображения информации.

Я могу запускать скрипт в задании CRON, чтобы периодически получать новую информацию, но как мне передать эти данные в приложение Django?

Сервер Django работает в Linux под управлением Apache/FastCGI, если это имеет значение.

[Изменить] – в ответ на вопрос Шрикара When you are saying " get that data into the Django app" what exactly do you mean?...

Приложение Django будет отвечать за хранение данных в удобной форме, чтобы затем их можно было отобразить в виде ряда представлений. Таким образом, приложение будет включать в себя модель с подходящими членами для хранения входящих данных. Я просто не уверен, как вы подключаетесь к Django, чтобы создавать новые экземпляры этих объектов модели и указывать Django для их хранения.


person Jon Cage    schedule 05.07.2012    source источник


Ответы (8)


Я думаю, Celery — это то, что вам нужно.

person keithxm23    schedule 05.07.2012
comment
Как это поможет мне вставлять данные в приложение DJango? Насколько я вижу, это просто заменит работу CRON или я что-то упустил? - person Jon Cage; 05.07.2012
comment
А, хорошо, имеет больше смысла с некоторой предысторией: slideshare.net/idangazit/an- знакомство с сельдереем - person Jon Cage; 05.07.2012
comment
Дополнительные документы здесь: celery.github.com/celery/django/ первые шаги-с-django.html - person Jon Cage; 05.07.2012
comment
Кажется, что это может быть излишним, когда у меня есть только один сервер и одна задача, которую можно выполнять последовательно? Не могли бы вы уточнить, как я могу подключить свою электронную почту к celery, чтобы отправить информацию в серверную часть DJango? - person Jon Cage; 06.07.2012

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

Вы также можете попробовать существующую команду loaddata, но она пытается загрузить данные из прибора, добавленного в каталог вашего приложения.

person Rohan    schedule 05.07.2012
comment
Это выглядит многообещающе. Какую команду вы бы использовали в CRON для вызова команды? - person Jon Cage; 05.07.2012
comment
@JonCage Вы можете обратиться к stackoverflow.com/questions/1601153/ о том, как запустить команду из cron. - person Rohan; 06.07.2012

Я сделал то же самое.

Во-первых, мой скрипт уже анализировал электронные письма и сохранял их в базе данных, поэтому я установил базу данных в settings.py и использовал python manage.py inspectdb для создания модели на основе этой базы данных.

Тогда это просто вопрос создания представления для отображения информации из вашей базы данных.

Если ваш скрипт еще не использует базу данных, было бы просто создать модель с той информацией, которую вы хотите сохранить, а затем заставить ваш скрипт записывать в таблицы, описанные моделью.

person Charles Crofford    schedule 20.04.2013

Забудьте на секунду о том, что это приложение Django. Это просто загрузка кода Python.

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

Единственная разница здесь в том, что вам, возможно, придется позаботиться об импорте всего, что нужно Django для работы с этими модулями, тогда как когда запрос поступает через обычный веб-интерфейс, он позаботится об этом за вас.

Просто импортируйте Django и необходимые модули models.py/любые другие, необходимые для работы из вашего приложения. Это ваш код, а не черный ящик. Вы можете импортировать его откуда угодно.

EDIT: Ссылка из ответа Рохана на документы Django для пользовательских команд управления, безусловно, является наименее болезненным способом сделать то, что я сказал выше.

person Tom Manterfield    schedule 20.04.2013

Когда вы говорите «получить эти данные в приложение DJango», что именно вы имеете в виду?

Я предполагаю, что вы используете какую-то базу данных (например, mysql). Вставьте любые данные, которые вы собрали из своего cronjob, в соответствующие таблицы, к которым обращается ваше приложение Django. Также вставьте эти данные cron в те же таблицы, к которым обращаются ваши пользователи. Таким образом, ваши изменения немедленно отразятся на пользователях, использующих приложение, поскольку они будут получать доступ к данным из той же таблицы.

person Srikar Appalaraju    schedule 05.07.2012

Лучший способ?

Создайте представление на стороне django для обработки получения данных, и пусть ваш скрипт выполняет HTTP POST для URL-адреса, зарегистрированного для этого представления.

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

person cha0site    schedule 05.07.2012
comment
Мне кажется неэффективным проходить через веб-сервер, чтобы сделать это, а не как-то подключаться к серверной части? - person Jon Cage; 05.07.2012

Пусть ваш скрипт отправляет запрос HTTP Post следующим образом. Это запросы библиотеки

>>> files = {'report.xls': open('report.xls', 'rb')}

>>> r = requests.post(url, files=files)
>>> r.text

затем на принимающей стороне вы можете использовать web.py для обработки такой информации

x = web.input()

тогда делай что хочешь с х

На принимающей стороне POST-запроса импортируйте сеть и напишите функцию, которая обрабатывает публикацию.

Например

    def POST(self):

        x = web.input()
person SJP    schedule 05.07.2012
comment
Что такое запросы и сеть в приведенном выше фрагменте? Можете ли вы привести более полный пример? - person Jon Cage; 05.07.2012
comment
Документы по запросам можно найти docs.python- request.org/en/latest/user/quickstart/, а файл web.py для обработки запросов находится по адресу webpy. .org Я только что написал программу, которая делает то же самое, что и вы, используя эти две библиотеки. - person SJP; 05.07.2012
comment
Итак, web.py — это легкий сервер, который обрабатывает запросы POST/GET? Это совсем не то, что я хочу - у меня есть DJango на сервере для получения данных, я просто не уверен, как мне вызывать соответствующие биты DJango для импорта данных... - person Jon Cage; 06.07.2012

Если вы не хотите использовать HTTP для отправки сообщений туда и обратно, вы можете просто заставить скрипт записать информацию электронной почты в файл .txt, а затем ваше приложение django откроет файл и прочитает его.

РЕДАКТИРОВАТЬ:

Вы можете настроить задание CRON для чтения электронной почты, скажем, в 8 утра, а затем записать его в текстовый файл info.txt. В вашем коде напишите что-то вроде

import time
    if '9' == time.strftime("%H"):
        file = open(info.txt)
        info = file.read()

это проверит файл с 9 утра до 10 утра. если вы хотите, чтобы он проверял только один раз, просто добавьте минуты к оператору if.

person SJP    schedule 05.07.2012
comment
Как бы вы активировали приложение DJango для чтения файлов? Я хочу, чтобы он периодически проверял и автоматически заполнял информацию. Как бы вы заставили DJango читать эти файлы .txt? - person Jon Cage; 06.07.2012
comment
Это не помогает - откуда вы это звоните? Модель? Вид? - person Jon Cage; 06.07.2012
comment
Ваше приложение django находится на том же компьютере, что и скрипт, который проходит через электронные письма? Если это так, поместите его в заднюю часть вашего приложения django, где вам нужна информация из электронной почты. Это была бы модель. Если бы вы могли включить дополнительную информацию о том, как работает ваше приложение, было бы легче объяснить. Решение вашей проблемы на самом деле состоит всего из нескольких строк кода. Если вы хотите по-настоящему разобраться с сельдереем, это вариант, но вам действительно не нужно - person SJP; 06.07.2012
comment
Это правильно; Приложение django и сборщик электронной почты находятся на одном сервере. Сборщик электронной почты — это просто чистый python, поэтому его можно включить в приложение django (которого еще не существует). Детали отрывочны, потому что все, что у меня есть прямо сейчас, - это сценарий электронной почты, который в настоящее время вставляет информацию в базу данных с алхимическим интерфейсом sql. Я хочу вставить данные в это новое приложение django, чтобы я мог играть с ним и отображать информацию в более удобных форматах. Я застрял на том, как запустить скрипт или как включить его в приложение django... - person Jon Cage; 06.07.2012