Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

REST API in Google App Engine + Python?

Tags:

How create a RESTful API using Google App Engine with Python? I've tried using Cloud Endpoints, but the documentation does not focus on a RESTful API. Is there something similar to django-tastypie for GAE?

like image 659
TeknasVaruas Avatar asked Oct 15 '13 07:10

TeknasVaruas


People also ask

Does Google App Engine support Python 3?

No, It doesn't. Google App Engine (GAE) uses sandboxed Python 2.7 runtime for Python applications. That is the normal App Engine Hosting. However, in GAE you can use Managed VM Hosting.

Is Google App Engine an API?

Use this RESTful API with any programming language to manage your App Engine applications.


2 Answers

The RESTful api can be build based on EndPoint API. There are some tools can help you make things easier:

appengine rest server (not based on endpoints)

Drop-in server for Google App Engine applications which exposes your data model via a REST API with no extra work.

https://code.google.com/p/appengine-rest-server/

Another one is based on endpoints

By extending the functionality provided by ndb.Model class and the endpoints library, this library allows you to directly interact with model entities in your API methods rather than ProtoRPC requests. For example, instead of:

https://github.com/GoogleCloudPlatform/endpoints-proto-datastore

EDIT1:

I wrote a RESTFul api generator for endpoints.

# generate restful api in one line
BigDataLab = EndpointRestBuilder(GPCode).build(
    api_name="BigDataLab",
    name="bigdatalab",
    version="v1",
    description="My Little Api"
)

repo: https://github.com/Tagtoo/endpoints-proto-datastore-rest

like image 137
lucemia Avatar answered Oct 20 '22 15:10

lucemia


https://github.com/budowski/rest_gae

I've created a full-fledged REST API for NDB models over webapp2. Includes permissions handling and much much more.

Would love to hear your thoughts:

class MyModel(ndb.Model):
  property1 = ndb.StringProperty()
  property2 = ndb.StringProperty()
  owner = ndb.KeyPropertyProperty(kind='User')

  class RESTMeta:
    user_owner_property = 'owner' # When a new instance is created, this property will be set to the logged-in user
    include_output_properties = ['property1'] # Only include these properties for output

app = webapp2.WSGIApplication([
    # Wraps MyModel with full REST API (GET/POST/PUT/DELETE)
    RESTHandler(
      '/api/mymodel', # The base URL for this model's endpoints
      MyModel, # The model to wrap
      permissions={
        'GET': PERMISSION_ANYONE,
        'POST': PERMISSION_LOGGED_IN_USER,
        'PUT': PERMISSION_OWNER_USER,
        'DELETE': PERMISSION_ADMIN
      },

      # Will be called for every PUT, right before the model is saved (also supports callbacks for GET/POST/DELETE)
      put_callback=lambda model, data: model
    ),

    # Optional REST API for user management
    UserRESTHandler(
        '/api/users',
        user_model=MyUser, # You can extend it with your own custom user class
        user_details_permission=PERMISSION_OWNER_USER,
        verify_email_address=True,
        verification_email={
            'sender': 'John Doe <[email protected]>',
            'subject': 'Verify your email address',
            'body_text': 'Click here {{ user.full_name }}: {{ verification_url }}',
            'body_html': '<a href="{{ verification_url }}">Click here</a> {{ user.full_name }}'
            },
        verification_successful_url='/verification_successful',
        verification_failed_url='/verification_failed',
        reset_password_url='/reset_password',
        reset_password_email={
            'sender': 'John Doe <[email protected]>',
            'subject': 'Please reset your password',
            'body_text': 'Reset here: {{ verification_url }}',
            'body_html': '<a href="{{ verification_url }}">Click here</a> to reset'
            },
        )
], debug=True, config=config)
like image 38
Yaron Budowski Avatar answered Oct 20 '22 15:10

Yaron Budowski