GAE 1.5.5 semble avoir une excellente , longtemps attendu pour les fonctionnalités. Cependant, ils ne travaillent pas encore pour moi.

J'ai téléchargé et installé GAE 1.5.5 et j'utilise une application dégénérée "AAA" pour tester.

Voici à peu près mon app.yaml (avec diverses modifications apportées pour les tests).

App.yaml

application: AAA # mystical creation.
version: alpha-1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /media
 static_dir: media/

- url: /favicon.ico
 static_files: media/images/favicon.ico
 upload: media/images/favicon.ico

- url: /admin
 script: AAA.app
 login: admin

- url: /.*
 script: AAA.app

skip_files:
- ^(.*/)?app\.yaml

libraries:
- name: django
 version: "1.2"
- name: jinja2
 version: latest
- name: yaml
 version: latest

J'exécute cela sur Mac OS X Lion (10.7.1).

Je fais l'hypothèse que je n'utilise pas réellement le runtime Python 2.7, malgré la déclaration dans app.yaml pour l'utiliser. Je ne sais pas trop comment valider cette théorie, mais les erreurs que j'ai rencontrées sont cohérentes avec elle. Ces erreurs sont reproduites ci-dessous.

Chemin Python

Lorsque le chemin Python de Google App Engine n'est pas défini, le moteur d'application s'exécute à l'aide de Python 2.6.6.

Pour résoudre ce problème, j'ai défini le chemin Python sur /usr/bin/python2.7 dans l'application Google Préférences moteur.

WSGI

J'obtiens l'erreur suivante:

 /Applications/GoogleAppEngineLauncher.app/Contents/Resources/
GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/
google/appengine/tools/dev_appserver.py in
GetParentPackage(self=<google.appengine.tools.dev_appserver.HardenedModulesHook
object>, fullname='AAA.app')
  2334
  2335       if self.find_module(fullname) is None:
=> 2336         raise ImportError('Could not find module %s' %
fullname)
  2337
  2338       return self._module_dict[parent_module_fullname]
builtin ImportError = <type 'exceptions.ImportError'>, fullname =
'AAA.app'
<type 'exceptions.ImportError'>: Could not find module AAA.app
     args = ('Could not find module AAA.app',)
     message = 'Could not find module AAA.app'

Où j'ai essayé AAA.app en tant que:

AAA.py:

 from google.appengine.dist import use_library
 use_library('django', '1.2') # otherwise we still get django 0.96

 from django.core.handlers import wsgi
 app = wsgi.WSGIHandler()

AAA / __init__.py

# same content as above

AAA / AAA.py

# same content as above

Notez que je peux continuer à exécuter CGI avec app.yaml et AAA.py modifiés, mutatis mutandis . Cependant, cela entraîne néanmoins les erreurs ci-dessous:

Jinja2

Lorsque je lance import jinja2, j'obtiens un ImportError.

Django2

Sans pour autant:

from google.appengine.dist import use_library
use_library('django', '1.2')

Je me retrouve avec Django 0.96.

Théorie

Compte tenu des éléments suivants:

  • http://code.google.com/appengine/docs/python/tools /libraries27.html déclare "La fonction use_library () fournie par le Le package google.appengine.dist n'est pas disponible dans Python 2.7. "
  • use_library fonctionne pour moi
  • use_library est requis car la déclaration "bibliothèques: {django: {..., version:" 1.2 "}} ne définit pas la version de django sur 1.2
  • Seul Django 1.2 est inclus dans le runtime Python 2.7 (par le lien bibliothèques27.html ci-dessus)
  • Je dois spécifier manuellement Python 2.7 dans le chemin Python pour que GAE utilise Python 2.7
  • WSGI ne charge pas correctement l'application
  • Jinja2 ne peut pas être importé

Je crois que je n'utilise pas vraiment le runtime Python 2.7 GAE (c'est-à-dire que la déclaration app.yaml est ignorée dans le SDK GAE 1.5.5).

J'espère que ce qui précède est une description utile, et je serais reconnaissant de toutes les réflexions sur ce qui pourrait se passer ici - et les solutions potentielles.

6
Brian M. Hunt 12 oct. 2011 à 16:49

3 réponses

Meilleure réponse

J'ai le même problème, mais sous Windows, j'ai publié sur le Forum Google App Engine et voici une réponse officielle que j'ai reçue:

Le serveur de développement ne prend pas encore en charge la version 2.7. Actuellement, la seule façon de tester le code basé sur 2.7 est sur Appengine

6
Shay Erlichmen 12 oct. 2011 à 15:46

Vous pouvez utiliser le runtime 2.7 avec le SDK local, mais pas en mode threadsafe ou avec votre application définie comme script: your.app. Utilisez plutôt script: your_main_script.py.

Pour jinja2 et webapp2 qui ne sont pas disponibles dans le SDK, vous pouvez les télécharger et les placer dans le répertoire de base du SDK, qui est par défaut ajouté à sys.path.

Vous ne pourrez pas tester les capacités de multithreading, mais vous pouvez faire tout le reste et simplement apporter les modifications à app.yaml et your_main_script.py avant de déployer.

EDIT: J'ai également dû faire os.environ[u'APPENGINE_RUNTIME'] = u'python27' dans mon your_main_script.py, pour forcer le SDK à utiliser webapp2.

4
Steven Kampen 13 oct. 2011 à 05:32

Allbuttonspressed a récemment publié ce guide pratique ;
vous pouvez exécuter dev_appserver sur Python27 avec threadsafe défini sur yes.

1
systempuntoout 19 oct. 2011 à 06:44