#6. Python์œผ๋กœ API ๊ฐœ๋ฐœ(๋ฐ์ดํƒ€๋ฒ ์ด์Šค ๋ชจ๋ธ ์ž‘์—…)

 

#6. Python์œผ๋กœ API ๊ฐœ๋ฐœ(๋ฐ์ดํƒ€๋ฒ ์ด์Šค ๋ชจ๋ธ ์ž‘์—…)

#5. Python์œผ๋กœ API ๊ฐœ๋ฐœ(๊ธฐ๋ณธํ™˜๊ฒฝ๊ตฌ์„ฑ) #5. Python์œผ๋กœ API ๊ฐœ๋ฐœ(๊ธฐ๋ณธํ™˜๊ฒฝ๊ตฌ์„ฑ) โŒ˜ server.py ( ์œ„์น˜: linkservice/server/server.py) --------------------------------------------------------------------------------------------------- app.py

firstvalue.tistory.com

 

์ด์ „ ํฌ์ŠคํŒ…์— ๋ฐ์ดํƒ€๋ฒ ์ด์Šค ๋ชจ๋ธ๋ง ์ž‘์—…์„ ํ–ˆ๊ณ , ์—ฌ๊ธฐ์„œ๋Š”  server.py์— flask_restful์—์„œ ์ œ๊ณต๋˜๋Š”

API Resource์„ ์ถ”๊ฐ€ํ•ด ๋ณด์ž.

 

โŒ˜ server.py ( ์œ„์น˜: linkservice/server/server.py)

----------------------------------------------------------------------------------------------------------

๊ธฐ์กด server.py ์— ์ถ”๊ฐ€ํ•ด๋ณด์ž.

import socket
from config.create_app import create_app
from flask import Flask
    #flask_restful์—์„œ API์™€  src ๋ฐ‘์— links.py์— class๋“ค์„ import ํ•œ๋‹ค.
from flask_restful import Api
from src.links import LinkRegister, LinksAll, LinkSelect, LinkRemove, LinkUpdate
from db_init import db

env = socket.gethostbyname(socket.gethostname())
if 'linkservice.com' in env :
   app = create_app('production')
else:
   app = create_app('development')
# print(app.config)
    # API ์„ ์–ธ
api = Api(app)
    #API์— Resource๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
api.add_resource(LinkRegister, '/api/link/create')
api.add_resource(LinksAll, '/api/links')
api.add_resource(LinkSelect, '/api/link/select/<int:id>')
api.add_resource(LinkRemove, '/api/link/delete/<int:id>')
api.add_resource(LinkUpdate, '/api/link/update/<int:id>')

if __name__ == "__main__":
# ORM
    db.init_app(app)
    app.run(debug=True, port=5000)

 

์ €์žฅ ํ›„ ์ด์ œ ์‹คํ–‰ํ•ด์„œ ํ™•์ธํ•ด๋ณด์ž.

 

โŽฎ์‹คํ–‰๋ฐฉ๋ฒ•

   1.     ํ„ฐ๋ฏธ๋„์—์„œ ๊ฐ€์ƒํ™” ์‹คํ–‰ ( source ./bin/activate )

   2.     python3 server.py ์‹คํ–‰

   3.     POSTMAN์—์„œ API ํ…Œ์ŠคํŠธ

 

์‹คํ–‰ํ›„ POSTMAN์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์ž.

1.1.  API ํ…Œ์ŠคํŠธ

โ˜‘๏ธŽ POST /api/link/create - ๋งํฌ์ •๋ณด ๋“ฑ๋ก

          Body์— JSON์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ์ง„ํ–‰ํ•ด๋ณด์ž.

message์„ ์ •์ƒ์ ์œผ๋กœ return ๋ฐ›๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

 

โ˜‘๏ธŽ GET /api/links – ์ „์ฒด ๋งํฌ์ •๋ณด ์กฐํšŒ

โ˜‘๏ธŽ GET /api/link/select/<int:id>        - ID์— ํ•ด๋‹นํ•œ ๋งํฌ์ •๋ณด์กฐํšŒ

 

 

โ˜‘๏ธŽ PUT /api/link/update/<int:id>           - name์„ ์ˆ˜์ •ํ•ด๋ณด์ž.

 

โ˜‘๏ธŽ DELETE /api/link/delete/<int:id> - ID์— ํ•ด๋‹นํ•œ ๋งํฌ์ •๋ณด ์‚ญ์ œ

 

LINKS ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ CRUD API๊ฐ€ ์™„์„ฑ๋˜์—ˆ๋‹ค.

 

์ฃผ์š” ํ…Œ์ด๋ธ”์ธ LINKS์˜ CRUD API๊ฐ€ ์™„์„ฑ๋˜์—ˆ์œผ๋ฏ€๋กœ, ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์‹ค์ œ ํ™”๋ฉด์„ ๊ตฌํ˜„์„ ํ•ด๋ณด๊ณ , ์•„์ง๊นŒ์ง€ DB๋ฐ API์„ค๊ณ„์— ๋น ์ง„ ๊ฒƒ์€ ํ™”๋ฉด์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ์ œ์ž‘ํ•ด ๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.

1.    Python์œผ๋กœ API ๊ฐœ๋ฐœ

Python์˜ Flask์„ ์ด์šฉํ•˜์—ฌ API์ œ์ž‘์„ ํ•ด๋ณด์ž.

์šฐ์„  PostgreSQL์—์„œ DB ์„ค๊ณ„์— ๋งž๊ฒŒ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•œ๋‹ค.

