devgraphy / airsm-django-restapi

AIRSM 프로젝트의 REST API 기반 Back-end
0 stars 0 forks source link

serializer.is_valid() returns false #15

Closed devgraphy closed 3 years ago

devgraphy commented 3 years ago
def memberCreate(request):
    serializer = MemberSerializer(data = request.data)
    if(serializer.is_valid()):
        serializer.save()
    if(~serializer.is_valid()):
        print('hi')
    return Response(serializer.data)

http 요청 시 결과

hi
"POST /membership/users/signup/ HTTP/1.1" 200 93
devgraphy commented 3 years ago

serializer를 통한 유효성 검사 진행 다음과 같이 수정하여 에러 확인 if(serializer.is_valid(raise_exception=True)): True일 경우 400 에러 반환

DRF serializers doc

Raising an exception on invalid data
The .is_valid() method takes an optional raise_exception flag that will cause it to raise a serializers.ValidationError exception if there are validation errors.

These exceptions are automatically dealt with by the default exception handler that REST framework provides, and will return HTTP 400 Bad Request responses by default.

# Return a 400 response if the data was invalid.
serializer.is_valid(raise_exception=True)

django server

Bad Request: /membership/users/signup/
[28/May/2021 17:30:34] "POST /membership/users/signup/ HTTP/1.1" 400 99

browser

POST http://localhost:8000/membership/users/signup/ 400 (Bad Request)
Uncaught (in promise) Error: Request failed with status code 400
    at createError (createError.js:16)
    at settle (settle.js:17)
    at XMLHttpRequest.handleLoad (xhr.js:62)
devgraphy commented 3 years ago

views 단에 들어와서 로직은 수행한다. serializer.is_valid에서 block 된다.

devgraphy commented 3 years ago

JSOS.Parser 메서드를 통해 JSON 문자열의 구문을 분석하고, 그 결과에서 JavaScript 값이나 객체를 생성한다. 그리고 JSON 데이터를 출력해서 확인한다. 원하는 json형태가 아니다. {'phone': {'phone': '01011112222'}, 'name': {'name': '진'}, 'password': {'pw': '123'}}'pw': '123'}}

@api_view(['POST'])
def memberCreate(request):
    data = JSONParser().parse(request)
    serializer = MemberSerializer(data = data)
    print(data)
    if(serializer.is_valid()):
        serializer.save()
        return Response(serializer.data,status=200)
    return Response("member create error",status=400)
devgraphy commented 3 years ago

r첫 번째 return을 if문과 같은 레벨에 두게 되면 항상 정상 상태를 반환하기 때문에 serializer에러가 발생하여 데이터가 데이터베이스에 들어가지 않았는데 문제가 있다.

@api_view(['POST'])
def memberCreate(request):
    data = JSONParser().parse(request)
    serializer = MemberSerializer(data = data)
    print(data)
    if(serializer.is_valid()):
        serializer.save()
        return Response(serializer.data,status=200)
    return Response("member create error",status=400)
devgraphy commented 3 years ago

JSX 문법으로 {}로 둘러싸서 표현했기 때문에 계속 {}이 중첩되어 표현되었다. render 바깥은 JSX 문법적용하는 영역이 아님에 주의!

    const [phone, setPhone] = useState();
    const [pw, setPw] = useState();
    const [pw2, setPw2] = useState();
    const [name, setName] = useState();

    function registerUser(e){
        e.preventDefault();
        axios.post('http://localhost:8000/membership/users/signup/',
                                {
                                    phone,
                                    name,
                                    pw
                                })