blog.miguelgrinberg.com Open in urlscan Pro
138.68.45.120  Public Scan

Submitted URL: http://blog.miguelgrinberg.com/
Effective URL: https://blog.miguelgrinberg.com/
Submission: On December 20 via api from US — Scanned from DE

Form analysis 84 forms found in the DOM

/author/Miguel%20Grinberg

<form action="/author/Miguel%20Grinberg">
  <input type="submit" class="btn btn-outline-danger btn-sm" value="Miguel Grinberg">
</form>

/category/Python

<form action="/category/Python">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Python">
</form>

/category/Programming

<form action="/category/Programming">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Programming">
</form>

/category/Flask

<form action="/category/Flask">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Flask">
</form>

/author/Miguel%20Grinberg

<form action="/author/Miguel%20Grinberg">
  <input type="submit" class="btn btn-outline-danger btn-sm" value="Miguel Grinberg">
</form>

/category/Flask

<form action="/category/Flask">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Flask">
</form>

/category/Python

<form action="/category/Python">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Python">
</form>

/category/REST

<form action="/category/REST">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="REST">
</form>

/category/Programming

<form action="/category/Programming">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Programming">
</form>

/category/Authentication

<form action="/category/Authentication">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Authentication">
</form>

/author/Miguel%20Grinberg

<form action="/author/Miguel%20Grinberg">
  <input type="submit" class="btn btn-outline-danger btn-sm" value="Miguel Grinberg">
</form>

/category/Python

<form action="/category/Python">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Python">
</form>

/category/JavaScript

<form action="/category/JavaScript">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="JavaScript">
</form>

/category/Flask

<form action="/category/Flask">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Flask">
</form>

/category/Programming

<form action="/category/Programming">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Programming">
</form>

/author/Miguel%20Grinberg

<form action="/author/Miguel%20Grinberg">
  <input type="submit" class="btn btn-outline-danger btn-sm" value="Miguel Grinberg">
</form>

/category/Python

<form action="/category/Python">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Python">
</form>

/category/JavaScript

<form action="/category/JavaScript">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="JavaScript">
</form>

/category/Programming

<form action="/category/Programming">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Programming">
</form>

/category/Flask

<form action="/category/Flask">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Flask">
</form>

/author/Miguel%20Grinberg

<form action="/author/Miguel%20Grinberg">
  <input type="submit" class="btn btn-outline-danger btn-sm" value="Miguel Grinberg">
</form>

/category/Flask

<form action="/category/Flask">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Flask">
</form>

/category/Python

<form action="/category/Python">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Python">
</form>

/category/Programming

<form action="/category/Programming">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Programming">
</form>

/category/JavaScript

<form action="/category/JavaScript">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="JavaScript">
</form>

/author/Miguel%20Grinberg

<form action="/author/Miguel%20Grinberg">
  <input type="submit" class="btn btn-outline-danger btn-sm" value="Miguel Grinberg">
</form>

/category/Flask

<form action="/category/Flask">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Flask">
</form>

/category/Python

<form action="/category/Python">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Python">
</form>

/category/Programming

<form action="/category/Programming">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Programming">
</form>

/category/Docker

<form action="/category/Docker">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Docker">
</form>

/author/Miguel%20Grinberg

<form action="/author/Miguel%20Grinberg">
  <input type="submit" class="btn btn-outline-danger btn-sm" value="Miguel Grinberg">
</form>

/category/Python

<form action="/category/Python">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Python">
</form>

/category/Flask

<form action="/category/Flask">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Flask">
</form>

/category/Programming

<form action="/category/Programming">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Programming">
</form>

/category/Cloud

<form action="/category/Cloud">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Cloud">
</form>

/author/Miguel%20Grinberg

<form action="/author/Miguel%20Grinberg">
  <input type="submit" class="btn btn-outline-danger btn-sm" value="Miguel Grinberg">
</form>

/category/Raspberry%20Pi

<form action="/category/Raspberry%20Pi">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Raspberry Pi">
</form>

/category/Cloud

<form action="/category/Cloud">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Cloud">
</form>

/category/Python

<form action="/category/Python">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Python">
</form>

/category/Flask

<form action="/category/Flask">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Flask">
</form>

/category/Programming

<form action="/category/Programming">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Programming">
</form>

/author/Miguel%20Grinberg

<form action="/author/Miguel%20Grinberg">
  <input type="submit" class="btn btn-outline-danger btn-sm" value="Miguel Grinberg">
