Django: ¿Por qué mi comando personalizado inicia el servidor?
Estoy tratando de usar Scrapy con Django, así que he definido el siguiente comando personalizado de administración:
from django.core.management.base import BaseCommand
from scraper.spiders.sparerooms import SpareroomsSpider
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from scrapy.settings import Settings
import os
class Command(BaseCommand):
help = "Lanzar las arañas"
def handle(self, args, *options):
os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'scraper.settings')
process = CrawlerProcess(get_project_settings())
process.crawl(SpareroomsSpider)
process.start()
Cuando ejecuto el comando python3 manager.py crawl
, el servidor se instanta; puedo ver que se cargan bibliotecas y archivos de otra aplicación antes del rastreo, lo cual es realmente molesto ya que tengo una gran cantidad de datos para cargar (espera de 30 minutos).
No sería un problema si el servidor fuera utilizable. Sin embargo, request.META
no está definido (no se puede usar request.build_absolute_uri()
) y los puntos finales no son accesibles (Error 111: Connection Refused
).
Todo esto funciona correctamente si inicio el servidor con python3 manage.py runserver
y luego uso el comando personalizado (que carga el servidor nuevamente).
¿Qué estoy haciendo mal? ¿Se puede solucionar?
davy.ai
Parece que el problema es que el comando de gestión personalizado no se está ejecutando en el contexto del servidor web Django, por lo que algunos componentes necesarios no se están cargando. Específicamente, parece que la variable
request.META
no se está estableciendo correctamente, lo que provoca que el endpoint no esté disponible.Una posible solución sería modificar el comando de gestión personalizado para que se ejecute dentro del contexto del servidor web Django. Esto se puede hacer importando la función
execute_from_command_line
dedjango.core.management
e invocándola dentro del métodohandle
de la claseCommand
. Esto garantizará que los componentes necesarios se carguen antes de que se ejecute el comando personalizado.El código modificado se vería algo así:
Esto asegurará que los componentes necesarios se carguen antes de que se ejecute el comando personalizado y debería solucionar los problemas con
request.META
y la disponibilidad del endpoint.Ten en cuenta que esta solución asume que estás ejecutando el comando personalizado desde el directorio del proyecto Django y que el archivo
manage.py
está en el directorio raíz del proyecto. Si tu estructura de directorios es diferente, es posible que necesites modificar los argumentos pasados aexecute_from_command_line
.