Flask의 응답

4341 단어
카탈로그
  • Flask의 Response.
  • 특수한 호응.

  • Part1: Flask의 Response
    예제 프로그램 1
    from flask import Flask 
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return '***Saltriver***'
    
    if __name__ == '__main__':
        app.run()
    

    여전히 Flask에서.wsgi_app () 분석을 시작합니다.우리는 전체 과정에 이상이 발생하지 않았다고 가정한다.
        def wsgi_app(self, environ, start_response):
                ...
                try:
                   #     response.
                    response = self.full_dispatch_request()
                ...
                #   response      .
                return response(environ, start_response)
                ...
    

    fulldispatch_request()에서 다음을 수행합니다.
        def full_dispatch_request(self):
            ...
                if rv is None:
                    rv = self.dispatch_request()
                    #   print  ,    rv  .
                    #       ,rv   '***Saltriver***'
                    print('rv--->', rv)
            ...
            response = self.make_response(rv)
            response = self.process_response(response)
            ...
            return response
    

    다음은 self를 보도록 하겠습니다.make_response(rv), make_response문의 파일에 따르면 rv값은 4가지 종류가 있는데 그 중에서str형식의 문자열을 포함하고 다른 문자열은 잠시 무시하고 예시 프로그램에서 rv가 문자열의 유형을 먼저 분석한다.
        def make_response(self, rv):
    
            status_or_headers = headers = None
            ...
    
            if not isinstance(rv, self.response_class):
                #   rv text_type  .
                if isinstance(rv, (text_type, bytes, bytearray)):
                    #  response_class rv    (wrap).
                    rv = self.response_class(rv, headers=headers,
                                             status=status_or_headers)
                    headers = status_or_headers = None
                ...
            ...
            return rv
    

    response_class는 어떻게 rv를 포장합니까?werkzeug 공식 문서 5.4절 Response를 볼 수 있습니다.설명서, In reality, response objects are nothing more than glorified WSGI applications.실제로response 대상은 WSGI 표준을 따르는 응용에 불과하다.즉, 우리는 심지어 그것을 호출할 수 있다.그것을 호출할 때 어떤 인자를 입력합니까?environ과 startresponse. full 로 돌아가기dispatch_request()에서 process에 대해response(response), 주로 두 가지 일을 하고 애프터request_functions와 Cookies를 설정하여response를 마지막으로 처리합니다.예시 프로그램에 실질적인 프로세스-response가 없습니다.마지막으로response(environ,start response)를 반환합니다!다음은 자세히 연구해 보겠습니다.
        def run(self, host=None, port=None, debug=None, **options):
            ...
            try:
                # self   Flask  .
                run_simple(host, port, self, **options)
            finally:
                ...
    

    앱에서.run ()에서 run 을 호출합니다단순 함수.우리는 werkzeug에 있을 수 있다.서버에서 보기.
        def inner():
            make_server(hostname, port, application, threaded,
                        processes, request_handler,
                        passthrough_errors, ssl_context).serve_forever()
    

    run단순 () 중,makeserver(...).serve_forever(), 가령make서버가 BaseWSGIServer를 반환합니다.WSGIRequestHandler에서 run 중점적으로 분석wsgi() 함수.app(environ,start response)가 실행 중이기 때문에excute 함수를 보십시오.
            def execute(app):
                application_iter = app(environ, start_response)
                try:
                    for data in application_iter:
                        write(data)
                    if not headers_sent:
                        write(b'')
                finally:
                    if hasattr(application_iter, 'close'):
                        application_iter.close()
                    application_iter = None
    

    우리가 Flask에 있으니까.wsgi_app(...)excute 함수를 전송하는 app, 즉response 대상을 되돌려줍니다.
        # Werkzeug/wrappers.py/Class.BaseResponse
        def __call__(self, environ, start_response):
         
            app_iter, status, headers = self.get_wsgi_response(environ)
            start_response(status, headers)
            return app_iter
    

    start_response의 임무는 WSGIRequestHandler에서run 을 설정하는 것입니다ssgi의 헤더스set 변수:
    headers_set[:] = [status, response_headers]
    

    런ssgi의 write(data) 함수에서 wfile에 데이터를 쓰기 전에 status와responseheaders.
            def write(data):
                assert headers_set, 'write() before start_response'
                if not headers_sent:  # 

    다음은 나 자신에게 남겨진 문제들(아직 해결되지 않은 문제들)이다.
  • WSGI 인터페이스는 왜 이렇게 설계되었습니까?
  • app_iter는 왜iterable의입니까?PEP333을 다시 한 번 읽을 준비를 하고 있습니다.

  • Part2

    좋은 웹페이지 즐겨찾기