</form>

/category/Python

<form action="/category/Python">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Python">
</form>

/category/Flask

<form action="/category/Flask">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Flask">
</form>

/category/Programming

<form action="/category/Programming">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Programming">
</form>

/category/Database

<form action="/category/Database">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Database">
</form>

/author/Miguel%20Grinberg

<form action="/author/Miguel%20Grinberg">
  <input type="submit" class="btn btn-outline-danger btn-sm" value="Miguel Grinberg">
</form>

/category/Python

<form action="/category/Python">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Python">
</form>

/category/Flask

<form action="/category/Flask">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Flask">
</form>

/category/Programming

<form action="/category/Programming">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Programming">
</form>

/category/AWS

<form action="/category/AWS">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="AWS"> <small><em>1</em></small>
</form>

/category/Arduino

<form action="/category/Arduino">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Arduino"> <small><em>7</em></small>
</form>

/category/Authentication

<form action="/category/Authentication">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Authentication"> <small><em>10</em></small>
</form>

/category/Blog

<form action="/category/Blog">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Blog"> <small><em>1</em></small>
</form>

/category/C++

<form action="/category/C++">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="C++"> <small><em>5</em></small>
</form>

/category/Cloud

<form action="/category/Cloud">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Cloud"> <small><em>10</em></small>
</form>

/category/Database

<form action="/category/Database">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Database"> <small><em>22</em></small>
</form>

/category/Docker

<form action="/category/Docker">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Docker"> <small><em>5</em></small>
</form>

/category/Filmmaking

<form action="/category/Filmmaking">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Filmmaking"> <small><em>6</em></small>
</form>

/category/Flask

<form action="/category/Flask">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Flask"> <small><em>126</em></small>
</form>

/category/Games

<form action="/category/Games">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Games"> <small><em>1</em></small>
</form>

/category/HTML5

<form action="/category/HTML5">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="HTML5"> <small><em>1</em></small>
</form>

/category/Heroku

<form action="/category/Heroku">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Heroku"> <small><em>1</em></small>
</form>

/category/IoT

<form action="/category/IoT">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="IoT"> <small><em>8</em></small>
</form>

/category/JavaScript

<form action="/category/JavaScript">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="JavaScript"> <small><em>34</em></small>
</form>

/category/MicroPython

<form action="/category/MicroPython">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="MicroPython"> <small><em>8</em></small>
</form>

/category/Microservices

<form action="/category/Microservices">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Microservices"> <small><em>2</em></small>
</form>

/category/Movie%20Reviews

<form action="/category/Movie%20Reviews">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Movie Reviews"> <small><em>5</em></small>
</form>

/category/OpenStack

<form action="/category/OpenStack">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="OpenStack"> <small><em>1</em></small>
</form>

/category/Personal

<form action="/category/Personal">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Personal"> <small><em>3</em></small>
</form>

/category/Photography

<form action="/category/Photography">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Photography"> <small><em>7</em></small>
</form>

/category/Product%20Reviews

<form action="/category/Product%20Reviews">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Product Reviews"> <small><em>2</em></small>
</form>

/category/Programming

<form action="/category/Programming">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Programming"> <small><em>184</em></small>
</form>

/category/Project%20Management

<form action="/category/Project%20Management">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Project Management"> <small><em>1</em></small>
</form>

/category/Python

<form action="/category/Python">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Python"> <small><em>167</em></small>
</form>

/category/REST

<form action="/category/REST">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="REST"> <small><em>7</em></small>
</form>

/category/Rackspace

<form action="/category/Rackspace">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Rackspace"> <small><em>1</em></small>
</form>

/category/Raspberry%20Pi

<form action="/category/Raspberry%20Pi">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Raspberry Pi"> <small><em>8</em></small>
</form>

/category/React

<form action="/category/React">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="React"> <small><em>18</em></small>
</form>

/category/Robotics

<form action="/category/Robotics">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Robotics"> <small><em>6</em></small>
</form>

/category/Security

<form action="/category/Security">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Security"> <small><em>12</em></small>
</form>

/category/Video

<form action="/category/Video">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Video"> <small><em>22</em></small>
</form>

/category/Webcast

<form action="/category/Webcast">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Webcast"> <small><em>3</em></small>
</form>

/category/Windows

<form action="/category/Windows">
  <input type="submit" class="btn btn-outline-primary btn-sm" value="Windows"> <small><em>1</em></small>
