在django代码

时间:2015-05-25 01:28:06

标签: python django

我有一个django应用程序,它发送一个包含图像文件作为MIME附件的电子邮件。电子邮件是从views.py发送的,但是为了附加文件,我需要获取图像的完整路径名,因此python可以打开它们。这些文件在我的应用程序的静态文件夹中,但我似乎无法找到一种方法,我可以在开发模式下工作的文件系统上获取文件的完整路径 - 它工作正常在收集静态后的生产中,但在开发中,它无法找到该文件,因为静态文件是从开发中的各个应用程序文件夹提供的。

4 个答案:

答案 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>

finders-module
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文件

希望这对您有用