Cuộc đàm thoại Gunicorn và Flask qua WSGI, có hai mặt: phía máy chủ và phía ứng dụng.
về việc áp dụng (framework) bên, chúng ta cần phải cung cấp một callable, ví dụ đơn giản:
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return ['Hello World']
máy chủ sẽ gọi ứng dụng này và cung cấp thông tin môi trường và một hàm callback mà được sử dụng để chỉ bắt đầu của một phản ứng. khi máy chủ nhận được phản hồi, nó sẽ trả về trình duyệt.
như vậy, cho gunicorn và bình:
from flask import Flask
app = Flask(__name__)
khi bạn làm điều này, bạn đã thực sự có một ứng dụng tương thích WSGI, app
là một callable:
class Flask(object):
...
def __call__(self, environ, start_response):
"""Shortcut for :attr:`wsgi_app`."""
return self.wsgi_app(environ, start_response)
[source](https://github.com/mitsuhiko/flask/blob/master/flask/app.py#L1976)
và khi bạn chạy gunicorn app:app
, bạn đang nói với gunicorn nơi tải ứng dụng của bạn, source
khi có yêu cầu, gunicorn phân tích cú pháp, xây dựng một dict environ
, được định nghĩa here, chứa thông tin như REQUEST_METHOD
, QUERY_STRING
v.v., sau đó gọi ứng dụng (đối tượng Flask!) Với nó: app(environ, start_repsonse)
source, start_repsonse
là một cuộc gọi lại trong Gunicorn để nhận trạng thái phản hồi và tiêu đề và giá trị trả lại của cuộc gọi app
sẽ được gửi dưới dạng nội dung phản hồi.
Sự khác nhau giữa việc gọi app.run() và gọi ứng dụng bình bằng Gunicorn là gì? – neel
'app.run()' sẽ chạy ứng dụng với máy chủ wsgi được xây dựng trong bình, dành cho mục đích phát triển và hoạt động kém dưới tải trọng cao. trong khi gunicorn được tối ưu hóa cao cho hiệu suất – wong2
gunicorn python_file: ứng dụng sẽ cho gunicorn biết nơi tải ứng dụng của bạn. Nó có nghĩa là gì? Bạn có thể giải thích thêm một chút không? – neel