Django 2.0中blog应用sitemap.xml访问404问题咨询
嘿,我来帮你揪出这个站点地图访问404的问题!虽然你说已经配置了匹配的URL,但还是有几个容易踩的坑,咱们一个个排查:
先盯紧文件名拼写!
你自己提到写的是sitempas.py,但正确的文件名应该是sitemaps.py啊!Django会严格按照这个名字导入你的站点地图配置,如果文件名错了,根urls.py里的from blog.sitemaps import ...就会失败——要么服务器启动直接报错,要么虽然URL条目存在,但视图找不到正确的配置,最终导致访问404。先把文件名改对,这个是最容易忽略的低级错误!检查Settings.py的必备配置
- 确认
django.contrib.sitemaps和django.contrib.sites都在INSTALLED_APPS里,这两个是sitemap功能的核心依赖,没加的话根本跑不起来。 - 一定要在settings里设置
SITE_ID = 1,sites框架需要这个参数关联站点信息,缺失的话sitemap视图会直接罢工。
- 确认
核对根urls.py的配置细节
你说有匹配的URL条目,但要确认写法完全正确:from django.contrib.sitemaps.views import sitemap # 这里要确保导入的是正确的sitemaps.py里的类,文件名对了才能导进来 from blog.sitemaps import BlogSitemap sitemaps = { 'blog': BlogSitemap, } urlpatterns = [ # ... 其他URL放前面 path('sitemap.xml/', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'), ]注意这几个细节:
- 视图必须是
django.contrib.sitemaps.views.sitemap,不能写错。 - 必须把
sitemaps字典作为参数传递给视图,不然视图不知道用哪个站点地图配置。 - 检查URL路径和你访问的是否完全一致:你访问的是
http://127.0.0.1:8000/sitemap.xml/(带末尾斜杠),如果urls里写的是sitemap.xml(不带斜杠),虽然Django默认APPEND_SLASH=True会重定向,但如果有其他问题叠加,可能还是会返回404,建议保持路径完全一致。
- 视图必须是
URL顺序是不是搞反了?
你说这是第8个URL条目,那要看看前面的URL有没有优先匹配到sitemap.xml/的情况!比如如果前面有类似path('<str:slug>/', views.post_detail)这样的通用路径,Django会按顺序匹配URL,sitemap.xml会被当成slug参数传到那个视图里,而不是走到后面的sitemap视图,这时候就会因为找不到对应的slug内容返回404。解决方法是把sitemap的URL放在更靠前的位置,或者调整前面的通用URL匹配规则,避免冲突。别忘了重启开发服务器!
修改了urls.py、settings.py或者sitemaps.py之后,一定要重启Django的runserver,不然旧的配置还在生效,你的修改根本没被加载,自然还是访问不到。最后检查blog/sitemaps.py的类定义
确保你的站点地图类正确继承了Sitemap,比如:from django.contrib.sitemaps import Sitemap from .models import Post class BlogSitemap(Sitemap): changefreq = 'weekly' priority = 0.9 def items(self): return Post.objects.all() def lastmod(self, obj): return obj.pub_date # 这里要对应你模型里的日期字段如果类继承错了,或者
items方法返回空、字段名写错,可能导致视图生成sitemap失败,这种情况更多是返回500错误,但也可以顺手排查一下。
按照这个顺序排查,应该能快速找到问题所在!
内容的提问来源于stack exchange,提问作者juanli

