Flask Black Dashboard
Open-source seed project with Black Dashboard design
Open-source Flask Dashboard generated by the AppSeed platform on top of Black Dashboard, a modern dark-themed design from Creative-Tim. Flask codebase is provided with database, ORM, modular codebase, and deployment scripts.

Flask Black Dashboard - Open-source Starter
Flask is a lightweight WSGI web application framework. It is designed to make getting started quick and easy, with the ability to scale up to complex applications. Classified as a microframework, Flask is written in Python and it does not require particular tools or libraries. It has no database abstraction layer, form validation, or any other components where pre-existing third-party libraries provide common functions.
To use the stater, Python3 should be installed properly in the workstation. If you are not sure if Python is properly installed, please open a terminal and type
python --version
. The full list with dependencies and tools required to build the app:$ # Check Python version
$ python --version
Python 3.7.2 # <--- All good
$ # Check git
$ git --version
$ git version 2.10.1.windows.1 # <--- All good
To built and start the app locally, follow the steps:
Get the source code
Change the current directory tosource code
directory and folow this set up
$ # Create Virtualenv (Unix based systems)
$ virtualenv env
$ source env/bin/activate
$
$ # Create Virtualenv (Windows based systems)
$ # virtualenv env
$ # .\env\Scripts\activate
Install requirements
$ pip3 install -r requirements.txt
Set up Environment
$ # Set the FLASK_APP environment variable
$ (Unix/Mac) export FLASK_APP=run.py
$ (Windows) set FLASK_APP=run.py
$ (Powershell) $env:FLASK_APP = ".\run.py"
Start the application
$ # Run the application
$ flask run
$
$ # Access the app in browser: http://127.0.0.1:5000/
At this point, we should see the app running in the browser. By default, Flask starts on
port
: 5000
. We can force Flask
using another port by using --port
option:
$ # Start Flask using cutom port
$ flask run --port=9999
$
$ # Access the app in browser: http://127.0.0.1:9999
By default, the app will redirect guest users to the login page. To access the private pages:
- Create a new user using the registration page
- Authenticate using the login page
Starter uses a simple codebase (no Blueprints) with a structure presented below:
< PROJECT ROOT >
|
|-- app/ # Implements app logic
| |-- base/ # Base Blueprint - handles the authentication
| |-- home/ # Home Blueprint - serve UI Kit pages
| |
| __init__.py # Initialize the app
|
|-- requirements.txt # Development modules - SQLite storage
|-- requirements-mysql.txt # Production modules - Mysql DMBS
|-- requirements-pqsql.txt # Production modules - PostgreSql DMBS
|
|-- .env # Inject Configuration via Environment
|-- config.py # Set up the app
|-- run.py # Start the app - WSGI gateway
|
|-- ************************************************************************
run.py
loads the.env
file- Initialize the app using the specified profile: Debug or Production
- If env.DEBUG is set to True the SQLite storage is used
- If env.DEBUG is set to False the specified DB driver is used (MySql, PostgreSQL)
- Call the app factory method
create_app
defined in app/init.py - Redirect the guest users to the Login page
- Unlock the pages served by the home blueprint for authenticated users
.env
(saved in the root of the project)
# File: `.env`
DEBUG=True # Enable/Disable the development environment
SECRET_KEY=S3cr3t_Key # The Key used by Flask to encrypt session information
# Database production settings (If DEBUG=False)
DB_ENGINE=postgresql # DBMS
DB_NAME=appseed-flask # Database Name
DB_HOST=localhost # Database Host
DB_PORT=5432 # Database Port
DB_USERNAME=appseed # DB Username
DB_PASS=pass # DB Password
run.py
(simplified version)
# File: run.py
DEBUG = config('DEBUG', default=True)
# Create the WSGI app, using the app factory pattern
app = create_app( app_config )
# Migrate automaticaly the app using Flask Migrate library
Migrate(app, db)
App constructor:app/__init__.py
constructs the app by putting together a short-list of things:
- Invoke SQLAlchemy and build the interface to the database
- Invoke and inject the
Login Manager
into the app - Load the configuration from
config.py
file - Register blueprints:
home
andbase
- Create app tables (if not yet created)
- Return the WSGI app
The configuration file
config.py
(in the root of the project) define a dual configuration controlled via the .env
file ( DEBUG
variable)DebugConfig - default configuration used for development
This configuration becomes active if
.env
file has the DEBUG
file set to True# Development/Debug configuration
# Set up the App SECRET_KEY
SECRET_KEY = config('SECRET_KEY', default='S#perS3crEt_007')
# This will create a file in <app> FOLDER
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'db.sqlite3')
SQLALCHEMY_TRACK_MODIFICATIONS = False
During the first request, the SQLite database and tables are automatically created.
Hint: to visualize the SQLite database content an external tool should be installed: DB Browser for SQLite it might be a good choice.
ProductionConfig - production configuration
This configuration becomes active if
.env
file has the DEBUG
file set to False# Production configuration
SESSION_COOKIE_HTTPONLY = True
REMEMBER_COOKIE_HTTPONLY = True
REMEMBER_COOKIE_DURATION = 3600
# PostgreSQL database
SQLALCHEMY_DATABASE_URI = '{}://{}:{}@{}:{}/{}'.format(
config( 'DB_ENGINE' , default='postgresql' ),
config( 'DB_USERNAME' , default='appseed' ),
config( 'DB_PASS' , default='pass' ),
config( 'DB_HOST' , default='localhost' ),
config( 'DB_PORT' , default=5432 ),
config( 'DB_NAME' , default='appseed-flask' )
)
In this configuration profile, the database defaults to a PostgreSQL DBMS. Make sure the
.env
has the right credentials to access the database.The file
app/base/models.py
(Base Blueprint) defines the table(s) used by the application. Being a simple starter, by default the following tabes are defined:- Table #1 - User with fields:
- Id - Primary key, unique
- user - Store the username
- email - The email address
- password - Hashed password
The file
app/base/forms.py
(Base Blueprint) defines the table(s) used by the application. Being a simple starter, by default the following forms are defined:- Form #1 - LoginForm with fields:
- username
- password
- Form #2 - RegisterForm with fields:
- username - used to authenticate
- email - email address
- password - used to authenticate
The routing rules are defined by Base and Home blueprints as specified below. This is the public zone of the app.
Base Blueprint - routing fileapp/base/routes.py
/login
route is resolved bylogin()
method/register
route is resolved byregister()
method
Registered ERROR handlers
- 404 Error - Page not found
- 403 Error - Access Forbidden
- 500 Error - Internal Error
Home Blueprint - routing fileapp/home/routes.py
This blueprint will serve requested pages from
app/home/templates
directory to authenticated users. The authentication status is checked by @login_required
decorator./<template>
route resolved byroute_template()
- If a requested page is not found a default 404 page is returned to the user
Pages and all assets defined in the UI Kits are served by the app using both blueprints:
Home Blueprint
manage the static assets -app/base/static/assets
Home Blueprint
store the layoutmaster pages
, HTML chunks (footer. header, scripts) andlogin, registration
pagesBase Blueprint
serves the HTML pages (index, page-404, etc) and the rest of the pages defined in the UI kit.
App / Base Blueprint
The Base blueprint handles the authentication (routes and forms) and assets management. The structure is presented below:
< PROJECT ROOT >
|
|-- app/
| |-- home/ # Home Blueprint
| |-- base/ # Base Blueprint
| |-- static/
| | |-- <css, JS, images> # CSS files, Javascripts files
| |
| |-- templates/ # UI Templates
| |
| |-- includes/ #
| | |-- navigation.html # Top menu component
| | |-- sidebar.html # Sidebar component
| | |-- footer.html # UI Footer
| | |-- scripts.html # JS Scripts used by all pages
| |
| |-- layouts/ # Master pages
| | |-- base-fullscreen.html # Used by Authentication pages
| | |-- base.html # Used by common pages
| |
| |-- accounts/ # Authentication pages
| |-- login.html # Login page
| |-- register.html # Registration page
App / Home Blueprint
The Home blueprint handles UI Kit pages for authenticated users. This is the private zone of the app - the structure is presented below:
< PROJECT ROOT >
|
|-- app/
| |-- base/ # Base Blueprint
| |-- home/ # Home Blueprint
| |
| |-- templates/ # UI Kit Pages
| |
| |-- index.html # Default page
| |-- page-404.html # Error 404 - mandatory page
| |-- page-500.html # Error 500 - mandatory page
| |-- page-403.html # Error 403 - mandatory page
| |-- *.html # All other HTML pages
The Flask starter exposes a short-list with data structures used globally across the app:
Constructed by Flask-Login can be used to detect if the current request is executed by an authenticated user or not. The object has global visibility and can be used in all app controllers and handlers but also in views.
How it works
app/base/models.py
define the callback functions required by Flask-Login library:# File: app/base/models.py
@login_manager.user_loader
def user_loader(id):
return User.query.filter_by(id=id).first()
@login_manager.request_loader
def request_loader(request):
username = request.form.get('username')
user = User.query.filter_by(username=username).first()
return user if user else None
Usage in contoler (Sample file)
def sample_method(path):
# Redirect guests users to login page
if not current_user.is_authenticated:
return redirect(url_for('login'))
Usage in view
<!-- The Usage of <current_user> object -->
{% if current_user.is_authenticated %}
<!-- Html chunk rendered for authenticated users-->
{% else %}
<!-- Html chunk rendered for guests users-->
{% endif %}
Last modified 1yr ago