Flask Helpers ============= As Action Providers are HTTP-servers, a common approach to building them is to use the `Flask `_ framework. To aid in developing Flask-based Action Providers, helper methods are provided which encapsulate much of the other functionality in the framework: authentication, validation and serialization for easy use in a Flask-based application. Rather than defining each of the Action Provider Interface routes in the Flask application, helpers are provided which declare the necessary routes to Flask, perform the serialization, validation and authentication on the request, and pass only those requests which have satisfied these conditions on to a user-defined implementation of the routes. To use the helpers, you must define functions corresponding to the various methods of the Action Provider interface (``run``, ``status``, ``release``, ``cancel``), and must provide the Action Provider introspection information in an instance of the ``ActionProviderDescription`` dataclass defined in the toolkit's ``data_types`` package. The application must also provide a Flask ``blueprint`` object to which the toolkit can attach the new routes. It is recommended that the ``blueprint`` be created with a ``url_prefix`` so that the Action Provider Interface routes are rooted at a distinct root path in the application's URL namespace. A brief example of setting up the flask helper is provided immediately below. A more complete example showing implementation of all the required functions is provided in the *examples/watchasay* directory. It is appropriate to use the example as a starting point for any new Action Providers which are developed. .. code-block:: python from globus_action_provider_tools.data_types import ( ActionProviderDescription, ActionRequest, ActionStatus, ActionStatusValue, ) from globus_action_provider_tools.flask import ( ActionStatusReturn, add_action_routes_to_blueprint, ) action_blueprint = Blueprint("action", __name__, url_prefix="/action") provider_description = ActionProviderDescription( globus_auth_scope="", title="My Action Provider", admin_contact="support@example.com", synchronous=True, input_schema={}, # JSON Schema representation of the input on the request log_supported=False ) add_action_routes_to_blueprint( action_blueprint, CLIENT_ID, CLIENT_SECRET, CLIENT_NAME, provider_description, action_run, action_status, action_cancel, action_release, ) In this example, the values ``CLIENT_ID``, ``CLIENT_SECRET`` and ``CLIENT_NAME`` are as defined in Globus Auth as described above (where ``CLIENT_NAME`` is almost always passed as ``None`` except in the uncommon, legacy case where a particular name has been associated with a Globus Auth client). The values ``action_run``, ``action_status``, ``action_cancel`` and ``action_release`` are all **functions** which will be called by the framework when the corresponding HTTP requests are called. Where appropriate, these functions are implemented in terms of the toolkit's data types so the need for JSON serialization and deserialization is greatly reduced from the application code. The framework will also provide validation of input ``ActionRequest`` data to the ``/run`` method prior to invoking the ``action_run`` function. As long as the return value from the various functions is of type ``ActionStatus``, the framework will also insure that the returned JSON data conforms to the Action Provider Interface. The **watchasay** example in the ``examples/`` directory demonstrates how these functions can be implemented.