Django REST frameworkでHTTPステータスコード500
Django REST frameworkについて質問です。
現在、ユーザのパスワード変更するAPIを作成しております。
APIには引数として以下3つをリクエストします。
- 現在のパスワード (old_password)
- 新しいパスワード (new_password)
- 新しいパスワード(確認用) (new_password_confirm)
APIの処理の流れとしては以下になります。
1. 新しいパスワード(new_password)と新しいパスワード(確認用)(new_password_confirm)の入力値が同じかチェック
2. 現在のパスワード(old_password)と対象ユーザのDB登録値パスワードが同じチェック
3. 新しいパスワード(new_password)でユーザ情報を更新する
しかしながら現在APIのHTTPレスポンスのステータスコードが500を返します。
HTTPレスポンスログ
XXX.XX.X.X - - [DD/MM/YYYY:HH:MM:SS +0000] "PATCH /api/password_change/1/ HTTP/1.1" 500 13596 "-" "python-requests/2.21.0" "-"
以下view.py、serializer.py、urls.pyのどのクラスにHTTPエラーの原因があるのか検討もつきません。
解決策でなく、気づきレベルの亊でも構いません。
何卒ご教授のほどよろしくお願いいたします。
views.py
class ChangePassView(generics.RetrieveUpdateAPIView):
queryset = User.objects.filter.all()
serializer_class = ChangePassSerializer
def patch(self, request, *args, **kwargs):
old_password = request.POST["old_password"]
new_password = request.POST["new_password"]
new_password_confirm = request.POST["new_password_confirm"]
if not new_password.equals(new_password_confirm):
return JsonResponse({'message': '新しいパスワードが異なります'}, status=403)
user = User.objects.get(id=kwargs['pk'])
if not user.check_password(old_password):
return JsonResponse({'message': '現在のパスワードが異なります'}, status=403)
return super().update(new_password, kwargs['pk'])
models.py
class User(AbstractBaseUser, PermissionsMixin):
user_Id = models.CharField(_('user_Id'), max_length=7, unique=True)
password = models.CharField(_('password'), max_length=255)
serializer.py
class ChangePassSerializer(serializers.ModelSerializer):
old_password = serializers.CharField(max_length=255)
new_password = serializers.CharField(max_length=255)
new_password_confirm = serializers.CharField(max_length=255)
class Meta:
model = User
fields = ('password',)
def update(self, user, validated_data):
user.set_password(validated_data['password'])
user.save()
return user
urls.py
urlpatterns = [
app_name = 'api'
path('password_change/<int:pk>/', ChangePassView.as_view(),
name='password_change'),
]
2019/06/12 追記
WebサーバにはNginxを使用しております。
APIにリクエストを送った時に出るエラーログは以下になります。
※ 日付とIPアドレスはマスクしております。
/var/log/nginx/error.log
YYYY/MM/DD HH:MM:SS [info] 9#9: *33 client closed connection while waiting for request, client: XXX.XX.X.X, server: X.X.X.X:80
YYYY/MM/DD HH:MM:SS [info] 9#9: *40 client XXX.XX.X.X closed keepalive connection
YYYY/MM/DD HH:MM:SS [info] 9#9: *42 client XXX.XX.X.X closed keepalive connection
2019/06/15 追記
django.logに出力されているエラーメッセージは以下になります。
django.log
File "./api/views.py", line 65, in patch
if not new_password.equals(new_password_confirm):
AttributeError: 'str' object has no attribute 'equals'
2019/06/17 追記
views.pyを以下に修正したところ、エラー箇所が変わりました。
views.py
class ChangePassView(generics.RetrieveUpdateAPIView):
queryset = User.objects.filter.all()
serializer_class = ChangePassSerializer
def patch(self, request, *args, **kwargs):
old_password = request.POST["old_password"]
new_password = request.POST["new_password"]
new_password_confirm = request.POST["new_password_confirm"]
if new_password != (new_password_confirm):
return JsonResponse({'message': '新しいパスワードが異なります'}, status=403)
user = User.objects.get(id=kwargs['pk'])
if not user.check_password(old_password):
return JsonResponse({'message': '現在のパスワードが異なります'}, status=403)
return super().update(new_password, kwargs['pk'])
django.log(エラー文)
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 495, in dispatch
response = self.handle_exception(exc)
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 455, in handle_exception
self.raise_uncaught_exception(exc)
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 492, in dispatch
response = handler(request, *args, **kwargs)
File "./api/views.py", line 76, in patch
return super().update(new_password, kwargs['pk'])
File "/usr/local/lib/python3.6/site-packages/rest_framework/mixins.py", line 68, in update
serializer = self.get_serializer(instance, data=request.data, partial=partial)
AttributeError: 'str' object has no attribute 'data'
親クラスのmixins.pyでAttributeErrorが発生しているようです。
(mixins.py 68行目 下記貼り付け箇所だと8行目)
mixins.py
class UpdateModelMixin(object):
"""
Update a model instance.
"""
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
# If 'prefetch_related' has been applied to a queryset, we need to
# forcibly invalidate the prefetch cache on the instance.
instance._prefetched_objects_cache = {}
return Response(serializer.data)
def perform_update(self, serializer):
serializer.save()
def partial_update(self, request, *args, **kwargs):
kwargs['partial'] = True
return self.update(request, *args, **kwargs)
2019/06/18追記
AttributeErrorに関しては別質問としてを以下リンクに登録致しました。
Django REST frameworkでAttributeError