00:00 Django is a very popular Python web framework.
00:02 One of the reasons is you have these many building blocks to drop in for large sections of your application.
00:07 Need a full-on admin editor backend?
00:09 There's a few lines of code and boom, you have a basic table editor.
00:13 This appeals to many people.
00:15 But for those of us, myself included, who appreciate lightweight frameworks where you choose just what's included
00:20 and piece together our apps from best-of-breed components, can find this a turnoff.
00:24 This week you'll meet Julie Ellman and Mark Lavin, authors of Lightweight Django,
00:29 who are here to dispel the myth that Django apps have to be built out of large building blocks.
00:33 This is Talk Python to Me, episode 88, recorded November 21st, 2016.
00:58 Anyone can get the job done.
01:00 It's the execution that matters.
01:01 I have many interests.
01:03 Welcome to Talk Python to Me, a weekly podcast on Python, the language, the libraries, the ecosystem, and the personalities.
01:10 This is your host, Michael Kennedy.
01:12 Follow me on Twitter where I'm @mkennedy.
01:14 Keep up with the show and listen to past episodes at talkpython.fm.
01:18 And follow the show on Twitter via at Talk Python.
01:22 This episode has been sponsored by GoCD and PyUp.
01:25 That's right.
01:26 PyUp.io has joined the show as a sponsor this week.
01:29 Thank them both for supporting the show by checking out what they have to offer during their segments.
01:33 Julia, Mark, welcome to the show.
01:36 Thanks for having us.
01:38 Yes, thank you.
01:39 Yeah, you're welcome.
01:40 I'm super excited to talk about your book.
01:42 You guys are doing some cool stuff.
01:43 I'm really looking forward to talking about this combination of technologies.
01:47 I mean, we're going to talk about Django.
01:49 We're also going to talk about Backbone.
01:50 We're going to talk about WebSockets, Redis, Tornado, all sorts of cool things.
01:55 And I really like the way that you put them together.
01:57 So we'll have a good time talking about those.
01:59 But before we get to that, why don't you tell us your story?
02:01 Like, how did you get into programming?
02:02 I think that my love of programming really started when I was pretty young.
02:07 And I was very fortunate to be able to learn how to use Logo on Apple 2e in about first grade.
02:16 And just kind of like being able to just play around, right?
02:19 So having the ability to do that, really started to get into it there.
02:25 But I ended up going into art.
02:27 And slowly after graduating from college, realized that I can't really survive on making art.
02:33 So I decided to go back to this thing that I was really interested in since I was a kid and started doing web design and development,
02:42 which back then there wasn't really programs for it.
02:45 So I ended up getting a job at an internal marketing agency at a small company and really learned there on the job.
02:52 And shortly after that, got a job at Hallmark Cards, where I was an interaction designer.
02:59 So doing a lot of e-cards, things like that.
03:03 Oh, cool.
03:03 So, yeah, yeah.
03:05 But then I met this guy at South by Southwest Interactive a bajillion years ago.
03:12 And he was like, so have you heard of Django?
03:17 And I said, no.
03:18 And he's like, oh, you live in Kansas City and you live so close to Lawrence, Kansas, and you don't know what Django is?
03:26 And I said, no.
03:27 And he's like, you've got to go work at the Lawrence Journal World.
03:30 I'm sorry.
03:30 And that person was Simon Willison.
03:33 Nice.
03:35 Nice.
03:36 And he introduced me to a few people.
03:37 And I ended up working there for about a year and just learned all about Django and contributed to the actual project.
03:46 And that's when I really started working in Django was then.
03:50 It's a really cool way to get introduced to it.
03:52 It's basically go to the birthplace, right?
03:54 Yeah.
03:55 Yeah.
03:55 It was a really, really amazing time for sure.
03:59 Because that was like 2007?
04:01 2008 when I started working there.
04:05 So, yeah.
04:06 Like three years after it had become an official open source project.
04:10 Right.
04:11 It was just some kind of internal thing.
04:12 It was actually recognized as this big project.
04:15 Yeah.
04:15 Yep.
04:16 Yeah.
04:16 By then.
04:17 Yeah.
04:17 Nice.
04:17 I love Lawrence, Kansas.
04:19 I went to university there and I enjoyed my time in that town.
04:22 Oh, I rock chalk Jayhawk.
04:24 I'm a Jayhawk.
04:25 Yeah.
04:25 Right on.
04:26 Right on.
04:26 How about you, Mark?
04:28 How'd you get into programming?
04:30 My father, programmer, a long time.
04:32 Maybe he worked at IBM.
04:34 My older brother always loves programming.
04:37 So, I resisted being a programmer, being a stubborn little child, wanting to do something
04:45 on my own.
04:46 I always kept coming back towards it.
04:49 I studied math in college and I dreamed about being a professor.
04:54 I don't know why anyone would dream about being a math professor.
04:58 But that's what I had.
05:00 There's a lot of cool stuff about being a math professor.
05:03 Job opportunities, not necessarily one of them.
05:06 I guess I just really love like tweed jackets and elbow patches.
05:11 And that's what I envisioned for my future.
05:14 And so I continued doing math in graduate school.
05:20 And there's a lot of programming that comes into doing some applied mathematics.
05:26 And as much as I resisted, again, I just kept coming back to it.
05:30 And when I left graduate school, I started looking for what could I do with this math degree that I had.
05:38 I was in New York City at the time.
05:40 And I got into finance.
05:43 I just got sucked right in to doing crazy math on Wall Street.
05:51 And it was fun and exciting for a time.
05:55 We were doing some really cool stuff.
05:57 Over-the-counter derivative pricing.
06:00 It wasn't as flashy as Michael Lewis sort of draws in his books.
06:05 But we were, it felt like we were on the cutting edge of financial math to some extent.
06:12 But there was a little bit of a financial crisis that you may have heard of, I don't know, 2008, 2009.
06:19 And while my company wasn't really negatively impacted by that, many of our clients were.
06:26 And it was a really stressful time to be pricing such a volatile market.
06:32 We were having a lot of questions about our work.
06:36 A lot of really bad market data that we were sifting through.
06:39 In that process, a lot of my work was about automating what we were doing.
06:44 Collecting data.
06:45 Parsing really messy files.
06:49 And trying to turn it into a reasonable data we could use.
06:53 And we were doing weird things in VBA.
06:57 Visual Basic.
06:58 Excel.
06:59 Yeah.
07:00 How much of the world runs on Excel as the, quote, programming back end?
07:04 Nothing you'll ever believe.
07:06 And then we also had applications that were written in C++.
07:10 And we had nothing in the middle.
07:11 And I started exploring sort of scripting languages is what I started looking at.
07:18 I started learning, I started learning, I started learning Perl.
07:21 And I had a friend from graduate school who was pursuing a PhD.
07:26 And he said, forget everything you know about Perl and learn Python.
07:30 And I took his advice and I did.
07:33 It didn't stick at work.
07:35 My boss wasn't really interested in change.
07:38 But it stuck with me.
07:40 And I kept playing with it for different, both scripting tasks and automating foreign things and solving math problems with it.
07:48 And when I decided to sort of leave New York with my wife and started pursuing careers outside of finance, I started looking at what else I could do with this sort of hobby.
08:01 And...
08:03 What's this Python good for anyway, huh?
08:05 Yeah, what's this Python good for?
08:07 And I had all this free time when I just, we just quit.
08:11 We just left.
08:12 Came and stayed with my family down in North Carolina, where I'm from.
08:16 Built myself a website in Django.
08:19 And I was having a blast.
08:22 I built a little route tracking thing for running.
08:25 And yeah, I was still searching for jobs in finance.
08:30 And then eventually I thought, maybe someone would just pay me to write stuff in Django.
08:34 And strangely enough, I found a contractor hosting at the Cactus Group.
08:40 It was like two guys working in an office in Carrboro at the time.
08:45 And started working with them.
08:47 Took on one contract.
08:49 Finished that.
08:50 Took on another.
08:51 And eventually got hired full-time with them.
08:55 And I've been doing full-time Django development with them for almost seven years now.
09:00 Yeah, that's really cool.
09:01 I like how you kind of just kept going and looking for that Python opportunity to work in the space you wanted to.
09:08 And eventually it worked out.
09:09 That's great.
09:10 Changed my life.
09:10 I mean, the advice to forget Perl and learn Python was the best advice someone's ever given me.
09:17 Now we come to about a year and a half ago.
09:20 You guys created this book called Lightweight Django.
09:23 Julia, what's the story with your book?
09:25 It wasn't at a year and a half ago.
09:28 No way.
09:28 Was it?
09:30 I think it was like two years ago.
09:32 Mark?
09:32 Yeah, it was since it got published.
09:34 Yeah.
09:34 Yeah, yeah.
09:35 It's almost two years to the day.
09:36 Yeah.
09:36 Sorry.
09:37 No, don't be sorry.
09:39 I just was kind of like, no, it couldn't have been that long.
09:41 It couldn't have been that long.
09:43 I thought it was like 10 years ago.
09:45 So, yeah, come up for the idea for the book.
09:48 So, the thing with Django is that a lot of people look at it and they're like, oh, it's so big and it's like a dinosaur and can't use it because there's too much and I don't need everything that's in there.
10:04 And, I don't know, I would just talk to Mark about that when I, like, I would hear this and Mark and I were both working at the same place at that time.
10:11 It's like, I don't know that I agree with this.
10:14 There's got to be a way that we can show people that they can use Django.
10:19 And this is also the time of Flask sort of coming on the scene and, you know, people started making all these little Flask apps and then all of a sudden they're like, oh, I probably should start with Django.
10:30 I shouldn't have done this.
10:31 Doing all this work.
10:33 Yeah, I made all these Flask apps and then I probably should use Django.
10:38 So, yeah, we kind of talked about it and we were speaking at a conference.
10:44 We were speaking at OSCON and I was like, what do you think about writing a book?
10:49 I've got way too much time.
10:52 Let's just see if we can get rid of that.
10:56 I remember that feeling.
10:57 She was just whirted out one.
11:00 Whether you're having coffee or drinks or something, we should write a book.
11:04 And I think I just said, yeah.
11:06 And I had no idea what we were going to write.
11:09 No, you did not.
11:10 No, you were like, you were like, I don't know.
11:13 You were smart.
11:14 You were much smarter.
11:16 I was like, we could do it.
11:17 It's fine.
11:17 We could do it.
11:18 And you're like, let me think about it.
11:19 I remember you're like, I got to think about this.
11:23 So, yeah.
11:25 And like calling it lightweight was sort of the antithesis of what people refer to Django as.
11:31 So, like, oh, I don't want to use that.
11:33 Yeah.
11:34 Rather than let's plop in Django ORM, let's plop in like an admin back in all these big building blocks.
11:42 Your book takes the approach of saying, basically, let's see how you can strip this down to a very small core and then build up your own like starter templates and tweak it however you need.
11:54 Right.
11:55 And you're also bringing together a lot of interesting technologies that are not just Django.
12:00 Mark, how do you pick those?
12:02 Pick some of the ones that we're most familiar with, either from projects that we've built or, you know, professionally or projects that we've built on the side, you know, experimental projects.
12:13 One that we knew would work together, one that we had some familiarity with and that had some of the same sort of staying power as Django did.
12:23 You know, Tornado is one that I really like.
12:26 It's been around for a long time.
12:29 And it does this one thing really well.
12:32 And it's not flashy.
12:35 It's stable and boring, just like I like my technology.
12:41 Yeah.
12:42 Tornado plays a really important role.
12:43 And definitely when we get to the eighth async section or the real time web section of this conversation, it will definitely come back to it.
12:53 So when you guys wrote the book, who do you have in mind for it?
12:58 Julia, like who is your ideal student or who should read this book?
13:03 Definitely an intermediate.
13:04 I don't know.
13:05 I've had this conversation with a few folks, like beginner, intermediate, and advanced.
13:09 It's like, is there really an intermediate?
13:11 Is there really like, is it black?
13:14 I don't know.
13:14 So when it comes to, I think it's more like people who have actually built a Django application and have some sort of familiarity also with JavaScript.
13:24 So I think that that is part of the audience.
13:26 The people who are also in, like have this infrastructure, they're already using Django.
13:32 They already have it as part of the applications and whatever product or platform that you're using.
13:37 And they're kind of locked in and they're seeing all these newer technologies kind of come out.
13:42 And they're like looking at them longingly and they just don't understand how to connect them all.
13:46 And so, you know, I don't know.
13:49 I think it plays to a couple, quite a few different audiences.
13:51 Ones that need to be convinced to use Django that maybe haven't used it before, but have programmed in other languages and other web frameworks.
13:58 Okay.
13:58 Yeah.
13:59 I do think it's interesting to see how these pieces fit together.
14:02 And, you know, Mark, to your point, it's really challenging to choose those.
14:05 So you're choosing Django, obviously, but you're also choosing Backbone and Redis and some of these other things.
14:13 And especially in the JavaScript front end space, that's a real topsy-turpsy world, right?
14:18 And so, you know, by the time you're done with the book, you don't want the framework to be passe, right?
14:22 I don't know.
14:23 I think I've had a couple of folks ask me why we chose Backbone.
14:27 And I think Mark put it very well, which is just kind of one of the, like, boring and stable things that work.
14:36 And I feel like Backbone is pretty straightforward.
14:40 There's nothing flashy or fancy about it.
14:42 So when it comes to those things, I don't know.
14:45 It's like, what's in fashion right now?
14:48 It's like, it works.
14:49 It works, you know?
14:50 Yeah, you don't want to get caught with bell bottoms in the 80s.
14:52 Well, yeah.
14:53 I think it's also a matter of it's so basic, simple, and straightforward.
14:59 A lot of the concepts in Backbone can then be played out in other front end frameworks that you're, or JavaScript frameworks that you're wanting to use on your applications, right?
15:09 Like, it's not going to be too dissimilar than something else that you're going to choose, whether it's going to be React, which is the thing.
15:16 I think at the time of this book, it was Angular, and people are starting to kind of, like, look at Knockout.
15:22 But I don't even know.
15:24 I don't really remember.
15:26 The debate, I think, we had was Angular versus Backbone or Ember.
15:31 That's right.
15:33 Yeah.
15:33 I know Ember is really popular in the Ruby community.
15:37 It follows a lot of conventions there.
15:40 I don't see it used quite as much in the Python community.
15:43 Maybe that's just my own bias showing through.
15:46 The concern we had with Angular was the steeper learning curve.
15:51 And we kind of wanted to focus more on how do these pieces work together rather than let's try to teach you Angular and Django at the same time.
16:00 And I think that's where Backbone kind of won out out of those three.
16:04 It had a pretty shallow learning curve.
16:07 And it sort of used the same terminology as Django did on the back end.
16:16 And they play fairly nicely together, which works well for the book.
16:21 Yeah.
16:21 And I think in the end, like you guys said, it's pretty simple.
16:24 So if you decided you wanted to go use Ember or something shiny new like Aurelia or whatever, just, you know, you could translate it pretty straightforward if you knew that other framework.
16:32 Well, not only that, but just showing how do they connect, right?
16:36 Like how do you connect these two things together, which I think is a mystery for a lot of people that have been showing that translation.
16:43 And then, oh, oh, that's how you do it.
16:45 Yeah, absolutely.
16:46 I think that's a lot of the key lessons that are the takeaways from your book are this piece connects to that piece in this way.
16:53 That piece connects over to this piece in that way.
16:56 You know what I mean?
16:56 So you guys are using Python 3 for your book.
17:00 And that makes me really happy.
17:01 I love it whenever I see Python 3 stuff being used.
17:04 And I've got some good stories on Python 3 coming up.
17:07 But was that a – how much did you guys think about that or how much just go, yeah, Python 3?
17:12 Two years ago, it was a different time than it is now.
17:15 I think at first we sort of thought, oh, we'll do dual code base.
17:19 We'll do 2 and 3 and just see how that goes.
17:24 You know, we've written a lot of reusable components that support both and familiar with doing those.
17:30 But as we started working through that, there's a lot of explaining, oh, well, why do we need this?
17:37 Why do we have that?
17:38 And it got a little clunky.
17:40 We spent a lot of time explaining the differences between Python 2 and Python 3.
17:45 instead of the message that we wanted to give, which is, you know, how do you use Django with Backbone?
17:52 Or how do you do WebSockets with Django?
17:55 How do you build a single file application with Django?
17:58 That's what we wanted to teach people.
18:00 And we were getting caught up teaching people the difference between 2 and 3.
18:04 So in the end, we abandoned Python 2.
18:06 I think that's for the best.
18:08 People shouldn't be building new applications from Python 2.
18:11 Hopefully they're not.
18:12 We feel strongly about that direction.
18:15 We also had a lot of support from another O'Reilly author, Harry Percival, who had just published a book that was Python 3 only.
18:23 And he felt very strongly about that same direction.
18:26 So we have received some criticism for making that choice.
18:30 I think someone called our use of Python 3 academic at one point.
18:34 But even two years ago, we were building applications with Python 3 here professionally for our clients.
18:41 So I mean, that's definitely the way to go.
18:44 We've had a disservice to write a book even two years ago based on Python 2.
18:49 To add to it as well, it's sort of like trying to push the community forward.
18:55 A little nudge, right?
18:57 Yeah.
18:58 If we only write it in 3, that's it.
19:00 It's like you just got to learn it and got to keep moving forward.
19:05 And I think sort of like aiding this Python 2 usage doesn't help towards moving everyone towards 3.
19:14 Yeah, I think all of us that are doing stuff in public, if we can take these small steps, they add up to make a big difference.
19:22 In aggregate, you know, one of the things that made a big difference in the Python 3 usage measured on PyPI relative to like the year previously or whatever was actually to do with Django.
19:37 And they switched the default language of their documentation and their tutorials to Python 3.
19:43 And that actually made like a pretty measurable difference in the amount of Python 3 usage, like as seen from PyPI downloads.
19:52 So let's talk about the first part, Julia.
19:55 So one of the things you guys start with is the world's smallest Django application.
20:00 What's the story of this?
20:01 So it's sort of like bashing that concept of this is following the instructions of how you actually build an application, like doing the polls tutorial application.
20:14 And this is the way you have to do every Django app.
20:18 And a lot of what that chapter is, is saying, nope, you don't.
20:23 You can actually just have one file to do it all.
20:27 So when we're trying to think of the progression of the chapters, that was something that kind of starting with, like, I really like how you were saying that you got the concept how the chapters build off of each other.
20:43 So we start with the tiniest little thing.
20:45 How much of that is like a reaction to Flask coming along saying, here's our one file.
20:51 That is the web app.
20:53 And you thinking like, wait, Django can do that.
20:56 It doesn't by default, but it can.
20:58 Totally.
20:59 That's totally.
21:00 Yes, of course.
21:02 That's right.
21:03 I think.
21:04 And it's funny because I've had a lot of people tell me and I'm probably Mark as well kind of come up and be like, after reading just the first chapter, like, I never thought of it that way.
21:18 Never.
21:18 Yeah, it's it is interesting.
21:20 Like, you know, the the starter projects there and, you know, like pyramid has it scaffolding.
21:26 And the thing that comes out looks really complicated when you're new.
21:29 Like, there's like, why are there so many files here and all this stuff wired together?
21:33 But it's easy to see that as required rather than just the conventions this community is following, you know?
21:40 Yeah.
21:41 Yeah.
21:41 Totally.
21:42 So another thing that you bring up and I thought was really interesting that you covered here were components or parts of this thing called the 12 factor app.
21:50 What's the 12 factor app?
21:52 12 factor is pretty growing popularity, you know, way of sort of building and deploying applications, sort of a set of principles around what makes an application easy to deploy and scale in multiple environments.
22:11 And we didn't want to preach too much, I guess, about that methodology.
22:16 But you talk about some of the challenges that people face when they are using Django.
22:24 I think this question of how do I have multiple settings files comes up all the time.
22:33 And certainly for that sweet spot of our audience of someone who's maybe built something and wants to deploy it, make it real, you know, put it out on the public internet.
22:42 Then they come with, well, how do I configure this for my local development and for this production environment?
22:50 And 12 factor is one way to do that way that I think works fairly well.
22:56 And so that's sort of the direction we try to nudge people in.
23:02 Yeah, sure.
23:02 And I thought it was pretty cool.
23:04 One of the philosophies you were talking about there is to try to have the minimal amount of deviation from like dev to QA to prod.
23:13 So the thing you're working on is close to the real thing, right?
23:17 Absolutely.
23:18 And making those differences obvious, sort of seeing which settings can be changed, which ones can't is part of that.
23:29 Yeah, absolutely.
23:30 So the next section that I thought was interesting and worth talking about, it's this part where you kind of speak to stateless web applications.
23:38 And you say that much of the focus in Django is about building reusable applications that can be installed and configured for like a Django project, but that can get really complicated.
23:48 And so you talk about breaking your web app into like small composable services.
23:54 And I think that's a recent trend that people have been leaning towards wanting to do microservice architecture.
24:03 You can't see my air quotes, but they're there.
24:06 And so, again, I think that's where people are reaching for other frameworks that they felt accomplished this better.
24:12 And part of the story that we wanted to tell was this can be done in Django, too.
24:17 You don't have to throw away your existing Django knowledge to build these types of applications.
24:24 In fact, Django has a lot of utilities that make it easy to build these types of applications.
24:31 One of my favorite things about that chapter in particular is I feel like we do a really good deep dive into some of the HTTP caching layers that Django provides, you know, those utilities that Django provides.
24:47 And I think that's really important for those types of applications at scale.
24:53 I agree as well.
24:54 Like, how much do you feel that developers are spending too much time chasing the shiny new thing?
25:01 I feel like, you know, especially around things like Node.js and the front-end frameworks, it's like, well, that's six months old.
25:08 We should be doing something different now.
25:09 You're doing it the wrong way.
25:10 It's old.
25:11 It's like, wait a minute.
25:12 Isn't that too quick?
25:13 I feel like it's not necessarily because as developers are always trying to strive to be better, faster, performant.
25:23 And I think that's, we're always trying to look of that optimal utopia of combination of things and combination of technologies.
25:31 Right.
25:31 So I think that's a, that's a big part of this.
25:34 Yeah, I agree.
25:35 It's a real challenge because it's fun to work on the new shiny stuff.
25:38 Right.
25:39 But at the same time, if you build an app that takes a year to build, you don't want to have like three different technologies mixed in because there were seasons, technical seasons.
25:50 So one of the things you guys did in this stateless web app section was you created like a placeholder image thing for prototyping out the site.
25:58 You could say, well, I don't really know what image the graphic artist is going to put here, but it's going to be 200 by 300.
26:03 So give me a 200 by 300 image, which is pretty cool.
26:06 And use this package called pillow.
26:08 People love to learn about new packages on the show.
26:11 Tell people what pillow is.
26:12 Pillow is the Python imaging library.
26:15 I mean, it's a work of, well, now it's really assumed the old pill module.
26:22 So it's really, I think, the gold standard for Python image manipulation.
26:29 If you need something to either modify or tweak an existing image or something like we're doing, which is generating new images, it's your go-to in Python.
26:41 This portion of Talk Python to me is brought to you by GoCD from ThoughtWorks.
27:01 GoCD is the on-premise, open-source, continuous delivery server.
27:06 With GoCD's comprehensive pipeline and model, you can model complex workflows for multiple teams with ease.
27:13 And GoCD's value stream map lets you track changes from commit to deployment at a glance.
27:18 GoCD's real power is in the visibility it provides over your end-to-end workflow.
27:23 You get complete control of and visibility into your deployments across multiple teams.
27:28 Say goodbye to release day panic and hello to consistent, predictable deliveries.
27:33 Commercial support and enterprise add-ons, including disaster recovery, are available.
27:38 To learn more about GoCD, visit talkpython.fm/gocd for a free download.
27:44 That's talkpython.fm/gocd.
27:47 Check them out.
27:48 It helps support the show.
27:56 Julie, the next thing that you guys did was you said one of the popular trends is to use something to generate like a static site.
28:04 So maybe it's data-driven, but the thing you actually want to deploy to the server is static because it's easy to scale, cheap to run, and things like that.
28:12 And so you showed how Django can actually be used to build static sites, right?
28:16 Static site generators is something that in my current role, I pretty much that is the thing that we use a lot in prototyping.
28:26 And a lot of what this chapter is about is about doing things like rapid prototyping, right?
28:31 So you have a client or even just like want to build something quickly or you want a blog and you don't need a database.
28:40 That's something that a lot of folks go to particular things like other frameworks like Jekyll, Pelican, and a bajillion others that I don't know the names.
28:51 So there's two ones that come to mind.
28:53 But there's a way that you can do this with Django.
28:56 And again, going back to the user that is sort of locked into using Django on whatever platform they're on and then also wants to be able to do something, like I said,
29:06 that they're using Django.
29:09 So it's like showing how you can actually do that with technology.
29:13 Yeah, that's neat.
29:14 And some of the stuff that you covered in there, I think when people are new to web development, they don't really know about it or they don't pay attention to it until it becomes challenging, let's say.
29:25 And you were showing how you can do sort of bundling, minification, cache busting, all that kind of stuff with Django, right?
29:33 That was cool.
29:34 Yeah, and asset management too, right?
29:37 Which is a huge thing.
29:38 Something I've been thinking a lot about lately is asset management in general and how it plays across all these different frameworks, right?
29:46 And all these different things like how do we compress files?
29:49 How do we take things that need to be compiled from one thing to another or copied over?
29:56 And I mean, that's something that just showing someone how to do that in general, I think, has a huge value.
30:02 So in this particular chapter, being able to show not only how to build something in Django like a static site generator, but also like asset management, which, you know, Django's always been something that I just love because you have so much freedom.
30:16 I feel like there's not a lot of rules around it, which is another theme of this book, right?
30:22 Like this underlying theme.
30:24 There are no rules.
30:25 Break it apart.
30:26 Smash it.
30:26 Just use one file.
30:28 Like create a static site generator.
30:30 Whatever.
30:30 Yeah.
30:31 Do what works for you, right?
30:32 Exactly.
30:33 Exactly.
30:33 And that's something that, you know, I love about the framework and kind of wanted to show here.
30:40 So.
30:40 Yeah.
30:41 I thought that was, that was really interesting.
30:42 So then Mark, you started talking about how to build RESTful APIs, because if you're going to have a single page app, a spa, it's going to be pretty boring without some server side communication, right?
30:57 Absolutely.
30:58 And I think we have great tooling in the Django community for doing this.
31:04 And Tom, for see his work relentlessly on Django REST framework, and we're all better for his work and contributions.
31:12 So, yeah, we wanted to show off sort of how easy and fun and elegant it can be to build, you know, RESTful API in Django.
31:23 So where do you think people get hung up building like HTTP APIs other than calling maybe it RESTful and it's actually not?
31:30 They get a fight about whether it's truly RESTful.
31:32 I mean, like, what do they get hung up in just about like mistakes that you see them making?
31:38 Well, there's certainly a lot of debates that people like to have.
31:42 And I certainly like to have my fair share of those base as well, but mostly about wanting good support for validating data that comes in and generating responses to go out.
31:56 And ideally, being able to accept different formats on both ends, being able to take in JSON and return JSON, being able to take in XML and return XML or YAML or whatever their favorite means of communication is.
32:14 So I do think people get hung up on trying to make things perfect or fit some vision of what they feel RESTful is.
32:23 But I think REST framework in this community gets you a good percentage of the way without a lot of work.
32:31 Yeah, and the fact that there's that nice framework that's really ubiquitous in the Django space makes it – there's a lot of shared knowledge on that, right?
32:39 That's cool.
32:39 Yes, and great complementary utilities.
32:42 It calls itself a framework, and I think it's true because other people are able to build off of it.
32:48 It's not let's cram everything together, everything that anyone could ever want.
32:53 It's let's give it extensibility and let other people in the community add things that might be missing from the core.
33:01 And, yeah, there's just a lot of great activity going around that project.
33:07 Yeah.
33:07 Okay.
33:08 Yeah, that's really cool.
33:09 One part you guys were – I don't remember what part of it.
33:14 I think it might have been this section where you were using the forms classes for validation
33:20 that you would typically use for HTTP get post type forms, and you were applying it for validation.
33:26 Was that in the RESTful part?
33:27 We did that in the stateless application.
33:31 We actually validated the incoming path expressions.
33:35 Oh, right, right, right, for the sizes of the images and stuff.
33:41 Yeah, I thought that was cool.
33:42 Why don't you tell people just real quick about how that's more flexible than, say, just straight HTTP angle bracket form?
33:50 Well, that's, again, a big theme of the book.
33:53 And maybe it's an unspoken theme, but it was definitely a big motivator for us is showing using Django,
34:01 you know, the pieces of Django like it's a collection of libraries rather than a framework.
34:07 It's something you can kind of take and use as needed.
34:11 And the forms library is, you know, the forms section of Django is an amazing piece, not just for the HTTP aspect,
34:21 because, you know, it does help you with sort of rendering HTML forms on the front end.
34:27 So the biggest piece is about that validation.
34:29 You know, we've used forms to validate incoming, you know, CSVs, all kinds of crazy stuff.
34:36 And it's got a really simple API, you know, nice declarative, you know, these are the fields that should be there.
34:43 And then it takes a dictionary and it says this dictionary is valid or is not valid.
34:49 And it has methods for, you know, cleaning data that it comes through.
34:54 Right.
34:55 And it's not just this value type has to be a parsable integer.
34:58 It's like this has to be an integer between 1 and 10 or something like that, right?
35:03 Like lots of nice little rules and whatnot.
35:05 Absolutely.
35:06 And as you said, that dictionary, that blob of data doesn't have to come from an HTTP request.
35:12 They're really decoupled in that way.
35:14 That dictionary can come from anywhere.
35:17 And I think it really speaks to, you know, maintainers of the Django project to build something that's as flexible as it is.
35:25 Yeah, that's excellent.
35:26 That's very nicely decoupled there.
35:27 That's cool.
35:28 So I want to make sure that we spend some time on the last third of your book or last quarter, I guess quarter, but maybe telling people about the middle part.
35:38 So they know kind of what kind of apps you're building and so on.
35:41 So, Julia, the idea was you're going to model some kind of like Scrum Kanban board type thing, right?
35:47 Yeah, and we were trying to come up with an application like what we would use in our day-to-day and basically how that would tie together.
35:54 But also, like how can we sort of start with like a simple, a super simple part of it, right?
36:01 And build from that.
36:03 So that's sort of the concept of why we're going to build like a Kanban board.
36:09 Yeah, so basically with Backbone, you build a Kanban board and you can edit it through Django and so on.
36:17 And then you get to this part where you're like, well, it's cool that we have this board, but it would be way cooler if we could edit it together on the web.
36:27 And so this brings you to a section called Real-Time Django.
36:31 Like tell us about that.
36:32 Yeah, Real-Time Django.
36:34 Yeah, so what is Real-Time Django?
36:36 That sounds cool.
36:37 Sounds fun.
36:38 It can mean anything.
36:39 Yeah.
36:41 But Real-Time just covers like such a host of sins.
36:44 Many sins have been committed in the name of simulating something real-time, right?
36:51 So this is like I don't want to have to refresh my browser.
36:55 I want to open a page like Google Docs or something, right?
36:57 And we can all type and it just, it changes as we all work with it, right?
37:01 That's the basic theme.
37:02 Yeah.
37:03 And like also bringing like it's that whole concept of like you don't think Django can do this, but it can, you know?
37:10 Yeah, that's really, really excellent.
37:12 So you guys run down some of the options for Real-Time Communications.
37:16 You're like, well, we've got WebSockets.
37:18 We've got server-sent events.
37:20 We've got WebRTC.
37:21 There's even like old-school long-pulling.
37:23 And which one did you end up picking?
37:26 We ended up going with WebSockets and we spelled this out kind of why.
37:31 I mean, the server-sent events, you know, are maybe a better map to how we end up using WebSockets themselves.
37:40 But WebSockets are just better known and better browser-supported.
37:45 Definitely two years ago, they had much better browser support.
37:48 Most frameworks that gear towards doing, you know, real-time web typically ship with WebSocket types of support out of the box.
37:58 And server-sent events are not.
38:00 It's usually kind of an add-on.
38:02 So we ended up going with WebSockets.
38:04 Yeah, certainly two years ago.
38:06 That makes sense.
38:07 I think those kind of features have come a long ways in two years, right?
38:11 It feels like the HTML5 stuff has definitely grown quite a bit from 2013, 2014.
38:17 Yeah.
38:18 I mean, it's every day.
38:20 People would just keep pushing and pushing and doing crazier things.
38:25 And it's cool to see those technologies have definitely matured to where two or three years ago, something, you'd say, well, maybe this could be an add-on.
38:34 It's probably not required for your app to really be functional.
38:38 And now I think, you know, people are really gearing towards more apps where it's like a core piece of functionality that absolutely needs to be there and work for the app to be useful.
38:48 Yeah, I totally agree.
38:49 And you guys point to a website that I'm a big fan of called caniuse.com.
38:54 And as you're talking about these features, you're like, oh, check this out on caniuse.com.
38:59 Why don't you tell people quickly about that if they don't know about it?
39:01 That's a good resource.
39:02 Yeah, it's a place where you can see if a particular feature is going to work on various different browsers, but not just the browsers, but the actual version of the browser.
39:12 So if you're not quite sure if this is going to be available, a lot of what I do now is making sure things work on really, really old browsers for many reasons, many good reasons.
39:24 So, yeah, I use that all the time.
39:26 Yeah, you know, the web is always like a compromise at some level, right?
39:31 Like, oh, there's this new cool thing.
39:33 Oh, but it's not supported on IE.
39:35 Or there's this other great thing, but it's not supported on Safari, on mobile.
39:39 Then you have to decide, like, do I really want to have a degraded experience for these people?
39:44 Like, and so on.
39:46 And sometimes the answer might be yes.
39:48 Like, for example, if you want to use CSS3 2D transforms, the only browser that that doesn't work on, according to caniuse, is Opera Mini.
39:55 And it might be totally reasonable to go, I don't care.
39:58 It's just going to look bad on Opera Mini.
40:00 Yeah, but there's fallbacks that you can actually use.
40:03 If you want to go forward and try something, there's definitely fallbacks that you can use.
40:08 So I encourage those that are listening, like, don't feel like you can't move forward with those particular technologies.
40:15 Right.
40:16 There's a lot of times some kind of polyfill you can do, huh?
40:19 Yeah, Modernizer is a big one.
40:21 Yeah, absolutely.
40:22 Let me take just a moment and tell you about one of our sponsors that makes this show possible.
40:27 This portion of Talk Python is brought to you by PyUp.io.
40:31 Have a website based on a popular framework like Django?
40:34 You really want to make sure that you're on the latest point release that includes all bug and security fixes.
40:39 With PyUp.io, you no longer have to search for updates manually, possibly missing an important update for a security vulnerability.
40:45 When you add one of your GitHub repos to PyUp's online service, the PyUp bot immediately starts searching for requirement files.
40:51 It will send you one big pull request that updates all your dependencies, and the bot constantly checks for new releases on PyPI.
40:58 This PR contains all the info you need in one place, and your test will run automatically, telling you if an update broke your code and why.
41:05 Try it today by visiting PyUp.io.
41:08 That's P-Y-U-P dot I-O.
41:09 Accounts are free and come with one private repo.
41:12 If you need more, plans start at just $4.99 a month.
41:15 Okay, so you decide WebSockets, and then the real challenge, and I think I wanted to ask you guys about this in a more broader sense, not just the context of your book.
41:28 But in order to do WebSockets, you have to have these long-term, many, many, many connections back to, you know, if your site's successful, hundreds of thousands of browsers, right?
41:40 And WSGI and a lot of the Python frameworks, Django, Pyramid, Flask, they're not really built to handle the asynchronous web or these long, long, long-running connections or HTTP2.
41:55 A lot of this stuff, do you think it's time for, like, a WSGI 2 or some rethink of how web processing is done?
42:04 Yes and no.
42:05 I mean, it would be nice to get a refresh of something that is definitely geared more towards long-term connections over HTTP.
42:17 But I still think that there's a lot of web applications that are still really request-reply based.
42:26 And that's fine.
42:27 There's always going to be that need.
42:28 You don't want to throw sort of everything out in the pursuit of something that has that support.
42:35 HTTP2 is probably a really good one where, yes, you want something to, yes, you want something to hold the connections open and make use of the multiplexing that they allow.
42:49 But that doesn't necessarily have to be exposed at the framework level for it to be useful.
42:55 Right.
42:55 That's true.
42:56 Like, for example, Nginx supports that already.
42:59 Yeah.
43:00 So maybe if you're using GeniCorn or Microwiskey behind Nginx, like, your actual data-driven Python requests might not do HTTP2, but the rest of it could, I guess.
43:10 Yeah.
43:10 What's interesting or confusing may be in this HTTP2 world, you know, a lot of the things that we've been doing and some of the things that we've even touched on earlier, concatenating files and minifying them all together,
43:25 some of that really loses its usefulness.
43:29 And instead, you want to make those be additional requests.
43:33 And you potentially want to be able to do browser pushes on your page load and say, you know, here are all the CSS files that are going to come with this page.
43:47 Here's all the JavaScript files.
43:48 So we kind of have to unlearn some of the things that we've done and then add new hooks into our frameworks to be able to make use of the new features.
43:59 Pretty interesting idea.
43:59 I wonder if Google will start ranking sites higher that follow HTTP2 someday.
44:05 If that happens, I suspect it'll push people quickly.
44:07 Like, for example, they recently started ranking SSL encrypted sites higher than non-encrypted ones.
44:14 Mobile friendly ones for mobile searches higher and so on.
44:17 Well, they certainly rank or they value, you know, page load time.
44:22 And to the extent that making good use of HTTP2 can help your page load time, I think you'll see that reflected whether they make an explicit HTTP2, you know, differentiator or not.
44:35 Yeah, it's still up in the area.
44:35 So one of the things that you did is you said, well, because this is how I kind of got out of this conversation is like Django and the whiskey servers in general are not super for this long term connection story.
44:51 So you brought up Tornado.
44:52 And so tell us about Tornado.
44:54 Like, what's the use case here?
44:56 Well, as I said before, I really like Tornado.
44:58 It came from FriendFeed before they were acquired by Facebook.
45:04 And it's been kept going ever since.
45:08 It's a it's a it's a it's own sort of event based network IO for concurrent, you know, highly concurrent web applications.
45:17 And it has a small web framework that comes with it where you're basically talking directly with the socket.
45:24 A little bit different than how you write a whiskey application.
45:29 You know, a lot closer to the raw TCP connection.
45:33 And so part of it was sort of love of Tornado.
45:37 It does great things.
45:39 It supported Python 3 for a while.
45:41 And again, that really goes with sort of our message of pushing Python 3 forward.
45:46 What we wanted to capture was, OK, Tornado is awesome.
45:50 You want to use Tornado.
45:52 You already know Django.
45:53 How can you make them play nicely together?
45:56 And I think that's the most important aspect of those chapters is let Tornado do what Tornado does well and let Django do what Django does well and learn how to make them work together.
46:10 Right.
46:10 Absolutely.
46:11 So you can focus the WebSocket processing on a small Tornado site and then do the rest basically through Django.
46:20 Right.
46:21 And the trick is how to make them talk together because it's pretty easy to set up a WebSocket system.
46:26 So you can say, well, here's all the listeners on this channel.
46:28 I made some change broadcast out a message to everybody.
46:32 This thing changed.
46:33 And maybe it's not a message, but a JSON document that like tells backbone to update the UI in this way or that.
46:39 Right.
46:40 But then they could also go to the website and like add a new card to the Kanban board.
46:45 And you want them to see that.
46:47 Everybody else.
46:49 And you want to do that through WebSockets.
46:50 So tell us quickly sort of what's the connection there.
46:54 How do you pull that off?
46:55 Essentially the choice that we made was to expose.
47:00 So Django server already had a REST API.
47:03 That's what the previous chapters were all about.
47:05 And that's what the browser is primarily talking to, you know, adding new items to the board and moving them around.
47:12 And then along with the WebSocket, you know, the Tornado server has its own sort of small.
47:19 I don't really want to call it RESTful because it's not very RESTful.
47:24 But another HTTP endpoint where it can accept changes that come over.
47:29 So essentially the browser makes a request to the REST API on the Django server.
47:36 And that change gets propagated over by making another HTTP request over to the Tornado server.
47:42 And then that gets broadcast out to any of the connected WebSocket clients that might be interested.
47:50 Okay, cool.
47:50 So the flow goes something like the JavaScript client talks to Django via REST.
47:55 Then the Django server tells the Tornado server via an API that this thing has happened.
48:01 And then Tornado pushes that back down to everybody except for maybe the person who made the change via WebSockets.
48:08 Is that right?
48:08 Yeah.
48:09 And it's kind of a server.
48:11 That's pretty awesome.
48:13 One thing that you mentioned there that I hadn't played with or really thought about is Redis Message Broker.
48:20 Sure.
48:20 Because so far the stuff we talked about would work well if like Tornado, the process is managing all the connections.
48:29 But what if you have like scale out to where you've got like 10 Tornado web front ends or WebSocket front ends, whatever you call it.
48:36 How do you get that to work?
48:39 So maybe tell everyone how you were working that out.
48:42 This is one of the things that I kind of love and hate about this section.
48:46 I think I would probably rewrite it.
48:49 We chose Redis because it's simple and it sort of gets the job done.
48:54 But I would have really loved to use Rabbit if I didn't feel like it would have added a ton of complexity here to sort of talk about AMQP and all those things.
49:07 So we owned Redis.
49:08 Basically Redis is the inter-process communication protocol between the Tornado instances.
49:15 So Django doesn't know anything about Redis and doesn't publish to it directly.
49:19 Redis is just the intermediary between if you're running multiple Tornado processes.
49:27 And it's got great PubSub support and it's broadcast only, but that works for our example.
49:35 So it's definitely sort of the familiar pragmatic approach to doing a simple broadcast example.
49:44 It seems like a good choice.
49:46 I mean, you don't want to spend a whole other chapter on like message brokers and whatnot, right?
49:50 Yeah.
49:51 Yeah.
49:52 I mean, we wanted to make it so that it could scale beyond a single process because it's a big pet peeve of mine when I sort of see this sort of toy example.
50:02 I say, look how easy it is.
50:04 And it's like, well, it's easy because it doesn't scale like beyond a single process and it has no fault tolerance or high availability possibilities at all.
50:14 And it's really disingenuous to say, oh, this is, oh, look how easy it is.
50:19 Well, it's easy when you cut out all those things that people care about in your applications.
50:25 Yeah, that's a good point.
50:26 And for WebSockets, it's more important to have some kind of like fault tolerance, right?
50:30 Because people are constantly connected.
50:33 It's not just an instantaneous request and they have their page.
50:35 They're like connected and waiting.
50:37 But yeah, Redis is easy to get up and running with.
50:41 People are pretty familiar with it.
50:43 A lot of people use it for caching as well.
50:45 And it's nice to kind of have technologies that can do a role when you aren't pushing the boundaries of scale on it that you can make use of Redis in other ways once you have it.
50:59 It's really interesting.
51:00 I didn't think about that use.
51:01 That's great.
51:01 So I think that's about all the time we have to talk about the book.
51:04 But I found it really interesting.
51:06 I like the take on the lightweight aspect.
51:10 I like the take, Julie, like you said, like, but you can do that with Django.
51:13 So here, I'll show you.
51:15 Nice work.
51:15 Thank you.
51:16 Yeah, you bet.
51:17 So you said at the beginning how you got started, you know, like, hey, let's write a book.
51:22 What kind of advice do you have for others who are thinking about writing a technical book?
51:26 One of the mistakes I feel like I made was assuming like, oh, yeah, I can write a chapter like that quickly.
51:34 You know, I could do that like so quickly and one a week.
51:37 It's going to be what?
51:37 Like, well, you split it up.
51:38 That's like a month.
51:39 We're done.
51:39 I think I think we had gotten like maybe Mark.
51:43 It was like two chapters done.
51:45 And we were like, oh, we've got this.
51:48 Like, this is no big deal.
51:49 And that was a mistake.
51:52 So my advice would be to write 50% of the book before you even pitch it.
52:00 Like, get it.
52:01 I mean it.
52:01 Like, just write it.
52:04 Like, and at least get a really healthy outline down because you think you know, but you don't.
52:11 Yeah.
52:11 When it comes down to editing, especially when it comes to a technical book, because you're not just writing content about like and teaching content.
52:22 And Michael, I think you understand this for like what you do every day.
52:26 You know, it's not just about that.
52:27 It's also about refinement and testing and verifying and seeing how can I make this better?
52:34 It's like this mega, mega project.
52:37 So.
52:37 Yeah, for sure.
52:38 And if you are like try to make a jump that's too big, you're going to lose people.
52:42 Right.
52:42 And so you've got to make sure that you can continually carry them along.
52:46 And it's a big challenge.
52:47 Or if you're too academic in your use of Python, which I love that Mark brought that up because we weren't sure if that was a bad.
52:54 I mean, I think they gave us like one star for that.
52:57 We're like, I'm actually pretty proud of that.
52:59 I think that's actually kind of cool.
53:02 Throw me in with Stanford at MIT.
53:03 I'll take that.
53:04 That's awesome.
53:06 Two questions I always ask my guests on the other way out the door.
53:11 So, Julie, I'll go with you first.
53:13 What is your favorite PI PI package?
53:16 We have over 90,000 now.
53:17 And I'm sure there's some that you use that are great.
53:20 Well, I really enjoy keeping my things neat and tidy, especially when it comes to using Git.
53:25 And while branches are cheap, I still like removing them when I'm not using them anymore.
53:30 So I really like this little package called GitSweep, which verifies what's been merged in and what hasn't and cleans them up.
53:36 Oh, nice.
53:36 So if you do like a pull request and that the request is accepted, the GitSweep will automatically delete the branch, something like that?
53:43 Yeah, yeah.
53:44 So you can just keep everything nice and tidy, hence the name GitSweep.
53:49 Okay, that's awesome.
53:51 And then, of course, PyLadies, which has a very dear place in my heart.
53:55 Nice.
53:56 What is the PyLadies package?
53:57 I know what PyLadies, the organization, is.
53:59 So it's actually the kit.
54:00 So let's say you want to start a PyLadies in your local area.
54:04 Then you can just pip install PyLadies.
54:07 And then you can get a whole information package of how you can get started.
54:10 And I believe that the package is, I can't remember the name.
54:13 Sphinx.
54:14 It's built off of Sphinx.
54:15 So I don't know if it's based off of Read the Docs or it's just straight up Sphinx.
54:19 I can't remember.
54:20 Sure.
54:20 But yeah, it's just a nice little thing.
54:24 Linroot made it because she's amazing.
54:26 Yeah, that's awesome.
54:27 Yeah, I had her on the show.
54:28 She's great.
54:29 Mark, how about you?
54:30 My favorite package is Django.
54:31 Obviously, it's my livelihood.
54:35 And I'm thankful to have found it.
54:39 And beyond that, I mean, I like a lot of sort of linting tools.
54:43 I'm really grateful for Flake 8 and the suite of tools around PyCode style and PyFlakes.
54:52 I make a lot of typos.
54:53 And so it helps me catch when I misspelled a variable in one place to say, hey, you're
55:01 trying to use a variable that's never been used.
55:04 Or, hey, this variable that you thought you were using isn't being used.
55:08 You just spelled it wrong.
55:08 It helps me find a dead code or code that is imported and not used.
55:14 So I really always install Flake 8.
55:17 Yeah, that's great advice.
55:19 All right.
55:20 So the other question I always ask is when you write Python code, what editor do you use?
55:25 Julia?
55:26 I don't have really a favorite.
55:28 I think it's whatever I need to use at the time, depending on what space I'm in.
55:32 Because I use Sublime, but I've also used Atom.
55:35 And I use Vim sometimes.
55:37 I just kind of like don't want to leave command line.
55:40 But it's not like, I don't know, I just don't really have a favorite.
55:42 It's whatever works at the time.
55:44 Whatever I'm trying to do.
55:45 Be flexible.
55:46 Awesome.
55:46 Mark?
55:47 As pretentious as it sounds, I really like them.
55:50 I switched a couple years ago.
55:53 And it's been really nice.
55:55 It really helps me focus to just sort of see one file open at a time.
56:01 I have to be very deliberate about moving out of that file, moving to another one.
56:06 And whereas I found myself, when I switched from Sublime, and I just found myself kind of having
56:13 a thousand files open in a billion tabs and clicking around everywhere to try to find where I was going.
56:19 And just Vim has really helped me focus on one task at a time.
56:25 Oh, yeah.
56:25 That's a really cool advantage.
56:26 All right.
56:27 You guys, final call to action.
56:29 What do people do to get started your book or take advantage of this whole idea that you're promoting as lightweight Django?
56:34 Well, if you haven't checked out the book, it's available for purchase on O'Reilly's website.
56:39 You can get e-book or a beautiful dead tree version with a hummingbird from the front.
56:46 Nice.
56:46 And I'll be sure to put the link in the show notes so people can check it out.
56:49 We have our code examples up on GitHub, which you can see without purchasing the book, though.
56:55 They maybe won't have a lot of context around them.
56:58 Additionally, I recorded a webcast with O'Reilly about intermediate topics in Django.
57:05 So if you sort of fit that audience of, you know, I've done a little bit of Django and I'm not sure where to go beyond the polls sort of tutorial, you can check that out.
57:17 I cover using Django along with Celery for background task processing.
57:22 And I talk about using Playgate to keep your Django code clean and up to date.
57:27 All right.
57:28 Awesome.
57:28 Julia, Mark, thank you for being on the show.
57:31 This is a really interesting take on Django, and I enjoyed talking about it with you.
57:35 It's been great talking to you.
57:36 Thank you for having me.
57:37 This has been another episode of Talk Python to Me.
57:41 Today's guests have been Julie Elman and Mark Levin.
57:44 And this episode has been sponsored by GoCD and PyUp.
57:47 Thank you both for supporting the show.
57:49 GoCD is the on-premise, open-source, continuous delivery server.
57:54 Want to improve your deployment workflow but keep your code and builds in-house?
57:58 Check out GoCD at talkpython.fm/gocd and take control over your process.
58:05 Are there bugs or vulnerabilities hiding in your app's dependencies or even in their dependencies?
58:10 Stop guessing and start getting notified by registering your GitHub repo with pyup.io.
58:16 Are you or a colleague trying to learn Python?
58:18 Have you tried books and videos that just left you bored by covering topics point by point?
58:23 Well, check out my online course, Python Jumpstart, by building 10 apps at talkpython.fm/course
58:29 to experience a more engaging way to learn Python.
58:32 And if you're looking for something a little more advanced, try my Write Pythonic Code course at talkpython.fm/pythonic.
58:39 You can find the links from this episode at talkpython.fm/88.
58:44 That's right, I've added a new short link.
58:47 So anytime you want to get to a particular episode, it's always talkpython.fm/show number.
58:52 There's all sorts of cool stuff on the show pages, so be sure to check them out.
58:55 Be sure to subscribe to the show.
58:57 Open your favorite podcatcher and search for Python.
58:59 We should be right at the top.
59:01 You can also find the iTunes feed at /itunes, Google Play feed at /play, and direct RSS feed at /rss on talkpython.fm.
59:10 Our theme music is Developers, Developers, Developers by Corey Smith, who goes by Smix.
59:15 Corey just recently started selling his tracks on iTunes, so I recommend you check it out at talkpython.fm/music.
59:22 You can browse his tracks he has for sale on iTunes and listen to the full-length version of the theme song.
59:27 This is your host, Michael Kennedy.
59:29 Thanks so much for listening.
59:31 I really appreciate it.
59:32 Smix, let's get out of here.