리셋 되지 말자

csapi 프로젝트 (6) - 이미지 업로드 기능 추가 본문

프로젝트

csapi 프로젝트 (6) - 이미지 업로드 기능 추가

kyeongjun-dev 2023. 9. 6. 00:07
https://not-to-be-reset.tistory.com/343 글에 작성한 대로, 모델 다운로드 링크가 만료되고 코드가 동작하지 않아서 다시 포스팅 합니다.
단일 인스턴스 부터 쿠버네티스 클러스터까지 확장해 나가려고 합니다.

개발환경

2023. 7. 22 기준 wsl 윈도우에서 진행

github 주소

https://github.com/kyeongjun-dev/csapi

커밋 : https://github.com/kyeongjun-dev/csapi/tree/76b27eef60226948edab1506343200ef4cd2e6ad


템플릿 및 api 추가

먼저 csapi/config/settings.py에 template 디렉토리를 추가합니다.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

 

csapi/config/urls.py를 아래와 같이 수정합니다. 브라우저에서 /api 경로로 접속하면,run_api 함수가 실행되도록 합니다.

from django.contrib import admin
from django.urls import path
from csapi import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index, name='index'),
    path('api/', views.run_api, name='run_api'),
]

 

csapi/django/views.py를 아래와 같이 수정합니다. csapi/config/urls.py에 지정한 /api 경로로 접속 시, run_api 함수가 실행되도록 합니다. run_api 함수는 GET 요청시, index 함수와 동일하게 index.html을 리턴하고, POST 요청일 경우에는 다른 동작을 합니다. 여기서는 단순히 업로드된 파일의 이름, 크기, 타입(확장자)을 출력한 뒤 테스트용 이미지를 celery로 처리하도록 합니다.

from django.shortcuts import render
from django.http import HttpResponse
from celery import shared_task
from .tasks import api
# Create your views here.

def index(request):
    return render(request, 'index.html')

def run_api(request):
    if request.method == 'GET':
        return render(request, 'index.html')
    elif request.method == 'POST' and request.FILES['image']:
        uploaded_file = request.FILES['image']
        file_name = uploaded_file.name
        file_size = uploaded_file.size
        file_content_type = uploaded_file.content_type
        print(file_name, file_size, file_content_type)
        print(api.delay('test_input.png'))
        return HttpResponse(api.delay('test_input.png'))

 

이제 최상단 csapi 디렉토리 하단에 templates 디렉토리를 생성한 뒤, index.html을 아래와 같이 작성합니다.

<html>
    <head>

    </head>
    <body>
        <h1> hello world </h1>
        {% block content %}
        <form action="{% url 'run_api' %}" method="post" enctype="multipart/form-data">
            {% csrf_token %}
            <input type="file" name="image">
            <button type="submit" class="btn btn-primary">업로드</button>
        </form>
        {% endblock %}
    </body>
</html>

 

서비스 포트 수정

본 글을 작성할 당시, windows WSL 환경에서 8000번 포트에 에러가 아래와같이 발생하여 docker-compose.yml 파일의 django 서비스 포트를 8080으로 변경하였습니다.

[+] Running 4/4
 ✔ Network csapi_default     Created                                                                                                                                                                                                    0.6s 
 ✔ Container csapi-django-1  Created                                                                                                                                                                                                    0.1s 
 ✔ Container csapi-worker-1  Created                                                                                                                                                                                                    0.1s 
 ✔ Container csapi-rabbit-1  Created                                                                                                                                                                                                    0.1s 
Attaching to csapi-django-1, csapi-rabbit-1, csapi-worker-1
Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:8000 -> 0.0.0.0:0: listen tcp 0.0.0.0:8000: bind: An attempt was made to access a socket in a way forbidden by its access permissions

 

변경한 docker-compose.yml 파일은 아래와 같습니다.

version: "3"
services:
  django:
    build:
      context: ./django
    command: python manage.py runserver 0.0.0.0:8080
    ports:
      - "8080:8080"

  worker:
    build:
      context: ./celery
    command: celery -A csapi.tasks worker --loglevel=info --max-tasks-per-child 1 -c 1

  rabbit:
    image: rabbitmq:3-management
    expose:
      - "5672"
    ports:
      - "15672:15672"
    environment:
      - RABBITMQ_DEFAULT_USER=guest
      - RABBITMQ_DEFAULT_PASS=guest

이미지 업로드 기능 테스트

docker-compose up --build 명령어로 새롭게 작성한 코드를 적용시킨 뒤, localhost:8080으로 접속하면 아래와 같은 화면을 확인할 수 있습니다.

 

실제로 이미지를 업로드 하면, docker compose up 명령어를 실행한 창에서 아래와 같은 로그를 확인할 수 있습니다.

csapi-django-1  | input.png 369213 image/png
csapi-rabbit-1  | 2023-09-05 15:04:39.058126+00:00 [info] <0.845.0> accepting AMQP connection <0.845.0> (172.19.0.4:37970 -> 172.19.0.3:5672)
csapi-rabbit-1  | 2023-09-05 15:04:39.060404+00:00 [info] <0.845.0> connection <0.845.0> (172.19.0.4:37970 -> 172.19.0.3:5672): user 'guest' authenticated and granted access to vhost '/'
csapi-django-1  | 21cdcf4d-b808-4f89-95b5-02df3f598820
csapi-worker-1  | [2023-09-05 15:04:39,076: INFO/MainProcess] Task csapi.tasks.api[21cdcf4d-b808-4f89-95b5-02df3f598820] received
csapi-django-1  | [05/Sep/2023 15:04:39] "POST /api/ HTTP/1.1" 200 36

 

Comments