반응형

설치

pip install flask

 

셋업

webapp (Web application)

 /helloflask(Web context영역, blog 등)

   - /static

        -/css

        -/images

        -/js

    -/templates

        -application.html

    -__init__.py (임포트 하는 순간 자동 실행 됨)

 start_helloflask.py

 

__init__.py

from flask import Flask

app = Flask(__name__) 

@app.route("/")
def helloworld():
	return "Hello Flask!"

start_helloflask.py

#../start_flask.py
from helloflask import app

app.run(host='localhost')

lazy loading: 메모리에 모든 것을 다 올리지 않고, 필요할 때 올린다는 의미

Environment: production (default), or development

반응형

'Programming > Python_Web' 카테고리의 다른 글

Flask강좌3 - Request  (0) 2020.12.01
Flask강좌2 - Global Object: g, Response객체  (0) 2020.12.01
Flask - IIS연동  (2) 2020.10.23
Flask - mysql 연동  (0) 2020.08.21
Flask - apache 연동(mod_wsgi)  (0) 2020.08.21
반응형

IIS와 Flask 연동하는 방법에 대한 기록을 남깁니다.

 

1. flask 설치

pip install flask

 

2. wfastcgi설치

pip install wfastcgi

 

3. wfastcgi실행

c:\>wfastcgi-enable

python.exe | wfastcgi.py 파일 경로 복사/기록

 

4. 테스트용 hello.py파일 작성( 예: E:\02_Programming_Work\06_Python\08_flask)

주소창에서 "localhost:7000/" 과같이 입력하면 이 파일에 의해서 Hello Flask!라는 텍스트를 나타내게 합니다.

#hello.py
from flask import Flask
app=Flask(__name__)

@app.route('/',methods=['GET'])
def index(): 
    return "Hello Flask!"

5. IIS - CGI설치

 

 

6. IIS - 사이트 추가

 

 

7. IIS - 처리기 매핑(Handler Mapping)

실행 파일(옵션)에 아까 복사해두었던 python.exe(경로)|wfastcgi.py(경로)를 복사해 넣습니다.

이름은 적당히 적어줍시다. 

 

 

 

8. IIS - FastCGI 설정(환경변수 설정)

 

 

name: PYTHONPATH , value: <앱까지의 경로>

name: WSGI_HANDLER, value: hello.app (<아까만든 python파일 이름.app)

 

9. 실행

 

 

Python version: 3.8.3

Flask version: 1.1.2

 

 

반응형
반응형

오늘은 Flask와 MySQL의 연동에 대해 알아보겠습니다. 진행할 과제는

 

1. DB 생성

2. Flask APP 구성

3. DB 모듈 생성 (mod_dbconn.py)

4. DB 연결 (__init__.py)

5. DB data 출력 (db.html)

 

의 순으로 진행하겠습니다.

 

1. DB 생성

이전 포스팅에서 설치한 XAMPP를 이용하여 MySQL을 실행하고 진행하겠습니다. XAMPP에서 Apache와 MySQL을 Start 해 줍니다. (Apache를 실행해야 MySQL 서버가 실행됩니다.)

다음으로 커맨드 창을 열고 비밀번호를 설정해 줍니다.

 

그리고서 XAMPP 컨트롤 창의 MySQL의 Admin 버튼을 누르거나 직접 URL을 입력하여 phpmyadmin사이트로 이동합니다. (로그인이 안될 수 있습니다. 이때는 설정파일(config.inc.php)을 열어 password 부분을 1234로 바꿔줍니다. 아래 수정할 파일 경로와 수정 부분 참조하세요)

 

이제 DB를 생성하겠습니다. '새로운'을 클릭하여 DB를 생성창을 열고, testDB라고 DB 이름을 부여한 후, 인코딩 방식을 아래와 같이 설정해주고(default), 만들기를 클릭해줍니다. 

 

삽입 창에서 적당히 데이터를 입력해 줍니다.

이렇게 기본적인 테스트 테이블 및 데이터를 생성하였습니다.

 

