이전 포스트에서는 MySQL을 연동하는 방법을 알아보았습니다.

하지만 이 방법으로는 나중에 추가적인 기능을 개발하고, 또 다시 연동하는 데 있어서 매우 어려움이 있습니다..

즉, 계속해서 데이터베이스를 다시 접근하고 닫고를 반복해야 하는 이유 때문입니다.


따라서, DB를 따로 새로운 클래스로 구분하여 이를 사용하는 방법이 필요합니다.


이번에는 MySQL을 이용하기 위한 클래스 생성 및 연동하는 방법을 알아보도록 하겠습니다.


다른 플라스크 예제는 아래의 링크를 살펴봐주시기 바랍니다~



[Python Flask] 웹 페이지 만들기 01 - 환경 설정

[Python Flask] 웹 페이지 만들기 02 - 기본 파일 작성하기

[Python Flask] 웹 페이지 만들기 03 - 파이썬에서 웹으로 값 전달

[Python Flask] 웹 페이지 만들기 04 - Bootstrap 연동하기

[Python Flask] 웹 페이지 만들기 05 - MySQL 연동하기(pymysql)






01. 개발 디렉토리 설정 변경

먼저 개발을 수행하기 앞서, 프로젝트 내부에 있는 디렉토리를 추가적으로 생성할 필요가 있습니다.

우리가 추가할 디렉토리는 다음과 같이 나타나 있습니다.


[Project Name]

└ [app]

      └ [test]

            └ 테스트를 위한 폴더

      └ [module]

            └ 모듈로써 사용할 python 소스

      └ [schema]

            └ MySQL에서 실행할 SQL 소스

      └ [static]

            └ 자바스크립트, CSS, 이미지 등...

      └ [templates]

            └ HTML 파일들(폴더별로 정리 가능)

            └ [test]

                  └ 테스트를 위한 폴더

└ config.py

└ run.py


기존의 디렉토리에 module이라는 폴더를 새로 생성하고 그 아래에 우리가 사용할 module로써 사용할 python 소스를 작성할 것입니다.

여기서 우리는 dbModule.py라는 파일을 생성합니다.




02. Database 클래스 모듈 파일 작성

이 파일은 새로운 기능을 생성할 때마다 import 시켜 사용될 파일입니다.

dbModule.py 파일은 다음과 같습니다.

# file name : dbModule.py
# pwd : /project_name/app/module/dbModule.py

import pymysql

