A production-ready Flask application template with SQLite3, Bootstrap 5, user authentication, and admin dashboard.
✅ SQLite3 Database - Lightweight, file-based database with SQLAlchemy ORM
✅ Flask-Login - Secure user authentication and session management
✅ Bootstrap 5.3.2 - Modern, responsive UI components
✅ WTForms - Form handling with CSRF protection
✅ Admin Dashboard - Full-featured admin panel with user management
✅ Responsive Design - Mobile-first design that works on all devices
✅ Pre-configured Admin User - Quick setup with default admin (username: admin, password: q1)
git clone https://github.com/muntakson/FlaskAppTemplate.git
cd FlaskAppTemplatepython3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activatepip install -r requirements.txtflask --app run.py init-dbflask --app run.py create-adminThis creates an admin user with:
- Username:
admin - Password:
q1
Or use the Python script:
python scripts/create_admin.pypython run.pyVisit: http://localhost:5000
FlaskAppTemplate/
├── app/
│ ├── __init__.py # Application factory
│ ├── models.py # Database models (User, Item)
│ ├── forms.py # WTForms (Login, Register, UserForm)
│ ├── static/
│ │ ├── css/
│ │ │ └── custom.css # Responsive custom styles
│ │ └── js/
│ │ └── custom.js # Client-side interactions
│ └── templates/
│ ├── base.html # Main site base template
│ ├── index.html # Homepage
│ ├── login.html # Login page
│ ├── register.html # Registration page
│ └── admin/
│ ├── base.html # Admin base template
│ ├── dashboard.html
│ ├── users.html # User list with search/filter
│ └── user_form.html
├── instance/
│ └── app.db # SQLite database (auto-created)
├── scripts/
│ └── create_admin.py # Admin user creation script
├── run.py # Application entry point
├── requirements.txt # Python dependencies
├── .env.example # Environment variables template
└── README.md
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
name = db.Column(db.String(100), nullable=False)
email = db.Column(db.String(120), unique=True)
is_admin = db.Column(db.Boolean, default=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)class Item(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False)
description = db.Column(db.Text)
created_at = db.Column(db.DateTime, default=datetime.utcnow)GET /- HomepageGET /login- Login pagePOST /login- Login submissionGET /register- Registration pagePOST /register- Registration submissionGET /logout- Logout (requires login)
GET /admin/- Admin dashboardGET /admin/users- User listGET /admin/users/new- Create new userPOST /admin/users/new- Submit new userGET /admin/users/edit/<id>- Edit userPOST /admin/users/edit/<id>- Update userPOST /admin/users/delete/<id>- Delete user
- Statistics Cards - Total users, admin count, system status
- User Management - Full CRUD operations
- Search & Filter - Client-side search and filtering
- Responsive Tables - Mobile-friendly data tables
- Role Management - Toggle admin privileges
- Sidebar Navigation - Easy access to all admin functions
Edit app/__init__.py:
app = Flask(__name__)
# Update templates/base.html navbar-brandEdit app/models.py:
class YourModel(db.Model):
__tablename__ = 'your_table'
# Add your fields hereEdit app/__init__.py:
@main_bp.route('/your-route')
def your_route():
return render_template('your_template.html')Edit app/static/css/custom.css - includes:
- Responsive breakpoints (mobile, tablet, desktop)
- Card hover effects
- Admin sidebar styling
- Print styles
- Accessibility features
Create a .env file (see .env.example):
SECRET_KEY=your-secret-key-here
DATABASE_URL=sqlite:///app.db
FLASK_APP=run.py
FLASK_ENV=developmentpip install gunicorn
gunicorn -w 4 -b 0.0.0.0:5000 'run:app'server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}export SECRET_KEY=$(python -c 'import secrets; print(secrets.token_hex(32))')
export FLASK_ENV=production✅ CSRF Protection - All forms use Flask-WTF CSRF tokens
✅ Password Hashing - Werkzeug security with bcrypt
✅ SQL Injection Protection - SQLAlchemy ORM parameterized queries
✅ Admin Decorator - @admin_required protects sensitive routes
✅ Session Security - Flask-Login secure session management
- Backend: Python 3.8+, Flask 3.0.3
- Database: SQLite3 with SQLAlchemy ORM
- Authentication: Flask-Login
- Forms: Flask-WTF + WTForms
- Frontend: Bootstrap 5.3.2, Bootstrap Icons
- JavaScript: Vanilla JS (no frameworks)
# Initialize database
flask --app run.py init-db
# Create admin user (username: admin, password: q1)
flask --app run.py create-admin- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
- Mobile browsers (iOS Safari, Chrome Mobile)
- Mobile: < 576px (1 column layout)
- Tablet: 576px - 991px (2-3 columns)
- Desktop: ≥ 992px (4 columns)
- Large Desktop: ≥ 1200px (max-width 1400px container)
MIT License - Feel free to use this template for your projects!
Created by muntakson
Based on patterns from production Flask applications with:
- SQLite3 database
- Bootstrap 5 UI
- NGINX reverse proxy
- User authentication
- Admin dashboard
Pull requests welcome! Please ensure:
- Code follows PEP 8 style guidelines
- All forms include CSRF protection
- Templates are responsive
- Admin routes use
@admin_requireddecorator
For issues or questions, please open an issue on GitHub: https://github.com/muntakson/FlaskAppTemplate/issues
Quick Start Summary:
git clone https://github.com/muntakson/FlaskAppTemplate.git
cd FlaskAppTemplate
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
flask --app run.py init-db
flask --app run.py create-admin
python run.pyDefault admin credentials: admin / q1
Visit: http://localhost:5000