我有一个django应用程序,它发送一个包含图像文件作为MIME附件的电子邮件。电子邮件是从views.py发送的,但是为了附加文件,我需要获取图像的完整路径名,因此python可以打开它们。这些文件在我的应用程序的静态文件夹中,但我似乎无法找到一种方法,我可以在开发模式下工作的文件系统上获取文件的完整路径 - 它工作正常在收集静态后的生产中,但在开发中,它无法找到该文件,因为静态文件是从开发中的各个应用程序文件夹提供的。
答案 0 :(得分:18)
使用<configuration>
<property name="LOG_HOME" value="logs" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5.5p] [%thread] [%-20.20C:%-5.5L] %msg%n</Pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<appender name="SERVICE-PROVIDER-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/project/serviceProvider.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/project/archived/serviceProvider-%d{yyyy-MM-dd}.%i.log.gz
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5.5p] [%thread] [%-20.20C:%-5.5L] %msg%n</Pattern>
</encoder>
</appender>
<logger name="com.project.serviceprovider.back" level="TRACE" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="SERVICE-PROVIDER-LOG" />
</logger>
<root level="TRACE">
<appender-ref ref="STDOUT" />
<appender-ref ref="SERVICE-PROVIDER-LOG" />
</root>
</configuration>
Django
字符串from django.contrib.staticfiles import finders
result = finders.find('css/base.css')
searched_locations = finders.searched_locations
是文件系统路径,如果找不到,请仔细检查result
答案 1 :(得分:17)
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/'
制作媒体&amp; 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 :(得分:1)
由于您希望应用程序是静态的,因此这就是您所需要的!
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('')
仅获取路径。
答案 3 :(得分:0)
在犯了很多错误后,以下事情对我有用..
假设你有以下目录结构(谢谢 @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')
现在在您要访问/static/image.jpg文件的app_name / views.py文件中
<强> APP_NAME / 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文件希望这对您有用