Django Ошибка REST Framework FileParser при отправке запроса через почтальона - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть модель в Django для хранения деталей профиля пользователя, например:

class UserDetails(models.Model):

    def getFileName(self, filename):
        return 'profile_pics/'+str(self.user.id)+'/'+filename

    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    profile_picture = models.ImageField(blank = True, upload_to=getFileName)
    country = models.CharField(max_length = 50, default='South Africa')
    gender = models.CharField(max_length=10, default='NA')
    birthday = models.DateField(default=datetime.now())

    phone = models.CharField(max_length=15)

    verified = models.BooleanField(default=False)

    def __str__(self):
        return self.user.username

Затем я написал REST API, который будет обрабатывать запросы POST для создания профиля пользователя, например:

from django.shortcuts import render

from rest_framework import status
from rest_framework.decorators import api_view, authentication_classes, permission_classes, parser_classes
from rest_framework.parsers import FormParser, MultiPartParser, FileUploadParser
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated

from datetime import datetime

from django.contrib import messages, auth
from django.contrib.auth.models import User

from userMgmt.models import UserDetails

@api_view(['POST'])
@parser_classes(['FormParser', 'MultiPartParser', 'FileUploadParser'])
def signUp(request):
    if request.method == 'POST':
        data = request.data

        ## Creating a basic user
        user = User.objects.create_user(data['first_name'], data['email'], data['password'])
        user['last_name'] = data['last_name']
        user.save()

        ## Creating a profile for the user
        user_details = UserDetails()
        user_details.user = user
        user_details.profile_picture = data['profile_picture']
        user_details.country = data['country']
        user_details.gender = data['gender']
        user_details.birthday = datetime.strptime(data['birthday'], '%m/%d/%y')
        user_details.phone = data['phone']
        user_details.verified = False

        user_details.save()
        return Response({'message': 'Profile created Successfully'})

Затем я сделал запрос к этому REST API, используя Postman, например: Postman request screenshot

После этого я получил следующую ошибку:

Internal Server Error: /services/authentication/signup/
Traceback (most recent call last):
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/rest_framework/views.py", line 488, in dispatch
    request = self.initialize_request(request, *args, **kwargs)
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/rest_framework/views.py", line 389, in initialize_request
    parsers=self.get_parsers(),
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/rest_framework/views.py", line 266, in get_parsers
    return [parser() for parser in self.parser_classes]
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/rest_framework/views.py", line 266, in <listcomp>
    return [parser() for parser in self.parser_classes]
TypeError: 'str' object is not callable
[06/Apr/2020 06:45:47] "POST /services/authentication/signup/ HTTP/1.1" 500 96805

Я добавил rest_framework в список INSTALLED_APPS в моих настройках. И я также добавил REST_FRAMEWORK в мои настройки как:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ],
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FileUploadParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
    ],
}

Какие необходимые изменения я должен внести, чтобы получить REST API для регистрации пользователя для работы?

Пожалуйста, помогите

Ура !!!

1 Ответ

0 голосов
/ 06 апреля 2020

Пожалуйста, убедитесь, что вы устанавливаете заголовок Content-Type на вкладке заголовка в Postman как правильное значение для обработки данных формы.

Content-Type : application/x-www-form-urlencoded

Также вы можете попробовать отправить данные формы в формате json, выбрав raw и затем выбрав json в правой части вкладки. Также установите заголовок Content-Type как

Content-Type : application/json
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...