Django获取静态文件的绝对URL

时间:2014-05-19 20:02:36

标签: python django

在Django中,当我使用:

{{ request.build_absolute_uri }}{% static "img/myimage.jpg" %}

它产生:' http://myurl.com//static/img/myimage.jpg'。这会产生错误。

如何删除双斜杠?

STATIC URL是:

STATIC_URL = '/static/'

但我不认为删除第一个' /'会是一个好主意。

6 个答案:

答案 0 :(得分:12)

build_absolute_uri方法为当前页面构建绝对uri。这意味着,如果您正在进行,例如' http://myurl.com/login/',生成的完整网址将是' http://myurl.com/login//static/img/myimage.jpg'。

相反,使用request.get_host()(可选地与request.scheme一起用于网址方案),或者最好使用sites framework将模板变量设置为当前网站域。关于代理,get_host()方法有some issues

get_host()方法将返回当前域,而不附加路径。

答案 1 :(得分:3)

request对象在模板中可用,并且您可以轻松访问request.schemerequest.META.HTTP_HOST之类的属性来构造基本URL,可以在静态URL之前添加基本URL,以获取完整的网址。

最终示例如下所示:

<img src="{{request.scheme}}://{{request.META.HTTP_HOST}}{% static 'img/myimage.jpg' %}">

答案 2 :(得分:2)

我刚刚制作了一个快速模板标签。创建文件/myapp/templatetags/__init__.py/myapp/templatetags/my_tag_library.py,如果您还没有,请将以下内容添加到my_tag_library.py

from django import template
from django.templatetags import static

register = template.Library()

class FullStaticNode(static.StaticNode):
    def url(self, context):
        request = context['request']
        return request.build_absolute_uri(super().url(context))


@register.tag('fullstatic')
def do_static(parser, token):
    return FullStaticNode.handle_token(parser, token)

然后在您的模板中,只需{% load my_tag_library %}并使用例如{% fullstatic my_image.jpg %}

为了回应先前的评论,想知道为什么有人需要这样做,我的特定用例是我想在open graph protocol元标记内放置一个静态文件的链接,这些链接需要是绝对。在开发过程中,静态文件在本地提供,但在生产中,它们可以远程提供,因此我不能只是在主机前面获取完整的URL。

答案 3 :(得分:0)

这值得更新吗(Django 2+)?

这对我特别有帮助,因为我试图在链接中添加查询,即myimage.jpg实际上是从数据库中提取的。我需要一种将其放入src的方法,该方法是用{{img_link_field_in_model}}替换'myimage.jpg'。

<img src="{% get_static_prefix %}img/myimage.jpg">

将产生:

<img src="/static/img/myimage.jpg">

查询示例为:

<img src="{% get_static_prefix %}img/{{img_link_from_model}}">

答案 4 :(得分:-2)

不完全确定您要问的是什么,但由于{%static ..%}只是将/ static /添加到您指定的路径的前面,您可以自己执行此操作:

{{ request.build_absolute_uri }}static/img/myimage.jpg

不是非常模块化,但是大多数情况下您不需要直接访问完整的网址,因为如果您将其用作某个html的src,它会将其附加到您正在使用的任何网址上对象

答案 5 :(得分:-4)

build_absolute_uri将位置作为处理双斜杠问题的参数。 不幸的是,你不能通过django模板语言传递参数。

您需要构建一个自定义模板标记或过滤器,它接受build_absolute_uri函数的参数。

我更喜欢Jinja的原因之一就是我可以做到这一点:

{{ request.build_absolute_uri(static('img/foo.png')) }}
相关问题