Django获取静态文件的绝对URL

cus*_*ice 8 python django

在Django中,我使用时:

{{ request.build_absolute_uri }}{% static "img/myimage.jpg" %}
Run Code Online (Sandbox Code Playgroud)

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

如何删除双斜线?

STATIC URL是:

STATIC_URL = '/static/'
Run Code Online (Sandbox Code Playgroud)

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

knb*_*nbk 13

build_absolute_uri方法为当前页面构建绝对uri.这意味着,如果您使用的是" http://myurl.com/login/ ",则生成的完整网址将为" http://myurl.com/login//static/img/myimage.jpg ".

相反,使用request.get_host()(可选地与request.schemeurl方案一起使用),或者优选地,使用sites框架将模板变量设置为当前站点域.该get_host()方法存在关于代理的一些问题.

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

  • 你能提供完整的例子吗? (5认同)
  • 这是一个带有 `scheme` 和 `get_host` 的例子。`<meta property="og:image" content="{% block og_image %}{{ request.scheme }}://{{ request.get_host }}{% static 'vitrine/images/logo-open-graph. png' %}{% endblock %}" />` 由于 `//`,无法使用 `build_absolute_uri` (2认同)

clw*_*ght 5

我刚刚为此做了一个快速模板标签。创建文件/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)
Run Code Online (Sandbox Code Playgroud)

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

为了回应之前想知道为什么有人需要这样做的评论,我的特定用例是我想将指向静态文件的链接放在开放图协议元标记内,并且这些链接需要是绝对链接。在开发中,静态文件在本地提供,但在生产中,它们是远程提供的,所以我不能只是在主机前面加上完整的 url。


Mar*_*ind 5

request对象在模板中可用,并且您可以轻松访问诸如request.schemerequest.META.HTTP_HOST构造基本URL的属性,这些属性可以放在静态URL之前,以获取完整的URL。

最后的示例如下所示:

<img src="{{request.scheme}}://{{request.META.HTTP_HOST}}{% static 'img/myimage.jpg' %}">
Run Code Online (Sandbox Code Playgroud)


Tyl*_*tee -4

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

{{ request.build_absolute_uri }}static/img/myimage.jpg
Run Code Online (Sandbox Code Playgroud)

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