티스토리 뷰

카테고리 없음

Flask

nickas 2019. 7. 23. 16:58

Flask는 WSGI 프로토콜을 통해 HTTP 요청을 처리하는 Werkzeug WSGI 툴킷과 기타 라우팅 시스템 같은 다양한 도구들을 기반으로 2010년부터 배포되기 시작

https://werkzeug.palletsprojects.com/en/0.15.x/

 

Werkzeug — Werkzeug Documentation (0.15.x)

 

werkzeug.palletsprojects.com

https://pythonpaste.readthedocs.io/en/latest/

 

Python Paste — Paste 3.0.0 documentation

© Copyright 2008, Ian Bicking Revision 970b5d24.

pythonpaste.readthedocs.io

https://pylonsproject.org/

 

Welcome to the Pylons Project

Rather than focusing on a single web framework, the Pylons Project develops a collection of related technologies. The first package from the Pylons Project was the Pyramid web framework. Other packages have been added to the collection over time, including

pylonsproject.org

http://bottlepy.org

 

Bottle: Python Web Framework — Bottle 0.13-dev documentation

Bottle: Python Web Framework Bottle is a fast, simple and lightweight WSGI micro web-framework for Python. It is distributed as a single file module and has no dependencies other than the Python Standard Library. Routing: Requests to function-call mapping

bottlepy.org

마이크로프레임워크는 들어오는 요청을 알아서 프로그램에 전달해주고, 처리가 완료되면 다시 자동으로 응답을 반환하는 접착제 코드(glue code)와 같다. 마이크로프레임워크는 프로젝트에 특정 패러다임을 적용할 것을 강요하지 않는다.

 

장고와 같은 battery-included 프레임워크는 데이터베이스 쿼리 결과와 객체를 연결하는 ORM을 비롯해 웹 애플리케이션을 개발하는 데 필요한 모든 것을 제공한다. 프레임워크는 ORM과 단단히 결합돼 있다.

장고의 목적이 하나의 완전한 시스템을 제공해서 개발자가 기능 구현에만 집중하게 하는 것이기 때문이다.

 

반면에 플라스트는 어떤 라이브러리를 사용해서 데이터를 다루는지 신경 쓰지 않는다. 프레임워크는 외부 라이브러리를 활용해 확장되며, 이런 방식으로 다양한 기능을 제공한다. 예를 들어 플라스크에서 SQLAlchemy를 사용하고 SQL 세션과 트랜젝션으로 필요한 작업을 수행하려면 프로젝트에 Flask-SQLAlchemy 같은 패키지를 추가하면 된다. 특정 라이브러리가 SQLAlchemy와 제대로 동작하지 않는다면 얼마든지 다른 것을 사용할 수 있다.

 

플라스트에서 요청 처리

프레임워크의 진입점은 flask.app 모듈의 Flask 클래스다. 플라스크 애플리케이션을 실행한다는 것 Flask 클래스의 단일 인스턴스를 띄워 외부에서 들어오는 WSGI 요청을 다루고, 이를 적절한 코드로 전달해서 처리한 후에 응답을 반환하는 것이다.

WSGI는 웹 서버와 파이썬 애플리케이션 사이의 인터페이스를 정의한 규약이다. 서버로 들어오는 요청은 고유하게 매핑되며, 플라스크 같은 해당 요청을 처리할 코드로 정확하게 라우팅한다.

Flask 클래스는 함수를 데코레이트하는 route 함수를 제공한다. route로 함수를 데코레이트하면 view가 되고 Werkzeug의 라우팅 시스템에 등록된다. 시스템은 들어오는 요청과 뷰를 연결해주는 규칙을 갖고 있다. 

from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/api')
def my_microservice():
	print(request)
    print(request.environ)
  	response = jsonify({'Hello': 'World!'})
    print(response)
    print(response.data)
	return response
    
    
if __name__ == '__main__':
	print(app.url_map)
	app.run()

많은 웹 프레임워크가 명시적으로 request 객체를 코드로 전달하는 데 반해, 클라스트는 암시적으로 전역 request 변수를 사용한다. 전역 request 변수는 내부적으로 HTTP 요청을 WSGI 환경 변수 딕셔너리로 파싱해서 만든 Request 객체를 가리키고 있다. 

흔히 전역 변수는 프로그램 전체에서 공유되지만, 플라스크의 request 전역 변수는 고유한 객체이며, 스레드에 안전하다. 여기에는 context local이라는 메커니즘이 사용된다.

 

플라스트 요청/응답 과정

  • 라우팅: 플라스크가 Map 클래스를 생성
  • 요청: 플라스크가 Request 객체를 뷰에 전달
  • 응답: Response 객체에 필요한 내용을 채워서 응답을 보냄

라우팅

라우팅은 Werkzeug Map 클래스의 인스턴스인 app.url_map에서 일어남. 이 클래스는 정규 표현식을 사용해 클라이언트에서 호출한 엔드포인트와 일치하는 @app.route로 데코레이트된 함수를 찾음.

