Django自动执行collectstatic命令

vfh0ocws  于 2023-01-21  发布在  Go
关注(0)|答案(4)|浏览(123)

在我的项目中,我有一个主静态文件夹和一个名为static的子文件夹。当我在名为static的子文件夹(我在设置文件中的COLLECTSTATIC_DIRS中指定)中进行更改时,我保存文件并运行collectstatic命令。
这成功地保存了更改,但是效率很低,因为我经常更改项目中的css和Javascript文件,这些文件存储为静态文件。
浏览网页,偶然发现了一个名为whitenoise的解决方案,这是一个pip包,但这个包只工作很短的一段时间,在关闭和打开我的项目文件夹几次后,它完全停止工作。
有没有人有其他的解决方法来处理这个问题?谢谢。

tez616oj

tez616oj1#

您可以使用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)
yzckvree

yzckvree2#

您可以使用不属于Django的第三方解决方案来监控您的文件,并在文件更改时运行命令。
查看fswatch实用程序Bash Script - fswatch trigger bash function

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

请在https://docs.djangoproject.com/en/3.0/howto/static-files/上查看详细信息什么是正确的Django方法:)

wqsoz72f

wqsoz72f3#

首先在开发时设置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))
2guxujil

2guxujil4#

下面是一个使用Python watchfiles和Django管理命令的示例。

# Lives in /my_app/manangement/commands/watch_files.py
import time

from django.conf import settings
from django.core.management import call_command
from django.core.management.base import BaseCommand

from watchfiles import watch

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

    def handle(self, *args, **options):
        print('WATCH_STATIC: Static file watchdog started.')
        #for changes in watch([str(x) for x in settings.STATICFILES_DIRS]):
        for changes in watch(*settings.STATICFILES_DIRS):
            print(f'WATCH_STATIC: {changes}', end='')
            call_command("collectstatic", interactive=False)

然后你可以在后台运行Django管理命令,无论你使用什么脚本来启动Django。

python manage.py watch_static &
python manage.py runserver 0.0.0.0:8000

相关问题