Django获取静态文件的绝对URL

问题描述 投票:7回答:5

在Django中,我使用时:

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

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

如何删除双斜线?

STATIC URL是:

STATIC_URL = '/static/'

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

python django
5个回答
12
投票

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

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

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


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。


2
投票

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

最后的例子看起来像这样:

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

-2
投票

不完全确定你在问什么,但由于{%static ..%}只是在你指定的路径前面添加/ static /,你可以自己做:

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

不是非常模块化,但是大多数时候你不需要直接访问完整的url,因为如果你把它作为某个html对象的src用它,它会将它附加到你所在的url上。


-4
投票

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

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

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

{{ request.build_absolute_uri(static('img/foo.png')) }}
© www.soinside.com 2019 - 2024. All rights reserved.