Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么';这是Django的观点';它是静态的吗?_Python_Django_Django Staticfiles_Static Files_Collectstatic - Fatal编程技术网

Python 什么';这是Django的观点';它是静态的吗?

Python 什么';这是Django的观点';它是静态的吗?,python,django,django-staticfiles,static-files,collectstatic,Python,Django,Django Staticfiles,Static Files,Collectstatic,这可能是一个愚蠢的问题,但它只是没有点击在我的脑袋 在Django中,惯例是将特定于应用程序的所有静态文件(即css、js)放入名为static的文件夹中。因此,结构将如下所示: mysite/ manage.py mysite/ --> (settings.py, etc) myapp/ --> (models.py, views.py, etc) static/ 在mysite/settings.py中,我有: STATIC_ROOT =

这可能是一个愚蠢的问题,但它只是没有点击在我的脑袋

在Django中,惯例是将特定于应用程序的所有静态文件(即css、js)放入名为static的文件夹中。因此,结构将如下所示:

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/
mysite/settings.py
中,我有:

STATIC_ROOT = 'staticfiles'
因此,当我运行命令时:

python manage.py collectstatic   
它在根级别创建一个名为
staticfiles
的文件夹(与
myapp/
目录相同)

这有什么意义?它不只是创建我所有静态文件的副本吗

将多个应用程序中的静态文件收集到单个路径中 好的,一个Django项目可能会使用多个应用程序,所以虽然在那里你只有一个
myapp
,但它实际上可能是
myapp1
myapp2
,等等

通过将它们从各个应用程序内部复制到单个文件夹中,您可以将前端web服务器(例如nginx)指向该单个文件夹
STATIC\u ROOT
,并从单个位置提供静态文件,而不是将web服务器配置为从多个路径提供静态文件

带有 关于将MD5哈希附加到文件名以进行版本控制的注意事项:它不是
collectstatic
的默认行为的一部分,因为
settings.STATICFILES\u STORAGE
默认为
StaticFilesStorage
(这不起作用)

MD5散列将启动,例如,如果您将其设置为使用
ManifestStaticFilesStorage
,则会显示该行为

此存储的目的是保持对旧文件的服务,以防 某些页面仍然引用这些文件,例如,因为它们是由 您或第三方代理服务器。此外,如果 您想将far future Expires头应用于部署到的文件 加快后续页面访问的加载时间


当站点中有多个django应用程序时,它非常有用


collectstatic
然后将从一个位置收集所有应用程序中的静态文件,以便可以在生产环境中提供这些文件。

在生产安装中,您希望有持久的URL。除非文件内容发生更改,否则URL不会更改

这是为了防止客户端在从Django打开网页时在其计算机上使用错误版本的CSS或JS文件。Django staticfiles检测文件更改并相应地更新URL,因此如果CSS或JS文件更改,web浏览器将下载新版本


这通常是通过在
collectstatic
运行期间向文件名添加MD5哈希来实现的


编辑:另请参阅多个应用程序的相关答案。

Django静态文件可以在许多地方。可以使用充当
/static/img/icon.png
的文件。默认情况下:

  • FileSystemFinder
    将在每个
    STATICFILES\u DIRS
    中查找
    img/icon.png
  • AppDirectoriesFinder
    将在每个
    已安装的应用程序的
    静态子文件夹中查找
    img/icon.png
    。这允许像Django Admin这样的库将它们自己的静态文件添加到您的应用程序中
现在:这仅在使用DEBUG=1运行
manage.py runserver
时有效。当您上线时,Django进程将不再为静态资产服务。使用Django为这些服务是低效的,有更多专门用于此的专门工具

相反,您应该这样做:

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/
  • 查找每个应用程序中的所有静态文件
  • 构建一个包含所有这些内容的目录
  • 将它们上载到某个位置(Web服务器上某个位置的
    静态
    目录或第三方文件存储)
  • 将您的Web服务器(如nginx)配置为直接从该目录提供
    /static/*
    ,并将任何其他请求重定向到Django

collectstatic
是一个现成的脚本,为您准备此目录,以便您可以将其直接连接到部署脚本。

很好!不知道“通常通过添加MD5哈希实现”是什么意思?很好,我没有看到,我认为默认情况下没有MD5散列,因为
设置。STATICFILES\u STORAGE
默认为
staticfilestorage
,因此MD5只有在您将其设置为
manifestStaticfilestorage
后才会启动,我说的对吗?@Mikkoohtama但是前端应用程序如何知道它应该链接到哪个文件名,因为后者总是变化?@lapin问得好!当然,需要有1)映射到最新版本,以及2)传达这一点的方式。通常它存储在某个文件中,然后当您询问“X的最新版本的完整URL”时,它会给出一个结果。您想说的是,web服务器很容易找到提供静态内容的URL