Flask의 응답
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:  #   다음은 나 자신에게 남겨진 문제들(아직 해결되지 않은 문제들)이다.
Part2
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.