Python Django urls.py 文件的这个 urlpatterns 列表中发生了啥?

Posted

技术标签:

【中文标题】Python Django urls.py 文件的这个 urlpatterns 列表中发生了啥?【英文标题】:What is happening in this urlpatterns list of Python Django urls.py file?Python Django urls.py 文件的这个 urlpatterns 列表中发生了什么? 【发布时间】:2017-02-02 10:07:52 【问题描述】:

我有三个版本的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'

所以...实际上问题是关于 Version 2. - 为什么要修复 Version 3. 错误?错误是什么?

这里到底发生了什么?

【问题讨论】:

【参考方案1】:

我不知道你为什么感到惊讶;你删除了一个参数,结果出了问题。 (当您运行服务器时,您的第一个版本很可能已经“工作”了,但我怀疑您是否真的可以访问该 URL。)

您使用的是旧版本的 Django。在这个版本中,urlpatterns 必须用patterns 函数的结果来定义。该函数的第一个参数是应用于所有视图字符串的前缀。你的前缀是空的,但这并不意味着你可以删除它;您的第一个 URL 现在被用作前缀参数。

在最近的版本中,人们认识到这个前缀很容易混淆并且很少使用。结果patterns函数被去掉了,没有前缀了; urlpatterns 的值现在必须是一个简单的列表。此外,url 中的视图必须是可调用的,而不是字符串。

【讨论】:

感谢您的回答。所以理论上版本 1 应该提高 TypeError 以防止误报 - 第一个 prefix 参数必须是 string 对象。你同意吗?我认为这就是这里混乱的原因。 可能,是的。然而,由于这种语法现在已从 Django 中完全删除,因此无处进行更改。

以上是关于Python Django urls.py 文件的这个 urlpatterns 列表中发生了啥?的主要内容,如果未能解决你的问题,请参考以下文章

4.对urls.py的解释

Django的urls(路由)

如果条件在urls.py - django

python下django框架项目生成的文件解释

python+django 更改了urls.py 之后runserver报错的解决办法

Python - 第一个 Django 项目