我有标准的django 1.4网址模式:
urlpatterns = patterns('',
url('^',include('events.urls')),
url(r'^$', home, {'template_name':'index.html','mod':None}, name='home'),
url(r'^contact$',contact, {'template_name':'index.html',
'mod':'contacto'},name='contact'),
url('^task/(?P<task_id>[\w+-]+)',celery_tasks,name='tasks'),
)
我想构建我的sitemap.xml,遗漏了一些网址,例如/ task url不应该出现(对于网络蜘蛛来说没有任何意义)。 我的策略是将所有url模式传递给我的Sitemap类,比如
from sitemaps import EventsSitemap, StaticSitemap
sitemaps = {
'Events': CandidateSiteMap,
'static': StaticSitemap(urlpatterns),
}
正如你所看到的那样,我将模式传递给了班级,所以我可以稍后过滤这样的网址
class StaticSitemap(Sitemap):
def __init__(self, patterns):
self.patterns = patterns
self._items = {}
self._initialize()
def _initialize(self):
do_not_show = ['tasks']
for p in self.patterns:
# no dynamic urls in this class (we handle those separately)
if not p.regex.groups:
if getattr(p,'name',False) and p.name not in do_not_show:
self._items[p.name] = self._get_modification_date(p)
所以我保留了这个do_not_show网址列表,这就是我如何过滤网址,到目前为止一直很好,问题在于包含的网址如:
url('^',include('events.urls')),
我不能只是迭代self.patterns并获取包含的网址,我必须先扩展它们,这就是我的问题,我该怎么做? 我如何获得一个详细的网址列表,好像没有包含的网址,所有这些都在一个网址模块上。
我们非常感谢您在sitemaps.xml中过滤掉网址的任何建议。
答案 0 :(得分:1)
好的,我必须回答我自己的问题,因为我解决了它,我所做的是一个小功能来扩展这样的模式
def expand_patterns(patterns):
new_patterns = []
def recursive_expand(patterns):
for p in patterns:
if getattr(p,'url_patterns',False):
recursive_expand(p.url_patterns)
else:
new_patterns.append(p)
recursive_expand(patterns)
return new_patterns
这会将urlpatterns变为单个列表。 所以现在我可以使用self.patterns过滤掉我的Sitemap类中的任何内容:)