- 튜터님의 피드백을 반영하여, 키오스크만이라도 DRF로 변경
장점 :
→ API 구축의 간편함: DRF는 직관적인 API 구축 도구를 제공합니다. 이를 통해 HTTP 요청을 쉽게 처리하고 JSON 응답을 반환할 수 있습니다.
→ 직렬화 기능: DRF는 데이터를 직렬화하고 역직렬화하는 도구를 제공하여, 데이터베이스의 쿼리셋을 JSON과 같은 형태로 변환하고 반대로도 쉽게 처리할 수 있습니다.
→ 인증 및 권한 관리: DRF는 다양한 인증 및 권한 부여 메커니즘을 제공하여, API의 보안성을 강화할 수 있습니다.
→ 필터링, 검색 및 페이징: DRF는 내장된 필터링, 검색 및 페이징 기능을 제공하여, 데이터의 부분적 조회 및 관리를 용이하게 합니다.
→ 유연성 및 확장성: DRF는 클래스 기반 뷰와 믹스인을 제공하여, 필요한 기능을 쉽게 확장하고 사용자 정의할 수 있습니다.
- 진행 중 오류 : django.http.request.RawPostDataException
→ 일반적으로 Django가 요청의 본문(body)에 이미 접근한 후에 다시 접근하려고 할 때 발생한다. 이 오류는 주로 미들웨어, 뷰, 또는 다른 요청 처리 로직에서 요청 본문을 여러 번 읽으려 할 때 발생
해결방법 :
- 요청 본문을 한 번만 읽기
- @csrf_exempt 사용
- 커스텀 미들웨어 점검
- 코드
@method_decorator(csrf_exempt) def post(self, request): try: # 요청의 본문을 한 번만 읽어서 사용 data = request.data selected_items = data.get('items', []) total_price = data.get('total_price', 0) today = datetime.now().date() last_order = Order.objects.filter(created_at__date=today).order_by('-id').first() if last_order: order_number = last_order.order_number + 1 else: order_number = 1 new_order = Order.objects.create( order_number=order_number, order_menu=selected_items, total_price=total_price, status="A" ) return JsonResponse({'order_number': new_order.order_number}, status=201) except json.JSONDecodeError: return JsonResponse({'error': 'Invalid JSON'}, status=400)
@method_decorator(csrf_exempt)
def post(self, request):
try:
# 요청의 본문을 한 번만 읽어서 사용
data = request.data
selected_items = data.get('items', [])
total_price = data.get('total_price', 0)
today = datetime.now().date()
last_order = Order.objects.filter(created_at__date=today).order_by('-id').first()
if last_order:
order_number = last_order.order_number + 1
else:
order_number = 1
new_order = Order.objects.create(
order_number=order_number,
order_menu=selected_items,
total_price=total_price,
status="A"
)
return JsonResponse({'order_number': new_order.order_number}, status=201)
except json.JSONDecodeError:
return JsonResponse({'error': 'Invalid JSON'}, status=400)
- admin ID별로 가게 및 메뉴 카테고리 별로 각각의 변경이 가능하게 구현
- ex) 치킨 / 카페 가게별로 불러오는 메뉴가 다르게 설정
- 코드
######################## model ########################
class User(AbstractUser):
CATEGORY_CHOICES = (
("CH", "치킨"), # 한글로 수정
("CA", "카페"),
)
store_name = models.CharField(max_length=100)
tel = models.CharField(max_length=100, unique=True)
address = models.CharField(max_length=100)
category = models.CharField(max_length=2, choices=CATEGORY_CHOICES)
######################## bot.py ######################
def get_user_menu_and_hashtags(user):
# 현재 로그인된 사용자의 메뉴 가져오기
user_menu = Menu.objects.filter(store=user)
# 메뉴에 연결된 해시태그 가져오기
user_hashtags = Hashtag.objects.filter(menu_items__in=user_menu).distinct()
# 메뉴 이름과 해시태그 문자열로 변환
menu_list = [menu.food_name for menu in user_menu]
hashtag_list = [hashtag.hashtag for hashtag in user_hashtags]
return menu_list, hashtag_list
def bot(input_text, current_user):
client = OpenAI(api_key=settings.OPEN_API_KEY)
# 사용자의 카테고리 가져오기
category = current_user.category
# 사용자의 메뉴 및 해시태그 가져오기
menu, hashtags = get_user_menu_and_hashtags(current_user)
# 카테고리에 따라 시스템 지침 작성
if category == "CH":
category_text = "치킨"
elif category == "CA":
category_text = "카페"
else:
category_text = "음식점"
system_instructions = f"""
이제부터 너는 "{category_text} 직원"이야.
너는 고객의 말에 따라 메뉴를 추천해 줘야해 우리가게에는 {menu}가 있어.
그리고 아래의 카테고리 중에서 고객의 질문과 관련이 있는 항목을 선택해줘: {hashtags}
선택된 항목은 '선택된 항목: [항목]' 형식으로 반환하고,
고객에게 전달할 메시지는 한 문장으로 서비스를 하는 직원처럼 '메세지: "내용"'으로 작성해줘.
"""
- AI음성인식 기능이 포함된 키오스크에 더욱 편하게 볼 수 있도록 음성인식과 연동되는 챗봇을 표현
- 저연령층에게는 계속적인 음성인식은 불필요하다고 느낄 수 있다는 점에서, 버튼 형식의 on/off 음성인식 기능을 추가
- 프롬프트를 좀 더 간결하고 저연령층에 맞게 용건 전달식으로 변경
'AI 코딩 교육 TIL' 카테고리의 다른 글
2024-05-28 AI 코딩 TIL (0) | 2024.05.28 |
---|---|
2024-05-27 AI 코딩 TIL (0) | 2024.05.27 |
2024-05-23 AI 코딩 TI (0) | 2024.05.23 |
2024-05-22 AI 코딩 TIL (0) | 2024.05.22 |
2024-05-21 AI 코딩 TIL (0) | 2024.05.21 |