Django설치 + Mysql연결

OkGyoung·2023년 7월 3일
0

2023.11 이전 자료

목록 보기
18/30

Python의 다양한 라이브러리를 이용해서 백엔드를 구성하기위해 Django를 사용한다

기존 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

  1. WSGI는 Web Server Gateway Interface의 약자입니다.
  2. CGI의 가장 큰 단점은 요청이 들어올 때마다 새로운 프로세스를 생성한다는 점 이런 단점을 보완하기 위해서 고안된 개념입니다.
  3. 앞서서 설명한 CGI의 경우에는 요청에 대한 정보를 환경 변수나 STDIN 등으로 처리했지만 WSGI에서는 Callable object, 함수나 객체로 처리합니다.
  4. 서버에서 Callable object를 통해서 요청에 대한 정보와 Callback 함수를 전달하면 애플리케이션은 이 요청을 처리하고 Callback 함수를 실행합니다.
  5. 이런 인터페이스를 구현하는 서버나 어플리케이션을 WSGI compatible 하다고 하는데요, 그 중 특히 어플리케이션의 경우에는 WSGI application이라고 합니다.
  6. 이 중간에서 인증이나 쿠키 등을 관리하는 역할을 하는 것을 WSGI Middleware라고 하는데요, 이 또한 WSGI application의 일종입니다.

ASGI

  1. WSGI의 경우에는 비동기적인 요청 처리에 단점이 있었습니다. 하나의 동기적인 callable이 요청을 받아 응답을 리턴하는 방식이었는데, 이런 방식은 길게 유지되어야 하는 연결 - long-poll HTTP나 웹 소켓에는 적합하지 않았습니다.
  2. ASGI는 이를 개선하기 위해 만들어졌습니다. ASGI 공식 설명을 보면 “ASGI는 WSGI의 정신적 계승자입니다. 파이썬 웹 서버, 프레임워크, 어플리케이션 사이에 비동기적인 표준 인터페이스를 제공합니다.
  3. WSGI가 파이썬 앱에 대한 동기성에 대한 표준을 제공했다면 ASGI는 동기성과 비동기성 모두에 대한 표준을 제공합니다”라고 되어 있는데요. ASGI는 곧 WSGI에 대한 호환성을 가지면서 비동기적인 요청을 처리할 수 있는 인터페이스입니다.

그럼 Django 공식홈페이지의 튜토리얼을 따라 진행한다.

python manage.py startapp polls

튜토리얼은 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. 다른 모든곳에서 사용할 이름을 만들어주어 이후에 변경에 유연하게 대처하도록합니다.


그럼 DB를 설정하겠습니다.

먼저 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)
profile
이유를 생각하는 개발자

0개의 댓글