flask - json_encoder 지정하기

API 상에서 JSON 으로 응답을 내보내기 위해서는 데이터를 Json Serialize(직렬화)를 해야한다. 그런데 json 에서 표현할 수 있는 데이터는 한정이 되어 있어서 각 프로그래밍 언어에 있는 모든 타입을 지원하지는 못한다. Decimal 형도 그런 예 중 하나인데 파이썬에서는 json.dumps()를 통해서 주로 직렬화를 하고 그 함수의 기능 중에 cls 인자를 통해서 JSONEncoder 를 구현한… Read More

Security bugs on Windows servers: Flask 0.12.2 and Werkzeug 0.12.2 released

원문 : https://www.palletsprojects.com/blog/flask-werkzeug-0122-security-release/ Flask 0.12.2, Werkzeug 0.12.2 가 릴리즈 되었는데 이것들은 safe_join 함수에 대한 보안관련 버그수정을 포함하고 있다. 이 문제는 Windows 서버에서 application 을 운영시에 발생한다. Details David Lord가 이 버그를 발견했고, 개인 이메일로 다른 관리자에게 알렸다: While going through PR #2059 about safe_join, I… Read More

flask - jinja2 tojson 필터

flask 문서를 보다보니 standard filters 라는 항목이 있는데 tojson 이 그 내용이다.(기본적으로 제공하는 필터라는 내용) 간략하게 애기하자면, 어떤 랜더링할 변수에 tojson 이라고 jinja2 템플릿 상에서 | 를 이용해서 붙이게 되면 json으로 변환된 값을 랜더링해준다. 예를들어, user 라는 dict 객체에 데이터를 넣어서 전달한다고 할 때, @app.route('/') def hello_world(): user ={} user['name'] = 'ash84'… Read More

(flask) jsonschema 를 이용해서 request.json 검사하기

API에서 파라미터의 유효성 검사는 필수적인 요소이긴 하지만, 개발자로서 여간 귀찮은 일이 아닐 수 없다. API의 양이 많을수록 할 일은 많아진다. 세세하게 체크할 부분은 해야하지만 기본적으로 파라미터 유무, 파라미터의 데이터 형을 체크하는 부분이 필요했다. API는 기본적으로 JSON 을 POST로 받는 식으로 구성되어 있어서 JSON을 검증하는 부분이 필요했다. JSON 검증을 위해서 jsonschema 를 활용할 수 있다는 것을… Read More

(flask) JSON 데이터 받기 및 예외처리