2. Flask APP 구성

Flask App의 구성은 이렇게 생겼습니다. 아래의 구성에 따라 파일들을 생성해 줍니다. 폴더구조 내부의 파일들은 차근차근 생성해 갈 예정이므로 폴더 트리를 먼저 구성해 줍시다.

다음으로는 Flask 와 MySQL DB연동을 위한 pymysql 모듈을 설치합니다.

pip install Flask
pip install pymysql

그리고 이제부터 내부 파일들을 구성하도록 하겠습니다.

(1) start_app.py:

프로그램 시작점입니다. 내부에서 app을 import 하는 것만으로도 __init__.py를 자동으로 구동하게 됩니다.

from app import app

app.run(host='0.0.0.0') # 127.0.0.1

 

(2) __init__.py : 

본격적인 Flask 앱입니다. 주로 라우팅 관련 설정을 다루고 있습니다. 아직은 '/' 루트로 연결 요청에 대해 'home.html'로 연결하는 1개의 라우팅밖에 없습니다.

from flask import Flask, render_template
from app import mod_dbconn

app = Flask(__name__)


@app.route('/')
def home():
    return render_template('home.html')

if __name__=='__main__':
    app.run(debug=True)

from app import app





(3) layout.html:

다른 html파일과 공유되는 base부분을 선언해줍니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask App</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
</head>
<body>
    <header>
        <div class="container">
            <h1 class="logo">Flask App</h1>
            <strong>
                <nav>
                    <ul class="menu">
                        <li><a href="{{ url_for('home') }}">Home</a></li>
                    </ul>
                </nav>
            </strong>
        </div>
    </header>
    <div class="container">
        {% block content %}
        {% endblock %}
    </div>

</body>
</html>

(4) home.html:

layout.html을 불러와 {% block content %} 부분이 끼워넣습니다.

{% extends "layout.html" %}
{% block content %}
<div class="jumbo">
    <h2>Hello Flask App</h2>
    <h4>'/' 요청 처리에 대한 페이지입니다.</h4>
</div>
{% endblock %}

(5) main.css

다른 분 소스를 참조했습니다.^^;;;;;

body {
  margin: 0;
  padding: 0;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  color: #444;
}

header {
  background-color: #2B2B2B;
  height: 35px;
  width: 100%;
  opacity: .9;
  margin-bottom: 10px;
}

header h1.logo {
  margin: 0;
  font-size: 1.7em;
  color: #fff;
  text-transform: uppercase;
  float: left;
}

header h1.logo:hover {
  color: #fff;
  text-decoration: none;
}

.container {
  width: 940px;
  margin: 0 auto;
}

div.jumbo {
  padding: 10px 0 30px 0;
  background-color: #eeeeee;
  -webkit-border-radius: 6px;
     -moz-border-radius: 6px;
          border-radius: 6px;
}

h2 {
  font-size: 3em;
  margin-top: 40px;
  text-align: center;
  letter-spacing: -2px;
}

h3 {
  font-size: 1.7em;
  font-weight: 100;
  margin-top: 30px;
  text-align: center;
  letter-spacing: -1px;
  color: #999;
}
.menu {
  float: right;
  margin-top: 8px;
}

.menu li {
  display: inline;
}

.menu li + li {
  margin-left: 35px;
}

.menu li a {
  color: #999;
  text-decoration: none;
}

이렇게 구성한 후 접속을 서버를 구동해 보겠습니다.

python start_app.py

이쁘게 잘 나오네요. 다음, 진짜 DB 연결부분으로 넘어가겠습니다.

 

3. DB 모듈 생성 (mod_dbconn.py)

DB 접속 및 실행 부분을 재사용을 위해 클래스로 구성해 둡니다.

import pymysql


