Hi! I’m Matt Layman.
I am a Senior Staff Software Engineer at Included Health.
I like to teach others about writing good software while streaming on YouTube and am committed to helping my local community grow its tech skills by volunteering as a meetup organizer for Python Frederick.
Want to learn Django from top to bottom?
Understand Django will walk you through the Django web framework. We start from the top at an exploration of the browser and the layers that make the internet work, then dig deep down through the framework to reveal how you can make web applications using Django.
By the time you finish reading this book, you'll have a much deeper knowledge of how web applications work and, specifically, how Python-based web applications are built.
You can read the book online for free, right now. Prefer your own copy? You can buy an e-book or physical book today.
Recent Articles
Recent Videos
Everything
All Articles
- Layman's Guide to Python Built-in Functions
- Fun With Scrapy Link Validation on CI
- Python, Markdown, and Tailwind: Best Buds!
- Announcing luatest: A Lua test runner inspired by pytest
- Locking Down Your Users' Secrets: Django Sessions 101
- Sync or Async? Unpacking the Mysteries of Django Signals
- Time Travel with django-simple-history
- Learn Django or Ruby on Rails?
- Episode 17 - Accepting Files
- Distributed System IDs
- Brute Force Development
- Huge Software Systems
- Finding Your Audience for Technical Docs
- Authz dilemmas
- Announcing django-denied
- Debugging Tips And Techniques
- Lua Log #9: HTTP Parser
- Lua Log #8: HTTP Parsing
- Security And Django
- Lua Log #7: Routing Requests
- Lua Log #6: LASGI - ASGI in Lua
- Lua Log #5: Callbacks to Coroutines
- Episode 16 - Setting Your Sites
- Lua Log #4: Build a (Terrible) Package
- Lua Log #3: Logging Without Logging
- Lua Log #2: Yak Shaving the Ecosystem
- Go Fast With Django
- Lua Log #1: Event Loop Adventures
- Most Abstract Function First Is Better
- Goals for 2022
- Command Your App
- User File Use
- Episode 15 - User Session Data
- Team Topologies: a review
- Episode 14 - Going Live
- Making Sense Of Settings
- Episode 13 - Does My Site Work?
- Per-visitor Data With Sessions
- Deploy A Site Live
- Test Your Apps
- Episode 12 - Success With Static Files
- How To Use Htmx In Django
- Are Django and Flask Similar?
- Which Django Version Should I Use?
- Episode 11 - Here, There, Middleware
- Serving Static Files
- Middleware Do You Go?
- How To Set Up Tailwind CSS In Django On Heroku
- Episode 10 - User Auth
- Make A Hugo Static Blog Inside A Django App
- User Authentication
- Episode 9 - Application Examination
- Hijack To Help Customers
- Anatomy Of An Application
- From Concept To Live In Two Weeks With Django
- Episode 8 - Administering Your App
- Administer All The Things
- Episode 7 - Models and Managers and Querysets, Oh My!
- Django Testing Toolbox
- Episode 6 - Where Does the Data Go?
- Store Data With Models
- Episode 5 - How To Use Forms
- User Interaction With Forms
- Vim 101: Basics of the Vim Text Editor
- Episode 4 - Building User Interfaces
- Templates For User Interfaces
- Episode 3 - Views On Django
- Views On Views
- Django Riffs, a podcast for learning Django
- Episode 2 - Enter With URLs
- Episode 1 - Get To Know Django
- URLs Lead The Way
- Serverless Python And Why You Should Try It Out
- From Browser To Django
- A Failed SaaS Postmortem
- Python Tears Through Mass Spectrometry Data
- Godot You Want To Make A Videogame
- Publish to DEV automatically with GitHub Actions
- Python alternative to Docker
- Python Testing 201 with pytest
- Quick and dirty mock service with Starlette
- On Patreon
- Using Git and GitHub to safely store your code
- Supercharging Vim: Blazing fast search and global replace
- Strategy for developer weight loss
- Teaching a kid to code with Pygame Zero
- Completing Account Deactivation on Building SaaS
- Supercharging Vim: Navigate files instantly
- Python Testing 101 with pytest
- Ansible Cranked to 11
- Building SaaS in January
- The Sleepy Developer: How Sleep Affects Your Code
- Local web development vs Vagrant vs Docker: What’s right for you?
- Django Tutorial Adventure Part 2
- Deciphering Python: How to use Abstract Syntax Trees (AST) to understand code
- Building SaaS with Python on Twitch
- Build Native Mobile Apps with Python (BeeWare)
- Consistent Python code with Black
- A tale of two site generators
- New Job: Doctor on Demand
- Full Health Developer Launch
- RFNM - Request For New Maintainer
- Developer Health Survey
- Doing code review
- Data science in Python
- Supercharging Vim: Instant testing
- Supercharging Vim: Using plugins
- Scraping the web with Scrapy
- Web frameworks shootout
- A NES for Christmas
- Pipfile and pipenv
- HTTPS made simple with Netlify
- No nitpicking in code reviews
- Using Pipfile for fun and profit
- Feature flags and waffles
- Pythonic code: leveraging packages
- Aphantasia
- Pythonic code: using the standard library
- Pythonic code: built-in functions
- Pythonic code: the property decorator
- Pythonic code: the with statement
- Pythonic code: the list comprehension
- Semantic UI in Ember
- The Pragmatic Programmer revisited
- 12-factor Django apps
- Open Graph, X cards, and plugins... Oh My!
- Cure for Imposter Syndrome
- PostgreSQL text search in Django
- Rollbar monitoring of Celery in a Django app
- A currentUser service for Ember with JWT
- The necessity of software abstraction
- 2 Critical Python packaging tools
- Sideload JSON API resources in Django
- Monitor Ember app errors with Rollbar
- handroll, sitemaps, and robots.txt
- Using Segment with Ember.js
- Using Brunch for JavaScript work
- Reading through the Python standard library
- Ship your requirements.txt
- We're all ambidextrous
- dotfiles: Hone your software tools
- Highlighting new file formats with Pygments
- Extending handroll for fun
- Oh, my shell? Oh My Zsh
- Inject JavaScript with PhantomJS to inspect websites
- Connect Python objects to blinker signals
- Toying with Statsd and Graphite
- A complete guide to i18n in Python
- A "simple" D3.js area chart
- Laziness is motivating
- handroll 1.1 released
- handroll: a simple website generator
- tappity tap TAP tappy
- Advanced Rails
- Patterns of Enterprise Application Architecture
- Test your packaging
- MarkWiki 1.3 released
- Ruby on Rails Tutorial
- Dreaming in code
- MarkWiki 1.2 released... now actually somewhat useful
- Java: a bad choice for FOSS
- ØMQ: A dynamic book with surprises
- Office Zen
- When you're feeling all TAPped out
- A Layman's walk through Code
- Should you cp from copywriters?
- It's fun -> ok!
- New website and server
- Java, Eclipse, and Maven altogether
- Pretty Perl and maintainability
- JavaScript has “Good Parts”!? Yes, it does.
- Perl Testing: A Developer’s Notebook
- Into the rabbit hole
- Code cleanup with Pylint
- Test Driven Development woes
- print 'Hello World!'
All Videos
- Bootstrap Kamal On Droplet - Building SaaS #209.1
- Docker Image For Kamal - Building SaaS #209.2
- Postgres To SQLite - Building SaaS #209.3
- 1Password and DigitalOcean Droplet - Building SaaS #208
- UV and Ruff: Next-gen Python Tooling
- Huey Background Worker - Building SaaS #207
- Heroku To DigitalOcean - Building SaaS #206
- Deploy Your Own Web App With Kamal 2
- Epic Debugging, Hilarious Outcome - Building SaaS #205
- Postgres to SQLite - Building SaaS #204
- Docker Go, JS, Static Files - Building SaaS #203
- Cloud Migration Beginning - Building SaaS #202
- Kamal On A Droplet - Building SaaS #201
- Kamal - Building SaaS #200
- No Frills, Just Go: Standard Library Only Web Apps
- Golang Middleware and DBs - Building SaaS #199
- More Go Standard Library - Building SaaS #198
- PDF Text Extraction With Python
- Go Standard Library App - Building SaaS #197
- Go Standard Library App - Building SaaS #197.2
- Go Standard Library App - Building SaaS #197.3
- Go Standard Library App - Building SaaS #197.4
- An Opinionated Introduction to CI/CD
- Activation Email Job - Building SaaS #196
- Trial Banner Inclusion Tag - Building SaaS #195
- Password Resets and Signal Handling - Building SaaS #194
- Boosting AI with Python: Using Click, Jinja2, and GPT Libraries
- Polish, Debug Toolbar, Email Signals - Building SaaS #193
- About, FAQ, and Home Page - Building SaaS #192
- Export Journal Feature - Building SaaS #191
- Settings and Billing Portal - Building SaaS #190
- Importing Content - Building SaaS #189
- Why Django and why not Flask?
- Flash messages and content encodings - Building SaaS #188
- NATS: Connecting Apps Over a Network Easily
- Start Polishing - Building SaaS #187
- Post-launch Punchlist - Building SaaS #186
- Do It Live - Building SaaS #185
- Final Pre-live Features - Building SaaS #184
- Finish Stripe Integration - Building SaaS #183
- Algorithmic Art with Python
- Stripe Checkout - Building SaaS #182
- Payments Gateway - Building SaaS #181
- Design and Stripe - Building SaaS #180
- Legal and Stripe - Building SaaS #179
- Sign Up - Building SaaS #178
- Tailwind CSS on Python and Heroku - Building SaaS
- WhiteNoise For Static Files - Building SaaS
- Operations, WhiteNoise, and Tailwind - Building SaaS #177
- Saturday stream explorer
- Switch an Existing Python Project To Ruff
- Message Parsing and Ruff - Building SaaS #176
- Parse Inbound Email - Building SaaS #175
- Idempotent Jobs - Building SaaS #174
- Email Round Trip - Building SaaS #173
- Practical AI: HuggingFace Transformers and Diffusers for Beginners
- DNS Strikes Back - Building SaaS #172
- Deploy to Heroku - Building SaaS #171
- SendGrid Inbound - Building SaaS #170
- SendGrid Outbound - Building SaaS #169
- Deployment Checklist - Building SaaS #168
- Practical Business Jinja
- Launch Preparation - Building SaaS #167
- Sentry Setup - Building SaaS #166
- Email Templates - Building SaaS #165
- Accounts and Email - Building SaaS #164
- First Major Model - Building SaaS #163
- Python + Upsolver: Simplified Realtime Data Workflows
- Finish Signup and CI - Building SaaS #162
- New SaaS Signup - Building SaaS #161
- New SaaS From Scratch - Building SaaS #160
- Python Exercises and Behind the Scenes - Building SaaS #159
- Python Exercism Exercises / Template Updates - Building SaaS #158
- Web Dev Panel Discussion
- Ellen's Alien Game / Display Related / Neovim config - Building SaaS #157
- Locomotive Engineer / New Model Field - Building SaaS #156
- Cater Waiter, Template Bugs, and Type Fixes - Building SaaS #155
- Inventory Management / Custom 404 page / Go gqlgen - Building SaaS #154
- Backend Development 101 with Django REST Framework
- Neovim setup / Tisbury Treasure Hunt / django-stubs - Building SaaS #153
- Gimme a (Type) Hint in Python
- Colossal Coaster and Stripe CSP - Building SaaS #152
- Learn Python By Example - Ghost Gobble Arcade Game
- Blackjack and Bugs - Building SaaS #151
- Learn Python By Example - Currency Exchange
- Development Cached Templates - Building SaaS #150
- Exercism and PDF Page Numbering - Building SaaS #149
- How To Add Sentry - Building SaaS #148
- Cryptography in Python
- Heroku Stack Upgrade - Building SaaS #147
- JavaScript FormData - Building SaaS #146
- Customer Features - Building SaaS #145
- Delete Task UX - Building SaaS #144
- flake8-bugbear - Building SaaS #143
- Finish Teacher Checklist - Building SaaS #142
- Teacher Checklist Editing - Building SaaS #141
- Extract a New Open Source Package - Building SaaS #140
- Teacher Checklist Model - Building SaaS #139
- Teacher Checklist Template - Building SaaS #138
- Refactoring and New Features - Building SaaS #137
- New App In Project - Building SaaS #136
- You Don't Need JavaScript
- Brew Install The World - Building SaaS #135
- User Requests - Building SaaS #134
- S3 FileField - Building SaaS #133
- Great Expectations Data Quality Testing
- PDF Courses Report - Building SaaS #132
- PDF Attendance Report - Building SaaS #131
- PDF Progress Report - Building SaaS #130
- PDF Debugging - Building SaaS #129
- Form Features and CSS - Building SaaS #128
- Upgrade to Tailwind CSS v3 - Building SaaS #127
- Admin Interface For PDFs - Building SaaS #126
- Ordering Existing Models - Building SaaS #125
- Zip Archive HTTP Response - Building SaaS #124
- PDF Bundle Report - Building SaaS #123
- Customer UX Feature - Building SaaS #122
- Threat Modeling Jurassic Park with Python
- Customer Requests - Building SaaS #121
- Scheduling Bugs - Building SaaS #120
- Working With django-htmx - Building SaaS #119
- Bulk Delete Template - Building SaaS #118
- Pandas for Data Analysis
- Bulk Delete Form - Building SaaS #117
- Bulk Delete View - Building SaaS #116
- Finish School Break Filtering - Building SaaS #115
- Student Filtering UI - Building SaaS #114
- School Break Filters - Building SaaS #113
- UX Polish - Building SaaS #90
- Customer Feature - Building SaaS #89
- Customer Requests - Building SaaS #88
- Squashing Bugs - Building SaaS #87
- Testing Email Designs - Building SaaS #86
- Customer Docs - Building SaaS #85
- Refactoring Enrollment - Building SaaS #84
- Empty States - Building SaaS #83
- Customer Feedback - Building SaaS #82
- Finishing Onboarding - Building SaaS #81
- Reordering Models - Building SaaS #80
- WhiteNoise Shenanigans - Building SaaS #79
- Create A Form Template - Building SaaS #78
- Sending Invites - Building SaaS #77
- Capped Social Network - Building SaaS #76
- Make A Landing Page - Building SaaS #75
- Check Web App Security With Bandit - Building SaaS #74
- Dynamically Regrouping QuerySets In Templates - Building SaaS #73
- Displaying Breaks - Building SaaS #72
- Custom Form Validation - Building SaaS #71
- Predicting The Future - Building SaaS #70
- Polishing and Usability - Building SaaS #69
- Rendering Calendars - Building SaaS #68
- Give Me A Break... Day - Building SaaS #67
- Docs, Bugs, and Reports - Building SaaS #66
- Handle Default Values - Building SaaS #65
- Enrolling Students - Building SaaS #64
- The Home Stretch - Building SaaS #63
- Hackathon App Part 2 - Building SaaS #62
- Hackathon App - Building SaaS #61
- A View From Start To Finish - Building SaaS #60
- Designing A View - Building SaaS #59
- Bread and Butter Django - Building SaaS #58
- Switch A Django Project To Use Pytest - Building SaaS #57
- How To Fix A Bug - Building SaaS #56
- Remodeling Data Relationships - Building SaaS #55
- User Testing Feedback - Building SaaS #54
- More Onboarding Goodness - Building SaaS #53
- Consistent Onboarding - Building SaaS #52
- Onboarding Forms - Building SaaS #51
- Onboarding Continuity - Building SaaS #50
- Starting the Onboarding Flow - Building SaaS #49
- Onboarding - Building SaaS #48
- How To Style Sign Up - Building SaaS #47
- A Week At A Time - Building SaaS #46
- Templates and Logic - Building SaaS #45
- Fast Forms With UpdateView - Building SaaS #44
- Use Tailwind On A Template - Building SaaS #43
- Add Styles To Templates - Building SaaS #42
- User Accounts With django-allauth - Building SaaS #41
- Make A Custom User Model - Building SaaS #40
- django-environ and django-debug-toolbar - Building SaaS #39
- New Project, Who Dis? - Building SaaS #38
- Lessons From A Failed SaaS - Building SaaS #37
- Configurama - Building SaaS #36
- Deploying WhiteNoise - Building SaaS #35
- Bring in the WhiteNoise, Bring in Da Funk - Building SaaS #34
- Get Out, Git! - Building SaaS #33
- wal-e Postgres Backups - Building SaaS #32
- Celery In A Shiv App - Building SaaS #31
- Ripping Out Node.js - Building SaaS #30
- Add Static Assets to Deployment - Building SaaS #29
- Webpack and collectstatic in CI - Building SaaS #28
- Plug the Shiv App Into Nginx - Building SaaS #27
- Connecting Shiv Apps with Ansible - Building SaaS #26
- It's Permissions, Dummy! - Building SaaS #25
- In the Guts of a Shiv App - Building SaaS #24
- It's Alive! A Django Shiv app - Building SaaS #23
- Upload to S3 with CircleCI orbs - Building SaaS #22
- Shiv zipapps and CI - Building SaaS #21
- Making a Shiv App - Building SaaS #20
- Pip-tools and App Packaging - Building SaaS #19
- Completing Account Deactivation - Building SaaS #18
- Canceling Stripe Subscriptions - Building SaaS #17
- Feature Flags in Action - Building SaaS #16
- Feature Flags with Django Waffle - Building SaaS #15
- Ansible Cranked to 11 - Building SaaS #14
- Deploying with Ansible - Building SaaS #13
- Automation aides - Building SaaS #12
- Semi-automated tasks - Building SaaS #11
- Admin dashboards - Building SaaS #10
- Finishing third party integration - Building SaaS #9
- Connecting third party services - Building SaaS #8
- Displaying third party data - Building SaaS #7
- Third party integration modeling - Building SaaS #6
- Updating data models - Building SaaS #5
- Using a background scheduler - Building SaaS #4
- Multiple Stripe plans - Building SaaS #3
- Reporting scraped data - Building SaaS #2
- Building SaaS with Python and Django #1