먼저, 데이터베이스의 연결 정보를 저장할 파일을 만들어야 한다. 그리고 다음처럼 데이터베이스 연결 정보를 저장한다.
(config.py)
db = {
"user": "root",
"password": "1234",
"host": "localhost", #1
"port": 3306, #2
"database": "minister" #3
}
DB_URL = f"mysql+mysqlconnector://{db['user']}:{db['password']}@
{db['host']}:{db['port']}/{db['database']}?charset=utf8"
1. 접속할 db의 주소다. 만일 외부 서버에 설치되어있는 데이터베이스에 접속한다면 해당 서버의 주소를 지정해 주어야 한다.
2. 접속한 db의 포트 넘버다. 관계형 데이터베이스는 주로 3306 포트를 통해 연결된다. api나 사이트와 마찬가지로 데이터베이스도 네트워크를 통해 연결되는 시스템이므로 당연히 포트 정보가 필요하다.
3. 실제 사용할 db 이름. 이전에 minister란 db 이름으로 테이블을 생성했다. 테이블 만드는 법을 모른다면 내 블로그 카테고리 mysql에 있는 내용을 참고!
( 이렇게 설정 파일을 따로 만드는 이유는 두가지 인데, 1. 설정 정보를 따로 관리함으로써 민감한 개인 접속 정보를 노출하지 않아도 된다. 2. 각 환경과 설정에 맞는 설정 파일을 적용할 수 있게 된다.
app.py을 수정해 config.py 파일에서 데이터베이스 설정 정보를 읽어들여 데이터베이스와 연결하도록 한다.
sqlalchemy 를 사용해 mysql 데이터베이스에 연결해 데이터를 저장 및 읽어들이도록 한다.
from flask import Flask , jsonify, request
from sqlalchemy import create_engine, text
# config 파일에서 데이터베이스 설정 정보 읽어들여 db와 연결
def create_app(test_config = None): #1
app = Flask(__name__)
if test_config is None: #2
app.config.from_pyfile("config.py")
else:
app.config.update(test_config)
#3
database = create_engine(app.config["DB_URL"], encoding="utf-8", max_overflow=0)
app.database = database #4
return app
1. 함수 정의. create_app 함수가 test_config 인자를 받는다. 단위 테스트를 실행시킬 때 테스트용 데이터베이스 등의 테스트 설정 정보를 적용하기 위함이다.
2. 만일 인자가 none 이면 config 파일에서 설정을 읽어들인다. 아니라면, test_config 값이 설정되어 들어왔다면 test_config 의 설정을 적용시킨다.
3. 위에서 생성한 Engine 객체를 flask 객체에 저장함으로써 create_app 함수 외부에서도 데이터베이스를 쓸 수 있게 한다.
회원가입 엔드포인트
@app.route("/sign-up", methods=["POST"])
def sign_up():
new_user = request.json
new_user_id = app.database.execute(text(""" #1
INSERT INTO users(
name,
email,
profile,
hashed_password
) VALUES (
:name,
:email,
:profile,
:password
)
"""), new_user). lastrowid #2
row = current_app.database.execute(text("""
SELECT
id,
name,
email,
profile
FROM users
WHERE id = :user_id
"""), {
'user_id' = :new_user_id
}).fetchone()
created_user = {
'id' :row['id'],
'name' :row['name']
'email' :row['row']
'profile':row['profile']
} if row else None
return jsonify(created_user)
http 요청을 통해 전달받은 정볼르 db에 저장한다.
app.database는 SQLAlchemy 는 mysql 에 연결된 Engine 객체다.
app.database 를 통해 원하는 구문을 해당 데이터베이스에 실행하게 된다.
, newuser). lastrowid ==> sql 구문에 사용될 실제 데이터들은 http 요청에서 읽어들인 데이터를 그대로 사용한다. http 요청을 통해 전송된 JSON데이터의 구조가 SQL에서 필요한 필드를 모두 포함하고 있기 때문이다.
만일 필드 이름이 틀리거나 필드가 부재인 경우 오류가 나게 된다. 새로 사용자가 생성되면, 새로 생성된 사용자의 id 를 lastrowid 를 통해 읽어 들인다.
FLASK 환경을 실행 시키고
코딩한 내용대로 http 요청을 보내면 위와 같이 데이터가 전송된 것을 확인할 수 있다.
같은 방법으로 나머지 엔드포인트들도 구성하면 끝 !
'Language > python' 카테고리의 다른 글
웹에서 스크래핑한 데이터 csv 파일로 저장, csv 에서 인코딩 깨질 때 해결 방법 (0) | 2021.03.24 |
---|---|
웹 스크래핑 기초 ) 웹툰 (0) | 2021.03.24 |
파이썬,DB 연결 (SQLAlchemy, mysql-connector-python) (0) | 2021.02.25 |
Strip(), sep(),zip() (0) | 2021.02.21 |
주피터로 flask - BeautifulSoup() (0) | 2021.02.17 |