
파이썬 장고 프레임웍을 사용해서 API 서버 만들기(1)
파이썬을 설치한 후 cmd창을 통해 진행한다.
py -m venv project-name
기존에 프로젝트 폴더가 존재하지 않았던 경우에는 설정한 프로젝트 이름에 따라 새롭게 폴더가 생성된다.
project-name\Scripts\activate.bat
py -m pip install Django
mysite라는 프로젝트를 생성한다.
django-admin startproject mysite
python manage.py runserver
실행한 서버로 가보자
python manage.py startapp polls
polls가 생긴 것을 볼 수 있다.
웹 서버가 페이지를 내리려면 url이 필요하다. 존재하지 않는 url을 요청하게 되면 에러가 나는 것을 볼 수 있다.
장고 서버에게 url을 가르쳐보자.
mysite의 urls.py를 보면 url 패턴을 가지는 것을 알 수 있다.
(admin/이라는 패턴이 들어오면 그 뒤로 보내라)
이와 같이 polls에 urls.py를 만들어보자
from django.urls import path
urlpatterns = [
path('',views.index, name='index')
]
이렇게 정의된 polls에 정의되어 있고 아직 mysite에서 작동될 수 있도록 설정하지 않았다. 그러므로 mysite의 urls.py을 다음과 같이 수정한다.
from django.contrib import admin
from django.urls import path, include #include 사용을 위해
urlpatterns = [
path("admin/", admin.site.urls),
path("polls/", include('polls.urls'))
]
또한 polls의 urls.py에서 아무것도 입력되지 않으면 views.index에서 처리하도록 되어 있으므로 이번에는 polls의 views.py에서 views.index를 만들자.
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world.")
이번에는 polls의 urls.py에서 views를 이용할 수 있도록 다음과 같이 고쳐주자
from django.urls import path
from . import views
urlpatterns = [
path('',views.index, name='index')
]
웹페이지는 DB의 정보를 읽어서 화면에 표시하게 된다. 장고에서는 모델이 이런 역할을 해 DB를 테이블별로 읽어서 테이블에 저장된 값을 코드로 읽을 수 있게 해준다.
다음의 절차를 통해 간단한 설문에 답을 하는 모델을 만들어보자.
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
질문 내용과 질문을 생성한 날짜로 이루어진 Question 모델과 선택지와 받은 투표 수로 이루어진 Choice 모델을 만들었다.
마이그레이션을 만드는 장고의 기능은 설치된 앱에 만들기 때문에 settings.py에 INSTALLED_APPS에 polls를 추가한다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls.apps.PollsConfig',
]
cmd 창을 열어 migration 파일을 생성하자
python manage.py makemigrations polls
python manage.py sqlmigrate polls 0001
python manage.py migrate
admin 페이지 : 일반적으로 시스템을 관리하는 관리자들이 데이터를 추가하거나 수정하는 페이지
python manage.py createsuperuser
위에서 urls.py에 아래와 같은 코드를 봤을 것이다.
path("admin/", admin.site.urls)
url 뒤에 admin을 붙이면 접속이 가능하다.
admin.site.register()를 이용해서 모델을 등록할 수 있다.
from django.contrib import admin
from .models import *
#Register your models here
admin.site.register(Question)
admin.site.register(Choice)
def __str__(self)을 이용해서 우리에게 보여지는 글자를 바꿀 수 있다.
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return f'제목: {self.question_text}, 날짜: {self.pub_date}'
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
python manage.py shell
>>> from polls.models import *
>>> Question
>>> Question.objects.all()
>>> Choice.objects.all()
>>> choice = Choice.objects.all()[0]
# 각 필드에 접근 가능
>>> choice.id
>>> choice.choice_text
>>> choice.votes
# question이 ForeignKey로 정의 되어 있어 접근 가능
>>> choice.question
>>> choice.question.pub_date
>>> choice.question.id
>>> question.choice_set.all()
datetime을 활용하여 현재 날짜와 시간 구하기>>> from datetime import datetime
>>> datetime.now()
timezone을 활용하여 현재 날짜와 시간구하기>>> from django.utils import timezone
>>> timezone.now()
>>> from polls.models import *
#"커피 vs 녹차" 라는 내용의 새로운 Question 오브젝트를 생성하고 'q1'이라는 변수에 저장하기
>>> q1 = Question(question_text = "커피 vs 녹차")
#tiemzone을 활용하여 새로운 오브젝트 'q1'의 생성시각을 설정하기
>>> from django.utils import timezone
>>> q1.pub_date = timezone.now()
#새로운 Question 오브젝트 'q1'을 데이터베이스에 저장하기
>>> q1.save()
>>> q3 = Question(question_text = "abc")
>>> q3.pub_date = timezone.now()
>>> q3.save()
>
#create() 메서드를 활용하여 q3와 연결된 새로운 Choice 오브젝트를 생성하고, choice_text 필드에 값을 넣어주기
>>> q3.choice_set.create(choice_text = "b")
#새로운 Choice 오브젝트를 생성하고 question 필드에 q3 값을 넣어 연결하기
>>> choice_c = Choice(choice_text='c', question=q3)
#새로운 Choice 오브젝트를 데이터베이스에 저장하기
>>> choice_c.save()
>>> from polls.models import *
#Question 오브젝트 중 가장 마지막으로 만들어진 것을 가져오기
>>> q = Question.objects.last()
#해당 오브젝트의 question_text에 새로운 내용을 더해 수정하기
>>> q.question_text = q.question_text + '???'
#Choice 오브젝트 중 가장 마지막으로 만들어진 것을 가져오기
>>> choice = Question.objects.last()
#해당 오브젝트에 연결된 Question을 통해서 choice set을 가져오기
>>> choice.queston.choice_set.all()
#해당 오브젝트를 삭제하기
>>> choice.delete()
get() : 조건에 해당하는 오브젝트 하나를 필터링model.objects.get(condition)
filter() : 조건에 해당하는 오브젝트를 모두 필터링model.objects.filter(condition)
https://docs.djangoproject.com/en/4.2/ref/models/querysets/ 의 오른쪽에 Field lookups에서 필터링에 사용되는 조건들을 볼 수 있다.