Django | how to write view.py

gemma. K·2020년 11월 2일

views.py란

views.py 파일은 장고 앱의 핵심이다. models.py 파일은 database와의 연결을 의미한다면 views.py는 프론트(클라이언트)로 들어온 데이터를 CRUD(Create, Read, Update, Delete)하여 데이터 베이스에 반영 그리고 프론트의 요청에 직접적으로 응답하는 직접적인 기능을 담당한다.

views.py 파일을 작성하기 전에

  • 서버 구동
  • 프론트에게 요청을 받았음을 가정
  • urls.py가 작성

서버는 반드시 구동 되어야 프론트의 요청을 받을 수 있다. urls.py 파일은 manage.py가 있는 프로젝트 최상단 디렉토리에 작성하면 된다. urls.py은 각 프로젝트, 앱들 마다 각각 하나 씩 존재한다. 그러나 최상단 urls.py 파일은 프론트의 요청에 어떤 앱, 어떤 로직(views.py 안의)이 실행되어야 하는지 가리켜 주는 역할을 한다.

turn on server

manage.py 파일이 있는 project 최상단 디렉토리에서 실행

$ python manage.py runserver

request from Client

프론트가 없는 경우, 서버 개발자는 앱의 로직이 제대로 실행되는지 알기 어렵다. 그렇기에 httppie를 통해 서버에 요청을 보내고 로직이 에러 없이 제대로 작동하는지 확인 가능하다.

httpie 설치

$ brew install httpie

서버 요청

$ http GET(혹은 POST) localhost:8000/경로(ex. 앱명)

urls.py 작성

프로젝트 디렉토리(프로젝트 디렉토리 내의 프로젝트 명과 같은 디렉토리) 내에서 urls.py 파일을 만든다. urls.py 파일은 서버에 요청이 오면 제일 먼저 반응해 어떤 앱의 views 파일로 연결해 줄지를 결정하는 일종의 길잡이 역할이다. 아래 코드는 django의 urls.py 파일의 내장함수인 path, include라는 함수를 임포트 해온 후, path 함수를 통해 해당 앱을 향한 경로(url)면 include 함수 내의 경로(앱의 urls.py 파일)로 진입하도록 한다는 뜻이다.

from django.urls import path, include

urlpatterns = [
	path(‘앱명’, include(‘앱명.urls’))

app 내의 urls.py 작성

프로젝트 자체의 urls.py 파일 작성이 완료 되었다면 다음으로는 app 디렉토리의 urls.py 파일 작성이 필요하다. 먼저 path 함수를 장고에서 임포트하고, 앱 디렉토리의 views.py 파일에서 클래스를 임포트 해 온다. path('')은 경로(url)를 의미하고, as_view() 함수는 views.py의 해당 클래스로 방향을 만들어 준다.

as_view()

클래스의 인스턴스를 생성하여 url의 경로를 설정한다.

from django.urls import path
from .views import <views.py의 클래스명>

urlpatterns = [
	path(‘’, <views.py의 클래스명>.as_view())
]

app 내의 views.py 작성

json

Javascript Object Notation의 약자로 JS 문법에 맞춰 데이터를 파싱하고, 전달하는 포맷

View

djanogo의 views 모듈에서의 class View

HttpResponse

class HttpRequest, 페이지가 로드될 때 요청에 대한 메타데이터를 담을 객체를 생성하는 class

JsonResponse

HttpResponse의 subclass로 json 파일로 인코딩된 reponse를 응답해 주는 class

json.loads()

클라이어트에서 응답 받은 json 포맷 데이터를 파이썬이 읽을 수 있도록 데이터를 전환하는 메소드

Model.objects.create()

데이터 베이스에 있는 Model의 테이블에 로우를 추가하는 query문

import json
from django.views import View
from django.http import JsonResponse, HttpResponse
from .models import Menu, Category

class CategoryView(View):
    def get(self, request):
    	result = []
    	categories = Category.objects.all()
        for category in categories:
        	result.append({'id': category.id, 'name': category.name})
       	return JsonResponse({'result': result}, status: 200)
        
    def post(self, request):
    	data = json.loads(request.body)
        Menu.objects.create(name=data['name'])
        
        return JsonResponse({'message':'SUCCESS',status=201})

class CategoryView에는 GET, POST 요청에 따라 두 가지의 함수가 들어간다.

결과

서버를 켜고, httpie를 통해 클라이언트 측 요청이 들어 왔음을 가정한다.

서버 연결

$ python manage.py runserver

GET

서버 요청

$ http GET localhost:8000/경로(ex. 앱명)

응답

200 OK로 통신이 성공 했음을 보여준다.

HTTP/1.1 200 OK
Content-Length: 856
Content-Type: application/json
Date: Tue, 03 Nov 2020 04:27:37 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.8.5
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "result": [
        {
            "id": 1,
            "name": "콜드브루 커피"
        },
        {
            "id": 2,
            "name": "브루드 커피"
        },
        {
            "id": 3,
            "name": "에스프레소"
        }
     ]
 }

POST

서버 요청

$ http POST localhost:8000/경로(ex. 앱명) name = '주류'

응답

HTTP/1.1 201 Created
Content-Length: 22
Content-Type: application/json
Date: Tue, 03 Nov 2020 08:11:10 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.8.5
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "message": "SUCCESS"
}

Table of Database

음료, 푸드가 저장 되어 있던 menu 테이블에 name이 '주류'인 새로운 데이터 로우가 생성되었다.

mysql> select * from menu;
+----+--------+
| id | name   |
+----+--------+
|  1 | 음료    |
|  2 | 푸드    |
|  3 | 주류    |
+----+--------+

0개의 댓글