티스토리 뷰
[Python/WEB] 내가 만든 웹 페이지 서버에 배포하기 (2) Django에 DB/Cache 연결하기
74059 2023. 6. 28. 10:18아래와 같은 구성으로 진행됩니다.
[내가 만든 웹 페이지 서버에 배포하기]
(1) Django를 활용한 웹페이지 만들기
(2) Django에 DB/Cache 연결하기 𖦹현재 포스터𖦹
(3) Django를 uWSGI와 NGINX를 이용해 배포하기
(4) 내가 배포한 웹으로 HAproxy 구성하기
[포스터 참고]
(1) Django를 활용한 웹페이지 만들기: https://hyewon-s-dev.tistory.com/8
[Python/WEB] 내가 만든 웹 페이지 서버에 배포하기 (1) Django를 활용한 웹페이지 만들기
아래와 같은 구성으로 포스터 업로드 예정입니다. 참고해주세요. [내가 만든 웹 페이지 서버에 배포하기] (1) Django를 활용한 웹페이지 만들기 𖦹현재 포스터𖦹 (2) Django에 DB/Cache 연결하기 (3) Djan
hyewon-s-dev.tistory.com
(3) Django를 uWSGI와 NGINX를 이용해 배포하기: https://hyewon-s-dev.tistory.com/11
[Python/WEB] 내가 만든 웹 페이지 서버에 배포하기 (3) Django를 uWSGI와 NGINX를 이용해 배포하기
아래와 같은 구성으로 포스터 업로드 예정입니다. 참고해주세요. [내가 만든 웹 페이지 서버에 배포하기] (1) Django를 활용한 웹페이지 만들기 (2) Django에 DB/Cache 연결하기 (3) Django를 uWSGI와 NGINX를
hyewon-s-dev.tistory.com
(4) 내가 배포한 웹으로 HAproxy 구성하기: https://hyewon-s-dev.tistory.com/12
[WEB Server/Linux] HAproxy 수동 설치 및 config 파일 구성
아래와 같은 구성으로 진행됩니다. [내가 만든 웹 페이지 서버에 배포하기] (1) Django를 활용한 웹페이지 만들기 (2) Django에 DB/Cache 연결하기 (3) Django를 uWSGI와 NGINX를 이용해 배포하기 (4) 내가 배포
hyewon-s-dev.tistory.com
저번 포스터에서 구성한 django 웹 페이지에 데이터베이스 postgresql과 캐시 redis 를 연동시켜보겠습니다.
postgresql과 redis 설치는 앞서 작성한 포스터를 참고해주세요. 모든 과정은 수동 설치를 기반으로 하고 있습니다. yum으로 설치하신 분께선 참고해주세요.
[설치 참고]
postgresql 설치 : https://hyewon-s-dev.tistory.com/4
[PostgreSQL/Linux] PostgreSQL 수동 설치
[설치 환경] Linux CentOS yum을 이용하지 않고 PostgreSQL을 설치합니다. 경로를 잘 확인해주세요. 1. 필요 패키지 설치 postgresql 설치에 필요한 패키지들을 설치해줍니다. yum -y install gcc gcc-c++ make autoconf
hyewon-s-dev.tistory.com
redis 설치: https://hyewon-s-dev.tistory.com/5
[Cache/Linux] Redis 수동 설치
[설치 환경] Linux CentOS7 yum을 이용하지 않고 Redis를 설치합니다. 경로 잘 확인해주세요. 1. Redis 압축 파일 설치 다른 버전을 설치하고 싶다면 아래 링크를 참고해주세요. http://download.redis.io/releases/
hyewon-s-dev.tistory.com
1. 데이터베이스 생성
postgresql 내에 접속하여 데이터베이스를 생성해줍니다. 수동설치 하셨을 경우, 아래 명령어를 이용해 실행시켜주세요. (아래 경로 참고하셔서 설치하신 경로로 수정해주세요.)
cd /home/user/apps/postgresql/postgresql/bin
./psql postgres
접속하신 후 데이터베이스 생성 및 사용자 생성하여 설정해줍니다. (데이터베이스 내에 테이블은 생성하실 필요 없습니다.)
create database {데이터베이스 이름};
alter role {사용자 이름} set client_encoding to 'utf-8';
alter role {사용자 이름} set timezone to 'Asia/Seoul';
grant all privileges on database {데이터베이스 이름} to {사용자 이름};
alter user {사용자 이름} with password '{비밀번호}';
나오실 땐 \q 입력하셔서 나오시면 됩니다.
2. django에서 postgresql 접속을 위한 config 구성
django와 postgresql이 다른 서버에 있을 경우, postgresql에 django가 접속할 수 있도록 설정을 변경해주어야 합니다. 두 개의 config 파일을 수정해주세요.
(1) postgresql.conf
vi /home/user/apps/postgresql/postgresql/data/postgresql.conf
vi 에디터로 접속하셔서 listen_addresses 옵션을 찾아 localhost에서 * 로 변경해주세요
(2) pg_hba.conf
vi /home/user/apps/postgresql/postgresql/data/pg_hba.conf
마찬가지로, vi 에디터로 접속하셔서 맨 아래에 전체 ip를 허용해주는 코드를 작성해주세요. 만약 django가 있는 ip만 열고싶다면, 그 ip 주소로 입력해주시면 됩니다.
host all all 0.0.0.0/0 trust
변경해주신 후 postgresql 재시작 해주시면 db 설정은 완료입니다.
./pg_ctl -D /home/user/apps/postgresql/postgresql/data -l logfile restart
3. 캐시 설정
캐시도 마찬가지로, 장고와 동일한 서버에 설치하신게 아니라면 설정 변경해주셔야 합니다.
vi /home/user/apps/redis/redis-5.0.7/redis.conf
마찬가지로, vi 에디터로 redis.conf 들어간 후, protected-mode 옵션을 찾아 yes에서 no로 바꾸주세요.
protected-mode no
변경시켜주신 후, 캐시 재시작 해주시면 됩니다.
4. Django settings.py 수정
장고에 데이터베이스와 캐시를 적용시키는 코드를 작성해주어야 합니다. 생성하신 프로젝트 아래에 settings.py 파일을 찾아 아래와 같이 수정해주세요. 저번 포스터부터 따라오고 계신다면, 경로는 myweb/myweb/settings.py 입니다.
(1) 데이터베이스
기본으로 작성되어있는 sqlite3은 지워주시고 아래와 같이 작성해주세요.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': '{데이터베이스 이름}',
'USER': '{사용자 이름}',
'PASSWORD': '{데이터베이스 비밀번호}',
'HOST': '{ip 주소}', # django와 같은 서버일 경우, localhost
'PORT': '', # postgresql 기본 포트인 5432일 경우, 작성 안해줘도 됨
}
}
(2) 캐시
CACHE = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://{ip 주소}:6379",
"TIMEOUT": 60,
"OPTIONS": {
"CLIENT_CLASS": "django_redis_client.DefaultClient",
}
}
}
timeout 옵션 같은 경우, expire time, 즉, cache 내에 있는 데이터가 보관되는 시간을 말하며, 여기서는 60초로 설정하였습니다.
5. 데이터베이스 테이블 생성
아까 위쪽에서 데이터베이스만 생성하고, 테이블은 생성할 필요 없다고 말씀드렸는데, 그 이유가 바로 여기서 사용할 테이블을 생성해주기 때문입니다.
장고 내에서 사용할 테이블들을 생성해주기 위해 생성하신 app 폴더(저번 포스터부터 따라오고 계신다면, main 폴더) 에 models.py 파일을 찾아주세요. 여기에 생성하실 테이블명과 컬럼명, 설정 등을 class형태로 생성해줍니다.
저는 저희 팀의 생일을 작성해두는 테이블을 생성할 것이라 team_birthday라는 테이블명을 작성하였고, 여기에 name 컬럼, birthday 컬럼을 생성해 테이블 틀을 만들 수 있도록 작성하였습니다.
from django.db import models
class team_birthday(models.Model):
name = models.CharField(max_length=5, blank=False)
birthday = models.CharField(max_length=6, blank=False)
이렇게 작성하신 후, 터미널 창에서 manage.py가 있는 폴더로 들어가 models.py 파일 적용 및 테이블 생성을 위해 migration 해준 후, django를 실행시켜주세요.
cd /home/user/apps/myweb
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
실행시켜주신 후, 데이터베이스에 접속해 테이블을 확인해보겠습니다. django와 연결한 데베 서버로 들어가 디비 안으로 접속합니다.
cd /home/user/apps/postgresql/postgresql/bin
./psql postgres
위에서 만든 데이터베이스로 들어가 테이블을 확인해봅니다.
\connect {데이터베이스 이름};
\dt
확인하셨을 때, 아래와 같이 {장고 앱 이름}_{데이터베이스 이름}으로 생성된 테이블이 있다면, 성공적으로 연결된 것이라 할 수 있습니다. (ourteam은 제가 생성한 데이터베이스 이름입니다)
6. Django에 적용하여 앱 만들기
장고와 레디스를 적용할 py파일에 아래 코드를 입력하여 import 시켜줍니다. py파일 위치는 앱 폴더 아래입니다.(/home/user/apps/myweb/main/views.py)
from .models import team_birthday # postgresql
from django.core.cache import cache # redis
team_birthday에는 models.py에 작성하신 테이블 이름으로 작성하시면 됩니다. 편의상 아래서부터는 테이블을 team_birthday로 작성하겠습니다.
postgresql과 redis를 파이썬으로 넣고 지우는 방법을 간단하게 정리해보았습니다.
(1) postgresql in python
[조회]
# team_birthday table 안에 있는 row 전부 가져오기
team_birthday.objects.all()
# team_birthday table에서 name column이 '김철수'라고 작성되어있는 row select
team_birthday.objects.filter(name='김철수')
# team_birthday table에서 birthday column이 '01.01'라고 작성되어있는 row select
team_birthday.objects.filter(birthday='01.01')
[row 추가]
# team_birthday table에 name: 영희, birthday: 12.25인 row 추가
append2db = team_birthday(name='영희', birthday='12.25')
append2db.save()
[value 수정]
# team_birthday table 내에 name column이 '영희'인 row를 가져와 birthday column 값을 '12.31'로 바꿔줌
update2db = team_birthday.objects.get(name='영희')
update2db.birthday = '12.31'
update2db.save()
[row 삭제]
# team_birthday table 내에 name column이 '영희'인 row를 삭제
team_birthday.objects.get(name='영희').delete()
(2) redis in python
[조회]
# redis에서 '영희'라는 key의 value 가져오기
cache.get('영희')
[추가]
# redis에서 key '영희', value '12.31' 추가 (영희:12.31)
cache.set('영희', '12.31')
[작업 중 DB관련 생긴 에러]
(1)
[에러 메시지]
current transaction is aborted, commands ignored until end of transaction block
[해결]
(뭐 때문이었는지 원인 아직 못찾음) 롤백 시켜야 함. 그나마 다행인건 DB에 아무내용 없었음 ..
(2)
[에러]
이미 이름이 존재함에도 불구하고, 수정이나 삭제하기 위해 조회하면 조회되지 않음.
[해결]
DB에 INSERT 시, 큰따옴표(") 말고 작은 따옴표(')를 이용해서 등록하고, 조회나 삭제 시에도 작은 따옴표를 이용하여 해결함.
애매한 부분에 대해 댓글 남겨주시면 수정하는 데에 많은 도움이 될 것 같습니다.
피드백, 틀린 부분 지적 환영입니다 :)
'Programming Language > Python' 카테고리의 다른 글
numpy array 전체, 일렬로 출력 (0) | 2024.03.14 |
---|---|
[Python/Flask] Error: Could not locate a Flask application. (Window) (0) | 2023.07.17 |
[Python/venv] 가상환경 만들기(Window, macOS) (0) | 2023.07.17 |
[Python/WEB] 내가 만든 웹 페이지 서버에 배포하기 (1) Django를 활용한 웹페이지 만들기 (2) | 2023.06.27 |
- Total
- Today
- Yesterday
- 일괄변경
- loadBalancing
- Database
- Python
- PostgreSQL
- 가상환경
- 수동설치
- dockerfile
- nginx
- redis
- css적용
- uwsgi
- haproxy
- cache
- docker
- Linux
- flask
- vi
- Error
- venv
- django
- vim
- 웹배포
- static서버
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |