关于django url 为啥会被覆盖?

Posted

技术标签:

【中文标题】关于django url 为啥会被覆盖?【英文标题】:About django url why will be overwrite?关于django url 为什么会被覆盖? 【发布时间】:2015-06-25 06:54:54 【问题描述】:

这是我的文件树

____mysite
 |____db.sqlite3
 |____dealwith_Time
 | |______init__.py
 | |______init__.pyc
 | |____admin.py
 | |____admin.pyc
 | |____migrations
 | | |______init__.py
 | | |______init__.pyc
 | |____models.py
 | |____models.pyc
 | |____tests.py
 | |____urls.py
 | |____urls.pyc
 | |____views.py
 | |____views.pyc
 |____manage.py
 |____mysite
 | |______init__.py
 | |______init__.pyc
 | |____settings.py
 | |____settings.pyc
 | |____urls.py
 | |____urls.pyc
 | |____wsgi.py
 | |____wsgi.pyc

关于根 urls.py 文件的内容

url(r'^dealwith_Time/$',include('dealwith_Time.urls')),
url(r'^dealwith_Time/12$',include('dealwith_Time.urls')),

和处理_Time的网址是

url(r'^$', 'dealwith_Time.views.current_datetime'),
url(r'^/12$', 'dealwith_Time.views.hour_ahead'),

并展示我对_Time 的看法

def current_datetime(request):
  now = datetime.datetime.now()
  html = "<html><body> It is now %s.</body></html>" %now
  return HttpResponse(html)

def hour_ahead(request):
  return HttpResponse("victory")

问题是当我访问localhost:8000/dealwith_time 时它起作用了。并且响应时间。但是当我访问localhost:8000/dealwith_time/12 时,它仍然响应时间!并使用视图的current_time 函数而不是使用hour_ahead 函数和打印"victory".....为什么我这么困惑请帮助我..

【问题讨论】:

【参考方案1】:

rooturls.py 中的网址末尾有$ 符号。这意味着 url 必须完全匹配(不仅仅是开始)。因此,在您的示例中,url 匹配 rooturls.py 中的第二个条目,并将空字符串传递给 with_Timeurls.py,因此它将匹配第一个条目和显示时间。

如果您包含其他 urls 文件,您通常希望使用不带 $ 的正则表达式,因此它将匹配 url 的开头,其余将传递给包含的 urls 文件。

要更正您的示例,请将此用于rooturls.py

url(r'^dealwith_Time/',include('dealwith_Time.urls')),

请注意,我已删除 $,因此 /dealwith_time/12/dealwith_time/ 将被匹配,12 在第一种情况下将被传递到下一个级别。

并将其用于with_Timeurls.py

url(r'^$', 'dealwith_Time.views.current_datetime'),
url(r'^12$', 'dealwith_Time.views.hour_ahead'),

请注意,我已在第二行中删除了 /,因为它将在 root 的 urls.py 中被删除。

【讨论】:

好的。我知道。就像 root 的 urls.py 必须匹配我在 deal_time 的 urls.py 中的两行代码。如果第一行可以完全匹配和匹配并且传递空字符串所以我只看到时间?【参考方案2】:

你必须改变

url(r'^dealwith_Time/$',include('dealwith_Time.urls')),

url(r'^dealwith_Time/',include('dealwith_Time.urls')),

$ 符号会覆盖dealwith_Time/12 并会覆盖正斜杠符号之后的任何内容。

看看Regular Expressions。

【讨论】:

以上是关于关于django url 为啥会被覆盖?的主要内容,如果未能解决你的问题,请参考以下文章

为啥logged_out.html在django注册中没有覆盖?

为啥 plist 中的项目会被覆盖?

为啥 a:hover 在 CSS 中会被覆盖?

django网页系统,为啥我跳转网页时总会打开一个新的网页,而不是覆盖原来的网页?

为啥使用 DT_MODIFYSTRING 选项将副本传递给 DrawText 函数时,原始 CString 会被覆盖?

为啥 PyTest 覆盖率报告中缺少我项目的大部分 Django 文件?