【问题标题】:Zero fill numbers in Djangos URLconfDjango URLconf 中的零填充数字
【发布时间】:2011-05-23 14:11:42
【问题描述】:

documentation of Django 中是文章 URL 的示例模式:

(r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),

因此,只有 2011/05/23/ 会匹配,但不会匹配 2011/5/23/

在文档的另一部分,permalinks decorator 被解释,模式是

(r'/archive/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/$', archive_view)

以及创建永久链接的代码

@models.permalink
def get_absolute_url(self):
    return ('archive_view', (), {
        'year': self.created.year,
        'month': self.created.month,
        'day': self.created.day})

特别是月份已从\d{2} 更改为\d{1,2},因此2011/05/23/2011/5/23/ 现在将匹配; get_absolute_url 方法将创建第二个链接,不带前导零。

要为第一个正则表达式(\d{2})创建一个永久链接,我可以在方法中写str(self.created.month).zfill(2),但这似乎有点麻烦和多余(如果我更改 URLconf,我将需要更改 @ 987654335@ 方法)给我。

此外,我们现在有多个 url,它们都显示相同的内容(2011/05/03/2011/5/03/2011/05/3/ 等),这可能是个问题,例如对于搜索引擎?至少会导致url不一致。

是否有一种(简单的)方法可以将所有 url 重定向到零填充的那些(2011/5/3/2011/05/03/)并且总是自动构建它们零填充,所以我不需要像 @987654341 这样的方法搞乱@ with str() 和 zfill 可以只传递数字吗?

【问题讨论】:

  • 是的,你会因为 url 指向相同的页面/数据而受到 SEO 的打击,除了告诉你我真的无能为力很抱歉

标签: python regex django url


【解决方案1】:

据我所知,除了您已经在做的方式之外,没有办法让 Django 自动将作为参数传递给 URL 的填充数字归零。

如您所述,您可以放宽正则表达式以不需要零,这会产生重复的内容问题。但是,@Matt 没有考虑到内容实际上必须在两个 URL 上都暴露出来,以便搜索引擎认为它是重复的。很有可能,您网站上的所有 URL 都由 reverse(或 models.permalink 周围的 get_absolute_url 装饰器)或 {% url %} 模板标签组成。因此,所有的 URL 都是相同的格式,即没有零,而且零版本甚至不会被搜索引擎看到。

此外,您可以利用规范标签让搜索引擎知道内容不是重复的,而只能通过多个 URL 获得。

<link rel="canonical" href="http://domain.com/archive/2011/5/3/" />

所以搜索引擎没什么好担心的。

【讨论】:

  • 由于似乎没有其他人知道实现此目的的方法,因此我需要接受这一点并使用可选的零。仍然令人困惑为什么官方文档不一致并在不同的示例中使用不同的正则表达式。
  • 我猜这是一个简单的疏忽。文档的处理与 Django 代码库的其余部分一样。厨房里有很多厨师,所以你最终会在这里和那里有轻微的不一致。如果您认为文档存在问题,您可以为它提交一张票,就像您为 Django 本身中的一个错误一样。
【解决方案2】:

url.py 中删除包含不存在的视图的不必要链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多