在django代码中获取静态文件的文件路径

ask*_*tor 17 python django

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

Pal*_*ron 21

使用取景器模块Django

from django.contrib.staticfiles import finders

result = finders.find('css/base.css')
searched_locations = finders.searched_locations
Run Code Online (Sandbox Code Playgroud)

String result是文件系统路径,如果找不到,请仔细检查searched_locations

  • @SergeRogatch,在生产中,静态文件由 apache/nginx 提供,因此此方法不会像调试模型那样工作。 (3认同)

mad*_*han 19

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}),
)
Run Code Online (Sandbox Code Playgroud)

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/'
Run Code Online (Sandbox Code Playgroud)

制作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/
Run Code Online (Sandbox Code Playgroud)

现在您可以直接运行项目

python manage.py collectstatic
Run Code Online (Sandbox Code Playgroud)

从视图访问

from django.templatetags.static import static

static('image.jpg')
static('some_app/css/style.css')
Run Code Online (Sandbox Code Playgroud)

从模板访问

{% load staticfiles %}

{% static 'image.jpg' %}
{% static 'some_app/css/style.css' %}
Run Code Online (Sandbox Code Playgroud)

  • 在视图中,这将返回一个相对URI(例如,注入到html中),而不是用于`open()的文件系统路径. (6认同)

Mr.*_*Jha 8

在犯了很多错误之后,以下事情对我有用..

假设您有以下目录结构(感谢@madzohan

project_dir/
    static/
        image.jpg
    settings.py
    urls.py
apps/
    __init__.py
    some_app/
        static/
            some_app/
                css/
                    style.css
Run Code Online (Sandbox Code Playgroud)

现在如果你想获取project_dir/static/image.py的路径那么

在您的 project_dir/settings.py 文件中,在文件范围内定义一个 STATIC_DIR 变量,例如。(如果之前没有做过)

项目目录/settings.py

import os

# after your other file variables
STATIC_DIR = os.path.join(BASE_DIR, 'static')
Run Code Online (Sandbox Code Playgroud)

现在在您要访问 /static/image.jpg 文件的 app_name/views.py 文件中

应用程序名称/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')
Run Code Online (Sandbox Code Playgroud)

然后您可以通过 image 变量访问 image.jpg 文件

希望这对你有用