Как отправить форму в Django в назначенное время? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть типичная форма, где пользователи могут поместить свои значения, отправить форму и увидеть результаты в таблице:

class ScanForm(form.ModelForm):
""" Creating a form for Scan results """
    value = forms.DecimalField(widget=forms.NumberInput(
        attrs={
            'class': 'form-control',
            'placeholder': 'Value',
            'max': '500',
        }
    ))
    count = forms.DecimalField(widget=forms.NumberInput(
        attrs={
            'class': 'form-control',
            'placeholder': 'Amount',
            'max': '400',
            }
    ))
    class Meta:
    """ Adding choice of interval and exclude unused fields """
        model = ScannedValue
        exclude = ('scan_date',)
        widgets = {
            'interval': forms.Select(
                attrs={
                    'class': 'form-control',
                }),
        }

Я как обычно отображаю эту форму в файле index.html. И он работает нормально, когда я помещаю все данные и нажимаю кнопку «Отправить».

Но мне нужно автоматически отправить эту форму с заполненными значениями (скажем, для 'value' = 5, 'count' = 10) в определенное время, скажем, в 01:00 вечера каждый день. Затем мне нужно проанализировать все полученные данные с помощью функции в моих представлениях после отправки формы, а затем сохранить результаты в базе данных. Какой самый лучший и самый правильный способ сделать это?

Вот функция в views.py:

def scans(request): 
    form = ScanForm(request.POST or None) 
    if request.method == 'POST': 
        if form.is_valid(): 
            def fetch_scan(interval='1', amount=10, value=5): 
                # doing_some_stuff
else: 
form = ScanForm()

Так что я хочу запускать функцию fetch_scan () только автоматически в определенное время с моими аргументами каждый день.

1 Ответ

1 голос
/ 25 апреля 2019

Вам не нужно отправлять формы для вашего варианта использования.Вам нужно определить fetch_scan вне представления, а затем преобразовать его в задачу сельдерея.Затем его можно запускать как периодическое задание.

@app.task()  # convert to celery task
def fetch_scan(interval='1', amount=10, value=5): 
       # doing_some_stuff

def scans(request): 
    form = ScanForm(request.POST or None) 
    if request.method == 'POST': 
        if form.is_valid(): 
            fetch_scan()  # call the function
    else: 
      form = ScanForm()

Затем можно просто запускать задание fetch_scan каждый день.

#settings.py

from celery.schedules import crontab
CELERYBEAT_SCHEDULE = {
    'daily-scan': {
        'task': 'path.to.fetch_scan',
        'schedule': crontab(hour=13),  #run daily at 1 pm
    },
}

документы

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