簡體   English   中英

Django:如何在開發環境中獲取靜態文件的文件路徑?

[英]Django: How to get a static file's filepath in a development environment?

一些背景優先。 我正在使用以下“技巧”來防止不希望的瀏覽器緩存靜態文件(CSS,JS等):

<script src="{{ STATIC_URL }}js/utils.js?version=1302983029"></script>

當版本字符串在后續頁面加載時發生更改時,它會使瀏覽器從服務器重新獲取靜態文件。 (谷歌“css緩存”有關此技巧的文章。)

我希望瀏覽器獲取最新版本的靜態文件,但我還希望在文件未更改時允許瀏覽器緩存。 換句話說,當且僅當靜態文件已更新時,我希望更改版本字符串。 我也想自動生成版本字符串。

為此,我使用靜態文件的上次修改時間作為版本字符串。 我正在制作一個自定義模板標簽來執行此操作:

<script src="{% versioned_static 'js/utils.js' %}"></script>

以下是模板標簽的工作原理:

import os.path
from django import template
from django.conf import settings

class VersionedStaticNode(template.Node):
    ...
    def render(self, context):
        # With the example above, self.path_string is "js/utils.js"
        static_file_path = os.path.join(settings.STATIC_ROOT, self.path_string)
        return '%s?version=%s' % (
            os.path.join(settings.STATIC_URL, self.path_string),
            int(os.path.getmtime(static_file_path))
            )

要獲取靜態文件的上次修改時間,我需要知道它在系統上的文件路徑。 我通過加入settings.STATIC_ROOT和該靜態根目錄中的文件相對路徑來獲取此文件路徑。 這對於生產服務器來說都很好,因為所有靜態文件都是在STATIC_ROOT收集的。

但是,在開發服務器上(正在使用manage.py runserver命令), STATIC_ROOT不會收集靜態文件。 那么在開發中運行時如何獲取靜態文件的文件路徑?

(為了澄清我的目的:我要避免的緩存情況是瀏覽器使用新HTML和舊CSS / JS的不匹配。在生產中,這可能會極大地混淆用戶;在開發中,這會讓我和其他開發人員混淆,並且我們經常刷新頁面/清除瀏覽器緩存。)

如果使用django.contrib.staticfiles,這里有一個findstatic命令(django / contrib / staticfiles / management / commands / findstatic.py)的摘錄應該有所幫助。 它使用finders.find來定位文件。

    from django.contrib.staticfiles import finders

    result = finders.find(path, all=options['all'])

    path = smart_unicode(path)
    if result:
        if not isinstance(result, (list, tuple)):
            result = [result]
        output = u'\n  '.join(
            (smart_unicode(os.path.realpath(path)) for path in result))
        self.stdout.write(
            smart_str(u"Found '%s' here:\n  %s\n" % (path, output)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM