【问题标题】:Django: How to set a new static path in production?Django:如何在生产中设置新的静态路径?
【发布时间】:2020-10-23 08:30:03
【问题描述】:

使用 django 3.0.5,但我想这也与

我在我的提供商空间上传了我的第一个 django 应用程序,到目前为止一切正常。 这是我的 Provider 的服务器架构...

        _
         (`  ).
        (     ).                 .-------.        .-------.
       _(       '`.  ----------> | nginx | -----> | httpd |
   .=(`( Internet )              '-------'        '-------'
   ((    (..__.:'-'                  |                => php via php-fpm
   `(       ) )                      |                => static files
     ` __.:'   )                     |                => htaccess
            --'                      |
                                     |            .--------------.
                                     '----------> | Web Backends |
                                                  '--------------'
                                                      => per-user nginx
                                                      => nodejs, python, ruby, ...
                                                      => gogs, mattermost, matrix, ...

但是我仍然不明白一些 Django 静态逻辑。我的静态文件通过单独的 Apache 服务提供。我的应用名为blackbird

下面就像一个web后端打印

blackbird.abc/blackbird_assets apache
blackbird.abc http:8080 Ok, listening : PID 10104, vassalsuWSGI worker 2

这就像我的服务器帐户目录的样子

User
|
'-blackbird_app
|     '- manage.py
'-hmtl <symbolic link to my documentroot>
    '- blackbird_assets
          '- static_storage
                 '-production_static
                      '-css
                      '-img

如果我想将我的 apache 站点上的 production_static 文件夹重命名为 hello_static 并重新启动我的应用程序,django 没有找到静态文件。好吧,我猜,但另一方面,django 怎么能找到production_static,因为这是我目前的settings.py

settings.py 生产

DEBUG=false

INSTALLED_APPS = [
     <...>
    'django.contrib.staticfiles',
    ]

 STATIC_URL = '/static/'
 # STATIC_ROOT = ''
 # STATICFILES_DIRS  = ''

我也尝试过引爆整个django.contrib.staticfiles,没有它django仍然可以找到production_static,但找不到hello_static

我唯一一次提到显式静态文件夹是在开发中。在我收集静态并将其上传到我的 apache 文件夹并通过 Git 我的应用程序之前。旁注:我的 blackbird 生产应用程序文件夹中没有静态文件夹。

settings.py开发

 STATIC_URL = '/static/'
 STATIC_ROOT = '/static_storage/'
 STATICFILES_DIRS  = [os.path.join(BASE_DIR, env('STATICFILES_DIRS'))]
 # env('STATICFILES_DIRS') = static_storage/development_static

问题

Django 文档说STATIC_ROOT 仅用于收集静态。所以我将它用作开发中的导出文件夹。但似乎内部发生了更多事情?否则 Django 不会在我的生产应用程序中查看他的项目文件夹之外的 static_storage/development_static,但是当我将我的文件夹设置为 static_storage/hello_static 时,它找不到它。

STATICFILES_DIRS - (附加文件夹)作为一个选项 - 仅与 collectstatic 的引用有关,还是错过了什么?

django内部是否保存了项目中collectstatic之后的静态文件夹路径?

有没有办法在生产中为 Django 设置一个新的显式静态路径,或者我是否通过 apache 将别名设置为一个新的静态文件夹?我读过它,但首先我必须了解 django 的逻辑。

【问题讨论】:

    标签: python django django-staticfiles django-storage django-static


    【解决方案1】:

    好吧,在前端和后端之间,我一定忽略了我的应用程序的uWSGIservice 正在映射我的静态文件夹/STATIC_URL。我忘了这个。

    另一方面,STATIC_ROOT 可能在语义上具有误导性 - 与 MEDIA_ROOT 不同 - STATIC_ROOT 仅在执行 collectstatic 时收集文件夹中的静态文件。我把它弄混了。我想像STATIC_COLLECT 这样的东西会更明显,可以区分。

    但是现在静态和媒体文件正在我的作品中工作。

    解决方案

    blackbird_app.ini (uWSGI)


    set-placeholder = var_static=/home/user/html/blackbird_assets
    <...>
    static-map = /static=%(var_static)/static
    static-map = /media=%(var_static)/media
    <...>
    

    每当 Django 使用 STATIC_URLMEDIA_URL 时,uWSGI 都会映射我放入 apache 中的所有内容。

    setting.py


    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    print("BASE_DIR:", BASE_DIR)
    # Server Base Level or Project Dev Map
    SERVER_DIR = os.path.dirname(BASE_DIR)
    print("SERVER_DIR:", SERVER_DIR)
    
    <...>
    
    > settings.py
    # --- STATIC_URL
    STATIC_URL = '/static/'
    
    # --- STATIC_ROOT
    STATIC_ROOT = os.path.join(SERVER_DIR, env('STATIC_ROOT'))
    print("STATIC_ROOT:", STATIC_ROOT)
    # --- STATICFILES_DIRS
    STATICFILES_DIRS = [os.path.join(SERVER_DIR, env('STATICFILES_DIRS'))]
    print("STATICFILES_DIRS:", STATICFILES_DIRS)
    
    # -- MEDIA_URL
    MEDIA_URL = '/media/'
    print("MEDIA_URL:", MEDIA_URL)
    
    # -- MEDIA_ROOT
    if DEVELOPMENT_MODE == True:
        MEDIA_ROOT = os.path.join(SERVER_DIR, env('MEDIA_ROOT_DEV'))   
    else:
        MEDIA_ROOT = env('MEDIA_ROOT_PROD')  
    print("MEDIA_ROOT:", MEDIA_ROOT)
    print("\n")
    

    我使用了很多 print() 来跟踪问题。另一方面,从现在开始,我将使用它来更好地查看我的应用日志

    .env


    我使用 django-environ 来设置我的变量。

    <...>
    STATICFILES_DIRS=dev_static
    STATIC_ROOT=static_root
    MEDIA_ROOT_DEV=media_root
    MEDIA_ROOT_PROD=/var/www/virt/user_name/html/blackbird_assets/media
    <...>
    

    起初我遇到了MEDIA_ROOT_PROD 的问题,因为我不明白如何正确命名路径。例如,我的 Provider 在 Doc 中使用了 /home/virt/.... 之类的东西,Django Doc 也谈到了 /var/www/example.com/media/。所以我使用了我的 SFTP 和 FTP 客户端显示给我的路径,现在它可以工作了。

    【讨论】:

      猜你喜欢
      • 2013-01-20
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 2017-12-31
      • 2018-12-26
      • 2020-01-04
      • 2020-08-18
      • 2017-03-24
      相关资源
      最近更新 更多