轉載自:https://blog.51cto.com/kalson/1975001
分享是快樂的,助人是幸福的。——好吧,裝逼到此爲止
今天學習django框架跟着網上的教程做網站的時候,碰到一個坑比的現象,本來是跟着網站手敲代碼,結果莫名冒出一個 view must be a callable or a list/tuple in the case of include()的TypeError。我很傷心,以爲又是自己不細心敲錯了,於是直接copy網上的代碼,結果還是這樣。。。跪了。既然不是我敲打的問題,那一定是語法的問題了。然後就網上查找原因,最後找到這篇文章
http://blog.csdn.net/gavinking0110/article/details/53738362
給我帶來啓發(版本問題,寫法不一致)。下面直接看代碼講解了。
from django.conf.urls import url,include
from django.conf import settings
from django.contrib import admin
from DjangoUeditor import urls as DjangoUeditor_urls
from news import views as new_views
urlpatterns = [
# url(r'^$','news.views.index',name='index'),
# url(r'^column/(?p<column_slug>[^/]+)/$','new_views.column_detail',name='column'),
# url(r'^news/(?p<article_slug>[^/]+)/$','new_views.article_detail',name='article'),
url(r'^$', new_views.index, name='index'),
url(r'^column/(?P<column_slug>[^/]+)/$', new_views.column_detail, name='column'),
url(r'^news/(?P<article_slug>[^/]+)/$', new_views.article_detail, name='article'),
url(r'^admin/',admin.site.urls),
url(r'ueditor/',include(DjangoUeditor_urls)),
]
註釋掉的部分是我自己根據網站寫的內容,下面部分是我修改後的內容。根據上篇博文的介紹,應該就是Django框架版本升級的原因了。
url的源碼如下
def url(regex, view, kwargs=None, name=None):
if isinstance(view, (list, tuple)):
# For include(...) processing.
urlconf_module, app_name, namespace = view
return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace)
elif callable(view):
return RegexURLPattern(regex, view, kwargs, name)
else:
raise TypeError('view must be a callable or a list/tuple in the case of include().')
根據源碼可知,針對view這個參數,它並沒有做任何格式的處理,因此我們寫的
'new_views.column_detail'
就是一個字符串,顯然字符串並不是list也不是tuple(這個很好驗證)。
abc='abc'
if isinstance(abc, (list, tuple)):
print 'True'
else:
print 'False'
結果:False
也許你會想,後面還有callable這個可以執行呢,我們看源碼:
def callable(p_object): # real signature unknown; restored from __doc__
"""
callable(object) -> bool
Return whether the object is callable (i.e., some kind of function).
Note that classes are callable, as are instances with a __call__() method.
"""
return False
哈哈哈,很不幸,你的想法又錯了,源碼顯示,不管你輸入什麼,這裏都是執行return False。所以在這裏,elseif那句就是廢話。
那這樣就只能證明
new_views.article_detail
正確寫法是一個list或者tuple了(這個我驗證過後再寫驗證方法)。——更新:request.GET 類似於一個字典,更好的辦法是用 request.GET.get('a', 0) 當沒有傳遞 a 的時候默認 a 爲 0。這個是網上教程提供出來的,所以目前是可以理解了。針對這種帶有前端視圖的,目前我的知識還不知道如何去驗證。
溫馨提示:再使用django的時候,再開啓server後,默認我們修改內容後會自動刷新,奇怪的是針對這個問題,修改後需要我們停止重新再啓動纔可以。默認出現這個錯誤之後即使修改正確了也不會刷新(這個有點坑爹啊,我還一直ctrl+s等他刷新呢)。
我的django版本如下:
django.VERSION
(1, 11, 6, u'final', 0)