Replies: 2 comments 3 replies
-
|
Did some research, in python's ecosystem, Middleware is more commonly used.
layer is mostly used in
so I think Middleware is better name. |
Beta Was this translation helpful? Give feedback.
1 reply
-
Basically define a class -> define special method, usually 1. Django Middleware
import time
class TimingMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
...
response = self.get_response(request)
...
return response
class LoggingMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
...
response = self.get_response(request)
...
return responseMIDDLEWARE = [
...
# require seq: LoggingMiddleware -> TimingMiddleware -> ... -> View
# respond seq: View -> ... -> TimingMiddleware -> LoggingMiddleware
'myapp.middleware.LoggingMiddleware',
'myapp.middleware.TimingMiddleware',
]2. Flask Middleware (use WSGI Middleware)
from flask import Flask, Response
import time
class TimingMiddleware:
def __init__(self, wsgi_app):
self.wsgi_app = wsgi_app
def __call__(self, environ, start_response):
response_iterable = self.wsgi_app(environ, custom_start_response)
return response_iterable
class LoggingMiddleware:
def __init__(self, wsgi_app):
self.wsgi_app = wsgi_app
def __call__(self, environ, start_response):
request = Request(environ)
def custom_start_response(status, headers, exc_info=None):
...
response_iterable = self.wsgi_app(environ, custom_start_response)
return response_iterable
app = Flask(__name__)
@app.route('/')
def hello():
time.sleep(0.1)
return Response("Hello from Flask with WSGI Middleware!", mimetype='text/plain')
# req seq: Logging -> Timing -> Flask App
# res seq: Flask App -> Timing -> Logging
app.wsgi_app = LoggingMiddleware(app.wsgi_app)
app.wsgi_app = TimingMiddleware(app.wsgi_app) # Timing in Logging
if __name__ == '__main__':
app.run(debug=True, port=5000)3. FastAPI Middleware
from fastapi import FastAPI, Request, Response
import time
from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
from starlette.types import ASGIApp, Receive, Scope, Send
class TimingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response:
response = await call_next(request)
return response
class LoggingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response:
response = await call_next(request)
return response
app = FastAPI()
# use add_middleware
# req seq: Logging -> Timing -> Route
# res seq: Route -> Timing -> Logging
app.add_middleware(LoggingMiddleware) # most outside
app.add_middleware(TimingMiddleware) # inner side
@app.get("/")
async def read_root():
await asyncio.sleep(0.1)
return {"message": "Hello from FastAPI with Middleware!"} |
Beta Was this translation helpful? Give feedback.
2 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
The term
Layeris commonly used in Rust but not as much in Python. What is the equivalent term in Python? Should we useMiddlewareinstead?inviting @Zheaoli @messense @asukaminato0721 @yihong0618
Beta Was this translation helpful? Give feedback.
All reactions