머리말
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

기사는 구문 모호성으로 인해 파이썬에서 튜플 이해의 불가능성에 대해 논의합니다. 튜플을 효율적으로 생성하기 위해 튜플 ()을 사용하는 것과 같은 대안이 제안됩니다. (159 자)

이 기사는 파이썬의 모듈과 패키지, 차이점 및 사용법을 설명합니다. 모듈은 단일 파일이고 패키지는 __init__.py 파일이있는 디렉토리이며 관련 모듈을 계층 적으로 구성합니다.

기사는 Python의 Docstrings, 사용법 및 혜택에 대해 설명합니다. 주요 이슈 : 코드 문서 및 접근성에 대한 문서의 중요성.

기사는 Lambda 기능, 일반 기능과의 차이 및 프로그래밍 시나리오에서의 유틸리티에 대해 설명합니다. 모든 언어가 그들을 지원하는 것은 아닙니다.

기사는 파괴, 계속 및 Python을 통과시켜 루프 실행 및 프로그램 흐름을 제어하는 역할을 설명합니다.

이 기사는 기능 및 클래스와 같은 코드 구조에서 자리 표시 자로 사용되는 NULL 작업 인 Python의 'Pass'명령문에 대해 설명하여 구문 오류없이 향후 구현을 허용합니다.

기사는 파이썬의 인수와 같은 기능을 전달하는 것에 대해 논의하며, 모듈성과 같은 이점 및 분류 및 장식기와 같은 사용 사례를 강조합니다.

기사는 Python의 / 및 // 연산자에 대해 논의합니다 : / True Division, // for floor division. 주요 이슈는 차이점과 사용 사례를 이해하는 것입니다. 문자 수 : 158


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는
