我怎么能得到完整/绝对的URL(例如https://example.com/some/path)在Django没有网站模块?这太愚蠢了……我不需要查询我的数据库来抓取URL!

我想使用reverse()。


当前回答

<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>

例如,在这里,我说加载表单,并告诉表单,下一个URL是当前的URL,这段代码呈现

其他回答

在做一个项目的时候,我学会了在Django中获取完整/绝对的URL。

如果你的URL在地址栏中是这样的:

https://stackoverflow.com/questions/2345708

如果你想把上面的URL显示给你的模板。

{{请求。不带GET参数。 {{请求。get_full_path}} #带有GET参数

对于上面的两个代码,这将打印在你的模板中

questions/2345708

另一种获取完整URL的方法是:

{{request.build_absolute_uri}}

这将打印在你的模板将是:

https://stackoverflow.com/questions/2345708

你也可以使用get_current_site作为sites应用程序的一部分(from django.contrib.sites.models import get_current_site)。它接受一个请求对象,如果request为None,则默认为您在settings.py中使用SITE_ID配置的站点对象。阅读更多使用站点框架的文档

e.g.

from django.contrib.sites.shortcuts import get_current_site
request = None
full_url = ''.join(['http://', get_current_site(request).domain, obj.get_absolute_url()])

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

在你看来,只需这样做:

base_url =  "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)
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]

正如在其他答案中提到的,request.build_absolute_uri()是完美的,如果你可以访问request,而sites框架是伟大的,只要不同的url指向不同的数据库。

然而,我的用例略有不同。我的登台服务器和生产服务器访问相同的数据库,但是get_current_site都返回数据库中的第一个站点。要解决这个问题,必须使用某种环境变量。你可以使用1)一个环境变量(类似os.environ。get('SITE_URL', 'localhost:8000'))或2)不同的site_id为不同的服务器和不同的设置。

希望有人会觉得这有用!