这是我使用的教程。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: