【问题标题】:Using a Django project and static files in a subfolder of root在根目录的子文件夹中使用 Django 项目和静态文件
【发布时间】:2017-01-31 18:45:04
【问题描述】:

我最近将一个 Django 项目部署到了​​我的 DigitalOcean Droplet。我需要在 root 的子文件夹(即 www.domainname.com/)中访问它。到目前为止,这可以使用 apache 配置文件中的 WSGI Aliasing 工作。不过,我在提供静态 js 文件时遇到了问题。

我在模板中使用 {% static %} 标记来执行此操作。但是,当我在浏览器中检查它们时,我的 js 文件似乎总是被当前页面的 html 替换。这是我在settings.py中的静态相关设置:

STATIC_URL = '/static/'
STATIC_ROOT = '/var/www/html/<project name>/static'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "/static"),
]

更新 1

这是我的 apache 配置:

在站点可用/默认:

<Directory /var/www/>
       Options Indexes FollowSymLinks MultiViews
       AllowOverride All
       Order allow,deny
       allow from all
</Directory>

<VirtualHost <project name>:8000>
    ServerName <project name>
    ServerAlias <domain>/<project name>
    ServerAdmin <email>

    DocumentRoot /var/www/html/<project name>
    WSGIScriptAlias /<project name>/ /var/www/html/<project name>/<project name>/wsgi.py

    ErrorLog /var/www/html/logs/error.log
    CustomLog /var/www/html/logs/custom.log combined
    WSGIPythonPath /var/www/html/<project name>
</VirtualHost>

在 apache2.conf 中:

WSGIScriptAlias /<project name> /var/www/html/<project name>/<project name>/wsgi.py
WSGIPythonPath /var/www/html/<project name>

<Directory /var/www/html/<project name>>
   <Files wsgi.py>
       Require all granted
   </Files>
</Directory>

更新 2

似乎正在通过将静态路径附加到当前页面的路径来请求 .js 文件,即

<domain name>.com/<project name>/<app name>/<page>/<project name>/static/js/<js file name>

【问题讨论】:

  • 您需要展示您的 Apache 配置。
  • @DanielRoseman 已更新。

标签: python django django-staticfiles


【解决方案1】:

您需要在 Apache 配置中使用 Alias directive,以便为您的静态文件提供服务。

与在提供服务之前通过 Django 视图呈现的模板不同,静态文件通常由 Web 服务器(或某些单独的服务)直接提供以提高性能。毕竟你通常只想要文件本身,所以 Django 需要的开销是不必要的。这在 Django 的文档 here 中进行了讨论。

如果没有 Alias 指令,请求将被传递给 Django 进行处理。 Django 将 Apache 的默认行为从直接从 DocumentRoot 提供文件更改为将 URL 映射到然后构造响应的视图。因此,根据您的 urls.py 安排,静态文件请求可能会导致 404 页面或来自匹配视图的响应(您看到的 HTML)。

要解决这个问题,你可以添加

Alias /static/ /var/www/html/<project name>/static/

到您的配置文件中的虚拟主机。这将告诉 Apache 在以 /static/ 开头的 URI 发出请求时从您的静态目录中提供文件。

例如,/static/index.js 的 URI 将导致 Apache 提供文件 /var/www/html/&lt;project name&gt;/static/index.js 作为响应。


此外,您的VirtualHost 中有错误。您提供的地址是 &lt;project name&gt;,这不是一个有效的选项 (see here)。虚拟主机地址必须是 IP 地址、域名或通配符 *

由于&lt;project name&gt; 不是这些,虚拟主机不匹配任何东西,并且其中的配置不适用。我建议通过更改来修复它

<VirtualHost <project name>:8000>

<VirtualHost *:8000>

它将在请求所期望的任何主机上匹配。

【讨论】:

  • 恐怕在将该行添加到我的虚拟主机配置后,我仍然遇到同样的问题。我可以检查文件显然从 Chrome 链接到的位置,并且显然静态路径被附加到当前页面。我会相应地更新我的问题。
  • 您可以通过三种方式链接网址,每种方式都有不同的效果。第一个 (example.com/static/) 路由到指定的 url,第二个有一个前导斜杠 (/static/) 并路由到相对于当前域的指定 url,第三个没有前导斜杠 (static/)哪个路由到附加了指定 url 的当前 url。那么,你是如何链接文件的呢?它应该只是src="{% static 'js/myscript.js' %}",但是您的网址似乎有&lt;project name&gt; 前置。
  • 要清楚,现在追加只是问题的一半。即使您添加前导斜杠 /&lt;project name&gt;/static/js/myscript.js 也不会导致正确的资源,因为 Apache 别名为 /static/。如果您希望在静态文件 url 中将 &lt;project name&gt; 放在 static 之前,则别名需要为 Alias /&lt;project name&gt;/static/ /var/...
  • 我已将别名更改为 //static/ 并重新启动了 apache 服务器,但现在我只收到 404 错误。现在似乎是从 .com/static/jsfile.js 而不是 .com//static/jsfile.js 请求 js 文件。
  • 我的来源只是{% static 'js/jquery-2.1.4.min.js' %}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2015-02-05
  • 2019-05-26
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 2015-08-28
相关资源
最近更新 更多