Django 获取视图中的静态文件 URL

我正在使用 reportlab pdfgen 创建一个 PDF。在 PDF 中有一个由 drawImage创建的图像。为此,我要么需要图像的 URL,要么需要视图中图像的路径。我设法构建了 URL,但是如何获得图像的本地路径呢?

返回文章页面网址:

prefix = 'https://' if request.is_secure() else 'http://'
image_url = prefix + request.get_host() + STATIC_URL + "images/logo_80.png"
86924 次浏览
# Older Django <3.0 (also deprecated in 2.0):
from django.contrib.staticfiles.templatetags.staticfiles import static


# Django 3.0+
from django.templatetags.static import static


url = static('x.jpg')

Url 现在包含 '/static/x.jpg',假设它是 '/static/'的静态路径

编辑: 如果您使用的是 Django > = 3.0,请参考 Django 获取视图中的静态文件 URL

Dyve 的答案很好,但是,如果你在 django 项目中使用“缓存”,静态文件的最终 URL 路径应该是“散列”的(比如 Style.css中的 Style. aadd9d8d8d7.css) ,那么你就不能使用 django.templatetags.static.static()得到精确的 URL。相反,您必须使用来自 django.contrib.staticfiles的模板标记来获得散列 URL。

此外,在使用开发服务器的情况下,这个模板标记方法返回非散列的 url,因此您可以使用这段代码,而不管它是开发还是生产的主机!:)

from django.contrib.staticfiles.templatetags.staticfiles import static


# 'css/style.css' file should exist in static path. otherwise, error will occur
url = static('css/style.css')

还有一个办法! (在 Django 1.6上测试)

from django.contrib.staticfiles.storage import staticfiles_storage
staticfiles_storage.url(path)

@ dyve 的回答在开发服务器上不起作用,我用 find解决了这个问题。下面是函数:

from django.conf import settings
from django.contrib.staticfiles.finders import find
from django.templatetags.static import static


def get_static(path):
if settings.DEBUG:
return find(path)
else:
return static(path)

如果你想得到绝对 URL (包括协议、主机和端口) ,你可以使用如下 request.build_absolute_uri函数:

from django.contrib.staticfiles.storage import staticfiles_storage
self.request.build_absolute_uri(staticfiles_storage.url('my-static-image.png'))
# 'http://localhost:8000/static/my-static-image.png'

使用默认的 static标签:

from django.templatetags.static import static
static('favicon.ico')

django.contrib.staticfiles.templatetags.staticfiles中还有另一个标记(与已接受的答案一样) ,但是在 Django 2.0 + 中不推荐使用它。

从 Django 3.0开始,你应该使用 from django.templatetags.static import static:

from django.templatetags.static import static


...


img_url = static('images/logo_80.png')

简而言之,你需要

  • STATIC_URL
  • STATIC_ROOT
  • urlpatterns
  • staticfiles
  • templatetags
  • url parameters

都在正确的地方,让这个工作。此外,在实时部署中,情况会有所不同,很有可能当前花费3个小时的设置在本地机器上工作,但在服务器上工作。

所以我采取了传统的方式! !

app
├── static
│   └── json
│       └── data.json
└── views.py

views.py

import os


with open(os.path.abspath(os.getcwd()) + '/app/static/json/data.json', 'r') as f:
pass