axios 前端与 Django 后端的 POST 交互

背景

自己在写一些油猴脚本,前端需要用 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('文件上传成功')  # 返回响应
本门课程重实战,将基础知识拆解到项目里,让你在项目情境里学知识。 这样的学习方式能让你保持兴趣、充满动力,时刻知道学的东西能用在哪、能怎么用。 平时不明白的知识点,放在项目里去理解就恍然大悟了。   一、融汇贯通 本视频采用了前后端分离的开发模式,前端使用Vue.js+Element UI实现了Web页面的呈现,后端使用Python 的Django框架实现了数据访问的接口,前端通过Axios访问后端接口获得数据。在学习完本章节后,真正理解前后端的各自承担的工作。   二、贴近实战 本系列课程为练手项目实战:学生管理系统v4.0的开发,项目包含了如下几个内容:项目的总体介绍、基本功能的演示、Vuejs的初始化、Element UI的使用、在Django实现针对数据的增删改查的接口、在Vuejs实现前端增删改查的调用、实现文件的上传、实现表格的分页、实现导出数据到Excel、实现通过Excel导入数据、实现针对表格的批量化操作等等,所有的功能都通过演示完成、贴近了实战   三、课程亮点 在本案例,最大的亮点在于前后端做了分离,真正理解前后端的各自承担的工作。前端如何和后端交互   适合人群: 1、有Python语言基础、web前端基础,想要深入学习Python Web框架的朋友; 2、有Django基础,但是想学习企业级项目实战的朋友; 3、有MySQL数据库基础的朋友  
要实现Django和Vue的前后端交互,可以使用Axios作为HTTP客户端库,Axios可以帮助我们向Django后端发送HTTP请求,并获取响应数据。 在Vue,可以使用以下代码发送GET请求: ``` axios.get('/api/data/') .then(response => { console.log(response.data); }) .catch(error => { console.log(error); }); ``` 其,`/api/data/`是Django后端的API接口地址。 如果需要发送POST请求,可以使用以下代码: ``` axios.post('/api/data/', { data: 'example data' }) .then(response => { console.log(response.data); }) .catch(error => { console.log(error); }); ``` 在Django,需要使用Django REST framework (DRF)来创建API视图和序列化器,以便接收和返回JSON格式数据。 以下是一个简单的DRF视图代码示例: ```python from rest_framework.views import APIView from rest_framework.response import Response class DataAPIView(APIView): def get(self, request, format=None): data = {'key': 'value'} return Response(data) def post(self, request, format=None): serializer = MySerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=201) return Response(serializer.errors, status=400) ``` 其,`MySerializer`是一个DRF序列化器,用于验证POST请求的数据。 在Django的urls.py,需要将API视图映射到URL: ```python from django.urls import path from myapp.views import DataAPIView urlpatterns = [ path('api/data/', DataAPIView.as_view()), ] ``` 这样,Vue前端就可以使用Axios发送请求到Django后端,获取API返回的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值