Miguel Grinberg's Blog
miguelgrinberg.com
- Posts
- 269 from 21 Apr 2012 to 27 Oct 2026
- Posting
- weekly (25 in the last year)
- Kind
- personal blog
- Feed
- https://blog.miguelgrinberg.com/feed
2026 23
- I'm Full-Time Open Source Developer Now
- How fast is Python 3.15?
- You Should be Using Rootless Containers
- Forgejo hack #2: Integration with Read The Docs
- Forgejo hack #1: How to set a starting issue and pull request number
- I Am Not a Reverse Centaur
- SQLAlchemy 2 In Practice - Solutions to the Exercises
- SQLAlchemy 2 In Practice - Chapter 8: SQLAlchemy and the Web
- SQLAlchemy 2 In Practice - Chapter 7: Asynchronous SQLAlchemy
- How Bitwarden Encrypts and Decrypts Secrets
- SQLAlchemy 2 In Practice - Chapter 6: A Page Analytics Solution
- SQLAlchemy 2 In Practice - Chapter 5 - Advanced Many-To-Many Relationships
- SQLAlchemy 2 In Practice - Chapter 4 - Many-To-Many Relationships
- SQLAlchemy 2 In Practice - Chapter 3 - One-To-Many Relationships
- SQLAlchemy 2 In Practice - Chapter 2 - Database Tables
- SQLAlchemy 2 In Practice - Chapter 1 - Database Setup
- Introduction to SQLAlchemy 2 In Practice
- How to Host your Own Email Server
- LLM Use in the Python Source Code
- My Courses Site is Moving to a New Home
- Date Arithmetic in Bash
- How to Add a Quick Interactive Map to your Website
- A Year In Review: Flask in 2025
2025 12
- CSRF Protection without Tokens or Hidden Form Fields
- How to Securely Store Secrets in Environment Variables
- Python 3.14 performance
- Benchmarking MicroPython
- coding with LLMs would not work for me
- Create a React + Flask Project in 2025
- Font Ligatures for your Code Editor and Terminal
- A Review of The Quick Python Book, Fourth Edition
- Dynamic Forms with Flask
- Encryption at Rest with SQLAlchemy
- Using Free Let's Encrypt SSL Certificates in 2025
- last year
2024 4
2023 35
- Eliza-GPT: The Classic ELIZA Chatbot Running On OpenAI's Chat Completions API
- Microdot: Yet Another Python Web Framework
- The Flask Mega-Tutorial, Part XV: A Better Application Structure
- The Flask Mega-Tutorial, Part XVI: Full-Text Search
- The Flask Mega-Tutorial, Part XVII: Deployment on Linux
- The Flask Mega-Tutorial, Part XVIII: Deployment on Heroku
- The Flask Mega-Tutorial, Part XIX: Deployment on Docker Containers
- The Flask Mega-Tutorial, Part XX: Some JavaScript Magic
- The Flask Mega-Tutorial, Part XXI: User Notifications
- The Flask Mega-Tutorial, Part XXII: Background Jobs
- The Flask Mega-Tutorial, Part XXIII: Application Programming Interfaces (APIs)
- Announcing the Flask Mega-Tutorial, 2024 Edition
- Flask Mega-Tutorial
- The Flask Mega-Tutorial, Part V: User Logins
- The Flask Mega-Tutorial, Part VI: Profile Page and Avatars
- The Flask Mega-Tutorial, Part VII: Error Handling
- The Flask Mega-Tutorial, Part VIII: Followers
- The Flask Mega-Tutorial, Part IX: Pagination
- The Flask Mega-Tutorial, Part X: Email Support
- The Flask Mega-Tutorial, Part XI: Facelift
- The Flask Mega-Tutorial, Part XII: Dates and Times
- The Flask Mega-Tutorial, Part XIII: I18n and L10n
- The Flask Mega-Tutorial, Part XIV: Ajax
- The Flask Mega-Tutorial, Part II: Templates
- The Flask Mega-Tutorial, Part III: Web Forms
- The Flask Mega-Tutorial, Part IV: Database
- It's Time For A Change: datetime.utcnow() Is Now Deprecated
- Some More To Talk About Flask
- We Have To Talk About Flask
- Building a Toy Programming Language in Python
- Building a Toy Programming Language in Python, Part 2
- Goodbye, Twilio
- OAuth Authentication with Flask in 2023
- Create a MySQL Database using Docker
- What's New in SQLAlchemy 2.0?
2022 14
- The React Mega-Tutorial, Chapter 12: Production Builds
- The React Mega-Tutorial, Chapter 11: Automated Testing
- The React Mega-Tutorial, Chapter 10: Memoization
- The React Mega-Tutorial, Chapter 9: Application Features
- The React Mega-Tutorial, Chapter 8: Authentication
- The React Mega-Tutorial, Chapter 7: Forms and Validation
- The React Mega-Tutorial, Chapter 6: Building an API Client
- Beautiful Flask Tables, Part 2
- The React Mega-Tutorial, Chapter 5: Connecting to a Back End
- The React Mega-Tutorial, Chapter 4: Routing and Page Navigation
- The React Mega-Tutorial, Chapter 3: Working with Components
- The React Mega-Tutorial, Chapter 2: Hello, React!
- Introducing the React Mega-Tutorial
- The React Mega-Tutorial, Chapter 1: Modern JavaScript
2021 13
- API Authentication with Tokens
- Using JavaScript-style async promises in Python
- Add a WebSocket Route to your Flask 2.x Application
- Accept Credit Card Payments in Flask with Stripe Checkout
- Optimizing Slow SQL Queries
- How to Write Unit Tests in Python, Part 3: Web Applications
- Flask Mega-Tutorial Update: Flask 2.0 and more!
- Beautiful Interactive Tables for your Flask Templates
- How to Dockerize a React + Flask Project
- Dynamically Update Your Flask Web Pages Using Turbo-Flask
- How to Write Unit Tests in Python, Part 2: Game of Life
- How to Write Unit Tests in Python, Part 1: Fizz Buzz
- Learn Socket.IO with Python and JavaScript in 90 Minutes!
2020 19
- Learn React in 90 Minutes!
- Why do we pass __name__ to the Flask class?
- How to Kill a Python Thread
- Ignore All Web Performance Benchmarks, Including This One
- Sync vs. Async Python: What is the Difference?
- How to Deploy a React-Router + Flask Application
- Video: How To Fix an Internal Server Error in Flask
- Fixing ALTER TABLE errors with Flask-Migrate and SQLite
- Run Your Flask Regularly Scheduled Jobs with Cron
- Handling File Uploads With Flask
- Access Localhost From Your Phone Or From Anywhere In The World
- Introduction to JavaScript Arrow Functions
- Video: Using Trailing Commas in Python
- Introduction to JavaScript Promises
- Video: Introduction to Terminal Multiplexing with Tmux
- Video: Setting Up Vim to Work with Python Applications
- How To Add Flask-Migrate To An Existing Project
- How to deploy a react flask project
- React + Flask project
2019 19
- The Ultimate Guide to Python Decorators, Part III: Decorators with Arguments
- Video: MicroPython Heats My Home
- The Ultimate Guide to Python Decorators, Part II: Altering Function Behavior
- Video: Four SQLAlchemy Tips
- Video: How to Measure Web App Performance
- MicroPython and the Internet of Things, Part VI: Working with a Screen
- Setting Up a Flask Application in Visual Studio Code
- MicroPython and the Internet of Things, Part V: Temperature and Humidity
- MicroPython and the Internet of Things, Part IV: Wi-Fi and the Cloud
- MicroPython and the Internet of Things, Part III: Building a MicroPython Application
- The Ultimate Guide to Python Decorators, Part I: Function Registration
- MicroPython and the Internet of Things, Part II: Hello, MicroPython!
- MicroPython and the Internet of Things, Part I: Welcome
- Introducing My MicroPython Tutorial
- Running a Flask Application as a Service with Systemd
- Nested Queries with SQLAlchemy ORM
- Unit Testing Applications that use Flask-Login and Flask-SocketIO
- How To Make Python Wait
- SSH Security For Teams
2018 26
- Coding on a Chromebook Revisited
- Setting Up a Flask Application in PyCharm
- JSON Web Tokens with Public Key Signatures
- Flask Webcast #3: Circular Dependencies
- The Flask Mega-Tutorial Part XXIII: Application Programming Interfaces (APIs) (2018)
- The Flask Mega-Tutorial Part XXII: Background Jobs (2018)
- The Flask Mega-Tutorial Part XXI: User Notifications (2018)
- Flask Webcast #2: Request and Application Contexts
- The Flask Mega-Tutorial Part XX: Some JavaScript Magic (2018)
- The Flask Mega-Tutorial Part XIX: Deployment on Docker Containers (2018)
- The Flask Mega-Tutorial Part XVIII: Deployment on Heroku (2018)
- The Flask Mega-Tutorial Part XVII: Deployment on Linux (2018)
- Flask Webcast #1: Intro to Flask
- The Flask Mega-Tutorial Part XVI: Full-Text Search (2018)
- The Flask Mega-Tutorial Part XV: A Better Application Structure (2018)
- The Flask Mega-Tutorial Part XIV: Ajax (2018)
- The Flask Mega-Tutorial Part XIII: I18n and L10n (2018)
- The Flask Mega-Tutorial Part XII: Dates and Times (2018)
- The New Way To Generate Secure Tokens in Python
- The Flask Mega-Tutorial Part XI: Facelift (2018)
- The Flask Mega-Tutorial Part X: Email Support (2018)
- The Flask Mega-Tutorial Part IX: Pagination (2018)
- The Flask Mega-Tutorial Part VIII: Followers (2018)
- The Flask Mega-Tutorial Part VII: Error Handling (2018)
- The Flask Mega-Tutorial Part VI: Profile Page and Avatars (2018)
- The Flask Mega-Tutorial Part V: User Logins (2018)
2017 18
- The Flask Mega-Tutorial Part IV: Database (2018)
- The Flask Mega-Tutorial Part III: Web Forms (2018)
- The Flask Mega-Tutorial Part II: Templates (2018)
- The Flask Mega-Tutorial Part I: Hello, World! (2018)
- Implementing User Comments with SQLAlchemy
- setting up a cheap Chromebook for web development
- Serverless Deployments of Python APIs
- Flask Video Streaming Revisited
- Using Headless Chrome with Selenium
- Continue reading this post...
- Cookie Security for Flask Applications
- The Flask Mega-Tutorial Kickstarter
- Flask-SocketIO and the User Session
- Handling Authentication Secrets in the Browser
- Migrating from Flask-Script to the New Flask CLI
- Running Your Flask Application Over HTTPS
- Visual Studio Code for Python Developers
- Unit Testing AsyncIO Code
2016 7
2015 8
2014 10
- tutorial
- Video Streaming with Flask
- The Flask Mega-Tutorial: Now with Python 3 Support
- Using Flask-Babel with Flask 0.10
- The Rackspace Cloud API
- My Flask Web Development Book is Out!
- Watch Live Video of Earth on your Raspberry Pi
- Easy Web Scraping with Python
- Easy WebSockets with Flask and Gevent
- Fun With The Arduino Esplora: A Digital Picture Frame
2013 31
- Flask Book and PyCon Update
- RESTful Authentication with Flask
- Flask-PageDown: Markdown Editor Extension for Flask-WTF
- Flask-Moment: Flask and Jinja2 Integration with moment.js
- How to build and run MJPG-Streamer on the Raspberry Pi
- Flask-Migrate: Alembic database migration wrapper for Flask
- The Package Dependency Blues
- Designing a RESTful API using Flask-RESTful
- Web Development With Flask
- Night Sky Photography
- Flask-Runner: Command Line Options for Flask
- How To Teach A Young Kid To Play Chess
- Writing a Javascript REST client
- streaming video from the Raspberry Pi using MJPG-Streamer
- Designing a restful api with python and flask
- Take 3D Pictures With Your Canon DSLR and Magic Lantern
- The Flask Mega-Tutorial, Part XVIII: Deployment on the Heroku Cloud (2012)
- The Flask Mega-Tutorial, Part XVII: Deployment on Linux (even on the Raspberry Pi!) (2012)
- Building an Arduino Robot, Part VI: Remote Control
- A cheap Bluetooth serial port for your Raspberry Pi
- The Flask Mega-Tutorial, Part XVI: Debugging, Testing and Profiling (2012)
- Building an Arduino Robot, Part V: Avoiding Obstacles
- The Flask Mega-Tutorial, Part XV: Ajax (2012)
- web scraping using Node.js
- The Flask Mega-Tutorial, Part XIV: I18n and L10n (2012)
- Building an Arduino Robot, Part IV: A (Not So) Basic Robot Firmware
- Netflix Gems: Buried
- Building an Arduino Robot, Part III: Assembling the Robot
- Building an Arduino Robot, Part II: Programming the Arduino
- rendering dates and times
- The Flask Mega-Tutorial, Part XIII: Dates and Times (2012)
2012 30
- Arduino based robot vehicle project
- The Flask Mega-Tutorial, Part XII: Facelift (2012)
- The Flask Mega-Tutorial, Part XI: Email Support (2012)
- The Quick & Dirty HDR Tutorial (With Free Software!)
- The School Picture Challenge
- The Flask Mega-Tutorial, Part X: Full Text Search (2012)
- The Flask Mega-Tutorial, Part IX: Pagination (2012)
- Balancing the Rhino Steady Camera Stabilizer, Case Study: Smartphone
- Netflix Gems: The Red Violin (Le Violon Rouge)
- The Flask Mega-Tutorial, Part VIII: Followers, Contacts And Friends (2012)
- Balancing the Rhino Steady Camera Stabilizer, Case Study: Point & Shoot
- Netflix Gems: Timecrimes (Los Cronocrímenes)
- Netflix Gems: Castaway On The Moon
- Netflix Gems: The Double Hour (La Doppia Ora)
- lightweight camcorder
- The Flask Mega-Tutorial, Part VII: Unit Testing (2012)
- lightweight DSLR
- first article
- medium size DSLR
- The Flask Mega-Tutorial, Part VI: Profile Page And Avatars (2012)
- Using The Sky As A Softbox - With A Twist
- Simple Project Management, Or How To Finish Your Project Before The World Comes To An End
- The Flask Mega-Tutorial, Part V: User Logins (2012)
- The Flask Mega-Tutorial, Part IV: Database (2012)
- The Flask Mega-Tutorial, Part III: Web Forms (2012)
- The Flask Mega-Tutorial, Part II: Templates (2012)
- The Flask Mega-Tutorial, Part I: Hello, World! (2012)
- Increasing The Dynamic Range Of Your Pictures With Enfuse
- review their code
- About This Blog