-
Flask ) postgresql을 사용하여 REST API 만들기공부/기타 2021. 8. 29. 04:02
피싱 사이트로 확인된 URL을 입력받고, DB에 저장하여 조회가 가능하도록 API를 만들 예정
1. postgresql 설치
위 링크를 통해 postgresql 설치 (설치 시 입력하는 비밀번호를 기억해야 함)
1. pgadmin4 실행
2. pgadmin4에서 데이터베이스 생성 (배포 시 변경 예정)
Databases 우클릭 - Create - Database 2. Flask app 작성
1. 패키지 설치
pip install flask-sqlalchemy pip install psycopg2-binary pip install Flask-Migrate
2. app.py 작성
from flask import Flask, make_response, request, jsonify import requests from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://<USER>:<PW>@localhost:5432/<database>' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) migrate = Migrate(app, db) @app.route('/') def main(): return 'Hello, world' if __name__ == '__main__': app.run(debug=True)
DATABASE URI 작성 시 <>로 묶여있는 부분은 개인마다 설정해준 값을 넣으면 됨
이 부분 보안성이 취약한 것 같아 개선 방법이 필요할 것으로 보임.
3. models.py 작성
from app import db class Phishing(db.Model) : __tablename__ = 'phishings' id = db.Column(db.Integer, primary_key=True) url = db.Column(db.String()) timestamp = db.Column(db.DateTime, default = db.func.current_timestamp()) def __init__(self, url) : self.url = url def save(self) : db.session.add(self) db.session.commit() @staticmethod def get_all() : return Phishing.query.all() def __repr__(self) : return f"<ID {self.id} , URL {self.url}>"
id, url, timestamp 칼럼을 만들어 주었으며, timestamp는 현재 시간으로 설정
4. app.py 수정
@app.route('/api/phishing/register', methods=['POST']) def register(): if request.method == 'POST' : if request.is_json: data=request.get_json() new_phishing = Phishing(url=data['url']) new_phishing.save() response = jsonify({ ... }) else : response = jsonify({ ... }) response.status_code = 201 return response @app.route('/api/phishing/database', methods=['GET']) def get_databases(): phishings = Phishing.get_all() results = [] for phishing in phishings: obj = { 'url' : phishing.url } results.append(obj) response = jsonify(results) response.status_code = 200 return response @app.route('/api/phishing/count', methods=['GET']) def get_counts(): phishings = Phishing.get_all() count = len(phishings) response = jsonify({ 'count' : count }) response.status_code = 200 return response
위에서부터 url 등록, 전체 url 목록 가져오기, 등록된 url의 갯수를 반환함
url은 json 형식으로 받아서 저장하는 방식
5. 명령어 실행
flask db init flask db migrate flask db upgrade
postman으로 정상동작 확인