django runserver 找不到静态文件,但是远程服务器可以

django runserver can't find static files, but remote server can

我正在 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: The joined path >>>(/blog.css) is located outside of the base path component (/Users/alesha/.virtualenvs/blog/lib/python3.7/site-packages/django/contrib/admin/static)

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

然后我检查了 django bug-tracker。不——是我。

所以,古怪的部分是,当我将代码移植到 PythonAnywhere 时,它​​可以正常工作,blog.css 得到服务,快乐无处不在。

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

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

My Working Directories

The local and the remote

这个问题有两种解决方法。起初有点令人困惑,但是 STATIC_ROOT 目录 should be empty. During the deployment when you run the manage.py collectstatic command, Django will look into each app's static subdirectory and will copy all the static files into STATIC_ROOT and the webserver will serve them from that directory (this is why it worked on PythonAnywhere). But by default the findstatic command will not look for static files in STATIC_ROOT directory. The quick workaround is just add STATIC_ROOT to STATICFILES_DIRSsettings.py 然后 Django 也会在该目录中查找静态文件。

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