Transcript: Django for Professionals - Book Release
Hi and welcome to another episode of Django Chat. I'm Carlton Gibson. I'm joined as ever
by Will Vincent. Hi Will. Hi Carlton. Hello. How are you doing? I'm good. So today's special
episode week for me, I just released my new book, Django for Professionals, which I've
been working on for over a year. And so I thought in this episode, we're going to talk
about what makes a website production ready in Django and what's that leap from, you know,
the defaults you have when you spin up Django with SQLite
and all these other nice things to, like, a real website
you would deploy to thousands or millions of people.
Because this is the step you're covering in the book, right?
Your first two books, Django for Beginners, Django for APIs.
Yeah, so it's sort of like beginner, intermediate, advanced.
This is, like, modern, up-to-date, very cutting-edge techniques
that Django developers are using on the biggest sites in the world
and sharing it with everyone.
That sounds very exciting.
Yeah, I mean, it's the book I would...
All three books I wish existed when I was learning Django.
And I especially wish this book existed because having done this for several years now and
talking to lots of developers, there's just a huge gap between, as I said, you know, spinning
up a simple blog and something that you would do in a professional setting.
And there's just no good resources out there.
And having spent a year banging my head on this, I kind of understand why that's a challenge.
But we can talk through, you know, what those things are that make something production
ready and kind of where, I mean, because you can go up to certain things and say, okay,
this everyone agrees that these are steps you should take and then it goes into the realm of
purely subjective and hyper complex and so in the book i go right up to that point and then i discuss
options but i don't you know there are some things that are sort of philosophical debates around
web design in general and you know django itself can't solve those right and different deployment
plans you might take one you might take another it's not necessarily right it's right for you
in the book we deploy with containers which is very new and sexy uh in part because i wanted
to show it in part because it's easier but also i talk a lot about deployment but it's not a book
on deployment i mean you could have you could have a 500 page book on just you know deployment for
one platform provider let alone the dozens that are out there so i had to draw the line in some
places you've got the amazon docs you've got the microsoft azure docs it's like you know they're
big um anyway well yeah and and one of the one of the things i mean so in the book we you build
you use docker you build an online bookstore with payments and a whole bunch of other goodies we'll
we'll go through but we deploy with heroku partly because i think it's one of the easiest ones out
there but even heroku i mean it took me quite a while to sort out the docs on containers we use
stripe we use sendgrid and you know these third-party platforms it's hard to figure out
how to use them i don't quite understand why they can't have a basic guide for all the you know five
six major web frameworks out there but for whatever reasons they can't but is that because they're
pushing forward and like so the docker deployments are some uh somewhat new and so they just haven't
had the time to backfill the documentation i don't i'm not sure i mean so let me let me pick
on stripes light because i love stripe as a company i think it's the best payment processor
out there but so stripe is rolling out a brand new um so we use checkout in the book they're
rolling out a brand new api which is not fully documented yet and i know this because um i have
some friends who work on checkout there who i complain to saying hey i'm having trouble with
this. And I've written official Stripe tutorials for Meteor and for other platforms. So I mean,
I know how Stripe works. And I'm struggling with this. And I keep saying, like, you should just
have a basic guide that's up to date, pick one engineer, like, you know, one hour a week,
and just go Rails, Django, Express, I don't know, PHP flavor. And even if it's and just show how to
do a basic implementation. And I think it's a combination of Yeah, they're pushing forward,
constantly changing things i think they feel if they do an official guide there's just too many
layers of i think bureaucracy honestly um but is it i don't know but it's an opportunity for me as
a teacher to to wade through it but it is one of the challenges of this book is that a modern
django stack has a lot more than django in it and so i found myself repeatedly fighting with non
django things um docker would be an example and i want to use it and show how to do it but it's
not a book on these other things. So I think when people read the book, it will probably seem like,
well, what's the big deal with Docker? Because I, for example, like or Stripe, like I make it
as simple as can be and yet accurate. But it took me a ton of work to figure out how to do that
because these are kind of untested things in a way. I mean, Stripe is literally changing its API.
I mean, Docker, there's so many different ways that experts do it. So ultimately, I had to pick
one and then really understand how it all fits together to try to make it simple because it's
not a book on docker it's a book on django and but docker is always constantly evolving still
it's still quite yeah it's a million lines you know so i learned it and then a year later i come
back and it's like all the all the the the command invocations i learned for mounting volumes they've
all changed now it's not volumes it's mounts it's because you carlton yeah you know that yeah i mean
it's not as bad as like react or something but it's uh yeah it's ever-changing and i mean the
big issue with docker i mean so we use docker in the book because you can have a containers which
I speak about. So you can have an isolated operating environment. And that is good for
your development. That's good if you're working on teams. That's good for pushing to production.
I think this is a new thing that will become more and more common where the containers that you use
locally, you push those up into production. That actually makes it easier to switch platforms if
need be. You don't get locked into a certain platform provider. But it's all new. And
And specifically with Django, there's issues around when you're working with software packages,
if you use pip or pipenv.
So we use pipenv in the book and you have lock files.
And you basically have this tension between, am I working locally or within Docker?
And anyways, in the book, I'm very pleased with how it turned out.
But it was probably a solid four months journey for me to iron out the Docker parts.
But it's important because that's what most developers are using these days.
They are using Docker, but they're doing it in, not everyone is doing it this way.
Many are, but it's not a, there isn't a canonical guide to it.
So I sort of had to wade through that river myself.
You're kind of documenting the landscape beyond the bleeding edge, right?
You're right there.
Well, because if you ever look at, you know,
there are some open source Django projects out there that use Docker
and it's like being dropped into like a hundred year war.
There's just like so much code and so many decisions.
And, you know, I find it overwhelming.
So in this book, we just go step by step and we build up all the things that you need.
and that's a lot of work to do. And I think also a lot of people don't do that because most people
don't have the luxury of starting a big project from scratch. Maybe if you're a consultancy,
even then I think it's rare. So most people aren't, you know, user registration, for example,
like I spend a lot of time on this because I do build a lot of new projects, but most people
don't. You know, you airdrop into a project, you start something and barrel through, and then you
kind of are in the mud and mire. But if you had a clean slate, how would you do that? So that's
example, one of the chapters we talk about using custom user models, but we also talk about abstract
user, abstract base user, customizing all the templates using Django AllAuth. So the first half
of the book is really standard steps that you would use in any new project. So configuring static
files, environment variables, that's basically going to be the same in any project. And then the
second half, we focus on the bookstore. But again, we focus on things that are meant to be universal.
so we talk about permissions we talk about search payments file image uploads security performance
testing and these are all the hard bits right these go beyond the tutorials these go beyond
you got to create these stuff yourself so that's kind of cool yeah and i mean you know we joke that
the tagline for this podcast should be it depends because i think we both find it frustrating when
someone says it depends you know especially engineers and you know so in this book i really
didn't want to just throw my hands up and say it depends i really wanted to take an opinionated
make opinionated choices, but back them up and say, you know, I feel confident saying this is
something that this is a Django best practice. And then if we get to a certain point, say, OK,
now here's where there's a diversity of opinions. Here's what they are. I'm going to give you mine
and show you that. But trying to draw that line of, you know, where where is it more my opinion
versus the community's opinion? Yeah. And showing showing a way of doing it whilst acknowledging
it's not the one true way it's it's perfectly reasonable right right right so yeah so that
was some of the challenges of this book i mean the first couple books the first couple
two books didn't take this long to write but um i'll probably write a blog post on things i've
learned when i've had a couple weeks to settle on this but i think yeah writing an advanced book is
a lot a lot harder because it's you know more figuring out the technology and also just more
and more you're bumping against these um debates within the community on how to do things so it's
not settled i mean one of the the i call it a meme i don't know if it's a meme um but one of
these ideas that comes back again and again is that you need to use um concert you need to be
somewhat conservative in your technology choices because otherwise you're spending too much time
thrashing about what's on you but deployment is still an unsettled project and all the practices
about how you get your static files in the right place and exactly how you serve them um what did
you choose there by the way for deployment yeah no no for static files just what it's in my head
because there are a few different well so we so we we configure it properly which you know creating
the directories. We configure media files. We use white noise. But yeah, that's another example of
we're just jumping all over the place, but that's fine. So let's say you've used Docker,
you set things up, then within Docker, you can create a separate production environment within
Docker, which you need to if you go through Django has this fantastic deployment checklist.
So even if you're using a production database like Postgres, beyond debug, there's a whole
list of things you need to fiddle with to be secure when you go online. I mean, we've talked
about this in some of the other podcasts. We need to harden the admin. Set the security headers,
which we talked about. We talked about on a previous episode. Yep. HTTP strict transport
security, secure cookies, forcing SSL, click jacking. There's a whole list of things that
if you haven't done before, you really should do. But again, there's an 80-20 on everything,
especially with deployments and security. I mean, you can spend all your time on this stuff. And
at some point you have diminishing returns and yet there is like some bare minimum things you
absolutely should do you know allowed hosts for example so so we cover the 80 20 and then i talk
about and here's where you can go nuts on it but uh there's always more to do and so i tried to
pass along at least what i think is good judgment and how you spend your time and how do you
get as what the bare minimum and then be aware of here are the next steps to take there is a
a minimum as well though because um there are automated um bots automated scripts out there
that are checking every every available port on every ip they can find on the internet for known
weaknesses so if you don't get over the baseline it's not a question that of if your application
is hacked it's just when it's hacked so there is a minimum bar you have to get that far and then
you know depending on your threat model you might need to go further right i mean and i would say
you got to turn the bug off. You got to have SSL. You should change your admin URL. That's
the top three, if I would say. But there's a bunch more. And again, Django has this deployment
checklist. But I think the challenge is actually more configuring how you have two different local
environments. So this is where environment variables come in, which we use. Because
before Docker, it was a lot harder to test your production environment, not in production.
like there's jokes about like, yeah, I'll just toss it on production and do it, you know, do it
live. Docker makes that a lot easier where you can actually, within a container, have these production
settings, run these things, check them. You know, you could do it on a staging server. You probably
should as well. But to be able to do it locally, it's just fantastic, actually, that you can use
a Docker. So we go through that in the book. But it's a lot to keep in your head. You know,
you have local databases, production databases, you have local environments, production environments,
And that goes across the board with all these settings.
You know, you want different things locally because you want to be fast
and you don't want to have all this security stuff.
But in production, you do want to switch things around.
I mean, the server, right?
The default Django server, you don't want to deploy with that.
You want to use Unicorn or UWSGI.
Yeah, so what did you choose there?
You've chosen Green Unicorn, Gunnicorn, whichever.
Yeah, am I saying Gunnicorn?
I never know how you say any of these things.
I heard it called Green Unicorn at DjangoCon Europe.
And I was like, Green Unicorn?
And I try to explain this sometimes.
I'll casually mention it to my wife or someone non-technical.
And they're like, what?
I'm like, Django Ponies and G-Unicorn.
And they're like, what are you doing?
So, yeah.
So you choose.
I use G-Unicorn just because.
Well, actually, no, I gave thought to this.
I've used it myself in projects.
And also, it is a little bit simpler to set up.
U-Whiskey has more configuration options.
So I think if you need it, you might want U-Whiskey.
but as a default and certainly as a teaching tool,
G-Unicorn is the approach I chose.
Yeah, and as well, like there's something in,
I heard, so talking about naming,
I heard U-Whiskey, I've always called it U-Whiskey.
I heard someone call it Micro-Whiskey,
the general economy of Europe as well.
Oh, is that a different thing?
Well, it could be like the Greek letter there,
whichever one that is.
I never know these things.
I thought you were the classics major, Carl.
Yeah, no, philosophy.
I sort of do classics on the part-time.
That's my sort of hobby.
I'm learning ancient Greek
so it can be an old man and replay to in the original but um that's a that's for another
podcast um what was i going to say i was going to say something really great there oh yeah so in the
uh you whiskey docs it says this is great if you're building a whole like a hosting platform
or something right it's deliberately more complicated because it's for you know if you
want to be able to provide a hosted environment for people to put their django apps in then you
know you whiskey perfect but if you're deploying your own app you don't need any of that so gone
becomes a lot simpler, as you say. Right. And that, you know, that's just one example of many,
which I think, again, is why, because I sometimes think, why did it take me so long to write this
book? Because I'm a pretty fast writer. I know what I'm doing, largely speaking, with Django.
And I think it was because there's so many decisions just like that. I mean, dozens and
dozens of micro decisions where I have to think about it and then explain it. And I, you know,
I usually I pick one and I explain the differences because I want to be, you know, in some ways I was
trying to cram everything into this book. And it's a long book. I mean, it's almost 400 pages.
but it's still, there's a lot I just took out eventually
because I just couldn't fit it all in
and, you know, I'll get to it in other ways.
I mean, one of the sections I'm most pleased with
actually is the permissions area
because permissions is, I think the ORM and permissions
are, I would say, the two things that advanced developers
or professional developers spend a ton of time on,
but there's not, especially permissions,
there's not a lot of good educational resources,
really any, that I've seen out there.
And yet the ability to create groups, to set permissions on a form or on an action.
So in the book, we set permissions for people who can see all the books and you could change
this to be individual books.
And then when a payment goes through, we put in the view, I was really pleased with how
elegant I made this code.
As part of that action of the payment, you flip the permission on the user.
And so I spent a lot of time trying to figure out how to make that clean.
And I haven't seen it done before.
Yeah, no, I think you're right that there aren't guides.
I mean, people, quite often there are issues on the developer mailing list or on the track about confusions around the permission system.
And, you know, it's quite powerful.
With all this, I think, again, yeah, people get dropped into these code bases.
And you don't have the chance or the opportunity to learn or to build it up.
So we build it up and we talk about when do groups make sense, you know, how you handle permissions, because at a minimum on most sites, you're going to have some at least three levels.
Probably you're going to have your admin, your super users.
You're going to have, you know, in a newspaper example, the editor who can do more things and then maybe a writer.
So at least three permissions.
You know, another example would be like if you had a university, you'd have teachers and students.
They'd have different permissions.
but this crops up right away and is very yeah it's hard to hard to think about and if you
are architecting and building this out and you get it wrong it's a lot more work to backfill it than
to get it right the first time yeah and again like this that's exactly right when you're talking
about anything security related it's it's it's very important to just take the extra time to
measure twice and cut once because you can't afford a mistake you like right but how do you
And how do you learn that you know, this book I think will really help people really you
learn it through pain and making the mistake.
on the job and that's um you know embeds the learning but is not not the best way to do it
um i'm trying no but to do it in a sandbox environment is perfectly good and safe and
it's a good learning experience but to do it on a production environment it's like wow hang on that
was my that was my business yeah and i mean and again this is maybe it's top of mind because i've
gotten a number of emails just this week from people who who read my books and have said hey
i have a new job and i'm in this new code base and ah you know and that's i tell them like that
that's how it is for me too you know i mean it's just that's how it is for anyone and in those
environments you need to well hopefully there's someone there who can tee up some you just how
do you eat an elephant it's like one bite at a time right like find some smaller things like
don't have some big integration you know testing thing that they just toss at you you know find
some small stuff like it's going to take a month at least to wrap your head around it and even then
And, you know, a lot of times on these big sites, you know, there's areas where you just kind of go like, oh, like, I hope I don't have to touch that.
You know, you're not going to you're not going to be responsible for everything.
There's areas like that on every big site.
That's somebody wrote it.
There's some places where I'm like, oh, I don't you know, if you work on it for a year or two, you're like, oh, I just don't want to touch that.
That's why you have confidence.
What else?
Oh, so search.
So this is this is something actually my talk at DjangoCon in September is going to be on search.
So I wanted to include search in the book, but figuring out how to how to do that, because search is infinitely complex.
And most people just jump right to using Elastic or, you know, these solar, these full throttled solutions with no buildup of how do you do it.
And so I'm really pleased with the chapter where we we add search because you want it in almost every site.
We talk about forms, we talk about filtering, and just layering on the complexity, then you can build in Postgres built in support, then you can get to, you know, Elastic, if you need it, you can do hosted solutions. But just doing a step by step solution, because, you know, search to if you're using, you know, let's take Elastic locally, you have to spin up another server or container, like it's very non trivial to get that going. And most people just drop into that they don't have a chance to build it up and think about like, well, how is it
really work and really it's a form and a filter and you're passing the data back and forth and
if you go step by step you know just for me with my understanding i've spent quite a bit of time
with search on various sites but having to go through it to teach it myself really helped me
and i think it'll help others understand what's going on there because it's it gets complicated
fast with like you know weights and you know all these things but fundamentally it's you know user
input and a filter of some kind yeah and like as well that the if you can get away without jumping
all the way to elastic search or whatever it's it's worth doing because there's a maintenance
overhead to that to run an elastic search cluster stably in production is actually difficult that
you know people have a full-time job doing just that teams have full-time jobs doing that yeah
especially on e-commerce sites well and we had uh simon willison was on uh recently and on his
personal site. I mean, he's got a fairly basic implementation and it works just fine. And I
think that's another thing I want to get across is it's okay to have basic implementations if
they work. That's quite elegant. I mean, Jacob Kaplan-Moss gave a talk at PyCon this year on
static files and talking about you don't need to jump right to a CDN right away. You know,
there is value in the basics and getting those right. And yeah, and even with, you know, just
to go back to search, though, I mean, I see I did a bunch of research and it's implemented a lot of
different ways you know you can you can do it as a post request you can do it as a get request
you know you can do it with function-based views that are just 50 lines long you can do it with
a class-based view as i do in the book where it's like three or four lines you just update
and get context data so um i always strive just just in my own code and certainly when i'm teaching
i want to explain it but if there is an elegant accurate way to do something i will go for that
every time yeah and what's nice is if you like the thing with the danger with the class-based
view is you just kind of fill in the the one class attribute that does the magic and you
don't understand exactly what's going on but if you build it up and told the story then that
understanding is great right and that's and that's partly and that is true that is the danger of
class-based views you're just you know turtles stacked on top of themselves and so you if you
just drop in and change one thing it does feel like magic but i do in the especially with the
user registration chapters of the book.
And actually, throughout, I'll say,
if I'm going to do some magic,
I'll say, hey, here's how I figured this out.
So, for example, like updating templates
with, you know, the email that new users get.
You know, I don't just jump to the file.
I say, okay, well, how do I know where this is?
How do I figure it out?
It's like, well, I literally, I copy-paste a part of it
and I go into, you know, the Django source code
and go, well, where is it?
It's like, oh, it's not there.
Oh, because it's part of Django AllAuth
because I'm using Django AllAuth.
yeah right and so now it's in django all off now i can see where it is and now i can see oh there's
a structure and now i can see the other templates and now when i told you how to create the template
directory structure in a certain way because django all off goes uses accounts versus django
uses registration so i actually spend quite a bit of time explaining how you figure this out
because i want to like teach people how to fish not just give it to them because i agree like
that is it doesn't help if i just give it to you with no context right and template loading is
is a moderately complicated topic people get confused about that and then how do i override
a template and how can i extend this template so that i just fill in this one block without having
to you know re-implement the whole thing and like yeah to go through that is actually you know
something that people will learn a lot from i think i think so i hope so it took a lot of time
to write so that's the thing with yeah go on well i was going to say so what about um um performance
are you doing anything there because you go to deployer it's all right you know you're testing
it locally it works to be done anything to when you put it up there you find it your site crashes
why because you've got i know slow queries have you talked about that yeah we do we have a whole
chapter on performance um so there's two ways you can do it so one is you want to you can do things
locally so again with the benefit of docker you can test your production environments locally
so bare minimum things django debug toolbar you need to add i talked through that there's actually
a gotcha with using it in docker that i walked through because you have to find the correct
what is it the correct port there's something a little tricky but I walk you through it but then
yeah so you want to install Django debug toolbar look at your queries and then things like select
related prefetch related these are go-to tools to basically they're complicated topics but basically
if you have a lot of queries often if you can boil it down to one big one that's more performant
but you don't really know until it's a production environment so I talk about things like you will
probably want to implement these. But don't just do it. And don't just do it locally, like put the
site up live, you know, things will appear that need to be addressed. Same with adding indexes
to databases, you may think, oh, I'll just index a whole ton of stuff, you know, the user ID,
but you should hold off and the problems will present themselves. And there is a cost to
indexes, for example. So all these things I, I talked through, you know, compressing your front
and assets caching there's you know django has four different built-in layers per site per view
template and then low-level api so we i talk about how you would do it but then also say
you know don't necessarily just jump into doing it because that's you know premature optimization
is a problem the root of all evil no yeah yeah was it donald newth i think um but yeah because
you're gonna get it wrong you know when you put your site out live don't worry like people are
like what am i gonna work on like things will jump out at you like oh this is on fire that's on fire
that's actually the perfect time to optimize it not just saying oh i'm you know i'm gonna
add redis right off the bat i think you should wait until you need it yeah and also where you
think the performance bottlenecks will be that's not where they'll be they'll be somewhere totally
different and then you'll discover in production where those small number of performance bottlenecks
are you optimize those and all of a sudden your thing is is fast and you haven't actually had to
do too much work right that is another trap is that it's when you wait for the problems to
presents himself and put themselves into a hierarchy,
it's way less time.
But again, how do you know what the problems are?
I mean, you and I have a sense of,
these are the common things,
because we built a bunch of sites,
we're familiar with Django.
haven't done it it's a constant just like oh my god where did that come from so the book sort of
says you know here are the major things here's how you would do it but you know i do give the advice
of wait like that's some pro advice like there wait if you can there are plenty of you know if
you're worried about those things go talk to users don't prematurely optimize your site for a million
users go get a million users and then you can figure it out yeah yeah get 10 and then figure
out yeah but that's yeah that's an engineering trap right it's engineering stuff is fun and
And even on deployment, I talk about how there are deployment engineers for a reason, site
reliability engineers.
In fact, most engineers at a big company are working on deployment performance issues.
And it's really fun to do because it feels like binary.
You can look and see, oh, page load time got better, or our uptime increased.
It feels very satisfying.
But should that time be spent eking out those gains, or should you go talk to users and
make...
I don't know.
Let me pick on Quora.
Maybe I don't have to log in all the time to use it.
Would that be a better thing than, you know, being proud of how fast your site loads?
Probably.
So those are like engineering traps that you get into because you can document and it feels good.
But is that what you should work on?
I mean, generally, you probably want to work on what you don't want to do in a startup setting.
Yeah, I mean, as well, like in a way that it can be a bit like busy work or, you know, it's like, yeah, I feel like I'm doing stuff.
I'm answering emails, but I haven't got anything done at the end of the day.
I spent all day in the inbox.
That's not productivity.
I spent all day improving my deploy, but...
Yeah, you do get something done,
but it's probably not the most important thing.
I mean, that was something, so I started...
Well, it depends on the scale, right?
Depends on who you are.
Depends on the scale.
So I was at Quizlet,
which is now quite a big site very early on,
and I give the founders a lot of credit
that we, about once a week,
several people on the engineering team,
it was a small engineering team,
would go into schools and visit
and just see how it was being used.
And if you think about it, that's a huge cost, right?
Five days a week, that's a tenth of the workday.
And then really the whole rest of the day, we're talking about things that we would learn.
And that was a great way to see how things are actually being used.
You know, things that we didn't think about would come up.
I mean, spending the time with your users is hard to do, but always the best thing to do.
Again, and it doesn't feel as good maybe as these known performance issues that you want to address.
But there you are.
Yeah, I mean, I could go on all day about this.
Let's drop that.
How does that relate to you with being a Django fellow?
Do you see also these sort of 80-20s or these areas where engineers get really excited about working on stuff?
Maybe it's not the most relevant.
Yeah, I mean, the thing that comes up is when people want to propose a feature and they want it to be an exact way so that in their particular code base, they've just got one line of code to write and it all magically does that.
But the cost of that is extra API surface area for the entire user base of Django.
And on balance, it's probably not worth it for the entire user base of Django when what we could see is that this one line for that one person could just be like half a dozen lines overriding one function in a class-based view.
And we'll say, no, look, we're not going to add that extra API service area over the whole API because there's this quick fix available.
And then they get upset about that because they want it to be just so for them.
And you're like, well, you could put that in your own project or you could put that in a third-party app.
and that's right well that's the difficulty is balancing make them feel make them feel your pain
and also convey that you understand their position because everyone is you know everyone views the
world through their own eyes yeah and and so that's the like treading that balance where
django is useful for the majority use case and we include the hard batteries you know the things
that are difficult for a user to implement themselves we will will include but we can't
necessarily include absolutely everything for absolutely every use case because then it becomes
unworkable right it's a similar tension yeah i mean in the in the book too i mean especially
around well there's so many areas where i say you know hey jango's got your back here but let me
explain how they have your back you know security user registration performance i mean there are way
more things built in you don't have to think about versus these toggles that you can customize and
even the ones you can customize i think jango does a fantastic job of sort of being objective
about it you know depending on like caching for example offering okay maybe you hear these
different levels and you know there's always Django always gives you the option to roll up
your sleeves and dive in and get crazy if you want which is fantastic because a bunch of some
frameworks don't you know they're they're really great out of the box but they're hard to customize
Django is a little bit more work but it's eminently customizable across the board
which is its strength yeah okay one thing I like about what you've talked about the way you've
done talked about all the topics around Django that you've experienced in the books it reminds
me of a conversation we had back in episode one or episode two when we were like you know django
is almost a front-end framework and if you look at the whole stack you know it's not front-end
it's not css it's not javascript it's not react it's not whatever but if you look at provisioning
vms or the database servers or docker or any it's kind of a bit front-end and and what it sounds is
like you've placed django inside that wider environment and that kind of sounds really cool
yeah no i've tried to and the thing i like about having these again these three books is i feel
like i've you know it's beginner intermediate advanced and i'm constantly going to be working
on them updating them and both as django evolves and also just it's a chance for me to keep
improving how i explain these topics so um yeah so it's an exciting time and i should mention so
the first so if i want to pick up the book how do i do that yes so you can go to the website
jenga for professionals dot com, which we'll link to in the show notes. And you can read the first
two chapters in the introduction there, which will walk you through Docker and some projects
and talk about what's going to come. It's available as an e-book and it will be on Amazon
print and Kindle by the time this episode comes out. If you have a choice, I would recommend the
e-book because you will get updates. I can't do that on print and Kindle, but if you want a
standalone copy, you should go ahead and get those on Amazon. And if I wanted to get the all the
books, is there a nice little bundle? Yes. So for the ebooks, there are bundles. So if you buy,
so each book is $39. And if you buy two, you get $10 off. If you buy all three, you get $20 off.
There's links on my site, wsvincent.com slash books, which I'll put in there. So yeah, trying
of make it easy for people to understand and get to. And, you know, for me, actually, I've spent
a lot of time, all my time creating, and now I'm switching my brain around to, you know,
the marketing and displaying. I'll probably do a video where I walk through the project
and show, you know, a couple minute video show, hey, here's what we've built. This is actually
something I'd like to add for my first two books is to walk through because the first book goes
through five different projects. And I think people kind of buy it based on trust. I think
like they read other tutorials i have but i can i can and should walk through and show a quick
hey here's what we're going to build kind of video okay even though a lot of it is the plumbing which
is the interesting part and if i wanted to get update on those those kind of contents i should
subscribe to your email or that's right yeah so i have a newsletter we'll link to it where um i do
maybe once a month only important stuff linking to new tutorials um that i've written to podcasts
i see amazing stuff out there so it's very intermittent but yeah i'll link to the newsletter
that's the best way to be updated um there's also an rss feed um through that is available
on the site i'll link to um and it shows up in the django has a community feed right i'm not sure
who's in charge of that but it's on the django community feed yeah so you submit and then we
just verify that it's a valid django topic blog and then we'll it gets added to that feed okay
yeah so yeah so someone submitted me uh which is very kind to them so it's so when i publish things
with the Django tag on my site it pops up yeah so if you go to djangoproject.com and the community
tab you can find the the link to that feed yeah that's that's a really good feed for people
yeah so it's out there um email me feedback uh I'm really proud of it I want to see how people
think but it's been a full year of work and I think it's really going to help people out
well well done and have a little celebration to get it out the door yes yes I will all right
thanks very much that's everything from us this week take care and join us for the regular show
next time. Bye-bye. Okay. Bye.