class Database():
    def __init__(self):
        self.db = pymysql.connect(host='localhost',
                                  user='root',
                                  password='1234',
                                  db='testDB',
                                  charset='utf8')
        self.cursor = self.db.cursor(pymysql.cursors.DictCursor)

    def execute(self, query, args={}):
        self.cursor.execute(query, args)

    def executeOne(self, query, args={}):
        self.cursor.execute(query, args)
        row = self.cursor.fetchone()
        return row

    def executeAll(self, query, args={}):
        self.cursor.execute(query, args)
        row = self.cursor.fetchall()
        return row

    def commit(self):
        self.db.commit()

4. DB 연결 (__init__.py):

기능은 만들어 두었으니까(mod_dbconn.py) 실제 연결 요청부분을 만들겠습니다. 

from flask import Flask, render_template
from app import mod_dbconn

app = Flask(__name__)


@app.route('/')
def home():
    return render_template('home.html')


# 여기부터 추가
@app.route('/db')
def select():
    db_class = mod_dbconn.Database()

    sql = "SELECT id, name \
                FROM testDB.members"
    row = db_class.executeAll(sql)

    print(row)

    return render_template('db.html', resultData=row[0])

# 여기까지 추가



if __name__=='__main__':
    app.run(debug=True)

from app import app





 

데이터 흐름으로 보자면...이렇게 되겠네요^^. 즉 '/db' 접속 요청이 들어오면 해당 라우터를 찾아 select()함수를 실행시키는데, 우선 Database로부터 sql에 해당하는 data를 받아서 row에 저장시키고, 이를 resultData라는 변수에 할당하여 db.html로 함께 넘겨줍니다.

5. DB data 출력 (db.html)

마지막으로 전달받은 데이터를 출력하는 페이지를 작성합니다.

{% extends "layout.html" %}
{% block content %}
<div class="jumbo">
    <h2>Hello Flask App</h2>
    <h4>id : {{resultData.id}}</h4>
    <h4>name : {{resultData.name}}</h4>
</div>
{% endblock %}

이렇게 수정하고 다시 실행해봅시다. 

 

python start_app.py

그리고 localhost:5000/db로 url을 입력해 봅시다.

 부디 이렇게 같이 잘 나오셨길 빕니다.

 

- 끝 - 

반응형
반응형

오늘은 Flask 앱을 Apache와 연동시키는 작업을 해보겠습니다. 나중에 나오지만 mod_wsgi설치, httpd.conf파일 수정 등 산넘어 산입니다. ^^;;;

 

1. 아파치 직접 설치해도 되겠지만, 저는 XAMPP 를 깔겠습니다. 초보니까요..^^;; 이걸 사용하면 Apache, MySQL, PHP 서버를 버튼 클릭으로 간단히 켜고 끌 수 있게 해 줍니다. 주소는 https://www.apachefriends.org/index.html

설치 방법은 다른 글들을 확인하시기 바랍니다.

 

 

 

2. 아파치 인식시키기

우리 목표는 아래 명령을 수행해서 mod_wsgi를 설치하는게 우선적인 목표입니다.

pip install mod_wsgi

그런데, 아파치를 설치 했음에도 에러가 발생할 확률이 높습니다. 중간 부분에 아파치가 설치되지 않았다는 문구가 있을 겁니다. 그럴 때에는 아래와 같이 입력하여 아파치를 인식시켜줍니다. "F:\Apache24"부분은 각자의 apache 경로로 하시는거 주의하세요^^

set "MOD_WSGI_APACHE_ROOTDIR=F:\Apache24"

 

3. mod_wsgi 설치 관련 C++ 컴파일러 설치

여기서부터가 본격적인 시작이라고 보시면 되겠습니다. 리눅스 환경에서는 구성하기가 나름 쉬운 것 같은데, 윈도우 환경에서는 조금 까다롭습니다. 아직은 여전히 pip install mod_wsgi를 해도 빨간 에러가 계속 나올겁니다. 이제 C++ 컴파일러를 설치해야 합니다. VC++ 14.0 이상이 설치되어 있어야 한다고 합니다. 인터넷 검색하셔서 VC Build Tools 다운받으시면 됩니다. 찾기 어려울까봐 인터넷에 돌아다니는 파일 올립니다.  

 

