유화제작 프로젝트 2일차. 딥러닝 원격강의에 코드가 대부분 나와있어서 어렵지 않을거라고 예상했는데, 결과 이미지를 어떻게 출력할지 생각보다 고민도 많이 되고 어려운 부분이 많아서 진행이 잘 안됐다😥 그래도 어찌저찌 이것저것 시도해서 코드는 작성을 했고, 내일부터 프론트와 연동하면서 수정해야 할 것 같다.
원격강의에서 제공하는 유명 화가 화풍은 총 11개. 화풍을 사용자들이 직접 선택해서 올릴 수도 있겠지만 우리는 다양한 화풍이 랜덤으로 나오는게 재밌겠다고 생각해서 랜덤 모듈을 사용했다.
paints = {
1: 'composition.t7',
2: 'la_muse.t7',
3: 'starry_night.t7',
4: 'the_wave.t7',
5: 'candy.t7',
6: 'feathers.t7',
7: 'la_muse.t7',
8: 'mosaic.t7',
9: 'starry_night.t7',
10: 'the_scream.t7',
11: 'udnie.t7',
}
# 1~11까지 랜덤으로 선택
num = random.randrange(1, 12)
# OpenCV의 dnn 모듈 사용. 선택된 딥러닝 모델 로드하기
net = cv2.dnn.readNetFromTorch(paints[num])
이렇게 코드를 작성하면 업로드한 이미지에 11개 화풍 중 1개가 랜덤하게 적용되어 이미지 처리가 된다.
1) view에 접근 할 수 있는 요청을 drf의 permission_classes를 활용해 관리 할 수 있다.
아래 이외에도 다양한 permission class들이 존재한다.
permissions.AllowAny
: 모든 사용자를 대상으로 접근 허용permissions.IsAuthenticated
: 로그인 된 사용자를 대상으로 접근 허용permissions.AllowAny
: 모든 사용자를 대상으로 접근 허용2) permission class 커스텀하기
from rest_framework.permissions import BasePermission
from datetime import timedelta
from django.utils import timezone
class RegistedMoreThanAWeekUser(BasePermission):
message = '가입 후 1주일 이상 지난 사용자만 사용하실 수 있습니다.'
def has_permission(self, request, view):
return bool(request.user and request.user.join_date < (timezone.now() - timedelta(days=7)))
from rest_framework.permissions import BasePermission
from rest_framework.exceptions import APIException
from rest_framework import status
class GenericAPIException(APIException):
def __init__(self, status_code, detail=None, code=None):
self.status_code=status_code
super().__init__(detail=detail, code=code)
class IsAdminOrIsAuthenticatedReadOnly(BasePermission):
"""
admin 사용자는 모두 가능, 로그인 사용자는 조회만 가능
"""
SAFE_METHODS = ('GET', )
message = '접근 권한이 없습니다.'
def has_permission(self, request, view):
user = request.user
if not user.is_authenticated:
response ={
"detail": "서비스를 이용하기 위해 로그인 해주세요.",
}
raise GenericAPIException(status_code=status.HTTP_401_UNAUTHORIZED, detail=response)
if user.is_authenticated and user.is_admin:
return True
if user.is_authenticated and request.method in self.SAFE_METHODS:
return True
return False