본문으로 바로가기

django 설치 (SentOS, python3.6)

category Python 2019. 11. 22. 18:04

프로젝트 디렉토리 만들기

$ mkdir [프로젝트디렉토리]

$ cd [프로젝트디렉토리]

 

파이썬 버전 확인

$ python -V

$ python3 -V

 

가상환경 만들기 (venv)

$ python3 -m venv [가상환경이름]

 

가상환경 실행

$ source [가상환경이름]/bin/activate

 

가상환경 나오기

(가상환경이름) [프로젝트디렉토리]$ deactivate

 

pip 설치가 안되어있으면 설치

(가상환경이름) [프로젝트디렉토리]$ yum install python-pip

 

pip 업그레이드

(가상환경이름)  [프로젝트디렉토리]$ pip install --upgrade pip

 

프록시 환경이라면

(가상환경이름)  [프로젝트디렉토리]$ pip install --proxy http://xxx.xxx.xxx.xxx:port --upgrade pip

 

 

--------------------------------

* 기존 가상환경 설정 파일이 있을경우

(가상환경이름) [프로젝트디렉토리]$ pip install --requirement [파일명].txt

또는

(가상환경이름) [프로젝트디렉토리]$ pip install -r [파일명].txt

 

프록시 환경이라면

(가상환경이름) [프로젝트디렉토리]$ pip install  --proxy http://xxx.xxx.xxx.xxx:port  -r [파일명].txt

 

* 가상환경 설정파일 만들기

(가상환경이름) [프로젝트 디렉토리]# pip freeze > [파일명].txt

--------------------------------

 

가상환경에 설치된 python 모듈 경로

(가상환경이름)/lib/python3.6/site-packages/

 

django 버전 확인

