_공부하는/python

Django RESTful api 서버 만들기 -2 주소록 기능

흰 the JohFam 2021. 12. 5. 18:10

1. addresses 앱 생성

$ python manage.py startapp addresses

2. models.py 작성

class Addresses(models.Model):
    # models.XXX : 데이터 타입 정의
    name = models.CharField(max_length=10)
    phone_number = models.CharField(max_length=13)
    address = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

- pk 지정하지 않으면 id 자동 생성

- created는 auto_now_add 옵션, 객체 생성 시간 자동으로 저장

 

3. serializers.py

- restframework에서 사용하는 기능으로, model로 만든 데이터를 json 형태로 바꿔주는 역할

class AddressesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Addresses
        fields = ['name', 'phone_number', 'address']

- models.py로부터 Addresses모델을 가져와 serializer 생성

- Meta에 사용할 모델과 사용할 필드 작성

- 객체 데이터를 입력하면 Addresses 모델의 필드인 name, phone_number, address를 json으로 바꿔서 출력해준다

 

4. views.py

- address_list, address, login 3개의 서비스

  • address_list: 주소록 전체를 조회하거나, 신규 주소를 생성
@csrf_exempt
def address_list(request):
    if request.method == 'GET':
        query_set = Addresses.objects.all()
        serializer = AddressesSerializer(query_set, many=True)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = AddressesSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)

- GET이면 전체 조회, POST면 신규 생성

- 메소드가 GET이면: 모든 객체 읽어들이고 serializer에 넣어 json형태로 변환. JsonResponse로 return

(return은 항상 Response형태여야 함)

- 메소드가 POST면: JSON형태로 들어온 request를 JSONParser로 데이터 파싱, serializer에 넣기

serializer에서 선언한 모델, 필드와 비교해 일치하면(is_valid) save()를 통해 객체 만들고, 다르면 error

 

  • address: 단건 조회, 수정, 삭제
@csrf_exempt
def address(request, pk):
    # 특정 데이터 조회
    obj = Addresses.objects.get(pk=pk)

    if request.method == 'GET':
        serializer = AddressesSerializer(obj)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = AddressesSerializer(obj, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)

    elif request.method == 'DELETE':
        obj.delete()
        return HttpResponse(status=204)

- GET, PUT, DELETE 모두 하나의 객체를 선택해서 처리하기 때문에 공통적으로 특정 데이터를 조회한다(obj)

- PUT은 POST와 비슷하지만, serializer에 데이터를 넣을 때 선택된 객체도 함께 넣는 것이 차이점

 

  • login: 주소록의 이름/폰넘버=아이디/비번으로 로그인 기능 구현
@csrf_exempt
def login(request):
    if request.method == 'POST':
        data = JSONParser().parse(request)
        search_name = data['name']
        obj = Addresses.objects.get(name=search_name)

        if data['phone_number'] == obj.phone_number:
            return HttpResponse(status=200)
        else:
            return HttpResponse(status=400)

- 단건 조회는 맞지만 name을 아이디처럼 사용하려 하기 때문에 name=search_name으로 불러온다. (pk=pk 대신에)

- DB에 있는 폰넘버와 입력된 폰넘버를 비교해 일치하면 성공(200) 다르면 실패(400)

 

5. views.py와 urls.py 연결

- 어떤 url로 views에서 만든 기능들을 불러올지 설정

from django.conf.urls import url, include
from addresses import views
from django.urls import path

urlpatterns = [
    path('addresses/', views.address_list),
    path('addresses/<int:pk>/', views.address),
    path('login/', views.login),
    url(r'^api-auth/', include('rest_framework.urls',
                               namespace='rest_framework'))
]

- path함수로 url과 views.py에서 만든 기능들을 연결

- addresses 앱과 모델 적용하기 위해 migrate

$ python manage.py makemigrations
$ python manage.py migrate

makemigrations 오류)

RuntimeError: Model class addresses.models.Addresses doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

  -> settings.py의 INSTALLED_APPS에 'addresses.apps.AddressesConfig' 추가

 

6. DB

- sqlite3 데이터베이스 사용(db.sqlite3)

- DB 열기 위해 외부 플러그인 database navigator 설치

 

7. restful api 테스트툴 insomnia

- 3번 POST 후 전체 데이터 조회 ~/addresses/

- POST 요청 : 200이면 성공, 400이면 실패 ~/login/

 

참고)

https://cholol.tistory.com/468?category=739855 

 

dJango로 restful API 서버만들기 [2] - rest framework 적용

이전 글 2019/10/14 - [Study/python] - dJango로 restful API 서버만들기 [1] - django 서버 생성 소스코드 GIT : https://github.com/tkdlek11112/django_restful 시작하기 전에 지난 강의에서는 장고를 설치하..

cholol.tistory.com