Django自动执行collectstatic命令

时间:2019-12-14 22:07:00

标签: django django-staticfiles

在我的项目中,我有一个主静态文件夹和一个名为static的子文件夹。当我在名为static(在设置文件中的COLLECTSTATIC_DIRS中指定)的子文件夹中进行更改时,我保存了文件并运行collectstatic命令。

这成功保存了更改,但是由于我在项目内部不断更改css和Javascript文件(我将它们存储为静态文件)的情况下,效率真的很低。

我浏览了网络,发现了一个名为whitenoise的解决方案,它是一个pip程序包。但是此程序包只能在很短的时间内使用,并且在关闭和打开我的项目文件夹几次后,它完全停止了工作。

有人有其他解决此问题的方法吗?谢谢。

3 个答案:

答案 0 :(得分:0)

您可以使用不属于Django的第三方解决方案来监视文件并在文件更改时运行命令。

看看fswatch实用程序Bash Script - fswatch trigger bash function

如何管理“ Django-way”静态文件

请检查有关https://docs.djangoproject.com/en/3.0/howto/static-files/的详细信息,什么是Django方法才能纠正:)

答案 1 :(得分:0)

首先在进行开发时设置DEBUG = True

然后将这些行添加到项目的urls.py:

from django.conf import settings
from django.views.decorators.cache import cache_control
from django.contrib.staticfiles.views import serve
from django.conf.urls.static import static

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL,
                      view=cache_control(no_cache=True, must_revalidate=True)(serve))

答案 2 :(得分:0)

您可以使用 python-watchdog 并编写您自己的 Django 命令:

import time

from django.conf import settings
from django.core.management import call_command
from django.core.management.base import BaseCommand
from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer


class Command(BaseCommand):
    help = "Automatically calls collectstatic when the staticfiles get modified."

    def handle(self, *args, **options):
        event_handler = CollectstaticEventHandler()
        observer = Observer()
        for path in settings.STATICFILES_DIRS:
            observer.schedule(event_handler, path, recursive=True)
        observer.start()
        try:
            while True:
                time.sleep(1)
        finally:
            observer.stop()
            observer.join()


class CollectstaticEventHandler(FileSystemEventHandler):
    def on_moved(self, event):
        super().on_moved(event)
        self._collectstatic()

    def on_created(self, event):
        super().on_created(event)
        self._collectstatic()

    def on_deleted(self, event):
        super().on_deleted(event)
        self._collectstatic()

    def on_modified(self, event):
        super().on_modified(event)
        self._collectstatic()

    def _collectstatic(self):
        call_command("collectstatic", interactive=False)