关于django url为什么会被覆盖?

时间:2015-04-18 10:11:44

标签: django python-2.7 django-urls

IT是我的文件树

____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

关于root 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'),

并显示我的交易with_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函数而不是使用{ {1}}功能和打印hour_ahead .....为什么我这么困惑请帮助我..

2 个答案:

答案 0 :(得分:1)

你必须改变

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

代表

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

$符号会覆盖dealwith_Time/12,并会覆盖在foward斜杠符号后面出现的任何内容。

看看Regular Expressions

答案 1 :(得分:1)

$ root的网址末尾有urls.py个符号。这意味着url必须完全匹配(不仅仅是开始)。因此,在您的示例中,网址与root的{​​{1}}中的第二个条目相匹配,空字符串会传递给urls.py with_Time,因此它会匹配第一次进入和显示时间。

如果您要包含其他网址文件,通常需要使用不带urls.py的正则表达式,那么它将匹配网址的开头,剩余的将传递给包含的网址文件。

要更正您的示例,请将其用于$&#39; root

urls.py

请注意,我已删除url(r'^dealwith_Time/',include('dealwith_Time.urls')), ,因此$/dealwith_time/12将匹配,并且/dealwith_time/在第一种情况下将传递到下一级别。

并将其用于12 with_Time

urls.py

请注意,我已删除第二行中的url(r'^$', 'dealwith_Time.views.current_datetime'), url(r'^12$', 'dealwith_Time.views.hour_ahead'), ,因为它会在根/中删除。