class Database():
    def __init__(self):
        self.db = pymysql.connect(host='localhost',
                                  user='root',
                                  password='your_password',
                                  db='your_dbname',
                                  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.db.commit()


원래는 Database 클래스를 선언하고, execute함수를 사용한 후 fetch함수와 commit() 함수 등으로 DB를 이용해야 했습니다.

하지만 위와 같은 클래스를 이용하면 보다 편리하게 사용할 수 있게 됩니다.

그러면 이제 이 클래스를 사용해보도록 하겠습니다.




03. Database 클래스 사용 예제

이 예제는 Database를 사용하기 위한 예제입니다.

여기서 제공되는 예제는 sql 소스, python 소스, HTML 소스가 있습니다.


SQL 예제 소스

-- file name : test.sql
-- pwd : /project_name/app/schema/test.sql

CREATE DATABASE testDB default CHARACTER SET UTF8;

use testDB;

CREATE TABLE testTable(
    idx      INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    test     VARCHAR(256) NOT NULL
) CHARSET=utf8;


이제 이 예제를 이용하여 INSERT, SELECT, UPDATE를 모두 실습해보도록 합니다.

먼저 실습 파이썬 파일을 제작하기 전에 Ubuntu 16.04. 의 MySQL에 테이블을 생성하도록 합니다.


MySQL DB 생성 및 Table 생성은 다음 예제와 같습니다.


이제 DB 생성과 Table 생성이 모두 완료되었으니, INSERT 예제와 SELECT, UPDATE 예제를 살펴보시겠습니다.



HTML 소스 예제

먼저 HTML 소스를 통해 파이썬 소스를 실행할 버튼들을 만들어봅시다.

HTML 소스는 다음과 같습니다.

<!DOCTYPE html>
<html lang="en">
<head>
  <h1> head Test </h1><br>
</head>

<body>

  <input type="button" value="INSERT 예제" onclick="location.href='/test/insert'">
  <input type="button" value="SELECT 예제" onclick="location.href='/test/select'">
  <input type="button" value="UPDATE 예제" onclick="location.href='/test/update'">

  <br><br><br>
  <div>
      INSERT result : {{result}}
  </div>
  <br>
  <div>
      SELECT result idx  : {{resultData.idx}}<br>
      SELECT result test : {{resultData.test}}
  </div>
  <br>
  <div>
      UPDATE result idx  : {{resultUPDATE.idx}}<br>
      UPDATE result test : {{resultUPDATE.test}}
  </div>
  <br>
  
</body>
</html>


여기서 각각 INSERT 예제, SELECT 예제, UPDATE 예제를 실행시킬 버튼과 결과를 보여주는 영역을 작성했습니다.

이제 파이썬 소스를 보시겠습니다.



Python 소스 예제

Python 소스는 위의 HTML 소스 예제와 마찬가지로 각각의 예제로 작성되었습니다.

# file name : test.py
# pwd : /project_name/app/test/test.py

from flask import Blueprint, request, render_template, flash, redirect, url_for
from flask import current_app as current_app

from app.module import dbModule

test = Blueprint('test', __name__, url_prefix='/test')

@test.route('/', methods=['GET'])
def index():
    return render_template('/test/test.html',
                            result=None,
                            resultData=None,
                            resultUPDATE=None)



# INSERT 함수 예제
@test.route('/insert', methods=['GET'])
def insert():
    db_class = dbModule.Database()

    sql      = "INSERT INTO testDB.testTable(test) \
                VALUES('%s')" % ('testData')
    db_class.execute(sql)
    db_class.commit()

    return render_template('/test/test.html',
                           result='insert is done!',
                           resultData=None,
                           resultUPDATE=None)



# SELECT 함수 예제
@test.route('/select', methods=['GET'])
def select():
    db_class = dbModule.Database()

    sql      = "SELECT idx, test \
                FROM testDB.testTable"
    row      = db_class.executeAll(sql)

    print(row)

    return render_template('/test/test.html',
                            result=None,
                            resultData=row[0],
                            resultUPDATE=None)



# UPDATE 함수 예제
@test.route('/update', methods=['GET'])
def update():
    db_class = dbModule.Database()

    sql      = "UPDATE testDB.testTable \
                SET test='%s' \
                WHERE test='testData'" % ('update_Data')
    db_class.execute(sql)    
    db_class.commit()

    sql      = "SELECT idx, test \
                FROM testDB.testTable"
    row      = db_class.executeAll(sql)

    return render_template('/test/test.html',
                            result=None,
                            resultData=None,
                            resultUPDATE=row[0])



이제 이 파일을 실행시키게 되면 다음과 같은 모습으로 나타나게 됩니다.


INSERT 예제 수행 결과


SELECT 예제 수행 결과


UPDATE 예제 수행 결과



Python Flask는 다양한 sql 모듈을 사용할 수 있습니다.

간단하게 SQL 파일을 사용하려면 sqlite를 사용하면 되고, MySQL과 같은 체계적인 시스템을 사용하려면 pymysql을 사용하면 됩니다.


이번 포스트에서는 MySQL과의 연동을 위해 pymysql 모듈을 사용하려고 합니다.


다른 플라스크 예제는 아래의 링크를 살펴봐주시기 바랍니다~



[Python Flask] 웹 페이지 만들기 01 - 환경 설정

[Python Flask] 웹 페이지 만들기 02 - 기본 파일 작성하기

[Python Flask] 웹 페이지 만들기 03 - 파이썬에서 웹으로 값 전달

[Python Flask] 웹 페이지 만들기 04 - Bootstrap 연동하기

[Python Flask] 웹 페이지 만들기 06 - MySQL 연동하기(DB 클래스 생성)




먼저 pymysql의 예제입니다.


CREATE Table 예제

이 예제는 데이터베이스를 연결하고 Table을 생성하는 방법을 나타냅니다.

import pymysql

# database에 접근
db = pymysql.connect(host='localhost',
                     port=3306,
                     user='root',
                     passwd='your_password',
                     db='your_dbname',
                     charset='utf8')

# database를 사용하기 위한 cursor를 세팅합니다.
cursor = db.cursor()

# SQL query 작성
sql = """CREATE TABLE test_table(
         idx  INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
         name VARCHAR(256) NOT NULL,
         nick VARCHAR(256) NOT NULL
         );"""

# SQL query 실행
cursor.execute(sql)

# SQL query가 잘 실행됐는지 table을 살펴보도록 합니다.
# 이미 4번 라인에서 use database를 수행한 것과 다름 없으니 show tables라는 명령을 수행해도 문제가 없습니다.
cursor.execute("show tables") 

# 데이터 변화 적용
# CREATE 혹은 DROP, DELETE, UPDATE, INSERT와 같이 Database 내부의 데이터에 영향을 주는 함수의 경우 commit()을 해주어야 합니다.
db.commit()

# Database 닫기
db.close()

위의 예제에서 대략적인 내용은 모두 작성되었습니다.


이를 조금 더 깔끔하게 한다면 다음과 같이 작성해보는 것도 괜찮을 것 같습니다..

import pymysql
 
db = pymysql.connect(host='localhost',
                     port=3306,
                     user='root',
                     passwd='your_password',
                     db='your_dbname',
                     charset='utf8')
try:
    with db.cursor() as cursor:
        sql = """
            CREATE TABLE test_table(
                   idx  INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
                   name VARCHAR(256) NOT NULL,
                   nick VARCHAR(256) NOT NULL,
            );
        """
        cursor.execute(sql)
        db.commit()
finally:
    db.close()



INSERT 예제

이 예제는 Database와 Table이 완성된 후 Table 내에 데이터를 삽입하는 방법에 대한 예제입니다.

# db 연결작업은 위의 예제에서...

# SQL query 작성
sql = """INSERT INTO test_table(name, nick)
         VALUES('test_name', 'test_nickname');"""

# SQL query 실행
cursor.execute(sql)

# 데이터 변화 적용
db.commit()


위의 예제로 test_table에 'test_name'과 'test_nickname'이라는 값을 삽입하게 됩니다.




SELECT 예제

이 예제는 Database와 Tables 내에 데이터를 조회하는 방법에 대한 예제입니다.

# db 연결작업은 위의 예제에서...

# SQL query 작성
sql = """SELECT * FROM test_table"""

# SQL query 실행
cursor.execute(sql)

# SQL query 실행 결과를 가져옴
result = cursor.fetchall()


SELECT에서는 db.commit() 함수를 실행시키지 않습니다.

이는 DB 내부의 데이터에 영향을 주지 않고, 단지 조회만 했기 때문입니다.

단, 조회된 데이터는 우리가 사용할 수 있어야 하기 때문에 따로 result라는 변수에 실행 결과 값을 가져와야겠지요.

이를 위해서는 fetchall() 함수 혹은 fetchone() 함수를 이용하여 값을 가져와야 합니다.


데이터가 여러 개라면 fetchall() 함수를, 데이터가 하나라면 fetchone() 함수를 사용하는 것이 좋습니다.


가져온 결과는 다음과 같습니다.

print(result)
# ['name' : 'test_name', 'nick' : 'test_nickname']


결과는 dictionary 형태로 가져와집니다.

이를 유념하영 사용하는 것이 좋습니다.



UPDATE 예제

이 예제는 Database와 Tables 내에 데이터를 변경하는 방법에 대한 예제입니다.

# db 연결작업은 위의 예제에서...

# SQL query 작성
sql = """UPDATE test_table SET name='%s', nick='%s'
         WHERE name='%s' """ % ('new_test', 'new_nick', 'test_name')
         
# SQL query 실행
cursor.execute(sql)

# 데이터 변화 적용
db.commit()


위의 예제는 기존에 업로드한 데이터를 변경하는 예제입니다.

이름이 'test_name'인 데이터의 name 컬럼과 nick 컬럼을 각각 'new_test', 'new_nick'으로 변경하는 예제입니다.


이제 이러한 예제를 이용하여 다음 포스트에서는 데이터를 쓰고 업로드 하는 방법을 알아보도록 하겠습니다.





이전의 포스트들에서 작성했던 HTML파일들을 보여드리면 정말 초라하기 그지없었습니다.


이는 당연하게도 CSS와 Javascript 등의 기능이 완전 배제된 Text 위주의 페이지였기 때문입니다.

여기서 저는 Flask를 좀 더 화끈한 페이지로 만들어보고자 부트스트랩(Bootstrap)을 함께 연동하는 방법을 알아보고자 합니다.


다른 플라스크 예제는 아래의 링크를 살펴봐주시기 바랍니다~



[Python Flask] 웹 페이지 만들기 01 - 환경 설정

[Python Flask] 웹 페이지 만들기 02 - 기본 파일 작성하기

[Python Flask] 웹 페이지 만들기 03 - 파이썬에서 웹으로 값 전달

[Python Flask] 웹 페이지 만들기 05 - MySQL 연동하기(pymysql)

[Python Flask] 웹 페이지 만들기 06 - MySQL 연동하기(DB 클래스 생성)







01. 부트스트랩(Bootstrap) 다운로드

부트스트랩 다운로드 링크

부트스트랩을 다운로드 하는 페이지는 다음과 같이 나타나 있습니다.

여기서 [부트스트랩 다운로드]를 클릭합니다.




부트스트랩 파일을 다운로드 받으면 다음과 같은 압축파일이 다운받아집니다.

여기 있는 파일을 모두 [static] 폴더에 옮겨주시기 바랍니다.

여기까지 옮겼다면 바로 HTML 소스를 수정해봐야겠지요!




02. 부트르스탭 적용 및 HTML 파일 수정

이제 부트스트랩을 다운받았다면 다음과 메인 페이지의 HTML 소스를 다음과 같이 수정해볼 수 있습니다.

수정할 파일은 이전 포스트에서 작성했던 index.html 파일입니다.

<!DOCTYPE html>
<!-- saved from url=(0049)http://bootstrapk.com/examples/starter-template/# -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="http://bootstrapk.com/favicon.ico">

    <title>[Python Flask] 웹 페이지 만들기 - kkamikoon</title>

    <!-- Bootstrap core CSS -->
    <link href="/static/css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="/static/css/starter-template.css" rel="stylesheet">

  </head>

  <body>

    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="http://bootstrapk.com/examples/starter-template/#">[Python-Flask-Building-Web-Page]</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
          <ul class="nav navbar-nav">
            <li class="active"><a href="http://bootstrapk.com/examples/starter-template/#">Home</a></li>
            <li><a href="http://bootstrapk.com/examples/starter-template/#about">About</a></li>
            <li><a href="http://bootstrapk.com/examples/starter-template/#contact">Contact</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav>

    <div class="container">

      <div class="starter-template">
        <h1>Bootstrap starter template</h1>
        <p class="lead">Use this document as a way to quickly start any new project.<br> All you get is this text and a mostly barebones HTML document.</p>
      </div>

    </div><!-- /.container -->


    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="/static/js/jquery.min.js"></script>
    <script src="/static/js/bootstrap.min.js"></script>

</body></html>


위의 소스의 원본은 다음 링크에서 

부트스트랩 스타터 템플릿 예제 링크


이 예제에서 수정해준 부분은 중요표시를 해두었습니다.


모두 경로를 바꾸어주었는데, static 폴더 아래에 저장한 css 혹은 js 경로를 바꾸어주었습니다.

단, 여기서 우리가 따로 다운로드하지 않은 소스가 있습니다.


18번 라인과 58번 라인입니다.

해당 라인의 소스는 아래에서 다운로드 받으실 수 있습니다.


jquery.min.js

starter-template.css


혹은 부트스트랩 스타터 템플릿 예제 링크를 들어가셔서 Ctrl + s를 하시면 HTML 파일과 함께 폴더가 생성됩니다.

해당 폴더 내부에 위 파일들이 다운로드되어 있는 것을 볼 수 있으니 편한 방법으로 사용하시면 되겠습니다.




03. 결과

위의 소스를 index.html에 작성했다면 다음과 같이 나타날 것입니다.



이전의 포스트에서는 Flask를 사용하기 이전에 시작하는 법을 작성했습니다.

이번에는 파이썬에서 값을 전달하는 방법을 알아보도록 하겠습니다.


Javascript 혹은 HTML 자체로 값을 생성해서 웹을 사용한다는 건 사실상 불가능합니다.

PHP와 같은 플랫폼에서도 시스템 내부(백엔드)에서 MySQL과 연동한다거나 값을 긁어와 뿌려주는 기본적인 기능이 있는 것처럼, Python Flask에도 이러한 기능이 있습니다.


단, Flask에서는 마치 함수 내에 인자값을 던져주듯이 한다는 점이 조금 독특합니다.


다른 플라스크 예제는 아래의 링크를 살펴봐주시기 바랍니다~



[Python Flask] 웹 페이지 만들기 01 - 환경 설정

[Python Flask] 웹 페이지 만들기 02 - 기본 파일 작성하기

[Python Flask] 웹 페이지 만들기 04 - Bootstrap 연동하기

[Python Flask] 웹 페이지 만들기 05 - MySQL 연동하기(pymysql)

[Python Flask] 웹 페이지 만들기 06 - MySQL 연동하기(DB 클래스 생성)






01. Python에서 작성한 값 넘겨주기

먼저 이전에 작성했던 index.py 코드에 다음과 같은 값을 넣어주었다고 가정합시다.

# file name : index.py
# pwd : /project_name/app/main/index.py
from flask import Blueprint, request, render_template, flash, redirect, url_for
from flask import current_app as current_app

main = Blueprint('main', __name__, url_prefix='/')

@main.route('/main', methods=['GET'])
def index():
    testData = 'testData array'

    return render_template('/main/index.html', testDataHtml=testData)


위에 표시된 10번과 12번 라인은 조금 추가되고 수정된 영역입니다.


먼저 10번 라인은 여러분이 데이터를 HTML 파일에 전달하고자 하는 데이터입니다.

굳이 String 값일 필요는 없지만, 저는 대부분 String 값 혹은 Dictionary 데이터를 전달하는 것을 선호합니다.

(기본적으로 MySQL에서 나온 값이 Dictionary 형태를 띄기 때문입니다. MySQL은 다음 포스트에서 다루도록 하겠습니다.)


이제 이 값을 render_template 함수의 두 번재 인자값으로 넣어주려고 합니다.

12번 라인에서 testDataHtml 이라는 변수 이름에 String 데이터가 저장된 testData를 넣어줍니다.

변수 이름은 아무렇게나 지어도 상관없습니다~


이제 이 데이터를 어떻게 전달 받는지가 중요합니다.




02. Python에서 넘겨받은 값 사용하기

HTML 소스를 보시겠습니다.

<html>
    <head>
        This is Main page Head<br>
    </head>
    <body>
        This is Main Page Body<br>
        And This is Accepted Data : {{testDataHtml}}
    </body>
</html>


위의 소스코드는 이전의 소스코드보다 조금 추가된 게 있습니다. ㅎㅎ

단, 유의해서 보실 부분이 바로 7번 라인입니다.


자세히 보시면 중괄호가 두 번 되어있고, Python에서 넘겨준 인자값의 변수 이름이 그대로 들어가 있는 것을 볼 수 있습니다.

즉, 우리가 저장했던 값이 저 변수에 들어가 있으니, 이 값을 불러와 뿌려주겠다는 의미입니다.





03. 결과


testData array라는 값이 제대로 출력되는 것을 볼 수 있습니다.

이를 활용하여 여러 가지를 할 수 있을 것입니다.




이전의 포스트에서는 Flask를 사용하기 이전에 환경 설정을 수행한 것을 작성했습니다.

이번에는 본격적으로 예제를 통해 시작해보도록 하겠습니다.


아참, 시작하기 앞서 해당 반드시 환경 설정을 마무리 하시기 바랍니다.


[Python Flask] 웹 페이지 만들기 01 - 환경 설정


앞으로 작성될 파이썬 파일과 HTML 파일은 Ubuntu 16.04 환경에서 작성할 것입니다.


이외의 다른 플라스크 예제는 아래의 링크를 살펴봐주시기 바랍니다~



[Python Flask] 웹 페이지 만들기 03 - 파이썬에서 웹으로 값 전달

[Python Flask] 웹 페이지 만들기 04 - Bootstrap 연동하기

[Python Flask] 웹 페이지 만들기 05 - MySQL 연동하기(pymysql)

[Python Flask] 웹 페이지 만들기 06 - MySQL 연동하기(DB 클래스 생성)






01. run.py 작성

먼저 프로그램을 시작하는 프로그램을 작성해야 합니다.

run.py 라는 프로그램을 [Project Name] - [app] 디렉토리에 생성하여 다음과 같이 작성합니다.

# file name : run.py
# pwd : /project_name/run.py

from app import app

app.run(host="0.0.0.0", port=80)


생각보다 별 거 없는 내용에 안심하시면 안 됩니다.

뒤에는 더한 코드들과 신경쓸 것들이 넘쳐나기 때문이지요...


먼저 run.py는 위와 같이 해두어도 무관하니 이제 우리가 작성할 메인 페이지를 작성해보도록 합시다.




02. __init__ 파일 작성

__init__.py 파일은 위에서 선언한 from app import app을 통해 실행되는 모든 파일들을 전체적으로 초기화 및 실행하기 위한 파일입니다.

때문에 위의 파일은 하위 디렉토리의 모든 파일을 초기화 및 실행해주는 파일이 필요하다는 것입니다.

그 파일을 작성하는 방법은 다음과 같습니다.

# file name : __init__.py
# pwd : /project_name/app/__init__.py

from flask import Flask

app = Flask(__name__)

# 추가할 모듈이 있다면 추가
# config 파일이 있다면 추가

# 앞으로 새로운 폴더를 만들어서 파일을 추가할 예정임
# from app.main.[파일 이름] --> app 폴더 아래에 main 폴더 아래에 [파일 이름].py 를 import 한 것임

# 위에서 추가한 파일을 연동해주는 역할
# app.register_blueprint(추가한 파일)


위의 주석들은 아래에서 파일을 입력한 후 알아보도록 하겠습니다.




03. 메인 페이지 파일 작성

메인페이지와 이제 앞으로 여러분이 추가할 내용에 따라 다르게 구분을 해주는 것이 좋겠지요?

때문에 저는 main 페이지를 작성하기 위해 폴더별로 구분을 해주었습니다.


아래의 소스코드는 [Project Name] - [app] - [main] - index.py 와 같은 순서로 디렉토리를 구분하여 만들었습니다.

# file name : index.py
# pwd : /project_name/app/main/index.py

from flask import Blueprint, request, render_template, flash, redirect, url_for
from flask import current_app as app
# 추가할 모듈이 있다면 추가

main = Blueprint('main', __name__, url_prefix='/')

@main.route('/main', methods=['GET'])
def index():
      # /main/index.html은 사실 /project_name/app/templates/main/index.html을 가리킵니다.
      return render_template('/main/index.html')


위의 소스 파일에서 유의해야 할 점을 표시해보았습니다.


먼저 8번 라인은 index 파일을 들어갔을 때 어떻게 이름을 설정할지 결정하는 부분이며, url_prefix는 URL을 어떻게 뒤에 붙일지 결정하는 부분입니다.

그리고 10번 라인은 파일 내부에서 어떤 경로로 나타낼지 결정하는 부분입니다.

11번 라인은 큰 의미는 없지만, 나중에 url_for에서 사용될 함수 이름을 유심히 봐두시기 바랍니다.

13번 라인은 12번 라인의 설명과 같습니다.


파이썬 소스를 모두 작성했다면 이제 13번 라인에서 불려들일 template 파일 즉, HTML 파일을 작성해주어야 합니다.


HTML 파일은 다음과 같습니다.

<!--file name : index.html-->
<!--pwd : /project_name/app/templates/main/index.html-->
<html>
	<head>
		This is Main page Head
	</head>
	<body>
		This is Main Page Body
	</body>
</html>


위의 코드는 생각보다 별 것 없지요.

맞습니다.

Flask에서는 자동으로 Flask가 HTML 모습을 만들어주는 게 아니라, 우리가 직접 일일이 껍데기를 만들어서 불러오는 형식을 가지고 있습니다.

하지만 번거롭다고 생각하지 마시기 바랍니다.


다 그래요.....(저는 사실 파이썬으로 코딩만 하면 웹페이지가 이쁘게 나올 줄 알았네요.. 허허)



이제 02.__init__ 파일 작성에서 나온 from app.main.[파일이름]에 대해 수정을 해봅시다.


다음과 같이 수정해볼 수 있습니다.

# file name : __init__.py
# pwd : /project_name/app/__init__.py

from flask import Flask
# 추가할 모듈이 있다면 추가

app = Flask(__name__)

# 파일 이름이 index.py이므로
from app.main.index import main as main 

# 위에서 추가한 파일을 연동해주는 역할
app.register_blueprint(main) # as main으로 설정해주었으므로


이제 python3 run.py를 통해 실행해보도록 합시다~



앙 안 이쁘다..


HTML 파일이 영 아니기 때문이 저렇게 나오는 것이지요..


이제 이 다음 포스트에서는 Python 코드에서 HTML로 데이터를 넘겨주는 방법에 대해 알아보도록 하겠습니다.


Python Flask는 기존의 PHP를 대신할 새로운 웹 프로그램 플랫폼으로 떠오르고 있습니다.

Flask 외에도 Django 등이 있는데요.

이번 포스트에서는 Flask를 이용하여 웹 페이지를 만드는 방법을 알아보도록 하겠습니다.


먼저 시작하기 앞서 환경 설정을 먼저 수행하도록 하겠습니다.


환경설정이 시작의 반 이상을 차지한다고 해도 과언이 아닙니다. 허허...

생각보다 조금 까다롭습니다.


다른 플라스크 예제는 아래의 링크를 살펴봐주시기 바랍니다~



[Python Flask] 웹 페이지 만들기 02 - 기본 파일 작성하기

[Python Flask] 웹 페이지 만들기 03 - 파이썬에서 웹으로 값 전달

[Python Flask] 웹 페이지 만들기 04 - Bootstrap 연동하기

[Python Flask] 웹 페이지 만들기 05 - MySQL 연동하기(pymysql)

[Python Flask] 웹 페이지 만들기 06 - MySQL 연동하기(DB 클래스 생성)






01. 개발 디렉토리 설정

먼저 개발을 수행하기 앞서, 개발하고자 하는 프로젝트를 저장할 디렉토리를 만들어주어야 합니다.

개발할 프로젝트의 디렉토리 세팅은 다음과 같이 할 수 있습니다.


[Project Name]

└ [app]

      └ [static]

            └ 자바스크립트, CSS, 이미지 등...

      └ [templates]

            └ HTML 파일들(폴더별로 정리 가능)

└ config.py

└ run.py


이렇게 위와 같이 체계적으로 정리해두면 나중에 여러분들이 개발하실 때 헷갈리지 않을 수 있을 것입니다.

먼저 [Project Name]에는 여러분의 프로젝트 이름을 작성해주시면 됩니다. 아무렇게나 써도 상관 없습니다.

단, 그 하위의 폴더들은 반드시 위와 같이 만들어주셔야 합니다. 이름이 고정된 폴더와 파일은 [app], [static], [templates], config.py, run.py가 있습니다.



02. 파이썬 모듈 설치하기

파이썬에서 Flask를 기본적으로 제공해주지 않기 때문에 관련 모듈과 Flask 모듈을 모두 설치해야 합니다.

설치 명령어는 다음과 같습니다.


python 2 일 때

 > pip install flask

 > pip install pymysql 

 > pip install pyopenssl


python 3 일 때

 > pip3 install flask 

 > pip3 install pymysql

 > pip3 install pyopenssl


만약 pip나 pip3가 안 된다면, pip 대신에 python -m pip 혹은 python3 -m pip 를 대신 입력하여 설치 명령어를 완성하시면 됩니다.

예시 > python -m pip install flask

예시 > python3 -m pip install flask


설치가 잘 완료됐는지 확인해보도록 합시다.

먼저 설치한 버전의 파이썬을 실행시켜 임포트를 해봅시다.


문제없이 임포드 된다면 성공입니다!


flask는 Python Flask를 사용하기 위한 모듈이고, pymysql은 MySQL과 연동하기 위함입니다.

그리고 pyopenssl은 SSL을 사용하기 위함입니다.




03. MySQL 설치하기

웹 프로그램을 만드는데 있어서 예전에는 APM(Apache2, PHP, MySQL)의 세 가지 요소가 겸비되어야 서비스가 실행된다는 것을 어쩌면 아시고 계실 겁니다. 그러나 Python Flask에서는 Apache2의 역할과 PHP의 역할을 모두 수행해주기 때문에 MySQL을 사용해야 합니다.

여기서는 우분투와 윈도우 두 환경 모두에서 설치하는 것을 보여드리려고 합니다.


단, 여기서 APM-Setup, XAMPP와 같은 종합 솔루션을 이용하여 설치하는 것은 권장하지 않습니다.

- APM-Setup은 업데이트가 안 되는 것 같고, 버전 업데이트도 안 되는 것 같고.... 취약취약

- XAMPP는 업데이트와 서비스는 잘 되지만, XAMPP설치하고, MySQL, Apache2 설치하면 꼬이기 때문에..


만약 XAMPP를 사용하고자 하시는 분은 MySQL을 따로 설치해주시지 않으셔도 됩니다. 그리고 MySQL 설정은 XAMPP의 설정에 들어가서 바꿔주셔야 합니다. 저는 그렇게 하기 복잡하기 때문에 못하겠어서... 따로 MySQL을 설치하는 방법을 권장합니다.


설치를 안내해드리기 앞서, 저는 두 환경 모두에서 실습을 수행하기 어렵다 판단하여 보다 쉬운 우분투 환경에서 실습을 진행해보려고 합니다.


윈도우(Windows 10)

먼저 윈도우에 MySQL을 설치하기 위한 설치 프로그램이 MySQL 사이트에서 별도로 제공합니다.

때문에 우분투와 달리 해당 사이트에 들어가셔서 설치를 진행해주셔야 합니다.


자세한 방법은 다음 링크를 참고해주시기 바랍니다.


윈도우에서 MySQL 설치하기 링크



우분투(Ubuntu 16.04.)

우분투에서는 윈도우와 달리 설치가 매우 간편합니다.


자세한 방법은 다음 링크를 참고해주시기 바랍니다.


우분투에서 MySQL 설치하기 링크


+ Recent posts