[프로젝트-wavve] DB 연결하기 (flask)

2

풀스택 개발일지

목록 보기
5/6
post-thumbnail

잠깐 지금 흐르는건 땀이 아니라 눈물인듯....또르륵😨

💡 웨이브 플젝에 지난번에 만들어둔 Mysql DB를 연결할 것이다.

from flask import Flask, render_template
import pymysql

app = Flask(__name__)

@app.route('/')
def index():
    db_conn = pymysql.connect(host='localhost', user='your_mysql_user',
            password='your_mysql_password', database='WavveProj',
            autocommit=True, cursorclass=pymysql.cursors.DictCursor)
    with db_conn:
        db_cursor = db_conn.cursor()
        db_cursor.execute("SELECT * FROM users")
        users = db_cursor.fetchall()
    db_conn.close()

    return render_template('html/index.html', users=users)

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

내 프로젝트(기존에 프론트 작업하던 그곳)에 app.py로 저장한 해당 파일을 가져옴

☑ 1단계: 터미널에서 flask를 설치해야 함

pip install flask

☑ 2단계: pymysql을 설치(python과 mysql을 연결해주는 라이브러리)

pip install pymysql

☑ 3단계: flask 파일 수정

from flask import Flask, render_template
import pymysql


app = Flask(__name__)

@app.route('/')
def index():

        db_conn = pymysql.connect(host='여기수정', user='여기수정', password='여기수정', database='여기수정', autocommit=True, cursorclass=pymysql.cursors.DictCursor)
        with db_conn:
            db_cursor = db_conn.cursor()
            db_cursor.execute("SELECT * FROM 테이블이름으로 수정")
            여기수정 = db_cursor.fetchall()
   
    return render_template('html/index.html', 여기수정=여기수정)


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

'여기수정' 부분에 본인 데이터 관련 정보를 넣으면 됨.

☑ 4단계: 실행시켜보기.(by Mac)

export FLASK_APP=플라스크파일이름.py
export FLASK_ENV=development
flask run

터미널에서 순서대로 입력한다.

연결 성공?

* Serving Flask app 'server/app.py'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000

연결에 성공했다고 끝인줄 알았나 ? 😱

🔆 이제부터 오류를 처리해보자. 🔆

🖥 반가워. 처음만난 오류메세지.

MySQL 데이터베이스에 연결하지 못해서 발생했다고 한다.

"ERROR in app: Exception on / [GET] Traceback (most recent call last)"
"Can't connect to MySQL server on 'localhost:3306"

🖥 이...상...하다? 연결에 성공했다고 했는데?

그래서 try / except 구문을 추가해서 터미널에 에러를 띄워보기로 했다

try:
        db_conn = pymysql.connect(host='127.0.0.1', user='root', password='비밀번호', database='WavveProj', autocommit=True, cursorclass=pymysql.cursors.DictCursor)
        with db_conn:
            db_cursor = db_conn.cursor()
            db_cursor.execute("SELECT * FROM Banner")
            banner_data = db_cursor.fetchall()
    except Exception as e:
        print("MySQL에 연결 중 오류 발생:", e)

🖥 500 에러 ...?

http://127.0.0.1:5000로 접속하면 기존에 작업해둔 프론트 부분이 띄워져야 되는데 500 에러가 나왔다.

27.0.0.1/:1     Failed to load resource: the server responded with a status of 500 (INTERNAL SERVER ERROR)

Internal Server Error
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

  • 이 오류는 Flask 애플리케이션에서 내부적인 오류가 발생하여 요청을 처리하지 못했다는 의미
  • MySQL 서버에 연결하는 부분을 확인했지만, 해당 오류는 MySQL 서버에 연결하는 것과는 별개의 오류

🖥 로그 띄워서 확인하기


import logging
import sys 

app.logger.addHandler(logging.StreamHandler(sys.stdout))
app.logger.setLevel(logging.ERROR)

🖥 로그를 확인해보니, pymysql.err.Error: Already closed라는 오류가 발생하는 것을 확인 !

 코드를 살펴보면 db_conn.close()를 두 번 호출

그래서 코드를 지우고 다시 실행했더니, 또 오류가 나서 로그를 확인했다.

🖥 로그를 확인해보니, jinja2.exceptions.TemplateNotFound: html/index.html라는 오류가 발생

  • 이렇게 폴더와 파일 경로를 수정했다.

🩷그랬더니 드디어 됐댜....🩷

눈물이 날 뻔 했다.....😂

+ 추가

이것 저것 해보다가 vscode를 꺼버렸다. 대수롭지 않게 생각하고, 다시 켜서 flask run을 했는데 서버가 켜지지 않았다.

작업 폴더에서 flask run을 안했다.
1시간동안 다시 삽질을 했다.

아무튼 !

데이터랑 해당 배너 html 부분이랑 연결했다.

step 1. 칼럼에 데이터 넣기

  • 이렇게 잘 들어갔다
  • 그런데 image_data가 null이다. LOAD_FILE()을 사용하면 여러가지 이슈가 발생할 수 있는데, 이것도 그것 중 하나다.
  • 그래서 일단 프로젝트 파일 안에 내장된 이미지를 가져다 쓰고, 인덱스 번호와 alt로 데이터가 잘 들어가서 바뀌는지 확인을 하려고 한다.

step 2. loop?

[원래코드👎]

  • 이 부분이 배너 부분에 들어갔던 html 코드다. 물론, 무지성으로 데이터를 넣으려고 조금 수정한 부분도 있긴했지만 엄청 길었다.

[수정된 코드👍]

  • 이미지 파일은 우선 내장된 파일로 사용하되, 이미지 파일 이름을 'banner0'-'banner5'로 숫자 순서로 저장을 했다.
  • 그랬더니 loop.index0을 사용해서 데이터 수에 맞게 돌아가는 코드가 만들어졌다.
  • 결과적으로 100개의 데이터를 넣어도 배너부분의 코드는 저게 끝이다. 수정할게 없다.

step 3. 확실히 잘 들어갔는지 확인

  • 개발자도구로 확인했더니
  • 아주 ! ⭐자알 ! 들어갔다.

후.. 500 오류


해결방안 !

cryptography 오류...?

  • MySQL 서버에 'sha256_password' 또는 'caching_sha2_password' 인증 방법을 사용하여 연결할 때 'cryptography' 패키지가 필요
pip install cryptography

Flask 애플리케이션에서 'banner_data'라는 변수와 관련된 문제

def index():
    banner_data = [] ## 추가 

+추가 추가 추가

또 다른 이슈발견...vercel 배포 404 😂

vercel은 프론트엔드 배포용이라 서버를 연결하면 오류가 난다고 했다. 이것 저것 세팅에서 변경하면 된다는 사람도 있고, vscode에서 재설치를 해서 된다는 사람도 있지만 나는 실패였다. AWS로 재배로 예정이다.

그래서 최종화면을 gif로........😳

8.4 현재까지 기능정의서

나, 열심히 한듯 👏뿌듯👏..데헿

급하게 하느라 완벽하지 못했다. erd부터 배포까지 계속한닷 !

profile
`나는 ${job} 개발자`

1개의 댓글

comment-user-thumbnail
2023년 8월 4일

읽다가 중간에 울뻔했네요.. 대단하십니다.
노력하는 모습 보고 배워갑니다!

답글 달기