У меня есть приложение django, которое отправляет письмо с файлами изображений в виде вложений MIME. Письма отправляются из views.py, но для прикрепления файлов мне нужно получить полное имя пути, поэтому python может их открыть. Эти файлы находятся в статической папке в моем приложении, но я не могу найти способ, которым я могу получить полный путь к файлу в файловой системе, которая работает в режиме разработки. Он отлично работает в процессе производства после сбора статических данных, но в dev он не может найти файл, поскольку статические файлы будут отправляться из отдельных папок приложений в процессе разработки.
Получить путь к файлу для статического файла в коде django
Ответ 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('')
для получения пути.