There's a lot of detail at the low level that you miss by using any layers of abstraction (on both Python and Java platforms). That detail is important for getting maximum performance out of your application and correctly dealing with AppEngine's unique transaction model.
The choice of web frameworks is tougher. Startup time is important right now for AppEngine (although slightly less important with some of the new features rolling down). You'll want to use the lightest-weight framework you can find.
On Python, I've had great luck with webapp + Django templates + raw Datastore APIs.
On Java, Guice + Guice servlets + raw Datastore API is really lightweight and fast. We've also developed our own Django-like templating system for Java that we hope to open-source at some point.
Anyone else with more GAE/Python experience want to chime in?
I like it barenaked and closer to the metal.
For a dir structure, I have admin, css, js, prog and view. Not hard to know what goes in every folder. Right now I have like fifty progs and fifty views, each for every specific task.
For every program there is usually one line to get the data from models and one line to render it using a template. Nothing else.
I really don't get what a framework would do to help me, I already have everything I need at my fingertips.
import app
class main(app.request):
app.session.start()
data=app.models.getContacts()
app.render('index',data)
app.run('/',main)
And here the html in the template: <html>
<body>
<h1>Contacts List</h1>
{% for item in data %}
<li>{{item.name}} - {{item.phone}}</li>
{% endfor %}
</body>
</html>
Some purists will burn me at the stake, but it works wonders for me.Any chance you could list viable alternatives, please? (I'm considering GAE/Java). Thanks for this interesting thread.
Using a minimalist framework is a pretty good match for app engine since other frameworks might assume something about the environment that won't be true of GAE.
And you can always mix in other ala cart libraries. For instance, we use wtforms. That combined with a tornado UI module to render the forms nicely has been a effective.
If I were to choose again, I might just use the built in web.py since they often include utility handlers for things like parsing multipart uploads; we've had to reimplement those for our tornado BaseHandler. Then I might use mustache for templating since we have started using that on the client side.
Kind of random thoughts I guess, hopefully somewhat illuminating nonetheless :)
Annoying Example: I realized that I needed to delete a lot of records from the table. I created a URL that I could ping periodically to delete a bunch, then get killed because it was taking too long, repeat.
http://googleappengine.blogspot.com/2010/07/introducing-mapp...
There are and have been some rough edges but overall it is a great platform and it was well worth it for us to invest time to evaluate and embrace the constraints.
Video is in development, but the system is pretty straightforward. We're integrated with Zencoder. Our clients (e.g. mobile/web) request an upload endpoint from our server (GAE). The endpoint is a pre-signed S3 upload url computed by the server. The client uploads to that url and then triggers a "process" API on our server which issues a request to Zencoder on the backend to pick up the videos from S3 and begin transcoding them. Zencoder sends back a response that allows us to associate the "video" entity in our datastore with job ids/output locations. You can set up a callback so that Zencoder will notify GAE when transcoding is complete. The output is available in S3, including thumbnails.
So I guess this is also an endorsement of Zencoder: it rocks and was very easy to integrate with!
One thing I'm curious about the is continuous deployment. AppEngine has a 1000 deployment limit (http://code.google.com/appengine/docs/quotas.html#Deployment...)
Is that a worry for you?
I don't think that's likely to be a problem then!
How do you do full text search?
The other two GAE topics posted this week had quite a few reports about datastore time outs. Has this been a problem for you?
I've read tips in various comments on various websites, such as use filters instead of GQL, using task queues and handling storage exceptions, but very little in one place :)
http://www.youtube.com/watch?v=o3TuRs9ANhs
http://www.youtube.com/watch?v=AgaL6NGpkB8
Here's some random tips I can give:
It's worth spending some time and writing the ORM stuff by hand for your first application. The low-level datastore APIs are well-written and you'll learn a lot about how stuff works by being close to the metal.
AppEngine rarely throws storage or memcache exceptions outside of maintenance periods anymore. Unless there's someone here who's had a different experience, I would consider them rare.
Use as few abstractions as possible, no matter which language you are choosing.
If you don't need something that interacts with an external system done right away, stick it in a task queue, no matter how quick you think it will run. Assume that it'll succeed in your code (it probably will, eventually).