zoukankan      html  css  js  c++  java
  • 开发中遇到的问题记录

    在用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
  • 相关阅读:
    JS事件冒泡、事件捕获和事件委托
    实现英文字母排序
    JavaScript异步加载的四种方法
    JavaScript作用域与作用域链
    JavaScript 自定义属性 data-*
    asycn和await
    style collectd
    JavaScript如何比较两个数组的内容是否相同
    VScode插件开发--M2D文档转换插件
    BOM笔记
  • 原文地址:https://www.cnblogs.com/fiona-zhong/p/9651107.html
Copyright © 2011-2022 走看看