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.
3 réponses
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
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.
Allbuttonspressed a récemment publié ce guide pratique ;
vous pouvez exécuter dev_appserver
sur Python27 avec threadsafe
défini sur yes.
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.