Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flask Blueprint AttributeError: 'module' object has no attribute 'name' error

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?

like image 543
NewGuy Avatar asked Oct 24 '14 14:10

NewGuy


1 Answers

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) 
like image 193
Martijn Pieters Avatar answered Sep 19 '22 11:09

Martijn Pieters