提供静态文件 django 1.9 生产错误

Posted

技术标签:

【中文标题】提供静态文件 django 1.9 生产错误【英文标题】:Serving static files django 1.9 production Error 【发布时间】:2016-12-10 18:50:30 【问题描述】:

我已尝试遵循其他堆栈溢出帖子中有关在生产中提供 Django 静态文件的解决方案,但我无法让它们工作。我的静态文件位于我的 django app 文件夹(联盟)中。

我的 CSS 文件没有正确加载;我在 chrome 的控制台中收到以下错误:

Resource interpreted as Stylesheet but transferred with MIME type text/html
Uncaught SyntaxError: Unexpected token !
profile:5 Uncaught SyntaxError: Unexpected token !

我认为 css 文件被解释为 html 文件?我认为 javascript 文件也没有正确加载...

当我在 chrome 上检查源文件并单击 css 文件的链接时,它们不起作用。所以我猜到css文件的链接不起作用?

加载css和javascript文件的链接和脚本是:

    <head>
<!-- Latest compiled and minified CSS -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<link rel="stylesheet" href="% static 'league/css/bootstrap-theme.css' %">
<link rel="stylesheet" href="% static 'league/css/bootstrap-theme.min.css' %">
<link rel="stylesheet" href="% static 'league/css/bootstrap.css' %">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">

<!-- Latest compiled and minified JavaScript -->

<script type="text/javascript" src="% static 'league/js/bootstrap.min.js' %"></script>
<script type="text/javascript" src="% static 'league/js/npm.js' %"></script>
<!-- jQuery library -->

<script type="text/javascript" src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
<link rel="stylesheet" href="% static 'league/css/f-style.css' %">
</head>

我的settings.py文件中的相关文件如下:

STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

STATIC_URL = '/league/static/'
SITE_ID = 1
STATIC_ROOT = BASE_DIR + '/league/static/'

我的apache服务器上的配置文件如下:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    Alias /static /home/ubunu/project/league/static
    <Directory /home/ubuntu/project/league/static>
            Require all granted
    </Directory>
    <Directory /home/ubuntu/project/fantasy>
            <Files wsgi.py>
                    Require all granted
            </Files>
    </Directory>

    WSGIDaemonProcess project python-path=/home/ubuntu/project:/home/ubuntu/project/myprojectenv/lib/python2.7/$
    WSGIProcessGroup project
    WSGIScriptAlias / /home/ubuntu/project/fantasy/wsgi.py

</VirtualHost>

谢谢!

【问题讨论】:

您是否尝试过重新启动服务器服务器。而且在您的模板中,您还没有使用 % load staticfiles % 标签。 【参考方案1】:

好的,这是一个非常简单的问题。您需要做两件事。

首先,当您使用 本地 python django 开发服务器时,只需在 app 文件夹中查找静态文件,如果您为静态文件指定了另一个文件夹,即可提供静态文件在 STATIC_DIRS 中,然后它也会调查。

但如果您在某些其他服务器上提供文件,例如 NginxHerkouApache您的情况,那么您需要将所有静态文件收集到另一个目录中,您的 Apache 将从该目录中读取静态文件。

要实现上述你需要做python manage.py collectstatic

执行此操作后,您的所有静态文件都将收集到 settings.pySTATIC_ROOT 值指定的文件夹中

其次,如果你的 STATIC_ROOTSTATIC_URL = '/league/static/' 一样,那么从技术上讲,事情将无法正常工作,因为这两个目的不同。

我建议,在 BASE 目录级别创建一个新文件夹,例如 static_root_content 并更改您的 STATIC_ROOT = os.path.join(BASE_DIR, 'static_root_content')

现在,当您运行 python manage.py collectstatic 时,您的所有静态数据都将收集在此文件夹中,Apache 将从该文件夹中查找静态文件。

另外 STATIC_DIRS 和 STATIC_ROOT 在你的 settings.py 中不能有相同的值

查看这篇文章以获得更好的解释 -> Differences between STATICFILES_DIR, STATIC_ROOT and MEDIA_ROOT

【讨论】:

我收到GET http://...../static/league/js/index.js 403 (Forbidden) 错误。当我访问该网址时,我收到以下错误页面:Forbidden You don't have permission to access /static/league/js/prefixfree.min.js on this server. 看这个 -> ***.com/questions/10873295/… 我知道这已经很晚了,但值得一问,因为我也有同样的问题。这都是说html页面上静态文件的路径应该指向收集的静态文件夹吗? @Anastasia 从那以后我没有在 Django 上工作过,但是如果约定没有改变(或者你可以在互联网上搜索相同的),你需要在顶部导入加载静态你的 HTML 像 % load static from staticfiles % 然后当你导入那个静态资产时,你可以像

以上是关于提供静态文件 django 1.9 生产错误的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何在生产中的apache服务器上部署静态文件

在 django 1.9 中找不到我的静态文件

django中怎么载入css等静态文件

django中怎么载入css等静态文件

Apache 不提供 django 管理静态文件

Django提供静态文件服务