ABOUT ME

삼팔공의 공부하는 블로그

Today
Yesterday
Total
  • Flask ) postgresql을 사용하여 REST API 만들기
    공부/기타 2021. 8. 29. 04:02

    피싱 사이트로 확인된 URL을 입력받고, DB에 저장하여 조회가 가능하도록 API를 만들 예정

     

    1. postgresql 설치

    https://www.postgresql.org/

    위 링크를 통해 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으로 정상동작 확인

    댓글

Designed by nanometre380.