Blog API with DRF getting Anonymous User Error

Viewed 37

I am creating a BlogAPI with LoginAPI(using dj-rest-auth). I have created a model for my Post-

models.py

        from django.db import models
        from django.contrib.auth.models import User
    
        class Post(models.Model):
        content = models.TextField()
        user = models.ForeignKey(User, on_delete=models.CASCADE)

Then I have made 2 serializers User and Post -

serializers.py

from rest_framework import serializers
from django.contrib.auth.models import User
from .models import Post
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username', 'id', 'email']


class PostSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(read_only=True)

    class Meta:
        model = Post
        fields = ['user', 'content']

My view looks like this-

views.py

from rest_framework import viewsets, permissions
from .serializers import UserSerializer, PostSerializer, CommentSerializer
from . import models
from rest_framework.response import Response
from rest_framework.decorators import action, api_view, permission_classes


class UserViewSet(viewsets.ModelViewSet):
    queryset = models.User.objects.all()
    serializer_class = UserSerializer


class PostViewSet(viewsets.ModelViewSet):
    queryset = models.Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = [permissions.AllowAny]

    def create(self, request):
        serializer = PostSerializer(
            data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        print(request.data)
        print(request.user)

        serializer.save(user=request.user)
        return Response(serializer.data)

I have kept the permissions_class as AllowAny because then I was not able to test the API.

urls.py(inside app)

router = routers.DefaultRouter()
router.register(r'^users', views.UserViewSet)
router.register(r'^posts', views.PostViewSet)

urlpatterns = [
    path('', include(router.urls)),
    re_path(r'^posts/(?P<pk>\d+)/comments/$', view=views.PostViewSet.as_view({'get': 'comments', 'post': 'comments'})),
    re_path(r'^posts/(?P<pk>\d+)/comments/(?P<comment>\d+)/$', view=views.PostViewSet.as_view({'delete': 'remove_comment'}))
]

After running it on locahost on http://127.0.0.1:8000/posts/ I am able to do GET and see all posts by all users but after Posting, I am getting this error-

Environment:

Request Method: POST Request URL: http://127.0.0.1:8000/posts/

Django Version: 4.0.6 Python Version: 3.8.9 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'ApiApp', 'rest_framework', 'rest_framework.authtoken', 'dj_rest_auth', 'django.contrib.sites', 'allauth', 'allauth.account', 'allauth.socialaccount', 'dj_rest_auth.registration'] Installed Middleware: ['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']

Traceback (most recent call last): File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 55, in inner response = get_response(request) File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view return view_func(*args, **kwargs) File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/rest_framework/viewsets.py", line 125, in view return self.dispatch(request, *args, **kwargs) File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch response = self.handle_exception(exc) File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception self.raise_uncaught_exception(exc) File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception raise exc File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch response = handler(request, *args, **kwargs) File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/ApiApp/views.py", line 29, in create serializer.save(user=request.user) File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 212, in save self.instance = self.create(validated_data) File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/rest_framework/serializers.py", line 962, in create instance = ModelClass._default_manager.create(**validated_data) File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/django/db/models/query.py", line 512, in create obj = self.model(**kwargs) File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/django/db/models/base.py", line 541, in init _setattr(self, field.name, rel_obj) File "/Users/shlokabhalgat/PycharmProjects/TestAssignmentAPI/venv/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 235, in set raise ValueError(

Exception Type: ValueError at /posts/ Exception Value: Cannot assign "<django.contrib.auth.models.AnonymousUser object at 0x103243910>": "Post.user" must be a "User" instance.

How should I pass the user as foreign key in seriliazers.py and get an authenticated user for POST?

0 Answers
Related