Получить путь к файлу для статического файла в коде django

У меня есть приложение django, которое отправляет электронное письмо, содержащее файлы изображений в виде вложений MIME. Электронные письма отправляются из views.py, но для того, чтобы прикрепить файлы, мне нужно получить полный путь к изображениям, чтобы python мог их открыть. Эти файлы находятся в статической папке в моем приложении, но я не могу найти способ получить полный путь к файлу в файловой системе, которая работает в режиме разработки — работает нормально в производстве после сбора статики, но в разработке он не может найти файл, поскольку статические файлы обслуживаются из отдельных папок приложения в процессе разработки.


person askvictor    schedule 25.05.2015    source источник


Ответы (4)


Используйте finders-module из Django

from django.contrib.staticfiles import finders

result = finders.find('css/base.css')
searched_locations = finders.searched_locations

Строка result — это путь к файловой системе, и если он не найден, дважды проверьте searched_locations

person PaleNeutron    schedule 30.04.2018
comment
Спасибо. Это должен быть принятый ответ, поскольку OP запросил путь к файловой системе, а не URL-адрес. - person craigds; 23.08.2018
comment
@SergeRogatch, в производстве статические файлы обслуживаются apache/nginx, поэтому этот метод не будет работать как модель отладки. - person PaleNeutron; 17.02.2019
comment
Это было очень полезно для определения того, откуда Django загружал статические файлы, чтобы я мог поместить другие файлы в нужное место. Я просто использовал finders.find('.'), и это помогло. Спасибо!. - person MTS; 17.04.2021

project_dir.url добавить в конец файла

if DEBUG:
    urlpatterns += patterns(
        '',
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
            {'document_root': MEDIA_ROOT}),

        url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
            {'document_root': STATIC_ROOT}),
)

project_dir.settings

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
STATIC_ROOT = os.path.join(BASE_DIR, 'static_debug')
STATIC_URL = '/static/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

создайте каталоги media и static_debug (добавьте их в .gitignore)

project_dir/
    static/
        image.jpg
    settings.py
    urls.py
apps/
    __init__.py
    some_app/
        static/
            some_app/
                css/
                    style.css
media/
static_debug/

Теперь вы можете запустить проект или напрямую

python manage.py collectstatic

доступ из представлений

from django.templatetags.static import static

static('image.jpg')
static('some_app/css/style.css')

доступ из шаблонов

{% load staticfiles %}

{% static 'image.jpg' %}
{% static 'some_app/css/style.css' %}
person madzohan    schedule 25.05.2015
comment
В представлении это возвращает относительный URI (например, для вставки в html), а не путь к файловой системе для использования с open() - person shuckc; 08.04.2017

После множества ошибок у меня сработало следующее.

Предположим, у вас есть следующая структура каталогов (спасибо @madzohan)

project_dir/
    static/
        image.jpg
    settings.py
    urls.py
apps/
    __init__.py
    some_app/
        static/
            some_app/
                css/
                    style.css

И теперь, если вы хотите получить путь к project_dir/static/image.py, тогда

В вашем файле project_dir/settings.py определите переменную STATIC_DIR в области файла, например. (Если это не было сделано ранее)

project_dir/settings.py

import os

# after your other file variables
STATIC_DIR = os.path.join(BASE_DIR, 'static')

Теперь в вашем файле app_name/views.py, откуда вы хотите получить доступ к файлу /static/image.jpg

название_приложения/views.py

import os
from project_dir.settings import STATIC_DIR

# here I want the /static/image.jpg file then
image = os.path.join(STATIC_DIR, 'image.jpg')

И тогда вы можете получить доступ к файлу image.jpg через переменную изображения

Надеюсь, это работает хорошо для вас

person Mr. Suryaa Jha    schedule 13.01.2018

Поскольку вы хотите, чтобы приложение было статичным, вот что вам нужно!

from django.contrib.staticfiles import finders

APP_LABEL = 'app_youre_looking_at'
FILE_NAME = 'file_name_you_want_to_read_or_write.ext'

stores = finders.AppDirectoriesFinder(app_names={APP_LABEL}).storages
print(f'Here it is: {stores[APP_LABEL].path(FILE_NAME)}')

FILE_NAME не обязательно должен существовать. Вы можете использовать stores[APP_LABEL].path('') только для получения пути.

person ogurets    schedule 27.03.2019