summaryrefslogtreecommitdiff
path: root/dev-python/flask-api/files/flask-api-3.1-flask-3.patch
blob: 92eddb8d8df070ca66f84c3523b5d98cc8178b8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
From 9c998897f67d8aa959dc3005d7d22f36568b6938 Mon Sep 17 00:00:00 2001
From: Arthur Taylor <arthur@codders.de>
Date: Sat, 21 Oct 2023 09:53:02 +0200
Subject: [PATCH] Add compatibility code to deal with Flask and Werkzeug
 deprecations

---
 flask_api/helpers.py   |  5 +++++
 flask_api/parsers.py   |  2 +-
 flask_api/renderers.py | 11 +++++++++--
 flask_api/request.py   |  2 +-
 4 files changed, 16 insertions(+), 4 deletions(-)
 create mode 100644 flask_api/helpers.py

diff --git a/flask_api/helpers.py b/flask_api/helpers.py
new file mode 100644
index 0000000..f83dd31
--- /dev/null
+++ b/flask_api/helpers.py
@@ -0,0 +1,5 @@
+def url_decode_stream(stream):
+    import urllib
+    body = stream.read()
+    body_str = body.decode()
+    return dict(urllib.parse.parse_qsl(body_str))
diff --git a/flask_api/parsers.py b/flask_api/parsers.py
index 56f45f6..d056210 100644
--- a/flask_api/parsers.py
+++ b/flask_api/parsers.py
@@ -2,8 +2,8 @@
 
 from werkzeug.formparser import MultiPartParser as WerkzeugMultiPartParser
 from werkzeug.formparser import default_stream_factory
-from werkzeug.urls import url_decode_stream
 
+from flask_api.helpers import url_decode_stream
 from flask_api import exceptions
 
 
diff --git a/flask_api/renderers.py b/flask_api/renderers.py
index a9aed23..b5951a2 100644
--- a/flask_api/renderers.py
+++ b/flask_api/renderers.py
@@ -1,8 +1,8 @@
 import pydoc
 import re
 
+import flask
 from flask import current_app, render_template, request
-from flask.globals import _request_ctx_stack
 
 from flask_api.compat import apply_markdown
 from flask_api.mediatypes import MediaType
@@ -95,7 +95,14 @@ def render(self, data, media_type, **options):
             mock_content = self._html_escape(text)
 
         # Determine the allowed methods on this view.
-        adapter = _request_ctx_stack.top.url_adapter
+        if hasattr(flask, 'globals') and \
+            hasattr(flask.globals, 'request_ctx'):
+            # update session for Flask >= 2.2
+            ctx = flask.globals.request_ctx._get_current_object()
+        else:  # pragma: no cover
+            # update session for Flask < 2.2
+            ctx = flask._request_ctx_stack.top
+        adapter = ctx.url_adapter
         allowed_methods = adapter.allowed_methods()
 
         endpoint = request.url_rule.endpoint
diff --git a/flask_api/request.py b/flask_api/request.py
index 33c3eaa..647dfc6 100644
--- a/flask_api/request.py
+++ b/flask_api/request.py
@@ -2,9 +2,9 @@
 
 from flask import Request
 from werkzeug.datastructures import MultiDict
-from werkzeug.urls import url_decode_stream
 from werkzeug.wsgi import get_content_length
 
+from flask_api.helpers import url_decode_stream
 from flask_api.negotiation import DefaultNegotiation
 from flask_api.settings import default_settings