我正在尝试让弹性搜索和烧瓶工作。下面是错误属性错误:'function'对象没有属性'elasticsearch'



这是我使用的教程。https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xvi-full-text-search

下面的第一个例子。

下面的一些代码包含from app import create_app。在第二个示例中略有不同。


wsgi.py
from flask_migrate import Migrate

from app import create_app, db
from app.config import Config
app = create_app(Config)

migrate = Migrate(app, db)
app.config.from_object(Config)

**app/models.py **
 
class class Posts(UserMixin, db.Model):
searchable__ = ['document']
 
class Config(object): 
#...
ELASTICSEARCH_URL = 'http://localhost:9200'
 
 
 
 
 
 
**app/__init__.py**
# ...
from elasticsearch import Elasticsearch
# ...
 
def create_app(Config):
app = Flask(__name__)
app.config.from_object(Config)
 
# ...
app.elasticsearch = Elasticsearch([app.config['ELASTICSEARCH_URL']]) 
if app.config['ELASTICSEARCH_URL'] else None
 
# ...
 
**routes.py**
 
 
from app import create_app
 
def add_to_index(index, model):
if not create_app.elasticsearch:
return None
payload = {}
for field in model.__searchable__:
flash(model.__searchable__)
flash(field)
payload[field] = getattr(model, field)
create_app.elasticsearch.index(index=index, id=model.id, document=payload)
 
 
@userinfo.route("/")
@userinfo.route("/home")
def home():
# .query.all() means I get all info from the database.   
# use a try if the Posts_db is empty then it will skip it
 
try: 
posts = Posts.query.all()
except:
posts = None
 
add_to_index('posts', posts)
 
 
return render_template('home.html', posts=posts, title='home') 
 

下面是错误AttributeError: 'function'对象没有属性'elasticsearch',完整的错误消息如下。

Traceback (most recent call last):
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:Usersnmyleanaconda3.1Libsite-packagesflask_compat.py", line 39, in reraise
raise value
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:Usersnmyleanaconda3.1Libsite-packagesflask_compat.py", line 39, in reraise
raise value
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:UsersnmyleOneDriveDesktopflaskcodeflaskblog2appuserinforoutes.py", line 75, in home
add_to_index('post', posts)
File "C:UsersnmyleOneDriveDesktopflaskcodeflaskblog2appuserinforoutes.py", line 50, in add_to_index
if not create_app.elasticsearch:
AttributeError: 'function' object has no attribute 'elasticsearch'
 

下面第二个例子

我甚至改变了

from app import create_app

from flash import current_app

并得到错误AttributeError: 'list'对象没有属性'searchable'下面是完整的错误。

Traceback (most recent call last):
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:Usersnmyleanaconda3.1Libsite-packagesflask_compat.py", line 39, in reraise
raise value
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:Usersnmyleanaconda3.1Libsite-packagesflask_compat.py", line 39, in reraise
raise value
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "C:Usersnmyleanaconda3.1Libsite-packagesflaskapp.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:UsersnmyleOneDriveDesktopflaskcodeflaskblog2appuserinforoutes.py", line 75, in home
add_to_index('post', posts)
File "C:UsersnmyleOneDriveDesktopflaskcodeflaskblog2appuserinforoutes.py", line 53, in add_to_index
for field in model.__searchable__:
AttributeError: 'list' object has no attribute '__searchable__'

谁能帮我修复这个错误?

您的问题正是错误消息和堆栈跟踪告诉您的问题。问题在这一行:

if not create_app.elasticsearch:

create_app是一个函数,根据您的定义:

def create_app(Config):

函数对象没有elasticsearch属性,因此你得到的错误。

我的猜测是,您希望在create_app函数中创建的app对象上运行此测试,因为该对象将具有elasticsearch属性,并且该属性可以是None。我没有看到您在create_app函数之外的任何地方保存对该对象的引用。假设您有create_app函数返回app,然后您通过:

将其分配给全局变量:
app = create_app(...)

那么有问题的代码行应该是:

if not app.elasticsearch:

相关内容

最新更新