DRF序列化器自定义返回

今天遇到了问题 前端用的VUE后端用的django

问题:在我用二级视图类在对图片数据进行增加的时候没有出现任何的问题 包括图片在前端展示,但是等到了测试服务器的时候图片却展示不出来,

在这里插入图片描述

类似于以上的这样的吧 只是序列化器返回的时候没有加上端口

在这里插入图片描述

类似于这样没有端口直接指定路径去访问图片。

当然这种的话在自己的开发环境没有任何问题,但是一旦在测试环境用到了nginx+uwsgi的话就出现一个很严重的问题,想要访问这个图片必须加上端口号才可以 - -

解题思路,

既然没有给我加端口号,并且是定义返回的 我能不能修改以下自定义返回的 额外给他加点参数呢、?
返回需要返回本机IP以及本机端口还有图片地址对吧
那么我就修改自定义返回  下面是我视图以及序列化器的代码

在这里插入图片描述
上面是视图

在这里插入图片描述
上面是序列化序列化器

我讲一下视图
def get_queryset(self):
    operator = self.request.query_params.get('operator')

    if operator:
        return QR_code.objects.filter(operato_name=self.request.query_params.get('operator'))
    else:
        return QR_code.objects.all()
我继承这个函数主要是为了返回具体的某个商品,因为我的主要索引用的不是ID
所以我只能以这种查询字符串有没有的方式 来判断 -
其实我也挺笨没有想出什么特别好的主意,你们有兴趣的可以跟我提下,我优化以下代码       
关键点
上面我也说了既然序列化自定义返回的 那么我就重写方法自己返回。
但是自己返回怎么获取到本机IP,端口,图片地址呢?
你仔细想一下 request方法里面是不是有一个META属性! 里面是所有的请求信息  = = 
所以我就用了request方法,但是又来了一个问题,request这个对象怎么传进序列化器里面呢????
我就想到了序列化器的上下文方法,我可以用上下文来传递request方法

具体实现

def list(self, request, *args, **kwargs):
    queryset = self.filter_queryset(self.get_queryset())

    page = self.paginate_queryset(queryset)
    if page is not None:
        serializer = self.get_serializer(page, many=True, context={'request': request})
        return self.get_paginated_response(serializer.data)

    serializer = self.get_serializer(queryset, many=True)
    return Response(serializer.data)

首先我重写以下 这个list方法,其实也就是多谢了三个单词,四个双引号,一个冒号 哈哈哈 context={'request': request}
就这样 我就把request的方法穿进去了
至于不这么传进去 有没有更好的办法从序列化器里面拿 我还真没仔细看过源代码 你们可以跟我提一下意见
那么reuquest穿进去了 序列化器该怎么办呢
重写序列化器的返回字段
  def to_representation(self, instance):
    reques = self.context.get("request", 1)
    HTTP_HOST = reques.META.get("HTTP_HOST")
    res = super().to_representation(instance=instance)
    res["operato_name"] = instance.operato_name
    res["image"] = "%s%s%s"%('http://',HTTP_HOST,instance.image.url)
    res["remark"] = instance.remark
    return res
其中 instance是模型字段  因为我吧request传进来了 我从上下文取到,然后通过META方法取到IP以及端口了 
觉得完全没有问题之后我就又提交测试
然而想法挺好,结果却不尽人意,测试服务器用的是uwsgi去代理的,还是用的socket 好像是拿不到端口号 - - 这可咋整 ? 这没法玩啊

后来运维救了我一命 他说nginx可以向后端传递端口号 瞬间我就解放了 这么写是丝毫没有任何问题的

nginx代码

upstream f5{
 server 127.0.0.1:18000;
}
server {
listen 8000;
#server_name v.tianchao.pro;
location / {
    proxy_pass http://f5;
    index index.html index.htm;
    proxy_set_header Host $host:8000;
    #proxy_set_header Host $host;
    proxy_set_header X-FORWARD-FOR $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Real-IP $remote_addr;
}

location /static{
    alias /home/lizer/iwant/f5/static;
    #alias /home/lujf/dist;
}

location /media {
    alias /home/lizer/iwant/f5/f5_device_management/uploads;
}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值