Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django中获取完整/绝对URL(带域)?_Django - Fatal编程技术网

如何在Django中获取完整/绝对URL(带域)?

如何在Django中获取完整/绝对URL(带域)?,django,Django,如何获取完整/绝对URL(例如https://example.com/some/path)在Django?那太傻了。。。我不需要查询我的数据库来拦截URL 我想将它与reverse()一起使用,检查Request.META字典。我认为它有服务器名和服务器端口。根据请求使用简便的方法,将相对url传递给它,它将为您提供完整的url 默认情况下,将返回请求.get_full_path()的绝对URL,但您可以将相对URL作为第一个参数传递给它,以将其转换为绝对URL。您也可以将其用作站点应用程序的一

如何获取完整/绝对URL(例如
https://example.com/some/path
)在Django?那太傻了。。。我不需要查询我的数据库来拦截URL


我想将它与
reverse()

一起使用,检查
Request.META
字典。我认为它有服务器名和服务器端口。

根据请求使用简便的方法,将相对url传递给它,它将为您提供完整的url

默认情况下,将返回
请求.get_full_path()
的绝对URL,但您可以将相对URL作为第一个参数传递给它,以将其转换为绝对URL。

您也可以将其用作站点应用程序的一部分(
来自django.contrib.sites.models导入get_current_site
)。它接受一个请求对象,如果请求为
None
,则默认为您在settings.py中使用
site\u ID
配置的站点对象。有关详细信息,请参阅文档

e、 g


它不像request.build\u absolute\u url()那样紧凑/整洁,但是当请求对象不可用时,并且您有一个默认的站点url时,它是可用的。

您可以尝试“request.get\u full\u path()”

如果您想将它与
reverse()
一起使用,您可以这样做:
request.build\u absolute\u uri(reverse('view\u name',args=(obj.pk))))

如果您无法访问
请求
,那么您就不能使用
获取当前站点(请求)
。您可以结合使用本机站点框架和
get\u absolute\u url
。在管理中至少设置一个,确保您的模型具有方法,然后:

>>> from django.contrib.sites.models import Site
>>> domain = Site.objects.get_current().domain
>>> obj = MyModel.objects.get(id=3)
>>> path = obj.get_absolute_url()

>>> url = 'http://{domain}{path}'.format(domain=domain, path=path)
>>> print(url)
'http://example.com/mymodel/objects/3/'

如果不想访问数据库,可以通过设置来完成。然后,使用上下文处理器将其添加到每个模板:

# settings.py (Django < 1.9)
...
BASE_URL = 'http://example.com'
TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'myapp.context_processors.extra_context',
)
# settings.py (Django >= 1.9)
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # Additional
                'myapp.context_processors.extra_context',
            ],
        },
    },
]

# myapp/context_processors.py
from django.conf import settings

def extra_context(request):
    return {'base_url': settings.BASE_URL}

# my_template.html
<p>Base url is {{ base_url }}.</p>
#settings.py(Django<1.9)
...
基本URL=http://example.com'
模板\u上下文\u处理器=(
...
“myapp.context\u处理器.extra\u上下文”,
)
#settings.py(Django>=1.9)
模板=[
{
'BACKEND':'django.template.backends.django.DjangoTemplates',
“DIRS”:[],
“应用程序目录”:正确,
“选项”:{
“上下文处理器”:[
“django.template.context_processors.debug”,
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
#附加的
“myapp.context\u处理器.extra\u上下文”,
],
},
},
]
#myapp/context_processors.py
从django.conf导入设置
def额外上下文(请求):
返回{'base\u url':settings.base\u url}
#my_template.html
基本url为{{Base_url}}


要从模板创建指向其他页面的完整链接,可以使用以下方法:

{{ request.META.HTTP_HOST }}{% url 'views.my_view' my_arg %}

request.META.HTTP_HOST提供主机名,url提供相对名称。然后模板引擎将它们连接成一个完整的url。

另一种方式。您可以在
view.py
中使用
build\u absolute\u uri()
,并将其传递给模板

view.py

def index(request):
    baseurl = request.build_absolute_uri()
    return render_to_response('your-template.html', { 'baseurl': baseurl })
你的模板.html

{{ baseurl }}

我知道这是个老问题。但我认为人们仍然经常遇到这种情况

有几个库补充了默认的Django功能。我试过几次。反向引用绝对URL时,我喜欢以下库:

