
This course includes our updated coding exercises so you can practice your skills as you learn.
See a demo
This is a short introductory video to this section. I'm really excited to guide you through this Python refresher course!
This lecture has a link to all the Python code we'll write in this section. Use it to check your code as you write it, or to refresh your memory!
Let's look at variables in Python. Variables are just names for values, which we can reuse and reset.
Python is a dynamic typed language, which means variables don't need be constrained to a specific type.
Learn string formatting in python 3.6+ using f-strings to embed variables and the format method for reusable templates. See how dynamic values update in greetings with placeholders.
Build your first python app that asks for age, converts input to int, calculates months (age times 12), and prints a readable result with an f-string.
In this lecture we look at three essential data structures in Python: lists, tuples, and sets.
A list is an ordered collection of items.
A tuple is an immutable ordered collection of items.
A set is an unordered collection of unique items.
In this fascinating video, we look at advanced set operations: calculating items which are in two sets, or items which are in one set but not another.
This video explores how to create programs which can change depending on some input. For example, we might ask the user if they want to continue or not.
This makes use of boolean comparisons, such as:
1 == 1 (which is True)
5 > 5 (which is False)
The boolean comparisons we have available in Python are many:
==
!=
>, <, <=, >=
is
is not
in
not in
Loops allow us to repeat things over and over. This video explores two different types of loop in Python: for loop and while loop.
List comprehension is a relatively unique thing to Python.
It allows us to succinctly use a for loop inside a list to generate values. These values then end up in the list.
For example, [x for x in range(10)] generates a list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].
Dictionaries are an extremely useful thing in Python.
They are akin to sets, but instead of being a set of unique values, they are a set of unique keys, and each has a value associated with it.
In this video, let's look at methods in Python by creating some examples. Creating methods is simple, you just need the one keyword: def.
Learn how Python functions return values, why None is returned by default, and how return differs from print.
Explore python lambda functions, anonymous single-line tools that return values, their four parts, and when to use with map versus list comprehensions for sequences.
*args and **kwargs are truly fascinatingly confusing. For eons, they have annoyed Python learners.
To this I say no more!
They're just a way of passing arguments.
Learn to unpack keyword arguments with **kwargs and unpack dictionaries into named parameters, and pass them in Python functions using args and kwargs to create flexible call signatures.
Objects are the natural progression from dictionaries. Instead of just holding data, objects hold another special type of data: methods.
A method is a function which operates on the object calling it. Thus, an object can use its own values to calculate outputs of methods. Very cool.
Learn how Python's magic methods __str__ and __repr__ convert objects to readable strings and unambiguous representations that help display and reconstruct objects.
In many instances, we don't want our methods to be solely referencing the object which calls them. Sometimes, we want to reference the class of the object. Other times, we don't need either the object or the class.
@classmethod and @staticmethod are two decorators (looking at that shortly!) which extend the capabilities of methods.
Classes in Python can also inherit from one another. This essentially means that a class contains all of the properties and methods of the class it inherits from—but with the added bonus that it can have more.
Learn type hinting in Python 3.5+ to specify input and return types, with examples using list, tuple, and class Book. It helps you catch mistakes by signaling expected types.
Learn how to import code from other files and folders in Python, and how __name__ and sys.path control which code runs.
Learn how to handle errors in Python by raising a ZeroDivisionError and using try-except. Explore else and finally blocks to control flow, display meaningful messages, and debug with tracebacks.
Create a simple book class with init, type hints, and a repr method. Introduce a custom error 'too many pages read error' inheriting from value error to raise when overreads.
Not only we can pass values from one method to another, but we can also pass functions.
This is not used very often, but it can sometimes yield very powerful methods in very few lines of code.
One of the most confusing aspects of Python for learners is the concept of decorators.
These are things we can place on top of function definitions which allow us to extend the function by executing code before and after the function.
They are extremely powerful when used well!
Learn how to decorate functions with parameters using a secure decorator, handle panels such as admin or billing, and pass arbitrary arguments with *args and **kwargs to keep decorators reusable.
In this video we look at advanced decorators in Python, which is decorators that take arguments.
This amplifies the decorator's usefulness, although also makes them slightly more contrived.
Discover why mutable default parameters cause shared state in Python, shown via a student example, and fix it by using None and creating a new list inside the init.
Explore how the internet resolves domain names to IP addresses, then uses HTTP GET requests to load HTML, style sheets, images, and cookies from servers.
Compare front-end and back-end development, exploring client-side HTML, CSS, and JavaScript, browser compatibility, and how Python with Flask powers backend data storage and dynamic content.
Open the browser dev tools, inspect elements, and edit HTML and CSS to see live changes. Explore the style viewer and computed values, and monitor performance data and network requests.
Learn HTML basics by understanding elements, tags, and attributes, including void elements, nesting, and the role of class and ID for page structure.
Learn how HTML content categories organize web pages, including flow content, sectioning, heading content, and phrasing content, and how article, section, and nav group elements.
Learn how to nest HTML elements by placing other elements inside a container such as an article, and use headings and paragraphs to structure self-contained content.
Identify which HTML elements cannot be nested, and use MDN to verify permitted content, including phrasing content for a and select with option and option group.
Explore how HTML container elements organize content, using section, article, div, header, nav, main, and footer, with accessibility considerations and practical examples.
Explore HTML attributes with a focus on class and id, their uses for CSS styling and JavaScript targeting, including how to apply multiple classes and the uniqueness of IDs.
Add images to your HTML project using the img tag with src and alt attributes, set the HTML language with lang, and preview in the browser; later resize with CSS.
Describe the purpose of semantic HTML by focusing on meaning over appearance. Use elements like em and i to convey emphasis and language, and improve accessibility for screen readers.
Learn to add document level annotations to HTML to set the page title, declare UTF-8 and viewport meta tags, and link a CSS file like style.css to style the page.
Explore why the Mozilla Developer Network is the best up-to-date resource for HTML and CSS, with comprehensive references like the paragraph element and reliable guidance.
Master CSS selector syntax to target elements with element, class, and id selectors, and learn how inheritance and specificity affect colour and styling.
Discover how CSS colors are represented using RGB, hexadecimal, and HSL formats, including named colors, alpha channels with RGBA/HSLA, and how these formats influence design and performance.
Explore how to use colors in css, including named colors, rgb, and hsl, and apply them to text, backgrounds, and borders with hex and rgba/hsla values.
Learn to set up and style a simple html page by linking the css file and applying a system font stack. Improve readability with color #002244 and 150% line-height.
Discover which CSS properties aren’t inherited by default—layout properties like margins, paddings, widths, and heights, plus borders and backgrounds—and learn when to use or avoid inheritance.
Explore the css box model, detailing content, padding, border, and margin, how width and height define content while padding adds space, and how the border-box model changes sizing.
Explore CSS units such as px, percentages, em, rem, and viewport units (vh, vw) and how rem stays fixed to root font size while em adapts to current font size.
Apply box-sizing border-box, then center the main content with a max-width of 35 rem and auto margins, and restrict images to the container with max-width 100%.
Discover how CSS specificity determines which declarations apply using selector weights, inline styles, and the !important flag, with examples of type, class, and ID selectors.
Learn the BEM CSS methodology—block, element, and modifier naming—with single classes, no id or type selectors or inline styles, enabling reusable styles for forms and buttons.
Build a microblog with HTML and CSS, featuring a header, navigation, a post entry form, and an archive, while learning layout and design principles and Agile project management.
Learn to design a clean page structure by identifying header, main, and footer, and use article and section elements to create reusable, scalable layouts for a microblog.
Translate the microblog design into HTML, building a page with header, main, and footer, two sections for a form and recent posts using article, h2, and time elements.
Finish the header by adding a navbar brand with the logo and Microblog text, and build a navigation list with links using BEM naming for screen reader compatibility.
Explore how HTML forms send data using get and post methods, explain form elements like labels, inputs, and submit buttons, and illustrate how a Flask backend receives /entry submissions.
Implement and style HTML textareas in forms, using name, id, and a label for screen readers, group inputs with BEM classes, and post long content with a proper form method.
Create a footer with a content container and left and right sections, using two footer__column on the right and footer__item items. Include recent, calendar, about, and how this was made.
Add a font-family style to your page using Lato with sans-serif as a fallback. Download Lato from Google fonts if needed and refresh to apply the font.
Style microblog entries using CSS by applying classes, displaying the title and date inline, adjusting font sizes and colors, and adding spacing and separators for a clean blog page.
Learn to style a full-width footer with a centered content area, using CSS flexbox, dark background, white 12px text, and hover links for an accessible, multi-column layout.
Build a hello world app with Flask, routing / and /hello plus an HTML endpoint, while exploring MongoDB integration and setting up a Python virtual environment and development server.
Learn to use Python data structures in Jinja2 templates with Flask, including lists, dictionaries, and object attributes. Jinja2 syntax is similar to Python, but not Python, and pass via render_template.
Learn to use Jinja2 conditional statements in templates to display Apple or Microsoft products based on a user choice, with if, elif, else, and truthy or falsy booleans in Flask.
Learn to render dynamic HTML with Jinja2 by looping through lists and dictionaries in templates, using for and endfor to create bullet lists and apply simple conditionals.
Learn how to receive form data in Flask by handling post requests, accessing request.form, formatting dates with datetime, and rendering results on the same page using the home.html template.
Store new posts as (content, date) tuples in a list, pass entries to a Jinja2 template, and loop to display truncated content; restart loses data, while MongoDB migration is introduced.
Format entry dates by parsing strings with datetime.strptime and reformatting with strftime to %b %d for display in templates, while preserving time element accessibility and preparing to use MongoDB.
Compare SQL and NoSQL databases to understand their differences, then learn how MongoDB uses collections of JSON-like documents with a flexible schema.
Set up a free cloud MongoDB Atlas account, configure a shared cluster, whitelist your IP, and connect with MongoDB Compass to create a microblog database with an entries collection.
Create and manage a requirements.txt to pin manually installed Flask and pymongo[srv] dependencies within virtual environment, using pip freeze to capture versions and prevent breaking changes during deployment to render.com.
Deploy Flask apps with a platform as a service such as render.com or Heroku to make them publicly accessible, manage dependencies and backups, and simplify deployments.
Prepare your app for deployment by creating a requirements.txt with Flask, python-dotenv, pymongo, and gunicorn for render.com, and load the MongoDB URI from an environment variable via a .env file.
Deploy a Flask app to render.com by connecting GitHub, uploading app files, and configuring a web service with the MongoDB URI as an environment variable.
Discover how to define and reuse Jinja2 variables with the set keyword, compute num_todos in the template, and conditionally display messages and lists using these variables.
Learn how Jinja filters extend templates by using the pipe operator to call built-in filters like length and join, and know when to pass extra data with brackets.
Learn to use Jinja2 macros to improve reusability and reduce duplication by extracting todo list rendering into macros, importing macro files, and aliasing imports for clean templates.
Learn to write custom css for each Jinja template using inheritance in a simple Flask app, with inline style blocks and per-template decisions.
Learn how Jinja2 tests use the is keyword and the divisible_by test to implement FizzBuzz in a Flask template, with for loops and top-level conditional ordering.
Explore the Jinja environment and rendering context, distinguishing the global environment from the per-template rendering context, and learn how to pass data via render_template, context processors, and template filters.
Build a simple habit tracker app with date navigation and query string dates, add and complete habits, respect past days, and store completions in two MongoDB collections using forms.
Center the habit tracker within a 40 rem max width using static/css/main.css. Use flex for header alignment, hover transitions, and a clean column form.
Add a seven-day date navigator around today using a date_range function, datetime operations, and a for loop; enable navigation via url_for with isoformat dates and highlight the current date.
Build a Flask app that tracks habit completions by date using a defaultdict, stores completed habits per day through a /complete POST route, and renders them on the index page. Learn to implement the data flow with hidden form fields for date and habitName, and style the habit items so completed ones show a check mark.
Modularize a Flask app with blueprints by moving routes into routes.py, registering the blueprint in a create_app factory, and using blueprint-specific url_for for routes like habits.index.
Welcome to the Web Developer Bootcamp with Flask and Python! In this course, you'll learn how to build and deploy dynamic websites using Python, Flask, MongoDB, HTML, and CSS!
If you want to share your projects online and become a full stack web developer, you're in the right place! I will teach you the latest and most popular technologies, including Python 3.10, Flask, HTML 5, and CSS 3.
I won't teach you jQuery or Bootstrap since those are old technologies! Instead, I focus on giving you a solid HTML and CSS foundation, so that you can be truly independent, and build anything you want.
I'll help you write many real-world projects that test your skills and build your understanding. By the end of the course, you'll be able to design and code any feature on any website!
This course beats attending any live bootcamp or workshop because I've put hundreds of hours into planning, recording, and editing. Plus you get lifetime access, and I provide outstanding support—I answer dozens of questions every day!
Why learn Flask?
Flask is a microframework for web development, written in Python.
It's lightweight and simple, so you can start using it straight away. As you go through the course and learn more about it, you'll realize it's also really powerful!
Flask provides everything we need for building websites: a good way to organize our apps, helpers for user authentication, a large selection of plugins and extensions to do dozens of other things, and much more!
What you'll learn!
Here's an overview of what you'll learn in this course:
A super-strong HTML 5 and CSS 3 foundation
How to plan your software projects and make them successful
Design websites using design software like Figma
Semantic HTML, and how to code in HTML like a professional
Build backend applications with Flask and Python
Make your HTML websites dynamic with Flask and Jinja2
Become a CSS professional: learn about flex, grid, CSS animations, and much more
Store and retrieve data with MongoDB on the Cloud
Deploy your web applications (using both free and paid solutions)
Implement user authentication on your Python and Flask websites
Much, much more!
But most importantly, learn to code from a professional software developer, and like a professional software developer
I won't cover JavaScript in detail, but that's because you just don't need it! With HTML, CSS, and a backend (written with Flask and Python) you can do almost anything your users want. Later on, you can always learn JavaScript for extra functionality. Trying to learn JavaScript and Python together leads to problems, and everything becomes a bit more difficult than it has to be.
If you already know a little bit about programming (with Python or any other language), you're ready to start this course! Also, I've included a complete Python Refresher section to help you get up to speed with Python if you don't know it well already.
Other students are loving the course!
"Jose is a Master of the Art of Programming. This course is truly underrated. He goes straight to the point, yet flesh out all the Gotchas. Introduces current best practices in Web dev. An easy 5 for this course!" - Olayemi Akinsanya
"Great course, learned loads, really great for OOP and for web development. Really fun, can't wait to start my own projects now!" - Joshua Shallow
"A well organized and very useful course! Thank you, Jose!" - Leonid Bushman
Feel free to look through the preview videos of this course to see if it's a good fit for you!
Remember I offer a 30-day money-back guarantee, so you can join me for an entire month, risk-free, and decide whether to keep going or not.
I'll see you on the inside!
Jose Salvatierra