惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
Microsoft Azure Blog
Microsoft Azure Blog
Engineering at Meta
Engineering at Meta
博客园 - 【当耐特】
人人都是产品经理
人人都是产品经理
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
Blog — PlanetScale
Blog — PlanetScale
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
Jina AI
Jina AI
小众软件
小众软件
博客园 - 叶小钗
MongoDB | Blog
MongoDB | Blog
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
Y
Y Combinator Blog
云风的 BLOG
云风的 BLOG
I
InfoQ
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Martin Fowler
Martin Fowler
P
Proofpoint News Feed
MyScale Blog
MyScale Blog

Django

请教下 哪款 vscode 插件可以通过点击跳转 urls 定义 Django 一文告诉你 all 懒加载的机制 大家学习编程做项目的时候一开始会容易卡壳吗?比如我今天一个下午才弄出来了博客当中的文章评论加回复功能,有时候会因为一个小点卡壳,稍微复杂点的逻辑就感觉脑子不够用,甚至是给 html 的 div 取变量名的时候脑子也会不够 请教在 ubuntu23 中如何 让 Django runserver 开机自启动 请教 Django runserver 开机自启动的问题 不知道开发的流媒体合租平台有没有意义… 公司自主招聘(远程)后端 Go 开发,想要远程岗位抓紧啦 [求助] Mediacms 接入 Keycloak 有没有好的 drf 项目可以学习下的? django 快速开发明明 drf 更好,为啥还是很多人更推荐 fast.api 和忍者 django 的同步机制有性能瓶颈为什么还是有很多人用? 大家怎么处理开发时 Migration 一大堆,修修改改啰啰嗦嗦,同步到生产之前还得检查合并下这个问题的? Django 模型自定义 Manager 自定义 filter 如何支持链式调用? python3 manage.py build_index 这条 Django 命令到底啥意思啊?官方文档找不到说明,谢谢 前后端分离项目, Django 良好的项目结构是怎么样的 Django get_max_test_processes Django makemigrations 生成的 migrations 文件,如何放在代码当前目录的文件夹中? 请教下大家,Django 的 tests 测试模块,如何不创建新从测试数据库,而是直接操作生产环境数据库谢谢! django 好像对于 ios 打不开 admin page Django 模板中变量的嵌套 早起把网站的友链网页和自主添加友链功能撸出来了,过来收集一波友链 用 django 调用长时间执行的脚本,如何返还输出呢? Django 中递归分类 model 用什么组件显示比较合适? django 一开始没用 restfulapi 开发, 还能自动生成文档吗? 求推 django 数据可视化插件 django 用 docker 部署,要不要每次部署到服务器的时候改改 image 的 settings 配置 有没有使用 django 国际化模块的,针对 django.po 国际化文件写了一个 vscode 的插件 Django 访问 relation 时,如何得知是谁访问的? django admin 部分自带的 css 文件 collectstatic,生成的文件大小为 0? Django 怎么做同一个 url,对应不同的 view 函数?
请教 drf 全局封装 response 的优雅实现
HashV2 · 2022-08-18 · via Django

在使用 drf 的时候,当有错误的时候默认的 http response 都是 http state ,但是和前端的交互中,前端希望得到如下的这种 json 形式,包括我自己写前端的时候也想要这种形式的返回。

{
   "code": 200,
   "msg": "ok",
   "data": { some data }
}
{
   "code": 404,
   "msg": "http not found",
   "data": null
}

我说一下我之前的实现,这种实现我认为很怪,而且并不能完美封装一些 500 错误,想请教一下有没有什么可以优雅的方式。


首先我使用一个 dataclasses.dataclass 进行定义返回数据结构(code,msg,data)

from dataclasses import dataclass
from typing import Any


@dataclass
class Result:
    code: int
    msg: str
    data: Any

后面我需要打各种补丁

  • 在 api view 中使用 JsonResponse 进行返回,当然也包括一些业务上的逻辑判断都可以在这里进行处理
from dataclasses import asdict
from django.http import JsonResponse
from rest_framework import views


class SomeApiView(views.APIView):

    def get(, request, *args, **kwargs) -> JsonResponse:
        # do something
        return JsonResponse(asdict(Result(200, 'ok', null)))
  • modelviewset 的处理(继承 mixin 对返回做处理),如下,只写了一个举例:
from dataclasses import asdict
from django.http import JsonResponse
from rest_framework import status, mixins

class MyRetrieveModelMixin(mixins.RetrieveModelMixin):

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return JsonResponse(asdict(Result(200, 'ok', serializer.data)))
  • 全局异常处理,对类似 drf-jwt,drf-serializer 中的一些错误,只能在 settings.py 中的 rest framework 中进行异常处理配置,并且用这个方法去处理,这种形式总感觉特别怪。
# 配置
REST_FRAMEWORK = {
    # ...
    # 异常处理(统一封装为 code msg data 格式)
    'EXCEPTION_HANDLER': 'utils.result_handler.custom_exception_handler',
    # ...
}
def custom_exception_handler(exc, context):
	
    response = exception_handler(exc, context)
    
    if response is not None:
    	# logger
    	# 进行一些处理 处理成 Result(code, msg, data)
        # 这里对很多处理,尤其 serializer 中的处理 特别烦!
        # 比如手机号唯一约束,前端就想要 code:400 msg:"该手机号已被使用"
        return JsonResponse(...)

说实话这些补丁看的我有些难受,很想知道有没有什么优雅的处理方式

thanks !