TIL - 04/06 - Django part2

Sung Jun Jin·2020년 4월 6일
0

TIL

목록 보기
12/25
post-custom-banner

Django Replit 최대한 안보고 따라하기 part2

Views.py 작성

  1 import json
  2 
  3 from django.http import HttpResponse,JsonResponse
  4 from django.views import View
  5 from .models import User
  6 
  7 # Class형 View를 앞으로 계속 사용
  8 
  9 class MainView(View) :
 10 
 11     def get(self,request) :
 12 
 13         user_data = User.objects.values()
 14         return JsonResponse({'users':list(user_data)}, status=200)
 15 
 16 
 17     def post(self,request) :
 18 
 19         
 20         user_data = json.loads(request.body)
 21 
 22         User (
 23 
 24             name = user_data['name'],
 25             password = user_data['password'],
 26             email = user_data['email']
 27         ).save()
 28 
 29 
 30         return JsonResponse({"message":"OK"},status=200)

GET 메소드는 저장된 사용자들의 데이터 리스트를 JsonResponse로 반환한다. JsonResponse는 서버 요청에 JSON으로 응답하기 위해 사용된다. 별 이상이 없는 경우 GET 메소드를 호출하면 다음과 같은 Response가 올 것이다.

$ http -v localhost:8000/user

GET /user HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: localhost:8000
User-Agent: HTTPie/0.9.8

HTTP/1.1 200 OK
Content-Length: 321
Content-Type: application/json
Date: Mon, 06 Apr 2020 01:37:39 GMT
Server: WSGIServer/0.2 CPython/3.8.2
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "users": [
        {
            "email": "test@test.net",
            "id": 1,
            "name": "jsj",
            "password": "123412314"
        }
     ]
}     

Post 메소드는 입력받은 사용자의 정보(name,password,email)를 User 객체에 저장해준다. 정상적으로 POST 메소드를 호출하면 다음과 같은 Response가 온다.

$ http -v localhost:8000/user name=velog password=velog1234 email=velog@test.net

POST /user HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 69
Content-Type: application/json
Host: localhost:8000
User-Agent: HTTPie/0.9.8

{
    "email": "velog@test.net",
    "name": "velog",
    "password": "velog1234"
}

HTTP/1.1 200 OK
Content-Length: 17
Content-Type: application/json
Date: Mon, 06 Apr 2020 06:39:37 GMT
Server: WSGIServer/0.2 CPython/3.8.2
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "message": "OK"
}

물론 성공적인 200 response를 받기 위해서는 미리 urls.py 작업을 해줘야 하지만 흐름상 urls.py부분은 밑에 정리해봤다.

앞으로 장고를 사용하면서 함수 기반 View대신 클래스기반 View를 사용할 예정이다. 클래스기반 View에 대해 알아보자

(CBV, Class-Based View)

View는 request를 받고 response를 반환한다. Django에서는 Python의 Class를 View로 사용할 수 있다. CBV의 장점은 GET,POST 조건문의 활용없이 처리할 수 있고, 상속, mixin(다중상속)을 활용해 뷰를 체계적으로 구성할 수 있다.

CBV 사용 가이드라인

  • 뷰는 간단 명료해야 한다.
  • 뷰 코드의 양은 적으면 적을수록 좋다.
  • 뷰 안에서 같은 코드를 반복적으로 사용하지 않는다.
  • 뷰는 프레젠테이션 로직에서 관리하고 비즈니스 로직은 모델에서 처리한다. 매우 특별한 경우에만 폼에서 처리한다.
  • 403, 404, 500 에러 핸들링에는 CBV를 이용하지 않고 FBV를 이용한다.
  • 믹스인은 간단명료해야 한다.

따라서 위와 같이 MainView 클래스를 만들어 내장된 GET,POST 메소드를 정의하면 Django에서 상황에 맞게 호출하여 사용할 수 있다.

urls.py 작성

이제 model과 view를 작성해줬으면 url을 연동해야 한다. urls.py를 편집해 Django가 여태까지 만들어두었던 model과 view를 찾을수 있게 해주자. 그러기 위해선 두 군데의 urls.py를 편집해야 한다.

1.user App의 urls.py

먼저 user App에 urls.py를 생성한다

$ vim urls.py

test02/user/urls.py

from django.urls import path
from .views import MainView

urlpatterns = [
    # https:localhost:8000/user                          
    path('', MainView.as_view()) # as_view() GET, POST를 자동으로 Routing 해준다

]
  • 우선 Django의 url를 처리하기 위한 모듈을 import 해준다. 장고는 URLconf (URL configuration) 모듈을 사용한다. 이 모듈은 순수 Python코드로 이루어져 있고 Python 함수들과 URL path를 매핑해준다.

  • 그리고 앞서 작성했단 users/views.py를 import 해준다

  • Django에서 경로를 명시할때 항상 'urlpatterns'와 같은 리스트 안에 경로를 저장하고 읽어들인다.

  • as.view() 함수는 현재 주소를 호출하면 그 호출을 한 http 메소드가 GET인지 POST인지 DELETE인지 UPDATE인지 등을 판별해서 그에 맞는 함수를 실행시켜준다.

  • 현재 MainView의 요청을 받기 위한 user App에 url은 기본적으로 https:localhost:8000/user이다. 만약 url patterns를 다음과 같이 바꾸면 https:localhost/8000/user/mainview 요청에서 MainView의 메소드들이 실행될 것이다.

urlpatterns = [
    # https:localhost:8000/user/mainview                          
    path('/mainview', MainView.as_view())

]

2.user의 urls.py

전체적인 프로젝트의 urls.py를 편집해 새로만든 user app과 라우팅을 해줘야 한다.

from django.urls import path,include

# 전체 프로젝트에 대한 URL

urlpatterns = [
#   'https:localhost:8000/user
	path('user', include('user.urls'))
]

위에서 만든 user app의 urls.py를 include() 함수를 사용해 가져온다.
user app에 대한 url을 'https:localhost:8000/user로 정의해준다.

profile
주니어 개발쟈🤦‍♂️
post-custom-banner

0개의 댓글