• 开发中遇到的问题记录


    在用python做前后端分离的项目开发的时候,遇到了下面问题,解决也花了一定的时间,特此记录下。若各位大神有好的解决方案,还望不吝赐教!

    1、在开发中继承了DjangoUeditor,但是我们通过富文本插入图片保存到数据库的确实是相对路径,返回给前端后,图片加载失败,原因是,ueditor在保存文件到数据库的时候,保存的是相对路径

     源码在ueditor中view.py文件中的 UploadFile 函数中,mediaUrl为相对于我们设置的MEDIA_URL的相对路径,要返回给前端绝对路径,需要调用request的build_absolute_uri(mediaUrl)方法将相对路径改为绝对路径

     最简单的改法是直接在mediaUrl后面加上 abs_url = request.build_absolute_uri(mediaUrl)

     但是大家都知道,不到万不得已的时候,我们是不提倡修改插件的源码的,因为后期维护起来比较麻烦。

      

     所以我们可以重写DjangoUeditor.views中的UploadFile方法,并用我们自己写的方法来代替DjangoUeditor的UploadFile方法

     1)新建一个文件 ueditor_uploadfile.py

     2)文件内容就是我们上面说的DjangoUeditor.views中的UploadFile函数,并在mediaUrl下面加上我们要返回的绝对路径

        

      3)替代DjangoUeditor原本的UploadFile函数

        前文中我们有讲过如何在xadmin中集成ueditor(xadmin.plugins.ueditor.py),在集成ueditor的同时,更新

        DjangoUeditor.views.UploadFile = UploadFile

    附上request.build_absolute_uri的源码:

    2、在富文本区域插入html代码,返回前端时是经过转译的纯文本信息

      

      【解决方案】

        为了安全将html标签做了转译成了文本信息,保存到数据库,所以在读取的时候,我们需要做反转译,这里用到了restframework API,定义serializer时,继承了restframework的serializer中的ModelSerializer

        去追溯源码,发现ModelSerializer继承了Serializer,里面有个方法 to_representation 就是用来将对象实例转化为字典的,所以我们只需要在转换的时候,对html 标签进行反转译即可。

        所以我们可以在modelSerializer中重写to_representation 方法

          

     3、在直接运行python文件是,常常 会报如下错误:

      django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

      解决方案:在文件开头,加入下面内容

      import os, django

      os.environ.setdefault("DJANGO_SETTINGS_MODULE", "projectName.settings")

      django.setup()

     4、在serializer中通过serializer.SerializerMethodField()自定义返回值时,返回的图片url也是相对路径,需要在ModelSerializer中加上context上下文将上下文中的request作为request参数传递给serializer

    class CategorySerializer(serializers.ModelSerializer):
        brands = BrandSerializer(many=True)
        goods = serializers.SerializerMethodField()
    
        # 自定义获取goods(serializerMethodField()),通过get_name方式自定义
        def get_goods(self, obj):
            # 当前目录可能是一级目录 二级目录或者三级目录,需要分别去查询它对应的商品
            all_goods = Goods.objects.filter(Q(category_id=obj.id) | Q(category__parent_category_id=obj.id) | Q(category__parent_category__parent_category_id=obj.id))
            # 通过serializerMethord去自定义查询到的image是相对路径,需要我们手动传入我们的request参数
            goods_serializer = GoodSerializer(all_goods, many=True, context={"request":self.context["request"]})
            return goods_serializer.data
  • 相关阅读:
    【机器学习笔记】EM算法及其应用
    【机器学习笔记】循环神经网络RNN
    【caffe范例详解】
    Caffe on Windows (Visual Studio 2015+CUDA8.0+cuDNNv5)
    【Keras案例学习】 CNN做手写字符分类(mnist_cnn )
    Celery分布式文件队列
    通过nginx+lua或openresty实现web站点的waf功能
    使用docker hub获取kubernetes各个组件的镜像
    使用Ansible快速构建kubernetes1.10.4HA高可用集群
    创建私服maven服务
  • 原文地址:https://www.cnblogs.com/fiona-zhong/p/9651107.html
Copyright © 2020-2023  润新知