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.
- 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
andndb
libraries.
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
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)
.
- Protopigeon is an almost identical, older approach with a slightly different API and better testing.