在用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