3차 프로젝트 | 25.02.04 (화) 기록

Faithful Dev·2025년 2월 4일
0

.ipynb To .py

AI 파트에서 넘겨준 ipynb 파일 Django에 통합하기.

환경 설정 관리

env = environ.Env()
environ.Env.read_env(env_file="/.env")

AZURE_OPENAI_ENDPOINT = env("AZURE_OPENAI_ENDPOINT")
AZURE_OPENAI_API_KEY = env("AZURE_OPENAI_API_KEY")

team6/settings.py

# Django의 settings.py로 이동
AZURE_OPENAI_ENDPOINT = env("AZURE_OPENAI_ENDPOINT")
AZURE_OPENAI_API_KEY = env("AZURE_OPENAI_API_KEY")
AZURE_OPENAI_API_VERSION = env("AZURE_OPENAI_API_VERSION")

GPT-4 프롬프트 생성 함수

def generate_prompt_with_gpt4o(user_input):
    assistant = GPT_CLIENT.beta.assistants.create(
        model="gpt-4o-mini",
        instructions="""...""",
        temperature=0.7,
    )
    thread = GPT_CLIENT.beta.threads.create()
    # ... threads API 사용

ai_playground/views.py

def generate_prompt_with_gpt4o(user_input):
    response = GPT_CLIENT.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "You are an assistant..."},
            {"role": "user", "content": user_input}
        ],
        temperature=0.7,
    )
    # chat completions API 사용으로 변경

DALL-E 이미지 생성 함수

def test_dalle_response(prompt):
    result = DALLE_CLIENT.images.generate(
        model="dall-e-3",
        prompt=prompt,
        n=1,
    )

ai_playground/views.py

def generate_image_with_dalle(prompt):
    result = DALLE_CLIENT.images.generate(
        model="dall-e-3",
        prompt=prompt,
        n=1,
    )
    # 기본 로직은 유지되었지만, Django 모델에 저장하는 부분 추가

데이터 저장

# 파일로 저장
def save_image(image_url, prompt):
    os.makedirs("images", exist_ok=True)
    filename = os.path.join("images", f"{sanitized_filename}.png")

ai_playground/models.py & ai_playground/views.py

# 데이터베이스에 저장하도록 변경
class AIImageGeneration(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    prompt = models.TextField()
    generated_prompt = models.TextField()
    image_url = models.URLField(max_length=1000)

메인 실행 로직

def main():
    user_input = input("이미지 생성 아이디어를 입력하세요: ")
    prompt = generate_prompt_with_gpt4o(user_input)
    image_url = generate_image_with_dalle(prompt)

ai_playground/views.py

@login_required
def generate_image(request):
    if request.method == "POST":
        user_input = request.POST.get("prompt", "").strip()
        generated_prompt = generate_prompt_with_gpt4o(user_input)
        image_url = generate_image_with_dalle(generated_prompt)
        
        # 데이터베이스에 저장
        AIImageGeneration.objects.create(
            user=request.user,
            prompt=user_input,
            generated_prompt=generated_prompt,
            image_url=image_url
        )

정리

  1. 스크립트 형태에서 Django 앱 구조로 변경
  2. 파일 저장 대신 데이터베이스 저장 방식 채택
  3. 콘솔 입력 대신 웹 폼으로 입력 받도록 변경
  4. Azure OpenAI API 호출 방식 최신화 (threads API → chat completions API)
  5. 사용자 인증 및 권한 관리 추가

AIPlayground와 메인 앱 통합 과정

  • 기존에 분리되어있던 AI 이미지 생성 기능(ai_playground)을 메인 앱으로 통합
  • URL 구조 개선 및 코드 정리

모델 통합

app/models.py에 AI 이미지 생성 모델 통합:

class AIGeneration(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    prompt = models.TextField()
    generated_prompt = models.TextField()
    image_url = models.URLField(max_length=1000)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at']

Post 모델에 user 필드 추가

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    content = models.TextField()
    # ... 기타 필드

AI 이미지 생성 뷰

@login_required
def generate_ai_image(request):
    context = {}
    if request.method == "POST":
        prompt = request.POST.get("prompt", "").strip()
        if prompt:
            try:
                # GPT로 프롬프트 생성
                response = GPT_CLIENT.chat.completions.create(...)
                generated_prompt = response.choices[0].message.content.strip()
                
                # DALL-E로 이미지 생성
                result = DALLE_CLIENT.images.generate(...)
                image_url = result.data[0].url
                
                # 결과 저장
                AIGeneration.objects.create(
                    user=request.user,
                    prompt=prompt,
                    generated_prompt=generated_prompt,
                    image_url=image_url
                )
                
                context.update({
                    'image_url': image_url,
                    'generated_prompt': generated_prompt
                })
                
            except Exception as e:
                context['error'] = str(e)
    
    return render(request, "app/generate_image.html", context)

URL 패턴 정리

urlpatterns = [
    path("", views.index, name="index"),
    path("posts/new/", views.create_post, name="create_post"),
    path("posts/<int:pk>/", views.post_detail, name="post_detail"),
    path("posts/<int:pk>/edit/", views.edit_post, name="edit_post"),
    path("posts/<int:pk>/delete/", views.delete_post, name="delete_post"),
    path("ai/generate/", views.generate_ai_image, name="generate_ai_image"),
]

작업 과정에서 발생했던 이슈들,,,

Post 모델 마이그레이션 이슈

  • user 필드 추가 시 기존 데이터 처리 필요
  • 마이그레이션 시 기존 NULL 값을 관리자 계정으로 설정하여 해결

URL 패턴 변경

  • 하드코딩된 URL을 named URL 방식으로 변경
  • 템플릿의 모든 URL을 {% url %} 태그로 수정

템플릿 위치 조정

  • ai_playground의 템플릿을 app으로 이동
  • 재이님 작업하기 편하시도록 최소한 기능만 구현해두기
profile
Turning Vision into Reality.

0개의 댓글