axios 前端与 Django 后端的 POST 交互

发布于:2024-10-12 ⋅ 阅读:(117) ⋅ 点赞:(0)

背景

自己在写一些油猴脚本,前端需要用 JS,后端是自己的服务,是用 Python 的 Django 框架完成的。

油猴脚本中需要通过 POST 方法,向后端传一些数据,所以前端我用的是 axios 库,后端需要用 Django 处理 POST 数据。

关于跨域名的问题,可以参考我的另一篇文章 Django 跨站请求伪造(csrf)防御——解决 POST 请求 403 问题

关于 POST 请求

POST 请求有多种类型,在 header 中的 Content-Type 中进行了定义。

Content-Type 描述
application/json 用于发送 JSON 格式的数据,axios 默认使用该格式
application/x-www-form-urlencoded 用于提交表单数据,不支持传输文件,Django 文档中主要描述的是这种类型
multipart/form-data 用于发送文件或同时发送文本数据和二进制数据
text/plain 用于发送纯文本内容,不常用
application/xml 用于发送或接收 XML 格式的数据,不常用

常用 POST 请求对应的发起与接收代码示例

application/json 类型

axios 发起,也是 axios 默认发起的 POST 请求时的类型:

data = { 
  key: 'value'
}
headers = {
  'Content-Type': 'application/json'
}

axios.post(
  'url', data,
  {
    headers: headers
})
.then(function (response) {
  // 处理成功响应
  console.log(response.data);
})
.catch(function (error) {
  // 处理错误
  console.error(error);
});

Django 处理:

from django.http import JsonResponse
import json

def my_json_post_view(request):
    if request.method == 'POST':
        data = json.loads(request.body)  # 解析JSON数据
        if 'key' in data.keys():
    	    # 处理数据...
	        return JsonResponse({'message': f' key 的内容是 {data["key"]}'})

application/x-www-form-urlencoded 类型

axios 发起:

data = { 
  key: 'value'
}
headers = {
  'Content-Type': 'application/x-www-form-urlencoded'
}

axios.post(
  'url', data, 
   {
       headers: headers
})
.then(function (response) {
  // 处理成功响应
  console.log(response.data);
})
.catch(function (error) {
  // 处理错误
  console.error(error);
});

Django 处理:

def my_form_post_view(request):
    if request.method == 'POST':
        # 访问表单数据
        value = request.POST['key']
        # 处理数据...
        return HttpResponse('处理成功')  # 或者返回其他类型的响应

multipart/form-data 类型

嫌麻烦的,可以不用这个类型,因为我们可以偷懒一点,把文件进行 base64 编码,之后在 Django 后端的代码里进行 Base64 解码即可

axios 发起:

const formData = new FormData(); // 创建 FormData 实例
formData.append('file', fileInput.files[0]); // 添加文件字段和值(fileInput 是你的文件输入元素)
formData.append('textField', 'some text'); // 添加其他字段和值(如果需要的话)

headers = {
  'Content-Type': 'multipart/form-data'
}

axios.post(
  'url', formData, 
   {
       headers: headers
})
.then(function (response) {
  // 处理成功响应
  console.log(response.data);
})
.catch(function (error) {
  // 处理错误
  console.error(error);
});

Django 处理:

from django.core.files.uploadhandler.upload_handlers import upload_to_save_object
import os

def my_file_upload_view(request):
    if request.method == 'POST':
        uploaded_file = request.FILES['file']  # 获取上传的文件对象
        text_field = request.POST['textField'] # 获取其他字段
        # 保存文件到服务器等操作...
        return HttpResponse('文件上传成功')  # 返回响应

网站公告

今日签到

点亮在社区的每一天
去签到