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

我想使用reverse()。


当前回答

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]

其他回答

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]

如果你使用的是django REST框架,你可以使用rest_framework.reverse中的反向函数。这与django.core.urlresolvers的行为相同。相反,除了它使用一个请求参数来构建一个完整的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框架中的可用性

你可以传递request reverse('view-name', request=request)或者用build_absolute_uri将reverse()包含进来request.build_absolute_uri(reverse('view-name'))

还有ABSOLUTE_URL_OVERRIDES可用作为设置

https://docs.djangoproject.com/en/2.1/ref/settings/#absolute-url-overrides

但这将覆盖get_absolute_url(),这可能是不可取的。

我认为更好的解决方案是把它放在models.py中,而不是仅仅为此安装sites框架,或者做一些这里提到的依赖于request对象的其他事情

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

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

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

检查请求。META字典。我认为它有服务器名和服务器端口。