(DB์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ ๋ณ„๋„ ์„ค๋ช…ํ•˜์ง€ ์•Š๋Š”๋‹ค.)

 

1.1.  Python Flask APIํ™˜๊ฒฝ ์„ค์ •

โŒ˜ config.py ( ์œ„์น˜: linkservice/server/config/config.py )

--------------------------------------------------------------------------------------------------

config.py์€ ๊ฐœ๋ฐœ๊ณ„(Development)์™€ ์šด์˜๊ณ„(Production) ํ™˜๊ฒฝ์„ค์ •์„ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ ์„œ๋ฒ„(server.py) ๊ตฌ๋™ ์‹œ ํ˜ธ์ถœํ•œ๋‹ค.

 

SQLALCHEMY_DATABASE_URI์ •๋ณด๋ฅผ ์—ฌ๋Ÿฌ๋ถ„์˜ DB์ •๋ณด๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ๋‹ค๋ฅธ ์˜ต์…˜๋“ค์€ ์ฐธ๊ณ ํ•˜์—ฌ ํ•„์š”์‹œ ์ถ”๊ฐ€/์‚ญ์ œ ํ•˜๋ฉด ๋œ๋‹ค.

 

์ด๋ฏธ์ง€ ์ €์žฅ ์œ„์น˜์„ค์ •์€ CDNํ˜น์€ NASํ˜•ํƒœ๋กœ ์ œ์ž‘ํ•˜๊ณ ์ž ๋ณ„๋„ ํด๋”๋กœ ๋ถ„๋ฆฌํ–ˆ์œผ๋ฉฐ, ๋งํฌ์ •๋ณด์™€ ์ด๋ฏธ์ง€ ์ •๋ณด ์ €์žฅ์€ IMAGE_URLํ˜•ํƒœ๋กœ ์ €์žฅ๋œ๋‹ค. 

ํ™˜๊ฒฝํŒŒ์ผ ๋‚ด์šฉ์€ ์•ž์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์„ค๋ช…๋  ๊ฒƒ์ด๋‹ค

 

import os
dir = os.path.dirname(os.path.abspath(os.path.dirname(__file__)))

class Development(object):
    DEBUG = True
    FLASK_APP = 'linkservice_dev'
    ENV = 'development'
    
## DB URL FOR DEVELOPMENT
    SQLALCHEMY_DATABASE_URI = 'postgresql://์‚ฌ์šฉ์ž:์‚ฌ์šฉ์žํŒจ์Šค์›Œ๋“œ@localhost:5432/๋ฐ์ดํƒ€๋ฒ ์ด์Šค๋ช…'

# ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ปค๋ฐ‹ ์ „ํ›„๋กœ ์•Œ๋ฆผ ์—ฌ๋ถ€
    SQLALCHEMY_TRACK_MODIFICATIONS = True

# Query Debug ์—ฌ๋ถ€ ๋ฐ DB POOL
    SQLALCHEMY_ECHO = True
    SQLALCHEMY_POOL_SIZE = 20
    SQLALCHEMY_POOL_RECYCLE = 3600

#JSON์—์„œ ํ•œ๊ธ€ ํ‘œํ˜„์„ ์œ„ํ•ด์„œ ๋ฐ˜์˜
    JSON_AS_ASCII = False
    
#์ด๋ฏธ์ง€ ์œ„์น˜ ์„ค์ •
    image_folder = os.path.normpath(os.path.join(dir, os.pardir)) + '/client/public/images/'
    COVER_IMAGE_FORDER = image_folder
    IMAGE_FORDER = image_folder
    IMAGE_URL = 'http://127.0.0.1:3000/images/'

class Production(object):
    DEBUG = False
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ECHO = False
    FLASK_APP = 'linkservice'
    ENV = 'production'
    
## DB URL FOR PRODUCTION
    SQLALCHEMY_DATABASE_URI = 'postgresql://์‚ฌ์šฉ์ž:์‚ฌ์šฉ์žํŒจ์Šค์›Œ๋“œ@localhost:5432/๋ฐ์ดํƒ€๋ฒ ์ด์Šค๋ช…'

#JSON์—์„œ ํ•œ๊ธ€ ํ‘œํ˜„์„ ์œ„ํ•ด์„œ ๋ฐ˜์˜
    JSON_AS_ASCII = False    

#์ด๋ฏธ์ง€ ์œ„์น˜ ์„ค์ •
    image_folder = os.path.normpath(os.path.join(dir, os.pardir)) + '/images/'
    COVER_IMAGE_FORDER = image_folder
    IMAGE_FORDER = image_folder 

#์šด์˜๊ณ„ 
    IMAGE_URL = 'https://www.linkservice.com/img/'

app_config = {
    'development': Development(),
    'production': Production(),
}

โŒ˜ create_app.py ( ์œ„์น˜: linkservice/server/config/create_app.py)

---------------------------------------------------------------------------------------------------

create_app.py๋Š” ํ™˜๊ฒฝํŒŒ์ผ์„ ์ฝ์–ด Flask App์„ ์‹คํ–‰ํ•œ๋‹ค.

from . import config
from flask import Flask

def create_app(environment):
    # configํŒŒ์ผ์—์„œ ๋ถˆ๋ ค์˜ค๊ธฐ
    config_map = {
        'development': config.Development(),
        'production': config.Production(),
    }
    config_obj = config_map[environment.lower()]   
    
    app = Flask(__name__)
    app.config.from_object(config_obj)

    return app

+ Recent posts