functions-framework


Namefunctions-framework JSON
Version 3.6.0 PyPI version JSON
download
home_pagehttps://github.com/googlecloudplatform/functions-framework-python
SummaryAn open source FaaS (Function as a service) framework for writing portable Python functions -- brought to you by the Google Cloud Functions team.
upload_time2024-04-30 22:45:26
maintainerNone
docs_urlNone
authorGoogle LLC
requires_python<4,>=3.5
licenseNone
keywords functions-framework
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Functions Framework for Python

[![PyPI version](https://badge.fury.io/py/functions-framework.svg)](https://badge.fury.io/py/functions-framework)

[![Python unit CI][ff_python_unit_img]][ff_python_unit_link] [![Python lint CI][ff_python_lint_img]][ff_python_lint_link] [![Python conformace CI][ff_python_conformance_img]][ff_python_conformance_link] ![Security Scorecard](https://api.securityscorecards.dev/projects/github.com/GoogleCloudPlatform/functions-framework-python/badge)

An open source FaaS (Function as a service) framework for writing portable
Python functions -- brought to you by the Google Cloud Functions team.

The Functions Framework lets you write lightweight functions that run in many
different environments, including:

*   [Google Cloud Functions](https://cloud.google.com/functions/)
*   Your local development machine
*   [Cloud Run and Cloud Run for Anthos](https://cloud.google.com/run/)
*   [Knative](https://github.com/knative/)-based environments

The framework allows you to go from:

```python
def hello(request):
    return "Hello world!"
```

To:

```sh
curl http://my-url
# Output: Hello world!
```

All without needing to worry about writing an HTTP server or complicated request handling logic.

## Features

*   Spin up a local development server for quick testing
*   Invoke a function in response to a request
*   Automatically unmarshal events conforming to the [CloudEvents](https://cloudevents.io/) spec
*   Portable between serverless platforms

## Installation

Install the Functions Framework via `pip`:

```sh
pip install functions-framework
```

Or, for deployment, add the Functions Framework to your `requirements.txt` file:

```
functions-framework==3.*
```

## Quickstarts

### Quickstart: HTTP Function (Hello World)

Create an `main.py` file with the following contents:

```python
import flask
import functions_framework

@functions_framework.http
def hello(request: flask.Request) -> flask.typing.ResponseReturnValue:
    return "Hello world!"
```

> Your function is passed a single parameter, `(request)`, which is a Flask [`Request`](https://flask.palletsprojects.com/en/3.0.x/api/#flask.Request) object.

Run the following command:

```sh
functions-framework --target hello --debug
 * Serving Flask app "hello" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
```

(You can also use `functions-framework-python` if you have multiple
language frameworks installed).

Open http://localhost:8080/ in your browser and see *Hello world!*.

Or send requests to this function using `curl` from another terminal window:

```sh
curl localhost:8080
# Output: Hello world!
```

### Quickstart: CloudEvent Function

Create an `main.py` file with the following contents:

```python
import functions_framework
from cloudevents.http.event import CloudEvent

@functions_framework.cloud_event
def hello_cloud_event(cloud_event: CloudEvent) -> None:
   print(f"Received event with ID: {cloud_event['id']} and data {cloud_event.data}")
```

> Your function is passed a single [CloudEvent](https://github.com/cloudevents/sdk-python/blob/main/cloudevents/sdk/event/v1.py) parameter.

Run the following command to run `hello_cloud_event` target locally:

```sh
functions-framework --target=hello_cloud_event
```

In a different terminal, `curl` the Functions Framework server:

```sh
curl -X POST localhost:8080 \
   -H "Content-Type: application/cloudevents+json" \
   -d '{
	"specversion" : "1.0",
	"type" : "example.com.cloud.event",
	"source" : "https://example.com/cloudevents/pull",
	"subject" : "123",
	"id" : "A234-1234-1234",
	"time" : "2018-04-05T17:31:00Z",
	"data" : "hello world"
}'
```

Output from the terminal running `functions-framework`:
```
Received event with ID: A234-1234-1234 and data hello world
``` 

More info on sending [CloudEvents](http://cloudevents.io) payloads, see [`examples/cloud_run_cloud_events`](examples/cloud_run_cloud_events/) instruction.


### Quickstart: Error handling

The framework includes an error handler that is similar to the
[`flask.Flask.errorhandler`](https://flask.palletsprojects.com/en/1.1.x/api/#flask.Flask.errorhandler)
function, which allows you to handle specific error types with a decorator:

```python
import functions_framework


@functions_framework.errorhandler(ZeroDivisionError)
def handle_zero_division(e):
    return "I'm a teapot", 418


def function(request):
    1 / 0
    return "Success", 200
```

This function will catch the `ZeroDivisionError` and return a different
response instead.

### Quickstart: Pub/Sub emulator
1. Create a `main.py` file with the following contents:

   ```python
   def hello(event, context):
        print("Received", context.event_id)
   ```

1. Start the Functions Framework on port 8080:

   ```sh
   functions-framework --target=hello --signature-type=event --debug --port=8080
   ```

1. In a second terminal, start the Pub/Sub emulator on port 8085.

   ```sh
   export PUBSUB_PROJECT_ID=my-project
   gcloud beta emulators pubsub start \
       --project=$PUBSUB_PROJECT_ID \
       --host-port=localhost:8085
   ```

   You should see the following after the Pub/Sub emulator has started successfully:

   ```none
   [pubsub] INFO: Server started, listening on 8085
   ```

1. In a third terminal, create a Pub/Sub topic and attach a push subscription to the topic, using `http://localhost:8080` as its push endpoint. [Publish](https://cloud.google.com/pubsub/docs/quickstart-client-libraries#publish_messages) some messages to the topic. Observe your function getting triggered by the Pub/Sub messages.

   ```sh
   export PUBSUB_PROJECT_ID=my-project
   export TOPIC_ID=my-topic
   export PUSH_SUBSCRIPTION_ID=my-subscription
   $(gcloud beta emulators pubsub env-init)

   git clone https://github.com/googleapis/python-pubsub.git
   cd python-pubsub/samples/snippets/
   pip install -r requirements.txt

   python publisher.py $PUBSUB_PROJECT_ID create $TOPIC_ID
   python subscriber.py $PUBSUB_PROJECT_ID create-push $TOPIC_ID $PUSH_SUBSCRIPTION_ID http://localhost:8080
   python publisher.py $PUBSUB_PROJECT_ID publish $TOPIC_ID
   ```

   You should see the following after the commands have run successfully:

   ```none
   Created topic: projects/my-project/topics/my-topic

   topic: "projects/my-project/topics/my-topic"
   push_config {
     push_endpoint: "http://localhost:8080"
   }
   ack_deadline_seconds: 10
   message_retention_duration {
     seconds: 604800
   }
   .
   Endpoint for subscription is: http://localhost:8080

   1
   2
   3
   4
   5
   6
   7
   8
   9
   Published messages to projects/my-project/topics/my-topic.
   ```

   And in the terminal where the Functions Framework is running:

   ```none
    * Serving Flask app "hello" (lazy loading)
    * Environment: production
      WARNING: This is a development server. Do not use it in a production deployment.
      Use a production WSGI server instead.
    * Debug mode: on
    * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
    * Restarting with fsevents reloader
    * Debugger is active!
    * Debugger PIN: 911-794-046
   Received 1
   127.0.0.1 - - [11/Aug/2021 14:42:22] "POST / HTTP/1.1" 200 -
   Received 2
   127.0.0.1 - - [11/Aug/2021 14:42:22] "POST / HTTP/1.1" 200 -
   Received 5
   127.0.0.1 - - [11/Aug/2021 14:42:22] "POST / HTTP/1.1" 200 -
   Received 6
   127.0.0.1 - - [11/Aug/2021 14:42:22] "POST / HTTP/1.1" 200 -
   Received 7
   127.0.0.1 - - [11/Aug/2021 14:42:22] "POST / HTTP/1.1" 200 -
   Received 8
   127.0.0.1 - - [11/Aug/2021 14:42:22] "POST / HTTP/1.1" 200 -
   Received 9
   127.0.0.1 - - [11/Aug/2021 14:42:39] "POST / HTTP/1.1" 200 -
   Received 3
   127.0.0.1 - - [11/Aug/2021 14:42:39] "POST / HTTP/1.1" 200 -
   Received 4
   127.0.0.1 - - [11/Aug/2021 14:42:39] "POST / HTTP/1.1" 200 -
   ```

For more details on extracting data from a Pub/Sub event, see
https://cloud.google.com/functions/docs/tutorials/pubsub#functions_helloworld_pubsub_tutorial-python

### Quickstart: Build a Deployable Container

1. Install [Docker](https://store.docker.com/search?type=edition&offering=community) and the [`pack` tool](https://buildpacks.io/docs/install-pack/).

1. Build a container from your function using the Functions [buildpacks](https://github.com/GoogleCloudPlatform/buildpacks):

        pack build \
            --builder gcr.io/buildpacks/builder:v1 \
            --env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \
            --env GOOGLE_FUNCTION_TARGET=hello \
            my-first-function

1. Start the built container:

        docker run --rm -p 8080:8080 my-first-function
        # Output: Serving function...

1. Send requests to this function using `curl` from another terminal window:

        curl localhost:8080
        # Output: Hello World!

## Run your function on serverless platforms

### Google Cloud Functions

This Functions Framework is based on the [Python Runtime on Google Cloud Functions](https://cloud.google.com/functions/docs/concepts/python-runtime).

On Cloud Functions, using the Functions Framework is not necessary: you don't need to add it to your `requirements.txt` file.

After you've written your function, you can simply deploy it from your local machine using the `gcloud` command-line tool. [Check out the Cloud Functions quickstart](https://cloud.google.com/functions/docs/quickstart).

### Cloud Run/Cloud Run on GKE

Once you've written your function and added the Functions Framework to your `requirements.txt` file, all that's left is to create a container image. [Check out the Cloud Run quickstart](https://cloud.google.com/run/docs/quickstarts/build-and-deploy) for Python to create a container image and deploy it to Cloud Run. You'll write a `Dockerfile` when you build your container. This `Dockerfile` allows you to specify exactly what goes into your container (including custom binaries, a specific operating system, and more). [Here is an example `Dockerfile` that calls Functions Framework.](https://github.com/GoogleCloudPlatform/functions-framework-python/blob/main/examples/cloud_run_http)

If you want even more control over the environment, you can [deploy your container image to Cloud Run on GKE](https://cloud.google.com/run/docs/quickstarts/prebuilt-deploy-gke). With Cloud Run on GKE, you can run your function on a GKE cluster, which gives you additional control over the environment (including use of GPU-based instances, longer timeouts and more).

### Container environments based on Knative

Cloud Run and Cloud Run on GKE both implement the [Knative Serving API](https://www.knative.dev/docs/). The Functions Framework is designed to be compatible with Knative environments. Just build and deploy your container to a Knative environment.

## Configure the Functions Framework

You can configure the Functions Framework using command-line flags or environment variables. If you specify both, the environment variable will be ignored.

| Command-line flag  | Environment variable      | Description                                                                                                                                                                                      |
| ------------------ | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `--host`           | `HOST`                    | The host on which the Functions Framework listens for requests. Default: `0.0.0.0`                                                                                                               |
| `--port`           | `PORT`                    | The port on which the Functions Framework listens for requests. Default: `8080`                                                                                                                  |
| `--target`         | `FUNCTION_TARGET`         | The name of the exported function to be invoked in response to requests. Default: `function`                                                                                                     |
| `--signature-type` | `FUNCTION_SIGNATURE_TYPE` | The signature used when writing your function. Controls unmarshalling rules and determines which arguments are used to invoke your function. Default: `http`; accepted values: `http`, `event` or `cloudevent` |
| `--source`         | `FUNCTION_SOURCE`         | The path to the file containing your function. Default: `main.py` (in the current working directory)                                                                                             |
| `--debug`          | `DEBUG`                   | A flag that allows to run functions-framework to run in debug mode, including live reloading. Default: `False`                                                                                   |

## Enable Google Cloud Function Events

The Functions Framework can unmarshall incoming
Google Cloud Functions [event](https://cloud.google.com/functions/docs/concepts/events-triggers#events) payloads to `event` and `context` objects.
These will be passed as arguments to your function when it receives a request.
Note that your function must use the `event`-style function signature:

```python
def hello(event, context):
    print(event)
    print(context)
```

To enable automatic unmarshalling, set the function signature type to `event`
 using the `--signature-type` command-line flag or the `FUNCTION_SIGNATURE_TYPE` environment variable. By default, the HTTP
signature will be used and automatic event unmarshalling will be disabled.

For more details on this signature type, see the Google Cloud Functions
documentation on
[background functions](https://cloud.google.com/functions/docs/writing/background#cloud_pubsub_example).

See the [running example](examples/cloud_run_event).

## Advanced Examples

More advanced guides can be found in the [`examples/`](examples/) directory.
You can also find examples on using the CloudEvent Python SDK [here](https://github.com/cloudevents/sdk-python).

## Contributing

Contributions to this library are welcome and encouraged. See [CONTRIBUTING](CONTRIBUTING.md) for more information on how to get started.

[ff_python_unit_img]: https://github.com/GoogleCloudPlatform/functions-framework-python/workflows/Python%20Unit%20CI/badge.svg
[ff_python_unit_link]: https://github.com/GoogleCloudPlatform/functions-framework-python/actions?query=workflow%3A"Python+Unit+CI"
[ff_python_lint_img]: https://github.com/GoogleCloudPlatform/functions-framework-python/workflows/Python%20Lint%20CI/badge.svg
[ff_python_lint_link]: https://github.com/GoogleCloudPlatform/functions-framework-python/actions?query=workflow%3A"Python+Lint+CI"
[ff_python_conformance_img]: https://github.com/GoogleCloudPlatform/functions-framework-python/workflows/Python%20Conformance%20CI/badge.svg
[ff_python_conformance_link]: https://github.com/GoogleCloudPlatform/functions-framework-python/actions?query=workflow%3A"Python+Conformance+CI"

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/googlecloudplatform/functions-framework-python",
    "name": "functions-framework",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4,>=3.5",
    "maintainer_email": null,
    "keywords": "functions-framework",
    "author": "Google LLC",
    "author_email": "googleapis-packages@google.com",
    "download_url": "https://files.pythonhosted.org/packages/d1/9a/7348166ea0b639d0d8eefd812552361bd5f2e2e6295897d99970f80268f9/functions_framework-3.6.0.tar.gz",
    "platform": null,
    "description": "# Functions Framework for Python\n\n[![PyPI version](https://badge.fury.io/py/functions-framework.svg)](https://badge.fury.io/py/functions-framework)\n\n[![Python unit CI][ff_python_unit_img]][ff_python_unit_link] [![Python lint CI][ff_python_lint_img]][ff_python_lint_link] [![Python conformace CI][ff_python_conformance_img]][ff_python_conformance_link] ![Security Scorecard](https://api.securityscorecards.dev/projects/github.com/GoogleCloudPlatform/functions-framework-python/badge)\n\nAn open source FaaS (Function as a service) framework for writing portable\nPython functions -- brought to you by the Google Cloud Functions team.\n\nThe Functions Framework lets you write lightweight functions that run in many\ndifferent environments, including:\n\n*   [Google Cloud Functions](https://cloud.google.com/functions/)\n*   Your local development machine\n*   [Cloud Run and Cloud Run for Anthos](https://cloud.google.com/run/)\n*   [Knative](https://github.com/knative/)-based environments\n\nThe framework allows you to go from:\n\n```python\ndef hello(request):\n    return \"Hello world!\"\n```\n\nTo:\n\n```sh\ncurl http://my-url\n# Output: Hello world!\n```\n\nAll without needing to worry about writing an HTTP server or complicated request handling logic.\n\n## Features\n\n*   Spin up a local development server for quick testing\n*   Invoke a function in response to a request\n*   Automatically unmarshal events conforming to the [CloudEvents](https://cloudevents.io/) spec\n*   Portable between serverless platforms\n\n## Installation\n\nInstall the Functions Framework via `pip`:\n\n```sh\npip install functions-framework\n```\n\nOr, for deployment, add the Functions Framework to your `requirements.txt` file:\n\n```\nfunctions-framework==3.*\n```\n\n## Quickstarts\n\n### Quickstart: HTTP Function (Hello World)\n\nCreate an `main.py` file with the following contents:\n\n```python\nimport flask\nimport functions_framework\n\n@functions_framework.http\ndef hello(request: flask.Request) -> flask.typing.ResponseReturnValue:\n    return \"Hello world!\"\n```\n\n> Your function is passed a single parameter, `(request)`, which is a Flask [`Request`](https://flask.palletsprojects.com/en/3.0.x/api/#flask.Request) object.\n\nRun the following command:\n\n```sh\nfunctions-framework --target hello --debug\n * Serving Flask app \"hello\" (lazy loading)\n * Environment: production\n   WARNING: This is a development server. Do not use it in a production deployment.\n   Use a production WSGI server instead.\n * Debug mode: on\n * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)\n```\n\n(You can also use `functions-framework-python` if you have multiple\nlanguage frameworks installed).\n\nOpen http://localhost:8080/ in your browser and see *Hello world!*.\n\nOr send requests to this function using `curl` from another terminal window:\n\n```sh\ncurl localhost:8080\n# Output: Hello world!\n```\n\n### Quickstart: CloudEvent Function\n\nCreate an `main.py` file with the following contents:\n\n```python\nimport functions_framework\nfrom cloudevents.http.event import CloudEvent\n\n@functions_framework.cloud_event\ndef hello_cloud_event(cloud_event: CloudEvent) -> None:\n   print(f\"Received event with ID: {cloud_event['id']} and data {cloud_event.data}\")\n```\n\n> Your function is passed a single [CloudEvent](https://github.com/cloudevents/sdk-python/blob/main/cloudevents/sdk/event/v1.py) parameter.\n\nRun the following command to run `hello_cloud_event` target locally:\n\n```sh\nfunctions-framework --target=hello_cloud_event\n```\n\nIn a different terminal, `curl` the Functions Framework server:\n\n```sh\ncurl -X POST localhost:8080 \\\n   -H \"Content-Type: application/cloudevents+json\" \\\n   -d '{\n\t\"specversion\" : \"1.0\",\n\t\"type\" : \"example.com.cloud.event\",\n\t\"source\" : \"https://example.com/cloudevents/pull\",\n\t\"subject\" : \"123\",\n\t\"id\" : \"A234-1234-1234\",\n\t\"time\" : \"2018-04-05T17:31:00Z\",\n\t\"data\" : \"hello world\"\n}'\n```\n\nOutput from the terminal running `functions-framework`:\n```\nReceived event with ID: A234-1234-1234 and data hello world\n``` \n\nMore info on sending [CloudEvents](http://cloudevents.io) payloads, see [`examples/cloud_run_cloud_events`](examples/cloud_run_cloud_events/) instruction.\n\n\n### Quickstart: Error handling\n\nThe framework includes an error handler that is similar to the\n[`flask.Flask.errorhandler`](https://flask.palletsprojects.com/en/1.1.x/api/#flask.Flask.errorhandler)\nfunction, which allows you to handle specific error types with a decorator:\n\n```python\nimport functions_framework\n\n\n@functions_framework.errorhandler(ZeroDivisionError)\ndef handle_zero_division(e):\n    return \"I'm a teapot\", 418\n\n\ndef function(request):\n    1 / 0\n    return \"Success\", 200\n```\n\nThis function will catch the `ZeroDivisionError` and return a different\nresponse instead.\n\n### Quickstart: Pub/Sub emulator\n1. Create a `main.py` file with the following contents:\n\n   ```python\n   def hello(event, context):\n        print(\"Received\", context.event_id)\n   ```\n\n1. Start the Functions Framework on port 8080:\n\n   ```sh\n   functions-framework --target=hello --signature-type=event --debug --port=8080\n   ```\n\n1. In a second terminal, start the Pub/Sub emulator on port 8085.\n\n   ```sh\n   export PUBSUB_PROJECT_ID=my-project\n   gcloud beta emulators pubsub start \\\n       --project=$PUBSUB_PROJECT_ID \\\n       --host-port=localhost:8085\n   ```\n\n   You should see the following after the Pub/Sub emulator has started successfully:\n\n   ```none\n   [pubsub] INFO: Server started, listening on 8085\n   ```\n\n1. In a third terminal, create a Pub/Sub topic and attach a push subscription to the topic, using `http://localhost:8080` as its push endpoint. [Publish](https://cloud.google.com/pubsub/docs/quickstart-client-libraries#publish_messages) some messages to the topic. Observe your function getting triggered by the Pub/Sub messages.\n\n   ```sh\n   export PUBSUB_PROJECT_ID=my-project\n   export TOPIC_ID=my-topic\n   export PUSH_SUBSCRIPTION_ID=my-subscription\n   $(gcloud beta emulators pubsub env-init)\n\n   git clone https://github.com/googleapis/python-pubsub.git\n   cd python-pubsub/samples/snippets/\n   pip install -r requirements.txt\n\n   python publisher.py $PUBSUB_PROJECT_ID create $TOPIC_ID\n   python subscriber.py $PUBSUB_PROJECT_ID create-push $TOPIC_ID $PUSH_SUBSCRIPTION_ID http://localhost:8080\n   python publisher.py $PUBSUB_PROJECT_ID publish $TOPIC_ID\n   ```\n\n   You should see the following after the commands have run successfully:\n\n   ```none\n   Created topic: projects/my-project/topics/my-topic\n\n   topic: \"projects/my-project/topics/my-topic\"\n   push_config {\n     push_endpoint: \"http://localhost:8080\"\n   }\n   ack_deadline_seconds: 10\n   message_retention_duration {\n     seconds: 604800\n   }\n   .\n   Endpoint for subscription is: http://localhost:8080\n\n   1\n   2\n   3\n   4\n   5\n   6\n   7\n   8\n   9\n   Published messages to projects/my-project/topics/my-topic.\n   ```\n\n   And in the terminal where the Functions Framework is running:\n\n   ```none\n    * Serving Flask app \"hello\" (lazy loading)\n    * Environment: production\n      WARNING: This is a development server. Do not use it in a production deployment.\n      Use a production WSGI server instead.\n    * Debug mode: on\n    * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)\n    * Restarting with fsevents reloader\n    * Debugger is active!\n    * Debugger PIN: 911-794-046\n   Received 1\n   127.0.0.1 - - [11/Aug/2021 14:42:22] \"POST / HTTP/1.1\" 200 -\n   Received 2\n   127.0.0.1 - - [11/Aug/2021 14:42:22] \"POST / HTTP/1.1\" 200 -\n   Received 5\n   127.0.0.1 - - [11/Aug/2021 14:42:22] \"POST / HTTP/1.1\" 200 -\n   Received 6\n   127.0.0.1 - - [11/Aug/2021 14:42:22] \"POST / HTTP/1.1\" 200 -\n   Received 7\n   127.0.0.1 - - [11/Aug/2021 14:42:22] \"POST / HTTP/1.1\" 200 -\n   Received 8\n   127.0.0.1 - - [11/Aug/2021 14:42:22] \"POST / HTTP/1.1\" 200 -\n   Received 9\n   127.0.0.1 - - [11/Aug/2021 14:42:39] \"POST / HTTP/1.1\" 200 -\n   Received 3\n   127.0.0.1 - - [11/Aug/2021 14:42:39] \"POST / HTTP/1.1\" 200 -\n   Received 4\n   127.0.0.1 - - [11/Aug/2021 14:42:39] \"POST / HTTP/1.1\" 200 -\n   ```\n\nFor more details on extracting data from a Pub/Sub event, see\nhttps://cloud.google.com/functions/docs/tutorials/pubsub#functions_helloworld_pubsub_tutorial-python\n\n### Quickstart: Build a Deployable Container\n\n1. Install [Docker](https://store.docker.com/search?type=edition&offering=community) and the [`pack` tool](https://buildpacks.io/docs/install-pack/).\n\n1. Build a container from your function using the Functions [buildpacks](https://github.com/GoogleCloudPlatform/buildpacks):\n\n        pack build \\\n            --builder gcr.io/buildpacks/builder:v1 \\\n            --env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \\\n            --env GOOGLE_FUNCTION_TARGET=hello \\\n            my-first-function\n\n1. Start the built container:\n\n        docker run --rm -p 8080:8080 my-first-function\n        # Output: Serving function...\n\n1. Send requests to this function using `curl` from another terminal window:\n\n        curl localhost:8080\n        # Output: Hello World!\n\n## Run your function on serverless platforms\n\n### Google Cloud Functions\n\nThis Functions Framework is based on the [Python Runtime on Google Cloud Functions](https://cloud.google.com/functions/docs/concepts/python-runtime).\n\nOn Cloud Functions, using the Functions Framework is not necessary: you don't need to add it to your `requirements.txt` file.\n\nAfter you've written your function, you can simply deploy it from your local machine using the `gcloud` command-line tool. [Check out the Cloud Functions quickstart](https://cloud.google.com/functions/docs/quickstart).\n\n### Cloud Run/Cloud Run on GKE\n\nOnce you've written your function and added the Functions Framework to your `requirements.txt` file, all that's left is to create a container image. [Check out the Cloud Run quickstart](https://cloud.google.com/run/docs/quickstarts/build-and-deploy) for Python to create a container image and deploy it to Cloud Run. You'll write a `Dockerfile` when you build your container. This `Dockerfile` allows you to specify exactly what goes into your container (including custom binaries, a specific operating system, and more). [Here is an example `Dockerfile` that calls Functions Framework.](https://github.com/GoogleCloudPlatform/functions-framework-python/blob/main/examples/cloud_run_http)\n\nIf you want even more control over the environment, you can [deploy your container image to Cloud Run on GKE](https://cloud.google.com/run/docs/quickstarts/prebuilt-deploy-gke). With Cloud Run on GKE, you can run your function on a GKE cluster, which gives you additional control over the environment (including use of GPU-based instances, longer timeouts and more).\n\n### Container environments based on Knative\n\nCloud Run and Cloud Run on GKE both implement the [Knative Serving API](https://www.knative.dev/docs/). The Functions Framework is designed to be compatible with Knative environments. Just build and deploy your container to a Knative environment.\n\n## Configure the Functions Framework\n\nYou can configure the Functions Framework using command-line flags or environment variables. If you specify both, the environment variable will be ignored.\n\n| Command-line flag  | Environment variable      | Description                                                                                                                                                                                      |\n| ------------------ | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `--host`           | `HOST`                    | The host on which the Functions Framework listens for requests. Default: `0.0.0.0`                                                                                                               |\n| `--port`           | `PORT`                    | The port on which the Functions Framework listens for requests. Default: `8080`                                                                                                                  |\n| `--target`         | `FUNCTION_TARGET`         | The name of the exported function to be invoked in response to requests. Default: `function`                                                                                                     |\n| `--signature-type` | `FUNCTION_SIGNATURE_TYPE` | The signature used when writing your function. Controls unmarshalling rules and determines which arguments are used to invoke your function. Default: `http`; accepted values: `http`, `event` or `cloudevent` |\n| `--source`         | `FUNCTION_SOURCE`         | The path to the file containing your function. Default: `main.py` (in the current working directory)                                                                                             |\n| `--debug`          | `DEBUG`                   | A flag that allows to run functions-framework to run in debug mode, including live reloading. Default: `False`                                                                                   |\n\n## Enable Google Cloud Function Events\n\nThe Functions Framework can unmarshall incoming\nGoogle Cloud Functions [event](https://cloud.google.com/functions/docs/concepts/events-triggers#events) payloads to `event` and `context` objects.\nThese will be passed as arguments to your function when it receives a request.\nNote that your function must use the `event`-style function signature:\n\n```python\ndef hello(event, context):\n    print(event)\n    print(context)\n```\n\nTo enable automatic unmarshalling, set the function signature type to `event`\n using the `--signature-type` command-line flag or the `FUNCTION_SIGNATURE_TYPE` environment variable. By default, the HTTP\nsignature will be used and automatic event unmarshalling will be disabled.\n\nFor more details on this signature type, see the Google Cloud Functions\ndocumentation on\n[background functions](https://cloud.google.com/functions/docs/writing/background#cloud_pubsub_example).\n\nSee the [running example](examples/cloud_run_event).\n\n## Advanced Examples\n\nMore advanced guides can be found in the [`examples/`](examples/) directory.\nYou can also find examples on using the CloudEvent Python SDK [here](https://github.com/cloudevents/sdk-python).\n\n## Contributing\n\nContributions to this library are welcome and encouraged. See [CONTRIBUTING](CONTRIBUTING.md) for more information on how to get started.\n\n[ff_python_unit_img]: https://github.com/GoogleCloudPlatform/functions-framework-python/workflows/Python%20Unit%20CI/badge.svg\n[ff_python_unit_link]: https://github.com/GoogleCloudPlatform/functions-framework-python/actions?query=workflow%3A\"Python+Unit+CI\"\n[ff_python_lint_img]: https://github.com/GoogleCloudPlatform/functions-framework-python/workflows/Python%20Lint%20CI/badge.svg\n[ff_python_lint_link]: https://github.com/GoogleCloudPlatform/functions-framework-python/actions?query=workflow%3A\"Python+Lint+CI\"\n[ff_python_conformance_img]: https://github.com/GoogleCloudPlatform/functions-framework-python/workflows/Python%20Conformance%20CI/badge.svg\n[ff_python_conformance_link]: https://github.com/GoogleCloudPlatform/functions-framework-python/actions?query=workflow%3A\"Python+Conformance+CI\"\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "An open source FaaS (Function as a service) framework for writing portable Python functions -- brought to you by the Google Cloud Functions team.",
    "version": "3.6.0",
    "project_urls": {
        "Homepage": "https://github.com/googlecloudplatform/functions-framework-python"
    },
    "split_keywords": [
        "functions-framework"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c8dde7013060b7255e7752f65d0461adfeb5f920b63922af75a0969be1847405",
                "md5": "7b6c2ba5c872c874a018c9778363bbea",
                "sha256": "94c9a4d610374a5c41f97369efbba3817d025e403cc683dbfdb0c19fd6eed76a"
            },
            "downloads": -1,
            "filename": "functions_framework-3.6.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "7b6c2ba5c872c874a018c9778363bbea",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4,>=3.5",
            "size": 32572,
            "upload_time": "2024-04-30T22:45:23",
            "upload_time_iso_8601": "2024-04-30T22:45:23.352873Z",
            "url": "https://files.pythonhosted.org/packages/c8/dd/e7013060b7255e7752f65d0461adfeb5f920b63922af75a0969be1847405/functions_framework-3.6.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d19a7348166ea0b639d0d8eefd812552361bd5f2e2e6295897d99970f80268f9",
                "md5": "bdf47dad1d658cb988cf1706fe9fb965",
                "sha256": "c48c969826bd06424ea0e15fa8447c41ba3ad7134da7d411152391c1e67ff2bd"
            },
            "downloads": -1,
            "filename": "functions_framework-3.6.0.tar.gz",
            "has_sig": false,
            "md5_digest": "bdf47dad1d658cb988cf1706fe9fb965",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4,>=3.5",
            "size": 39162,
            "upload_time": "2024-04-30T22:45:26",
            "upload_time_iso_8601": "2024-04-30T22:45:26.235759Z",
            "url": "https://files.pythonhosted.org/packages/d1/9a/7348166ea0b639d0d8eefd812552361bd5f2e2e6295897d99970f80268f9/functions_framework-3.6.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-30 22:45:26",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "googlecloudplatform",
    "github_project": "functions-framework-python",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "tox": true,
    "lcname": "functions-framework"
}
        
Elapsed time: 0.25118s