From 6d5ccdefe29292974d0bb8e1d80dcd1a06f28368 Mon Sep 17 00:00:00 2001 From: pgjones Date: Sun, 11 Apr 2021 09:10:54 +0100 Subject: [PATCH] Bugfix iscoroutinefunction with Python3.7 See this Python bug https://bugs.python.org/issue33261. The iscoroutinefunction doesn't recognise partially wrapped coroutine functions as coroutine functions - which is problematic as the coroutines will be called as if they are sync, which results in un-awaited coroutines. --- src/flask/app.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/flask/app.py b/src/flask/app.py index eefd361a..484881f4 100644 --- a/src/flask/app.py +++ b/src/flask/app.py @@ -1,8 +1,9 @@ +import functools +import inspect import os import sys import weakref from datetime import timedelta -from inspect import iscoroutinefunction from itertools import chain from threading import Lock @@ -56,6 +57,20 @@ from .wrappers import Request from .wrappers import Response +if sys.version_info >= (3, 8): + iscoroutinefunction = inspect.iscoroutinefunction +else: + + def iscoroutinefunction(func): + while inspect.ismethod(func): + func = func.__func__ + + while isinstance(func, functools.partial): + func = func.func + + return inspect.iscoroutinefunction(func) + + def _make_timedelta(value): if value is None or isinstance(value, timedelta): return value