장고(Django)는 웹 사이트를 쉽게 개발할 수 있도록 파이썬으로 만든 풀 스택(Full Stack) 웹 어플리케이션 프레임워크(Web Application Framework)이다. Django는 모델-뷰-컨트롤러(MVC) 패턴과 유사한 MVT(모델-뷰-템플릿) 패턴에 따라 처리한다. 파이썬 장고 웹 프레임워크로 웹사이트 만들기 예제 (프로젝트 생성 후 배포까지 해보기)장고 프로젝트 만드는 순서(파이참 기준)
■ 장고 웹 프로젝트(Bookmark) 생성, 앱(App) 생성 및 등록o 파이참(PyCharm)에서 아래 위치에 'NewProject' 생성 - Location : C:\Users\haeu\OneDrive\myDev\PyCharm\ogLap1_bookmark o Terminal 에서 장고(Django) 설치 및 프로젝트 생성하기 (venv) C:\Users\haeu\OneDrive\myDev\PyCharm\ogLap1_bookmark>pip install django (venv) C:\Users\haeu\OneDrive\myDev\PyCharm\ogLap1_bookmark>django-admin startproject config . # 생성된 config 폴더 내 파일
※ asgi.py (Asynchronous Server Gateway Interface) : o 장고 프로젝트 생성 후 서버가 정상적으로 구동하는지 확인 : runserver 명령 (서버 중지 ctrl + c) -파이참 콘솔도 가능하나 Windows 명령창(cmd)에서 runserver 구동해놓고 사용함 o 기본 DB 생성(sqlite3 db 생성(migrate)) 및 관리자 계정 생성하기 (sqlite3가 아닌 다른 RDB를 사용할 경우, db셋팅을 먼저 한 후 mirgate 및 createsuperuser 함) (venv) C:\Users\haeu\OneDrive\myDev\PyCharm\ogLap1_bookmark>python manage.py migrate (venv) C:\Users\haeu\OneDrive\myDev\PyCharm\ogLap1_bookmark>python manage.py createsuperuser
o bookmark 앱 만들기 (venv) C:\Users\haeu\OneDrive\myDev\PyCharm\ogLap1_bookmark>python manage.py startapp bookmark # bookmark 폴더 내 폴더&파일
o 장고 앱을 만들고 먼저 해줘야 할 일은 만든 앱(bookmark) srttings.py에 사용 등록 하는 것임
※ bookmark.apps.BookmarkConfig (apps.py 파일에서 BookmarkConfig 참조)
django.contrib.admin (관리용 사이트) django.contrib.auth (인증 시스템) django.contrib.contenttypes (컨텐츠 타입을 위한 프레임워크)
django.contrib.sessions (세션 프레임워크) django.contrib.messages (메시징 프레임워크) django.contrib.staticfiles (정적 파일을 관리하는 프레임워크) # 언어 & 시간 셋팅 (settings.py에서 아래처럼 수정)
■ 모델(models) 다루기모델은 데이터베이스를 객체화하고 SQL이 아닌 ORM으로 다루기 위한 것임
o 모델 작성
- 필드의 종류가 결정하는 것
- 모델을 생성하기 위해서는 i)models의 변경사항을 추적해서 기록해놓는 makemigrations 명령과 ii)데이터베이스에 적용(반영)하는 단계를 거쳐야 테이블이 생성된다. (venv) C:\Users\haeu\OneDrive\myDev\PyCharm\ogLap1_bookmark>python manage.py makemigrations bookmark ※ migrations 폴더 --> 0001_initial.py
- site_name, url 이외에 'id'를 django에서 자동으로 생성하고 별칭(verbose_name)으로 표시됨 o 모델(models)이 생성되었는지 확인하기 위해 admin.py에서 확인하기 (생성한 모델을 관리자 페이지에서 관리할 수 있도록 admin.py에 등록함)
o 모델의 클래스 인스턴스 생성시 __str__로 출력되도록 해보기
■ 뷰(views) 작성- 사용자가 웹 페이지에 접속(URL) 또는 이벤트가 발생할 때 웹 서버는 사용자 또는 이벤트(CRUD)에 반응(응답)하기 위한 페이지를 뷰에서 찾아서 동작시킨다.(즉, 응답을 위한 절차 실행) * CRUD(Create, Read, Update, Delete) - 뷰(view)에는 클래스형 뷰(제네릭 뷰), 함수형 뷰가 있는데, 이번 프로젝트에서는 클래스형 뷰(제네릭 뷰)를 이용함 - views.py
o 사용자가 특정 URL로 접속했을 때 어떤 뷰를 동작할 것인지 지정해주기(URL Config) 사용자 접속 시 프로젝트 내의 config에 있는 urls.py에서 해당 URL을 우선 해석 후 특정 앱의 URL인 경우, 해당 앱의 urls.py로 다시 전달함 - config>urls.py
- bookmark>urls.py
http://localhost:8000/bookmark/ 로 접속 o Template 파일 만들기 각 앱에 templates 폴더 만들고 하위에 다시 앱 이름과 같은 폴더를 만든다. (템플릿 이름이 중복될 수 있기 때문임) - bookmark>templates>bookmark> - bookmark>templates>bookmark>bookmark_list.html
o bookmark에 데이터 추가(add) 로직 작성 : views.py에 클래스형 뷰 CreateView 추가
- bookmark/urls.py 수정
#ImproperlyConfigured at /bookmark/add/ - 데이터를 입력(추가)하거나 수정 뷰인 경우, 대상 필드를 지정해야 한다는 의미 (filed=[ ] 코드 추가)
#TemplateDoesNotExist at /bookmark/add/ - form 관련 내용이 없다는 의미 --> django에서는 create or update의 경우 _form이 붙음
#TemplateDoesNotExist at /bookmark/add/ - 테플릿 bookmark/bookmark_create.html 작성
{{ form.as_p }}은 p태그 자동 삽입 - 접속 시 #ImproperlyConfigured at /bookmark/add/ 데이터 입력 완료 후 redirect할 url이 없다는 의미
- bookmark_list.html 내 Add Bookmark 링크 작동되게 처리
o deailview 만들기 - bookmark>urls.py
- views.py
'detail/<int:pk>' 경로 매칭을 위해 사용하는 형식으로, url에서 'bookmark/detail/<int:pk>'로 접속할 경우, models의 Bookmark 컬럼 중 pk 속성인 id 속성과 일치하는 int 형식의 pk 값을 의미하며, <pk>인 경우는 문자열을 의미함 http://localhost:8000/bookmark/detail/1 접속 시 에러 #TemplateDoesNotExist at /bookmark/detail/1 - bookmark/bookmark_detail.html
- bookmark_list.html 의 site_name 항목에 a href link 연결
o updateview 만들기 - views.py
- urls.py
http://localhost:8000/bookmark/update/1/ 로 접속 - bookmark/bookmark_update.html
- bookmark_list.html 의 Modify 부분 수정 a href link
http://localhost:8000/bookmark/update/1/ 에서 '네이트' 수정 후 에러 발생 #ImproperlyConfigured at /bookmark/update/1/ o get_absolute_url() 만들어서 해결하기
o deleteview 만들기 - views.py
- urls.py
http://localhost:8000/bookmark/delete/1/ 접속 시 에러 bookmark/bookmark_confirm_delete.html
bookmark_list.html 의 Delete 부분 수정 a href link
■ 템플릿 분리와 확장하기중복되는 html 부분을 하나의 파일(공통 부분을 레이아웃 파일로 만듦)로 합치고, 하위 템플릿은 미리 지정해놓은 템플릿을 확장해서 사용해본다. ※ bookmark_list.html, bookmark_create.html, bookmark_detail.html, bookmark_update.html, bookmark_confirm_delete.html 파일에 대해 공통된 부분을 하나의 템플릿(base.html)으로 통합한 후 개별로 템플릿 태그를 삽입하여 재작성한다. 1. project root에 templates 폴더 추가 후 base.html 파일 만든다.
3. 템플릿 적용하기 - base.html
- bookmark_list.html
- bookmark_create.html
- bookmark_detail.html
- bookmark_update.html
- bookmark_confirm_delete.html
4. 부트스트랩(Bootstrap) 적용하여 화면 표시 - base.html
■ 정적 파일(static file) 적용하기css, js, image 파일 등을 적용할 경우, 정적파일을 불러올 수 있는 폴더를 명시해야 함 1. settings.py에서 2. project root 폴더에 'static' 폴더 만들고, 3. 폴더에 style.css파일 생성해본다. 4. 템플릿 전체에 적용하기 위해서는 base.html에 다음과 같이 추가한다.
# static 파일이 웹 페이지에 적용되었는지 확인하는 방법은 크롬 개발자도구 sources tap에서 static 이 보이는지 확인 ■ 소스를 pythonanywhere.com에 zip 파일 압축으로 배포해보기 (구글링 검색 자료 기준)1. 소스 파일을 특정 폴더(예로, 바탕화면)에 복사 2. settings.py에서 # DEBUG = True 셋팅을 False로 바꿔준다. ALLOWED_HOSTS = ['haeyou.pythonanywhere.com'] # [] # pythonanywhere.com에 배포할 것이기 때문에, 자신의 ID.pythonanywhere.com 으로 변경한다. 3. STATIC 파일 STATIC_URL = '/static/' # 'STATICFILES_DIRS'로 static 파일이 여러 곳에 있는 경우, 배포에서는 static 파일을 한 폴더에 모아서 처리한다. static 파일을 한 곳으로 모아주는 명령어 python manage.py collectstatic 실행할 수도 있다. (static 파일이 한 곳에 있는 경우, 위와 같이 수정함) 4. 소스 파일(폴더 포함)을 압축한다. # bookmark, config, static, templates, manage.py 5. pythonanywhere.com 접속 및 로그인 - Bash console에서 작업
- 압축 파일 업로드 : File 탭 클릭한 후 bookmark 폴더로 클릭, Upload a file 버튼 클릭하여 압축 파일 업로드 - 콘솔 다시 진입 후, 압축을 풀고, unzip bookmark.zip 가상환경 만들고, virtualenv --python=python3.8 venv 장고(django) 설치 후, pip install django db migrate, python manage.py migrate 관리자 계정 생성, python manage.py createsuperuser
- Web 탭으로 이동 (1) pythonanywhere.com 상단의 Web 선택
Source code: 부분을 아래와 같이 수정함 /var/www/haeyou_pythonanywhere_com_wsgi.py 클릭한 후 ※ /var/www/haeyou_pythonanywhere_com_wsgi.py
※ WSGI(Web Server Gateway Interface)란?
Virtualenv 부분 수정 /home/haeyou/bookmark/venv/ 상단 Reload haeyou.pythonanywhere.com 클릭 6. haeyou.pythonanywhere.com 에 접속하여 테스트를 해본다. [출처 및 참고 사이트] 오지랖 파이썬 웹 프로그래밍 |