1

I am trying to use a global configuration when defining an ElasticSearch DSL model, which is more or less a regular Python class aka service class.

"""Define models"""
from elasticsearch_dsl import Document, Text
from flask import current_app


class Greeting(Document):
    """Define Greeting model"""
    message = Text()

    class Index:
        name = current_app.config['GREETINGS_INDEX']

    def save(self, ** kwargs):
        return super().save(** kwargs)

Unfortunately, if my import statement is at the top of the view file, I get this error message:

RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that needed
to interface with the current application object in some way. To solve
this, set up an application context with app.app_context().  See the
documentation for more information.

The only way to get things to work is if I import the model/service class inside the request like this:

from elasticsearch_dsl import Search
from flask import Blueprint, current_app
# from .models import Greeting ### this will throw the application context error

greetings = Blueprint(
    'greetings',
    __name__,
    url_prefix='/greetings/'
)

...

@greetings.route("/elasticsearch/new/")
def new_greeting_using_elasticsearch():
    from .models import Greeting ### this avoids the application context error
    Greeting.init()
    greeting = Greeting(message="hello, elastic")
    greeting.save()
    return(
        "a greeting was saved; "
        "it is viewable from https://localhost:5000/greetings/elasticsearch/"
    )


This seems like a code smell. Is there another way to accomplish using reusing configurations that can keep the import statement at the top of the file?

These questions/answers seem to suggest that this is the only way:

Am I missing something? Should I rearchitect my application to avoid this? Or is this just a Flask-way/thing?

Thank you for your help

Other questions/answers/articles that did not help me:

Zhao Li
  • 4,936
  • 8
  • 33
  • 51

0 Answers0