(가상환경이름[프로젝트디렉토리]$ python3 -m django --version

 

django 업그레이드

# pip install -U django

 

프록시 환경 일 경우

# pip install -U --proxy http://xxx.xxx.xxx.xxx:port django 

 

django 삭제

 # pip uninstall django

 

django 설치하기 (특정 버전 설치 => pip install django~=2.0.0)

(가상환경이름[프로젝트디렉토리] $ pip install django

 

프록시 환경 일 경우

(가상환경이름) [프로젝트디렉토리]$ pip install --proxy http://xxx.xxx.xxx.xxx:port django 

 

* 현재일 기준 django 최신 버전은 2.2.X 인데 sqlite3 버전오류등 조금 애매한 부분이 있어서 난 2.0.0설치함

그러나 mysql로 연결하면 정상적으로 실행됨(2.2.4)

2.0설치후 django 업그레드 하면 괜찮음

 

 

Django 프로젝트 생성

(가상환경이름[프로젝트디렉토리]$ django-admin startproject [프로젝트명] .

(.)은 현재 디렉토리에 장고를 설치 (.안쓰면 [프로젝트명]/[프로젝트명]안에 설정파일들이 생성

[프로젝트디렉토리]/
	[가상환경디렉토리]
	manage.py
	[프로젝트명]/
		__init__.py
		settings.py
		urls.py
		wsgi.py

난, (.)을 안쓰고 설치

[프로젝트디렉토리]/
	[가상환경디렉토리]
	[프로젝트명]/
		manage.py
		[프로젝트명]/
			__init__.py
			settings.py
			urls.py
			wsgi.py

 

프로젝트 삭제

프로젝트 폴더와 manage.py 파일 삭제

 

 

사이트 실행 (Port를 생략하면 기본적으로 8000 Port사용)

(가상환경이름)[프로젝트디렉토리]$ python3 manage.py runserver [포트]

이때 2.2.X버전의 경우 SQlite오류 발생할 수 있음. 2.0.0에서 실행 후 업그레이드 하면 괜찮음.

mysql 연결하면 괜찮음

(원인을 아시는분 알려주세요^^;) 

 

 

실행중인 Django 프로세스 확인

$ ps -ef | grep runserver | grep -v grep

 

 

서버중지

$ kill -9 [프로세스 아이디]

 

runserver는 테스트 용으로 사용하며, 서비스 시에는 apache등 사용

 

 

 

==========================================================

 

git 연결

gitlab에 프로젝트 만들고

해당 프로젝트에 git 셋팅

https://devlink.tistory.com/215

 

 

 

기존 DB 스키마가 있는경우 (DB를 다시 만드는 경우)

신규 DB를 만들고, settings.py에서 DB정보를 일치 시켜주고,

 

해당 APP의  migrations 디렉토리 안에 있는 파일 삭제 (__init__.py 파일은 삭제하지 않음)

 

스키마 생성

python3 manage.py makemigrations

 

마이그레이션 진행

python3 manage.py migrate

 

https://devlink.tistory.com/301?category=721886

 

==========================================================

 

 

 

아파치 연동

 

참고

https://inma.tistory.com/110

https://tutorial.djangogirls.org/ko/django_installation/

https://medium.com/%EB%8F%84%EC%84%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9B%B9%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%8B%A4%EC%A0%84%ED%8E%B8-%EC%9A%94%EC%95%BD/chapter-6-%EA%B0%80%EC%83%81-%ED%99%98%EA%B2%BD-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EC%83%88%EB%A1%AD%EA%B2%8C-%EC%A0%95%EB%A6%AC-30d5940de012

https://docs.djangoproject.com/ko/2.2/intro/tutorial03/

 

 

========================================

 

mod_wsgi 설치

* 설치된 python 버전과 호환되는 mod_wsgi를 설치해야 함.

버전이 안맞으면 특별한 오류 없이 연동이 되지 않음.

 

python 버전 확인

# python -V

 

python3.6.8 기준 

python36u-mod_wsgi 설치

 

yum으로 설치

# yum install python36u-mod_wsgi

 

rpm으로 설치

https://centos.pkgs.org/7/ius-archive-x86_64/python36u-mod_wsgi-4.5.14-2.ius.centos7.x86_64.rpm.html

다운로드

# rpm  -ivh python36u-mod_wsgi-4.5.14-2.ius.centos7.x86_64.rpm

 

설치 확인

# rpm -qa mod_wsgi

 

 

apache 설정 

vi /etc/httpd/conf/httpd.conf 에 추가

Listen 8000 

#가상환경 사용시 venv 경로
WSGIPythonHome [프로젝트 디렉토리경로]/[프로젝트명]/myvenv

<VirtualHost *:8000>

    ServerName www.example.com 
    WSGIScriptAlias / [프로젝트 디렉토리경로]/[프로젝트명]/wsgi.py (wsgi.py가 위치한 경로)
   
    DocumentRoot [프로젝트 디렉토리경로] 
    <Directory [프로젝트 디렉토리경로]/[프로젝트명]>
    	<Files wsgi.py>
    		Order deny,allow
    		Allow from all
            Require all granted
    	</Files>
    </Directory>
    
    # 이미지등 정적 파일 경로
    Alias /static/ /var/www/balance/www/static/
    <Directory /var/www/balance/www/static>
      Allow from all
    </Directory>

</VirtualHost>

 

wsgi.py 파일 수정

"""
WSGI config for mysite project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/
"""

import os, sys
from django.core.wsgi import get_wsgi_application

path = os.path.abspath(__file__+'/../..')
if path not in sys.path:
	sys.path.append(path)

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '[프로젝트명].settings')

application = get_wsgi_application()
                                      

 

 

 

아파치 재시작

# systemctl restart httpd

 

 

 

참고

https://ossian.tistory.com/94

https://lohanyeon.github.io/2018/django-apache/

https://yongbeomkim.github.io/django/mdc-wsgi-server/

http://blog.naver.com/PostView.nhn?blogId=gghso&logNo=221457781320

 

========================================

 

 

새로운 APP  만들기

(가상환경이름[프로젝트디렉토리]# python3 manage.py startapp [APP명]

[APP명]의 디렉토리 생성

 

[프로젝트 디렉토리]/
    	manage.py
        
    	[프로젝트명]/
        	__init__.py
        	settings.py
        	urls.py
        	wsgi.py
            
        [APP명]/
          	__init__.py
          	admin.py
          	apps.py
          	migrations/
              	__init__.py
          	models.py
          	tests.py
          	views.py

 

 

[프로젝트명]/settings.py 에 [APP명] 추가, STATIC_ROOT추가 및 설정 변경

LANGUAGE_CODE = 'ko'
TIME_ZONE = 'Asia/Seoul'

.
.
.

ALLOWED_HOSTS = ['localhost', '.도메인'] 

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    '[APP명]',
]


.
.
.

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

 

django의 기본적인  static 파일(js, css등) 파일 이동하기

(가상환경이름[프로젝트디렉토리]python3 manage.py collectstatic

 

오류 발생시

CommandError: Collecting static files cancelled.

 

(가상환경이름[프로젝트디렉토리]python3 manage.py collectstatic  --noinput

 

 

 

[새로만든 APP]으로 URL연결 하기

[프로젝트디렉토리]/[프로젝트명]/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('[새로만든 APP].urls')),
]

 

[프로젝트디렉토리]/[APP명]/urls.py

from django.urls import path
from . import views


urlpatterns = [
    path('', views.post_list, name='post_list'), 추가
]

 

뷰 작성

[프로젝트디렉토리]/[APP명]/views.py

from django.shortcuts import render, get_object_or_404
from django.utils import timezone
from .models import Post
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

# Create your views here.

def post_list(request):
    posts = Post.objects.all().order_by('published_date')
    page = request.GET.get('page', 1)

    paginator = Paginator(posts, 2)
    try:
        posts = paginator.page(page)
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)

    return render(request, '[APP명]/post_list.html', {'posts': posts})

 

모델작성 (model  == database table)

[프로젝트 디렉토리]/[APP명]/models.py 

from django.db import models
from django.utils import timezone

# 클래스 이름의 첫 글자는 대문자
class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

 

작성한 model을 기준으로 Migration 파일 생성

(가상환경이름[프로젝트 디렉토리]python3 manage.py makemigrations [APP명] (APP명 생략시 전체 적용)

 

 

디비에 스키마를 반영

(가상환경이름[프로젝트 디렉토리]python3 manage.py migrate

 

 

템플릿 만들기

[프로젝트 디렉토리]/templates 생성  (templates 디렉토리 생성 위치는 개인적 취향)

[프로젝트 디렉토리]/templates/[APP명]/post_list.html 파일 편집

 

 

root 개념이므로

[프로젝트 디렉토리]/[프로젝트명]/settings.py 경로 수정

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], #templates 디렉토리를 root에 만들경우 지정
        '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',
            ],
        },
    },
]

 

 