visualcppbuildtools_full.exe
3.14MB

 

 

이거 깔고 pip install mod_wsgi 이렇게 설치하시면 아마 될겁니다. 그 다음에도 안되는 다른 사이트 좀 더 살펴보시기 바랍니다...저는 여기까지만...ㅠㅠ

 

 

 

다른 OS의 경우에는 F:\Apache24\modules\mod_wsgi.so 파일이 생성된다는데, 윈도우는 좀 다릅니다. 설치하고 나면 위 경로와 같이 Python 설치 경로의 Scripts 폴더에 가 보시면 mod_wsgi-express.exe 파일이 있을 겁니다. 제대로 설치 된 것이라고 보면 됩니다.

 

4. httpd.conf 파일 설정

다음으로 아파치 환경설정파일을 손을 봐줘야 합니다. 위치는 F\Apache24\conf\httpd.conf 이고 넣을 내용은 

mod_wsgi-express module-config

라고 치면 나오는 내용을 복사해 넣습니다.

 

 

파이썬이 C:\program Files\Python38 을 사용하고 있는줄 알았는데, 아나콘다에서 다시 설치한 버전이 있었네요. wsgi는 다른 곳에 딸렸는데, 실행은 anaconda 버전으로 한다??...ㅠㅠ. 암튼 그 내용을 httpd.conf에 넣어줍니다.

 

LoadFile "c:/programdata/anaconda3/python38.dll"
LoadModule wsgi_module "c:/programdata/anaconda3/lib/site-packages/mod_wsgi/server/mod_wsgi.cp38-win_amd64.pyd"
WSGIPythonHome "c:/programdata/anaconda3"

파일을 열면 내용이 엄청 많은데, LoadModule 뒷부분에 바로 이어서 넣어주면 됩니다.

 

 

위 그림에서 WSGIScriptAlias / "D:/05_Program_dev/04_python/04_flaskapp/httpd.wsgi" 부분은 잠시 뒤에 설명하겠습니다.

 - LoadFile과 LoadModule 부분은 mod_wsgi 모듈을 로드하기 위한 부분이고

 - WSGIPythonHome은 파이썬 실행파일이 있는 폴더를 인식시켜주는 부분입니다.

 

5. httpd.wsgi 작성

실제 앱을 구동시킬 wsgi파일을 구현합니다.

import sys

sys.path.insert(0, "D:/05_Program_dev/04_python/04_flaskapp")

from app import app as application

필자의 앱은 아래와 같이 구성되어있는데, 위 코드의 sys.path.insert의 두번째 인자는 이 flask앱 폴더(04_flaskapp)를 경로 포함하여 넣어주면 되고, 임포트 하는 부분에서는 내부의 앱을 불러오면 됩니다. from app import app 하게 되면 파이썬 특성에 따라 __init__.py가 자동으로 실행되고, __init__.py 내부에 선언한 라우팅에 따라 template들을 출력하게 됩니다. 

 

 

사실 프로그램 구동을 위한 start_app.py를 실행하려고 했는데 직접 __init__.py를 불러오는 꼴이 되었습니다. 한단계 덜 거치는게 좋은 것도 같은데... 어떤게 좋은 건지는 계속 공부해보도록 하겠습니다.

 

6. httpd.conf에 연결

위에서 만든 httpd.wsgi를 아파치 서버에서 실행하도록 연결해 주려면 아까 수정하던 httpd.conf를 사용하여 인식시켜줘야 합니다.

WSGIScriptAlias / "D:/05_Program_dev/04_python/04_flaskapp/httpd.wsgi"

라우팅 "/" 로 들어오는 경우에는 "D:/05_~~~~.wsgi"를 실행한다 정도로 이해하시면 되겠습니다.

 

..

....

......

 

다른 블로그들을 보면 <Directory> <Files> 등을 설정하는 부분이 있는데, 현재로서는 의미를 잘 모르고, 이렇게만 해도 인식이 되는 것을 확인했습니다. 

 

아래는 이것저것 시도해보았지만 잘 안된 부분인데, 주요 인자가 있어서 혹시 필요한 경우를 대비해 기록으로 남겨놓을 까합니다.

LoadFile "c:/programdata/anaconda3/python38.dll"
LoadModule wsgi_module "c:/programdata/anaconda3/lib/site-packages/mod_wsgi/server/mod_wsgi.cp38-win_amd64.pyd"
WSGIPythonHome "c:/programdata/anaconda3"

<VirtualHost *:80>
    ServerName localhost
    WSGIScriptAlias / "D:/05_Program_dev/04_python/04_flaskapp/httpd.wsgi"
    <Directory "D:/05_Program_dev/04_python/04_flaskapp/">
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    <Directory "D:/05_Program_dev/04_python/04_flaskapp/app">
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>

</VirtualHost>

 

<IfModule wsgi_module>
## 웹서비스 "/" 경로에 wsgi 인터페이스 경로 지정
WSGIScriptAlias / /apps/python/src/flask/httpd.wsgi
## Python app 프로세스 실행 환경 설정
WSGIDaemonProcess app user=python group=apps threads=1
</IfModule>

## Python app 서비스를 위한 app source 경로 권한 설정
<Directory "/apps/python/src">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

<Directory /apps/python/src/flask>
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>

VirtualHost *:80 => 호스트를 지정하며 포트는 80포트를 사용한다. 포트가 겹쳐도 호스트가 다르기 때문에 상관없다.

ServerAdmin => 서버의 주인.

ServerName => 서버의 주소. 이 주소를 통해서 접근.

ServerAlias => 축약된 형태로 접근할 별명.

ErrorLog => 서버 접근시 일어는 에러 메시지를 기록하는 파일을 정한다. 이 속성을 정했다면 반드시 해당폴더가 존재해야한다.

CustomLog => 서버 기록을 기록하는 파일을 정한다. 이 속성을 정했다면 반드시 해당폴더가 존재해야한다.

WSGIDaemonProcess => wsgi를 데몬으로 실행시킬 때 프로세스 이름. 사용자 정의 가능

WSGIProcessGroup => wsgi프로세스 그룹이름. 사용자 정의가능

WSGIScriptAlias => wsgi를 실행시킬 스크립트의 위치. 우리가 만든 파일의 위치를 지정해준다.

Alias => 특정 파일의 별면. 보통 static으로 해야 하는데, 이는 WAS가 static에 접근해야하기 때문

 

 

- 끝 - 

 

반응형
반응형

간단히 Database를 조회/입력할 수 있도록 Form 을 구성하겠습니다. 작동방식은, 최초 접근 시 아래와 같이 DB의 데이터를 보여줍니다.

1. 초기화면

텍스트 필드에 ID(1, 2, 3..)을 입력하면 해당하는 결과만 나타나게 합니다.

2. 검색화면

마지막으로, 아래의 데이터 입력폼에 데이터를 입력하면 데이터가 등록되면서, 다시 초기화면에서 전체 리스트를 출력합니다.

3. 데이터 입력화면

데이터베이스에는 Member 테이블이 있고, 인원을 몇명 넣어줄 예정입니다. 필드는 ID, Name, Email이 있습니다.

 

1. 프로젝트 구성

프로젝트 구성은 아래와 같습니다. Django 프로젝트 / 앱생성이나 기본 설정은 Django 시작하기 다른 포스트를 참조하시기 바랍니다.

pip install django // 장고 설치

django-admin startproject mysite .  // mysite 프로젝트 시작

django-admin startapp members // members 앱 작성

<mysite/settings.py>

 

2. members/models.py

Members 모델클래스를 최대한 간단히 정의하겠습니다. Database는 sqlite를 사용하고, 제 프로젝트에서는 db폴더에 저장해놓았습니다. (하단 settings.py참조)

from django.db import models

# Create your models here.
from django.db import models

