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

时间:2012-07-30 12:41:42

标签: django django-views django-staticfiles

我正在使用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"

7 个答案:

答案 0 :(得分:247)

由于这是Google的最佳结果,我想我会添加另一种方法来实现这一目标。我个人更喜欢这个,因为它将实现留给了Django框架。

# Original answer said:
# from django.templatetags.static import static
# Improved answer (thanks @Kenial, see below)
from django.contrib.staticfiles.templatetags.staticfiles import static

url = static('x.jpg')
# url now contains '/static/x.jpg', assuming a static path of '/static/'

答案 1 :(得分:79)

然而,如果你在你的django项目中使用“缓存存储”并且静态文件的最终url路径应该“散列”(例如 style.aaddd9d8d8d7.css 来自 style.css ),然后您无法获得django.templatetags.static.static()的精确网址。相反,您必须使用django.contrib.staticfiles中的模板标记来获取散列网址。

此外,在使用开发服务器的情况下,此模板标记方法返回非散列网址,因此无论主机是开发还是生产,您都可以使用此代码! :)

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')

答案 2 :(得分:12)

这是另一种方式! (在Django 1.6上测试)

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

答案 3 :(得分:2)

@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)

答案 4 :(得分:1)

在Django 3.0中,您应该使用from django.templatetags.static import static

from django.templatetags.static import static

...

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

答案 5 :(得分:0)

如果要获取绝对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'

答案 6 :(得分:0)

使用默认的static标签:

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

django.contrib.staticfiles.templatetags.staticfiles中还有另一个标签(如已接受的答案所示),但在Django 2.0+中已弃用。