view must be a callable or a list/tuple in the case of include()解決辦法

轉載自: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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章