# Create your models here.
class Members(models.Model):
    id = models.IntegerField('ID', primary_key=True, auto_created=True)
    name = models.CharField('NAME', max_length=50)
    email = models.CharField('EMAIL', max_length=100, blank=True)

    def __str__(self):
        return self.name

 

3. members/admin.py

Members 데이터를 admin 사이트에서 조작 가능하도록 등록해줍니다.

from django.contrib import admin

# Register your models here.
from members.models import Members

admin.site.register(Members);

 

4. 데이터 Migration

python manage.py makemigrations

python manage.py migrate

 

5. templates/home.html파일 작성

조회시, form의 action url에 "."만 작성하면 동일한 url에서 처리하게 되고, 현재의 페이지에서 이동없이 데이터만 새로고침 해 줍니다. 따라서 "/members/" url에서 데이터를 처리합니다.

데이터 입력시에는 "/members/add" url에서 데이터를 처리합니다. 

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />

<!-- 조회폼 -->
<form action="." method="get">
    {% csrf_token %}
    <input type="text" name="q" value="{{ q }}">
    <input type="submit" value="Submit">
</form>

{% if member_list %}
<ul>
    {% for member in member_list %}
    <li><a href="/members/{{ member.id }}">{{ member.id }} &nbsp {{ member.name }} &nbsp {{ member.email }}</a></li>
    {% endfor %}
</ul>
{% else %}
<p><li>No members are available.</li></p>
{% endif %}

<!-- 입력폼 -->
<form action="{% url 'members:add' %}" method="post">
    {% csrf_token %}
    <input type="text" name="id" value="{{ id }}">
    <input type="text" name="name" value="{{ name }}">
    <input type="text" name="email" value="{{ email }}">
    <input type="submit" value="Submit">
</form>
</body>
</html>

6. members/urls.py

"/members/"를 처리하기위한 url을 작성합니다. 이 url로 요청이 들어오면 views.index 함수에서 처리합니다.

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

from . import views

app_name='members'

urlpatterns = [
    path('', views.index, name='home'),
    path('add/', views.add, name='add'),
]

members 앱의 url은 mysite/urls.py의 서브 url로 정의되어있어야 합니다.

<mysite/urls.py>

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

from mysite.views import HomeView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', HomeView.as_view(), name='home'),
    path('members/', include('members.urls')),  // 잊지말고 추가!!
]

 

7. members/view.py 

조회함수는 초기 화면구성 함수인 index에 함께 구성합니다. 기본은 모든 members리스트를 다 보여주고, 조회조건이 있을 시에는, 데이터를 GET방식으로 가져와 query하여 결과를 context에 실어서 보여줍니다.

 

입력함수는 별도로 add라는 함수를 구성하였습니다. index.html의 입력폼에서 id/name/email을 가져와 Member 클래스의 객체를 생성하고, 다시 home url로 보냅니다. 그러면 초기 화면에서는 전체 리스트를 보여줍니다.

from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse

from members.models import Members

#### 초기화면 및 조회함수 ####
def index(request):
    list = Members.objects.all()
    # HTML에서 인자가 전달될 경우 처리
    q = request.GET.get('q', '')
    if q:
        list = Members.objects.filter(id=q)
    # 여기까지

    context = {'member_list': list}
    return render(request, 'index.html', context)

#### 입력함수 ####
def add(request):
    id = request.POST.get('id','')
    name = request.POST.get('name','')
    email = request.POST.get('email', '')

    member_add = Members(id=id, name=name, email=email)
    member_add.save(force_insert=True)

	# 데이터 입력 후에는 첫페이지 url로 다시 보냅니다.
    return HttpResponseRedirect(reverse('members:home'))

 

참고로, 폴더 구성/인식을 위한 기본 세팅을 아래에 적어놓습니다.

<참고: mysite/settings.py>

