Python-Framework/Python-Framework__Flask

Flask pymysql + RestApi

말하는감자 2019. 4. 26. 14:47

인터넷 검색해서 이거저거 보다가..

평소 자주 쓰는 스타일로 수정하면서 따라하다가 간략하게 정리..

여기에 정리 안해두면 내일 다 까먹을 가능성 높음 ㅠㅠ...

 


PyCharm으로 프로젝트 폴더 open


flask, pymysql을 설치해준다.

settings에서 설치하다가 오류가 발생한 경우 파이참 콘솔의 terminal에서 pip로 설치해주는것이 정신 건강에 이롭다

settings에서 왜 설치할때마다 오류가 나는지 모르겠다

리눅스일때 오류가 난다면 설치 파일 통째로 받아서 설치하는게 가장 편하다 

pip install flask

pip install pymysql


__init__.py, database.py, wsgi.py를 생성


wsgi.py 내용을 작성해준다

port 지정 안하면 5000번으로 잡히긴 한데 프로젝트 여러개를 동시해서 띄우는 경우가 많아서 지정 해주었다

# wsgi.py
# -*- coding: utf-8 -*-
from test import *

if __name__ == "__main__"
	app.run(host="0.0.0.0", debug=True, port=18080)

__init__.py 내용을 작성해준다

methods를 입력하지 않으면 기본적으로 GET으로 잡히는것 같다(자세히 모름ㅠㅠ)

api를 여러개 작성하다보면 헷갈리는 경우가 있기 때문에 명시해 주는 것이 편한것 같다

# __init__.py
# -*- coding: utf-8 -*-
from flask import Flask

app = Flask(__name__)

@app.route("/hi", methods=["GET"])
def hi():
    return "hi"

여기까지 작성해두고 wsgi.py를 실행한다

그 다음에 크롬을 켜고 localhost:18080/hi로 접속해본다

__init__.py에서 /hi로 접속하면 hi라는 스트링이 리턴되게 해두었으므로 당연히 hi라는 두글자만 보인다


test_table을 생성해준다

 

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

 


database.py를 간략하게 작성해준다

mysql 설치 실패로 비트나미를 사용했다.

비트나미 설치는 간단하고 편한데 db 입출력이 기하급수적으로 늘어나면(몇천개 이상) 가끔 db 자체가 뻗는 경우가 발생한다.

이 경우에는 재설치 외에는 답이 없으니 테스트용으로만 사용하는것이 좋다

# database.py
# -*- coding: utf-8 -*-
import pymysql

class Database():
    def __init__(self):
        self.db = pymysql.connect(host="127.0.0.1", user="root", password="123456", db="mysql", charset="utf8", port=3306)
        self.cursor = self.db.cursor(pymysql.cursors.DictCursor)

    def execute(self, query):
        self.cursor.execute(query)

    def execute_one(self, query):
        self.cursor.execute(query)
        row = self.cursor.fetchone()
        return row

    def execute_all(self, query):
        self.cursor.execute(query)
        row = self.cursor.fetchall()
        return row

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

__init__.py 내용을 작성해준다.

최초로 작성후에 여러가지 테스트를 할 때는 try~except 설치를 하지 않고 오류 메세지를 하나씩 확인하면서 한다

except에 걸려버리면 오류 메세지를 명확하게 확인할 수 없다

# __init__.py
# -*- coding: utf-8 -*-
from flask import Flask, jsonify, request
from test import database

app = Flask(__name__)

@app.route("/hi", methods=["GET"])
def hi():
    return "hi"

#insert
@app.route("/insert", methods=['POST'])
def insert_table():
    values = request.get_json()
    data = values['data']
    db_class = database.Database()
    sql = "INSERT INTO test_table(test) VALUES('%s')" % (data)
    db_class.execute(sql)
    db_class.commit()

    return jsonify(values), 200

#select all
@app.route("/select_all", methods=['GET'])
def select_all():
    db_class = database.Database()
    sql = "SELECT idx, test FROM test_table"
    row = db_class.execute_all(sql)
    row = "" if not row else row

    return jsonify(row), 200

#select one
def select_one(idx):
    db_class = database.Database()
    select_sql = "SELECT idx, test FROM test_table WHERE idx=('%s')" % (idx)
    row = db_class.execute_one(select_sql)

    row = "" if not row else row

    return row

#update
@app.route("/update", methods=['POST'])
def update_one():
    '''
    form에서 속성값을 받아올때
    request.form.get("value)

    form에서 속성값을 받은 후에 바로 dict로 변환할때
    request.form.to_dict()
    
    json으로 속성값을 바로 받아올때
    request.get_json()
    '''

    values = request.get_json()
    db_class = database.Database()
    data = values['data']
    idx = values['idx']
    update_sql = "UPDATE test_table SET test=('%s') WHERE idx=('%r')" % (data, idx)
    db_class.execute(update_sql)
    db_class.commit()

    # 방금 update한 row를 select 해온다.
    # select 는 여러번 재사용 할 수 있기 때문에 메서드를 분리
    row = select_one(idx)

    return jsonify(row), 200

#delete
@app.route("/delete_one", methods=['POST'])
def delete_one():
    values = request.get_json()
    db_class = database.Database()
    idx = values['idx']

    # data가 존재하는지 확인
    row = select_one(idx)

    # 없으면 pass
    if not row:
        pass
    # 있다면 삭제를 수행한다
    else:
        delete_sql = "DELETE FROM test_table where idx=('%r')" % (idx)
        db_class.execute(delete_sql)
        db_class.commit()

    return jsonify(""), 200

여기까지 작성했으면 postman으로 간단하게 테스트를 해본다

 

insert

methods가 POST 였으므로 POST로 지정, 

data는 JSON으로 준다 

insert

 


select_all

GET이므로 데이터 없이 주소만 날려보낸다

select_all


update

methods가 POST였으므로 데이터도 같이 날려준다,

where 절을 idx로 체크하기 때문에 idx도 같이 준다

update

 


delete

POST로 idx만 날려준다

 

웹 작업하는걸 싫어해서 ㅠ.. 여기까지..

'Python-Framework > Python-Framework__Flask' 카테고리의 다른 글

Flask api query string  (0) 2019.09.25
flask restful crud  (0) 2019.07.25
flask_restful  (0) 2019.07.24
flask에서 html 페이지 띄우기  (0) 2019.03.20
flask centos 에서 실행하기  (0) 2019.03.20