Колба и неомодель: ModelDefinitionMismatch - PullRequest
0 голосов
/ 18 октября 2018

Я получаю neomodel.exceptions.ModelDefinitionMismatch при попытке создать простое приложение Flask, подключенное к жирному порту Neo4J.

import json
from flask import Flask, jsonify, request
from neomodel import StringProperty, StructuredNode, config


class Item(StructuredNode):
    __primarykey__ = "name"
    name = StringProperty(unique_index=True)


def create_app():
    app = Flask(__name__)

    config.DATABASE_URL = 'bolt://neo4j:test@db:7687'

    @app.route('/', methods=['GET'])
    def get_all_items():
        return jsonify({'items': [item.name for item in Item.nodes]})

    @app.route('/', methods=['POST'])
    def create_item():
        item = Item()
        item.name = json.loads(request.data)['name']
        item.save()
        return jsonify({'item': item.__dict__})

    return app

Выполнение работ после запроса;Я могу проверить в базе данных, что элементы фактически добавлены!Но запрос get возвращает:

neomodel.exceptions.ModelDefinitionMismatch: Узел с метками Item не разрешается ни к одному из известных объектов

Я использую Python 3.7.0, Flask 1.0.2 и neomodel 3.0.3

обновление

Для решения полной проблемы: я запускаю приложение в Docker-контейнере с docker-compose в DEBUGmode.

Файл Dockerfile:

FROM continuumio/miniconda3
COPY . /app
RUN pip install Flask gunicorn neomodel==3.3.0
EXPOSE 8000
CMD gunicorn --bind=0.0.0.0:8000 - "app.app:create_app()"

Файл docker-compose:

# for local development
version: '3'
services:
  db:
    image: neo4j:latest
    environment:
      NEO4J_AUTH: neo4j/test
    networks:
      - neo4j_db
    ports:
      - '7474:7474'
      - '7687:7687'

  flask_svc:
    build: .
    depends_on:
      - 'db'
    entrypoint:
      - flask
      - run
      - --host=0.0.0.0
    environment:
      FLASK_DEBUG: 1
      FLASK_APP: app.app.py
    ports:
      - '5000:5000'
    volumes:
      - '.:/app'
    networks:
      - neo4j_db

networks:
  neo4j_db:
    driver: bridge

И я запускаю его с:

docker-compose up --build -d

1 Ответ

0 голосов
/ 24 октября 2018

Попробуйте использовать neomodel == 3.2.9

У меня была похожая проблема и откат версии, чтобы заставить ее работать.

Вот коммит, который сломал вещи

Похоже, они представили _NODE_CLASS_REGISTRY в neomodel.Database, объект, который должен быть одиночным.Но с Flask это не обязательно одиночка, потому что он создает новые экземпляры базы данных с пустым _NODE_CLASS_REGISTRY.

Я не уверен, как заставить это работать с 3.3.0

...