Python v2搭配Django v1.6启动服务器时patterns导入失败求助
解决Django里的
ImportError: cannot import name patterns和NameError: name 'patterns' is not defined问题 嘿,我来帮你捋清楚这个问题!你提到用的是Python 2和Django 1.6,但遇到了这两个导入相关的错误,咱们一步步来排查解决:
先搞清楚核心原因
首先,Django 1.6本身是支持patterns函数的,它就在django.conf.urls模块里。所以你遇到的错误大概率不是写法本身的问题,要么是环境出了问题,要么是你误装了更高版本的Django。
第一步:确认你的Django版本
先跑个命令确认一下你实际用的Django版本是不是真的1.6:
python -c "import django; print(django.get_version())"
如果输出的是1.10或者更高版本,那问题就找到了——从Django 1.10开始,patterns函数被彻底移除了,所以不管你怎么导入都找不到它。
情况1:确实是Django 1.6
如果版本确实是1.6,那你最开始的代码写法是对的:
from django.conf.urls import patterns, include, url urlpatterns = patterns('', url(r'^payment/', include('payment.urls', namespace='payment', app_name='payment')), )
那出现导入错误可能是下面两个原因:
- 你的项目里有重名文件:比如项目根目录下有个叫
django.py或者urls.py的文件,和Django的内置模块冲突了,导致导入路径出错,把这类文件重命名就行。 - 虚拟环境出问题:如果用了虚拟环境,试试重新激活或者重新安装Django 1.6:
pip install django==1.6
情况2:实际是Django 1.10+(误装高版本)
如果发现版本高于1.6,那直接放弃patterns函数就行,Django从1.10开始支持直接用列表定义urlpatterns:
from django.conf.urls import include, url urlpatterns = [ url(r'^payment/', include('payment.urls', namespace='payment', app_name='payment')), ]
要是你用的是Django 3.1及以上版本,还可以用re_path替代url(功能完全一样),或者用更简洁的path(适合非正则的路径),不过如果是从旧版本过渡,先保持url的写法也没问题。
为啥from django.conf.urls import *也报错?
如果你的Django版本已经高于1.6,那django.conf.urls里根本就没有patterns这个东西了,所以不管你是精确导入还是通配符导入,都找不到它,自然会报NameError。
内容的提问来源于stack exchange,提问作者Meng Shi
相关产品推荐
相关产品推荐