</form>

Text Content

miguelgrinberg.com
 * Home
 * My Courses and Books
 * Consulting
 * About Me

 * 


ANNOUNCING THE FLASK MEGA-TUTORIAL, 2024 EDITION


POSTED BY

ON DECEMBER 3, 2023 UNDER




Today I'm super-excited to share that I have made available a major update to
the Flask Mega-Tutorial, which I'm calling the "2024 Edition".





In the following sections I'll re-introduce the tutorial in case you have not
seen it before, and I'll also go over the changes and improvements in this
revised edition.

Continue reading this post...
17 comments


THE FLASK MEGA-TUTORIAL, PART XXIII: APPLICATION PROGRAMMING INTERFACES (APIS)


POSTED BY

ON DECEMBER 3, 2023 UNDER






This is the twenty third and last installment of the Flask Mega-Tutorial series,
in which I'm going to tell you how to extend microblog with an application
programming interface (or API) that clients can use to work with the application
in a more direct way than the traditional web browser workflow.

Continue reading this post...
4 comments


THE FLASK MEGA-TUTORIAL, PART XXII: BACKGROUND JOBS


POSTED BY

ON DECEMBER 3, 2023 UNDER





This is the twenty second installment of the Flask Mega-Tutorial series, in
which I'm going to tell you how to create background jobs that run independently
of the web server.

Continue reading this post...
No comments yet


THE FLASK MEGA-TUTORIAL, PART XXI: USER NOTIFICATIONS


POSTED BY

ON DECEMBER 3, 2023 UNDER





This is the twenty first installment of the Flask Mega-Tutorial series, in which
I'm going to add a private message feature, along with user notifications that
appear in the navigation bar without the need to refresh the page.

Continue reading this post...
No comments yet


THE FLASK MEGA-TUTORIAL, PART XX: SOME JAVASCRIPT MAGIC


POSTED BY

ON DECEMBER 3, 2023 UNDER





This is the twentieth installment of the Flask Mega-Tutorial series, in which
I'm going to add a nice popup when you hover your mouse over a user's nickname.

Continue reading this post...
No comments yet


THE FLASK MEGA-TUTORIAL, PART XIX: DEPLOYMENT ON DOCKER CONTAINERS


POSTED BY

ON DECEMBER 3, 2023 UNDER





This is the nineteenth installment of the Flask Mega-Tutorial series, in which
I'm going to deploy Microblog to the Docker container platform.

Continue reading this post...
2 comments


THE FLASK MEGA-TUTORIAL, PART XVIII: DEPLOYMENT ON HEROKU


POSTED BY

ON DECEMBER 3, 2023 UNDER





This is the eighteenth installment of the Flask Mega-Tutorial series, in which
I'm going to deploy Microblog to the Heroku cloud platform.

Continue reading this post...
2 comments


THE FLASK MEGA-TUTORIAL, PART XVII: DEPLOYMENT ON LINUX


POSTED BY

ON DECEMBER 3, 2023 UNDER






This is the seventeenth installment of the Flask Mega-Tutorial series, in which
I'm going to deploy Microblog to a Linux server.

Continue reading this post...
No comments yet


THE FLASK MEGA-TUTORIAL, PART XVI: FULL-TEXT SEARCH


POSTED BY

ON DECEMBER 3, 2023 UNDER





This is the sixteenth installment of the Flask Mega-Tutorial series, in which
I'm going to add a full-text search capability to Microblog.

Continue reading this post...
No comments yet


THE FLASK MEGA-TUTORIAL, PART XV: A BETTER APPLICATION STRUCTURE


POSTED BY

ON DECEMBER 3, 2023 UNDER




This is the fifteenth installment of the Flask Mega-Tutorial series, in which
I'm going to restructure the application using a style that is appropriate for
larger applications.

Continue reading this post...
2 comments
 * « Newer Posts
 * Older Posts »

About Miguel

Welcome to my blog!

I'm a software engineer and technical writer, currently living in Drogheda,
Ireland.

You can also find me on Twitter, Mastodon, Github, LinkedIn, YouTube, Facebook
and Patreon.

Thank you for visiting!

Categories
1
7
10
1
5
10
22
5
6
126
1
1
1
8
34
8
2
5
1
3
7
2
184
1
167
7
1
8
18
6
12
22
3
1

© 2012-2023 by Miguel Grinberg. All rights reserved. Questions?