Post

Django 프로젝트로 챗봇 기능 만들기 - Part 1

Django를 사용하여 챗봇 기능을 포함한 프로젝트를 만드는 방법을 단계별로 설명합니다.

Django 프로젝트로 챗봇 기능 만들기 - Part 1

이번 글에서는 Django를 사용해 챗봇 기능을 포함한 프로젝트를 만드는 과정을 다룹니다.

1. 프로젝트 파일 생성

1
2
mkdir LLM_practice02
cd LLM_practice02

2. 가상환경 생성 및 활성화 (Windows bash 기준)

1
2
python -m venv gpt_env
source gpt_env/Scripts/activate

3. 필요한 패키지 설치

아래 명령어를 사용해 필요한 패키지를 설치합니다.

1
2
3
pip install openai==0.28
pip install python-dotenv
pip install django==4.2

설치된 패키지는 requirements.txt에 저장합니다.

1
pip freeze > requirements.txt

4. Django 프로젝트 및 앱 생성

Django 프로젝트와 앱을 생성합니다.

1
2
3
4
5
django-admin startproject gpt_project01 .
django-admin startapp core
django-admin startapp accounts
django-admin startapp posts
django-admin startapp chatbot

5. 앱 등록하기

생성한 앱들을 INSTALLED_APPS에 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'accounts',
    'posts',
    'core',
    'chatbot',
]

6. URL 구성하기

프로젝트와 각 앱의 URL 패턴을 설정합니다.

프로젝트 URL

1
2
3
4
5
6
7
8
9
10
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('core.urls')),
    path('accounts/', include('accounts.urls')),
    path('posts/', include('posts.urls')),
    path('chatbot/', include('chatbot.urls')),
]

앱별 URL 예시

core

1
2
3
4
5
6
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

accounts

1
2
3
4
5
6
7
8
9
10
from django.urls import path
from . import views

app_name = 'accounts'

urlpatterns = [
    path('signup/', views.SignupView.as_view(), name='signup'),
    path('login/', views.LoginView.as_view(), name='login'),
    path('logout/', views.LogoutView.as_view(), name='logout'),
]

posts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from django.urls import path
from . import views

app_name = 'posts'

urlpatterns = [
    path('post-list/', views.PostListView.as_view(), name='post_list'),
    path('post-create/', views.PostCreateView.as_view(), name='post_create'),
    path('post-detail/<int:pk>/', views.PostDetailView.as_view(), name='post_detail'),
    path('post-update/<int:pk>/', views.PostUpdateView.as_view(), name='post_update'),
    path('post-delete/<int:pk>/', views.PostDeleteView.as_view(), name='post_delete'),
    path('post-like/<int:pk>/', views.PostLikeToggleView.as_view(), name='post_like_toggle'),
    path('comment-update/<int:pk>/', views.CommentUpdateView.as_view(), name='comment_update'),
    path('comment-delete/<int:pk>/', views.CommentDeleteView.as_view(), name='comment_delete'),
]

7. 커스텀 유저 모델 정의 및 설정

Django의 기본 유저 모델을 커스터마이징합니다.

설정

1
2
3
4
5
LOGIN_URL = 'accounts:login'
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'

AUTH_USER_MODEL = 'accounts.user'

모델 정의

1
2
3
4
5
from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

8. 주요 모델 설계

PostComment 모델

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from django.conf import settings
from django.db import models

class TimestampedModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

class Post(TimestampedModel):
    title = models.CharField(max_length=50)
    content = models.TextField()
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True
    )
    likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='liked_posts', blank=True)

    def __str__(self):
        return self.title

    def total_likes(self):
        return self.likes.count()

class Comment(TimestampedModel):
    post = models.ForeignKey('Post', related_name='comments', on_delete=models.CASCADE)
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True
    )
    content = models.TextField()

    def __str__(self):
        return f"{self.author.username if self.author else '알 수 없는 사용자'} - {self.content[:20]}"

ChatMessage 모델

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from django.db import models
from django.conf import settings

class ChatMessage(models.Model):
    user_input = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True
    )
    user_text = models.TextField(null=True, blank=True)
    bot_response = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"User: {self.user_text} | Bot: {self.bot_response}"

9. 마이그레이션

모델을 데이터베이스에 반영합니다.

1
2
python manage.py makemigrations
python manage.py migrate
This post is licensed under CC BY 4.0 by the author.