【问题标题】:django runserver can't find static files, but remote server candjango runserver 找不到静态文件,但是远程服务器可以
【发布时间】:2020-06-12 23:49:32
【问题描述】:

我正在使用 Pycharm 写作,通过 GitHub 推送到 PythonAnywhere。 Django3 和 Python3.7。完成 Django Girls 教程。

我已经在settings.py中定义了

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

我有一个带有

的模板
{% load static %}

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="{% static "blog/css/blog.css" %}">
    <meta charset="UTF-8">
    <title>DG Tutorial</title>
</head>
...

我试过python manage.py findstatic blog.css 找不到。我尝试了 static/blog/css/blog.css 和 /blog/css/blog.css 的变体,并收到一条以以下结尾的长错误消息:

django.core.exceptions.SuspiciousFileOperation:连接路径 >>>(/blog.css) 位于基本路径组件之外 (/Users/alesha/.virtualenvs/blog/lib/python3.7/site-包/django/contrib/admin/静态)

所以,我想知道为什么它不在位于基本路径组件之外的 STATIC_ROOT 中查找。还是做到了?我不知道。

然后我检查了 django 错误跟踪器。不——是我。

所以,古怪的部分是,当我将代码移植到 PythonAnywhere 时,它​​可以正常工作,blog.css 得到服务,幸福感比比皆是。

我已经阅读了关于这个的帖子,所有关于 staticFiles 的 django 教程页面 - 我知道,我已经检查了拼写错误。我是 stumpeth - 因为它有效!只是不在本地主机上。

感谢您帮助解决我的第一个 Stack Overflow 问题。

My Working Directories

The local and the remote

【问题讨论】:

  • 我猜你有一个叫blog的应用。你里面还有static目录吗,你把blog.css文件放到blog/static/blog/css里面了吗?
  • @Dauros 我有一个名为blog 的应用程序和一个static 目录和blog.cssmysite/static/blog/css/ 目录中。我会在 OP 中添加一张图片。
  • 您能否通过在浏览器中检查来放置有效链接和无效链接。
  • 你在 PythonAnywhere 中有 DEBUG = True 吗?
  • 或者您在 PythonAnywhere 中配置 Web 应用程序时是否设置了 staticfiles 文件夹设置?

标签: django django-staticfiles


【解决方案1】:

这个问题有两种解决方案。一开始有点混乱,但是STATIC_ROOT 目录should be empty。在部署期间,当您运行manage.py collectstatic 命令时,Django 将查看每个应用程序的static 子目录并将所有静态文件复制到STATIC_ROOT 并且网络服务器将从该目录为它们提供服务(这就是它在 PythonAnywhere 上工作的原因)。但默认情况下,findstatic 命令不会STATIC_ROOT 目录中查找静态文件。快速的解决方法是在settings.py 中添加STATIC_ROOTSTATICFILES_DIRS,然后Django 也会在该目录中查找静态文件。

但我的建议是您应该按照“官方”的方式来存储应用程序的static 子目录(例如mysite/blog/static/blog/css/blog.css)中的静态文件,并将STATIC_ROOT 保留为空。

【讨论】:

  • 谢谢!这有点令人困惑 - 但从开发的角度来看是有道理的。我一直在想,我的做法会让可重用性变得很痛苦——因为我必须返回并将文件重新定位到应用程序目录中。我是对的! :D 啊,这就是为什么我们必须在静态变化时运行collectstatic。当然-我将遵循“官方”方式。谢谢,非常好的解释。
  • 我很乐意帮助并欢迎 SO。 collectstatic 背后的原因是 Python 应用程序服务器在提供静态文件方面“效率低下”,因此前端 Web 服务器(例如 Nginx 或 Apache)应该用于该任务。最好为静态文件设置一个中心位置(STATIC_ROOTMEDIA_ROOT 用于上传文件),这样我们就不必在每次向 Django 项目添加新应用程序时编辑 Web 服务器的配置。顺便说一句,您还应该将blog 应用程序的模板文件重新定位到blog/templates
  • 嘿,我在想今天早上 :) 再见
猜你喜欢
  • 2019-08-29
  • 2016-10-10
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2013-12-08
  • 2013-04-16
  • 2021-11-24
  • 1970-01-01
相关资源
最近更新 更多