2016-08-08 6 views
0

J'essaie de définir un backend en utilisant py2neo sur google app engine. Cela fonctionne très bien quand on le pousse sur le moteur de l'application de développement, mais malheureusement, cela ne fonctionne pas quand je l'utilise sur localhost.Utilisation de py2neo v3 avec google app engine

D'abord, j'ai setted la variable d'environnement HOME en python (grâce à cette astuce, mon code fonctionne sur mon dev) mais il ne résout pas le problème localhost

Puis, je l'ai suivi ce conseil "ImportError: No module named _ssl" with dev_appserver.py from Google App Engine il empêche une exception mais une autre augmente après.

Voici mon retraçage

ft1.1: Traceback (most recent call last): 
    File "/Users/Arnaud/Documents/project/app/test/neo4j/test_graph_handler.py", line 13, in test_get_direct_neighbours 
    selection = self.graph_handler.get_direct_neighbours("8") 
    File "/Users/Arnaud/Documents/project/app/neo4j/graph_handler.py", line 20, in get_direct_neighbours 
    labels(l) AS `relationship`" % self.protect(ean)) 
    File "/Users/Arnaud/Documents/project/app/libs/py2neo/database/__init__.py", line 694, in run 
    return self.begin(autocommit=True).run(statement, parameters, **kwparameters) 
    File "/Users/Arnaud/Documents/project/app/libs/py2neo/database/__init__.py", line 370, in begin 
    return self.transaction_class(self, autocommit) 
    File "/Users/Arnaud/Documents/project/app/libs/py2neo/database/__init__.py", line 1212, in __init__ 
    self.session = driver.session() 
    File "/Users/Arnaud/Documents/project/app/libs/py2neo/packages/neo4j/v1/session.py", line 126, in session 
    connection = connect(self.address, self.ssl_context, **self.config) 
    File "/Users/Arnaud/Documents/project/app/libs/py2neo/packages/neo4j/v1/bolt.py", line 444, in connect 
    if not store.match_or_trust(host, der_encoded_server_certificate): 
    File "/Users/Arnaud/Documents/project/app/libs/py2neo/packages/neo4j/v1/bolt.py", line 397, in match_or_trust 
    f_out = os_open(self.path, O_CREAT | O_APPEND | O_WRONLY, 0o600) # TODO: Windows 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/devappserver2/python/stubs.py", line 73, in fake_open 
    raise OSError(errno.EROFS, 'Read-only file system', filename) 
OSError: [Errno 30] Read-only file system: '/Users/Arnaud/.neo4j/known_hosts' 

Comme tout lauches dans un environnement sandbox et avec un faux utilisateur, l'exception est normal, mais il ne se produit pas sur le dev.

Et voici /Users/Arnaud/Documents/project/app/neo4j/graph_handler.py:20

