Джанго плохой запрос 400?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Джанго плохой запрос 400?

Сообщение Anonymous »

Я прочитал много вопросов по SO относительно кода ошибки 400 и понял, что проблема в основном заключается в том, что клиент не отправляет json, как ожидает API. Однако я не могу обойти проблему с кодом ошибки 400. Я следую этому руководству thinkster djangular. В разделе регистрации новых пользователей я получаю неверный запрос 400.

views.py

Код: Выделить всё

from rest_framework import permissions, viewsets, status
from rest_framework.response import Response

from authentication.models import Account
from authentication.permissions import IsAccountOwner
from authentication.serializers import AccountSerializer

class AccountViewSet(viewsets.ModelViewSet):
lookup_field = 'username'
queryset = Account.objects.all()
serializer_class = AccountSerializer

def get_permissions(self):
if self.request.method in permissions.SAFE_METHODS:
return (permissions.AllowAny(),)

if self.request.method == 'POST':
return (permissions.AllowAny(),)

return (permissions.IsAuthenticated(), IsAccountOwner(),)

def create(self, request):
serializer = self.serializer_class(data=request.data)

if serializer.is_valid():
Account.objects.create_user(**serializer.validated_data)

return Response(serializer.validated_data, status=status.HTTP_201_CREATED)

return Response({
'status': 'Bad request',
'message': 'Account could not be created with received data.'
}, status=status.HTTP_400_BAD_REQUEST)
Предполагается ли, что метод create переопределяет метод create в классе CreateModelMixin?

Вот мои сериализаторы .py

Код: Выделить всё

from django.contrib.auth import update_session_auth_hash

from rest_framework import serializers

from authentication.models import Account

class AccountSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True, required=False)
confirm_password = serializers.CharField(write_only=True, required=False)

class Meta:
model = Account
fields = ('id', 'email', 'username', 'created_at', 'updated_at',
'first_name', 'last_name', 'tagline', 'password',
'confirm_password',)
read_only_fields = ('created_at', 'updated_at',)

def create(self, validated_data):
return Account.objects.create_user(**validated_data)

def update(self, instance, validated_data):
instance.username = validated_data.get('username', instance.username)
instance.tagline = validated_data.get('tagline', instance.tagline)

instance.save()

password = validated_data.get('password', None)
confirm_password = validated_data.get('confirm_password', None)

if password and confirm_password and password == confirm_password:
instance.set_password(password)
instance.save()

update_session_auth_hash(self.context.get('request'), instance)

return instance
Когда вы создаете объект с помощью метода .save() сериализатора, атрибуты объекта задаются буквально. Это означает, что пароль пользователя, регистрирующегося с паролем «пароль», будет сохранен как «пароль». Это плохо по нескольким причинам: 1) Хранение паролей в виде обычного текста — серьезная проблема безопасности. 2) Django хэширует и солит пароли перед их сравнением, поэтому пользователь не сможет войти в систему, используя «пароль» в качестве пароля.
Мы решаем эту проблему, переопределив метод .create() для этого набора представлений и использование Account.objects.create_user() для создания объекта Account.

Совершенно не понимаю, что происходит...

Подробнее здесь: https://stackoverflow.com/questions/354 ... equest-400
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»