Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
My API is being built to allow developers to extend it's functionality. My plan is to do this by providing an "extensions" directory where they can drop in Blueprints and they will be dynamically loaded. This is the code I am utilizing to import (modifed from this
tutorial
)
from flask import Flask
import pkgutil
import sys
app = Flask(__name__)
EXTENSIONS_DIR = "extensions"
modules = pkgutil.iter_modules(path=[EXTENSIONS_DIR])
for loader, mod_name, ispkg in modules:
if mod_name not in sys.modules:
# It imports fine
loaded_mod = __import__(EXTENSIONS_DIR+"."+mod_name+"."+mod_name, fromlist=[mod_name])
# It does not register
app.register_blueprint(loaded_mod)
This is the directory layout of my project. The extensions
directory is where developers drop in their expanded functionality.
/root
/extensions
/extension1
__init__.py
extension1.py
/extension2
__init__.py
extension2.py
simple_example.py
The problem is that I get this error and am not sure what it is telling me.
>python simple_example.py
Traceback (most recent call last):
File "simple_example.py", line 14, in <module>
app.register_blueprint(loaded_mod)
File "C:\Python27\lib\site-packages\flask\app.py", line 62, in wrapper_func
return f(self, *args, **kwargs)
File "C:\Python27\lib\site-packages\flask\app.py", line 880, in register_blueprint
if blueprint.name in self.blueprints:
AttributeError: 'module' object has no attribute 'name'
A simple extension looks like this
from flask import Blueprint
extension1 = Blueprint('extension1', __name__)
@extension1.route("/my_route")
def treasure_list():
return "list of objects"
How do I solve the AttributeError
in a way that allows my app.register_blueprint
call to succeed?
You are trying to register the module and not the contained Blueprint
object.
You'll need to introspect the module to find Blueprint
instances instead:
if mod_name not in sys.modules:
loaded_mod = __import__(EXTENSIONS_DIR+"."+mod_name+"."+mod_name, fromlist=[mod_name])
for obj in vars(loaded_mod).values():
if isinstance(obj, Blueprint):
app.register_blueprint(obj)
–
–
–
–
–
I have also experienced the same effect in a project. The origin of the problem was an incorrect import of the blueprint file.
Make sure the import statement imports the real blueprint and not the module on which it is defined.
In other words, you may be doing
from .blueprint import blueprint
while you meant
from .blueprint.blueprint import blueprint
As a side recommendation, name the module on which the blueprint is defined with a different name than the blueprint itself, in order to clarify the import. An example:
from .blueprint.views import blueprint
I got an error saying AttributeError: 'Blueprint' object has no attribute 'register_blueprint'
For this I simply uninstalled Flask using pip uninstall flask
and then installed flask[async] pip install flask[async]
Changing the flask version will help. I was using Flask==1.1.2 and changing to Flask==2.0.2 resolves the error.
pip install Flask==2.0.2
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.