Stay organized with collectionsSave and categorize content based on your preferences.
You must define a web server that uses theAPI or APIs you have created.
Cloud Endpoints Frameworks for Python implements the standardWeb Server Gateway Interface(WSGI) to route requests to your API to the methods in your code.
As with every application that runs on App Engine, you must create a file
calledapp.yamlin which you
configure your App Engine app's settings. To define the web server,
you make changes to yourapp.yamlfile.
To define a web server:
Create a Python module, for examplemain.py, and create anendpoints.api_serverobject at the top-level:
api=endpoints.api_server([EchoApi])
The codeapi = endpoints.api_server([EchoApi])creates a WSGI application
that routes API requests to the methods in theEchoAPIclass.
You can provide a list ofremote.Serviceobjects (which you defined when
youcreated your API) toendpoints.api_server. If you have an API that is implemented in several
classes, then yourremote.Serviceobject is a collection of classes as
described inCreating an API implemented with multiple
classes.
Whether you create a separate module for theendpoints.api_serverobject
depends on whether you created a single API or multiple APIs.
If you created multiple APIs (using multipleremote.Servicesubclasses) that are defined in multiple files, then we recommend that
you create a separate module for theendpoints.api_serverobject so
that you can import all the class files.
If you created a single API, you can add the requiredendpoints.api_servercode to the module where you define your API
because you don't need to import any other classes.
In yourapp.yamlfile, map the web server you just created to
the Cloud Endpoints location as follows:
handlers:# The endpoints handler must be mapped to /_ah/api.-url:/_ah/api/.*script:main.api
wheremainis the Python module you in which you defined theendpoints.api_serverobject.
Serving your API from a different path
Optional: To serve your API from a different path, for example/api/:
Endpoints Frameworks for Python uses thestandard Python logging moduleto log information about
the application's status and request lifecycle. To learn more about
App Engine logs and how to view them, reviewReading and writing application logsin the App Engine documentation.
The Python logging module provides predefined log levels. In increasing order
of severity, the log levels are:
Log level
Description
DEBUG
Provides detailed logs. Typically you set this level only when troubleshooting a problem.
INFO
The default log level for Endpoints Frameworks. Lets you trace the progress of the application at a high level.
WARNING
Alerts you that something unexpected happened, but the application can recover and still run normally.
ERROR
Alerts you that an error happened that might cause some loss of functionality, but the application is still running.
CRITICAL
Alerts you that a serious error or event happened that might cause the application to shutdown.
Loggers exist in a dot-separated hierarchy. For example, the loggerendpoints.api_configis a child of the loggerendpoints. This hierarchy
gives you precise control over which logs are emitted or suppressed. Typically,
you only change the two root loggers for Endpoints Frameworks:endpointsandendpoints_management.
EnableDEBUGlogging for Endpoints Frameworks
To avoid overloading the log reader, Endpoints Frameworks sets its
loggers to only record log entries with theINFOlog level or higher. At any
time after Endpoints Frameworks has been imported into your module,
you can change the log level as follows:
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-09-04 UTC."],[[["\u003cp\u003eA web server must be defined within the \u003ccode\u003eapp.yaml\u003c/code\u003e file to route requests to your API's methods using the Web Server Gateway Interface (WSGI).\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003eendpoints.api_server\u003c/code\u003e object, created in a Python module like \u003ccode\u003emain.py\u003c/code\u003e, functions as a WSGI application that routes API requests, with the option to include multiple \u003ccode\u003eremote.Service\u003c/code\u003e objects if you have a multi-class API.\u003c/p\u003e\n"],["\u003cp\u003eIn the \u003ccode\u003eapp.yaml\u003c/code\u003e file, you must map the web server to the Cloud Endpoints location, by setting the url handler to \u003ccode\u003e/_ah/api/.*\u003c/code\u003e or a different path if configured, and link the script to the module where \u003ccode\u003eendpoints.api_server\u003c/code\u003e was defined.\u003c/p\u003e\n"],["\u003cp\u003eEndpoints Frameworks for Python employs the standard Python logging module, with levels ranging from \u003ccode\u003eDEBUG\u003c/code\u003e to \u003ccode\u003eCRITICAL\u003c/code\u003e, defaulting to \u003ccode\u003eINFO\u003c/code\u003e, and can be modified using the \u003ccode\u003esetLevel\u003c/code\u003e method for loggers like \u003ccode\u003eendpoints\u003c/code\u003e and \u003ccode\u003eendpoints_management\u003c/code\u003e.\u003c/p\u003e\n"]]],[],null,["# Creating a web server\n\nYou must define a web server that uses the\n[API or APIs you have created](/endpoints/docs/frameworks/python/create_api).\nCloud Endpoints Frameworks for Python implements the standard\n[Web Server Gateway Interface](https://wsgi.readthedocs.io/)\n(WSGI) to route requests to your API to the methods in your code.\n\nAs with every application that runs on App Engine, you must create a file\ncalled [`app.yaml`](/appengine/docs/standard/python/config/appref) in which you\nconfigure your App Engine app's settings. To define the web server,\nyou make changes to your `app.yaml` file.\n\nTo define a web server:\n\n1. Create a Python module, for example `main.py`, and create an\n `endpoints.api_server` object at the top-level:\n\n api = endpoints.api_server([EchoApi])\n\n The code `api = endpoints.api_server([EchoApi])` creates a WSGI application\n that routes API requests to the methods in the `EchoAPI` class.\n\n You can provide a list of `remote.Service` objects (which you defined when\n you [created your API](/endpoints/docs/frameworks/python/create_api)) to\n `endpoints.api_server`. If you have an API that is implemented in several\n classes, then your `remote.Service` object is a collection of classes as\n described in [Creating an API implemented with multiple\n classes](/endpoints/docs/frameworks/python/create-multi-class-api).\n\n Whether you create a separate module for the `endpoints.api_server` object\n depends on whether you created a single API or multiple APIs.\n - If you created multiple APIs (using multiple `remote.Service`\n subclasses) that are defined in multiple files, then we recommend that\n you create a separate module for the `endpoints.api_server` object so\n that you can import all the class files.\n\n - If you created a single API, you can add the required\n `endpoints.api_server` code to the module where you define your API\n because you don't need to import any other classes.\n\n | **Warning:** if your code doesn't call `endpoints.api_server`, you will get a deployment failure when you try to deploy.\n2. In your `app.yaml` file, map the web server you just created to\n the Cloud Endpoints location as follows:\n\n handlers:\n # The endpoints handler must be mapped to /_ah/api.\n - url: /_ah/api/.*\n script: main.api\n\n where `main` is the Python module you in which you defined the\n `endpoints.api_server` object.\n\nServing your API from a different path\n--------------------------------------\n\nOptional: To serve your API from a different path, for example `/api/`:\n\n1. Modify the decorator:\n\n @endpoints.api(name='echo', version='v1', base_path='/api/')\n\n2. Change the `handlers` section in the `app.yaml` file:\n\n handlers:\n - url: /api/.*\n script: main.api\n\nLogging in Endpoints Frameworks for Python\n------------------------------------------\n\nEndpoints Frameworks for Python uses the\n[standard Python logging module](https://docs.python.org/2/library/logging.html)\nto log information about\nthe application's status and request lifecycle. To learn more about\nApp Engine logs and how to view them, review\n[Reading and writing application logs](/appengine/docs/standard/python/logs#writing_application_logs)\nin the App Engine documentation.\n\nThe Python logging module provides predefined log levels. In increasing order\nof severity, the log levels are:\n\nLoggers exist in a dot-separated hierarchy. For example, the logger\n`endpoints.api_config` is a child of the logger `endpoints`. This hierarchy\ngives you precise control over which logs are emitted or suppressed. Typically,\nyou only change the two root loggers for Endpoints Frameworks:\n`endpoints` and `endpoints_management`.\n\n### Enable `DEBUG` logging for Endpoints Frameworks\n\nTo avoid overloading the log reader, Endpoints Frameworks sets its\nloggers to only record log entries with the `INFO` log level or higher. At any\ntime after Endpoints Frameworks has been imported into your module,\nyou can change the log level as follows: \n\n import logging\n logging.getLogger('endpoints').setLevel(logging.DEBUG)\n logging.getLogger('endpoints_management').setLevel(logging.DEBUG)\n\nThe `setLevel` method sets the minimum log level for the logger."]]