Самый простой способ написать программу на Python с доступом к функциональности базы данных Django

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

Как проще всего сделать так, чтобы программа Python имела доступ к моему конкретному приложению Django и Django ORM?


person Deniz Dogan    schedule 04.09.2009    source источник
comment
дубликат: stackoverflow.com/questions / 579511 /   -  person S.Lott    schedule 05.09.2009
comment
Дубликат: stackoverflow.com/questions/302651/   -  person S.Lott    schedule 05.09.2009


Ответы (5)


from django.core.management import setup_environ
from django.core.mail import EmailMultiAlternatives, send_mail
from django.contrib.auth.models import User

import settings
from my.app.models import *

setup_environ(settings)

Вот как я сделал это для cron, который рассылал по электронной почте ежедневные обновления. .Py находился в корне моего приложения django, поэтому настройки импорта это отразили соответственно.

person Joel Hooks    schedule 04.09.2009
comment
Это было очень полезно. Спасибо. - person Paolo Bergantino; 05.09.2009

Альтернативой всем приведенным здесь подходам является написание вашего задания cron как пользовательской команды ./manage.py. Это очень просто сделать и дает вам возможность делать ./manage.py yourcommand либо в командной строке, либо в вашем crontab.

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

person Daniel Roseman    schedule 04.09.2009
comment
Это работает безупречно; в качестве дополнительного примечания имейте в виду, что cron и apache принадлежат разным пользователям, и поэтому у вас могут быть проблемы со средой (например, прокси, разрешения и т. д.). - person rob; 05.09.2009
comment
Вероятно, вы можете запустить задание cron от имени пользователя apache. - person Matthew Schinckel; 05.09.2009

Изменить: для Django 1.7

import os
import django

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")
django.setup()
#have fun

Кредит


Выбранный ответ устарел с Django 1.4.

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")
#from your_app_name import models
##have fun

Источник: https://stackoverflow.com/a/18760222

person Mike S    schedule 15.01.2014

Вам нужно что-то вроде этого в вашем crontab:

PYTHONPATH=/path/to/your/project DJANGO_SETTINGS_MODULE=settings myscript.py

И тогда ваш скрипт python должен начинаться с этого:

#!/usr/bin/env python

from django.conf import settings

Оттуда вы сможете импортировать свои модели / представления / формы / все, что угодно, и иметь среду, во многом похожую на ./manage.py shell

Примечание. В зависимости от того, как вы выполняете импорт внутри проекта, это может работать не так, как показано. Если вы всегда делаете что-то вроде «from myproject.myapp.models import *», тогда вам нужно настроить строку cron, чтобы она выглядела примерно так:

PYTHONPATH=/path/to/1_level_before_your_project DJANGO_SETTINGS_MODULE=myproject.settings myscript.py
person Ian Clelland    schedule 04.09.2009

Я хотел бы иметь программу Python, которая запускается с использованием cronjob вместо того, чтобы вручную посещать правильный URL-адрес для обновления информации.

Упрощенная альтернатива: напишите задание cron для автоматического «посещения правильного URL-адреса для обновления информации» - в конце концов, это может быть так же просто, как curl или wget. Это не дает ответа на вопрос в заголовке, но, учитывая то, как вы объясняете свою реальную основную проблему, это может быть самый простой и незамедлительный подход к ее решению.

person Alex Martelli    schedule 04.09.2009