【发布时间】:2018-05-10 14:35:34
【问题描述】:
我正在尝试使用 REST Framework 制作一个 API,用于将文件上传到服务器,我的代码如下。
如果您有任何其他简单的方法可以做到这一点,请发布您的代码。
models.py
from django.db import models
# Create your models here.
class FileUploader(models.Model):
file = models.FileField()
name = models.CharField(max_length=100) #name is filename without extension
version = models.IntegerField(default=0)
upload_date = models.DateTimeField(auto_now=True, db_index=True)
owner = models.ForeignKey('auth.User', related_name='uploaded_files')
size = models.IntegerField(default=0)
def __str__(self):
return self.name
serializers.py
class FileUploaderSerializer(serializers.ModelSerializer):
class Meta:
model=FileUploader
fields='__all__'
read_only_fields = '__all__'
def validate(self, validated_data):
validated_data['owner'] = self.context['request'].user
validated_data['name'] = os.path.splitext(validated_data['file'].name)[0]
validated_data['size'] = validated_data['file'].size
return validated_data
def create(self,validated_data):
return FileUploader.objects.create(**validated_data)
views.py
class FileUploaderViewSet(viewsets.ModelViewSet):
serializer_class = FileUploaderSerializer
parser_classes=(MultiPartParser,FormParser)
def get_queryset(self,request, *args, **kwargs):
qs = super(FileUploaderViewSet, self).get_queryset(self,request, *args, **kwargs)
qs = qs.filter(owner=self.request.user)
return qs
urls.py
from django.conf.urls import url
from django.conf.urls import url,include
from django.contrib import admin
from rest_framework import routers
from rest_framework.authtoken.views import obtain_auth_token
from rest_framework.urlpatterns import format_suffix_patterns
from webapp import views
from webapp.views import(
UserCreateAPIView,
UserLoginAPIView,
FileUploaderViewSet,
)
router = routers.DefaultRouter()
router.register(r'upload', views.FileUploaderViewSet,base_name='file-view')
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include(router.urls)),
#url(r'^upload/$',FileUploaderViewSet.as_view()),
]
我的要求是我需要上传一个文件到服务器并显示上传文件的详细信息。
这是我遇到的错误!
环境:
请求方法:GET 请求地址:http://127.0.0.1:8000/upload/
Django 版本:1.11.7 Python 版本:3.6.3 已安装的应用程序: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'webapp'] 已安装的中间件: ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware']
追溯:
文件“F:\proj\env\lib\site-packages\django\core\handlers\exception.py” 在内部 41. response = get_response(request)
文件“F:\proj\env\lib\site-packages\django\core\handlers\base.py”在 _get_response 187. response = self.process_exception_by_middleware(e, request)
文件“F:\proj\env\lib\site-packages\django\core\handlers\base.py”在 _get_response 185. response = Wrapped_callback(request, *callback_args, **callback_kwargs)
文件 "F:\proj\env\lib\site-packages\django\views\decorators\csrf.py" 在wrapped_view 58. return view_func(*args, **kwargs)
文件“F:\proj\env\lib\site-packages\rest_framework\viewsets.py”在 看法 90. return self.dispatch(request, *args, **kwargs)
文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 派遣 489. 响应 = self.handle_exception(exc)
文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 处理异常 449. self.raise_uncaught_exception(exc)
文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 派遣 486. 响应 = 处理程序(请求,*args,**kwargs)
列表中的文件“F:\proj\env\lib\site-packages\rest_framework\mixins.py” 40. queryset = self.filter_queryset(self.get_queryset())
异常类型:/upload/ 处的 TypeError 异常值:get_queryset() 缺少 1 个必需的位置参数:“请求”
更新views.py文件如下
from django.shortcuts import render
from django.db.models import Q
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.parsers import MultiPartParser, FormParser
from rest_framework import viewsets
from rest_framework.status import HTTP_200_OK,HTTP_400_BAD_REQUEST
from .models import employees
from .serializers import (
employeesSerializer,
FileUploaderSerializer,
)
from django.contrib.auth import get_user_model
from rest_framework.generics import (
CreateAPIView,
DestroyAPIView,
ListAPIView,
RetrieveAPIView,
RetrieveUpdateAPIView,
)
from rest_framework.permissions import(
AllowAny,
IsAuthenticated,
IsAdminUser,
IsAuthenticatedOrReadOnly,
)
class employeeList(APIView):
def get(self,request):
employees1=employees.objects.all()
serializer=employeesSerializer(employees1,many=True)
return Response(serializer.data)
def post(self):
pass
User=get_user_model()
from .serializers import(
UserCreateSerializer,
UserLoginSerializer,
)
class UserCreateAPIView(CreateAPIView):
serializer_class=UserCreateSerializer
queryset=User.objects.all()
class UserLoginAPIView(APIView):
permission_classes=[AllowAny]
serializer_class=UserLoginSerializer
def post(self,request,*args,**kwargs):
data=request.data
serializer=UserLoginSerializer(data=data)
if serializer.is_valid(raise_exception=True):
new_data=serializer.data
return Response(new_data,status=HTTP_200_OK)
return Response(serializer.errors,status=HTTP_400_BAD_REQUEST)
class FileUploaderViewSet(viewsets.ModelViewSet):
serializer_class = FileUploaderSerializer
parser_classes=(MultiPartParser,FormParser)
# overriding default query set
#queryset = LayerFile.objects.all()
def get_queryset(self, *args, **kwargs):
qs = super(FileUploaderViewSet, self).get_queryset(self, *args, **kwargs)
qs = qs.filter(owner=self.request.user)
return qs
追溯:
环境:
请求方法:GET 请求地址:http://127.0.0.1:8000/upload/
Django 版本:1.11.7 Python 版本:3.6.3 已安装的应用程序: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'webapp'] 已安装的中间件: ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware']
追溯:
文件“F:\proj\env\lib\site-packages\django\core\handlers\exception.py” 在内部 41. response = get_response(request)
文件“F:\proj\env\lib\site-packages\django\core\handlers\base.py”在 _get_response 187. response = self.process_exception_by_middleware(e, request)
文件“F:\proj\env\lib\site-packages\django\core\handlers\base.py”在 _get_response 185. response = Wrapped_callback(request, *callback_args, **callback_kwargs)
文件 "F:\proj\env\lib\site-packages\django\views\decorators\csrf.py" 在wrapped_view 58. return view_func(*args, **kwargs)
文件“F:\proj\env\lib\site-packages\rest_framework\viewsets.py”在 看法 90. return self.dispatch(request, *args, **kwargs)
文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 派遣 489. 响应 = self.handle_exception(exc)
文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 处理异常 449. self.raise_uncaught_exception(exc)
文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 派遣 486. 响应 = 处理程序(请求,*args,**kwargs)
列表中的文件“F:\proj\env\lib\site-packages\rest_framework\mixins.py” 40. queryset = self.filter_queryset(self.get_queryset())
get_queryset 中的文件“F:\proj\env\myproject\webapp\views.py” 74. qs = super(FileUploaderViewSet, self).get_queryset(self, *args, **kwargs)
异常类型:/upload/ 处的 TypeError 异常值:get_queryset() 接受 1 个位置参数,但给出了 2 个
更改获取查询集后的新 Traceback
class FileUploaderViewSet(viewsets.ModelViewSet):
serializer_class = FileUploaderSerializer
parser_classes=(MultiPartParser,FormParser)
# overriding default query set
def get_queryset(self):
qs = super(FileUploaderViewSet, self).get_queryset()
qs = qs.filter(owner=self.request.user)
return qs
环境:
请求方法:GET 请求地址:http://127.0.0.1:8000/upload/
Django 版本:1.11.7 Python 版本:3.6.3 已安装的应用程序: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'webapp'] 已安装的中间件: ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware']
追溯:
文件“F:\proj\env\lib\site-packages\django\core\handlers\exception.py” 在内部 41. response = get_response(request)
文件“F:\proj\env\lib\site-packages\django\core\handlers\base.py”在 _get_response 187. response = self.process_exception_by_middleware(e, request)
文件“F:\proj\env\lib\site-packages\django\core\handlers\base.py”在 _get_response 185. response = Wrapped_callback(request, *callback_args, **callback_kwargs)
文件 "F:\proj\env\lib\site-packages\django\views\decorators\csrf.py" 在wrapped_view 58. return view_func(*args, **kwargs)
文件“F:\proj\env\lib\site-packages\rest_framework\viewsets.py”在 看法 90. return self.dispatch(request, *args, **kwargs)
文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 派遣 489. 响应 = self.handle_exception(exc)
文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 处理异常 449. self.raise_uncaught_exception(exc)
文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 派遣 486. 响应 = 处理程序(请求,*args,**kwargs)
列表中的文件“F:\proj\env\lib\site-packages\rest_framework\mixins.py” 40. queryset = self.filter_queryset(self.get_queryset())
get_queryset 中的文件“F:\proj\env\myproject\webapp\views.py” 74. qs = super(FileUploaderViewSet, self).get_queryset()
文件“F:\proj\env\lib\site-packages\rest_framework\generics.py”在 获取查询集 68. % self.class.name
异常类型:/upload/ 处的 AssertionError 异常值: 'FileUploaderViewSet' 应该包含
queryset属性,或者 覆盖get_queryset()方法。
【问题讨论】:
-
您是否尝试按照我更新的问题在视图中添加模型字段?你现在卡在哪里了?
-
Thankyou..其实我忘记导入模型了,这造成了所有的麻烦......文件上传的问题已经解决,现在你能帮我提取文件的名称吗使用validated_data上传
-
看看这篇文章对你有没有帮助。 medium.com/@jxstanford/…