通过URL执行管理命令

时间:2013-01-15 10:34:01

标签: django scrapy

我有以下管理命令(website.py)

from __future__ import absolute_import
from django.core.management.base import BaseCommand


class Command(BaseCommand):

    def run_from_argv(self, argv):
        self._argv = argv
        self.execute()

    def handle(self, *args, **options):
        from scrapy.cmdline import execute
        execute(self._argv[1:])

我想通过URL执行此命令:/ crawl / update-now / 观点是:

from django.core import management

def update_index(request):
    management.call_command('website', 'crawl spider')

但它不起作用:

Command' object has no attribute '_argv'

1 个答案:

答案 0 :(得分:1)

我认为问题是run_from_argv是内部Django方法,并由django.core.management.ManagementUtility调用。你不应该自己实现它,self._argv没有设置在任何地方。 handle()中已经存在参数。

你的方法有一些缺点。

首先,由于Django的同步性,如果你的URL“很重”,它可能需要花费很多时间来解析它。而不是它,我强烈建议你看看Celery。从视图执行任务是更“正确”的方式,并且没有性能问题。