기존 FastAPI는 사용해 보았다. 가장 많이 사용하는 python 백엔드 프레임워크 Django를 익히자
설치
python -m pip install Django
확인
python -m django --version
이후 작업을 이어나갈 폴더로 들어가서
django-admin startproject mysite
그러면 기본으로 사용할 폴더, 파일들이 만들어진다.
file:mysite/ 프로젝트의 모든 파일을 담는곳 파일명 변경가능
manage.py: 커맨드라인의 유틸리티 입니다.
mysite/ 실제 Python 패키지들이 저장됩니다. 이 디렉토리 내의 이름을 이용하여, (mysite.urls 와 같은 식으로) 프로젝트의 어디서나 Python 패키지들을 임포트할 수 있습니다.
mysite/init.py: Python으로 하여금 이 디렉토리를 패키지처럼 다루라고 알려주는 용도의 단순한 빈 파일입니다.
mysite/settings.py: 현재 Django 프로젝트의 환경 및 구성을 저장합니다.
mysite/urls.py: 현재 Django project 의 URL 선언을 저장합니다. Django 로 작성된 사이트의 “목차” 라고 할 수 있습니다.
mysite/asgi.py: 현재 프로젝트를 서비스하기 위한 ASGI-호환 웹 서버의 진입점입니다.
mysite/wsgi.py: 현재 프로젝트를 서비스하기 위한 WSGI 호환 웹 서버의 진입점입니다.
여기서 asgi, wsgi의 차이를 알려주자면
WSGI
- WSGI는 Web Server Gateway Interface의 약자입니다.
- CGI의 가장 큰 단점은 요청이 들어올 때마다 새로운 프로세스를 생성한다는 점 이런 단점을 보완하기 위해서 고안된 개념입니다.
- 앞서서 설명한 CGI의 경우에는 요청에 대한 정보를 환경 변수나 STDIN 등으로 처리했지만 WSGI에서는 Callable object, 함수나 객체로 처리합니다.
- 서버에서 Callable object를 통해서 요청에 대한 정보와 Callback 함수를 전달하면 애플리케이션은 이 요청을 처리하고 Callback 함수를 실행합니다.
- 이런 인터페이스를 구현하는 서버나 어플리케이션을 WSGI compatible 하다고 하는데요, 그 중 특히 어플리케이션의 경우에는 WSGI application이라고 합니다.
- 이 중간에서 인증이나 쿠키 등을 관리하는 역할을 하는 것을 WSGI Middleware라고 하는데요, 이 또한 WSGI application의 일종입니다.
ASGI
- WSGI의 경우에는 비동기적인 요청 처리에 단점이 있었습니다. 하나의 동기적인 callable이 요청을 받아 응답을 리턴하는 방식이었는데, 이런 방식은 길게 유지되어야 하는 연결 - long-poll HTTP나 웹 소켓에는 적합하지 않았습니다.
- ASGI는 이를 개선하기 위해 만들어졌습니다. ASGI 공식 설명을 보면 “ASGI는 WSGI의 정신적 계승자입니다. 파이썬 웹 서버, 프레임워크, 어플리케이션 사이에 비동기적인 표준 인터페이스를 제공합니다.
- WSGI가 파이썬 앱에 대한 동기성에 대한 표준을 제공했다면 ASGI는 동기성과 비동기성 모두에 대한 표준을 제공합니다”라고 되어 있는데요. ASGI는 곧 WSGI에 대한 호환성을 가지면서 비동기적인 요청을 처리할 수 있는 인터페이스입니다.
그럼 Django 공식홈페이지의 튜토리얼을 따라 진행한다.
튜토리얼은 polls라는 투표와 관련된 사이트, 백엔드를 제작한다. 이를 대신해 기존에 제작했던 kidney.gg사이트의 백엔드를 구성하도록하겠다.
views.py를 다음처럼 구성한다.
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("안녕하세요 서버입니다.")
그후 연결할 urls.py를 같은 폴더에 생성한다.
현재 폴더구조
polls/
init.py
admin.py
apps.py
migrations/
init.py
models.py
tests.py
urls.py
views.py
polls/urls.py파일을 다음처럼 설정하고
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
]
mysite/urls.py는 다음처럼 설정한다.
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("polls/", include("polls.urls")),
path("admin/", admin.site.urls),
]
공식 설명을 보면 include() 함수는 다른 URLconf들을 참조할 수 있도록 도와줍니다. 즉 mysite로 들어와 polls로 들어가면 이전의 부분은 지우고 polls에게 요청한 부분만 남는다.
또 URL패턴을 만들때는 항상 include를 써야합니다.
path()함수는 필수인수 route,view 선택인수 kwargs, name 4개의 인수를 가질 수 있습니다.
4개의 인수를 설명하면
1. route : URL에서 도메인을 제외한 나머지 부분입니다. https://www.example.com/myapp/라면 myapp만 신경씁니다. 뒤에 파라메터가 붙어도 마찬가지입니다.
2. view : 위에서 찾은 경로로 부터 올바른 view를 호출합니다.
3. 임의의 키워드를 dict형으로 전달합니다.
4. 다른 모든곳에서 사용할 이름을 만들어주어 이후에 변경에 유연하게 대처하도록합니다.
먼저 mysqlclient를 설치하고 mysite/settings.py 파일을 열어 DB설정을 변경합니다(mysql기준)
pip install mysqlclient
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "DB이름",
"USER": "사용자이름",
"PASSWORD": "비밀번호",
"HOST": "호스트주소",
"PORT": "포트"
}
}
위와 같이 설정한다.
또 위에서 타임존을 설정한다(한국시간기준으로)
이후 DB에 데이블을 미리 생성한다.
python manage.py migrate
만약 이미 table가 설정되어있다면 --fake-initial옵션을 통해 건너뜁니다(물론 스키마가 일치해야함)
/pollos/models.py를 수정해준다.
각각의 의미를 생각하자면 ChaeField는 문자열 필드(max_lenght필수)를, DateTimeField는 시간을 나타낸다. 또 관계설정은 ForeignKey를 통해 이룬다. 아래예제는 Question과 연결했으며 1:1, 1:n, n:m모두 지원합니다.
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)
위는 예제에 나온 모델이고 내 사이트에 사용하던 데이터베이스를 만들어 보자
위처럼 데이터베이스의 모델을 미리 만들어도되고 다른 방법으로는 연결된 DB로 부터 모델을 불러오는 것이다.
아래 명령어를 이용해서 특정위치로 DB에서 모델을 불러올 수 있다.
python manage.py inspectdb > kideny/models.py
!혹여나 null, is not package 오류가 나는 경우 vscode아래의 utf-8설정을 잘확인하자
https://lionontheshore.tistory.com/77
!혹여나2 이미 있는 DB접근이라 오류가 난다면 --fake옵션을 붙여서 진행하자
그후 아래 명령어를 통해서 접속 가능한 관리자를 하나 만들고
python manage.py createsuperuser
polls/admin.py 폴더를 아래처럼 수정해서 모델에 관한 권한을 부여한다.
from django.contrib import admin
from .models import Question
admin.site.register(Question)