如何在Django中获取完整/绝对URL(带域)?
如何获取完整/绝对URL(例如如何在Django中获取完整/绝对URL(带域)?,django,Django,如何获取完整/绝对URL(例如https://example.com/some/path)在Django?那太傻了。。。我不需要查询我的数据库来拦截URL 我想将它与reverse()一起使用,检查Request.META字典。我认为它有服务器名和服务器端口。根据请求使用简便的方法,将相对url传递给它,它将为您提供完整的url 默认情况下,将返回请求.get_full_path()的绝对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]