For those who works with closed source tools you won’t understand the freedom that we have on opensource tools because in real life our requirements changed over time, the tool that we are using they also start to grow and start to cover things they did not had in mind when they started the project. As a developer, we want our tools to do different things and as a person to person and project to project, we may have different sense of beauty and different meaning of code organization phylosophy. In computer science in general we always try to map our problem with a known solution that we have already solved before. So when you have access to source code of your tool, you can easily dig up that source code extend or alter the functionality and map your solution that matches your situation.
For example while working on python flask framework after couple years I realized how big they have grown over time, they do pretty much everything django is capable to do and it is even better because of their sense of modularity and flexibility. So for this project I am working on I started using flask, flask-admin for administrative panel and I am using flasks blueprint to separate different components of my project. Flask admin is actually not very comfortable or easy to attach with blueprints, that actually makes sense because because it adds admin panel and admin panel should be attached with the main app rather than a sub app like blueprint. But I actually had different use case and with admin panel I had to add my custom views which I don’t want to put at my
app.py rather I want it to be in my controller. Other class architecture I had in mind will cause a circular dependency which I always get me in panic. I may not be very much neat and clean, pretty, tidy, person in personal life, I know I have limitations but I try to keep my code pretty and tidy and a thing of beauty that made me dig up the source code of those libraries at my office hours to rewrite this. Enough talk, if Linus Torvalds visits my blog ever he is going to get real mad at me for talking too much. So here you go, my code that I am using that satisfies my need:
# admin_blueprint.py from flask import Blueprint from flask_admin.contrib.sqla import ModelView from flask_admin import Admin class AdminBlueprint(Blueprint): views=None def __init__(self,*args, **kargs): self.views =  return super(AdminBlueprint, self).__init__('admin2', __name__,url_prefix='/admin2',static_folder='static', static_url_path='/static/admin') def add_view(self, view): self.views.append(view) def register(self,app, options, first_registration=False): print app admin = Admin(app, name='microblog', template_mode='adminlte') for v in self.views: admin.add_view(v) return super(AdminBlueprint, self).register(app, options, first_registration)
#app/admin/controller.py from admin_blueprint import AdminBlueprint from common.models import MyModel, db app = AdminBlueprint('admin2', __name__,url_prefix='/admin2',static_folder='static', static_url_path='/static/admin') app.add_view(ModelView(MyModel, db.session))
#app/__init__.py from flask_sqlalchemy import SQLAlchemy # Define the WSGI application object app = Flask(__name__,template_folder="../templates",static_folder="../templates") from app.api.controllers import app as api from app.frontend.controllers import app as frontend from app.admin.controllers import app as admin # Register blueprint(s) app.register_blueprint(api) app.register_blueprint(frontend) app.register_blueprint(admin) # replacing the following code that I had #from flask_admin import Admin #from flask_admin.contrib.sqla import ModelView #from common.models import * #admin = Admin(app, name='microblog', template_mode='adminlte') #admin.add_view(ModelView(MyModel, db.session))