기본적으로 라우팅은 HTTP 메소드 중 HEAD, GET, OPTIONS만 받아 들임. 올바른 엔드포인트라도 지원하지 않는 HTTP 메소드를 사용했다면 405 Method Not Allowed가 반환됨.

다른 HTTP 메소드도 라우팅하고 싶다면 route 데코레이터에 전달되는 methods 인수에 필요한 HTTP 메소드를 추가하면 된다. 

@app.route('/api', methods=['POST' 'DELETE', 'GET'])
def my_microserver():
	return jsonify({'Hello': 'World'})

OPTIONS와 HEAD 메소드는 요청 핸들러가 자동으로 관리하므로, 모든 규칙에 암시적으로 추가된다. 이 동작을 비활성화하려면 provide_automatic_options 속성을 False로 설정한다. 여러 개의 Access-Control-Allow-* 헤더를 추가해야 하는 CORS를 다룰 때처럼 OPTIONS 헤더가 호출될 때 사용자 정의 헤더를 응답에 추가하고 싶다면 이 방법이 유용하다.

 

변수와 컨버터

라우팅 시스템이 제공하는 또 다른 기능은 변수다

<변수_이름>구문을 이용해서 변수를 사용할 수 있다. 

플라스크가 데코레이트 함수를 호출할 때 URL에서 <변수_이름> 위치의 값을 변수_이름 인수로 변환해 준다

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/api/person/<person_id>')
def person(person_id):
	response = jsonify({'Hello': person_id})
    return response
    
if __name__ == '__main__':
	app.run()

https://www.python.org/dev/peps/pep-0333/#environ-variables

 

PEP 333 -- Python Web Server Gateway Interface v1.0

The official home of the Python Programming Language

www.python.org

https://pythonhosted.org/itsdangerous/

 

itsdangerous — itsdangerous

itsdangerous Sometimes you just want to send some data to untrusted environments. But how to do this safely? The trick involves signing. Given a key only you know, you can cryptographically sign your data and hand it over to someone else. When you get the

pythonhosted.org

https://en.wikipedia.org/wiki/HMAC

 

HMAC - Wikipedia

In cryptography, an HMAC (sometimes expanded as either keyed-hash message authentication code or hash-based message authentication code) is a specific type of message authentication code (MAC) involving a cryptographic hash function and a secret cryptograp

en.wikipedia.org

https://pythonhosted.org/blinker/

 

Blinker Documentation — Blinker

Blinker Documentation Blinker provides fast & simple object-to-object and broadcast signaling for Python objects. The core of Blinker is quite small but provides powerful features: a global registry of named signals anonymous signals custom name registries

pythonhosted.org

https://flask.palletsprojects.com/en/1.1.x/api/#core-signals-list

 

API — Flask Documentation (1.1.x)

API This part of the documentation covers all the interfaces of Flask. For parts where Flask depends on external libraries, we document the most important right here and provide links to the canonical documentation. Application Object class flask.Flask(imp

flask.palletsprojects.com

https://sentry.io

 

Sentry | Error Tracking Software — JavaScript, Python, PHP, Ruby, more

Open-source error tracking that helps developers monitor and fix crashes in real time. Iterate continuously. Boost workflow efficiency. Improve user experience.

sentry.io

http://www.rabbitmq.com/

 

Messaging that just works — RabbitMQ

 

www.rabbitmq.com

https://flask.palletsprojects.com/en/1.1.x/extensions/

 

Extensions — Flask Documentation (1.1.x)

Extensions Extensions are extra packages that add functionality to a Flask application. For example, an extension might add support for sending email or connecting to a database. Some extensions add entire new frameworks to help build certain types of appl

flask.palletsprojects.com

http://jinja.pocoo.org 

 

Welcome | Jinja2 (The Python Template Engine)

And Powerful Jinja2 is one of the most used template engines for Python. It is inspired by Django's templating system but extends it with an expressive language that gives template authors a more powerful set of tools. On top of that it adds sandboxed exec

jinja.pocoo.org

https://github.com/mozilla-services/konfig

 

mozilla-services/konfig

Yet another configuration object. Contribute to mozilla-services/konfig development by creating an account on GitHub.

github.com

https://flask-restless.readthedocs.io

 

Flask-Restless — Flask-Restless 0.17.0 documentation

 

flask-restless.readthedocs.io

https://wiki.openstack.org/wiki/Security/Projects/Bandit

 

Security/Projects/Bandit - OpenStack

Project Moved Please note that Bandit is no longer maintained under OpenStack and has been moved to the Python Code Quality Authority: https://github.com/PyCQA/bandit All patches and issues should be raised on the PyCQA github repository. Overview Bandit i

wiki.openstack.org

https://github.com/Runnerly/microservice

 

Runnerly/microservice

skeleton. Contribute to Runnerly/microservice development by creating an account on GitHub.

github.com

 

최근에 올라온 글
글 보관함