python3.10
회원가입
User 모델의 objects.create_user기능을 이용하여 유효성 검사와 저장을 한번에 수행합니다.
로그인 & 로그아웃
class loginView(viewsets.ModelViewSet):
serializer_class = UserSerializer
queryset = User.objects.all()
def create(self, request):
serializer = UserSerializer(request.POST)
user = authenticate(request, username=request.POST.get( //django.contrib.auth의 `authenticate`을 이용하여 신원을 확인하고 반환
'username'), password=request.POST.get('password'))
if user is not None:
login(request, user) //반환된 유저가 있다면 `login()` 함수를 통해 세션 테이블에 저장하고 로그인 유지
return redirect("http://127.0.0.1/blog/post")
else:
return redirect("http://127.0.0.1/account/register")
|user|Permission Class|Available|
|---|---|---|
|no login|ReadOnly|읽기 가능|
|login|IsAuthenticated|읽기 & 쓰기 가능|
|login&owner|IsOwnerOrReadOnly |읽기 & 쓰기 & 해당 게시글 수정 가능|
쿠팡 장바구니 상품 가격 저장
ERD
장바구니 상품 update 시퀀스 다이어그램
selenium을 이용한 크롤링으로 쿠팡 장바구니 속 상품의 정보를 가져옵니다.
이용자들의 장바구니 속 상품을 모두 product 테이블에 중복되는 크롤링을 방지했습니다.
이때 상품별로 이용자 테이블을 One-to-many의 관계로 생성하여 자신의 장바구니에 담긴 상품만 조회 가능하도록 했습니다.
job에 등록하여 3 시간에 한번 크롤링하며 하루의 최저 금액을 저장하고 일별 최저가를 보여줍니다.
상품 정보 쿼리 최적화
product
의 wisher
로 장바구니에 등록 된 상품인지 판별한다.
이때 product
에서 wisher
를 정참조 하기 대문에 select_related
로 캐싱하여 쿼리를 줄일 수 있다.
소스코드 예제
class MyProductDataView(APIView):
permission_classes = [IsAuthenticated]
authentication_classes = [SessionAuthentication]
serializer_class=ProductDataSerializer
def get(self, request):
queryset = ProductData.objects.select_related('wisher').filter(wisher=request.user.id)
serializer=ProductDataSerializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
변경 전
변경 후
objects를 하나하나 가져오던 방식에서 한번에 가져오는 방식으로 바뀜
블로그
CRUD | HTTP | URL |
---|---|---|
로그인 | POST | /login |
로그아웃 | GET | /logout |
회원가입 | POST | /register |
카카오 회원가입 | GET | /kakao/login |
CRUD | HTTP | URL |
---|---|---|
게시글 조회 | GET | /posts |
게시글 등록 | POST | /posts |
특정 게시글 조회 | GET | /posts/{post_id: int} |
내 게시글 조회 | GET | /user-posts |
해당 게시글 댓글 조회 | GET | /posts/{post_id: int}/comment |
해당 게시글 댓글 등록 | POST | /posts/{post_id: int}/comment |
해당 게시글 좋아요 | GET | /post/{post_id: int}/like |
해당 게시글 좋아요 회원 조회 | GET | /post/{post_id: int}/like-list |
등록 상품 전체 조회 | GET | product |
쿠팡 장바구니 업데이트 | GET | /product/my |
상품 가격 조회 | GET | /price/{int:product_id} |
Product job init | GET | /product-data/ |
product 모델에 url 속성을 추가하여 상품 당 한번만 정보를 가져오도록 변경했다.
사용자의 장바구니를 주기적으로 크롤링하여 업데이트 -> product 모델을 주기적으로 크롤링
로그인을 생략한 크롤링으로 실행시간을 줄이고, 데이터 중복을 방지 할 수 있었다.