• python3 使用 django-xadmin 遇到的许多坑


    几乎所有公司项目都是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 中遇到的问题都在上面了,希望能帮到同样遇到坑的伙计们.

  • 相关阅读:
    Tomcat在Linux下的安装与配置
    Intel S5000VSA(SAS)主板设置RAID 步骤【转】
    eclipse 安装Subversion1.82(SVN)插件
    shell脚本分析nginx日志
    shell脚本抓取网页信息
    shell脚本备份日志
    电力项目十一--js添加浮动框
    电力项目五--主界面分析
    This function has none of DETERMINISTIC, NO SQL
    mysql导入数据失败:mysql max_allowed_packet 设置过小
  • 原文地址:https://www.cnblogs.com/haiton/p/11224987.html
Copyright © 2020-2023  润新知