Django:如何在生产中设置新的静态路径?



使用 django 3.0.5,但我想这也与

我在我的提供商空间上传了我的第一个 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生产

DEBUG=false
INSTALLED_APPS = [
<...>
'django.contrib.staticfiles',
]
STATIC_URL = '/static/'
# STATIC_ROOT = ''
# STATICFILES_DIRS  = ''

我也试图掀起整个django.contrib.staticfiles,没有它,django 仍然可以找到production_static,但不能hello_static

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

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仅用于收集静态。所以我在开发中将其用作导出文件夹。但内部似乎发生了更多的事情?否则 Django 不会在我的生产应用程序中查找他的项目文件夹之外static_storage/development_static但是当我将文件夹设置为static_storage/hello_static时,它错过了查找它。

STATICFILES_DIRS- (附加文件夹(作为一个选项 - 仅与收集静态有关,或者错过了我的东西?

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_URLMEDIA_URLuWSGI 都会映射我放入 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 Doc也谈到了/var/www/example.com/media/。所以我使用了我的SFTP和FTP客户端向我显示的路径,现在它可以工作了。

最新更新