Django解析Angular的POST数据

news/2023/12/9 17:14:02

在使用Django和Angular的过程中,遇到过一个Angular向Django POST数据的问题。

// Angular
$http({
    url: "myviews",
    method: "POST",
    data: {'text': 'hello world', 'date': '2017-01-04'}
})
# Django
def myviews(request):
    print request.POST
    print request.body

以上将会打印出

<QueryDict: {}>
u"{'text': 'hello world', 'date': '2017-01-04'}"

而我们期望是这样的结果

<QueryDict: {u'text': u'hello world', u'date': u'2017-01-04'}>
u"{'text': 'hello world', 'date': '2017-01-04'}"

出现这种问题是因为Angular默认发送的数据格式是JSON而不是urlencode,而Django的request.POST无法解析JSON,所以才会出现上面的结果。

解决的办法有很多,最简单粗暴的办法就是在每个视图函数里面都将request.body进行解析

def myviews(request):
    data = urlencode(json.loads(request.body))
    q_data = QueryDict(data)

我们可以把这类操作提取出来,写成Middlerware,在request请求到达视图函数之前就给统一处理好

class JSONMiddleware(object):
    """
    Process application/json requests data from GET and POST requests.
    """
    def process_request(self, request):
        if 'application/json' in request.META['CONTENT_TYPE']:
            data = json.loads(request.body)
            q_data = QueryDict('', mutable=True)

            for key, value in data.iteritems():
                if isinstance(value, list):
                    for x in value:
                        q_data.update({key: x})
                else:
                    q_data.update({key: value})

            if request.method == 'GET':
                request.GET = q_data

            if request.method == 'POST':
                request.POST = q_data
        return None

因为有的request请求当中没有CONTENT-TYPE这个Header,所以我们需要判断一下,之所以不简单的转化成Dict而是QueryDict是因为遵循一致性的原则,我们想要将结果绑定在request.GET或者request.POST上面,而它们都是QueryDict类型。QueryDictDict最大的区别是QueryDict将每个value存在列表当中,并且QueryDict是不可修改类型。所以当value是列表时我们也必须做一下判断,否则整个列表将作为一个元素存入QueryDict的列表当中。

a = {"a": [123, 456, 444], "b": 456}
# 不做判断
data = QueryDict('', mutable=True)
for k, v in a.iteritems():
    data.update({k: v})
print data

# 做判断
data = QueryDict('' mutable=True)
for k, v in a.iteritems():
    if isinstance(v, list):
        for x in value:
            data.update({k: x})
    else:
        data.update({k: v})
print data
<QueryDict: {u'a': [[123, 456, 444]], u'b': [456]}>
<QueryDict: {u'a': [123, 456, 444], u'b': [456]}>

http://www.niftyadmin.cn/n/3877055.html

相关文章

RIPv1 基本配置和被动接口过程

1&#xff09;RIPv1 基本配置实验3.实验步骤&#xff08;1&#xff09;步骤 1&#xff1a;配置路由器 R1R1(config)# router rip //启动 RIP 进程R1(config-router)# version 1 //配置 RIP 版本 1R1(config-router)# network 1.0.0.0 //通告网络R1(config-router)# network 192…

MVC @Html.TextBoxFor 格式化

