Pergunta

Eu quero o meu feitos de comando do Django para ser executado a cada minuto. No entanto, parece que python /path/to/project/myapp/manage.py mycommand não parece trabalho, enquanto no python manage.py mycommand diretório funciona perfeitamente.

Como posso conseguir isso? Eu uso /etc/crontab com:

****** root python /path/to/project/myapp/manage.py mycommand
Foi útil?

Solução

Eu acho que o problema é que cron está indo para executar seus scripts em um ambiente de "nu", para que o seu DJANGO_SETTINGS_MODULE é provável indefinido. Você pode querer envolvê-lo em um shell script que define primeiramente DJANGO_SETTINGS_MODULE

Algo parecido com isto:

#!/bin/bash

export DJANGO_SETTINGS_MODULE=myproject.settings 
./manage.py mycommand

torná-lo executável (+ x chmod) e, em seguida, configurar o cron para executar o script em seu lugar.

Editar

Eu também queria dizer que você pode "modularizar" este conceito um pouco e torná-lo de tal forma que seu script aceita a gerenciar comandos como argumentos.

#!/bin/bash

export DJANGO_SETTINGS_MODULE=myproject.settings
./manage.py ${*}

Agora, seu trabalho cron pode simplesmente passar "mycommand" ou qualquer outro comando manage.py você deseja executar a partir de um trabalho cron.

Outras dicas

cd /path/to/project/myapp && python manage.py mycommand

Por encadeamento de seus comandos como esta, python não será executada a menos cd muda corretamente o diretório.

Se você quer que sua vida Django muito mais simples, usar o Django-extensões de comando dentro do seu projeto:

http://code.google.com/p/django-command-extensions /

Você vai encontrar um comando chamado "runscript" para que você simplesmente adicionar o comando para sua linha crontab:

****** root python /path/to/project/myapp/manage.py runscript mycommand

E esse script será executado com o meio ambiente contexto Django.

Isto é o que eu tenho feito recentemente em um dos meus projetos, (i manter venvs para cada projeto de trabalho i, por isso estou assumning você tem venvs)

 ***** /path/to/venvs/bin/python /path/to/app/manage.py command_name

Isso funcionou perfeitamente para mim.

A extensão runscript não foi bem documentada. Ao contrário dos django comandar este pode ir a qualquer lugar em seu projeto e requer uma pasta scripts. O arquivo .py requer uma função run ().

  1. Se seu um script autônomo, você precisa fazer isso:

    from django.conf import settings
    from django.core.management import setup_environ
    setup_environ(settings)
    
    #your code here which uses django code, like django model
    
  2. Se seu um django comando, é mais fácil: https://coderwall.com/p/k5p6ag

    Em (management / commands / exporter.py)

    from django.core.management.base import BaseCommand, CommandError
    
    class Command(BaseCommand):
        args = ''
        help = 'Export data to remote server'
    
        def handle(self, *args, **options):
            # do something here
    

E, em seguida, na linha de comando:

$ python manage.py exporter

Agora, é fácil adicionar uma nova tarefa cron para um sistema Linux, usando crontab:

$ crontab -e

or $ sudo crontab -e if you need root privileges

No arquivo crontab, por exemplo, para executar este comando a cada 15 minutos, algo como isto:

# m h  dom mon dow   command
*/15 * * * * python /var/www/myapp/manage.py exporter
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top