github.com/phrase/openapi@v0.0.0-20240514140800-49e8a106740e/openapi-generator/templates/python/tornado/rest.mustache (about) 1 # coding: utf-8 2 3 {{>partial_header}} 4 5 import io 6 import json 7 import logging 8 import re 9 10 # python 2 and python 3 compatibility library 11 import six 12 from six.moves.urllib.parse import urlencode 13 import tornado 14 import tornado.gen 15 from tornado import httpclient 16 from urllib3.filepost import encode_multipart_formdata 17 18 from {{packageName}}.exceptions import ApiException, ApiValueError 19 20 logger = logging.getLogger(__name__) 21 22 23 class RESTResponse(io.IOBase): 24 25 def __init__(self, resp): 26 self.tornado_response = resp 27 self.status = resp.code 28 self.reason = resp.reason 29 30 if resp.body: 31 # In Python 3, the response body is utf-8 encoded bytes. 32 if six.PY3: 33 self.data = resp.body.decode('utf-8') 34 else: 35 self.data = resp.body 36 else: 37 self.data = None 38 39 def getheaders(self): 40 """Returns a CIMultiDictProxy of the response headers.""" 41 return self.tornado_response.headers 42 43 def getheader(self, name, default=None): 44 """Returns a given response header.""" 45 return self.tornado_response.headers.get(name, default) 46 47 48 class RESTClientObject(object): 49 50 def __init__(self, configuration, pools_size=4, maxsize=4): 51 # maxsize is number of requests to host that are allowed in parallel 52 53 self.ca_certs = configuration.ssl_ca_cert 54 self.client_key = configuration.key_file 55 self.client_cert = configuration.cert_file 56 57 self.proxy_port = self.proxy_host = None 58 59 # https pool manager 60 if configuration.proxy: 61 self.proxy_port = 80 62 self.proxy_host = configuration.proxy 63 64 self.pool_manager = httpclient.AsyncHTTPClient() 65 66 @tornado.gen.coroutine 67 def request(self, method, url, query_params=None, headers=None, body=None, 68 post_params=None, _preload_content=True, 69 _request_timeout=None): 70 """Execute Request 71 72 :param method: http request method 73 :param url: http request url 74 :param query_params: query parameters in the url 75 :param headers: http request headers 76 :param body: request json body, for `application/json` 77 :param post_params: request post parameters, 78 `application/x-www-form-urlencoded` 79 and `multipart/form-data` 80 :param _preload_content: this is a non-applicable field for 81 the AiohttpClient. 82 :param _request_timeout: timeout setting for this request. If one 83 number provided, it will be total request 84 timeout. It can also be a pair (tuple) of 85 (connection, read) timeouts. 86 """ 87 method = method.upper() 88 assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', 89 'PATCH', 'OPTIONS'] 90 91 if post_params and body: 92 raise ApiValueError( 93 "body parameter cannot be used with post_params parameter." 94 ) 95 96 request = httpclient.HTTPRequest(url) 97 request.allow_nonstandard_methods = True 98 request.ca_certs = self.ca_certs 99 request.client_key = self.client_key 100 request.client_cert = self.client_cert 101 request.proxy_host = self.proxy_host 102 request.proxy_port = self.proxy_port 103 request.method = method 104 if headers: 105 request.headers = headers 106 if 'Content-Type' not in headers: 107 request.headers['Content-Type'] = 'application/json' 108 request.request_timeout = _request_timeout or 5 * 60 109 110 post_params = post_params or {} 111 112 if query_params: 113 request.url += '?' + urlencode(query_params) 114 115 # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` 116 if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']: 117 if re.search('json', headers['Content-Type'], re.IGNORECASE): 118 if body: 119 body = json.dumps(body) 120 request.body = body 121 elif headers['Content-Type'] == 'application/x-www-form-urlencoded': # noqa: E501 122 request.body = urlencode(post_params) 123 elif headers['Content-Type'] == 'multipart/form-data': 124 multipart = encode_multipart_formdata(post_params) 125 request.body, headers['Content-Type'] = multipart 126 # Pass a `bytes` parameter directly in the body to support 127 # other content types than Json when `body` argument is provided 128 # in serialized form 129 elif isinstance(body, bytes): 130 request.body = body 131 else: 132 # Cannot generate the request from given parameters 133 msg = """Cannot prepare a request message for provided 134 arguments. Please check that your arguments match 135 declared content type.""" 136 raise ApiException(status=0, reason=msg) 137 138 r = yield self.pool_manager.fetch(request, raise_error=False) 139 140 if _preload_content: 141 142 r = RESTResponse(r) 143 144 # log response body 145 logger.debug("response body: %s", r.data) 146 147 if not 200 <= r.status <= 299: 148 raise ApiException(http_resp=r) 149 150 raise tornado.gen.Return(r) 151 152 @tornado.gen.coroutine 153 def GET(self, url, headers=None, query_params=None, _preload_content=True, 154 _request_timeout=None): 155 result = yield self.request("GET", url, 156 headers=headers, 157 _preload_content=_preload_content, 158 _request_timeout=_request_timeout, 159 query_params=query_params) 160 raise tornado.gen.Return(result) 161 162 @tornado.gen.coroutine 163 def HEAD(self, url, headers=None, query_params=None, _preload_content=True, 164 _request_timeout=None): 165 result = yield self.request("HEAD", url, 166 headers=headers, 167 _preload_content=_preload_content, 168 _request_timeout=_request_timeout, 169 query_params=query_params) 170 raise tornado.gen.Return(result) 171 172 @tornado.gen.coroutine 173 def OPTIONS(self, url, headers=None, query_params=None, post_params=None, 174 body=None, _preload_content=True, _request_timeout=None): 175 result = yield self.request("OPTIONS", url, 176 headers=headers, 177 query_params=query_params, 178 post_params=post_params, 179 _preload_content=_preload_content, 180 _request_timeout=_request_timeout, 181 body=body) 182 raise tornado.gen.Return(result) 183 184 @tornado.gen.coroutine 185 def DELETE(self, url, headers=None, query_params=None, body=None, 186 _preload_content=True, _request_timeout=None): 187 result = yield self.request("DELETE", url, 188 headers=headers, 189 query_params=query_params, 190 _preload_content=_preload_content, 191 _request_timeout=_request_timeout, 192 body=body) 193 raise tornado.gen.Return(result) 194 195 @tornado.gen.coroutine 196 def POST(self, url, headers=None, query_params=None, post_params=None, 197 body=None, _preload_content=True, _request_timeout=None): 198 result = yield self.request("POST", url, 199 headers=headers, 200 query_params=query_params, 201 post_params=post_params, 202 _preload_content=_preload_content, 203 _request_timeout=_request_timeout, 204 body=body) 205 raise tornado.gen.Return(result) 206 207 @tornado.gen.coroutine 208 def PUT(self, url, headers=None, query_params=None, post_params=None, 209 body=None, _preload_content=True, _request_timeout=None): 210 result = yield self.request("PUT", url, 211 headers=headers, 212 query_params=query_params, 213 post_params=post_params, 214 _preload_content=_preload_content, 215 _request_timeout=_request_timeout, 216 body=body) 217 raise tornado.gen.Return(result) 218 219 @tornado.gen.coroutine 220 def PATCH(self, url, headers=None, query_params=None, post_params=None, 221 body=None, _preload_content=True, _request_timeout=None): 222 result = yield self.request("PATCH", url, 223 headers=headers, 224 query_params=query_params, 225 post_params=post_params, 226 _preload_content=_preload_content, 227 _request_timeout=_request_timeout, 228 body=body) 229 raise tornado.gen.Return(result)