(adsbygoogle = window.adsbygoogle || []).push({}); flask 에서 json 데이터를 받아서 처리할 때 reqeust.get_json() 혹은 request.json 을 이용할 수 있는데, mime type을 application/json 타입으로 보내는데, {} 없이 빈 JSON 문자열 조차도 안 보내는 경우가 있을수가 있다. from flask import Flask from flask import request app = Flask(__name__) @app.route("/test", methods=['POST']) def test(… Read More

flask-runner

Flask 에서 개발을 할 때, Debug 옵션을 키고 app 에 기본 내장된 개발서버를 사용한다. 그런데 파일을 수정하면 재시작하는 기능은 좋은데, host 나 port 를 지정해 놓고 사용하다가 변경할때 귀찮은 부분이 있다. 특히 port 같은 경우 특정포트를 지정해두면 꼭 다음날에 누군가 쓰고 있어서 다시 수정해서 실행해야 하는 번거로움이 있다. flask-runner 는 커맨드라인으로 Flask 앱을 실행할 때… Read More

euc-kr data in flask

파이썬에서의 unicode와 str 유니코드는 평문이고, str은 암호화된 유니코드라고 생각하자. charset 은 str 을 만들기 위한 키이다. 즉, unicode 에서 str 을 만들려면 charset이 필요하고, str에서 unicode 를 만들려면 charset이 필요하다. - 문제점 : str 상태의 문자열은 어떤 charset 으로 인코딩 되었는지를 알수 없다. - 때문에 개발자는 encode, decode 함수를 이용할경우에는 반드시 charset 을 알고 있어야 한다.… Read More

jinja template - extend block 이용하기

기존에는 {%include "head.html" %} 이런식으로 html 내 특정 부분, 즉 자주 사용하는 부분을 모든 페이지에 붙여서, include 지시자를 이용해서 가져오는 방식을 사용해 왔었다. 작은 프로젝트에서는 head.html 을 따로 두고 그 안에서 css 및 기타 `` 부분에 들어가는 코드를 작성해서 재활용 했었다. 그런데 최근에 body 에서 navigation bar 와 footer (상단, 하단)만 두고 가운데의 컨텐츠… Read More

heroku에서 flask 올리기

heroku 를 아주 간단히 설명하자면 마치 서버를 가지고 있는것 처럼 웹의 공간을 대행해주는 업체인데, 클라우드 어플리케이션 플랫폼이라고한다. 특이하게 git 을통해서 올리고 내리고 함으로써 소스를 서버에 반영할 수 가 있다. heroku 에서는 python 부분은 기본적으로 django를 기본으로 하고 있는데 heroku에서 제공하는 flask 가이드를 기본으로 해서 설명하겠다.  가입을 하고나서 toolbelt 라는것을 설치해야 한다. toolbelt 의 역할은 heroku… Read More

uwsgi 기본 사용법 정리

개요 WAS 서버의 일종, 현재 파이썬 서버 중 가장 좋은 성능으로 알려져 있다.  어플리케이션 컨테이너로 파이썬으로 만든 앱을 실행해 주는 역할, WSGI 을 지원한다.  설치 $ pip install uwsgi flask 와 연동 uwsgi –http 127.0.0.1:3031 –wsgi-file ./myflaskapp.py –callable app –processes 4 –threads 2 –stats 127.0.0.1:9191 ` ini 파일로… Read More

jinja template for 문에서 index 가져오기

보통 jinja template 에서 for 문을 사용하게 되면 아래와 같이 어떤 리스트 내에 아이템을 탐색하게 되고 리스트내에 아이템을 직접 가져오는데 index가 필요한 경우, 예를들면 특정 index 만 건너뛰고 싶은 경우가 있는데 그럴경우는 <span style="font-size: 11pt;">loop.index</span> 로 접근해서 index를 가져올수 있다. 아래의 코드를 보면 이해가 쉽다.  2013/10/… Read More

python response data for flask

flask 로 작업하는 경우가 두가지인데, view 를 만들거나 아니면 json 형태로 api 결과를 리턴하는 경우를 만들거나. 그런데 첫번쨰는 머 render_template 사용하는 거고, 두번째 api 결과의 경우 보통 공통적인 api 결과 형식/포맷을 만들어서 반환하기 마련이다. 여러가지 방식이 있겠지만, 선호하는 방식은 meta 와 data 로 나누는 것인데 meta 에는 code 가 들어가는데 http status code… Read More

flask logger decorator(데코레이터)와 함께 사용하기

기본로그 세팅하기 로그에 대한 부분이 늘 걱정이긴 한데, 사실 따로 python logger 클래스를 사용해서 로그는 남기는 클래스를 만들고 만드는 프로젝트 마다 붙여서 사용하는 식으로 했었는데 이번에 flask 에 있는 logger 를 이용해 보기로 했다. 기본적으로 다음과 같은 몇개의 핸들러를 제공하고 있다.  FileHandler  – 로그 메시지를 파일에 남긴다.  RotatingFileHandler – 로그메시지를 파일에 남기고, 특정수 이상이면 다음파일로 넘겨서 로그를… Read More

flask HTTP 에러 따로 메일로 받기

200 OK외에 다른 부분에 대해서 메일로 에러를 받아야 하는 경우가 있다. 물론 500 Server Internal Error 의 경우에는 로그를 보는게 제일 빠르지만, 저렇게 메일로 남기는 이유는 어떤 ip 에서 잘못된 접근을 하는지 보기 위해서 이다. 아래의 코드는 별다른 메일 서버 없이 리눅스 자체에 있는 sendmail 바이너리를 이용해서 호출하는 소스이다. 오히려 smpt 서버 설정하고 그런것 보다… Read More

(flask) Pluggable View, Class 에서 요청처리하기

Pluggable View 라고 말이 어려운데, 간단하게 말하자면 flask 는 기본적으로 url 과 함수의 맵핑으로 이루어져있다. 아래의 Quick Start 에서도 보면 알겠지만, url “/ ” 는 helloworld() 라는 함수에 맵핑이 되어 있어서 / 로 들어오게 되면 helloworld() 함수로 들어오게 된다.  사실 flask를 많이 써보신분들은 아시겠지만, 빠르게 개발할수 있다는 측면에서 매우 좋지만 view 즉, url 별로 보여줘야 하는 페이지가 증가하는… Read More

(flask) jinja2 {% include %} 활용

대단한건 아니고, flask 는 기본적으로 jinja2 를 템플릿 언어로 사용하는데 사용하다 보면 하나의 template에서 공통적으로 사용되어 지는 부분이 있다. 예를 들면, 같은 css 나, 자바스크립트를 가져오는 header의 부분이나 상단의 navigation 부분, 하단의 footer 부분이 그러한데 일일히 모든 템플릿에 넣어 주기는 귀찮다. 그래서 jinja2 에서는{%  include %} 를 통해서 하나의 html 에서 다른 html 을 가져올수 있도록… Read More

(flask) tornado 서버 적용

다들 아시겠지만 flask 내장 서버는 구리고, 사실 어쩔때는1번 이후에 접속이 안될때도 많다. 그래서 flask 문서에서도 배포에서는 사용하지 말라고 권장하고 있기 때문에 tornado 서버를 붙일수가 있다. 여타의 다른 서버를 붙일수가 있는데 링크를 확인하면 된다.  일단 tornado를 설치하는 법은 아래와 같다. 당연 pip. pip install tornado 그리고 나서 아래와 같이 tornado를 이용해서 구동하기 위한 import 작업을 해준다.… Read More

(flask) static 파일 지정

gist 하나에 다 넣어서 설명하자면, main.py 에서 먼저 staticfolder 를 static 으로 지정해 주고 실제 프로젝트 폴더 내에 static 을 만든다. 그리고 css, js 폴더를 static 하위에 만들고 관련 파일들을 배치한다. 그리고 html 내에서는 urlfor 를 이용해서 지정해 주면 된다.… Read More