【问题标题】:Django/Docker: error in path for serving templatesDjango/Docker:服务模板的路径错误
【发布时间】:2020-09-23 17:12:19
【问题描述】:

我尝试“dockerize”一个 Django 项目。 我已经 dockerized 一个 Django 项目;我尝试使用完全相同的项目架构。

我有第一个配置开发环境。

我构建/运行 2 个容器(web 和 db):好的。 我迁移:好的 当我尝试收集静电时出现错误

FileNotFoundError: [Errno 2] 没有这样的文件或目录:'/usr/src/app/core/static'

没错,静态文件夹与核心应用程序处于同一级别。

当我使用 Django Web 服务器配置开发环境时,我不必关心提供静态文件。所以我尝试访问 localhost:8000 并得到一个错误:

这意味着我在路径配置中有错误,但我可以找到复制相同结构的位置...

项目架构

- my_project
    |_ app
        |_ core
             |_ wsqi.py
             |_ settings
                 |_ base.py
                 |_ dev.py
                 |_ prod.py
             |_ urls.py
        |_ requirements
             |_ base.txt
             |_ dev.txt
             |_ prod.txt
        |_ static
        |_ templates
             |_ layout
                 |_ _footer.html
                 |_ _nav.html
                 |_ base.html
             |_ home.html
             |_ 404.html
             |_ 500.html
        |_ Dockerfile
        |_ Dockerfile.prod
        |_ entrypoint.sh
        |_ entrypoint.prod.sh
        |_ manage.py
        |_ .dockerignore
    |_ nginx
    |_ .env.dev
    |_ .env.prod
    |_ .gitignore
    |_ docker-compose.yml
    |_ docker-compose.prod.yml

base.py

import os
from django.utils.translation import ugettext_lazy as _

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

SECRET_KEY = os.environ.get('SECRET_KEY')

DEBUG = int(os.environ.get("DEBUG", default=0))

ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS").split(" ")

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'crispy_forms',
    'widget_tweaks',
    'bootstrap4',

    'registration.apps.RegistrationConfig',
    'monitor.apps.MonitorConfig',
    'randomization.apps.RandomizationConfig',
    'parameters.apps.ParametersConfig',
    'unblind.apps.UnblindConfig',
    'pharmacy.apps.PharmacyConfig',
    'export.apps.ExportConfig',

    'django_extensions',
    'debug_toolbar',

    'partial_date',
    'safedelete',
    'simple_history',

]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'randomization.middleware.stock',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

    'debug_toolbar.middleware.DebugToolbarMiddleware',

    'simple_history.middleware.HistoryRequestMiddleware',
]

ROOT_URLCONF = 'core.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR,'registration/templates'),
            os.path.join(BASE_DIR,'monitor/templates'),
            os.path.join(BASE_DIR,'randomization/templates'),
            os.path.join(BASE_DIR,'unblind/templates'),
            os.path.join(BASE_DIR,'pharmacy/templates'),
            os.path.join(BASE_DIR,'export/templates'),
            os.path.join(BASE_DIR,'templates'),    
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'randomization.context_processors.data_context_processor',
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',

            ],
        },
    },
]

WSGI_APPLICATION = 'core.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

DATABASES = {
    'default': {
        "ENGINE": os.environ.get("SQL_ENGINE", "django.db.backends.sqlite3"),
        "NAME": os.environ.get("SQL_DATABASE", os.path.join(BASE_DIR, 'db.sqlite3')),
        "USER": os.environ.get("SQL_USER", "user"),
        "PASSWORD": os.environ.get("SQL_PASSWORD", "password"),
        "HOST": os.environ.get("SQL_HOST", "localhost"),
        "PORT": os.environ.get("SQL_PORT", "5432"),
    }
}


STATIC_URL = '/static/'

MEDIA_URL = "/media/"

INTERNAL_IPS = ['127.0.0.1']

LOGIN_URL = 'home'
LOGIN_REDIRECT_URL = 'home'
LOGOUT_REDIRECT_URL = 'home'


dev.py

from .base import *

STATICFILES_DIRS = (
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR,'randomization/static'),
    os.path.join(BASE_DIR,'unblind/static'),
    os.path.join(BASE_DIR,'pharmacy/static'),
)

.env.dev

SECRET_KEY=*******************************
DEBUG=1
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=db_dev
SQL_USER=user
SQL_PASSWORD=user
SQL_HOST=db
SQL_PORT=5432
DATABASE=postgres
DJANGO_SETTINGS_MODULE=core.settings.dev

Dockerfile

# Pull the official base image
FROM python:3.8.3-alpine

# Set a work directory
WORKDIR /usr/src/app

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# install psycopg2 dependencies
RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev

# J LE CARROU - 21/09/2020 - Ajouts
RUN apk --update add libxml2-dev libxslt-dev libffi-dev gcc musl-dev libgcc openssl-dev curl
RUN apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev
RUN pip3 install psycopg2 psycopg2-binary

# Install dependencies
COPY requirements/ requirements/
RUN pip install --upgrade pip && pip install -r requirements/dev.txt

# Copy the entrypoint.sh file
COPY ./entrypoint.sh .

# Copy the project's files
COPY . .

# Run entrypoint.sh
ENTRYPOINT [ "/usr/src/app/entrypoint.sh" ]
version: '3.7'

services:
    web:
        build: ./app
        restart: always
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
            - ./app/:/usr/src/app
        ports:
            - 8000:8000
        env_file:
            - ./.env.dev
        depends_on: 
            - db
    db:
        image: postgres:12.0-alpine
        restart: always
        volumes:
            - postgres_data:/var/lib/postgres/data/
        environment:
            - POSTGRES_USER=user
            - POSTGRES_PASSWORD=user
            - POSTGRES_DB=db_dev
volumes:
    postgres_data:

【问题讨论】:

    标签: django docker docker-compose


    【解决方案1】:

    BASE_DIR指的是app/core,所以需要调整TEMPLATES目录如下:

    'DIRS': [
                os.path.join(BASE_DIR,'registration/templates'),
                os.path.join(BASE_DIR,'monitor/templates'),
                os.path.join(BASE_DIR,'randomization/templates'),
                os.path.join(BASE_DIR,'unblind/templates'),
                os.path.join(BASE_DIR,'pharmacy/templates'),
                os.path.join(BASE_DIR,'export/templates'),
                os.path.join(os.path.dirname(BASE_DIR,'templates')),    
            ],
    

    【讨论】:

      猜你喜欢
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      相关资源
      最近更新 更多