장고로 삽질하기

docker 기반으로 삽질을 진행한다.
다만 기초를 다지기 위해 직접 수동으로 생성하고 설정 할 예정이다.
파이썬 설치 참고사이트

환경설정

install ubuntu20.10 && python3.9

docker pull ubuntu:20.10			# 베이스 이미지 다운
docker run -it --name t1 ubuntu:20.10 bash	# 컨테이너 진입
apt-get update					# update packate
apt-get upgrade					# 업그레이드 필요하다고 한다면
apt install -y software-properties-common
add-apt-repository ppa:deadsnakes/ppa 		# 파이썬 리포지터리 추가
apt-get update 					# 업데이트 진행 후 
apt install python3.9
apt install python3.9-venv			# 파이썬 가상환경 설치

software-properties-common
PPA(Personal Package Archive) 리포지터리를 추가하여 패키지 관리자를 더 잘 활용할 수 있도록 도와주는 지원 소프트웨어.
즉, 별도의 리포지터리를 추가하여 활용하고자 한다면 해당 소프트웨어를 설치해주어야 한다.

이후 파이썬을 활용할때 python3로 호출하기가 매우 귀찮기 때문에 두가지 선택사항이 있다.
아무거나 알맞게 선택하고 진행하도록 하자.

선택사항1) 환경변수로 python 호출하기

제일 탈이 없는 방법인것같다. 평소엔 글쓴이도 이런식으로 설정했었다.

apt-get install -y vim				# vim 편집기 설치
vi ~/.bashrc 					# vim 으로 사용자 환경설정파일 편집
	> alias python='python3.9'
	> :wq
python --version 				# version check

선택사항2) 심볼릭 링크로 python 호출하기

기본적으로 우분투에 파이썬3.8 이 설치되어있었기 때문에 문제가 발생 할 가능성이 있다고 하는데, 안해봤기도 하고 좀 고급스러워보여 이거로 해보기로 결정.
문제되면 다시 3.8 심볼릭링크로 python3 설정하면 되겠지..

which python3 				# 파이썬3가 어디 위치에 있는지
	> /usr/bin/python3
ls -al /usr/bin/python3 		# 누구랑 연결되어있는지 확인
rm -rf /usr/bin/python3			# 링크 파일 삭제
ln -s /usr/bin/python3.9 /usr/bin/python  # 소프트링크로 python3.9를 python으로 생성
python --version
	> Python 3.9.5

Python venv 설정

python -m venv t1 --system-site-packages	# t1이라는 이름의 파이썬 가상환경을 생성.
vi ~/.bashrc
	> activate='source /root/t1/bin/activate'
source .bashrc

--system-site-packages는 글로벌 설치된 패키지를 상속하는 옵션이다. 만약 기본 옵션에서 테스트를 진행하고 있던 요소를 그대로 활용하고자 한다면 추가로 입력하자.

이후 모든 개발은 t1 가상환경에서 진행될 예정이기에 환경설정파일에 t1 이라는 가상환경에 자동 접속되어 활용할 수 있도록 한다. 가상환경에서 빠져나오려면 deactivate를 입력하면 된다.

Django

프로젝트 생성

pip install django && pip install --upgrade pip # 장고 설치 및 pip 버전업데이트
mkdir project && cd project 			# 내 프로젝트 디렉토리 생성 및 진입
django-admin startproject config .  		# config라는 이름의 장고 프로젝트 루트파일 생성
django-admin startapp myapp			# myapp 이라는 이름의 어플리케이션 생성

django-admin startproject 로 생성된 디렉토리는 Django project를 구성하는 코드를 자동 생성시키며, 이 과정에서 데이터베이스 설정, Django 위한 옵션들, 어플리케이션을 위한 설정들과 같은 Django 인스턴스를 구성하는 수많은 설정들이 생성한다.
따라서 기본적으로 config 라는 이름으로 생성하는 듯 하다.

위와 같은 과정을 거친 후, 작업 구조는 대강 다음과 같을 것이다.

project/
    manage.py
    config/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
     myapp/
	__init__.py
	admin.py
	apps.py  
	migrations
	models.py
	tests.py
	views.py

서버를 한번 실행해보자.

python manage.py runserver  # manage.py가 있는 디렉토리에서 실행하자.

(선택사항) 장고 타임존 및 언어 설정

config의 경우 우리가 제작할 프로젝트의 기본 설정값들을 포함하고있다.
장고 프레임워크에 관련한 설정값들은 대부분 이 config/settings.py 에서 진행된다.

언어를 한국어, 시간을 한국시간으로 변경하려면 해당부분을 다음과 같이 변경한다.

LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
USE_TZ = False		# Default TimeZone (UTC) 사용여부

MySQL

setting & install

apt-get update 				# 업데이트는 뭐 설치할때마다 항상 먼저 해줍시다.
apt-get install -y mysql-server 
mysql_secure_installation 		# mysql 보안설정을 위해 추가설정하기

빠르게 진행한다면 걍 N -> 비번입력 -> Y -> Y-> Y -> Y


