Files
connexion/docs/cookbook.rst
Henning Jacobs 594ded9a05 Document how to use a wildcard path parameter (#1398)
* Update cookbook.rst

* address review comments
2021-07-09 17:49:42 +02:00

152 lines
4.0 KiB
ReStructuredText

Connexion Cookbook
==================
This section aims to be a cookbook of possible solutions for specific
use cases of Connexion.
Wildcard path parameters
------------------------
Path parameters cannot contain slashes by default, but sometimes it's useful
to have a path parameter which takes the full remainder of the HTTP path
including slashes, e.g. to allow parsing "my/deep/path" from
"/pages/my/deep/path". Connexion supports parsing such path remainders
by using ``format: path``:
.. code-block:: yaml
paths:
/pages/{path}:
get:
# (...)
parameters:
- name: "path"
in: path
description: "Remainder of path, including slashes."
schema:
type: string
format: path
Custom type format
------------------
It is possible to define custom type formats that are going to be used
by the Connexion payload validation on request parameters and response
payloads of your API.
Let's say your API deals with Products and you want to define a field
`price_label` that has a "money" format value. You can create a format
checker function and register that to be used to validate values of
the "money" format.
Example of a possible schema of Product having an attribute with
"money" format that would be defined in your OpenAPI specification:
.. code-block:: yaml
type: object
properties:
title:
type: string
price_label:
type: string
format: money
Then we create a format checker function for that type of value:
.. code-block:: python
import re
MONEY_RE = re.compile('^\$\s*\d+(\.\d\d)?')
def is_money(val):
if not isinstance(val, str):
return True
return MONEY_RE.match(val)
The format checker function is expected to return `True` when the
value matches the expected format and return `False` when it
doesn't. Also is important to verify if the type of the value you are
trying to validate is compatible with the format. In our example we
check if the `val` is of type "string" before performing any further
checking.
The final step to make it work is registering our `is_money` function
to the format "money" in json_schema library. For that, we can use the
draft4 format checker decorator.
.. code-block:: python
from jsonschema import draft4_format_checker
@draft4_format_checker.checks('money')
def is_money(val):
...
This is all you need to have validation for that format in your
Connexion application. Keep in mind that the format checkers should be
defined and registered before you run your application server. A full
example can be found at
https://gist.github.com/rafaelcaricio/6e67286a522f747405a7299e6843cd93
CORS Support
------------
CORS_ (Cross-origin resource sharing) is not built into Connexion, but you can use the `flask-cors`_ library
to set CORS headers:
.. code-block:: python
import connexion
from flask_cors import CORS
app = connexion.FlaskApp(__name__)
app.add_api('swagger.yaml')
# add CORS support
CORS(app.app)
app.run(port=8080)
.. _CORS: https://en.wikipedia.org/wiki/Cross-origin_resource_sharing
.. _flask-cors: https://flask-cors.readthedocs.io/
Logging
------------
You can customize logging accessing the `_flask-logger` directly
or configuring the logger via dictConfig.
Remember that you should configure logging for your project as soon
as possible when the program starts or you'll get the default configuration.
.. code-block:: python
import connexion
from logging.config import dictConfig
dictConfig({
'version': 1,
'handlers': {
'syslog': {
'class': 'logging.handlers.SysLogHandler'
}
},
'root': {
'handlers': ['syslog']
}
})
app = connexion.FlaskApp(__name__)
app.app.logger.warn("I configured the flask logger!")
app.add_api('swagger.yaml')
app.run(port=8080)
.. _flask-logger: http://flask.pocoo.org/docs/1.0/logging/