Skip to content

Automatic protorpc message types for ndb.Model subclasses (Google App Engine only)

License

Notifications You must be signed in to change notification settings

romannurik/automessage

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

automessage is a library that helps you quickly create protorpc-based web services that interact with ndb models (Google Cloud Datastore) by automatically generating Message classes for your ndb.Model subclasses, along with easy serialization/deserialization.

Caveats

  • This is pretty rough, alpha-level code. There are lots of TODOs. Use at your own risk.
  • This only works for Google App Engine standard environment + Python with the protorpc and ndb libraries.

Installation

Follow this guide to install automessage as a third-party library for your App Engine Python app; the pip command you want is:

pip install -t lib/ automessage

Usage

First, use a @automessage.attach decorator on your ndb.Model subclass:

from google.appengine.ext import ndb
import automessage

@automessage.attach()
class Book(ndb.Model):
  title = ndb.StringProperty()
  author = ndb.StringProperty()
  publish_date = ndb.DateTimeProperty(indexed=True)

This generates a class BookMessage (a subclass of protorpc.messages.Message) in the same module as the Book class, that you can then use in your protorpc-based services, like so:

class BooksService(remote.Service):
  class FindRequest(messages.Message):
    title = messages.StringField(1, required=True)

  @remote.method(FindRequest, BookMessage)
  def find(self, request):
    return (Book
        .query(Book.title == request.title)
        .to_message()) # to_message() added by automessage

  @remote.method(BookMessage, BookMessage)
  def create(self, request):
    book = Book.from_message(request) # from_message() added by automessage
    book.put()
    return book.to_message()

attach takes several parameters (see the code for details) that lets you customize the name of the generated message class, convert to camel case, add an ID field, blacklist/whitelist properties, etc. You can decorate models with multiple attach calls (with different parameters) to create multiple message types for a given model. When doing so, you'll need to provide the message type in to_message calls, e.g. book.to_message(CustomBookMessage).

Related work

  • Protopigeon is an almost identical, older approach with a slightly different API and better testing.

About

Automatic protorpc message types for ndb.Model subclasses (Google App Engine only)

Resources

License

Stars

Watchers

Forks

Packages

No packages published