У меня есть приложение django, которое отправляет электронное письмо, содержащее файлы изображений в виде вложений MIME. Электронные письма отправляются из views.py, но для того, чтобы прикрепить файлы, мне нужно получить полный путь к изображениям, чтобы python мог их открыть. Эти файлы находятся в статической папке в моем приложении, но я не могу найти способ получить полный путь к файлу в файловой системе, которая работает в режиме разработки — работает нормально в производстве после сбора статики, но в разработке он не может найти файл, поскольку статические файлы обслуживаются из отдельных папок приложения в процессе разработки.
Получить путь к файлу для статического файла в коде django
Ответы (4)
Используйте finders-module из Django
from django.contrib.staticfiles import finders
result = finders.find('css/base.css')
searched_locations = finders.searched_locations
Строка result
— это путь к файловой системе, и если он не найден, дважды проверьте searched_locations
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' %}
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 через переменную изображения
Надеюсь, это работает хорошо для вас
Поскольку вы хотите, чтобы приложение было статичным, вот что вам нужно!
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('')
только для получения пути.