幾乎所有公司項目都是python2的, xadmin對Python2 很友好,對Python3 很不友好, 所以在Python3 環境下使用xadmin遇到了許多意想不到的坑,在這里記錄並分享一下:
第一個:Python版本差異引起的坑
報錯 reload() 沒有被定義
原因是Python3中reload()函數被封裝進了imp / importlib 庫里, 凡是通過pip install xadmin 方式安裝的xadmin源代碼都沒有處理這一塊,最后在xadmin 的github頁面上找到了這個未更新的版本,沒辦法只好將源碼下下來,放在項目里,更奇特的是, pip下載的版本是0.6.1, github上的版本是0.6.0, 新版本居然把上一個版本的修復又給遺漏了!!!!我懷疑是作者處理代碼的時候把這一小點給忘了.
如圖,是處理了該Python版本差異的代碼,如果你也遇到了這個問題,打開對應的源碼,會發現你的代碼是這樣的:
一眼就看出差別了吧,作者的意圖是為了處理Python2的編碼問題,新的代碼在Python2環境下會設置環境默認編碼,Python3環境就不作處理了.
解決方式也很粗暴,guthub上克隆一個xadmin 項目, 把 xadmin 文件夾放進你的項目的app目錄里,比如我的位置是:
隨后的常規流程就是把根目錄的路由文件的xadmin的引用位置和settings文件都改成 apps.xadmin就好了.
正常到這里的話,你的項目還是不能正常使用 ! ! !
第二個問題: TemplateSyntaxError at /xadmin/ ‘crispy_forms_tags’ is not a registered tag library
出錯位置很多,舉一個例子, 在 xadmin/templates/xadmin/views/login.html 中,會看到一處報錯位置:
原因是環境中找不到該模塊, 需要在settings中注冊該模塊:
第三個問題: bootstrap3/errors.html 提示找不到這個文件
這是在登錄頁面時遇到的,代碼如下:
我看了xadmin的其他幾個版本,都沒有這個文件,但是好像我們公司python2的xadmin沒有報這個錯誤,而且找了下Python2項目的代碼,確實么有這個文件,為啥不報錯,暫時還不清楚.這個文件是用來處理一些錯誤信息的.
注掉就好了,帶來的問題是,登錄xadmin后台時如果密碼錯誤,那么就不會出現紅色的報錯信息,就是密碼錯誤這種.
第四個問題: formtools , 報錯 No module named 'django.contrib.formtools'
出錯位置如下:
其實出錯的位置也不是這里,是在另一個地方,下面會貼圖.
出錯原因也挺坑的,是xadmin作者給的坑.
如圖,guthub上給的依賴包里面 django-formtools 的版本是1.0.
但是問題就出在這個版本上,下面是代碼:出錯的位置還比較婉轉,但從報錯信息上看不出什么問題,debug一下就能找到問題:
如上圖,隨箭頭指示, 代碼執行順序如下:
1 xadmin/plugins/wizard.py 2 3 from formtools.wizard.storage import get_storage 4 5 formtools/wizard/storage/__init__.py 6 7 from .base import BaseStorage 8 9 formtools/wizard/storage/base.py 10 11 rom django.core.files.uploadedfile import UploadedFile 12 from django.utils.datastructures import MultiValueDict 13 from django.utils.functional import lazy_property <============ ! ! ! ! 14 from django.utils import six 15 16 from .exceptions import NoFileStorageConfigured 17 18 19 class BaseStorage(object): 20 ...
問題就在 from django.utils.functional import lazy_property 的位置
舊版本的django 在這個包 django.utils.functional 里面是有lazy_property 的, 但是 django1.11新版本是沒有這個類的, 所以這就會導致上面的錯誤
解決辦法就是安裝新版本 django-formtools
在新版本django-formtools中,相關代碼變成了這樣:
如上圖: from django.utils.functional import lazy_property 這句就不存在了, 也就不會報錯了.
遇到的最后一個問題是個特別低級的問題,就是xadmin的圖表插件的問題, 老項目里面都沒用過圖表,所以第一次用也不知道咋用,網上搜了下,被友好的網友無意間坑了一下.
如果你的圖表不顯示的話,檢查下你的代碼,
Model OptionClass 里面的圖表配置關鍵字是 data_charts, 我給寫成 data_chats 了, 少了個r (這種問題最頭疼,因為你很難看出問題)
目前為止在python3 + django1.11 + xadmin 中遇到的問題都在上面了,希望能幫到同樣遇到坑的伙計們.