[Flask] 플라스크, mongoDB 사용하기

apro_xo·2022년 6월 13일
0
post-thumbnail

프로젝트에 플라스크를 이용해서 서버를 만들고, mongoDB를 사용하여 데이터베이스를 구축하고 저장해야했다. 강의를 듣고 직접 구현해보며 공부한 내용을 기록한다.

1. mongoDB atlas

mongoDB에서 제공하는 클라우드 데이터베이스

나의 컴퓨팅 자원을 소모하지 않고, 클라우드 서버에 접근하여 사용할 수 있는 원격 DB가 제공된다. 우선 가입을하고 클러스터를 만든다.

가입 절차와 클러스터를 만드는 과정은 생략하겠다.

2. Flask

python을 기반으로 한 마이크로 웹 프레임워크

이번 프로젝트에서 프론트엔드쪽은 jquery를 사용하고 flask, mongoDB를 이용하여 백엔드를 구성하였다.

2-1. 디렉토리 구조

flask를 사용하여 프로젝트를 할 때는 기본적으로 디렉토리를 설정해주어야하는데,
CSS 파일 등을 저장하는 디렉토리인 static 디렉토리와 html 파일을 저장하는 templates 디렉토리를 생성한다. (디렉토리 이름 스펠링 틀리면 안된다...😁)

2-2. flask 코드(app.py)

기본적인 코드는 아래와 같다.

from flask import Flask, render_template, request, jsonify

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('index.html')
    
@app.route("/bucket/done", methods=["POST"])
def bucket_done():
    num_receive = request.form['num_give']
    return jsonify({"msg":"완료!"})
    
    
@app.route("/bucket", methods=["GET"])
def bucket_get():
   return jsonify({'msg': "완료!"})
   
if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)

route()를 사용하여 라우터를 구현하는 모습이다.

React와는 다르게 jquery를 사용하여 프로젝트를 만들었기 때문에, 서버에서 html을 구성하여 클라이언트로 보내줘야한다.
flask에서는 이를 위해 render_template이라는 메서드를 사용한다.

route()에 method 인자를 넣어주어 GET요청, POST 요청을 구별한다.

2-3. pymongo로 mongoDB 연결하기

mongoDB atlas에 접속하여 만들었던 클러스터에 들어가 connect를 누른다.

누르면 위와 같은 창이 나오는데, 여기서 Connect your application을 선택한다.

본인은 python 3.6 이상의 버전에서 플라스크를 이용하여 어플리케이션을 구현하기 때문에
Select your driver and version에서 위와 같이 설정한 후,
Add your connection string into your application code에 있는 것을 복사하여 구현 중인 코드에 붙힌다.

그리고 아래 코드와 같이 사용하면 된다.

mongo_connect =
"mongodb+srv://<본인이 설정한 username>:<본인이 설정한 password>@cluster0.t6rev.mongodb.net/?retryWrites=true&w=majority"
client = MongoClient(mongo_connect)
db = client.temp

위에서 본인이 설정한 username과 본인이 설정한 password를 확인, 설정하는 방법은

mongoDB atlas 페이지의 좌측에 있는 메뉴에 SECURITY의 Quickstart를 들어가서 설정하면 된다.

이렇게 하면 mongoDB와 연결이 완료된다.

2-4. pymongo로 mongoDB 사용하기

client = MongoClient(mongo_connect)
db = client.temp

doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

# 한 개 찾기(조건 추가)
user = db.users.find_one({'name':'bobby'})

# 여러개 찾기( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))

# 바꾸기
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 지우기
db.users.delete_one({'name':'bobby'})

pymongo를 이용하여 mongoDB를 사용할 때는 위 코드와 같이 사용하면 된다.

3. 겪은 에러

프론트엔드(jquery)에서 임의의 이벤트를 발생시켜 flask에 POST 요청을 보냈다.
POST 요청의 코드는 아래와 같다.

@app.route("/bucket", methods=["POST"])
def bucket_post():
    bucket_receive = request.form['bucket_give']

    bucket_list = list(db.bucket.find({}, {'_id': False}))
    count = len(bucket_list) + 1

    doc={
        'num':count,
        'bucket':bucket_receive,
        'done':0
    }

    db.bucket.insert_one(doc)
    return jsonify({'msg': '등록 완료!!'})

야무지게 프론트에서 POST요청을 보냈는데 아래와 같은 에러가 발생했다.

pymongo.errors.ServerSelectionTimeoutError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired

그리고 보낸 데이터가 DB에 저장되지도 않았다.

따라서 구글링을 해본 결과 certifi 모듈을 설치하여 해결할 수 있다고 한다.

mongo_connect = "mongodb+srv:username:password ~~~~"
client = MongoClient(mongo_connect, tlsCAFile=certifi.where())
db = client.temp

위와 같이 작성하고 다시 요청을 보내면 정상적으로 작동한다.

profile
유능한 프론트엔드 개발자가 되고픈 사람😀

0개의 댓글