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)