簡體   English   中英

Django:如何在生產中設置新的 static 路徑?

[英]Django: How to set a new static path in production?

使用 django 3.0.5,但我想這也與 < django 2.0 有關。

我在供應商空間上傳了我的第一個 django 應用程序,到目前為止一切正常。 這是我的提供者的服務器架構...

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

但是我仍然不明白一些 Django Static 邏輯。 我的 static 文件通過單獨的 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 沒有找到 static 文件。 好吧,我猜,但另一方面,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

我唯一一次提到明確的 static 文件夾是在開發中。 在我收集靜態並將其上傳到我的 apache 文件夾並通過 Git 我的應用程序之前。 旁注:我的 blackbird 生產應用程序文件夾中沒有 static 文件夾。

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 Doc 說STATIC_ROOT僅用於 collectstatic。 所以我將它用作開發中的導出文件夾。 但似乎內部發生了更多事情? 否則 Django 不會在我的生產應用程序中查看他的項目文件夾之外的static_storage/development_static但是當我將我的文件夾設置為static_storage/hello_static時,它找不到它。

STATICFILES_DIRS - (附加文件夾)作為一個選項 - 僅與 collectstatic 相關,或者錯過我的東西?

django是否在項目內部保存了collectstatic后的static文件夾路徑?

Is there a way to set a new explicit static path in production for Django or do i have set alias via apache to a new static folder? 我讀過它,但首先我必須了解 django 的邏輯。

好吧,在前端和后端之間,我一定忽略了我的應用程序的uWSGI服務正在映射我的 static 文件夾/ STATIC_URL 我忘了這件事。

另一方面, STATIC_ROOT可能在語義上具有誤導性 - 與MEDIA_ROOT不同 - STATIC_ROOT僅在執行collectstatic時在文件夾中收集 static 文件。 我把它弄混了。 STATIC_COLLECT這樣的東西會更明顯,以區分。

但是現在 static 和媒體文件正在我的制作中工作。

解決方案

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 將 map 我放入 apache 的所有內容。

設置.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 在文檔中使用了/home/virt/....之類的東西,Django 文檔也談到了/var/www/example.com/media/ 所以我使用了我的 SFTP 和 FTP 客戶端向我展示的路徑,現在它可以工作了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM