인프런 커뮤니티 질문&답변

윤해빈님의 프로필 이미지

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

리액트 기본 기능으로 회원가입 폼 만들기

axios 401에러가 났습니다

작성

·

1.3K

1

401 에러가 나서 제가 구글링을 나름 해보니, 토큰인증의 문제가 원인이라고 하는데 아직 토큰발급을 적용하지 않았는데 이런 에러가 나는 이유는 무엇일까요..

Signup.js 부분은 선생님의 코드와 완전히 같습니다.

import React, { useState } from "react";
import Axios from "axios";

export default function Signup() {
    const [inputs, setInputs] = useState({});
    
    const onSubmit = e => {
        e.preventDefault();

        Axios.post("http://localhost:8000/accounts/signup/", inputs)
            .then(response => {
                console.log("response: ",response);
            })
            .catch(error => {
                console.log("error: ",error);
            });
            
    };

    const onChange = e => {
        const {name, value} = e.target;
        setInputs(prev => ({
            ...prev,
            [name]: value
        }));
    };

    return (
        <div>
            <form onSubmit={onSubmit}>
                <input type="text" name="username"onChange={onChange}/>
                <input type="password" name="password" onChange={onChange}/>
                <input type="submit" value="회원가입" />
            </form>
        </div>
    );
}

백엔드 단에서는 구조가 약간 다르긴 하지만 accounts 부분은 크게 다르지 않습니다.

accounts/models.py
from django.db import models

class User(models.Model):
    user_id = models.CharField(max_length=32, unique=True, verbose_name='id')
    user_pw = models.CharField(max_length=128, verbose_name='password')
    user_name = models.CharField(max_length=16, unique=True, verbose_name='name')
    user_Email = models.EmailField(max_length=128, unique=True, verbose_name='email')

    def __str__(self):
        return self.user_name #오브젝트 호출시 user_name으로 표시
    
    class Meta: #DB 테이블 명 지정
        db_table = 'user'
        verbose_name = 'user'
        
accounts/serializers.py

from rest_framework import serializers
from django.contrib.auth import get_user_model

User = get_user_model()

class SignupSerializer(serializers.ModelSerializer):
    #pw 보안
    password = serializers.CharField(write_only=True)

    def create(self, validated_data):
        user = User.objects.create(username=validated_data["username"])
        user.set_password(validated_data["password"]) #암호화된 비번 저장
        user.save()
        return user
    
    class Meta:
        model = User
        fields = ["pk", "username", "password"]
from django.urls import path

from . import views

urlpatterns = [
    path('signup/', views.SignupView.as_view(), name='login'),
]
from django.contrib.auth import get_user_model
from django.shortcuts import render
from rest_framework.permissions import AllowAny
from rest_framework.generics import CreateAPIView
from .serializers import SignupSerializer

#회원가입 뷰
#createapiview 이므로 get 메소드 허용X
class SignupView(CreateAPIView):
    model = get_user_model()
    serializer_class = SignupSerializer
    Permission_classes = [
        AllowAny,#실제로 회원가입할 때는 로그인은 되면 안됨
    ]

혹시 뭐가 원인일지 추측이라도 해주시면 감사하겠습니다..혹시 버전문제일 수도 있을까요? 현재 장고는 3.2 리액트는 18이긴합니다

답변 1

1

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

거의 모든 CBV의 속성명은 소문자입니다.

아래처럼 Permission_classes로 쓰셔서, AllowAny가 반영이 안 된듯 보입니다.

image

확인해보시고 댓글 부탁드립니다.

화이팅입니다. :-)

윤해빈님의 프로필 이미지
윤해빈
질문자

와...이걸 못찾아서 몇시간을....ㅠㅠㅠ

정말 감사합니다!!