Wecode #9 TIL Django - Project 따라하기#1

황인용·2019년 12월 17일
0

wecode TIL

목록 보기
9/12

main project 만들기

Django framwork를 통해 'main' 이라는 project 초기 설정을 하고, server를 running하여 server동작 과정을 확인한다
그리고 view에서 post 및 get 기능을 추가하여, httpie를 활용하여 해당기능을 확인한다.

1. 개발환경, 가상환경 구축

project이름과 연관있는 'main'이라는 디렉토리를 만든다

$ pwd
/home/inyong/develop
$ mkdir main
$ cd main
$ pwd
/home/inyong/develop/main

project를 만들 가상환경을 만든다

(base)$ conda create -n pango python=3.7
(pango)$ conda env list
# conda environments:
#
base                  *  /home/inyong/miniconda3
pango                    /home/inyong/miniconda3/envs/pango

project마다 사용하는 패키지들이 다를 수 있음으로 project에 맞는 가상환경을 활성화하고, 필요에 따라 패키지를 설치 및 적용하여 project를 만들어간다

main project

우리가 이번 'main' project를 구성하고자 하는 내용은 다음과 같다

main
├── views.py
└── migrations
|   └── __init__.py
├── models.py
├── settings.py
├── urls.py
db.sqlite3.py

2. django-admin startproject

기존에 만든 project를 만들어갈 디렉토리에서 django로 project를 시작하고 초기 구성을 한다

(pango)$ pwd
/home/inyong/develop/main
(pango)$ django-admin startproject main .
(pango)$ pwd
/home/inyong/develop
(pango)$ ls
manage.py  main

project명 뒤 '.'은 현재 명령어를 실행하는 디렉토리에서 프로젝트를 시작한다는 의미이다.
만약 '.'옵션이 없을 경우 project명으로 하위 디렉토리를 만들고 그 디렉토리에서 project를 시작한다.

(pango)$ django-admin startproject main 
(pango)$ pwd
/home/inyong/develop/main
(pango)$ ls
main
(pango)$ cd main
(pango)$ ls
manage.py main

Django url mapping - urls.py

Django의 url mapping에 앞서 url에 대해 간단하게 알아보면,
'url'은 흔히 말하는 web site의 주소로서, IP또는 DNS(Domain Name System)기반으로 표시되어있으며, 해당되는 페이지로 넘어갈 대 url주소를 확인하여 넘어간다.

마찬가지로 Django내에서 Web service를 제공하는데 url를 넘기기 전에 main페이지와 각 app들과 url를 mapping해주는 기능을 django ulrs.py에서 지원한다.
app들이 다양해지고 app하위에 또다른 기능들이 생기면 main urls.py에서 모든 url를 mapping하지 않고 하위 app urls.py에 각 기능에 대한 url를 위탁할 수 있다.

3. main/urls.py

from django.urls import path # django.urls에 path 가져오기
from main.views  import MainView # main.views 에서 MainView class 가져오기

urlpatterns = [
    path('', MainView.as_view()) # '': 결로가 ''일때, MainView class에 as_view()함수를 실행 => http method가 get인지 post인지 delete인지 update인지등을 판별하여 함수를 실행 
]

Django View - views.py

Django에서의 뷰(View)는 다른 일반 MVC Framework에서 말하는 Controller와 비슷한 역할 을 한다. 즉, View는 필요한 데이터를 모델(model)에서 가져와서 적절히 가공하여 웹페이지 결과를 만들도록 컨트롤하는 역할을 한다.
Django 에서는 Views.py를 View기능을 정의한다.
예를 들어 Views.py에서 Front-End 에서 오는 HTTP Request를 입력 parameter로 받아들이고, HTTP Response를 return해주는 View를 만들수있다.

4. main/Views.py

import json # json데이터를 처리하기 위해 import
from django.views import View # django.views에서 View 가져오기
from django.http  import JsonResponse # django.http에서 서버의 요청에 대한 응답을 Json으로 응답하기 위해 JsonResponse 가져오기


class MainView(View): # MainView Class Django에 내장되어 있는 class
    def get(self, request): # class View 에 내장된 get method 
		    return JsonResponse({"Hello":"World"}, status=200) # 요청받는 것에 대한 응답을 JsonResponse로 보냄

Django model - models.py

Models.py는 모델링과 관련된 모듈파일이다.
따라서 models.py는 Database를 모델링하고 데이터를 관리하는데, ORM(Object Relational Mapping)을 사용하여 효과적으로 Database를 관리한다.
ORM이란 Database의 Data와 object field를 Mapping하는 의미이다.
데이터를 저장하기 위해서는 Database가 필요한데, Django에서는 기본적으로 SQLite3를 가지고 있다.

그렇다면 User정보(name, email, password)를 담는 테이블 관리하는 models.py를 만든다면...

5. main/models.py

from django.db import models # django.db에서 models를 가져오기


class Users(models.Model): # Users 라는 class 생성
    name       = models.CharField(max_length = 50) # 50자 제한 name 생성
    email      = models.CharField(max_length = 50) # 50자 제한 email 생성
    password   = models.CharField(max_length = 300) # 50자 제한 password 생성
    created_at = models.DateTimeField(auto_now_add = True) # data 최초 생성일자 
    updated_at = models.DateTimeField(auto_now = True) # data 수정일자

Django Migration - python migrate

model에서 Database와의 mapping 내용을 models.py를 정의 또는 수정하고 반드시 진행해야할 사항이 migrate 이다. models.py는 단순 database와 django간의 modeling과 mapping 구조만 정의할 뿐 실질적인 mapping이 이루어지지 않았기 때문이다. 따라서 django의 model과 database 같의 mapping이 실질적으로 이루어 지기 위해서는 migrate를 진행하여야 한다.

6. python makemigrations

해당 app모델의 변경사항 체크하고 해당내용을 ''이라는 파일에 저장한다.

(pango)$  python manage.py makemigrations <filename>

7. python migrate

변경사항이 포함된 파일을 migration적용한다.

(pango)$ python manage.py migrate <filename> 

8. Run Server

[@reqplit]
결과 : request를 받은 서버가 JsonResponse로 Json내용({"Hello":"World"}) 출력

image.png

[@bash]

(pango)$ python manage.py runserver

Httpie

Httpie는 HTTP methode를 전송할수 있는 프로그램이다

  • httpie 설치
sudo apt install httpie
Performing system checks...

System check identified no issues (0 silenced).
  
October 26, 2018 - 07:06:30
Django version 2.1.2, using settings 'main.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.  

9. httpie 테스트

(base)$ http -v '레플릿 과제 결과창의 주소복사'

결과

image.png

10. 다시 main/Views.py 의 GET Method 수정

   def get(self, request):
        user_data = Users.objects.values()
		    return JsonResponse({'users':list(user_data)}, status=200) # JsonResponse로 서버가 받는 내용(user_data)를 list로 return
      ```

## 11. httie post

```bash
(base)$ http -v '레플릿 과제 결과창의 주소복사' name=pjh email=aaa@naver.com password=1234

결과

image.png

profile
dev_pang의 pang.log

0개의 댓글