我喜欢的另一个,因为您可以轻松地组合域、协议和路径:

此库允许您简单地在模板中写入所需内容,例如:

{{url_parts.domain}}
request.get\u host()
将为您提供域。

您还可以使用:

import socket
socket.gethostname()
这对我来说很好

我不完全确定它是如何工作的。我认为这是一个较低的级别,将返回您的服务器主机名,这可能与您的用户访问页面时使用的主机名不同

我明白了:

wsgiref.util.request_uri(request.META)

获取包含架构、主机、端口路径和查询的完整uri。

如果您使用的是django REST framework,则可以使用REST\u framework.reverse中的reverse函数。这与django.core.urlResolver.reverse的行为相同,只是它使用请求参数来构建完整的URL

from rest_framework.reverse import reverse

# returns the full url
url = reverse('view_name', args=(obj.pk,), request=request)

# returns only the relative url
url = reverse('view_name', args=(obj.pk,))

编辑为仅在REST框架中提及可用性在您的视图中,只需执行以下操作:

base_url =  "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)

请尝试以下代码:

{{request.scheme}://{{request.META.HTTP_HOST}
django fullurl
如果您想在Django模板中实现这一点,我发布了一个小型PyPI包,让您可以用
fullurl
fullstatic
替换
url
static
模板标记,如下所示:

{% load fullurl %}

Absolute URL is: {% fullurl "foo:bar" %}

Another absolute URL is: {% fullstatic "kitten.jpg" %}
这些徽章有望自动保持最新状态:


在视图中,您当然可以改为使用。

这在我的模板中对我有效:

# settings.py (Django < 1.9)
...
BASE_URL = 'http://example.com'
TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'myapp.context_processors.extra_context',
)
# settings.py (Django >= 1.9)
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # Additional
                'myapp.context_processors.extra_context',
            ],
        },
    },
]

# myapp/context_processors.py
from django.conf import settings

def extra_context(request):
    return {'base_url': settings.BASE_URL}

# my_template.html
<p>Base url is {{ base_url }}.</p>
{{request.scheme}://{{request.META.HTTP_HOST}{%url'equipos:marca_filter%%
我需要完整的url将其传递给js fetch函数。
我希望这对您有所帮助。

也有绝对URL覆盖作为一种设置

但这会覆盖get_absolute_url(),这可能并不可取

我认为更好的解决方案是将其放在models.py中,而不是仅仅为此安装sites framework或执行此处提到的依赖于请求对象的其他一些操作

在settings.py中定义BASE_URL,然后将其导入models.py,并创建一个抽象类(或将其添加到您已经使用的类中),该类定义get_really_absolute_URL()。它可以简单到:

def get_truly_absolute_url(self):
    return BASE_URL + self.get_absolute_url()

子类化它,现在您可以在任何地方使用它。

如其他答案中所述,
请求。构建绝对uri()
是完美的,如果您可以访问
请求
站点
框架非常好,只要不同的URL指向不同的数据库

但是,,
<div class='col-12 col-md-6'>
    <p class='lead'>Login</p>
    {% include 'accounts/snippets/form.html' with form=login_form next_url=request.build_absolute_uri %}
</div>
from django import template
from django.template.defaulttags import URLNode, url

register = template.Library()

class AbsURLNode(URLNode):
    def __init__(self, view_name, args, kwargs, asvar):
        super().__init__(view_name, args, kwargs, asvar)

    def render(self, context):
        url     = super().render(context)
        request = context['request']

        return request.build_absolute_uri(url)


@register.tag
def abs_url(parser, token):

    urlNode = url(parser, token)
    return AbsURLNode( urlNode.view_name, urlNode.args, urlNode.kwargs, urlNode.asvar  )
{% load wherever_your_stored_this_tag_file %}
{% abs_url 'view_name' parameter %}
http://example.com/view_name/parameter/
/view_name/parameter/
class WalletViewSet(mixins.ListModelMixin, GenericViewSet):
    serializer_class = WalletSerializers
    pagination_class = CustomPaginationInvestment

    def get_queryset(self):

        ######################################################
        print(self.request.build_absolute_uri())
        #####################################################

        wallet, created = Wallet.objects.get_or_create(owner=self.request.user)
        return Wallet.objects.filter(id=wallet.id)
http://localhost:8000/v1/wallet
HTTP GET /v1/wallet 200 [0.03, 127.0.0.1:41608]