13  def get_direct_neighbours(self, ean): 
14   selection = self.graph.run("\ 
15     MATCH\ 
16     (:Product {ean: '%s'})-->(l)<--(n:Product)\ 
17     RETURN\ 
18     n.ean AS `ean`,\ 
19     n.name AS `name`,\ 
20     labels(l) AS `relationship`" % self.protect(ean)) 
21   return selection 

Donc, pour comprendre pourquoi il travaillerait sur le dev, j'ai essayé de localiser où bac à sable et L'exécution de dev commence à être différente. et il est ici dans /Users/Arnaud/Documents/project/app/libs/py2neo/packages/neo4j/v1/bolt.py:427

427  if ssl_context and SSL_AVAILABLE: 
428   host, port = host_port 
429   if __debug__: log_info("~~ [SECURE] %s", host) 
430   try: 
431    s = ssl_context.wrap_socket(s, server_hostname=host if HAS_SNI else None) 
432   except SSLError as cause: 
433    error = ProtocolError("Cannot establish secure connection; %s" % cause.args[1]) 
434    error.__cause__ = cause 
435    raise error 
436   else: 
437    # Check that the server provides a certificate 
438    der_encoded_server_certificate = s.getpeercert(binary_form=True) 
439    if der_encoded_server_certificate is None: 
440     raise ProtocolError("When using a secure socket, the server should always provide a certificate") 
441    trust = config.get("trust", TRUST_DEFAULT) 
442    if trust == TRUST_ON_FIRST_USE: 
443     store = PersonalCertificateStore() 
444     if not store.match_or_trust(host, der_encoded_server_certificate): 
445      raise ProtocolError("Server certificate does not match known certificate for %r; check " 
446           "details in file %r" % (host, KNOWN_HOSTS)) 
447  else: 
448   der_encoded_server_certificate = None 

Parce que dans le dev, le chargement ssl échoue dans ssl_compat .py Alors que sur localhost, il réussit et donc le code va à l'intérieur de l'instruction if et échoue à la ligne 444

Pour comprendre que j'ai forcé SSL_AVAILABLE à être une falsification, même avec cela j'ai des problèmes sur les sockets de moteur d'application qui sont non reconnu comme douilles

ft1.1: Traceback (most recent call last): 
    File "/Users/Arnaud/Documents/project/app/test/neo4j/test_graph_handler.py", line 13, in test_get_direct_neighbours 
    selection = self.graph_handler.get_direct_neighbours("8") 
    File "/Users/Arnaud/Documents/project/app/neo4j/graph_handler.py", line 20, in get_direct_neighbours 
    labels(l) AS `relationship`" % self.protect(ean)) 
    File "/Users/Arnaud/Documents/project/app/libs/py2neo/database/__init__.py", line 694, in run 
    return self.begin(autocommit=True).run(statement, parameters, **kwparameters) 
    File "/Users/Arnaud/Documents/project/app/libs/py2neo/database/__init__.py", line 370, in begin 
    return self.transaction_class(self, autocommit) 
    File "/Users/Arnaud/Documents/project/app/libs/py2neo/database/__init__.py", line 1212, in __init__ 
    self.session = driver.session() 
    File "/Users/Arnaud/Documents/project/app/libs/py2neo/packages/neo4j/v1/session.py", line 126, in session 
    connection = connect(self.address, self.ssl_context, **self.config) 
    File "/Users/Arnaud/Documents/project/app/libs/py2neo/packages/neo4j/v1/bolt.py", line 460, in connect 
    ready_to_read, _, _ = select((s,),(),(), 0) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/remote_socket/_remote_socket.py", line 483, in select 
    _SetState(request, _GetSocket(value), POLLIN) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/remote_socket/_remote_socket.py", line 425, in _GetSocket 
    raise ValueError('select only supported on socket objects.') 
ValueError: select only supported on socket objects. 

Si quelqu'un a fait face aux mêmes problèmes, cela m'intéresserait parce que je devrais pousser le dev avant tout test assez douloureux.

EDIT: Pour ceux qui veulent savoir, comme je l'ai pas de réponse de nigel encore et je avais besoin d'une solution rapide, je l'ai créé ma propre classe pour envoyer et recevoir des demandes cypher, il est compatible avec l'application moteur et je l'ai mis sur un sens: https://gist.github.com/ArnaudParan/e26f291ba8b3c08e5b762d549667c7d6 C'est expérimental et pourrait ne pas fonctionner si vous demandez des nœuds complets mais si cela peut aider, je le publie

Répondre

0

Le 1er retraçage pourrait indiquer que le paquet py2neo peut être incompatible avec GAE's sandbox restrictions. En particulier, il montre une tentative d'ouvrir le fichier /Users/Arnaud/.neo4j/known_hosts en mode écriture (os_open(self.path, O_CREAT | O_APPEND | O_WRONLY, 0o600)) ce qui n'est pas autorisé. Vérifiez s'il est possible de configurer py2neo pour ne pas le faire.

Le bac à sable a également des restrictions sur les prises, voir Limitations and restrictions.

+0

Merci d'avoir répondu, je l'ai cherché dans le code et les docs mais je n'ai pas réussi à le trouver, je recherche encore et j'essaie de demander au créateur de la bibliothèque et puis je reviens à vous. –