簡體   English   中英

在cloudControl部署中調試Django`collectstatic`的問題

[英]Problems debugging Django `collectstatic` in a cloudControl deployment

我有一個部署到cloudControl的Django應用程序。 配置是標准配置,推送/部署不會發生(明顯)錯誤。

但是collectstatic步驟沒有執行:它靜默失敗(我看不到-----> Collecting static files消息)。 部署后,該應用程序的靜態文件夾為空,因此您會連續收到500個服務器錯誤。

我可以通過更改Procfile來解決它,但是它也不是一致的:

web: python manage.py collectstatic --noinput; gunicorn app.wsgi:application --config gunicorn_cnf.py --bind 0.0.0.0:${PORT:-5000}`

collectstatic可以在本地正常運行,並且如果我運行cctrlapp app/deployment run "python manage.py collectstatic --noinput"不會顯示任何錯誤:

將669個靜態文件復制到'/ srv / www / staticfiles / static',后處理669。

但是/srv/www/staticfiles/static為空。


我怎么知道為什么在push階段沒有執行collectstatic?

我已經能夠使用自定義的python buildpack調試問題,所以這里是進一步參考的答案。

問題出在settings.py文件中。 我在此文件中要做的第一件事是檢查我們是在cloudControl環境中還是在本地環境中。 我這樣做是在尋找CRED_FILE環境變量(與建議的變量沒有太大不同):如果未找到任何變量,則會加載一個本地JSON文件,該文件模仿該憑據變量進行開發:

try:
    cred_file = os.environ['CRED_FILE']
    DEBUG = False

except KeyError:
    cred_file = os.path.join(BASE_DIR, 'creds.json')
    DEBUG = True

知道環境后,我就可以擁有不同的INSTALLED_APPS (在生產和開發中, requirements.txt文件也略有不同)或更改某些設置。

現在的壞消息是:在推送階段沒有可用的CRED_FILE

因此,我試圖加載未安裝的應用程序(因為它們僅在開發需求文件中,例如coveragedjango-debug-toolbar )或使用未設置的憑據(當然, creds.json未上傳到資源庫:僅上傳具有虛擬值的TXT作為參考)。 這就是為什么collectstatic在推階段默默地失敗。

這是我的解決方案(只要您的存儲庫中有虛擬憑據文件,它就可以工作):

try:
    cred_file = os.environ['CRED_FILE']
    DEBUG = False

except KeyError:
    if os.path.exists(os.path.join(BASE_DIR, 'creds.json')):
        cred_file = os.path.join(BASE_DIR, 'creds.json')
        DEBUG = True
    else:
        cred_file = os.path.join(BASE_DIR, 'creds.json.txt')
        DEBUG = False

憑證不是collectstatic使用的,因此creds.json.txt文件中可以包含任何內容。 不是很干凈,但是現在可以正常工作了。


編輯

正如@pst在評論中指出的那樣,有一個環境變量可以知道buildpack是否正在運行,因此我們也可以使用該變量來加載所需的憑據並設置DEBUG

if 'CRED_FILE' in os.environ:
    cred_file = os.environ['CRED_FILE']
    DEBUG = False

elif 'BUILDPACK_RUNNING' in os.environ:
    cred_file = os.path.join(BASE_DIR, 'creds.json.txt') 
    DEBUG = False

else:
    cred_file = os.path.join(BASE_DIR, 'creds.json')
    DEBUG = True

暫無
暫無

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

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