LINUX.ORG.RU

Запись данных из requests запроса в БД django по расписанию.

 


1

2

Пытаюсь разобраться с работой планировщика django-rq-scheduler . Имеется небольшая модель:

class Currency(models.Model):
    name = models.CharField('Название валюты', max_length=20)
    price_usd = models.DecimalField(
        'Курс в долларах', max_digits=20, decimal_places=10, blank=True, null=True)
    last_updated = models.IntegerField('Последние обновление')


    def __str__(self):
        return '%s %s %s' % (self.name, self.price_usd, self.last_updated)
  • Вот варианты кода,которыми пытаюсь записать данные: 1)
    import requests
    from models import Currency
    from django_rq import job
    
    
    
    @job
    def save_exchange_rates():
        
        url = 'https://api.coinmarketcap.com/v1/ticker/'
        repositories = requests.get(url).json()
        for exchange in repositories:
            cur = Currency()
            cur.name = exchange['name']
            cur.price_usd = exchange['price_usd']
            cur.last_updated =  exchange['last_updated']
            cur.save()
    
    if __name__ == '__main__':
        save_exchange_rates()
    

    2)

    import requests
    from models import Currency
    from django_rq import job
    
    
    
    @job
    def save_exchange_rates():
        
        url = 'https://api.coinmarketcap.com/v1/ticker/'
        repositories = requests.get(url).json()
        for exchange in repositories:
            Currency.objects.create(name=exchange['name'],
                                    price_usd=exchange['price_usd'],
                                    last_updated=exchange['last_updated'],)
    
    
    if __name__ == '__main__':
        save_exchange_rates()
    
    При попытке запустить их вручную, возникает ошибка:
    Traceback (most recent call last):
      File "task.py", line 2, in <module>
        from models import Currency
      File "/home/pavel/django/market_coins/market_capitalizations/exchange_rates/models.py", line 10, in <module>
        class Currency(models.Model):
      File "/home/pavel/django/market_coins/env/lib/python3.5/site-packages/django/db/models/base.py", line 100, in __new__
        app_config = apps.get_containing_app_config(module)
      File "/home/pavel/django/market_coins/env/lib/python3.5/site-packages/django/apps/registry.py", line 244, in get_containing_app_config
        self.check_apps_ready()
      File "/home/pavel/django/market_coins/env/lib/python3.5/site-packages/django/apps/registry.py", line 127, in check_apps_ready
        raise AppRegistryNotReady("Apps aren't loaded yet.")
    django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
    
    
    Подскажите, о Гуру, в чем может быть причина?
  • И еще вопрос про Repeatable Jobs в админке. Можно ли там передать параметр к выполняемой функции в поле Callable: .Для примера, хочу вызывать функцию с помощью django-rq-scheduler для каждой валюты с разным расписанием:
    import requests
    from models import Currency
    from django_rq import job
    
    
    
    @job
    def save_exchange_rates(coin):
        
        url = 'https://api.coinmarketcap.com/v1/ticker/{}/'.format(coin)
        exchange = requests.get(url).json()
        Currency.objects.create(name=exchange['name'],
                                price_usd=exchange['price_usd'],
                                last_updated=exchange['last_updated'],)
    
    
    if __name__ == '__main__':
        save_exchange_rates()
    

Ответ на: комментарий от pawnhearts
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'market_capitalizations.settings'
import django
django.setup()
from django_rq import job
import requests
from exchange_rates.models import Currency


@job
def save_exchange_rates():
    
    url = 'https://api.coinmarketcap.com/v1/ticker/'
    repositories = requests.get(url).json()
    for exchange in repositories:
        cur = Currency()
        cur.name = exchange['name']
        cur.price_usd = exchange['price_usd']
        cur.last_updated =  exchange['last_updated']
        cur.save()

        
if __name__ == '__main__':
    save_exchange_rates()

Теперь опять ошибка,но другая:

Traceback (most recent call last):
  File "task.py", line 4, in <module>
    django.setup()
  File "/home/pavel/django/market_coins/env/lib/python3.5/site-packages/django/__init__.py", line 19, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "/home/pavel/django/market_coins/env/lib/python3.5/site-packages/django/conf/__init__.py", line 56, in__getattr__
    self._setup(name)
  File "/home/pavel/django/market_coins/env/lib/python3.5/site-packages/django/conf/__init__.py", line 43, in_setup
    self._wrapped = Settings(settings_module)
  File "/home/pavel/django/market_coins/env/lib/python3.5/site-packages/django/conf/__init__.py", line 106, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/home/pavel/django/market_coins/env/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked
ImportError: No module named 'market_capitalizations'

os.environ['DJANGO_SETTINGS_MODULE'] = 'pricelist.settings' - Здесь путь в файлу сеттингс указывается?

PavelShturm ()
Ответ на: комментарий от PavelShturm

Да.

Куда ты файл кладешь? У тебя должен быть каталог проекта типа myproject в нем ещё один каталог myproject, в котором settings.py и там же каталоги с apps.

Предполагается что файлик лежит в верхнем myproject.

Вообще можешь через management command сделать.

pawnhearts ★★★★★ ()
Ответ на: комментарий от pawnhearts

Я хочу django-rq-scheduler за юзать. management command через крон придется запускать?

Т.е. скрипт ложу в папку с manage.py ? .т.к. это и есть верхний каталог.

PavelShturm ()
Ответ на: комментарий от pawnhearts

Спасибо!!! дело было в неправильном расположении скрипта.

Ты django-rq-scheduler пользоваться умеешь? можно параметр при вызове функции передавать в поле Callable?

PavelShturm ()
Ответ на: комментарий от PavelShturm

Не пользовался никогда. Походу нет. Но в самом django_rq параметры передавать можно. Надо или модифицировать django-rq-scheduler добавив туда такую фичу или что-то другое использовать.

pawnhearts ★★★★★ ()
Ответ на: комментарий от pawnhearts

Теперь с django-rq-scheduler воевать(( Не хочет запускать скрипт по расписанию. Поставил ему раз в минуту выполнять, а он еще ни разу не сделал...

PavelShturm ()
Ответ на: комментарий от pawnhearts

rq вроде запущен:


python manage.py rqworker high default low
18:50:18 Registering birth of worker pavel-X550VB.16125
18:50:18 RQ worker 'rq:worker:pavel-X550VB.16125' started, version 0.10.0
18:50:18 *** Listening on high, default, low...
18:50:18 Sent heartbeat to prevent worker timeout. Next one should arrive within 420 seconds.
18:50:18 Cleaning registries for queue: high
18:50:18 Cleaning registries for queue: default
18:50:18 Cleaning registries for queue: low
18:50:18 *** Listening on high,default,low...
18:50:18 Sent heartbeat to prevent worker timeout. Next one should arrive within 420 seconds.
[\code]

В ручную, как ты написал - все запустилось.

Но что-то планировщик не срабатывает, хотя в веб форме вроде все заполнил. Не Repeatable Jobs ,не Scheduled Jobs не срабатывают с веб формы.

Может я форму неправильно подключил? Хотя все по инструкции делал.

PavelShturm ()
Ответ на: комментарий от pawnhearts

Спасибо! Ты сильно помог,хоть и не до конца разобрались) Scheduled Jobs начал срабатывать.Но Repeatable Jobs так и не срабатывает, походу не передает данные в rqworker.

PavelShturm ()

Переделал на rq worker, rqscheduler.

Добрый вечер! Подскажите ,правильно ли я вызываю функцию в планировщике?

scheduler.py:

from redis import Redis
from rq_scheduler import Scheduler
from datetime import datetime
from task import save_exchange_rates

redis_conn = Redis()
scheduler = Scheduler(connection=redis_conn) 

scheduler.schedule(
    datetime.utcnow(),
    save_exchange_rates, 
    interval=10,                  
    repeat=None,                    
)

task.py:

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'market_capitalizations.settings'
import django
django.setup()
import requests
from exchange_rates.models import Currency


def save_exchange_rates():
    url = 'https://api.coinmarketcap.com/v1/ticker/'
    repositories = requests.get(url).json()
    for exchange in repositories:
          Currency.objects.create(name=exchange['name'],
                                                 price_usd=exchange['price_usd'],
                                                 last_updated=exchange['last_updated'],)


if __name__ == '__main__':
    save_exchange_rates()
Если таск руками запустить, то она работает. службы :rq worker, rqscheduler и сам джанго - запущены. Редис установлен и пишет «* The server is now ready to accept connections on port 6379».

Подскажите ,пожалуйста, из-за чего может не срабатывать scheduler?

PavelShturm ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.