
SpringBoot를 활용해서 암호화폐통합관리시스템을 간단하게 구현했었습니다. 하지만 SpringBoot로 하기에는 프로그램 자체도 가볍고 개인적으로만 활용할 것이라, 이를 Flask로 구현했습니다. 기존의 SpringBoot에서 만들었던 것은 단순하게 현재 포지션을 조회 후 잔고나 거래내역 등을 보여주었고, 이번 Flask는 TradingView의 FineScript 언어를 활용, 전략을 구현해 Alert 웹훅을 이용한 자동매매를 실행합니다. 본격적인 설명에 앞서 Flask와 SpringBoot의 차이점을 매우 간단하게 알아보고 가려합니다. 만약 이를 원치 않는다면 해당 문단은 넘어가도 좋습니다. Flask는 Werkzeug, Jinja2 및 좋은 의도를 기반으로 한 Python용 마이크로프레임워크 입..

❕리다이렉션과 에러 사용자가 다른 엔드포인트로 redirect하기 위해서는 redirect() 함수를 사용해야 합니다. 에러코드를 가지고 일찍 요청을 중단하기를 원한다면 abort() 함수를 사용하면 됩니다. from flask import Flask, redirect, url_for @app.route('/') def index(): return redirect(url_for('login')) @app.route('/login') def login(): abort(401) this_is_never_executed() 위 코드는 사용자가 접근 불가한 페이지에 방문하면 하얀 화면에 검정 글씨의 에러 페이지가 각 에러코드를 보여주는 화면입니다. 만약 템플릿을 이용한 에러페이지를 이용하려면 errohandle..

웹 어플리케이션에 있어서 클라이언트에서 서버로 보내는 데이터를 처리하는 것은 매우 중요한 일입니다. Flask에서는 클라이언트가 보내는 이 정보를 request 객체에 의해 제공됩니다. ❕컨텍스트 로컬 Flask에서 어떤 객체들은 보통 객체들이 아닌 전역 객체에 속합니다. 이 객체들은 실제로 어떤 특정한 문맥에서 지역 객체들에 대한 대리자의 역할을 수행합니다. 서버는 웹에서 요청이 들어오면 새로운 쓰레드를 생성합니다. 즉 외부에서 들어오는 요청에 대해서는 말입니다. 하지만 내부에서 들어오는 요청에 대해서 Flask는 현재 처리되는 쓰레드를 활성화된 문맥으로 간주하고 현재 실행되는 어플리케이션과 WSGI환경을 그 문맥에 연결합니다. 이렇게 처리하는 것은 문맥을 지능적으로 처리하는 방식이며 한 어플리케이션이..

❕HTTP 메소드 Flask에서는 URL접근에 대하여 기본적으로 GET 방식으로 제공합니다. 하지만 route() 데코레이터에 methods 인자를 제공하면 다른 방식으로 변경할 수 있습니다. @app.route('/login', methods=['GET','POST']) def login(): if request.method=='POST': do_the_login() else: show_the_login_form() GET - 브라우저가 어떤 페이지에 저장된 정보를 단지 얻기 위해 서버에 요청하고 서버는 그 정보를 보냅니다. HEAD - 브라우저가 어떤 페이지에 저장된 내용이 아닌 헤더라 불리는 정보를 요청합니다. GET요청을 받은 것 처럼 처리하나, 실제 내용이 전달되지는 않습니다. Flask에서는 ..

Flask는 Werkzeug와 Jinja2 라이브러리에 의존합니다. Werkzeug는 웹어플리케이션과 다양한 서버 사이의 개발과 배포를 위한 표준 파이썬 인터페이스인 WSGI를 구현한 툴킷입니다. 반면 Jinja2는 HTML 템플릿을 렌더링 하는 템플릿 엔진입니다. Flask를 사용하는 방법은 여러가지가 있습니다. 그 중 가장 강력한 사용법은 virtualenv을 사용하는 것입니다. 하지만 해당 글은 사용하지 않습니다. Python에서 Flask를 설치하지 않았다면 pip를 이용해 먼저 설치하도록 합니다. $ pip install Flask Flask의 기본 어플리케이션은 다음과 같은 모습을 가지고 있습니다. from flask from Flask app=Flask(__name__) @app.route(..

▶ MySQL SELECT ANIMAL_TYPE , IFNULL(NAME,'No name') AS NAME , SEX_UPON_INTAKE FROM ANIMAL_INS ORDER BY ANIMAL_ID ▶ Oracle SELECT ANIMAL_TYPE , NVL(NAME,'No name') AS NAME , SEX_UPON_INTAKE FROM ANIMAL_INS ORDER BY ANIMAL_ID

▶ MySQL / Oracle SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NOT NULL ORDER BY ANIMAL_ID

▶MySQL / Oracle SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NULL ORDER BY ANIMAL_ID

▶ MySQL SELECT WAREHOUSE_ID ,WAREHOUSE_NAME ,ADDRESS ,IFNULL(FREEZER_YN,'N') FROM FOOD_WAREHOUSE WHERE ADDRESS LIKE '경기도%' ORDER BY WAREHOUSE_ID ▶ Oracle SELECT WAREHOUSE_ID ,WAREHOUSE_NAME ,ADDRESS ,NVL(FREEZER_YN,'N') FROM FOOD_WAREHOUSE WHERE ADDRESS LIKE '경기도%' ORDER BY WAREHOUSE_ID

▶MySQL / Oracle SELECT CATEGORY ,MAX(PRICE) ,PRODUCT_NAME FROM FOOD_PRODUCT A WHERE CATEGORY IN ('과자','국','김치','식용유') AND PRICE IN (SELECT MAX(PRICE) FROM FOOD_PRODUCT WHERE CATEGORY = A.CATEGORY) GROUP BY CATEGORY,PRODUCT_NAME ORDER BY MAX(PRICE) DESC

▶ MySQL SELECT A.AUTHOR_ID ,B.AUTHOR_NAME ,A.CATEGORY ,SUM(A.PRICE * C.SALES) AS TOTAL_SALES FROM BOOK A INNER JOIN AUTHOR B ON A.AUTHOR_ID = B.AUTHOR_ID INNER JOIN BOOK_SALES C ON A.BOOK_ID = C.BOOK_ID WHERE C.SALES_DATE BETWEEN DATE_FORMAT('20220101','%Y-%m-%d') AND DATE_FORMAT('20220131','%Y-%m-%d') GROUP BY A.AUTHOR_ID,B.AUTHOR_NAME,A.CATEGORY ORDER BY A.AUTHOR_ID,A.CATEGORY DESC; ▶Oracle SE..

▶ MySQL SELECT CAR_ID ,CASE WHEN MAX(DATE_FORMAT('20221016','%Y-%m-%d') BETWEEN START_DATE AND END_DATE) THEN '대여중' ELSE '대여 가능' END AS AVAILABILITY FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY GROUP BY CAR_ID ORDER BY CAR_ID DESC ▶Oracle SELECT CAR_ID ,MAX(AVAILABILITY) AS AVAILABILITY FROM (SELECT CAR_ID ,CASE WHEN TO_DATE('20221016','YYYY-MM-DD') BETWEEN START_DATE AND END_DATE THEN '대여중' ELSE '대여 ..