Django网站在提供静态文件方面遇到麻烦

时间:2017-03-17 14:51:25

标签: django

我正在开发一个多应用网站。我有一堆菜鸟问题。 我的目录结构如下所示:

/var/www/html/portal
    src/
        manage.py
        portal/
        static/
            admin/
            css/
            img/
            js/
            fonts/
        templates/
            base.html
            homepage.html
    venv/
  1. 我的dir结构是否符合Django标准?
  2. 我的STATIC文件设置是否正确?

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

  3. 或者应该是

    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(PROJECT_DIR, 'static')
    
    1. 复制我的所有静态文件(例如css,js等)之后我应该collectstatic还是我可以在复制这些目录中的文件之前进行此操作?
    2. 如果我在不提及STATIC_ROOT的情况下collectstatic,我会得到一个例外 django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.
    3. 但是当我用以下内容替换STATICFILES_DIRS时,我的.css文件停止服务。我做错了什么?

      STATIC_ROOT = os.path.join(PROJECT_DIR, 'static')
      

4 个答案:

答案 0 :(得分:3)

当您运行开发服务器并且staticfiles设置为DEBUG时,您无需运行True

然后可以通过网络流程(Docs)直接提供静态和媒体文件,并将这些行添加到您的主urls.py

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

对于整个STATIC_URLSTATIC_ROOTMEDIA_URLMEDIA_ROOT,它们都与您在生产中如何为您的应用提供服务相关网络服务器。

通常情况下,网络服务器(即Nginx)处理服务文件,而不是Django应用程序。但是Django应用程序需要知道它们在哪里。所以:

您的Django应用设置和网络服务器配置中的

STATIC_URLMEDIA_URL必须相同,例如使用Nginx:

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
...

location /static {
    alias /home/myusername/myproject/static/;
}
location /media {
    alias /home/myusername/myproject/media/;
}

STATIC_ROOT MEDIA_ROOT 100%关于您希望如何在服务器上构建项目。假设上述情况,您需要确定如何将其指向/home/myusername/myproject/static/

我的设置示例:

BASE_DIR = Path(__file__).parent.parent.parent

MEDIA_URL = '/media/'
MEDIA_ROOT = str(BASE_DIR.joinpath('media'))

STATIC_URL = '/static/'
STATIC_ROOT = str(BASE_DIR.joinpath('staticfiles'))

媒体文件将直接上传到MEDIA_ROOT,但请注意,您需要以某种方式从应用程序中获取静态文件(可能位于多个文件夹中,您使用的库可能会有一些额外的静态文件文件,Django Admin等等)到Nginx指向的文件夹(应该与STATIC_ROOT相同)。这就是collectstaticfiles的来源,并将所有静态文件复制到该目录。

答案 1 :(得分:2)

关于目录结构,对如何设置存在意见分歧。快速谷歌搜索可以提出一些关于Django项目结构的网站和讨论。我建议您阅读一些信息,以确定最适合您和您项目的信息。

Django文档也有一个最佳实践页面,这是一个很好的资源/提醒。 Django Best Practices.

我主要遵循Django目录结构的两个Scoops。两个Scoops帮助我理解了这一点。我自己的扭曲看起来像这样。

src/
  app/
    templates/
       app_name/
         base.html
         other_pages.html
    tests/
       tests.py
    app_files.py
  static/
    images/
    css/
    etc..
  templates/
    global_includes/
        include_file.html
    base.html

collectstatic不应影响开发期间静态文件的提供。根据我的经验,当您从单独的服务器或aws,heroku等部署服务静态文件时,collectstatic更适合。更多信息可以在文档中找到:Managing Static Files,{{3 },staticfiles app

我了解到,如果我的CSS文件没有服务,它通常与我的路径有关。 Chrome开发者工具检查元素/控制台可以帮助我解决任何路径错误。

你有没有添加

+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

到你的主urlpattern / urls.py?

以下是有关在开发期间提供文件的更多信息:Deploying static files

最后检查您的BASE_DIR是否遵循项目的正确路径。您可能需要更改它。

我希望这会有所帮助。

答案 2 :(得分:2)

请记住,如果您将DEBUG设置为“False”,它将忽略staticfiles设置,因为预计您的网络服务器将直接提供此服务。这让我抓了几次,直到我意识到我没有更新staticfiles文件夹(由于我现在不记得的原因,我将其保存在一个单独的存储库中)。

答案 3 :(得分:0)

这似乎在当前的django(2.2)中有效:

from django.conf.urls.static import serve

urlpatterns += [
    path(settings.STATIC_URL[1:], serve, {'document_root': settings.STATIC_ROOT })
]