
DEBUG=False, ALLOWED_HOSTS, SECRET_KEY를 환경변수로python manage.py collectstaticDjango는 기본적으로 웹 서버와 Django 앱을 연결하는 ‘인터페이스’가 필요한데, 그 표준이 WSGI 또는 ASGI이다.
| 구분 | WSGI (Web Server Gateway Interface) | ASGI (Asynchronous Server Gateway Interface) |
|---|---|---|
| 지원 방식 | 동기(Synchronous) 요청 처리 | 비동기(Asynchronous) + 동기 모두 지원 |
| 특징 | 전통적인 HTTP 요청-응답 처리에 적합 | WebSocket, HTTP/2, 실시간 처리 가능 |
| Django 버전 | 3.0 이전은 WSGI만 지원 | 3.0 이후 ASGI 공식 지원 |
| 예시 | gunicorn + Django | uvicorn/daphne + Django |
동기 방식:
비동기 방식:
ASGI 서버 실행기
Django(ASGI)나 FastAPI 같은 비동기 프레임워크에서 사용
가볍고 빠름 (uvloop, httptools 기반)
uvicorn myproject.asgi:application --host 0.0.0.0 --port 8000
WSGI 서버 실행기
주로 Flask/Django(WSGI 모드)에서 사용
비동기 지원 불가 → 하지만 uvicorn 워커와 함께 쓰면 ASGI 앱도 실행 가능
gunicorn myproject.asgi:application -k uvicorn.workers.UvicornWorker
흐름 예시
사용자 브라우저 → Nginx → uvicorn/gunicorn → Django
[사용자 브라우저]
↓
(HTTP/HTTPS)
↓
[Nginx] ← 정적 파일(css/js) 직접 처리
↓
[gunicorn -k uvicorn.workers.UvicornWorker]
↓
[Django ASGI/WSGI 앱]
↓
[데이터베이스, 캐시 서버 등]
REST API = HTTP를 기반으로 한 서버-클라이언트 간의 데이터 통신 규칙으로 웹에서 자원을 정의하고, 그 자원에 대한 주소(URL)를 통해 상태를 주고받는 아키텍처 스타일이다.
1) 자원(Resource): URL로 자원을 식별
예) `/users` → 사용자 목록, `/users/1` → ID가 1인 사용자
2) 행위(Verb): HTTP 메서드로 동작 구분
- GET → 데이터 조회
- POST → 데이터 생성
- PUT/PATCH → 데이터 수정
- DELETE → 데이터 삭제
3) 표현(Representation): JSON, XML 등 데이터 형태로 응답
요청
GET /users/1 HTTP/1.1
Host: example.com
응답 (JSON)
{
"id": 1,
"name": "500",
"email": "500@example.com"
}
pip install djangorestframework
settings.pyINSTALLED_APPS += ['rest_framework']
# blog/serializers.py
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = "__all__"
# blog/api.py
from rest_framework.viewsets import ModelViewSet
from .models import Post
from .serializers import PostSerializer
class PostViewSet(ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
# config/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from blog.api import PostViewSet
router = DefaultRouter()
router.register("posts", PostViewSet)
urlpatterns = [
path("admin/", admin.site.urls),
path("api/", include(router.urls)),
]