"""
Django settings for mysite project.

Generated by 'django-admin startproject' using Django 3.2.9.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-t)05#=7yvsemt_tyu9dksl7j$$br(7wfgyguds3@#-bj5t$m+7'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'members.apps.MembersConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'mysite.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [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',
            ],
        },
    },
]

WSGI_APPLICATION = 'mysite.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db' / 'db.sqlite3', # 수정
    }
}


# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Seoul' # 수정

USE_I18N = True

USE_L10N = True

USE_TZ = False # 수정


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/

STATIC_URL = '/static/'

# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

### 추가 ###
STATICFILES_DIR = (BASE_DIR/'static',)
# STATIC_ROOT = # 배포시 사용

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR/'media'

# AUTH_USER_MODEL =
# LOGGING =

~~~끝~~~

반응형

'Programming > Python_Web' 카테고리의 다른 글

Flask - mysql 연동  (0) 2020.08.21
Flask - apache 연동(mod_wsgi)  (0) 2020.08.21
Django - Oracle연동 (11g), inspectdb 사용법  (3) 2020.05.21
Django - IIS에서 static file 설정하기  (0) 2020.05.14
Django - CSS적용하기  (0) 2020.05.13
반응형

아...힘든 하루네요.

회사에서 쓰는게 oracle 11g 2Release 32bit라서 이걸 모델로 집에서 django랑 연동 테스트 해보려고 삽질을 시작했는데... 오전 9:30분에 시작해서 지금, 오후 10:00에서야 드디어 완성했습니다. 그것도 완전한 완성이라고 볼 순 없고 부분적으로 모자란 부분이 있습니다.

 

오늘 최종적으로 성공한 각 프로그램/모듈의 버전은 아래와 같습니다.

  oracle 11g 2Release 64bit

  Python 3.6.1 64bit

  Django 1.11.22

  cx_Oracle 6.3

 

32비트고 뭐고 왔다갔다 하느라 정신없어서..64비트로 우선 통일!

안되는 영어로 계속 뒤져보니까 요즘나오는 Django 3.0이나 2.X대 버전은 oracle 11g를 지원을 안한다고 합니다. 가능한 버전이 Django 1.11.XX대 버전이라고 합니다. 문제는 얘도 Python 버전을 가리는데..최신 3.8은 안되고 2.7 ~ 3.6 까지만 된다네요.... 버전맞추기 참 힘듭니다. cx_Oracle은 나중에 알아보니 그냥 최신 깔아도 될 것 같습니다. 여기까진 그냥 고생한 내용이고..

현재는 버전에 크게 상관없이 잘 구동이 됩니다.

 

Django와 Oracle 연동하는 방법을 알아보겠습니다. 피곤해서 캡쳐는 생략하겠습니다. (나중에 시간나면 업뎃하는걸로..)

 

1. 버전 확인. 오라클과 연동할 때 같은 32bit 또는 64bit인지 꼭 확인합니다.

=> 64bit를 기본으로 깔면 32bit와 연동할 때에도 큰 문제없이 가능합니다.

 

2. oracle 11g와 연동할 django 1.11.22버전 설치합니다.

  - pip install django~=1.11.22

(특정 버전을 골라 설치하려면 이렇게 해도 되지만, Django 3.0부터는 ASGI를 지원하므로, 굳이 구버전을 설치할 필요는 없습니다.)

 

3. DB연동을 위한 cx_Oracle을 설치합니다.

  - pip install cx_Oracle

 

4. 프로젝트 생성

  - django-admin startproject mysite (새로 생성되는 mysite폴더에 manage.py가 생성됩니다. 귀찮아짐..)

  - django-admin startproject mysite . (마지막에 . 을 찍어주면 현재 폴더에 manage.py가 생성됩니다.)

 

5. 앱 생성

  - python manage.py startapp polls

 

6. Database 접속정보 수정

 

 

 

7. inspectdb를 이용하여 models.py생성

  - python manage.py inspectdb test>polls/models.py

  - error발생 가능: TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

  - Django 버전을 꼭 확인하시기 바랍니다. Django 2.0이상 버전은 oracle11g와 안맞는다네요...가끔 했다는 분들도 계신데, 그냥 고수이신걸로...ㅠㅜ

 

8. python manage.py migrate --fake-initial (기존 Oracle 데이터가 있을 경우 불요)

  - error발생 가능: django.db.utils.DatabaseError: ORA-00955: name is already used by an existing object

  - 최초 migration한 파일이 남아있을 수 있으니 지우고 다시

    python manage.py makemigrations 와

    python manage.py migrate --fake-initial 수행하고 진행하시기 바랍니다.

  - Database 테이블이 초기화 상태이어야 합니다. 데이터가 있으면 이 에러메시지가 발생합니다. 좀 이상한데,, 데이터가 존재하는 경우 연동을 어떻게 시키는지 아시는 분께서 답글좀 달아주시면 정말 감사하겠습니다.

 

오전 9시30분부터 시작해서 저녁 10:00 완료하기까지 알아낸 것 치고는 별거 없네요...

Python, Django, Oracle 버전 맞춘다고 지웠다 깔았다 계속하고, 특히 오라클 지우고 3번 다시 까느라 시간 다 보내고,

Django가 쉽다는데.....너무 어렵게 시작하는 것 같은...

 

 

 

그럼 이만~

 

(ps) 2020.06.03: 기존 오라클의 데이터가 있을 경우 makemigrations와 migrate는 없어야합니다. DB정보만 잘 입력해주면, 그리고 inspectdb만 잘 끌어오면 기존 데이터는 접근 가능합니다.

 

(ps) 2021.11.19: 특정 테이블만 가져오기

# python manage.py inspectdb --database=디비명 테이블명1 테이블명2 > 폴더이름/models.py 

python manage.py inspectdb --database=default TEMP TEMP2 > ./models/models.py

 

반응형
반응형

회사에서 쓰는 windows server2012에서 장고를 실행하려고 알아본 내용을 남깁니다.

 

1. Static 파일을 위한 '가상 디렉터리 추가'

(Django_ex)장고 사이트를 우클릭한 뒤 가상 디렉터리 추가를 클릭해줍니다.

 

2. 별칭과 실제 경로를 적어줍니다.

3. 핸들러 위치 조정: Django_ex(장고 사이트) -> 처리기 매핑 ->정렬된 목록보기

StaticFile을 가장 위로 옮겨줍니다. 아래쪽에 있는 핸들러는 위쪽 핸들러로부터 상속을 받기 때문에, 아래쪽에 있으면 제대로 작동이 안됩니다.

왼쪽에서 사이트 클릭 후 가운데 화면에서 '처리기 매핑' 선택 클릭
화면 기본 설정은 이름 알파벳 순으로 되어있음. 오른쪽에서 '정렬된 목록보기' 클릭

 

실행 우선순위로 정렬된 모습. StaticFile을 최상위로 올려준다.(우측 위/아래 이동버튼 이용)

(ps) 외부 포트연결이 설정이 안되어있을 경우 여전히 사이트가 접속 안될 수 있습니다. 포트가 제대로 개방되어있는지 확인하시기 바랍니다. (이전 포스트 참조^^)

 

(끝)

 

반응형
반응형

Django에 CSS를 적용하는 방법은 어렵지 않은데... 적용하려면 저같은 초보한테는 쉽지않네요. 

우선 기록으로 남겨놓습니다.

 

1. mysite/setting.py의 STATIC정보를 수정/확인합니다.

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

2. CSS파일 생성(style.css)하여 아래 경로에 위치시킵니다.

mysite/static/css/style.css

li a {

    color: green;

}

3. HTML에 static file 로딩부분을 추가해줍니다.

{% load static %}   # 버전에 따라 staticfiles
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="{% static 'css/style.css' %}" />
    <title>Title</title>
</head>

 

~~끝~~

 

(ps)

각 앱별로 static파일을 정의해놓았을 경우, STATICFILES_DIR 대신

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

를 설정하고,

python manage.py collectstatic 명령어를 주어 /static/폴더내로 복사해주면 적용됨.

 
 
반응형

+ Recent posts