【问题标题】:How to set STATIC_ROOT and MEDIA_ROOT so the path used is not hard coded?如何设置 STATIC_ROOT 和 MEDIA_ROOT 使使用的路径不是硬编码的?
【发布时间】:2023-03-28 07:34:01
【问题描述】:

在我的 settings.py 文件中,STATIC_ROOTMEDIA_ROOT 目前都指向一个硬编码的位置。例如STATIC_ROOT 路径是:

/home/ian/projectname/mysite/appname/static

我知道这会在我部署项目时引起问题。

环顾四周,我发现我需要使用os.path,但无数的例子让我感到困惑。

我尝试查看设置此文件的不同排列(或获取用于设置 BASE_DIR 的示例值),但是屏幕截图显示我缺少某些内容,因为它在抱怨 文件 价值。

如果需要我使用 Django 1.6

提前致谢。

【问题讨论】:

    标签: django django-settings django-1.6 os.path


    【解决方案1】:

    首先,由于在交互式 shell 中附加 __file__,您会收到此错误:

    NameError: name '__file__' is not defined
    

    shell 未检测到__file__ 中的当前文件路径,因为它与您添加此行的filepath 相关。例如,要工作,您需要将其包含在file.py

    os.path.join(os.path.dirname(__file__))
    

    然后,从命令行运行:

    python file.py
    

    这是因为__file__file.pyfilepath 相关。

    settings.py的情况下,用这个来获取你的Django项目的根目录:

    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
    

    然后您可以使用os.path.join() 加入其他相对路径,例如:

    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates')
    

    有关如何布置 Django 项目目录的更多信息,请阅读:Common structures

    【讨论】:

      【解决方案2】:

      通常的做法(也建议在django official tutorial 中)是有一个BASE_DIR 设置,从__file__ 获取当前工作目录:

      BASE_DIR = os.path.dirname(os.path.abspath(__file__))
      

      然后,使用os.path.join()构造其他相对路径,例如:

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

      请注意,__file__ 仅适用于模块,在控制台上使用它没有意义。

      【讨论】:

      • 感谢您的快速响应,使用 BASE_DIR 的示例,如果我能够看到它的值,它会是“/home/ian/projectname/mysite/”吗?如果是这样,我如何使用 os.path.join 去另外两个文件夹?即 /appname/static ?
      • @IanCarpenter 很好,通常静态根在项目级别,而不是应用级别。如果您有多个应用程序具有自己的静态文件 - 使用 staticfiles 内置应用程序,请参阅 Managing static files 了解更多信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 2012-06-03
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 2022-10-14
      相关资源
      最近更新 更多