#view.py
from rest_framework.permissions import IsAuthenticated
from rest_framework.decorators import api_view, permission_classes
#以下是django后台上传代码
@api_view(['POST']) #屏蔽get请求,只留下post
@permission_classes([IsAuthenticated]) #前后端分离的情况下,用jwt令牌识别用户
def upImg(request):
#上传效果图
if request.method == 'POST' and request.FILES.getlist('files'): #判断是否有文件
linuser = UserPro.objects.get(user=request.user) #获取当前上传的用户用于绑定文件
linid = request.POST['id'] #获取post参数(看需求添加)
linbud = Budget.objects.get(id=linid)
# 保存文件
for file in request.FILES.getlist('files'): #循环获取文件判断大小并保存
#小于10m
if file.size < 1024*10240:
linfilname = budimg_path(None,file.name)
linimg = Budimg(name=file.name,effect=linfilname,bud=linbud,custom=linuser) #创建实例,向实例中保存文件路径,然后保存文件
with open(os.path.join(MEDIA_ROOT,'media',linfilname), "wb") as f:
f.write(file.read())
linimg.save()
return JsonResponse({'state':'200'})
else:
return JsonResponse({'state':'404'})
#upload.vue
#其他略
const responseone = await axios.post(url, formData)
以上为基本原理,但是当我们上传的时候会提示415错误,
这是由于drf导致的,虽然我们在上面的代码并没有使用drf,但是当我们使用drf之后,drf会接管所有的api访问,默认情况下drf只接受json格式的数据。所以需要做一下修改
#setting.py
REST_FRAMEWORK = {
#分页
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10,
#过滤
'DEFAULT_FILTER_BACKENDS': [
'django_filters.rest_framework.DjangoFilterBackend',
],
#认证
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
#权限
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
#这里是重点,默认没有下面的内容,默认只有 JSONRenderer,所以会屏蔽其他非json api,
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer', #默认
# 'rest_framework.parsers.FormParser', #以后可能会用到
# 'rest_framework.parsers.MultiPartParser', #上传文件必须
),
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser', #默认
# 'rest_framework.parsers.FormParser', #以后可能会用到
# 'rest_framework.parsers.MultiPartParser', #上传文件必须
),
}
把上面注释的内容取消注释,让 rest_framework.parsers.MultiPartParser 生效,就不会出现415错误了