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
'_공부하는 > python' 카테고리의 다른 글
| (AWS) Django 프로젝트 AWS로 배포하기 -3 (0) | 2021.12.12 |
|---|---|
| (AWS) Django 프로젝트 AWS로 배포하기 -2 (0) | 2021.12.11 |
| (AWS) Django 프로젝트 AWS로 배포하기 -1 (0) | 2021.12.09 |
| django rest framework 테스트 (0) | 2021.12.04 |
| Django RESTful api 서버 만들기 (0) | 2021.12.02 |