django报错ImproperlyConfigured("To use sitemaps, either enable the sites framework or pass ""a Site/RequestSite object in your view.")怎么办
报错的原因
这是 Django 中 Sitemap 框架的错误消息。它表示您尝试使用 Sitemap 框架,但没有正确配置网站框架。
在使用Sitemaps框架之前需要先开启Django的sites framework, 您可以在settings.py中增加‘django.contrib.sites’
或者在使用sitemap的地方,把网站的实例传入sitemap的类中。
from django.contrib.sites.shortcuts import get_current_site
class MySitemap(Sitemap):
def __init__(self, site=None):
self.site = site or get_current_site(None)
sitemaps = {
'mysite': MySitemap(),
}
urlpatterns = [
...
url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
...
]
这样就可以避免这个错误了。
还有其它一种方法就是需要在使用sitemap的地方给定RequestSite/Site实例
def my_view(request):
current_site = get_current_site(request)
mysitemap = MySitemap(site=current_site)
#使用sitemap
return render(...)
指定site 实例, 这样就能够正确使用sitemap了。
总之就是缺少 site 的实例导致的错误, 有两种方法来解决,要么是使用sites framework 来配置sites,要么是在使用sitemap的地方提供 site 实例。
如何解决
你需要在使用Sitemap框架之前,先配置sites framework或者在使用Sitemap时传入site实例。
- 在settings.py中添加 'django.contrib.sites'
- 在使用Sitemap的地方传入site实例, 如
current_site = get_current_site(request)
mysitemap = MySitemap(site=current_site)
或者
mysitemap = MySitemap(site=get_current_site(None))
也可以在创建sitemaps字典中传入site实例
sitemaps = {
'mysite': MySitemap(site=get_current_site(None)),
}
这样就可以解决这个错误了。
请注意,使用sites framework时还需要在管理后台添加网站记录,并将其默认站点设置为当前站点。这样,在视图中使用 get_current_site(request) 将返回正确的站点。
更多关于使用Django sites framework的细节可以参考官方文档。
使用例子
这是一个在 views.py 中使用 Sitemap 时传入 site 实例的示例:
from django.contrib.sites.shortcuts import get_current_site
def my_view(request):
current_site = get_current_site(request)
mysitemap = MySitemap(site=current_site)
# 使用 mysitemap
return render(...)
这是在urls.py中使用sitemaps并传入site实例的示例:
sitemaps = {
'mysite': MySitemap(site=get_current_site(None)),
}
urlpatterns = [
...
url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
...
]
这样就可以避免 ImproperlyConfigured 错误了。