SQLAlchemy-Nav provides SQLAlchemy Mixins for creating navigation bars compatible with Bootstrap
Project description
SQLAlchemy-Nav
SQLAlchemy-Nav provides SQLAlchemy Mixins for creating navigation bars compatible with Bootstrap. Its Mixins are:
NavbarMixin
for creating navigation barsBrandMixin
for adding a brand to the navbarNavitemMixin
for adding nav-items to the navbarDropdownitemMixin
for adding dropdown-items to nav-items
License
Publications which use this software should include the following citation for SQLAlchemy-Nav and its dependency, SQLAlchemy-Mutable:
Bowen, D.S. (2019). SQLAlchemy-Nav [Computer software]. https://github.com/dsbowen/sqlalchemy-nav
Bowen, D.S. (2019). SQLAlchemy-Mutable [Computer software]. https://github.com/dsbowen/sqlalchemy-mutable
This project is licensed under the MIT License LICENSE.
Getting started
Installation
Install and update using pip:
$ pip install -U sqlalchemy-nav
Setup
The following code will get you started with SQLAlchemy-Nav as quickly as possible:
# 1. Import classes from sqlalchemy_nav
from sqlalchemy_nav import BrandMixin, DropdownitemMixin, NavbarMixin, NavitemMixin
# 2. Standard session creation
from sqlalchemy import create_engine, Column, Integer
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///:memory:')
session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)
session = Session()
Base = declarative_base()
# 3. Use the SQLAlchemy-Nav Mixins to create database models
class Navbar(NavbarMixin, Base):
__tablename__ = 'navbar'
class Brand(BrandMixin, Base):
__tablename__ = 'brand'
class Navitem(NavitemMixin, Base):
__tablename__ = 'navitem'
class Dropdownitem(DropdownitemMixin, Base):
__tablename__ = 'dropdownitem'
# 4. Create the database
Base.metadata.create_all(engine)
Examples
Example 1. Use with SQLAlchemy
This example generates html for a Bootstrap Navbar using the SQLAlchemy setup above. You can find the full setup and example here
bar = Navbar()
Brand(bar=bar, url='/my-brand', label='My Brand')
Navitem(bar=bar, url='/my-navitem', label='My Navitem')
item = Navitem(bar=bar, label='Dropdown')
Dropdownitem(item=item, url='/dropdown1', label='Dropdownitem 1')
Dropdownitem(item=item, url='/dropdown2', label='Dropdownitem 2')
bar.view_html()
Outputs:
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<a class="navbar-brand" href="/my-brand">
My Brand
</a>
<button aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation" class="navbar-toggler" data-target="#navbarSupportedContent" data-toggle="collapse" type="button">
<span class="navbar-toggler-icon">
</span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="/my-navitem">
My Navitem
</a>
</li>
<li class="nav-item">
<a aria-expanded="false" aria-haspopup="true" class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" id="navbarDropdownNone" role="button">
Dropdown
</a>
<div aria-labelledby="navbarDropdownNone" class="dropdown-menu">
<a class="dropdown-item" href="/dropdown1">
Dropdownitem 1
</a>
<a class="dropdown-item" href="/dropdown2">
Dropdownitem 2
</a>
</div>
</li>
</ul>
</div>
</nav>
Example 2: Toy web app with Flask-SQLAlchemy
This example shows how to use SQLAlchemy-Nav to create dynamic navigation bars in web apps. You can find the full setup and example here.
Our web app uses Flask, Flask-Bootstrap, and Flask-SQLAlchemy.
Python file
We begin by creating the Navbar
instance before the first app request. I name the navigation bar so that we can find it later using query.filter_by(name='name')
. We then use the navbar to keep a tally of how many times each link on the dropdown menu was visited.
# 1. Import Mixins from sqlalchemy_nav
from sqlalchemy_nav import BrandMixin, DropdownitemMixin, NavbarMixin, NavitemMixin
# 2. Import Flask classes, methods, and extensions and initialize app
from flask import Flask, render_template, url_for
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
bootstrap = Bootstrap(app)
db = SQLAlchemy(app)
# 3. Use the SQLAlchemy-Nav Mixins to create database models
class Navbar(NavbarMixin, db.Model):
pass
class Brand(BrandMixin, db.Model):
pass
class Navitem(NavitemMixin, db.Model):
pass
class Dropdownitem(DropdownitemMixin, db.Model):
pass
# 4. Create a Navbar instance before the first app request
@app.before_first_request
def before_first_request():
db.create_all()
bar = Navbar(name='my navbar')
Brand(bar=bar, label='SQLAlchemy-Nav')
Navitem(bar=bar, url=url_for('index'), label='Index ')
item = Navitem(bar=bar, label='Dropdown')
Dropdownitem(item=item, url=url_for('page1'), label='Page 1 ')
Dropdownitem(item=item, url=url_for('page2'), label='Page 2 ')
db.session.add(bar)
db.session.commit()
@app.route('/')
def index():
# 5. Recover the Navbar instance by name
bar = Navbar.query.filter_by(name='my navbar').first()
# 6. Tally visits to the index route
bar.navitems[0].label += 'x'
db.session.commit()
# 7. Pass the Navbar instance to the html template
return render_template('index.html', bar=bar, content='Index page')
@app.route('/page1')
def page1():
bar = Navbar.query.filter_by(name='my navbar').first()
bar.navitems[1].dropdownitems[0].label += 'x'
db.session.commit()
return render_template('index.html', bar=bar, content='Page 1')
@app.route('/page2')
def page2():
bar = Navbar.query.filter_by(name='my navbar').first()
bar.navitems[1].dropdownitems[1].label += 'x'
db.session.commit()
return render_template('index.html', bar=bar, content='Page 2')
if __name__ == '__main__':
app.run()
Html template
Next, we create an index.html
file in our templates folder. The index template must:
- Extend the bootstrap base template.
- Execute
{{ bar.render() }}
in thenavbar
block.
Recall that bar
is the Navbar
instance we passed to the index template in step 7.
{% extends "bootstrap/base.html" %}
{% block navbar %}
{{ bar.render() }}
{% endblock %}
{% block content %}
<h3>{{ content }}</h3>
{% endblock %}
View the example
To see this example at work, set your FLASK_APP
environment variable to your Python file and run it.
Alternatively, you can clone the SQLAlchemy-Nav repo and run flask_example.py
.
$ git clone https://github.com/dsbowen/sqlalchemy-nav.git
$ cd sqlalchemy-nav
$ python flask_example.py
Then open http://localhost:5000
in your browser.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for sqlalchemy_nav-0.0.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2c4ab9fde9241da5f4e67b3dc3e4c50958d4536a78a6f628b3499d5b571f82f0 |
|
MD5 | bf95351b8ab629ca3f08496e198ce0a1 |
|
BLAKE2b-256 | 79bdc56c225826c6340bb01f5b70e0ce8e1b85250c88ff8043b7cee4875dabc6 |