기술블로그-Django편

🧩 Django의 request 객체 쉽게 이해하기 (왜 첫 번째 인자?)

Chansman 2025. 5. 14. 11:30

🧩 Django의 request 객체 쉽게 이해하기


✅ 1. request는 누가 주는 걸까? 첫 번째 인자

우리는 def home_view(request):라고 작성하지만,
이 request는 우리가 만든 게 아니라 Django가 만들어서 넣어주는 것입니다.

즉, 사용자가 웹사이트에 접속하거나 버튼을 누를 때 Django가 자동으로 요청 정보를 분석해서 담아준 객체예요.


✅ 2. 왜 꼭 첫 번째 인자로 써야 할까?

Django는 사용자의 요청이 들어오면:

브라우저 → 서버(Django) → 요청을 분석해서 request 객체 생성 → view 함수 호출할 때 넘김

그래서 view 함수의 첫 번째 매개변수로 무조건 request를 넣어줘야 합니다.

def home_view(request):  # ← 필수
    print(request.method)  # 예: 'GET'

✅ 3. request 안에는 뭐가 들어있을까?

속성 설명 예시

request.method 어떤 요청인지 'GET', 'POST' 등
request.GET 주소 뒤 ?로 온 데이터 /search?q=django → request.GET['q'] → 'django'
request.POST 폼 입력값 <input>으로 전송된 내용
request.body 원시 데이터 (JSON 등) REST API 요청 처리 시 사용
request.user 로그인한 사용자 객체 인증이 필요한 페이지에서 유용
request.path 요청한 주소 경로 예: '/articles/5/'

✅ 4. 실제 사용 예시

def contact_view(request):
    if request.method == "POST":
        name = request.POST.get("name")
        message = request.POST.get("message")
        print(f"{name}님의 메시지: {message}")
    return render(request, "contact.html")
  • 사용자가 이름과 메시지를 보내면 request.POST로 값을 읽음
  • 이후 DB 저장, 이메일 전송 등 처리 가능

✅ 5. 한 줄 요약

request는 Django가 자동으로 넘겨주는 사용자 요청 정보 상자입니다 🎁

우리는 그 안에 든 걸 꺼내서 어떤 요청인지 확인하고, 응답을 만들어주는 역할을 합니다.


✅ 6. 더 궁금하다면 직접 들여다보자!

print(request)              # 전체 요약 정보
print(request.__dict__)    # 내부 구조까지 확인 가능

📌 예시 출력:

<WSGIRequest: GET '/articles/3/'>
{
  '_read_started': False,
  'resolver_match': ResolverMatch(func=<function article_detail>, args=(), kwargs={'article_id': '3'}, url_name='article_detail', ...),
  'path': '/articles/3/',
  'method': 'GET',
  'GET': <QueryDict: {}>,
  'POST': <QueryDict: {}>,
  'user': <User: anonymous>,
  ...
}

📌 요청에 어떤 속성이 들어있는지 직접 출력해서 확인하면 실력 향상에 큰 도움이 됩니다.


✅ 7. Class-Based View에서는?

함수형 뷰는 request를 첫 번째 인자로 받지만, 클래스 기반 뷰에서는 **self.request**로 사용합니다.

from django.views import View
from django.http import HttpResponse

class HelloView(View):
    def get(self, request):
        user_agent = self.request.headers.get("User-Agent")
        return HttpResponse(f"당신의 브라우저는 {user_agent}입니다")

✔️ 클래스 뷰 내부에서는 self.request를 통해 동일한 요청 정보를 다룹니다.


이제 request 객체가 훨씬 친숙해졌죠? 😎
Class-Based View나 API 처리 흐름까지 이어서 보고 싶다면 말씀해주세요!