1) 암호검증을 활용할 것인지 물어봅니다.
만약 배포를 위한 서비스를 위해선 Y로 안전한 비밀번호를 사용하고 (예시: !비밀번호123!, @킹왕짱123@ z!x지존법사x!z)
일단 N 으로 간단한 비밀번호를 설정후 넘깁시다. 따로 검증을 위한 보안조치는 안할거에요


2) 디비 접근을 위한 새로운 암호를 적용할껀지 물어봅니다.
기본적으로 MySQL에는 익명 사용자가 있어서 배포시에 이를 지워주어야 한다네요.
Y를 눌러 설정에서 걍 없애버립시다.


3) 루트로 외부접속을 허용할껀지 물어봅니다.
Y를 누르면 로컬호스트에서만 루트로 접속가능하게되니 외부접속이 필요할 경우 N을 눌러 진행해주세요


4) Test DB를 삭제할지 물어봅니다.
기본적으로 누구든지 접속 가능한 테이블인 테스트 DB가 생성되고 이 역시 배포단계에선 삭제해줘야 한다고합니다.
Y로 삭제후 진행합시다


5) 권한 테이블이 변경되었으니 리로딩 해서 적용시킵시다.
Y로 진행 후 종료.

MySQL 접속 및 작업용 DB 생성

mysql -uroot -p 		# mysql 실행
	> Enter password:	# 디비 루트접속 패스워드 입력


MySQL 콘솔에 접속된다. 이곳에서 작업용으로 활용할 디비테이블을 생성하자.

create database project;
show databases;

project 라는 이름의 데이터베이스 생성된것을 확인.
이 데이터베이스를 우리는 작업에 활용 할 예정이다.

Django와 MySQL 연결

config/settings.py 의 데이터베이스 항목이다. 주석으로 처리된 곳이 기본코드로 sqlite3 를 활용한다고 명시되어있는데 이를 우리가 설치한 MySQL로 변경해주어야 한다

'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysql', # 사용할 데이터베이스 이름 (mysql 내부의) 
        'USER': 'root',
        'PASSWORD': '당신의 비밀번호!',
        'HOST': 'localhost',
        'PORT': '3306',  # MySQL 의 기본 포트번호
    }

변경 후 장고서버 진행시 문제가 발생했다.

mysqlclient를 설치해야 한다는것. 설치방법은 다음과 같다.

apt-get install python3.9-dev default-libmysqlclient-dev build-essential
pip install mysqlclient

apt-get install 로 설치되는 파일들은 파이썬 부가 라이브러리이다.
이후 서버를 실행하면 정상적으로 동작되는 것을 확인할 수 있다.


다만 서버를 실행했을 때 migration이 필요하다는 말과 함께 python manage.py migrate 를 입력하라고 한다. 입력해주자.

이것저것 뭔가 마이그레이션이 되고있음을 확인할 수 있고,


mysql 콘솔에서 확인해보면 project 디비에 여러 테이블들이 생성되있는 것을 확인할 수 있다.

이번 포스트는 여기까지

진행 과정중 에러가 발생 한 경우 참고

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

mysql_secure_installation 명령 실행 후 위와 같은 에러 발생시, mysql이 서비스로 실행되고 있는지 확인해보고 재실행 해보자.

service mysql status
	> * MySQL is stopped.

service mysql restart
	> * Stopping MySQL database server mysqld  [ OK ] 
	> * Starting MySQL database server mysqld
    		su: warning: cannot change directory to /nonexistent: No such file or directory
            [ OK ]

The repository 'http://ppa.launchpad.net/deadsnakes/ppa/ubuntu groovy Release' does not have a Release file.

만약 apt update에 에러가 발생할 경우,

vi /etc/apt/sources.list.d/deadsnakes-ubuntu-ppa-groovy.list

파이썬 설치를 위해 추가했던 deadsnakes ppa 정보가 있고 최상단의 링크가 주석없이 있을텐데, 이를 주석처리 해주고 진행한다.

pip install mysqlclient 설치에러

ERROR: Command errored out with exit status 1: 어쩌고 하는 에러...


갑자기 최신버전별로 하나씩 설치해가면서 에러를 뽑아내고 있다면, 리눅스에 필수 패키지가 설치가 안된 탓이다. 해당 문제를 맞닥뜨리고 해결방법까지 포함해서 글을 작성했지만 유입으로 문제를 해결하고자 하는 분이 있을수도 있으니.

apt-get install python3.9-dev default-libmysqlclient-dev build-essential

자신의 파이썬 버전에 맞게 python3.9-dev 를 수정해서 복붙후 진행하면 해결된다.


해결된 줄 알았더니 위와 같은 문제가 발생한 경우엔 여러 문제가 있는 듯 한데,

  1. mysqlclient 바이너리 패키지 직접 설치
    https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient
    해당 사이트에서 mysqlclient 를 페이지에서 검색한 다음, 자신의 파이썬 버전에 맞는 패키지를 다운로드. 이후 pip install {다운받은 파일 이름} 으로 설치한 뒤 해결되었다는 글이 있고

  2. 파이썬 부가 패키지 설치문제 및 등등
    여러 해결방법이 제시되있다.
    글쓴이의 경우 mysqlclient 설치를 위해 필요한 패키지 설치시, python3-dev를 3.9로 변경하자 해결됐다.

좋은 웹페이지 즐겨찾기