[django] urls.py, views.py

yoon1ee·2021년 1월 30일
0

서버와 통신 준비

httpie

http client utility로 http 개발과 디버깅 용도로 사용하며, json을 지원. 설치확인은 terminal에서 http 입력

brew intall httpie


>```
http [flags] [method] url [item [item]]

flags: 실행시 전달할 옵션으로 --로 시작 e.g. --json

method: default GET

ifconfig
내 ip 주소 확인

http [method] [ip address]

추후에 terminal에서 _http GET..._ 으로 url 에 request를 날림.

참고 링크


통신할 웹페이지 만들기

urls.py 파일들의 관계

사용자가 메인 주소를 입력할 때(e.g. www.naver.com) http client가 처음 도착하는 곳은 프로젝트 폴더 (settings.py가 위치한)의 urls.py이다.

www.naver.com/account 나 www.naver.com/shopping 등과 같은 1차 파생 url들은 모두 여기 urls.py에서 redirect 된다.

이 폴더에서 1차 이후의 추가 파생 url을 모두 관리하기는 복잡해지므로(e.g. naver.com/shopping/outlet, naver.com/shopping/cart 등), 1차 파생 url 이후의 url을 관리 할 'app'폴더를 생성해줌.

이 app폴더들은 프로젝트 폴더에서 아래의 명령어로 생성된 하위폴더들이다. (e.g. account, shopping 등)

django-admin startapp [app 이름]

생성된 각각의 app폴더는 urls.py파일을 갖게되는데, 이 파일안에서 추가 파생 url을 관리하게된다 (e.g. www.naver.com/shopping/outlet).


우선, www.naver.com에서 www.naver.com/shopping 으로 넘어가는 과정을 작성해보자.

작업환경에서 보면,
프로젝트 메인폴더(settings.py가 위치한 곳)에서 shopping 이라는 하위 폴더(app)으로 redirection 해주는게 메인폴더의 urls.py이고, path와 include 모듈이 사용됨.

<urls.py (main)>

from django.urls import path, include

urlpatterns = [
path('client가 입력한 도착지', include('redirect할 곳')

]


(example)

www.naver.com/shopping 의 경우,
www.naver.com까지는 main urls.py에서 처리가 되고, 이 파일에서 설정된 대로 /shopping은 shopping앱의 urls.py로 redirect.

<urls.py (main)>

from django.urls import path, include

urlpatterns = [
	path('shopping', include(shopping.urls')),
]

shopping/urls.py는 redirection 받은 최종 목적지이므로, path에는 더이상 주소가 없이 공백, ''. 그리고 보여질 데이터는 views.py에 작성하고 이곳에서 연동.

아래에서 WhatToDisplay는 shopping/views.py에서 선언한 class 중, 해당 url에서 client에게 보여줄 class.

<urls.py (shopping)>

from django.urls import path, inlcude

from .views import WhatToDisplay


urlpatterns = [
	path('', WhatToDisplay.as_view())
]

www.naver.com/shopping/cart 와 같이 추가 하위경로를 설정한다면, urlpatterns 안에 path지정시 반드시 '/'를 포함하여야 한다.

urlpatterns = [
	path('/cart', AnotherViewsClass.as_view())
]

참고)

WhatToDisplay.as_view()에서 as_view()가 request type에 맞게 요청을 보내줌 (eg. get, post etc). 이 as_view()는 views.py에서 선언한 class안의 method. 하지만 직접 작성한 것이 아닌, from django.views import View 에서 상속받은 method. views.py에서 class 선언시 WhatToDisplay(View) 작성으로 사용이 가능해짐.




해당 url (www.naver.com/shopping)에 도착시 보여줄 파일은 shopping 앱 안의 views.py에 작성.

<views.py (shopping)>

from django.views import View
from django.http import JsonReponse

class WhatToDisplay(View):
    #POST
    def post(self, request):
    
    return Jsonresponse({"message: "성공"}, status=200)

http request 대응

위의 views.py (shopping/views.py)에서 http client가 request를 보낼때 각각 어떤 대응을 할 것인지 작성.

post = 데이터 등록
get = 데이터 가져오기

patch = 부분 수정
put = 전체 수정
(실제로는 post로 대체해서 사용하는 경우가 있음)
.
.

restful API

한 get, post 등 request를 각각 다른 url로 작성하지 않고 (e.g. www.naver.com/shopping/get) request의 타입이 다른한, 하나의 url안에서 가능하도록 class로 묶어서 나타내는 것을 _restful한 API_라고 함.

즉 www.naver.com/shopping url에서 보여줄 shopping.views.py 안에, WhatToDisplay(예)와 같이 한 클래스 안에 get, post, delete 등의 여러 통신 종류를 넣은 것을 가리킴.

단, 한 클래스 안에 같은 타입의 request가 두번 들어갈 수 없으므로, client 의 request에 따라 보여져야 할 데이터가 다르다면 새로운 class를 만들거나, 추가적 url 페이지 생성이 필요.

<views.py (shopping)>

from django.views import View
from django.http import JsonReponse

class WhatToDisplay(View):
def get(self, request):
.
.

def post(self, request):
.
.
return Jsonresponse({"message: "성공"}, status=200)

0개의 댓글