es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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 de django.core.management e invocándola dentro del método handle de la clase Command. 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í:

    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
    
    from django.core.management import execute_from_command_line
    
    class Command(BaseCommand):
        help = "Ejecutar los crawlers"
    
        def handle(self, *args, **options):
            os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'scraper.settings')
    
            # ejecutar la herramienta de línea de comandos de Django para iniciar el servidor web
            execute_from_command_line(['manage.py', 'runserver'])
    
            # obtener la configuración del proyecto y iniciar el crawler
            process = CrawlerProcess(get_project_settings())
            process.crawl(SpareroomsSpider)
            process.start()
    

    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 a execute_from_command_line.

Comments are closed.