不能使用Html.EditorFor() 因为需要为生成的控件 指定HTML特性 Html.TextBoxFor(model > model.StartDate, new { Value String.Format("{0:yyyy-MM-dd}", Model.StartDate)}) Html.TextBoxFor(model > model.StartDate,"{0:yyyy-MM-dd}", new { cl…

路由器和交换机

2019独角兽企业重金招聘Python工程师标准>>> 简单地说&#xff1a;交换机用来共享一根网线&#xff0c;路由器用来共享一个IP。 也就是说&#xff0c;如果一根网线上想接几个电脑&#xff0c;就必须用&#xff0c;交换机&#xff1b;如果你只有一个IP&#xff0c;想…

IDEA导入MyEclipse项目报错ClassNotFound

把之前myeclipse的项目导入进idea后就报错&#xff0c;而这个class文件存在解决&#xff1a;以前用myeclipse导出的时候是选择的JAR或者WAR类型的&#xff0c;这次我选择的是FileSystem类型的 然后再导入idea&#xff0c;选择Project From ExisTing Sources就没事了。但是回家…

TypeError: $.data(...).data.rows is undefined报错及解决方法

本菜鸟今天在用spring mvc 向前台传了一个JSONArray的数据&#xff0c;然后前端用easyui框架设置datagrid中的data&#xff0c; 前端JSP中是这么写的 <span id"num" hidden"true">${numDetail}</span> //后台传过来的数据 JS 中是这样的 re…

Spring Data JPA多表联合查询传入参数为空,@Query参数为空判断处理方式

效果&#xff1a;Spring Data JPA根据接口方法传入的值是否为空判断是否执行限定查询语句。 情景&#xff1a;最近在做项目的时候遇到一个问题&#xff0c;项目有一个 停车场表 ParkingLotsEntity&#xff0c;一个停车场产品表 FixedValidityTermEntity&#xff0c;现有一个方…

IDEA : Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA解决办法

在win10新安装idea2017时遇到此问题&#xff0c;IDEA 出现 Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA。 本人在网上搜索过其他答案&#xff0c;比如http://stackoverflow.com/questions/36479123/unable-to-save-settings-intellij-id…

使用RestTemplate时遇到 http 411 length required 问题

问题&#xff1a;近期在使用RestTemplate请求第三方接口时返回 http 411 length required&#xff0c;但postman测试正常。 解决&#xff1a;根据请求参数的大小&#xff0c;手动在RestTemplate设置了请求头ContentLength的长度 headers.setContentLength(jsonObject.toJSONS…

WIN11 安卓子系统无法启动解决办法 无法启动适用于 Android 的 Windows 子系统 确保在可选的Windows功能中启用虚拟机平台

在win11的系统中打开安卓子系统报错如下&#xff1a; 无法启动适用于 Android 的 Windows 子系统 确保在可选的Windows功能中启用虚拟机平台 在尝试了网上其他办法&#xff0c;如“打开 BIOS 中 CPU 虚拟化功能”、“安装自带的虚拟机软件Hyper-V、虚拟机平台”、执行“bcded…

建立一个STM32F411RTOS

目录STM32F411CE创建CPU设置DEBUG设置RCC设置ADC测量电池电压UART传输数据配置RTOS 加入一个任务建立CPUSTM32F411CE 创建CPU 设置DEBUG 选择TIM1 或 6 设置RCC 设置ADC测量电池电压 UART传输数据 配置RTOS 加入一个任务 静态任务&#xff0c;任务名LEDtask 建立CPU main.c…

freeRTOS 挂起和还原、动态消息队列

freeRTOS 挂起和还原 suspend挂起 resume还原 添加一个task 为KEY 当按按下时挂起 再次按下时恢复 void START_KEYTask02(void const * argument) {char big 0;/* USER CODE BEGIN START_KEYTask02 *//* Infinite loop */for(;;){if (HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY…

测试STM32 RTOS 低功耗模式

测试低功耗模式 先搭建一个5s翻转一次的LED灯线程 执行一次翻转、IDLE5秒 void StartLEDTask(void const * argument) {/* USER CODE BEGIN 5 *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);osDelay(5000);}/* USER CODE END 5 */ }测试LED亮时…

在线监测总览

声源定位装置上位机 目录 声源定位装置上位机任务采集发送数据需要的资源任务休眠实际定义IOADCIICSPIUART调试步骤框图任务采集发送数据 启动声采卡步骤1 电池电压采集步骤2 声压采集关闭声采卡步骤3 发送数据DELAY 需要的时间需要的资源 IO启动声采卡AD采集电压串口2采集声压…

声阵列播放平台搭建

声阵列播放平台搭建 1. 喇叭16个 2. 继电器组16个 16路继电器模块光耦隔离高低电平触发PLC控制板5v12v24v继电器-淘宝网 (taobao.com) 200 3. 开关控制器组16个 200 4.功放 16路 1500

环保数据采集平台硬件框架

环保数据采集平台硬件框架 目录 环保数据采集平台硬件框架MCU控制中心模块MSP430F2131控制器STM8控制器STM32控制器ARM9控制器树莓派控制器CUDA控制器工控机控制器无线通信模块4G通信模块蓝牙通信模块WIFI通信模块传感器模块噪声传感器-单点噪声传感器-连续振动传感器-单轴振动…

STM32 RTOS 各任务模块逐一测试

LED BLINK void StartLEDTask(void const * argument) {/* USER CODE BEGIN StartLEDTask *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);osDelay(5000);}/* USER CODE END StartLEDTask */ }ADC采集串口发送 void StartSampleTask(void const *…
最新文章