开发中遇到的问题记录

在用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
原文地址:https://www.cnblogs.com/fiona-zhong/p/9651107.html