django学习之 从服务端上传文档与下载文档接口
一.首先建立一个项目demo
关于建立一个django项目demo参照:Django继承drf的user模型的demo
相关的项目的个部分代码如下:
1.路由
(1)总路由
from django.contrib import admin
from django.urls import path
from django.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path(r'api/user/', include("user.urls")), # 用户及用户管理的模块
]
(2)子路由
from django.urls import path
from . import views
urlpatterns = [
# 下载 API 接口文档
path('upload_file/', views.UPLoadFile.as_view()),
path('download_file/', views.DownFile.as_view()),
]
2.安装相应需要的库与依赖
asgiref==3.2.7 Django==3.0.6 djangorestframework==3.11.0 PyMySQL==0.9.3 pytz==2020.1 sqlparse==0.3.1 xlrd==1.2.0
二.文件导入接口
1.视图view的代码
from django.contrib.auth.hashers import make_password
from django.db import transaction
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from .models import User
import xlrd
#
class UPLoadFile(APIView):
def post(self, request):
file_obj = request.FILES.get('demo_file')
if file_obj:
type_excel = file_obj.name.split('.')[1]
else:
return Response(status=status.HTTP_400_BAD_REQUEST,
data={'code': -2, 'data': '', 'msg': '请求参数错误!'})
if 'xls' == type_excel or 'xlsx' == type_excel:
# 开始解析上传的excel表格
wb = xlrd.open_workbook(filename=None, file_contents=file_obj.read())
# wb 为一个表对象
# table 为这个文件里面第一个表格的对象
table = wb.sheets()[0]
nrows = table.nrows # 行数
# ncole = table.ncols # 列数
for i in range(1, nrows):
row_value = table.row_values(i) # 一行的数据
if User.objects.filter(username=row_value[0]).first():
return Response(status=status.HTTP_400_BAD_REQUEST,
data={'code': -2, 'data': '', 'msg': '导入表格失败,请检查并修改错误再次导入'})
try:
# 正常的数据库操作应该是原子性操作
with transaction.atomic():
for i in range(1, nrows): # 第二条数据开始读取
row_value = table.row_values(i) # 一行的数据
user_data = dict()
user_data["username"] = row_value[0]
user_data["password"] = make_password(row_value[1])
user_data["phone"] = row_value[2]
User.objects.create(**user_data)
except Exception as e:
return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR,
data={'code': -2, 'data': '', 'msg': '导入表格失败,服务异常'})
return Response(status=status.HTTP_200_OK, data={'code': 0, 'data': '', 'msg': '导入数据成功!'})
return Response(status=status.HTTP_400_BAD_REQUEST,
data={'code': -2, 'data': '', 'msg': '导入文件格式不对,请检查文件格式'})
2.接口测试
(1)postman测试
文件form-data
文件格式为xls 和 xlsx的表格
表格数据第一行不填写真实数据,第一行填写数据字段的表示内容
key为:demo_file 和视图的代码中的demo_file对应
value为文件,如下:
进行POST请求:http://192.168.109.156:8008/api/user/upload_file/

请求后返回成功的消息
(2)excel上的数据

注意password 和 phone这种带纯数字的字段,最好再数据前加一个 ’ 这个符号,英文形式下的单引号。
否则纯数字发送到服务端的时候的类型默认为float。
三.文件下载接口
需要将配置文件存放的目录
项目settings.py中的配置为:
STATIC_URL = '/static/'
# 设置django的静态文件目录
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "statics")
]
然后在项目中添加如下项目目录:

1.视图view的代码
# 下载excel案例文档
class DownFile(APIView):
def get(self, request):
file = open('statics/demo_file/demo_file.xls', 'rb')
response = HttpResponse(file)
response['Content-Type'] = 'application/octet-stream' # 设置头信息,告诉浏览器这是个文件
response['Content-Disposition'] = 'attachment;filename="test_data.xls"'
return response
2.接口测试
(1)浏览器测试
使用浏览器直接访问:
http://192.168.109.156:8008/api/user/download_file/
结果是浏览器会下载到demo_file.xls文件
完成测试成功
注:不能再postman进行测试,postman测试只会返回乱码

浙公网安备 33010602011771号