'll Hacker

[WIL] 1주차, Django 기본 이해 및 환경설정 본문

Dev/GDSC

[WIL] 1주차, Django 기본 이해 및 환경설정

씨이오가 되자 2024. 9. 20. 15:03
728x90

Django의 장점

  1. splite라는 경량 데이터베이스 내장
  2. admin 페이지 제공
  3. 환경적 요소 및 지속가능성
  4. 미리 제공되는 User model
  5. 쉬운 커스텀 템플릿 작성
  6. 파이썬 커뮤니티에 이어 활성화되어 있는 자체 커뮤니티

Django의 단점

  1. 많은 서비스를 자체 내장하고 있음
  2. 페이지나 서비스를 처음부터 설계해야할 때는 적합하지 않음
  3. 파이썬 기반 프레임워크 → 실행 시간이 비교적 많이 걸림
  4. ORM을 기반으로 하기에 DB 관련 작업 시 원하는 결과가 나오지 않을 때도 있음

라이브러리 vs 프레임워크

프레임워크는 개발자가 소프트웨어를 개발함에 있어 코드를 구현하는 개발 시간을 줄이고, 코드의 재사용성을 증가시키기 위해 일련의 클래스 묶음이나 뼈대, 틀을 라이브러리 형태로 제공됨

라이브러리는 개발자가 만든 클래스들의 나열로, 다른 프로그램들에서 사용할 수 있도록 제공하는 방식

라이브러리와 프레임워크의 차이는 제어 흐름에 대한 주도성이 누구에게 / 어디에게 있는가에 있다.

즉, 애플리케이션의 흐름을 누가 쥐고 있느냐에 달려있음.

프레임워크는 그 스스로 제어 흐름의 주도성을 갖는 반면, 라이브러리개발자가 가지고 있음.

프레임워크 ⊃ 라이브러리

출처:https://sharonprogress.tistory.com/169


Django 설치 전 해야할 일! → 가상환경 셋팅 먼저

가상환경이 무엇인가?

프로젝트마다 독립적인 환경을 만들기 위한 도구

이를 통해 각 프로젝트가 사용하는 패키지와 Python 버전 등을 분리가능하고, 충돌을 방지.

또한, 다른 프로젝트와 패키지나 버전이 겹치지 않도록 환경을 관리하는데 유용.

설치 방법
python -m venv myenv
가상환경 실행
source myenv/Scripts/activate(Windows)
source myenv/bin/activate(MacOS or Linux)

 

이제 Django 설치할 차례!

  1. 가상환경에 django 설치
    # pip install django
  2. django 프로젝트 시작
    # django-admin startproject myProject
  3. 만든 프로젝트 디렉터리로 이동
    # cd myProject
  4. 앱-User, Article 등 생성
    # python manage.py startapp myApp

여기까지 이론을 살펴봤고 이제 적용을 해보겠음

폴더를 만들어서 vscode로 열기

그래서 가상환경 먼저 설치

가상환경 설치

가상환경 실행

가상환경 실행

 

그 다음, 가상환경에 Django 설치!

설치 끝.

 

django 프로젝트 시작!

