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

2024-05-19 00:21:39 发布

您现在位置:Python中文网/ 问答频道 /正文

working with django 3.0.5, but i guess this relates also to < 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静态逻辑。我的静态文件通过单独的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

我唯一一次提到显式静态文件夹是在开发中。在我收集静态数据并将其上传到apache文件夹和Git应用程序之前。旁注:我的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 Doc说STATIC_ROOT只用于收集静态数据。所以我在开发中使用它作为一个导出文件夹,但在内部似乎发生了更多的事情?否则Django不会在我的生产应用程序中的项目文件夹外查找static_storage/development_static,但当我将文件夹设置为static_storage/hello_static时,它找不到了

STATICFILES_DIRS-(附加文件夹)作为选项-仅与collectstatic相关,还是遗漏了什么

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

是否有办法在生产环境中为Django设置新的显式静态路径,或者我是否已通过apache将alias设置为新的静态文件夹?我读过,但首先我必须理解django的逻辑


Tags: djangopy文件夹应用程序helloapache静态static
1条回答
网友
1楼 · 发布于 2024-05-19 00:21:39

好的,在前端和后端之间,我一定忽略了我的应用程序的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_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环境设置我的变量

<...>
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客户端显示的路径,现在它可以工作了

相关问题 更多 >

    热门问题