GAE и Flask: DuplicatePropertyError вызывается при импорте модели внутри файла __init__ - PullRequest
0 голосов
/ 28 января 2020

Я создаю веб-приложение на основе Flask со стандартной средой GAE Python 2.7. Когда я пытаюсь импортировать Animal Model из файла application / __ init__py и других файлов, App Engine SDK вызывает DuplicatePropertyError.

DuplicatePropertyError: Class AnimalKind already has property animal_set
.
├── README.md
├── requirements.txt
├── src
│   ├── app.yaml
│   ├── application
│   │   ├── __init__.py
│   │   ├── animal_bp
│   │   │   ├── __init__.py
│   │   │   └── views.py
│   │   ├── appengine_config.py
│   │   ├── main.py
│   │   ├── models
│   │   │   ├── __init__.py
│   │   │   ├── base_models.py
│   │   │   ├── common_models.py
│   │   │   └── kind_models.py
│   │   └── settings.py
│   ├── index.yaml
│   ├── lib

app.yaml

service: default
runtime: python27
api_version: 1
threadsafe: true
instance_class: F1

builtins:
- appstats: on
- remote_api: on

libraries:
- name: ssl
  version: latest

inbound_services:
- warmup

# [START handlers]
handlers:
- url: /static
  static_dir: static

- url: .*
  script: run.application.app
  # script: main.app
  secure: always
# [END handlers]

run.py

# -*- coding: utf-8 -*-
import os
import sys

sys.path.insert(1, os.path.join(os.path.abspath('.'), 'lib'))
sys.path.insert(1, os.path.join(os.path.abspath('.'), 'application'))

import application

application / init .py

# -*- coding: utf-8 -*-
import os

from flask import Flask, g, request, session
from werkzeug.debug import DebuggedApplication
from animal_bp.views import animal_bp
from models.common_models import Animal


def create_app():
    app = Flask(__name__)
    app.config.from_object('application.settings.Local')
    app.wsgi_app = DebuggedApplication(app.wsgi_app, evalex=True)
    app.register_blueprint(animal_bp)
    return app

app = create_app()

application / models / common_models.py

from google.appengine.ext import db
from models.kind_models import AnimalKind


class Animal(db.Model):
    """
    Animal Model
    """
    animal_kind_name = db.ReferenceProperty(AnimalKind)

application / models / kind_models. py

from google.appengine.ext import db


class AnimalKind(db.Model):
    """
    Kind Model
    """
    name = db.StringProperty(required=True)

application / animal_bp / views.py

from flask import Blueprint
from models.common_models import Animal

animal_bp = Blueprint('animal_bp', __name__)


@animal_bp.route('/')
def hello():
    return 'Hello world1'

Например, если я удаляю "из файла models.common_models import Animal" в animal_bp / views.py. ошибка не возникает. Конечно, когда я удаляю «из файла models.common_models import Animal» из файла приложения / init .py, ошибка не возникает.

У меня нет дублирующего свойства, но возможно инициализация Процесс запускается дважды из-за моей структуры каталогов. Извините за такой длинный вопрос, но любая помощь будет приветствоваться !!

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

DuplicatePropertyError происходит, если у вас есть несколько значений ReferenceProperty, которые ссылаются на один и тот же класс модели . Решением для этого является явная установка аргумента collection_name в ReferenceProperty, например:

class Animal(db.Model):

    name = db.ReferenceProperty(AnimalKind, collection_name='test_reference')
0 голосов
/ 28 января 2020
from google.appengine.ext import db
from models.kind_models import AnimalKind


class Animal(db.Model):
    """
    Animal Model
    """
    animal_kind_name = db.ReferenceProperty(AnimalKind)

Ошибка, по-видимому, в том, что вы создаете ReferenceProperty без указания его явного имени.

from google.appengine.ext import db
from models.kind_models import AnimalKind


class Animal(db.Model):
    """
    Animal Model
    """
    animal_kind_name = db.ReferenceProperty(AnimalKind, name='testName')

Я думаю, что это было необязательно в некоторых старых версиях, но после (1.7.6+ ) они изменили способ инициализации экземпляров.

И поддержка FYI Python 2 в Google Cloud уже прекратилась 1 января 2020 года, и всем разработчикам рекомендуется перейти на Python 3, как только они может.

Python2 Закат

...