使用@cached_property时如何修复Django站点地图错误'str'对象无法调用

时间:2019-03-10 12:07:52

标签: django django-sitemaps

我正在尝试将站点地图添加到我的Django网站,但是我遇到了问题, 这是回溯:

Internal Server Error: /sitemap.xml
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)

  File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\contrib\sitemaps\views.py", line 16, in inner
    response = func(request, *args, **kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\contrib\sitemaps\views.py", line 71, in sitemap
    protocol=req_protocol))
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\contrib\sitemaps\__init__.py", line 111, in get_urls
    urls = self._urls(page, protocol, domain)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\contrib\sitemaps\__init__.py", line 120, in _urls
    loc = "%s://%s%s" % (protocol, domain, self.__get('location', item))
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\contrib\sitemaps\__init__.py", line 68, in __get
    return attr(obj)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\contrib\sitemaps\__init__.py", line 75, in location
    return obj.get_absolute_url()
TypeError: 'str' object is not callable

之所以发生这种情况,是因为我在用于站点地图的模型的get_absolute_url()方法上使用了@cached属性。

模型中的方法:

@cached_property
def get_absolute_url(self):
    return reverse('person', args=[self.slug])

在urls.py

sitemaps = {
    'people': GenericSitemap({
        'queryset': Person.objects.all()
    }, priority=0.4, changefreq='weekly'),
}

urlpatterns = [
    path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
]

当我删除cached_property时,它可以正常工作,但是我不想删除装饰器,因为我认为它有助于减少反向URL的计算,没有其他选择吗?

编辑:我从模板中的很多地方调用了此get_absolute_url,并且在很多时候(例如生成人员列表等)来获取它的链接。因此,我开始使用@cached_property对其进行缓存以减少时间。

0 个答案:

没有答案