Wecode #10 TIL Django - Project 따라하기#2

황인용·2019년 12월 17일
0

wecode TIL

목록 보기
10/12

pango project만들고 user기능 추가하기

post method를 포함하는 UserView클래스와 AuthView클래스를 생성
User의 가입내용을 받고 인증을 받을 수 있는 API를 구축

1. 개발환경, 가상환경 만들기

'pango'라는 디렉토리를 만든다

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

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

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

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

2. django-admin startproject

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

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

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

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

3. python manage.py startapp

project에 추가할 기능(app)을 시작한다

(pango)$ python manage.py startapp user
(pango)$
(pango)$ tree

├── db.sqlite3
├── manage.py
├── pango
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-37.pyc
│   │   ├── settings.cpython-37.pyc
│   │   ├── urls.cpython-37.pyc
│   │   └── wsgi.cpython-37.pyc
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py 
│   └── wsgi.py
└── user
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

4. pango/setting.py 수정

개발하고자 하는 메인 project의 디렉토리에서 setting.py의 내용을 수정한다


ALLOWED_HOSTS = ['*']


# Application definition

INSTALLED_APPS = [
#    'django.contrib.admin',
#    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'user',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
#    'django.middleware.csrf.CsrfViewMiddleware',
#    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
  • ALLOWED_HOSTS
    허용하고자 하는 host
    '*' : 모든 host를 허용한다
  • INSTALLED_APPS
    django.contrib.admin과 django.conrtib.auth 는 주석처리하여 비활성화한다
    pip로 설치한 App 또는 본인이 만든 App추가한다
  • MIDDLEWARE_LCASSES
    django.middleware.csrf.CsrfViewMiddleware와 django.contrib.auth.middleware.AuthenticationMiddleware는 비활성화한다
    request와 response사이의 주요 기능 레이어(인증, 보안관련 내용을 다룸)

5. pango/urls.py

추가된 기능에 대한 urlpattern 설정을 한다
RESTful API에 의한 urlpattern을 설정한다.
기본적으로 django의 urls 파일에서 path와 include method를 불러온다.

(pango)$ vi pango/urls.py
from django.urls import path, include

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

## 6. user/urls.py 
추가한 기능에 대한 urls.py를 생성 및 작성한다
기본적으로 django의 urls파일을 가져오고 path method를 가져온다
user/models.py와 user/view.py를 구성하고 추후 관련된 urlpattern을 수정한다.
(처음에는 파일만 만들어 놓는다)
```bash
(pango)$ pwd
/home/inyong/develop/pang

(pango)$ cp pango/urls.py user/.

(pango)$ vi user/urls.py
from django.urls import path

urlpatterns = [
    ]

5. user/models.py

Database와 Django과 ORM으로 Database핸들링 할 수 있는 models.py를 생성한다.
models.py는 기본적으로 django의 db파일에서 models methode를 불러온다

(pango)$ vi user/models.py
from django.db import models 

class Users(models.Model):
    name        = models.CharField(max_length=50)
    email       = models.CharField(max_length=50)
    password    = models.CharField(max_length=300)
    created_at  = models.DateTimeField(auto_now_add = True)
    updated_at  = models.DateTimeField(auto_now = True)
    
    class Meta:
        db_table = 'users'
        ```


## 6. python manage.py makemigrations
models.py를 구성한 후에는 해당내용을 마이그레이션하고자하는 파일을 생성한다.
마이그레이션파일은 기능디렉토리에 migrate 디렉토리에 생성된다

```bash
(pango)$ python manage.py akemigrations user

마이그레이션 기록을 구별하고자 추가 옵션을 번호로 줄수 있다.

(pango)$ python manage.py akemigrations user 0001

7. python manage.py migrate user

마이그레이션파일을 불러와서 마이그레이트를 진행한다
옵션따로 없이 해당 기능만 마이그레이션을 할 경우, 최근에 작성된 마이그레이션 된부분부터 지금 변경사항만 마이그레이트를 진행한다
별도로 번호로 구별한 마이그레이션파일를 불러와 마이그레이트가능하다

$ python manage.py migrate user

8. python shell

python 쉘모드 진입할 수 있다.
쉘을 통해 Database 데이터를 확인가능하다

(pango)$ python manage.py shell
>>>
>>> from user.models import Users
>>> Users.objects.all()
>>> <QuerySet []>

Database의 Data를 제데로 핸들링하는지 확인하기 위해서는 user app폴더의 models.py로 작성한 Users클래스를 import해야한다.

특이점은 Database로 저장될때 QuerySet이라는 형태로 저장한다
쿼리셋(QuerySet)은 전달받은 모델의 객체 목록이다.

>>> Users.objects.create(name='inyong, email='email@gmail.com', password='1234')
<Users: Users object (3)>
>>>
>>> Users.objects.all()
<QuerySet [<Users: Users object (3)>]>
>>> type(Users.objects.all())
<class 'django.db.models.query.QuerySet'>
>>>
>>> Users.objects.get()
<Users: Users object (3)>
>>> type(Users.objects.get())
<class 'user.models.Users'>
>>>

Users.objects.는 Queryset 형태로 저장되어 있다.

>>> Users.objects.values()
<QuerySet [{'id': 3, 'name': 'inyongpang', 'email': 'email@gmail.com', 'password': '1234', 'created_at': datetime.datetime(2019, 12, 17, 12, 15, 42, 924806, tzinfo=<UTC>), 'updated_at': datetime.datetime(2019, 12, 17, 12, 15, 42, 924933, tzinfo=<UTC>)}]>
>>> 
>>> list(Users.objects.values())
[{'id': 3, 'name': 'inyongpang', 'email': 'email@gmail.com', 'password': '1234', 'created_at': datetime.datetime(2019, 12, 17, 12, 15, 42, 924806, tzinfo=<UTC>), 'updated_at': datetime.datetime(2019, 12, 17, 12, 15, 42, 924933, tzinfo=<UTC>)}]
>>> 
>>>Users.objects.get().name
'inyongpang'
>>> Users.objects.get().email
'email@gmail.com'
>>> Users.objects.get().password
'1234'
>>> 

각 요소의 데이터를 확인하기 위해서는 list()와 .values()를 사용하여 객체형태로 변환하여 확인가능하다
=> JSON형태로 응답시 활용

>>> Users.objects.all().delete()
(1, {'user.Users': 1})
>>> list(Users.objects.values())
[]
>>> 

때에따라서 저장된 데이터를 .delete()를 이용하여 삭제가 가능하다

>>> Users.objects.create(name='panginyong', email='1234@gmail.com', password='4321')
<Users: Users object (4)>
>>> 
>>> 
>>> list(Users.objects.values())
[{'id': 4, 'name': 'panginyong', 'email': '1234@gmail.com', 'password': '4321', 'created_at': datetime.datetime(2019, 12, 17, 13, 54, 16, 226599, tzinfo=<UTC>), 'updated_at': datetime.datetime(2019, 12, 17, 13, 54, 16, 226713, tzinfo=<UTC>)}]
>>> 

다시 데이터를 추가로 저장을하면, 기존 'ID'값은 (ex. 'ID'=3 이였던 데이터 삭제 후) 삭제되지 않고, 새로 'ID'값을 받아 데이터를 저장한다.

9. user/views.py

import json # json 파일 불러오기

from django.views import View # django.views 에서 View class 불러오기
from django.http import JsonResponse # django.http 에서 JsonResponse class 가져오기
from .models import Users # 현재폴더 models에서 Users class 가져오기


class UserView(View): # django.views 에서 View class를 parameter로 UserView라는 class 
    def post(self, request): # post method
        data = json.loads(request.body) # json의 request.body 내용 가져오기
        Users(
            name = data['name'], # request.body내용중 'name' key의 값을 name변수에 넣기
            email = data['email'], # request.body내용중 'email' key의 값을 email변수에 넣기
            password = data['password'] # request.body내용중 'password' key의 값을 password변수에 넣기
        ).save() # Users class를 통해 DB에 저장 method

        return JsonResponse({'message':'축하혀,성공이여!'}, status=200) # JsonResponse으로 성공메세지 응답


class AuthView(View):
    def post(self, request):
        data = json.loads(request.body) # json의 request.body 내용 가져오기
        user = Users.objects.get(email=data['email']) # 
        if data['password'] == user.password:
            return JsonResponse({'message':'일치함!(token나중에줄게)'}, status=200)
        else:
            return JsonResponse({'message':'패스워다 다시확인혀봐'}, status=401)

10. user/urls.py 수정

from django.urls import path
from .views import UserView, AuthView

urlpatterns = [
        path('',UserView.as_view()),
        path('/auth',AuthView.as_view())
]

11. run sever & httpie 확인

[ 서버 ]

(pango)$ python manage.py runserver
inyong@inyong-Surface-Pro:~/develop/pang$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified some issues:

WARNINGS:
?: (urls.W002) Your URL pattern '/auth' has a route beginning with a '/'. Remove this slash as it is unnecessary. If this pattern is targeted in an include(), ensure the include() pattern has a trailing '/'.

System check identified 1 issue (0 silenced).
December 17, 2019 - 14:10:09
Django version 3.0, using settings 'pango.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

[ client ]
USER정보 등록시

(pango)$ http -v localhost:8000/user name=hwang email=hiy@gmail.com password=4321
inyong@inyong-Surface-Pro:~$ http -v localhost:8000/user name=hwang email=hiy@gmail.com password=4321
POST /user HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 63
Content-Type: application/json
Host: localhost:8000
User-Agent: HTTPie/0.9.8

{
    "email": "hiy@gmail.com",
    "name": "hwang",
    "password": "4321"
}

HTTP/1.1 200 OK
Content-Length: 59
Content-Type: application/json
Date: Tue, 17 Dec 2019 14:10:55 GMT
Server: WSGIServer/0.2 CPython/3.7.4
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "message": "축하혀,성공이여!"
}

USER정보 인증시

# email과 password만 입력해도 인증됨(user/views.py UserAuthView확인)
(pango)$ http -v localhost:8000/user/auth name=hwang email=hiy@gmail.com password=1234 
POST /user/auth HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 63
Content-Type: application/json
Host: localhost:8000
User-Agent: HTTPie/0.9.8

{
    "email": "hiy@gmail.com",
    "name": "hwang",
    "password": "1234"
}

HTTP/1.1 200 OK
Content-Length: 71
Content-Type: application/json
Date: Tue, 17 Dec 2019 14:17:45 GMT
Server: WSGIServer/0.2 CPython/3.7.4
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "message": "일치함!(token나중에줄게)"
}
profile
dev_pang의 pang.log

0개의 댓글