2017-03-17 128 views
2

我正在开发一个多应用程序网站。我有一堆noob问题。 我的目录结构看起来像如下:Django网站提供静态文件服务

/var/www/html/portal 
    src/ 
     manage.py 
     portal/ 
     static/ 
      admin/ 
      css/ 
      img/ 
      js/ 
      fonts/ 
     templates/ 
      base.html 
      homepage.html 
    venv/ 
  1. 是我的目录结构,作为每Django的标准是什么?
  2. 我的STATIC文件设置是否正确?

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

还是应

STATIC_URL = '/static/' 
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static') 
  • 我应该collectstatic复制我的所有静态文件,如CSS,JS等我也可以后在复制这些目录中的文件之前做到这一点?
  • 如果我做collectstatic不提STATIC_ROOT我得到一个异常 django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.
  • 但是,当我用以下内容替换STATICFILES_DIRS,我的.css文件停止服务。我究竟做错了什么?

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

    回答

    2

    当您运行开发服务器时,不需要运行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应用程序需要知道它们在哪里。所以:

    STATIC_URLMEDIA_URL需要在你的Django应用程序设置,并在您的Web服务器的配置相同,例如使用Nginx的:

    STATIC_URL = '/static/' 
    MEDIA_URL = '/media/' 
    ... 
    
    location /static { 
        alias /home/myusername/myproject/static/; 
    } 
    location /media { 
        alias /home/myusername/myproject/media/; 
    } 
    

    STATIC_ROOTMEDIA_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进来并将所有静态文件复制到该目录。

    2

    关于目录结构,关于如何设置应该有不同的意见。快速谷歌搜索可以调出一些关于Django项目结构的网站和讨论。我建议阅读一些信息,以确定什么是最适合您和您的项目的。

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

    我主要关注Django目录结构的两个勺子。 Two 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不应该在开发过程中影响你的静态文件的服务。从我了解到,collectstatic更当你在部署过程中,从一个单独的服务器,或AWS,Heroku的等更多信息可以在这里找到的文档服务您的静态文件:Managing Static Filesstaticfiles appDeploying static files

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

    你有没有加入

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

    到您的主URLPATTERN/urls.py?

    这里是开发过程中提供文件服务的详细信息:Serving static files during development.

    最后检查你的BASE_DIR以下是为您的项目的正确路径。你可能不得不改变它。

    我希望这会有所帮助。

    2

    请记住,如果您将DEBUG设置为'False',它将忽略staticfiles设置,因为预计您的web服务器将直接提供此服务。这让我感到几次,直到我意识到我没有更新staticfiles文件夹(我因为我现在不记得的原因而保存在单独的存储库中)。