기본적으로 해당 [APP]안에 templates디렉토리가 위치하면  settings.py 경로 수정이 필요 없음

[프로젝트 디렉토리]/
    	manage.py
        
    	[프로젝트명]/
        	__init__.py
        	settings.py
        	urls.py
        	wsgi.py
            
        [APP명]/
          	__init__.py
          	admin.py
          	apps.py
          	migrations/
              	__init__.py
          	models.py
          	tests.py
          	views.py
            templates/
            	[APP명]
                	템플릿파일.html

 

 

 

 

=================================

 

 

관리자 url (실제로 사용하기는 어렵고..)

http://localhost:8000/admin/

 

슈퍼사용자 등록

(가상환경이름[프로젝트 디렉토리]# python3 manage.py createsuperuser

이름, 이메일, 패스워드 입력

 

* 개발서버 구동시 CSS가 적용되지만, 아파치와 연동하면 CSS가 적용되지 않음 

STATIC_ROOT = os.path.join(BASE_DIR, 'static') 를 통해 정적 파일을 저장하고,

아파치설정에 Alias 적용

 

참고 

http://blog.naver.com/PostView.nhn?blogId=gghso&logNo=221457781320

 

만일 관리자 페이지에서 테이블이 없다는 등의 오류가 발생하면

# python3 manage.py migrate

 

 

==================================

 

static 디렉토리

정적 파일 (이미지, css, js 등) 을 보관하는 디렉토리

생성 후  apache설정에  Alias 적용 해야함

 

Listen 8000 

#가상환경 사용시 venv 경로
WSGIPythonHome [프로젝트 디렉토리경로]/[프로젝트명]/myvenv

<VirtualHost *:8000>

    ServerName www.example.com 
    WSGIScriptAlias / [프로젝트 디렉토리경로]/[프로젝트명]/wsgi.py (wsgi.py가 위치한 경로)
   
    DocumentRoot [프로젝트 디렉토리경로] 
    <Directory [프로젝트 디렉토리경로]/[프로젝트명]>
    	<Files wsgi.py>
    		Order deny,allow
    		Allow from all
            Require all granted
    	</Files>
    </Directory>
    
    # 이미지등 정적 파일 경로
    Alias /static/ /var/www/balance/www/static/
    <Directory /var/www/balance/www/static>
      Allow from all
    </Directory>

</VirtualHost>

 

참조 : http://pythonstudy.xyz/python/article/314-Static-%ED%8C%8C%EC%9D%BC

 

 

==================================

 

templates 디렉토리

 

각 App 폴더 밑에 templates 서브폴더를 만들고  그 안에 App명을 사용하여 템플릿 파일을 정리할수 도있고,

관리의 필요성에 따라 root에 만들수도 있다. root에 만들경우는 경로를 명시해야 한다.

'DIRS': [os.path.join(BASE_DIR, 'templates')] 추가

root에 만들더라도 템플릿 네임스페이싱은 유지해야 함 (/templates/App명/템플릿파일.html)

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], #templates 디렉토리를 root에 만들경우 지정
        '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',
            ],
        },
    },
]

 

