project workplan2 는 약 10년 정도 쓴 프로그램인 workplan의 필요한 기능 추가 및 삭제, 개선으로 리뉴얼한 버전이다. 기존 workplan은 다른 분이 개발한 것으로 2버전에서는 DB 설계부터 다시 시작한 것으로 이름은 이어서 2버전으로 진행하지만 실상 다른 프로그램이라고 해도 무방하다.
workplan2는 크게 근태 관리, 팀 근태 관리, 업무 보고, 업무 진행 현황, 팀 정보 공유 등에 초점을 맞춰 제작 하였다. (아직 제작 중이지만 ㅎㅎ)
파이썬 장고에 기반을 두고 mariaDB로 진행
py -3.11 -m venv vWorkplan2 cd D:\Develop\D_workplan2\vWorkplan2\Scripts # 가상 환경 접속 activate cd../.. python.exe -m pip install --upgrade pip
# 장고 pip install django # MySQL DB pip install pymysql # 장고 CORS pip install django-cors-headers # 이미지 필드 사용을 위해서 pip install Pillow # 공휴일 처리 pip install holidays # 엑셀 다운로드 pip install openpyxl # outlook 주소록 추출 pip install pywin32 # iis 세팅용 pip install wfastcgi # 장고 글쓰기 에디터 pip install django-ckeditor-5 # 기본 프로젝트 django-admin startproject back .
마리아 DB 설치 방법: [python/setting] 파이썬 – Django 설치 + 셋팅
create database workplan2; # 데이터베이스 생성 use workplan2 # workplan2 DB 사용 show databases; # 데이터베이스 생성 확인
python manage.py makemigrations python manage.py migrate python manage.py createsuperuser
import os import pymysql from pathlib import Path from django.contrib.messages import constants as messages pymysql.install_as_MySQLdb() DEBUG = True # 디버깅 켜기 ALLOWED_HOSTS = ["*"] INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'corsheaders', # 장고 CORS 'org.apps.OrgConfig', 'web.apps.WebConfig', 'work.apps.WorkConfig', 'check.apps.CheckConfig', 'task.apps.TaskConfig', 'status.apps.StatusConfig', 'setting.apps.SettingConfig', 'info.apps.InfoConfig', ] AUTH_USER_MODEL = 'org.User' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 전역 템플릿 폴더 세팅 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'workplan2', 'USER': 'root', 'PASSWORD': '0000', 'HOST': 'localhost', 'PORT': '3306' } } # 쉬운 비밀번호 사용을 위해 비밀번호 유효성 검사기 제거 AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 'OPTIONS': { 'min_length': 4, # 최소 길이를 4로 설정 } }, ] LANGUAGE_CODE = 'ko' #추가 - 언어 TIME_ZONE = 'Asia/Seoul' #변경 - 서울 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': '{levelname} {asctime} {module} {message}', 'style': '{', }, 'simple': { 'format': '{levelname} {message}', 'style': '{', }, }, 'handlers': { 'file': { 'level': 'ERROR', # ERROR 이상의 레벨만 파일에 기록 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, 'error.log'), # 로그 파일 경로 'formatter': 'verbose', }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'ERROR', # ERROR 이상의 로그만 기록 'propagate': True, }, }, } MESSAGE_TAGS = { messages.DEBUG: 'debug', messages.INFO: 'info', messages.SUCCESS: 'success', messages.WARNING: 'warning', messages.ERROR: 'danger', } # STATIC_URL = 'static/' STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # 로그인 LOGIN_URL = '/login/' LOGIN_REDIRECT_URL = '/' LOGOUT_REDIRECT_URL = '/login/'
여기까지 세팅 하고 실행하면
이렇게 뜨고 저 http://127.0.0.1:8000/ 주소를 누르면 장고가 성공적으로 설치되었습니다. 를 볼 수 있다.
여기까지 진행하면 개발 및 테스트를 위한 기본 환경 세팅 완료이다.
python manage.py startapp org python manage.py startapp web python manage.py startapp work python manage.py startapp check python manage.py startapp task python manage.py startapp status python manage.py startapp setting python manage.py startapp info
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin class UserManager(BaseUserManager): # 유저 생성 메서드 def create_user(self, email, password=None, **extra_fields): if not email: raise ValueError('이메일을 아이디로 쓰고 있습니다. 이메일은 필수입니다.') email = self.normalize_email(email) # 이메일 형식을 표준화 (대소문자 구분 없이) user = self.model(email=email, **extra_fields) # 유저 생성 user.set_password(password) # 비밀번호 설정 user.save(using=self._db) # 데이터베이스에 저장 return user # 관리자(슈퍼유저) 생성 메서드 def create_superuser(self, email, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) extra_fields.setdefault('is_manager', True) return self.create_user(email, password, **extra_fields) class User(AbstractBaseUser, PermissionsMixin): POSITION_CHOICES = [ ('intern', '인턴'), ('staff', '사원'), ('associate', '주임'), ('assistant', '대리'), ('manager', '과장'), ('chief', '차장'), ('director', '부장'), ] user_code = models.AutoField(primary_key=True) # 자동 증가하는 고유 코드 email = models.EmailField(unique=True) # 로그인에 사용되는 이메일 (중복 불가) password = models.CharField(max_length=128) # 기본 비밀번호 필드 (AbstractBaseUser에서 제공) .... objects = UserManager() # 커스텀 매니저 설정 # 이메일을 로그인 아이디로 사용하기 위한 설정 USERNAME_FIELD = 'email' # 로그인에 사용할 필드를 이메일로 설정 def __str__(self): return self.user_name # 객체 출력 시 유저 이름 반환
from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static from web import views urlpatterns = [ path('admin/', admin.site.urls), path('', include('org.urls')), path('', include('web.urls')), path('', views.index, name='index'), # 루트 URL로 접근 시 index 뷰 호출 ] # 개발 환경에서 미디어 파일 제공 if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)