Python Django urls.py 文件的 urlpatterns 列表中发生了什么?
What is happening in this urlpatterns list of Python Django urls.py file?
我有三个版本的 urls.py
文件。
这里是导入(版本之间共享):
from django.conf.urls.static import static
from django.conf import settings
from django.conf.urls import patterns, url
from main import views
版本 1. 这里一切正常。没问题 运行 python2 manage.py runserver
.
urlpatterns = patterns(
url(r'^bio$', 'views.bio_view'),
)
版本 2。 嗯,不过我还需要更多网址。让我们添加它们。这里也没有问题。
urlpatterns = patterns(
'',
url(r'^$', views.index, name='index'),
url(r'^bio$', 'views.bio_view'),
)
版本 3. 等一下...''
在这里做什么?我其实并不需要它。让我们删除它,好吗?
urlpatterns = patterns(
url(r'^$', views.index, name='index'),
url(r'^bio$', 'views.bio_view'),
)
这是 运行 manage.py
服务器之后的问题:
(省略了一些顶级 django
库调用)
File "/home/konrad/workspace/mydir/myproject/urls.py", line 20, in <module>
url(r'^', include('main.urls')),
File "/usr/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 52, in include
urlconf_module = import_module(urlconf_module)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/home/konrad/workspace/mydir/myproject/urls.py", line 15, in <module>
url(r'^bio$', 'views.bio_view'),
File "/usr/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 91, in patterns
t.add_prefix(prefix)
File "/usr/lib/python2.7/site-packages/django/core/urlresolvers.py", line 232, in add_prefix
self._callback_str = prefix + '.' + self._callback_str
TypeError: unsupported operand type(s) for +: 'RegexURLPattern' and 'unicode'
所以...实际上问题是关于 版本 2. - 为什么要修复 版本 3. 错误?错误是什么?
这里到底发生了什么?
我不知道你为什么感到惊讶;你删除了一个参数,结果出了问题。 (当你 运行 服务器时,你的第一个版本可能有 "worked",但我怀疑你是否真的能到达 URL。)
您使用的是旧版本的 Django。在此版本中,urlpatterns
必须使用 patterns
函数的结果进行定义。该函数的第一个参数是应用于所有视图字符串的前缀。您的前缀是空的,但这并不意味着您可以删除它;您的第一个 URL 现在被用作前缀参数。
在最近的版本中,人们认识到这个前缀很容易混淆并且很少使用。结果,去掉了patterns
函数,没有了前缀; urlpatterns
的值现在必须是一个简单列表。此外,url 中的视图必须是可调用的,而不是字符串。
我有三个版本的 urls.py
文件。
这里是导入(版本之间共享):
from django.conf.urls.static import static
from django.conf import settings
from django.conf.urls import patterns, url
from main import views
版本 1. 这里一切正常。没问题 运行 python2 manage.py runserver
.
urlpatterns = patterns(
url(r'^bio$', 'views.bio_view'),
)
版本 2。 嗯,不过我还需要更多网址。让我们添加它们。这里也没有问题。
urlpatterns = patterns(
'',
url(r'^$', views.index, name='index'),
url(r'^bio$', 'views.bio_view'),
)
版本 3. 等一下...''
在这里做什么?我其实并不需要它。让我们删除它,好吗?
urlpatterns = patterns(
url(r'^$', views.index, name='index'),
url(r'^bio$', 'views.bio_view'),
)
这是 运行 manage.py
服务器之后的问题:
(省略了一些顶级 django
库调用)
File "/home/konrad/workspace/mydir/myproject/urls.py", line 20, in <module>
url(r'^', include('main.urls')),
File "/usr/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 52, in include
urlconf_module = import_module(urlconf_module)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/home/konrad/workspace/mydir/myproject/urls.py", line 15, in <module>
url(r'^bio$', 'views.bio_view'),
File "/usr/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 91, in patterns
t.add_prefix(prefix)
File "/usr/lib/python2.7/site-packages/django/core/urlresolvers.py", line 232, in add_prefix
self._callback_str = prefix + '.' + self._callback_str
TypeError: unsupported operand type(s) for +: 'RegexURLPattern' and 'unicode'
所以...实际上问题是关于 版本 2. - 为什么要修复 版本 3. 错误?错误是什么?
这里到底发生了什么?
我不知道你为什么感到惊讶;你删除了一个参数,结果出了问题。 (当你 运行 服务器时,你的第一个版本可能有 "worked",但我怀疑你是否真的能到达 URL。)
您使用的是旧版本的 Django。在此版本中,urlpatterns
必须使用 patterns
函数的结果进行定义。该函数的第一个参数是应用于所有视图字符串的前缀。您的前缀是空的,但这并不意味着您可以删除它;您的第一个 URL 现在被用作前缀参数。
在最近的版本中,人们认识到这个前缀很容易混淆并且很少使用。结果,去掉了patterns
函数,没有了前缀; urlpatterns
的值现在必须是一个简单列表。此外,url 中的视图必须是可调用的,而不是字符串。