Django无法加载静态文件

Hum*_*ons 0 python django

django的全新内容。

在我的settings.py文件中,我有:

STATIC_URL = '/static/'
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
Run Code Online (Sandbox Code Playgroud)

我的urls.py有

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index)
]
Run Code Online (Sandbox Code Playgroud)

我的views.py有

def index(request):
    return render(request, 'index.html', {})
Run Code Online (Sandbox Code Playgroud)

最后,我的index.html中包含以下内容:

{% load static %}
<link href="{% static 'styles/custom.css' %}" rel="stylesheet">
Run Code Online (Sandbox Code Playgroud)

HTML文件的加载方式与显示的一样,但是样式未显示。经检查,它表示未找到CSS文件。

这是我的目录结构:

.
??? README.md
??? app
?   ??? __init__.py
?   ??? db.sqlite3
?   ??? manage.py
?   ??? models.py
?   ??? settings.py
?   ??? urls.py
?   ??? views.py
?   ??? wsgi.py
??? db.sqlite3
??? static
?   ??? scripts
?   ?   ??? custom.js
?   ??? styles
?       ??? custom.css
??? templates
    ??? index.html
Run Code Online (Sandbox Code Playgroud)

Vit*_*tas 5

您必须告诉Django在哪里可以找到静态文件。这是通过在settings.py模块上设置STATICFILES_DIRS来完成的。

通常,我们使用以下命令执行以下操作BASE_DIR

settings.py

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]
Run Code Online (Sandbox Code Playgroud)

有关静态设置的一些额外信息:

一开始它有点令人困惑,因为Django具有三个类似的配置:

  • STATIC_URL
  • STATIC_ROOT
  • STATICFILES_DIRS

基本上,STATIC_URL将会用于生成一个网址来服务您的静态资产。它可能是一个相对的URL,例如:

STATIC_URL='/static/'

{% static 'styles/custom.css' %} => /static/styles/custom.css
Run Code Online (Sandbox Code Playgroud)

它可能是完整的URL:

STATIC_URL='https://static.yourdomain.com/'

{% static 'styles/custom.css' %} => https://static.yourdomain.com/styles/custom.css
Run Code Online (Sandbox Code Playgroud)

现在,STATICFILES_DIRSDjango将在其中找到您的静态文件。通常在项目文件夹中。但!这是从哪里Django会成为你的静态资产到客户端。就像,静态文件的来源在哪里

这是因为Django并没有真正提供此类文件(.js.css.jpg)。好吧,无论如何都不是默认设置。您可以使用WhiteNoise之类的第三方应用程序。

这就是我们拥有的原因STATIC_ROOT,它是告诉Django从那里复制这些文件的位置,STATICFILES_DIRS以便其他人可以为我服务。其他人通常是Apache或NGINX。

我们仅使用STATIC_ROOT进行部署。

当我们将Django应用程序部署到生产服务器时,通常会运行command python manage.py collectstatic。这就是Django将文件复制STATICFILES_DIRS到的地方STATIC_ROOT

但是在开发阶段,您实际上不必关心这么多的细节,因为尽管DEBUG=True,Django会让您变得更轻松并提供静态文件。