ash84.io

#Flask

30 posts

flask 파일업로드 검증하기
파일 업로드의 경우 주의할 점이(업로드를 당하는 입장에서) 악성파일 혹은 원치 않는 파일들이 들어올 수 있음을 항상 인지해야한다. 그래서 왠만하면 파일 업로드를 잘 안만들거나 내부에서 몇명의 인가된 사용자만 따로 업로드 메뉴를 보이게 해서 제공하거나 하는 식으로 하곤 했었다. 그래도 업로드가 필요할 경우 아래와 같은 방법으로 제한 할 수 있다.
flask-mqtt : subscribe 시 qos 설정 이슈 수정하기
이번 프로젝트를 하면서 주문관련 부분을 기존의 폴링(polling) 을 하던 방식에서 중간에 브로커서버를 두고 주문하는 쪽에서 주문을 보내면 브로커 서버의 특정 topic 을 구독하고 있는 구독자가 해당 주문을 받는 형태로 구성을 했다. 그 과정에서 mqtt 를 이용했고, [emqtt](https://emqtt.io) 브로커 서버를 선택해서 사용하고 있다. 주문을 하는 쪽에서는 flask 로 구성되어 있어서 별도의 [paho client](https://pypi.python.org/pypi/paho-mqtt/1.2) 라이브러리를 띄
jinja - {% break %} 사용하기
jinja template 는 강력한 형태의 for 문을 제공하는데, 당연히 일반적인 for 문 안에서의 continue 나 break 등이 가능할 것이라고 생각하지만, 기본적으로 제공하지는 않는다. 이런 기능을 사요하기 위해서는 `jinja2.ext.loopcontrols` 을 설치해야 한다.
beaker_session MySQL server has gone away
매일 아침 와서 현재 개발중인 백오피스를 켜면 Internal Server Error 발생. 로그를 보니 아래와 같은 오류 발생
flask-babel 로 다국어 대응하기
flask 로 다국어 서비스를 만드는 일을 하고 있는데 일단 생각해 볼 부분이 API 와 WEB 이다. API는 모바일에서 요청이 들어오는 형태인데, 이 경우 모바일의 사용자 언어 설정을 파라미터로 받고 API 레벨에서 DB 내에 다국어 컬럼 혹은 행이 있다는 가정하에 select 를 해서 response 를 내보내면 된다. WEB 의 경우 AcceptLanguage 를 이용할 수도 있고, GET 요청의 파라미터로 언어코드가 전달 된다면 그것을 활용할 수도 있다.
flask-sqlalchemy multiple databases
### **사용하기**
flask - request.script_root 이용하기
하나의 웹을 여러 path 에 올려야 할 경우가 있다. 예를 들면, 테스트를 위해서 `/web1`, `/web2` 이런식으로 구성해서 올릴 경우이다. 이런 경우 프론트단에서 URL로 지정해 놓은 값들을 수정해 줘야 한다.
flask - render_template 어떻게 사용할까?
flask 를 사용하다보면 view 코드가 길어지는 경우가 있는데 그 중 하나가 views.py 에 route 함수가 많아져서 길어지는것 그리고 다른 하나는 `render_template()` 함수에 파라미터가 많아져서 길어지는 경우다. 전자의 경우 blueprint 로 분할하거나 resource 단위로 분할하면 해결할수 있다. (이건 다른 포스트에서 자세히 설명하겠다.) 후자의 경우에는 어떻게 해결 할수 있을까?
flask - json_encoder 지정하기
API 상에서 JSON 으로 응답을 내보내기 위해서는 데이터를 Json Serialize(직렬화)를 해야한다. 그런데 json 에서 표현할 수 있는 데이터는 한정이 되어 있어서 각 프로그래밍 언어에 있는 모든 타입을 지원하지는 못한다. Decimal 형도 그런 예 중 하나인데 파이썬에서는 `json.dumps()`를 통해서 주로 직렬화를 하고 그 함수의 기능 중에 `cls` 인자를 통해서 JSONEncoder 를 구현한 서브 클래스를 지정해 주면 해당 인코더로 json 문자열을 만든다.
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 - jinja2 tojson 필터
flask 문서를 보다보니 [standard filters](http://flask.pocoo.org/docs/0.12/templating/#standard-filters) 라는 항목이 있는데 `tojson` 이 그 내용이다.(기본적으로 제공하는 필터라는 내용) 간략하게 애기하자면, 어떤 랜더링할 변수에
(flask) JSON 데이터 받기 및 예외처리
flask 에서 json 데이터를 받아서 처리할 때 reqeust.get_json() 혹은 request.json 을 이용할 수 있는데, mime type을 application/json 타입으로 보내는데, {} 없이 빈 JSON 문자열 조차도 안 보내는 경우가 있을수가 있다.
(flask) jsonschema 를 이용해서 request.json 검사하기
API에서 파라미터의 유효성 검사는 필수적인 요소이긴 하지만, 개발자로서 여간 귀찮은 일이 아닐 수 없다. API의 양이 많을수록 할 일은 많아진다. 세세하게 체크할 부분은 해야하지만 기본적으로 파라미터 유무, 파라미터의 데이터 형을 체크하는 부분이 필요했다. API는 기본적으로 JSON 을 `POST`로 받는 식으로 구성되어 있어서 JSON을 검증하는 부분이 필요했다.
flask-runner
Flask 에서 개발을 할 때, Debug 옵션을 키고 app 에 기본 내장된 개발서버를 사용한다. 그런데 파일을 수정하면 재시작하는 기능은 좋은데, `host` 나 `port` 를 지정해 놓고 사용하다가 변경할때 귀찮은 부분이 있다. 특히 `port` 같은 경우 특정포트를 지정해두면 꼭 다음날에 누군가 쓰고 있어서 다시 수정해서 실행해야 하는 번거로움이 있다.
euc-kr data in flask
### **파이썬에서의 unicode와 str**
jinja template - extend block 이용하기
기존에는 `{%include "head.html" %}` 이런식으로 html 내 특정 부분, 즉 자주 사용하는 부분을 모든 페이지에 붙여서, `include` 지시자를 이용해서 가져오는 방식을 사용해 왔었다. 작은 프로젝트에서는 head.html 을 따로 두고 그 안에서 css 및 기타 `` 부분에 들어가는 코드를 작성해서 재활용 했었다.
heroku에서 flask 올리기
heroku 를 아주 간단히 설명하자면 마치 서버를 가지고 있는것 처럼 웹의 공간을 대행해주는 업체인데, 클라우드 어플리케이션 플랫폼이라고한다. 특이하게 git 을통해서 올리고 내리고 함으로써 소스를 서버에 반영할 수 가 있다. heroku 에서는 python 부분은 기본적으로 django를 기본으로 하고 있는데 **[heroku에서 제공하는 flask 가이드](https://devcenter.heroku.com/articles/getting-started-with-python-o)**를 기본으로 해서 설명하겠다.
uwsgi 기본 사용법 정리
### 개요
jinja template for 문에서 index 가져오기
보통 jinja template 에서 for 문을 사용하게 되면 아래와 같이 어떤 리스트 내에 아이템을 탐색하게 되고 리스트내에 아이템을 직접 가져오는데 index가 필요한 경우, 예를들면 특정 index 만 건너뛰고 싶은 경우가 있는데 그럴경우는 `loop.index` 로 접근해서 index를 가져올수 있다. 아래의 코드를 보면 이해가 쉽다.
python response data for flask
flask 로 작업하는 경우가 두가지인데, view 를 만들거나 아니면 json 형태로 api 결과를 리턴하는 경우를 만들거나. 그런데 첫번쨰는 머 `render_template` 사용하는 거고, 두번째 api 결과의 경우 보통 공통적인 api 결과 형식/포맷을 만들어서 반환하기 마련이다. 여러가지 방식이 있겠지만, 선호하는 방식은 meta 와 data 로 나누는 것인데 meta 에는 code 가 들어가는데 http status code 혹은 확장할 경우 확장코드가 들어가고 message 는 보통 에러의 경우 상세 에러메시지가 들어
flask logger decorator(데코레이터)와 함께 사용하기
###기본로그 세팅하기###
flask HTTP 에러 따로 메일로 받기
200 OK외에 다른 부분에 대해서 메일로 에러를 받아야 하는 경우가 있다. 물론 500 Server Internal Error 의 경우에는 로그를 보는게 제일 빠르지만, 저렇게 메일로 남기는 이유는 어떤 ip 에서 잘못된 접근을 하는지 보기 위해서 이다. 아래의 코드는 별다른 메일 서버 없이 리눅스 자체에 있는 sendmail 바이너리를 이용해서 호출하는 소스이다. 오히려 s
flask file download
자주 까먹는지라, 서버에 파일두고 단순 다운로드시 `send_from_directory` 함수 사용.
[flask] robots.txt, sitemap.xml
static 디렉토리에 robots.tx, sitemap.xml 파일이 있다는 가정하에 사용하면 된다.
(flask) Pluggable View, Class 에서 요청처리하기
[Pluggable View](http://flask.pocoo.org/docs/views/?highlight=as_view) 라고 말이 어려운데, 간단하게 말하자면 flask 는 기본적으로 url 과 함수의 맵핑으로 이루어져있다. 아래의 Quick Start 에서도 보면 알겠지만, url “/ ” 는 hello_world() 라는 함수에 맵핑이 되어 있어서 / 로 들어오게 되면 hello_world() 함수로 들어오게 된다.
(flask) jinja2 {% include %} 활용
대단한건 아니고, flask 는 기본적으로 jinja2 를 템플릿 언어로 사용하는데 사용하다 보면 하나의 template에서 공통적으로 사용되어 지는 부분이 있다. 예를 들면, 같은 css 나, 자바스크립트를 가져오는 header의 부분이나 상단의 navigation 부분, 하단의 footer 부분이 그러한데 일일히 모든 템플릿에 넣어 주기는 귀찮다. 그래서 jinja2 에서는{%  include %} 를 통해서 하나의 html 에서 다른 html 을 가져올수 있도록 해준다.
(flask) tornado 서버 적용
다들 아시겠지만 flask 내장 서버는 구리고, 사실 어쩔때는1번 이후에 접속이 안될때도 많다. 그래서 flask 문서에서도 배포에서는 사용하지 말라고 권장하고 있기 때문에 tornado 서버를 붙일수가 있다. 여타의 다른 서버를 붙일수가 있는데 링크를 확인하면 된다.
(flask) static 파일 지정
gist 하나에 다 넣어서 설명하자면, main.py 에서 먼저 static_folder 를 static 으로 지정해 주고 실제 프로젝트 폴더 내에 static 을 만든다. 그리고 css, js 폴더를 static 하위에 만들고 관련 파일들을 배치한다. 그리고 html 내에서는 url_for 를 이용해서 지정해 주면 된다.
(flask) http get url 처리
당연히 최근에는 오픈API나 혹은 간단하게 웹 서비스를 구성한다고 하면 Http Get 방식으로 데이터를 전달하는데 flask 에서는 다음과 같이 처리 할수 있다. `@app.route()`함수에서 어떤 메소드를 사용할 것인지 지정을 해주고 나면 `request.args.get()` 함수를 통해서 해당 url 로 넘어온 데이터를 가져올 수 있다.
(flask) helloworld.py
pip install flask
~/tags/Flask · 30 posts