React와 연동하기 위하여 구현한 Django Rest Framework(DRF)를 이용한 REST API
쇼핑몰을 주제로한 웹 앱 구현에 front-end는
React
를, back-end는Django
를 사용하여 구현하기로 결정하고
back-end 부분을 맡아서 진행
pip를 이용하여 라이브러리 설치 Python Version: 3.8
pip install -r requirements.txt
pythonanywhere 사이트에서 서버 생성하여 해당 앱 업로드 후 서버 실행
*테스트를 위해 상품에 대한 데이터는 무신사스토어 사이트로부터 크롤링하여 DB에 저장
Cloth 라는 의류 공통 테이블을 두고 의류의 상세 정보는 사이트마다 상이하기 때문에 사이트별로 테이블 새로 생성
- 의류 테이블
- 제품 번호, 브랜드명, 제품명, 의류 이미지 suffix, 가격, 카테고리, 생성시간, 수정시간
class Cloth(models.Model):
# id = models.IntegerField(primary_key=True)
productNo = models.CharField(max_length=200)
brand = models.CharField(max_length=200)
title = models.CharField(max_length=200)
clothImgSuffix = models.CharField(max_length=300)
price = JSONField(default=dict)
category = models.CharField(max_length=100)
created = models.DateTimeField(editable=False)
modified = models.DateTimeField(editable=False)
- 의류 상세 무신사 테이블(의류 테이블과 One-to-One 관계)
- 설명, 시즌, 성별, 1개월 인기도, 추가정보(색상, 수입여부, ...)
class Cloth_Detail_Musinsa(models.Model):
cloth = models.OneToOneField(
Cloth,
on_delete=models.CASCADE,
primary_key=True,
)
description = models.TextField(blank=True, null=True)
season = models.CharField(max_length=100)
gender = models.CharField(max_length=100)
monthlyPopularity = models.CharField(max_length=100)
color = models.CharField(max_length=100)
importation = models.CharField(max_length=100)
manufacturingYM = models.CharField(max_length=100)
material = models.CharField(max_length=100)
sizeNweight = models.CharField(max_length=100)
manufacturer = models.CharField(max_length=100)
manufactured = models.CharField(max_length=100)
asdirector = models.CharField(max_length=100)
precautions = models.CharField(max_length=500)
warrantyBasis = models.CharField(max_length=200)
Generic API View
를 이용하여 HTTP 요청 처리
class ListCloth(generics.ListCreateAPIView):
queryset = Cloth.objects.all()
serializer_class = ClothSerializer
renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
filter_backends = [DjangoFilterBackend]
filterset_fields = [a for a in ClothSerializer.Meta.fields if a != 'price']
search_fields = [a for a in ClothSerializer.Meta.fields if a != 'price']
ordering_fields = [a for a in ClothSerializer.Meta.fields if a != 'price']
pagination_class = ClothPageNumberPagination
class DetailCloth(generics.RetrieveUpdateDestroyAPIView):
queryset = Cloth.objects.all()
serializer_class = ClothSerializer
ModelSerializer
를 통해 JSON 형식으로 데이터 직렬화
class ClothSerializer(serializers.ModelSerializer):
class Meta:
fields = ('id',) + tuple(a.name for a in Cloth._meta.get_fields())
model = Cloth
- 각 테이블의 컬럼에 대한 필터링
- 성능 개선을 위한 페이징 처리
- 한 컬럼에 여러 데이터 저장하기 위해 JSON Field를 사용
지정한 사이트로부터 데이터를 가져와서 파싱 후에 DB에 저장하는 것까지 구현하였으나
pythonanywhere 서버에서는 해당 코드 실행 불가
pythonanywhere 내에서 관리하는 white list에 추가되어야 해당 사이트로부터 request 가능
→ 로컬에서 실행한 후에 DB에 저장된 데이터를 txt로 저장하여 pythonanywhere 서버에 업로드하는 방식으로 진행