안에 있는 파일들을 알아보았다.(https://docs.djangoproject.com/ko/5.1/intro/tutorial01/)
manage.py : Django 프로젝트와 다양한 방법으로 상호작용하는 커맨드라인의 유틸리티.
myProject/ : 디렉터리 내부에는 프로젝트를 위한 실제 Python 패키지들이 저장이 됨.
이 디렉터리 내의 이름을 이용하여 프로젝트의 어디서나 Python 패키지들을 임포트가능
myProject/__init__.py : Python으로 하여금 이 디렉터리를 패키지처럼 다루라고 알려주는 용도의 단순한 빈 파일이다.
mysite/settings.py : 현재 Django 프로젝트의 환경 및 구성을 저장
mysite/urls.py : 현재 Django project의 URL 선언을 저장
Django로 작성된 사이트의 "목차"라고 할 수 있음
mysite/asgi.py : 현재 프로젝트를 서비스하기 위한 ASGI 호환 웹 서버의 진입점
mysite/wsgi.py : 현재 프로젝트를 서비스하기 위한 WSGI 호환 웹 서버의 진입점 

 

💡WSGI이란?

Web Server Gateway Interface

파이썬 스크립트가 웹 서버와 통신하기 위해 만들어진 인터페이스로 CGI의 일종.

CGI는 서버와 어플리케이션 간에 데이터를 주고받는 방식 또는 규율

위 이미지는 python web app을 MVT 패턴과 같이 뷰가 동시에 적용되는 프레임워크를 사용한다고 가정했을 때의 모습이다.

WSGI는 CGI와 동일하게 웹 서버와 애플리케이션 중간에 위치하는데, CGI와 다른 점은 CGI는 매 요청마다 프로세스를 생성한다는 점이고, WSGI는 한 프로세스에서 모든 요청을 받음.

CGI는 매 요청마다 Fork 등의 함수를 통해 커널 리소스를 추가 및 반납하고

WSGI는 많은 요청을 콜백으로 받아 처리

동기식 코드만 지원하고, HTTP 스타일이고 request/response 형식에 고정되어 있음(단일처리만 가능한 동기호출 방식)

HTTP는 Connection이 짧게 유지되는 특성을 가지고 있어서 Long-Polling HTTP와 Web socket과 같이 상대적으로 connection이 긴 특성을 지닌 프로토콜과는 맞지 않음

 

 

WSGI의 두 가지 방법

  1. Nginx, Apache에서 내장 모듈로 제공하는 server-often high profile 방식 (ex: mod-wsgi, mod-python 등)
  2. python 코드로 작성된 Web app server (ex: gunicorn, uvicorn, cherrypy 등)

WSGI는 웹서버와 애플리케이션 사이에 미들웨어 역할!!!

 

💡ASGI이란?

python에서 asyncio, coroutine과 같은 비동기 처리를 지원

하지만 WSGI만으로는 한계가 있음. 그래서 ASGI를 사용

대표적인 ASGI web app은 uvicorn이 있음(내장 모듈로 uvloop을 사용)

ASGI는 python기반으로 C++언어로 작성되어 있음. 매우 빠른 속도를 제공, libuv를 사용해서 비동기 처리 

send/receive로 되어 있어서 비동기적으로 이벤트 처리가 가능하여 여러 송수신 이벤트가 가능하다.

WSGI의 상위 집합으로 설계되어있으며 asgiref 라이브러리를 통해 ASGI 서버 내에서 WSGI를 실행가능

django 3.0부터 Channels 기능을 제공(ASGI 기반)

 

만든 프로젝트 디렉터리로 이동해서 앱-User, Article 등 생성

 

끝끝.


MVT 패턴

M odel - 데이터베이스와의 상호작용을 관리

데이터 구조와 비즈니스 로직을 정의

Django ORM을 통해 데이터를 쉽게 조회, 저장, 업데이트가 가능해짐

DBMS같은 역할?

V iew - 클라이언트의 요청을 받아 필요한 데이터를 처리하고, 응답을 준비

Model에서 데이터를 가져와서 Template에 전달하여 최종 응답을 생성

클라이언트와 서버에 중간다리역할?

T emplate - 사용자에게 보여질 HTML 파일을 담당

Vew에서 전달된 데이터를 시각적으로 표현

Django의 템플릿 언어를 사용해서 동적으로 데이터를 표시 가능

화면에 보이는 것?

구조도


웹 서버

웹 서버란?

정적 콘텐츠를 실행해주거나 클라이언트의 요청을 WAS로 전달해주는 역할

 

WAS이란?

Web Application Server는 동적인 데이터를 처리하는 응용 프로그램을 처리하는 서버 비즈니스 로직(로그인, 데이터 처리 등)을 처리하고 데이터베이스와 상호작용하여 동적인 데이터 생성

웹서버보다 복잡한 로직을 담당하며, 사용자의 요청에 따라 실시간으로 처리된 결과를 반환

 

 

Django는 웹 프레임워크일 뿐이라서 작동하기 위해 웹서버가 필요하는데, 대부분 기본적으로 파이썬을 사용하지 않는다. 그래서 그 사이에 커뮤니케이션을 이루어질 인터페이스가 필요하다. 그 인터페이스는 WSGI와 ASGI이다.

서버 구동
python manage.py runserver

 

 


User Model 만들기

User model

  • Username(필수) : 150자 이하(영숫자, _ , @, +, . , - 포함가능)
  • First name(선택) : 150자 이하
  • last name(선택) : 150자 이하
  • email(선택) : 150자 이하
  • ...

 

User Manager : User model을 커스텀해야할 때 사용하는 메서드

  • create_user( ) : 일반 사용자 생성 커스터마이징
  • create_superuser( ) : 관리자 생성 커스터마이징 

User Model 의 상속 관계

1. AbstractBaseUser : 가장 기본적인 User model 

 - ID, password 제공

2. AbstractUser : User model의 필드를 모두 사용가능, 필요한 기능만 추가가능

3. User : Email, username, password, last_login 등 usermodel에 필요한 거의 모든 필드를 정의

 

Customizing 안하는 경우에는 view.py에다가 설정

 

Cutomizing하는 경우에는 model.py, admin.py, settings.py 설정

나는 Cutomizing하는 경우로 선택해서 해보겠음

 

migrate

서버구동할 때에 어떤 오류가 있었는데 마이그레이션이 있다는 뜻이었다.

마이그레이션은 데이터베이스에 적용시켜야 하는 변화에 대한 기록을 의미하므로

새 프로젝트를 생성할 때 데이터베이스에 기본적으로 필요한 테이블을 미리 만들어두기 때문에 새로운 프로젝트를 생성했을 때 적용해야 할 마이그레이션이 존재한다.

(출처:https://dduniverse.tistory.com/entry/Django-%EC%9E%A5%EA%B3%A0-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98)

그 마이그레이션들을 적용 및 적용해제하는 명령어가 migrate이다.

마이그레이션은 모델에 적용한 변경 내용을 기반으로 새로운 마이그레이션 파일들을 만든다.

 

makemigrations vs migrate

- makemigrations는 장고에서 제공하는 모델의 변경사항들을 감지하고 기록하는 역할.

- migrate 는 그러한 기록된 파일들과 설정값들을 읽어서 그 변경사항을 DB에 저장하는 역할.

(출처:https://velog.io/@yejin20/Djangomakemigrations%EC%99%80-migrate%EC%9D%98-%EC%B0%A8%EC%9D%B4)

마이그레이션을 생성
python manage.py makemigrations myapp

app이름을 입력하지 않아도 실행가능하지만 의도하지 않은 마이그레이션이 생길 수 있으므로 app이름을 입력하기 권장

실제 DB에 변경사항을 적용
python manage.py migrate myapp

app이름 뒤에 마이그레이션 파일의 이름을 지정하면 해당 번호(버전)의 마이그레이션을 적용하는 것이 가능

 

그럼 적용해보자..!

$ python manage.py makemigrations myApp
Traceback (most recent call last):
  File "C:\gdsc\day1\myenv\Lib\site-packages\django\apps\registry.py", line 158, in get_app_config
    return self.app_configs[app_label]
           ~~~~~~~~~~~~~~~~^^^^^^^^^^^
KeyError: 'myApp'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\gdsc\day1\myenv\Lib\site-packages\django\contrib\auth\__init__.py", line 188, in get_user_model
    return django_apps.get_model(settings.AUTH_USER_MODEL, require_ready=False)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\gdsc\day1\myenv\Lib\site-packages\django\apps\registry.py", line 208, in get_model
    app_config = self.get_app_config(app_label)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\gdsc\day1\myenv\Lib\site-packages\django\apps\registry.py", line 165, in get_app_config
    raise LookupError(message)
LookupError: No installed app with label 'myApp'.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\gdsc\day1\myProject\manage.py", line 22, in <module>
    main()
  File "C:\gdsc\day1\myProject\manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:\gdsc\day1\myenv\Lib\site-packages\django\core\management\__init__.py", line 442, in execute_from_command_line
    utility.execute()
  File "C:\gdsc\day1\myenv\Lib\site-packages\django\core\management\__init__.py", line 416, in execute
    django.setup()
  File "C:\gdsc\day1\myenv\Lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\gdsc\day1\myenv\Lib\site-packages\django\apps\registry.py", line 124, in populate
    app_config.ready()
  File "C:\gdsc\day1\myenv\Lib\site-packages\django\contrib\admin\apps.py", line 27, in ready
    self.module.autodiscover()
  File "C:\gdsc\day1\myenv\Lib\site-packages\django\contrib\admin\__init__.py", line 52, in autodiscover
_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 929, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 994, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "C:\gdsc\day1\myenv\Lib\site-packages\django\contrib\auth\admin.py", line 6, in <module>
    from django.contrib.auth.forms import (
  File "C:\gdsc\day1\myenv\Lib\site-packages\django\contrib\auth\forms.py", line 19, in <module>
    UserModel = get_user_model()
                ^^^^^^^^^^^^^^^^
  File "C:\gdsc\day1\myenv\Lib\site-packages\django\contrib\auth\__init__.py", line 194, in get_user_model
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'myApp.UserModel' that has not been installed
(myenv)

읭???? 오류남...

오류를 봤더니

settings.py 파일에서 AUTH_USER_MODEL 설정이 잘못되어있어서 발생한 것 같다.

이렇게 포함시켜주면 됨 

끝끝.

superuser 생성

 


의문이 드는 생각들 🤔🤔🤔

1. 근데 왜 powersell이랑 cmd에서는 가상환경 실행이 안될까?

 


✏️모르는 용어 정리

동기식 코드 : 위에서 아래로 내려오면서 코드 실행

순차적 진행으로 한 작업이 시작되면 해당 작업이 완료될 때까지 다른 작업은 기다려야함

동기 방식은 호출한 함수 또는 작업이 반환될 때까지 대기하는 동안 실행 흐름이 차단되는 특징

비동기 코드 : 작업이 독립적으로 실행

작업의 완료 여부를 기다리지 않고 다른 작업을 실행할 수 있는 방식을 의미

작업이 시작되면 해당 작업이 완료될 때까지 기다리지 않고 다음 코드를 실행

주로 I/O 작업이나 네트워크 요청과 같이 시간이 오래 걸리는 작업에 유용

이러한 작업을 비동기적으로 처리하면, 프로그램은 작업이 완료되기를 기다리는 동안 다른 작업을 처리가능

콜백, 프라미스, async/await 등의 메커니즘을 통해 구현 

출처:https://won-percent.tistory.com/150

 

 

 

 

 

'Dev > GDSC' 카테고리의 다른 글

[WIL] 2주차, Django의 MVT 아키텍처 이해  (0) 2024.09.27
gdsc ewha 합격 후기  (1) 2024.09.10