post method를 포함하는 UserView클래스와 AuthView클래스를 생성
User의 가입내용을 받고 인증을 받을 수 있는 API를 구축
'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를 만들어간다
기존에 만든 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
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
개발하고자 하는 메인 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',
]
추가된 기능에 대한 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 = [
]
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
마이그레이션파일을 불러와서 마이그레이트를 진행한다
옵션따로 없이 해당 기능만 마이그레이션을 할 경우, 최근에 작성된 마이그레이션 된부분부터 지금 변경사항만 마이그레이트를 진행한다
별도로 번호로 구별한 마이그레이션파일를 불러와 마이그레이트가능하다
$ python manage.py migrate user
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'값을 받아 데이터를 저장한다.
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)
from django.urls import path
from .views import UserView, AuthView
urlpatterns = [
path('',UserView.as_view()),
path('/auth',AuthView.as_view())
]
[ 서버 ]
(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나중에줄게)"
}