>  기사  >  백엔드 개발  >  병 소스 코드 읽기 참고 사항(1): WSGI

병 소스 코드 읽기 참고 사항(1): WSGI

巴扎黑
巴扎黑원래의
2017-06-23 15:06:292399검색

머리말

Bottle은 Python 웹 프레임워크입니다. 전체 프레임워크에는 4k줄 미만의 코드가 하나 뿐이며 Python 표준 라이브러리 외에는 종속성이 없습니다. 그러나 라우팅, 템플릿, 플러그인과 같은 웹 프레임워크의 공통 기능이 포함되어 있습니다. 웹 프레임워크가 무엇인지, 어떻게 작동하는지 이해하려면 Bottle 소스 코드를 읽는 것보다 더 좋은 시간은 없습니다. Bottle은 WSGI를 지원하는 프레임워크이므로 소스코드를 읽기 전에 먼저 WSGI가 무엇인지부터 알아보자.

참고: 이 기사에 사용된 Bottle 버전은 0.12.13입니다.

WSGI

일반 웹 서버는 정적 페이지만 처리할 수 있습니다. 동적 콘텐츠가 포함된 경우 서버는 Java/Python/Ruby와 같은 서버 언어와 상호 작용하고 처리를 위해 콘텐츠를 전달해야 합니다. 대부분의 웹 서버는 C로 작성되어 서버 언어를 직접 실행할 수 없기 때문에 둘 사이에 브리지가 필요합니다(실제 응용에서는 WSGI를 지원하기 위해 일반적으로 웹 서버와 WSGI 응용 프로그램 사이에 응용 서버를 추가합니다). Python에서 WSGI는 그러한 브리지입니다. WSGI의 구현은 두 부분으로 나누어집니다. 하나는 서버이고 다른 하나는 애플리케이션입니다. 각각의 모습은 어떤지, 두 가지가 어떻게 함께 작동하는지 살펴보겠습니다.

 1 class Server: 2  3     def __init__(self, server_address): 4         self.server_address = server_address 5  6     def set_app(self, application): 7         self.app = application 8  9     def serve_forever(self):10         while True:11             # socket.accept()12             if request_comein():13                 self.handle_request()14 15     def handle_request(self):16         request_data = self.get_request()17         self.parse_request(request_data)18         environ = self.get_environ()19         result = self.application(environ, self.start_response)20         self.send_response(result)21 22     def start_response(self, status, headers, exc_info):23         pass24 25     def get_environ(self):26         pass27 28     def get_request(self):29         pass30 31     def parse_request(self, text):32         pass33 34     def send_response(self, message):35         pass36 37 38 def make_server(host, port, app, server=Server):39     server = server((host, port))40     server.set_app(app)41     return server42 43 def simple_app(environ, start_response):44     status = '200 OK'45     response_headers = [('Content-type', 'text/plain')]46     start_response(status, response_headers)47     return 'Hello World!'48 49 if __name__ == '__main__':50     server = make_server('localhost', 8080, simple_app)51     server.serve_forever()

이 서버 모델은 공간이 제한되어 있어 많은 세부 사항이 생략되어 있습니다. 간단하고 실행 가능한 WSGI 서버를 원한다면 웹 서버 구축하기 파트 2를 참조하세요.

서버는 요청을 받은 후 요청 메시지의 정보를 분석하고 결과를 Environ이라는 사전에 저장합니다. 그런 다음 환경 및 헤더 정보를 매개변수로 처리하는 start_response 함수를 사용하여 응용 프로그램(environ, start_response)을 호출합니다. 마지막으로 애플리케이션의 결과는 새로운 응답으로 구성되어 클라이언트로 다시 전송됩니다.

애플리케이션 측면에서 WSGI 애플리케이션은 호출 가능한 객체입니다. 함수, 메서드, 클래스 또는 __call__ 메서드가 있는 인스턴스일 수 있습니다. 위의 응용 프로그램은 함수입니다.

WSGI 표준에 따라 다양한 서버와 애플리케이션/프레임워크가 개발되면 필요에 따라 다양한 서버와 프레임워크를 자유롭게 결합할 수 있습니다.

Bottle의 가장 간단한 애플리케이션

WSGI를 간략하게 이해한 후 Bottle로 돌아가 Bottle 애플리케이션이 어떻게 생겼는지, 어떻게 실행되는지, 우리 모델과 어떻게 다른지 관찰합니다.

1 from bottle import Bottle, run2 3 app = Bottle()4 5 @app.route('/hello')6 def hello():7     return 'Hello World!'8 9 run(app, host='localhost', port=8080, server='wsgiref')

이제 이 프로그램을 실행하고 브라우저를 사용하여 'localhost:8080/hello' 주소에 액세스하면 'Hello World!'가 표시됩니다.

1. 위의 애플리케이션과 달리 Bottle 애플리케이션은 인스턴스입니다. WSGI 규정에 따르면 Bottle 개체는 __call__ 메서드를 구현해야 합니다.

1 def __call__(self, environ, start_response):2     ''' Each instance of :class:'Bottle' is a WSGI application. '''3     return self.wsgi(environ, start_response)

따라서 이 Bottle.wsgi 메서드는 서버가 Bottle 애플리케이션을 호출하는 입구이자 우리가 읽을 수 있는 입구이기도 합니다. 소스 코드.

2. @app.route() 이 데코레이터는 함수를 URL에 바인딩합니다. 'localhost:8080/hello'에 접근하면 hello 함수가 호출됩니다.

3. Bottle의 기본 서버는 wsgiref(Python 표준 라이브러리에서 WSGI의 간단한 구현)입니다. 물론 Bottle은 많은 서버에 대한 어댑터도 작성했습니다. 서버의 값만 변경하면 run() 함수가 서버 이름을 기반으로 해당 어댑터를 찾습니다. 추가 코드를 작성할 필요가 없습니다.

실행 함수 및 어댑터 부분 코드:

 1 def run(app=None, server='wsgiref', host='127.0.0.1', port=8080, 2         interval=1, reloader=False, quiet=False, plugins=None, 3         debug=None, **kargs): 4     if server in server_names: 5         server = server_names.get(server) 6     if isinstance(server, basestring): 7         server = load(server) 8     if isinstance(server, type): 9         server = server(host=host, port=port, **kargs)10     if not isinstance(server, ServerAdapter):11         raise ValueError("Unknown or unsupported server: %r" % server)12     ...13     server.run(app)14 15 class MeinheldServer(ServerAdapter):16     def run(self, handler):17         from meinheld import server18         server.listen((self.host, self.port))19         server.run(handler)

Finally

이 기사에서는 WSGI 표준에서 서버와 애플리케이션이 상호 작용하는 방식을 간략하게 소개합니다. 다음 글에서는 계속해서 이 간단한 애플리케이션에 초점을 맞추고 @app.route()와 관련된 라우팅 기능에 대해 이야기하겠습니다.

위 내용은 병 소스 코드 읽기 참고 사항(1): WSGI의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.