我有以下管理命令(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'
答案 0 :(得分:1)
我认为问题是run_from_argv
是内部Django方法,并由django.core.management.ManagementUtility调用。你不应该自己实现它,self._argv没有设置在任何地方。 handle()中已经存在参数。
你的方法有一些缺点。
首先,由于Django的同步性,如果你的URL“很重”,它可能需要花费很多时间来解析它。而不是它,我强烈建议你看看Celery。从视图执行任务是更“正确”的方式,并且没有性能问题。