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

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

Ответ 1

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/'

сделать dirs 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' %}

Ответ 2

Используйте модуль Django

from django.contrib.staticfiles import finders

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

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

Ответ 3

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

Предположим, что у вас следующая структура каталогов (спасибо @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 varaible в области файлов, например. (Если не было сделано раньше)

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 с файлом через изображение

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

Ответ 4

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

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('') для получения пути.