잊기

[python, django] django(장고) project 생성, application 개발(1) 본문

Python _ Django

[python, django] django(장고) project 생성, application 개발(1)

잊기 2023. 2. 22. 21:17

django의 app probramming

project : 전체 프로그램

application ( app ) : 모듈화된 단위 프로그램 ( react의 컴포넌트와 같음 )

=> application 이 모여서 project를 구성, 재사용하기 좋은 application 을 지향 !

MVT패턴

Model View Controller 패턴과 비슷하지만 용어를 다르게 사용 

Model View Template 

  • Model : 사용될 데이터의 정의를 담고있는 클래스 ( models.py )
               app에서 사용할 데이터베이스를 클래스로 매핑하여 코딩가능,
               모델클래스의 속성은 테이블의 컬럼에 매핑
  • View : 웹 요청을 받아 분석, 로직에 맞는 처리를 하고 결과를 HTML로 반환 ( views.py )
               함수, 클래스의 메서드 등으로 작성
  • Template : 응답받은 HTML텍스트를 해석, UI를 표시 ( *.html 확장자 _ setting.py )

URLconf

  • urls.py 파일에 URL처리함수(View)와 매핑하는 파이썬 코드를 작성 ( Urlconf / URL / 뷰매핑 )
  • urls.py - 프로젝트의 urls를 모아서 하나의 폴더로, 세부적으로 컴포턴트마다 생성해도 OK

코딩순서 ( Model - view / template )

  • 모델 : 테이블 관련사항 개발 ( models.py  admin.py )
  • URLconf : URL 및 뷰 매핑 관계 정의 ( urls.py )
  • 템플릿 : 화면 UI 개발 ( templates / 디렉토리 하위의 *.html 파일들 )
  • 뷰 : 애플리케이션 로직 개발 ( views.py )

 

이런걸 만들 예정 ( Django로 배우는 쉽고빠른 웹개발 파이썬 웹프로그래밍 中 )

project 생성

   project , application 등 생성 수정시엔 항상 cd  (: change diectory ) 해당 폴더.. 이동 후 진행))

  • django-admin startproject 폴더명 : 프로젝트 생성
    • mv 변경할(전)폴더 이름 바꿀(후)이름 : 폴더명 변경
    • chmod 777 변경할(전)폴더 : 권한없음 메세지 뜨면 폴더명 변경 권한 부여 후 다시 변경
                                                   (vs code 재실행)
  • python manage.py startapp 앱이름 : 앱 생성 ( 프로젝트 생성시 manage.py 파일이 자동 생성)
  • 프로젝트 설정 파일 변경 ( VS Code : setting.py )
# 1. 모드에 따라 ALLOWED_HOSTS 지정
# debug = true : 개발모드, false : 운영모드  (배포시 false로 변경)
DEBUG = True

# 개발모드 : default ['localhost', '127.0.0.1]로 간주
# 운영모드 : ip( 명령프롬프트 : ipconfig 에서 확인 )나 도메인 추가 지정
ALLOWED_HOSTS = ['192.168.0.204', 'localhost', '127.0.0.1']


# 2. 프로젝트에 포함되는 App들은 모두 설정파일에 등록 !!
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls.apps.PollsConfig' # 추가 생성한 앱(의 클래스) 추가기재
]


# 3. 프로젝트에 사용될 DB엔진 명시 (default : SQLite3 (내장DB))
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# 4. TIME_ZONE 지정, 'UTC' : 세계 표준 시 / 한국 시간 ('Asia/Seoul')
TIME_ZONE = 'Asia/Seoul'
  • python manage.py migrate : 기본 DB 적용, 기본 테이블 생성 (실행시 db.sqlite3 생성)
  • python manage.py runserver : 서버 실행, 확인  (서버 실행시 수정내역 바로 반영)
  • ctrl + c : 실행종료 

해당 IP로 크롬창에 띄울 수 있음

  • python manage.py createsuperuser : superuser(관리자) 생성 (admin페이지 사용권한 O)
                                                              ID / mail (null ok) / PW 입력
  • python manage.py makemigrations : DB에 변경이 필요한 사항을 추출,
                                                            (vscode 에 table 생성 후 실행) 테이블 조회 -> 파일번호 확인
  • python manage.py migrate : DB에 변경사항을 반영

테이블 조회 -> 파일번호 확인

  • python manage.py sqlmigrate polls 0001(파일 번호)

파일번호 조회 -> 테이블 내용 확인

 

프로젝트 메뉴의 구조 (migrations : DB에)

Model ( 테이블 생성, models.py )

class Question(models.Model):				# models.Model 클래스 상속
    question_text = models.CharField(max_length=200)	# columns_name , 속성(Field)정의
    pub_date = models.DateTimeField('date published')	# id를 PK로 자동 생성, 부여

    def  __str__(self):
        return self.question_text			# __str__() : 객체를 문자열로 표현하는 함수
  • Admin 반영 ( admin.py )
from django.contrib import admin
from polls.models import Question, Choice	# models.py에서 정의한 클래스 import

admin.site.register(Question)			# admin.py 에 등록,
admin.site.register(Choice)			# 수정시, models.py / admin.py 함께 수정
  • python manage.py makemigrations
  • python manage.py migrate : 데이터베이스 변경사항 반영
  • URLconf ( urls.py )
urlpatterns = [
    path('admin/', admin.site.urls),
    path('polls/', include('polls.urls'))
]

# path, admin모듈 : 장고제공, views모듈 : URL스트링 매칭시 호출되는 뷰함수
# 일정한 형식이므로 그대로 코딩, 위에서 아래로 진행하기에 순서는 주의
# path() 에서 URL 작성시 '/'를 뒤에만 붙이는것을 권장


app_name = 'polls'
urlpatterns = [
    path('', views.index,name='index'),
    	# /polls/ 매칭시, views.index(request) 함수 호출
    path('<int:question_id>/', views.detail, name='detail'),
    	# /polls/[i] 매칭시, views(request) 함수 호출
        # <> 부분이 정수(int)이면 매치, 매치된 문자열을 question_id에 할당
]

# app_name을 부여 재사용, 수정이 용이하게 사용 (권장)
# app_name 변수가 같아도 클래스가 다르므로 class1:polls , class2:polls로 구분됨 (namespace)
# name :  URL패턴별로 이름 부여, 탬플릿 파일에서 사용