Registering url routes for your Flask app or blueprint in lazy way :)
Based on original snippet from Flask documentation!
# pip install Flask-LazyViews
Flask-LazyViews
is licensed under the BSD License.
project/app.py
from flask import Flask
from flask.ext.lazyviews import LazyViews
app = Flask(__name__)
views = LazyViews(app)
views.add('/', 'views.home')
views.add('/page/<int:page>', 'views.page')
project/views.py
from flask import render_template
def home():
return render_template('home.html')
def page(page_id):
page = get_page(page_id)
return render_template('page.html', page=page)
project/app.py
...
from project.test import blueprint as test_blueprint
...
app.register_blueprint(test_blueprint, url_prefix='/test')
project/test/__init__.py
from flask import Blueprint
from flask.ext.lazyviews import LazyViews
blueprint = Blueprint('test', __name__)
views = LazyViews(blueprint, '.views')
views.add('/', 'test')
views.add('/advanced', 'advanced_test', methods=('GET', 'POST'))
project/test/views.py
from flask import render_template, request
def advanced_test():
context = generate_context(request.form)
return render_template('test/advanced.html', **context)
def test():
return render_template('test/test.html')
The main point of Flask-LazyViews
is simplifying process of adding views to the app and blueprint using lazy technique from Flask documentation.
Also the next goal is simplifying viewname
definition. For most cases our views functions placed in .views
module of app or blueprint, so we don't need to input full path to that module.
This especially useful for blueprints. Let see the example above, if we using original snippet - we'll need to provide path to blueprint's views module:
add_url(blueprint, '/', 'test.views.test')
but with Flask-LazyViews
we could to ignore test
.
From other side if your view functions placed in some other location or you need to provide full path to its - you still could do this.
Also you could setup import_prefix
like done in Django's patterns
:
views = LazyViews(app, 'views')
views.add('/', 'home')
views.add('/page/<int:id>', 'page', methods=('GET', 'POST'))
Be careful with import_prefix
value if you used __name__
as Flask application name or blueprint import_name
. Setting relative path could cause server errors.
Add admin view if Flask-Admin extension is added to Flask application.
Note
This method only works for Flask applications, not blueprints.
admin = Admin(app)
views = LazyViews(app, 'views')
views.add_admin('PageAdmin', name='Page Admin')
Add error handler to Flask application or blueprint, e.g.:
views = LazyViews(app, 'views')
views.add_error(404, 'error')
views.add_error(500, server_error_view)
Add custom URLs for serving static files. It useful when you want handle some static files outside static_url
, e.g.:
views = LazyViews(app)
views.add_static('/favicon.ico', defaults={'filename': 'img/favicon.ico'})
If you found some bug in Flask-LazyViews
library, please, add new issue to the project's GitHub issues.
- Fixes #3. Make
LazyView
proxy class lazy again. Fix circullar imports and working outside application context
- Python 3 support (only for Flask 0.10+)
- Flask 0.10+ support
- Fixes #2. Access view function documentation and repr while loading views via strings
- Add support of adding admin views to Flask applications via
add_admin
method. - Configure Travis CI support.
- Implement
add_error
shortcut method for adding custom error handling for Flask application or blueprint.
- Implement
init_app
andinit_blueprint
methods for configuringLazyViews
instance outside main application module or for multiple applications. - Add
add_static
shortcut method for adding custom URL rules for serving static files. - Add ability to register real view functions with
LazyViews
instance.
- Initial release.