templates등 적용할때 반영이 안되는 경우가 있는데 이때는 아파치를 재시작 해야 한다.

 

참고할만한 튜토리얼

https://tutorial.djangogirls.org/ko/django_templates/

http://pythonstudy.xyz/python/article/314-Static-%ED%8C%8C%EC%9D%BC  (디렉토리구조 참조)

https://docs.djangoproject.com/ko/2.2/intro/tutorial03/   

 

 

 

 

 

==================================

 

MySQL 연결

 

mysqlclient 설치

(가상환경이름[프로젝트 디렉토리] $ pip install  mysqlclient

(가상환경이름[프로젝트 디렉토리] $ pip install --proxy http://xxx.xxx.xxx.xxx:포트 mysqlclient

 

 

[프로젝트 디렉토리]/[프로젝트명]/settings.py 에 DATABASES 연결 문자열 수정

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DB 이름',
        'USER': '계정',
        'PASSWORD': '패스워드',
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': 'SET sql_mode="STRICT_TRANS_TABLES"'
        }
    }
}

 

다시

 

작성한 model을 기준으로 Migration 파일 생성

(가상환경이름[프로젝트 디렉토리]python3 manage.py makemigrations [APP명] (APP명 생략시 전체 적용)

 

 

디비에 스키마를 반영

(가상환경이름[프로젝트 디렉토리]python3 manage.py migrate

 

조금 황당하지만 mysql 연결 후 500 (internal server error)에러 발생..

 

가상환경에  mysqlclient 설치했지만...

어쨌는 로컬에 mysqlclient 설치하니까 됨..

 

만일 pycharm에서 DB Navigater사용시 테이블에 데이터 안보이면

commit 해주거나, Settings > Properties > Auto-Commit 체크

 

추가한 테이블을 django 관리 사이트에서 관리를 하려면,

admin.py 에 추가

from django.contrib import admin
from .models import 데이터 Class명

# Register your models here.
admin.site.register(데이터 Class명)

 

 

==================================

 

네임스페이스 사용

 

APP을 여러개 만들어 사용할경우 네임스페이스 사용 가능

 

각각의 APP의 urls.py에

app_name = 'APP 네임스페이스'
urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('post/<int:pk>/', views.post_detail, name='post_detail'),
    path('post/new', views.post_new, name='post_new'),
]

[APP 네임스페이스]:post_list 형식으로 사용

 

template에서도..

<a href="{% url '[APP 네임스페이스]:post_list' %}" >링크</a>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Python' 카테고리의 다른 글

pycharm 가상환경 경로 설정  (0) 2019.11.29
django 현재 url 가져오기  (0) 2019.11.26
django 이메일 보내기 (smtplib)  (0) 2019.11.14
dgango template 에서 숫자에 콤마 찍기  (0) 2019.10.29
python 정규식  (0) 2019.10.29