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에 대해 알아보자
View는 request를 받고 response를 반환한다. Django에서는 Python의 Class를 View로 사용할 수 있다. CBV의 장점은 GET,POST 조건문의 활용없이 처리할 수 있고, 상속, mixin(다중상속)을 활용해 뷰를 체계적으로 구성할 수 있다.
CBV 사용 가이드라인
따라서 위와 같이 MainView 클래스를 만들어 내장된 GET,POST 메소드를 정의하면 Django에서 상황에 맞게 호출하여 사용할 수 있다.
이제 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로 정의해준다.