Django:如何在生产中设置新的静态路径?
Django: How to set a new static path in production?
working with django 3.0.5, but i guess this relates also to < django
2.0.
我在我的提供商 space 上上传了我的第一个 Django 应用程序,到目前为止一切正常。
这是我的提供商的服务器模式...
_
(` ).
( ). .-------. .-------.
_( '`. ----------> | 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
Production
DEBUG=false
INSTALLED_APPS = [
<...>
'django.contrib.staticfiles',
]
STATIC_URL = '/static/'
# STATIC_ROOT = ''
# STATICFILES_DIRS = ''
我也试过把整个django.contrib.staticfiles
都引出来,django没有它还是能找到production_static
,但是找不到hello_static
我唯一一次提到显式静态文件夹是在开发中。在我收集静态数据并通过 Git 我的应用程序将其上传到我的 apache 文件夹之前。旁注:我的 blackbird 生产应用程序文件夹中没有静态文件夹。
settings.py
Development
STATIC_URL = '/static/'
STATIC_ROOT = '/static_storage/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, env('STATICFILES_DIRS'))]
# env('STATICFILES_DIRS') = static_storage/development_static
Question
Django 文档说 STATIC_ROOT
仅适用于 collectstatic。所以我将它用作开发中的导出文件夹。但似乎在内部发生了更多事情?否则 Django 不会在我的生产应用程序中查看他的项目文件夹之外的 static_storage/development_static
但是当我将我的文件夹设置为 static_storage/hello_static
时它找不到它。
STATICFILES_DIRS
-(附加文件夹)作为一个选项 - 仅与 collectstatic 相关,或者想念什么?
django是否在项目内部保存collectstatic
后的静态文件夹路径?
有没有办法在生产环境中为 Django 设置新的显式静态路径,或者我是否通过 apache 将别名设置为新的静态文件夹?我读过它,但首先我必须了解django的逻辑。
好吧,在前端和后端之间,我一定忽略了我的应用程序的 uWSGI
服务正在映射我的静态文件夹 / 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_URL
或 MEDIA_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
有疑问,因为我不明白如何正确命名路径。例如,我的提供者在文档中使用了类似 /home/virt/....
的东西,Django 文档也谈到了 /var/www/example.com/media/
。所以我使用了我的 SFTP 和 FTP 客户端显示给我的路径,现在它可以工作了。
working with django 3.0.5, but i guess this relates also to < django 2.0.
我在我的提供商 space 上上传了我的第一个 Django 应用程序,到目前为止一切正常。 这是我的提供商的服务器模式...
_
(` ).
( ). .-------. .-------.
_( '`. ----------> | 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
Production
DEBUG=false
INSTALLED_APPS = [
<...>
'django.contrib.staticfiles',
]
STATIC_URL = '/static/'
# STATIC_ROOT = ''
# STATICFILES_DIRS = ''
我也试过把整个django.contrib.staticfiles
都引出来,django没有它还是能找到production_static
,但是找不到hello_static
我唯一一次提到显式静态文件夹是在开发中。在我收集静态数据并通过 Git 我的应用程序将其上传到我的 apache 文件夹之前。旁注:我的 blackbird 生产应用程序文件夹中没有静态文件夹。
settings.py
Development
STATIC_URL = '/static/'
STATIC_ROOT = '/static_storage/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, env('STATICFILES_DIRS'))]
# env('STATICFILES_DIRS') = static_storage/development_static
Question
Django 文档说 STATIC_ROOT
仅适用于 collectstatic。所以我将它用作开发中的导出文件夹。但似乎在内部发生了更多事情?否则 Django 不会在我的生产应用程序中查看他的项目文件夹之外的 static_storage/development_static
但是当我将我的文件夹设置为 static_storage/hello_static
时它找不到它。
STATICFILES_DIRS
-(附加文件夹)作为一个选项 - 仅与 collectstatic 相关,或者想念什么?
django是否在项目内部保存collectstatic
后的静态文件夹路径?
有没有办法在生产环境中为 Django 设置新的显式静态路径,或者我是否通过 apache 将别名设置为新的静态文件夹?我读过它,但首先我必须了解django的逻辑。
好吧,在前端和后端之间,我一定忽略了我的应用程序的 uWSGI
服务正在映射我的静态文件夹 / 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_URL
或 MEDIA_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
有疑问,因为我不明白如何正确命名路径。例如,我的提供者在文档中使用了类似 /home/virt/....
的东西,Django 文档也谈到了 /var/www/example.com/media/
。所以我使用了我的 SFTP 和 FTP 客户端显示给我的路径,现在它可以工作了。