WEBVTT

00:00:00.001 --> 00:00:03.180
Django has reached a major milestone with its 2.0 release.

00:00:03.180 --> 00:00:07.820
This puts legacy Python, that is Python 2, fully in the rearview mirror

00:00:07.820 --> 00:00:09.960
and brings some nice new features to the framework.

00:00:09.960 --> 00:00:13.040
Join me, along with Daniel Roy-Greenfield,

00:00:13.040 --> 00:00:15.800
to discuss what best practices we should adopt

00:00:15.800 --> 00:00:18.660
and which ones are still entirely relevant.

00:00:18.660 --> 00:00:24.740
This is Talk Python To Me, episode 161, recorded April 23, 2018.

00:00:24.740 --> 00:00:42.060
Welcome to Talk Python To Me, a weekly podcast on Python,

00:00:42.060 --> 00:00:45.120
the language, the libraries, the ecosystem, and the personalities.

00:00:45.120 --> 00:00:47.260
This is your host, Michael Kennedy.

00:00:47.260 --> 00:00:49.260
Follow me on Twitter, where I'm @mkennedy.

00:00:49.260 --> 00:00:53.140
Keep up with the show and listen to past episodes at talkpython.fm

00:00:53.140 --> 00:00:55.660
and follow the show on Twitter via at Talk Python.

00:00:55.660 --> 00:01:00.480
This episode is brought to you by MangaDB and ActiveState.

00:01:00.480 --> 00:01:02.760
Please check out what they're offering during their segments.

00:01:02.760 --> 00:01:04.240
It really helps support the show.

00:01:04.240 --> 00:01:06.060
Danny, welcome to Talk Python.

00:01:06.060 --> 00:01:07.640
Thanks for having me, Mike.

00:01:07.640 --> 00:01:08.980
Yeah, it's great to have you here.

00:01:08.980 --> 00:01:11.780
I've been looking forward to having you on the show for quite some time.

00:01:11.780 --> 00:01:13.720
So we were finally able to put it together, weren't we?

00:01:13.720 --> 00:01:18.020
Yeah, it's been a few years since we first started talking.

00:01:18.020 --> 00:01:21.240
Yes, it's one of the more drawn-out guest appearances,

00:01:21.240 --> 00:01:22.380
but you're finally here.

00:01:22.820 --> 00:01:29.460
And I think the timing is really good because we now have a super major change in the Django world

00:01:29.460 --> 00:01:30.800
in that we have Django 2.

00:01:30.800 --> 00:01:33.640
Maybe not major in terms of features,

00:01:33.640 --> 00:01:38.000
but that's a pretty big step to have, you know, go from 1.something to 2.0.

00:01:38.000 --> 00:01:38.780
Absolutely.

00:01:38.780 --> 00:01:44.120
Especially considering that the big change is really under the hood.

00:01:44.160 --> 00:01:53.140
It's basically the move from Django 1.11 to 2.0 was dropping support for Python 2.7.

00:01:53.140 --> 00:01:57.240
So from going forward, Django is 3 and higher.

00:01:57.240 --> 00:01:58.900
There's no other way to do it.

00:01:58.900 --> 00:02:01.180
Should they just make it super explosive and call it Django 3?

00:02:01.420 --> 00:02:06.060
I actually have some minor issues with the Django naming structure.

00:02:06.060 --> 00:02:08.340
And I actually think that maybe you're right.

00:02:08.340 --> 00:02:10.880
Going to Django 3 might have been better.

00:02:10.880 --> 00:02:15.380
But the beauty of it, though, is that now the source code is going to be simpler,

00:02:15.380 --> 00:02:17.880
which means, you know, it'll be more stable.

00:02:17.880 --> 00:02:23.560
It'll be easier for them to implement more features or for the community to implement more features.

00:02:23.760 --> 00:02:27.660
Yeah, anything that attracts more contributors and doesn't chase them away with complexity.

00:02:27.660 --> 00:02:28.500
It's good stuff.

00:02:28.500 --> 00:02:29.820
Yeah, absolutely.

00:02:29.820 --> 00:02:34.940
I definitely want to focus some more on this Django 2 only being Python 3 only.

00:02:34.940 --> 00:02:37.720
But before we do, let's make sure we get to hear your story.

00:02:37.720 --> 00:02:38.980
How did you get into programming in Python?

00:02:38.980 --> 00:02:43.220
Originally, I got into programming because it was fun as a student.

00:02:43.220 --> 00:02:50.560
And as an adult, it was a much better way of making a living than working in restaurants or doing manual labor.

00:02:51.660 --> 00:02:58.220
And since I started coding, I explored a lot of different languages before settling on Python.

00:02:58.220 --> 00:03:02.460
I've done FoxPro, Perl, ColdFusion, Java.

00:03:02.460 --> 00:03:04.120
The list goes on and on.

00:03:04.120 --> 00:03:10.480
But with Python, I was lucky enough to get employed at NASA.

00:03:10.480 --> 00:03:16.640
And there, a co-worker named Chris Shenton introduced me to it in the summer of 2005.

00:03:17.600 --> 00:03:30.660
And at that point, I was so tired of Django's, not Django's, Java's static typing in rigidity that I had delved into ColdFusion of all things.

00:03:30.660 --> 00:03:34.820
And because I liked the less static typing.

00:03:34.820 --> 00:03:40.300
And I know static typing is very popular in certain circles, but it's just not what I enjoy.

00:03:40.800 --> 00:03:53.000
And when I discovered Python and its expressive syntax combined with its dynamic typing system of, you know, where you can, you know, it's strong typing, but not.

00:03:53.000 --> 00:03:54.640
And I've really enjoyed that.

00:03:54.640 --> 00:03:56.180
And so I've been hooked ever since.

00:03:56.180 --> 00:03:58.200
Hence the name PyDanny.

00:03:58.200 --> 00:03:59.080
Yeah, of course.

00:03:59.080 --> 00:03:59.820
That's awesome.

00:03:59.820 --> 00:04:02.380
First of all, what were you doing at NASA?

00:04:02.380 --> 00:04:03.840
Like what projects were you working on?

00:04:03.840 --> 00:04:04.980
That sounds really interesting.

00:04:04.980 --> 00:04:10.760
When I originally got hired there, it was for infrastructure support at NASA headquarters.

00:04:10.760 --> 00:04:11.800
Is that Cape Canaveral?

00:04:11.800 --> 00:04:14.020
No, that's actually in Washington, D.C.

00:04:14.020 --> 00:04:22.840
And there's satellite offices, depending on the contract, in usually in Northern Virginia, but it can change to Maryland, I guess.

00:04:22.840 --> 00:04:25.800
I'm not sure what the contract state is right now.

00:04:25.800 --> 00:04:30.260
Those companies can just kind of like spread in a ring around D.C. and like cross borders.

00:04:30.260 --> 00:04:31.580
It's kind of crazy around there.

00:04:31.580 --> 00:04:32.300
Yeah.

00:04:32.300 --> 00:04:36.920
And so what I was doing was a lot of infrastructure support.

00:04:36.920 --> 00:04:46.820
And one of those things was tying a number of in-house projects to a X500 directory system.

00:04:46.820 --> 00:04:47.900
That's like LDAP.

00:04:47.900 --> 00:04:57.660
And what happened was, is that at some point, someone at NASA decided that they were going to switch to an active directory server, which is fine.

00:04:57.660 --> 00:05:01.700
But they implemented a self-signed security certificate.

00:05:01.700 --> 00:05:11.940
And the Java version that we were allowed to use in the day, which I think was 1.6, its implementation of Jindy couldn't interact with that.

00:05:11.940 --> 00:05:16.180
And so Chris Shenton got it to work with TCL.

00:05:16.180 --> 00:05:20.440
And then we figured out, him and I figured out how to do it with Python.

00:05:20.820 --> 00:05:26.500
And so that gave us the business reason to bring Python into more of NASA headquarters.

00:05:26.500 --> 00:05:27.400
That's nice.

00:05:27.400 --> 00:05:29.700
I'm sure it's playing a pretty important role there now.

00:05:29.700 --> 00:05:30.860
I believe so.

00:05:30.860 --> 00:05:38.460
In fact, Chris Shenton has done a number of talks on using Python with AWS Lambda at NASA headquarters.

00:05:38.460 --> 00:05:40.360
It's really fascinating stuff.

00:05:40.360 --> 00:05:44.620
And I guess I can probably link to some of his talks at the end of this.

00:05:44.620 --> 00:05:44.880
Yeah.

00:05:44.880 --> 00:05:45.080
Yeah.

00:05:45.080 --> 00:05:45.780
Throw them in the show notes.

00:05:45.780 --> 00:05:46.340
That'd be great.

00:05:46.340 --> 00:05:47.260
That'd be really cool.

00:05:47.260 --> 00:05:50.780
So what was the coolest thing that happened while you were at NASA?

00:05:50.780 --> 00:05:52.700
I got to start with Python.

00:05:52.700 --> 00:05:54.620
Yeah, that is pretty cool, right?

00:05:54.620 --> 00:05:55.680
Very, very cool.

00:05:55.680 --> 00:05:58.620
Shaking hands with astronauts is a close second to that.

00:05:58.620 --> 00:06:00.060
So yeah, pretty awesome.

00:06:00.060 --> 00:06:04.400
It's definitely one of those places that it at least has this really big, noble goal.

00:06:04.400 --> 00:06:11.700
Like you could go write amazing technology at like a hedge fund, but it's not the same as like, yeah, we're helping launch satellites or do whatever, right?

00:06:11.700 --> 00:06:12.300
Absolutely.

00:06:12.300 --> 00:06:16.900
If you ever get the chance to do something like that, by all means, do it.

00:06:16.900 --> 00:06:17.320
Yeah, cool.

00:06:17.320 --> 00:06:19.420
And then how do you get into open source?

00:06:19.420 --> 00:06:23.740
Well, I got into open source because Python is all about open source.

00:06:23.740 --> 00:06:30.320
And while Java technically is open source, when I was still doing Java, it wasn't.

00:06:30.320 --> 00:06:36.360
It was a Sun project and then I guess an Oracle project, or it's an Oracle project now.

00:06:36.640 --> 00:06:40.820
But it didn't have the same ethos and environment and community.

00:06:40.820 --> 00:06:47.260
Yeah, Oracle doesn't scream like open source to me in terms of just the company culture.

00:06:47.260 --> 00:06:53.440
I feel it's more likely somebody will show up in like a full on suit than like talk about their open source project coming from there.

00:06:53.440 --> 00:06:56.300
But I guess there is definitely some stuff happening at Oracle.

00:06:56.300 --> 00:06:59.620
They just released some pretty interesting new runtime.

00:06:59.620 --> 00:07:02.260
I can't remember exactly what it's called.

00:07:02.260 --> 00:07:02.880
Have you heard of this?

00:07:02.880 --> 00:07:04.380
It's something with a G.

00:07:04.380 --> 00:07:06.720
I don't pay attention to Java news.

00:07:06.720 --> 00:07:11.680
It's GraalVM, G-R-A-A-L-V-M.

00:07:11.680 --> 00:07:18.980
And apparently it's like a new virtual machine for Python and some other stuff as well, like JavaScript and Rust.

00:07:18.980 --> 00:07:22.860
And I don't know, maybe it's going to be something amazing, but I haven't been paying attention enough.

00:07:22.860 --> 00:07:25.220
So I guess give them some credit for open source.

00:07:25.220 --> 00:07:26.940
They are doing some things these days, right?

00:07:26.940 --> 00:07:27.980
Yes, absolutely.

00:07:28.680 --> 00:07:34.320
So I got into open source because it was fun and it was exciting.

00:07:34.320 --> 00:07:44.120
It was great to see people give me a pat on the back as a beginner in a new language and a new tool set that who I respected.

00:07:44.120 --> 00:07:49.500
And those pats on the back were actually a form of credibility.

00:07:50.020 --> 00:07:56.820
So I've been, you know, after a few years of doing that, I guess I released my first open source package in 2009.

00:07:56.820 --> 00:07:57.780
Do you remember what it was?

00:07:57.780 --> 00:07:58.500
Yes.

00:07:58.500 --> 00:08:02.200
There are several that I released at that time.

00:08:02.440 --> 00:08:09.960
The most notable one or the one with the most GitHub stars and downloads is a package called Django Crispy Forms.

00:08:09.960 --> 00:08:13.420
And it's one of the predominant form libraries for Django.

00:08:13.420 --> 00:08:16.940
But and at that time I called it Django Uniform.

00:08:16.940 --> 00:08:20.080
But I had also done some clone packages.

00:08:20.080 --> 00:08:27.820
And I think there I attempted to write a new logging library because I didn't like Python's logging system.

00:08:27.820 --> 00:08:33.440
I think everybody goes through that stage as a Python developer, like, oh, I want to write my own logging.

00:08:33.440 --> 00:08:35.120
The five stages of logging.

00:08:35.120 --> 00:08:35.920
Yes.

00:08:35.920 --> 00:08:40.120
So, yeah, I've been doing that since 2009.

00:08:40.120 --> 00:08:46.100
And since 2013, I've been helping other people build their packages, which has been pretty awesome.

00:08:46.100 --> 00:08:48.280
It's kind of like paying it forward.

00:08:48.280 --> 00:08:49.060
That's really cool.

00:08:49.060 --> 00:08:50.360
How did you get involved with Django?

00:08:50.360 --> 00:08:54.640
At NASA headquarters, we were doing a lot of clone work.

00:08:54.880 --> 00:08:59.460
Actually, originally, we weren't doing any web work for my first few years of doing Python.

00:08:59.460 --> 00:09:01.580
There was essentially no web.

00:09:01.580 --> 00:09:04.960
And then we got a project where we could use clone.

00:09:04.960 --> 00:09:11.040
So we use clone and then nothing against clone, but it's a big, complex animal.

00:09:11.040 --> 00:09:20.220
And so when we had a new project, which was to build a Facebook clone for internal use at NASA, we decide to use Django.

00:09:20.220 --> 00:09:23.220
And that was at the end of 2008.

00:09:23.220 --> 00:09:31.120
And so that's when I started with Django, was really the end of 2008, the start of 2009.

00:09:31.120 --> 00:09:35.060
And it was a bit woolier back then.

00:09:35.060 --> 00:09:38.660
And it's really come a long way since.

00:09:38.660 --> 00:09:40.960
Of course, it's definitely come a long, long way.

00:09:40.960 --> 00:09:41.660
That's awesome.

00:09:42.600 --> 00:09:44.220
So that's about 10 years ago.

00:09:44.220 --> 00:09:44.920
What are you up to now?

00:09:44.920 --> 00:09:47.160
Now I do mix.

00:09:47.160 --> 00:09:53.860
Well, I still do quite a lot of Python and Django as well, mostly with REST APIs.

00:09:53.860 --> 00:10:04.460
My not so dark or not so hidden secret is that I actually do a lot of Flask because we use AWS Lambda a lot on our projects.

00:10:05.240 --> 00:10:14.000
And our rule is if we don't have a SQL persistence store in the back end, then we use Flask that we don't want to staple anything in.

00:10:14.000 --> 00:10:18.060
Or better yet, if we don't need a persistence store, we use Flask.

00:10:18.060 --> 00:10:21.100
So that's our go-to tool.

00:10:21.100 --> 00:10:28.260
And recently we've delved into Vue.js, some modern JavaScript, which has been kind of interesting.

00:10:28.260 --> 00:10:33.740
I'm a big fan of Vue.js as well over things like Angular and whatnot.

00:10:33.740 --> 00:10:35.340
What drew you to it?

00:10:35.340 --> 00:10:40.880
Maybe tell people real quickly just like kind of generally what Vue.js is and then answer my question.

00:10:40.880 --> 00:10:46.180
Vue.js is roughly analogous to React or Angular.

00:10:46.180 --> 00:10:54.040
It is an open source front-end JavaScript framework for building responsive, progressive web applications.

00:10:54.840 --> 00:11:01.500
And it can be used, you can call it by just sticking in a script line in your application.

00:11:01.500 --> 00:11:06.960
So it's great for bringing over projects that already exist, you know, legacy projects.

00:11:06.960 --> 00:11:09.440
But also it can be used for new projects.

00:11:09.440 --> 00:11:16.480
And the virtue that I feel it has over its competitors is it's not as enterprise-y.

00:11:17.040 --> 00:11:28.280
And I know the word enterprise is a word that there's multiple definitions, but I like the relative simplicity of it and its directness.

00:11:28.280 --> 00:11:31.980
I don't have to learn a new DSL to work.

00:11:31.980 --> 00:11:35.280
Well, I guess you do kind of have to learn a DSL to use it.

00:11:35.280 --> 00:11:39.600
There's the template directives, but it's nothing like having to learn JSX.

00:11:39.600 --> 00:11:40.180
Yeah, for sure.

00:11:40.420 --> 00:11:46.060
And yeah, so I think with these frameworks, it's really a matter of taste.

00:11:46.060 --> 00:11:52.420
But the one thing I do have to say that I like about Vue.js is it's not dependent on Facebook or Google.

00:11:52.420 --> 00:11:57.000
Vue.js is an independently funded project.

00:11:57.480 --> 00:12:06.400
So if Google or Facebook decides to drop their projects, there's nothing like that will happen with Vue.js.

00:12:06.400 --> 00:12:13.100
So there's nothing like the Angular 1 to more modern versions of the Angular transition that you'll have to deal with.

00:12:13.100 --> 00:12:18.540
That it doesn't require like CLIs and sort of compilation, transpilation steps and all that.

00:12:18.540 --> 00:12:22.700
It's just like, like you said, drop a script file in, maybe write a little JavaScript and off you go.

00:12:22.700 --> 00:12:26.580
Yeah, I don't use it much, but when I need that kind of stuff, that's the one I turn to.

00:12:26.780 --> 00:12:29.360
So, and you also just released a packaging course, right?

00:12:29.360 --> 00:12:30.440
Tell us about that.

00:12:30.440 --> 00:12:37.620
So what happened was, is we were invited to PyCon Colombia, my wife and I, Audrey Roy Greenfeld.

00:12:37.620 --> 00:12:41.180
We were invited to PyCon Colombia to give the closing keynote.

00:12:41.180 --> 00:12:44.480
And we gave a talk on packaging.

00:12:44.480 --> 00:12:47.900
And, you know, people seemed to like it.

00:12:47.900 --> 00:12:52.320
And they said, wow, it'd be great if we could actually learn this in more detail.

00:12:52.660 --> 00:13:01.820
So we ran a test workshop in Medellin, Colombia, where we, you know, gave out the course material free for a few days.

00:13:01.820 --> 00:13:06.600
And the response, and we also allowed people to join in from around the world.

00:13:06.600 --> 00:13:09.340
And the response was really stunning.

00:13:10.040 --> 00:13:14.280
So we decided, hey, let's make this an ongoing thing.

00:13:14.280 --> 00:13:16.840
And we decided to charge for it.

00:13:16.840 --> 00:13:19.980
So that way, that means that we can really work on it.

00:13:19.980 --> 00:13:21.020
Open source is great.

00:13:21.020 --> 00:13:26.800
But without funding, you just, everything else is the priority when you're doing volunteer open source work.

00:13:26.900 --> 00:13:29.120
So that's why we're charging for it.

00:13:29.120 --> 00:13:31.220
And it's entirely Python neutral.

00:13:31.220 --> 00:13:35.160
I know we're talking a lot about Django, but this is pure Python.

00:13:36.060 --> 00:13:43.220
And it is built on proven and awesome tools like Cookie Cutter, pytest, and Tox.

00:13:43.220 --> 00:13:54.280
It also uses proven software solutions like Read the Docs, PyUp.io, which is the security backend for Pipenv, as well as Travis.

00:13:54.280 --> 00:14:02.200
And, you know, it's kind of with Cookie Cutter, it's kind of our mission to make packaging easier and better for everyone.

00:14:02.400 --> 00:14:03.580
Yeah, it sounds like a really cool project.

00:14:03.580 --> 00:14:05.660
And I love a lot of the tools you mentioned.

00:14:05.660 --> 00:14:06.640
Cookie Cutter is great.

00:14:06.640 --> 00:14:09.360
Like you guys, you and Audrey are behind that.

00:14:09.360 --> 00:14:11.500
That was more Audrey's thing she was leading.

00:14:11.500 --> 00:14:13.640
But it's still, that's going strong.

00:14:13.640 --> 00:14:17.140
We could spend a lot of time on that, but maybe save that for another episode.

00:14:17.140 --> 00:14:26.380
But I think things like PyUp, I use PyUp for all of my web apps to basically tell me if there's any dependency updates, and especially if there's security updates.

00:14:26.380 --> 00:14:27.740
I think that's great stuff.

00:14:27.740 --> 00:14:29.220
So, yeah, it's really cool.

00:14:29.320 --> 00:14:37.120
I do wish packaging in Python was a little simpler, especially for distribution to other people, not to servers.

00:14:37.120 --> 00:14:38.880
But, yeah.

00:14:38.880 --> 00:14:39.740
I think...

00:14:39.740 --> 00:14:40.180
Absolutely.

00:14:40.180 --> 00:14:51.060
I think the next major thing, well, a thing that could be the next major thing that really ramps up the popularity and usage of Python would be making it simpler to hand out running Python applications.

00:14:51.060 --> 00:15:10.720
That would be wonderful if it happens, especially because, you know, packaging is so important for, you know, not just open source work or running on servers, but, you know, any kind of architecture, be it monoliths or microservices, you always have repeated patterns that can be captured by installable packages.

00:15:10.720 --> 00:15:17.760
The problem, though, is we have this, I guess, break between the pip world and the condo world.

00:15:17.760 --> 00:15:20.740
Bridging that is pretty challenging.

00:15:20.920 --> 00:15:25.500
And I know the condo team is trying to figure out a way to bridge that.

00:15:25.500 --> 00:15:29.580
And I'm not an expert on it by any stretch of the imagination.

00:15:29.580 --> 00:15:40.180
But I know when you're trying to build out projects that'll work in every environment on all the supported Python versions, I know from a lot of personal experience, that's hard to do.

00:15:40.180 --> 00:15:44.440
And then to get it to work with pip and condo, that's even harder.

00:15:44.840 --> 00:15:50.700
And even though there's solutions to do it, implementing them, getting them to work is not trivial.

00:15:50.700 --> 00:15:51.060
Yeah.

00:15:51.060 --> 00:15:55.540
And we have packaging stuff like CX Freeze, Py2App, Py2Exe, all these things.

00:15:55.540 --> 00:16:01.100
But it seems to me like they all 95% work until they don't.

00:16:01.100 --> 00:16:17.200
And so I dream of a day where I can just type Python dash M build or something like that, you know, and just have it like some sort of thing that is part of Python itself that truly perfectly can like replicate itself in a reproducible way.

00:16:17.200 --> 00:16:19.800
I don't know if that's going to happen in our lifetime.

00:16:19.800 --> 00:16:21.560
I'm telling you, I told you it was a dream.

00:16:21.560 --> 00:16:22.180
It was a dream.

00:16:22.180 --> 00:16:22.800
All right.

00:16:22.800 --> 00:16:29.380
But stuff that will happen in our lifetime, I'm sure, is Django is going to continue to be going on strong.

00:16:29.460 --> 00:16:35.660
So let's talk about Django, which is what we're actually here for, even though you've got to package those things up and put them on servers as well.

00:16:35.660 --> 00:16:44.640
So maybe I know many people know about Django, but there's a lot of listeners, scientists, data scientists, students, and so on who maybe are not super familiar.

00:16:44.640 --> 00:16:48.500
They probably heard the word, but give us just a quick overview of like what's the elevator pitch for Django?

00:16:48.500 --> 00:16:49.140
Okay.

00:16:49.140 --> 00:16:55.340
Django is a high level Python web framework designed to work with relational databases.

00:16:55.940 --> 00:17:05.940
If you really want to, you can staple in MongoDB or another non-relational data store, but then you'd lose a lot of the virtues of Django.

00:17:05.940 --> 00:17:18.900
And those virtues specifically are, or the primary virtues, Django makes a lot of the decisions as to which software components you use and the architecture you follow.

00:17:18.900 --> 00:17:23.900
So that way you can focus on business logic instead of all the other pieces.

00:17:23.900 --> 00:17:28.980
Because the truth of it is, is that your business logic is never simple.

00:17:28.980 --> 00:17:32.960
It always gets complex, even for what seems like a simple project.

00:17:32.960 --> 00:17:37.120
So why not let Django handle that kind of stuff?

00:17:37.280 --> 00:17:37.480
Right.

00:17:37.480 --> 00:17:49.280
You know, every single app that I've had that ever has interacted with customers that maybe have some kind of thing they own or they interact with or history or anything has accounts.

00:17:49.280 --> 00:17:55.860
As soon as you have user accounts, then you have to have the ability to register, the ability to log in.

00:17:55.860 --> 00:18:00.240
And as soon as that happens, like the very first day, someone's going to say, I forgot my password.

00:18:00.240 --> 00:18:02.980
So you got to have email so that they can reset their password, right?

00:18:02.980 --> 00:18:05.780
Like this, all of a sudden you're like, I just wanted to have accounts.

00:18:05.780 --> 00:18:08.020
And now this is like a week long project, right?

00:18:08.020 --> 00:18:10.020
This is a significant challenge.

00:18:10.020 --> 00:18:17.060
I mean, there are companies, Okta and others that make a lot of money solving this problem for you.

00:18:17.060 --> 00:18:23.120
And Django combined with one or two other packages just does this for you free.

00:18:23.120 --> 00:18:25.520
Or I guess it's open source, so it's not free.

00:18:25.520 --> 00:18:26.660
But you get the point.

00:18:26.660 --> 00:18:27.900
It does it for you.

00:18:27.900 --> 00:18:31.880
So that's the power of Django is that it gives that to you.

00:18:31.880 --> 00:18:34.800
And yes, you can customize it.

00:18:34.800 --> 00:18:37.960
If you want to use SQLAlchemy with Django, you can.

00:18:37.960 --> 00:18:40.260
All you have to do is import SQLAlchemy.

00:18:40.260 --> 00:18:42.260
It's not hard.

00:18:42.260 --> 00:18:44.640
So you can make changes to it.

00:18:44.640 --> 00:18:49.580
Sorry, I forget the name of the guest, but like a year and a half ago, you probably know better than I do.

00:18:49.580 --> 00:18:53.780
I had the folks that wrote the book Lightweight Django, which is an interesting.

00:18:53.780 --> 00:18:55.300
Do you remember who that is?

00:18:55.300 --> 00:18:56.000
Yes.

00:18:56.000 --> 00:18:57.500
I can't remember the names.

00:18:57.500 --> 00:18:58.220
I'm so embarrassed.

00:18:58.220 --> 00:18:59.440
But I know the book.

00:18:59.440 --> 00:19:00.780
I know the authors.

00:19:00.780 --> 00:19:01.740
I'm sorry.

00:19:01.740 --> 00:19:03.200
I'll try to link to it.

00:19:03.200 --> 00:19:04.360
Yeah, it was a great book.

00:19:04.360 --> 00:19:05.820
And they're both really smart.

00:19:05.820 --> 00:19:12.460
And so that was an interesting look, I thought, inside Django, where it was like, yes, you can have these big projects.

00:19:12.460 --> 00:19:16.680
But actually, that's just how the start, the sort of create app stuff works.

00:19:16.680 --> 00:19:18.040
It doesn't have to work that way.

00:19:18.040 --> 00:19:20.340
We can break it down into these smaller pieces if you want.

00:19:20.340 --> 00:19:20.880
Yeah.

00:19:20.880 --> 00:19:23.220
And it's kind of touching on with your SQLAlchemy thing there.

00:19:26.520 --> 00:19:27.220
Hey, everyone.

00:19:27.220 --> 00:19:27.920
Michael here.

00:19:27.920 --> 00:19:33.320
Did you know I'll be doing a three-part webcast series about MongoDB and Python from May to June?

00:19:33.320 --> 00:19:36.920
We'll see why MongoDB is a great choice for Python web apps.

00:19:36.920 --> 00:19:44.000
In this series, we'll go through the entire process of building a clone of PyPI, Python's packaging website, over at pypi.org.

00:19:44.000 --> 00:19:48.920
Everything from building the front end to deploying the web app and MongoDB to the cloud.

00:19:48.920 --> 00:19:54.940
You'll learn everything from document modeling basics to special considerations for running MongoDB in production.

00:19:54.940 --> 00:19:56.380
The webinar is free.

00:19:56.380 --> 00:20:02.780
So just click on the link in the show notes or go to mongadb.com slash webinar slash Python and sign up.

00:20:02.780 --> 00:20:03.920
See you in May.

00:20:04.780 --> 00:20:10.600
So some of those ideas or concepts you just talked about are definitely part of what makes Django popular.

00:20:10.600 --> 00:20:15.180
But, you know, it came on the scene roughly around the same time.

00:20:15.180 --> 00:20:18.900
There was like kind of a flourishing of web frameworks 10 years ago or something.

00:20:18.900 --> 00:20:22.760
It seems like looking back, why is it so popular amongst those?

00:20:22.760 --> 00:20:33.200
Of the other Python frameworks of the time, most of them have, actually, I think all of them have kind of faded away into very much a tertiary position.

00:20:33.540 --> 00:20:40.980
But when it came on, there was a Python framework called Zope with a CMS that it powered called Plone that was very popular at the time.

00:20:40.980 --> 00:20:50.400
And that framework grew out of the Java 2 Enterprise Edition version of building stuff, which was very enterprise-y.

00:20:50.400 --> 00:20:58.260
And the more components you had, the better, to the point that to implement anything trivial like a form just took a lot of work.

00:20:58.420 --> 00:21:05.260
Django made that, compared to projects of the time, very trivial to do.

00:21:05.680 --> 00:21:13.320
And since then, it's maintained its popularity, even against libraries like Flask, which, you know, like I said before, I use.

00:21:13.320 --> 00:21:16.320
And it's many clones, some of them who are asynchronous.

00:21:16.320 --> 00:21:20.560
It does this because it, one, it has market presence.

00:21:21.160 --> 00:21:24.180
And it makes a lot of these decisions for you.

00:21:24.180 --> 00:21:32.260
Instead of, you know, as I mentioned before, instead of figuring out which package or component to use out of the box, Django does that for you.

00:21:32.260 --> 00:21:41.040
So that way you can implement your project and then not have to, you know, if you want to replace it later as business needs dictate, you can.

00:21:41.260 --> 00:21:44.100
But out of the box, it just gives you a ton of stuff.

00:21:44.100 --> 00:21:47.940
It has the same batteries-included approach that Python does.

00:21:47.940 --> 00:21:48.640
Yeah, that's cool.

00:21:48.640 --> 00:22:01.760
I feel like it's easy to get kind of a hindsight bias or a curse of knowledge or whatever you want to call it, where you, as an experienced developer that's been working in Python for a long time, you're like, oh, yeah, I'm going to use this package for this.

00:22:01.760 --> 00:22:05.140
And that package for logging, and that package for mail, and that package for data access.

00:22:05.140 --> 00:22:17.660
And it's easy to think, well, I just want to grab my little favorite pieces and put them together and create, like, this little super web project that I'm working on, which is actually how I work a lot of the time myself.

00:22:17.660 --> 00:22:23.320
But it's when you're new, those are not necessarily joyful things, right?

00:22:23.320 --> 00:22:25.260
It's, like, super overwhelming.

00:22:25.260 --> 00:22:27.300
Like, there's all these different databases.

00:22:27.420 --> 00:22:33.660
Each of them have many ways to talk to them, either directly or through a variety of ORMs or ODMs.

00:22:33.660 --> 00:22:36.380
And it's just, it's a lot, right?

00:22:36.380 --> 00:22:44.260
And so I feel like Django does bring quite a bit for, you know, a significant number of people to say, here's what we prescribe.

00:22:44.260 --> 00:22:47.240
Put in the pieces that you want of logic.

00:22:47.240 --> 00:22:47.680
Absolutely.

00:22:47.680 --> 00:22:57.000
And because it's Python, the other thing that's nice, and this is just Django or any Python web framework in general, is because it's Python.

00:22:57.200 --> 00:23:00.720
It plugs in with the whole data science world, trivially.

00:23:00.720 --> 00:23:05.920
And, you know, I'm always kicking myself thinking, gosh, I want to be doing more data science.

00:23:05.920 --> 00:23:16.120
But fortunately, when I do get the chance to, you know, play around with Pandas, and I need to display the result of data, making it work with Django is easy.

00:23:16.120 --> 00:23:26.620
I know people in the Node and Rails world who, you know, when they work with tools like Panda, they've got to jump through, you know, there's extra hoops to make it happen.

00:23:26.620 --> 00:23:32.200
And thankfully, the Django and Flask and Pyramid world, we don't have to worry about it.

00:23:32.280 --> 00:23:38.320
Yeah, that is pretty interesting that, like, so much of the machine learning stuff and the data science stuff is in Python.

00:23:38.320 --> 00:23:44.380
And that just means, you know, you can, you know, we think about full stack programming already, right?

00:23:44.380 --> 00:23:45.540
This is another level, right?

00:23:45.540 --> 00:23:50.520
Another aspect of, like, you can just plug machine learning straight in, and you don't have to basically do anything, right?

00:23:50.520 --> 00:23:51.600
Just call it.

00:23:51.800 --> 00:23:53.580
Yeah, it's an exciting time to live.

00:23:53.580 --> 00:23:54.640
Let's just put it that way.

00:23:54.640 --> 00:23:56.620
Yeah, I kind of feel the same way every day I wake up.

00:23:56.620 --> 00:23:57.940
I'm like, it's so amazing to be alive.

00:23:57.940 --> 00:23:58.300
Let's go.

00:23:58.300 --> 00:23:59.120
What else are we going to do?

00:23:59.120 --> 00:24:05.840
Oh, another thing I want to bring up about Django, and this is one of my favorite selling points, is its security.

00:24:05.840 --> 00:24:11.140
You know, if you follow Django's best practices, odds are you're going to be in a good place.

00:24:11.140 --> 00:24:20.980
If you don't have debug equals true in production, you know, odds are you're going to be not having to worry about people penetrating your system.

00:24:21.600 --> 00:24:27.020
And there's also a pretty large and dedicated security team that works.

00:24:27.020 --> 00:24:32.100
I mean, the core Django team has a security group that's large and dedicated.

00:24:32.100 --> 00:24:44.200
In fact, every version of Two Scoops of Django that we've released, the security sections have been vetted extensively by the security group.

00:24:44.200 --> 00:24:51.160
It's, yeah, we spend more time on that, the chapters and appendices in the book for security than any other place,

00:24:51.240 --> 00:24:56.260
just because they go over it with such a fine tooth comb.

00:24:56.260 --> 00:24:57.660
That's really great to hear.

00:24:57.660 --> 00:25:01.480
I mean, that's one of the things that definitely can keep you up at night.

00:25:01.480 --> 00:25:07.760
I mean, or if you're doing this for your company, it can be dramatic when that kind of stuff slips.

00:25:07.940 --> 00:25:11.800
So they do have such a great attention to detail on the security space.

00:25:11.800 --> 00:25:17.620
That debug equals true problem in production, that is not good.

00:25:17.620 --> 00:25:26.760
There was some security researcher that had, like, gone through and realized that they could actually pull the AWS secret keys out of a bunch.

00:25:27.140 --> 00:25:30.340
And Stripe keys, MailChimp key, you name it.

00:25:30.340 --> 00:25:39.920
The API keys that are stored, basically, in memory were things that you could just go scan and pull out of these things because they're running the debug tools.

00:25:39.920 --> 00:25:40.560
Absolutely.

00:25:40.920 --> 00:25:43.440
So a little bit of background.

00:25:43.440 --> 00:25:51.080
Someone went to, I think they went through various Heroku apps or powered apps and nothing against Heroku.

00:25:51.080 --> 00:25:58.000
But Heroku is a common target for people first learning how to deploy Django because at the basic level, it's free.

00:25:58.220 --> 00:25:58.960
And it's simple, right?

00:25:58.960 --> 00:26:02.420
There's like, you don't have to configure Nginx and uWSGI or GUnicorn.

00:26:02.420 --> 00:26:04.920
You just like push app.

00:26:04.920 --> 00:26:05.540
Right.

00:26:05.540 --> 00:26:07.940
And I think Python Anywhere as well.

00:26:07.940 --> 00:26:13.420
And they found 28,000 instances of people's Django projects.

00:26:13.420 --> 00:26:18.620
And most of them were probably just simple tutorial applications where they set debug equals true.

00:26:18.620 --> 00:26:22.240
And it doesn't matter how secure your framework is.

00:26:22.240 --> 00:26:26.800
If you have it in debug mode in production, it's, you know, it's game over.

00:26:26.920 --> 00:26:28.460
There's nothing that can be done.

00:26:28.460 --> 00:26:29.520
That's your fault.

00:26:29.520 --> 00:26:30.740
That's not the framework's fault.

00:26:30.740 --> 00:26:32.560
It's somewhat of an education thing.

00:26:32.560 --> 00:26:33.540
But I don't know.

00:26:33.540 --> 00:26:35.660
Maybe you could do it.

00:26:35.660 --> 00:26:36.880
Maybe you could somehow deal with this.

00:26:36.880 --> 00:26:44.900
But nothing really comes to mind unless there's just like a huge scary box that absolutely appears on every page.

00:26:44.900 --> 00:26:46.680
Then probably it would help.

00:26:46.680 --> 00:26:48.520
But, you know, it's a tradeoff, right?

00:26:48.520 --> 00:26:48.960
Yeah.

00:26:48.960 --> 00:26:49.320
Yeah.

00:26:49.320 --> 00:26:51.980
Well, definitely be sure to follow the security best practices.

00:26:51.980 --> 00:26:53.380
But once you do, then it's all good.

00:26:53.380 --> 00:26:53.720
All right.

00:26:53.720 --> 00:26:59.680
So one of the things I said when we got started was the Django 2 announcement is a really big deal.

00:26:59.680 --> 00:27:03.300
And I want to kind of set the stage for that before I ask you more about it.

00:27:03.300 --> 00:27:10.260
A while ago, two years maybe, there was more of a debate about Python 2 versus Python 3.

00:27:10.260 --> 00:27:12.380
And are we going to cross that chasm?

00:27:12.380 --> 00:27:14.240
And I feel like we're kind of on the downward.

00:27:14.960 --> 00:27:21.200
Like we're coasting downhill to like wrap that up, even though it's going to become really bumpy around 2020.

00:27:21.200 --> 00:27:22.520
It's going to be real interesting.

00:27:22.520 --> 00:27:24.040
Very bumpy.

00:27:24.040 --> 00:27:24.780
Very bumpy.

00:27:24.780 --> 00:27:27.520
But it's going to be the bottom of the hill and the bumps are going to be there.

00:27:27.520 --> 00:27:30.800
Anyway, I think we're kind of over the debate.

00:27:30.800 --> 00:27:44.180
But one of the things that was really interesting around Python 3 a little while ago with Django was they switched the default recommendation and just the tutorial steps of using Python 2 to using Python 3.

00:27:44.180 --> 00:27:50.520
And that made a really noticeable difference in the PyPI download statistics for Python 3 usage.

00:27:50.520 --> 00:27:51.680
Oh, I didn't know that.

00:27:51.680 --> 00:27:52.080
Yeah.

00:27:52.080 --> 00:27:55.020
Basically, the tutorial switched to say, here's how you get started.

00:27:55.020 --> 00:27:56.620
You type Python 3, this, da, da, da.

00:27:56.620 --> 00:28:00.000
And that made like a 5% difference in the usage.

00:28:00.000 --> 00:28:07.800
So the reason I bring this up is that that is such a dramatic difference that even a small change has.

00:28:07.800 --> 00:28:11.100
And now being Python 3 only, it's just going to take it to another level.

00:28:11.460 --> 00:28:22.620
And so I think Django is one of these things that stands out in the community as really having power to move that needle on the Python 2 versus Python 3 debate.

00:28:22.620 --> 00:28:24.180
You mentioned pandas before.

00:28:24.180 --> 00:28:25.720
They're also going Python 3 only.

00:28:25.720 --> 00:28:28.520
So we're seeing this in other more than just Django.

00:28:28.520 --> 00:28:30.560
But it's a big deal, right?

00:28:30.740 --> 00:28:34.400
Okay, so let me give you some background so I can give you my example.

00:28:34.400 --> 00:28:39.380
I maintain or I help maintain or co-maintain a number of packages.

00:28:39.380 --> 00:28:43.400
And some of them, for example, Cookie Cutter, which I'm one of the maintainers on,

00:28:43.400 --> 00:28:51.220
we maintain every supported version of Python and some unsupported ones across every major operating system.

00:28:51.880 --> 00:28:54.760
And doing that is challenging.

00:28:54.760 --> 00:28:55.760
It's possible.

00:28:55.760 --> 00:29:04.240
And I'm not going to say it's easy because sometimes things just suddenly break and, you know, you have Unicode issues and stuff like that.

00:29:04.600 --> 00:29:14.320
And when you get to move a package to just one version, major version of Python, like from 2 to 3, it's wonderful.

00:29:14.320 --> 00:29:15.000
It's bliss.

00:29:15.000 --> 00:29:18.260
You get to remove tons of special code.

00:29:18.520 --> 00:29:22.400
And I know there's libraries like 6 and Futures that makes it easier.

00:29:22.400 --> 00:29:26.140
But trust me, you get to get rid of tons of code.

00:29:26.140 --> 00:29:33.040
You have logic trees that you hope are being tested properly until someone reports an edge case.

00:29:33.040 --> 00:29:34.600
All that goes away.

00:29:34.600 --> 00:29:41.120
So it really lowers the amount of effort you have to put in to maintain a project.

00:29:41.340 --> 00:29:50.720
So what this means is it's not an immediate effect for Django to move to Python 3 besides, you know, the increased downloads on PyPI.

00:29:50.720 --> 00:29:51.100
Right.

00:29:51.100 --> 00:29:52.600
Because it ran in Python 3 already.

00:29:52.600 --> 00:29:54.600
It's not like, oh, now it supports Python 3.

00:29:54.600 --> 00:29:56.560
It just drops support for the old one.

00:29:56.560 --> 00:29:56.980
Yeah.

00:29:56.980 --> 00:30:01.600
And the thing is, it's not that you'll necessarily see more features.

00:30:01.600 --> 00:30:17.700
But what you may see, because maybe something's pretty feature complete, but what you may see is maintainers having more bandwidth to answer questions, to make sure that tasks are actually testing what they're supposed to be testing.

00:30:17.860 --> 00:30:26.160
So the end result is, even if you don't see more features in a project that's Python 3 only, it will be more polished.

00:30:26.160 --> 00:30:27.260
It will run better.

00:30:27.260 --> 00:30:36.700
The maintainers will be able to be more responsive simply because they have less work to do in maintaining compatibility over multiple versions.

00:30:36.700 --> 00:30:46.440
As one of the maintainers of Cookie Cutter, I can tell you we cannot wait until we only have to maintain one version of, one major version of Python.

00:30:46.440 --> 00:30:47.300
Do you have plans for that?

00:30:47.500 --> 00:30:48.960
In 2020, when that happens?

00:30:48.960 --> 00:30:50.680
Eat a lot of cookies.

00:30:50.680 --> 00:30:53.980
We're going to celebrate with cookies.

00:30:53.980 --> 00:30:59.160
I guess that's the most formal plans that we have right now because that's still, you know, two years away.

00:30:59.160 --> 00:31:05.020
I'm really glad to hear Guido come out and say it's January 1st and put an actual date on it because it was within a year range.

00:31:05.020 --> 00:31:05.900
There's a lot of speculation.

00:31:05.900 --> 00:31:07.700
Oh, so it is January 1st.

00:31:07.700 --> 00:31:07.960
Okay.

00:31:07.960 --> 00:31:10.500
I heard that, but I wasn't able to confirm that.

00:31:10.500 --> 00:31:10.820
Yeah.

00:31:10.820 --> 00:31:17.480
There was some very strong statement that Guido came out and said, like, let's not mince words or, like, be ambiguous.

00:31:17.480 --> 00:31:19.440
It's going to be end of life.

00:31:19.440 --> 00:31:20.520
No more support.

00:31:20.520 --> 00:31:21.140
Period.

00:31:21.140 --> 00:31:23.640
January 1st, 2020.

00:31:23.640 --> 00:31:24.160
Oh, wow.

00:31:24.320 --> 00:31:26.920
Do not expect the core developers to help you even with security.

00:31:26.920 --> 00:31:27.720
That's it.

00:31:27.720 --> 00:31:28.820
Like, something to that effect.

00:31:28.820 --> 00:31:31.140
I mean, that's paraphrasing, but that's more or less what he said.

00:31:31.140 --> 00:31:31.840
Well, who knows?

00:31:31.840 --> 00:31:37.120
We might release a cookie cutter enterprise support edition for 2.7.

00:31:37.120 --> 00:31:37.580
That's right.

00:31:37.580 --> 00:31:40.720
Because we know that there's a lot of big companies using cookie cutter.

00:31:40.720 --> 00:31:42.120
And who knows?

00:31:42.120 --> 00:31:47.100
We know that there's a legacy Django group that has a business plan like that.

00:31:47.100 --> 00:31:48.400
So, who knows?

00:31:48.520 --> 00:31:59.080
As a way to kind of lead into the next question, I feel like we've been around long enough to know the whole change in the Y2K era.

00:31:59.080 --> 00:32:02.160
Like, I remember when it was like...

00:32:02.160 --> 00:32:02.900
I remember that.

00:32:02.900 --> 00:32:04.920
Do you have a flight on January 1st?

00:32:04.920 --> 00:32:06.060
You might not be able to go.

00:32:06.060 --> 00:32:07.480
Like, the computers may be...

00:32:07.480 --> 00:32:10.900
Like, people were, like, legitimately, like, we don't know what's going to happen.

00:32:10.900 --> 00:32:14.560
And I think January 1st, 2020 is a little bit like that.

00:32:14.640 --> 00:32:17.120
It's not going to be like the code is going to stop running.

00:32:17.120 --> 00:32:24.560
But people who, you know, as soon as there's, like, some sort of major security issue and the CEO says,

00:32:24.560 --> 00:32:29.300
I heard that there's this big problem and we kind of use the same software stack, but we're fine, right?

00:32:29.300 --> 00:32:32.460
Like, no, we're actually not fine because you didn't fund us upgrading to Python 3.

00:32:32.460 --> 00:32:36.520
Consultants will be hired at whatever rate they want right then, right?

00:32:36.520 --> 00:32:38.720
So, there's going to be a definite...

00:32:38.720 --> 00:32:39.900
Oh, yeah, that's true.

00:32:39.900 --> 00:32:40.360
Yeah.

00:32:40.360 --> 00:32:43.020
It's not going to be quite on the single day.

00:32:43.080 --> 00:32:50.420
But there's going to be some serious consulting for people that know how to upgrade Django apps, upgrade Python in general, right?

00:32:50.420 --> 00:32:50.820
Right.

00:32:50.820 --> 00:33:08.200
So, what Mike is talking about here is after 2000, you had some of it leading up to it, but after the year 2000, COBOL developers, you know, the old programming language COBOL, which still drives a significant part of our banking system, suddenly became the hot thing.

00:33:08.560 --> 00:33:15.900
And they, you know, they're pulled out of retirement and they were making, you know, salaries, crazy, crazy salaries.

00:33:15.900 --> 00:33:20.400
And I remember thinking, gosh, maybe I should have learned how to program in COBOL at the time.

00:33:20.400 --> 00:33:22.920
What he's insinuating is some of this will happen.

00:33:23.240 --> 00:33:39.560
And I know that there are some industries where the software, like, for example, the visual effects industry, last I heard, they were still very much stuck on like Python 2.5 or 2.6 that runs inside their commercial software that they use.

00:33:40.160 --> 00:33:44.400
And so, we'll see what happens with them in the year 2020.

00:33:44.400 --> 00:33:46.820
Will they upgrade or we'll see.

00:33:46.820 --> 00:33:47.700
Yeah, we'll see.

00:33:47.700 --> 00:33:49.340
But it's going to be an interesting time.

00:33:49.340 --> 00:33:54.000
The next question I wanted to ask you is who should be upgrading to Django 2?

00:33:54.000 --> 00:33:57.300
First of all, there's just a couple of new, really nice features.

00:33:57.300 --> 00:33:58.660
Do you want to touch on those first?

00:33:58.660 --> 00:33:59.240
Sure.

00:33:59.460 --> 00:34:04.100
Actually, what's interesting, the change from Django 1.11 to 2.0 was minor.

00:34:04.100 --> 00:34:14.920
It was less than the change from 1.10 to 1.11, which is kind of interesting, especially for someone who published a book called Two Skips of Django 1.11.

00:34:14.920 --> 00:34:19.720
Because we have people coming to us and saying, oh, well, it still worked with 2.0.

00:34:19.720 --> 00:34:22.900
And it's like, yeah, 98% of the book still works.

00:34:22.900 --> 00:34:26.140
But there are two little things that are kind of nice.

00:34:26.140 --> 00:34:32.060
One is the routing system for URLs is very Flask-like now, the default one.

00:34:32.060 --> 00:34:38.140
That's easier for beginners or for people who just don't like to play around with regular expressions like I do.

00:34:38.140 --> 00:34:47.280
It always struck me as a little bit contrary to the zen of Django to have regular expressions in there.

00:34:47.280 --> 00:34:51.100
Because Django is all about helping you make things easy and make these choices.

00:34:51.100 --> 00:34:54.100
And, oh, by the way, here's this crazy, super hard syntax.

00:34:54.100 --> 00:34:56.000
If you're not a programmer, you put that here.

00:34:56.000 --> 00:35:00.320
You're like, whoa, why is this not just like clearly the name, right?

00:35:00.320 --> 00:35:02.940
Like Flask or Pyramid or whatever.

00:35:02.940 --> 00:35:07.400
So the contrarian in me says, what's wrong with regular expressions?

00:35:07.400 --> 00:35:10.380
But the realist in me agrees with you.

00:35:10.380 --> 00:35:10.920
Yeah, yeah.

00:35:10.920 --> 00:35:15.920
I mean, think of the marketing person who decided they're going to learn a little programming so they can get some interactive site.

00:35:15.920 --> 00:35:18.680
Like that person is going to have a hard time with regular expressions.

00:35:18.980 --> 00:35:21.220
Yeah, I can't disagree with you there.

00:35:21.220 --> 00:35:25.040
The other thing is the admin interface that comes with Django.

00:35:25.040 --> 00:35:27.220
That's now mobile friendly by default.

00:35:27.220 --> 00:35:30.360
So you don't need to install another package to make that work.

00:35:30.360 --> 00:35:39.420
So that's really nice, especially since often when you're accessing the admin, you're doing it from your phone, trying to fix something, you know, in the middle of the night from bed.

00:35:41.360 --> 00:35:44.540
You get woken up by like a pager thing.

00:35:44.540 --> 00:35:45.820
Okay, we'll fix this.

00:35:45.820 --> 00:35:47.460
Or on vacation.

00:35:47.460 --> 00:35:49.880
Or on vacation when you have a slow connection.

00:35:49.880 --> 00:35:55.700
So yeah, so those are the two significant changes or what I consider the two significant changes.

00:35:55.700 --> 00:35:57.500
And as you can see, they're pretty small.

00:35:57.500 --> 00:36:02.680
Again, the big switch with 2.0 is going to Python 3 only.

00:36:03.000 --> 00:36:09.260
And then, you know, that leads in the question of why shouldn't you move to Django 2.0?

00:36:09.260 --> 00:36:11.760
And there actually are a few reasons.

00:36:11.760 --> 00:36:15.680
Django 2.0 is a standard release for Django.

00:36:15.680 --> 00:36:20.980
And that means it is supported by the core team for less than a year.

00:36:20.980 --> 00:36:28.800
Whereas Django 1.11 is a long-term support release, which means it's going to be supported until at least April 2020.

00:36:29.220 --> 00:36:36.640
Although we'll see what that means with Guido dropping support for Python 2 on January 1.

00:36:36.640 --> 00:36:38.200
Maybe it'll truncate it a little bit.

00:36:38.200 --> 00:36:38.960
Yeah, who knows?

00:36:38.960 --> 00:36:39.300
Yeah.

00:36:39.300 --> 00:36:47.200
So in fact, what that means is Django 1.11 is going to be supported longer than 2.0 and 2.1.

00:36:47.200 --> 00:36:50.880
So if you have an organization that moves slowly.

00:36:50.880 --> 00:36:51.420
Right.

00:36:51.420 --> 00:36:54.280
So you'll be forced to upgrade on 2.0.

00:36:54.280 --> 00:36:54.700
Yeah.

00:36:55.020 --> 00:36:55.280
Yeah.

00:36:55.280 --> 00:37:01.380
If you have an organization that moves slowly, sticking with the long-term support version, it can be a really good thing.

00:37:01.380 --> 00:37:04.440
And at NASA, we are always long-term support.

00:37:04.440 --> 00:37:06.540
So that's why to stay on 1.11.

00:37:06.540 --> 00:37:10.320
Are there companies that have like LTS only sort of guidelines?

00:37:10.320 --> 00:37:13.020
Like do not use a version of Linux that's not LTS?

00:37:13.020 --> 00:37:18.040
Do not use these packages that are shorter term and like always just stay on the LTS version?

00:37:18.040 --> 00:37:19.460
Or is it just a culture thing?

00:37:19.600 --> 00:37:22.400
I don't know if they have formal policies or not.

00:37:22.400 --> 00:37:25.920
I know at NASA, we didn't have a formal one or at our center.

00:37:25.920 --> 00:37:35.120
And it might have changed there because with the, you know, advance and DevOps and deploying stuff to the cloud, things are easier, at least at NASA.

00:37:35.760 --> 00:37:49.760
But I know that there are certainly organizations that we've dealt with where because they know, you know, the engineers and developers know that upgrades just take a long time to implement like a major upgrade.

00:37:49.760 --> 00:37:55.080
They rather stay on an LTS and then get the minor patch updates.

00:37:55.080 --> 00:38:09.900
It's why Red Hat and other organizations do long-term support releases is just because the larger a group gets or the less funding it has for a project, the more likely it is to stay on a particular version of a project.

00:38:09.900 --> 00:38:11.100
Yeah, that makes a lot of sense.

00:38:11.100 --> 00:38:15.820
So would you recommend that people maybe start on Django 1.11?

00:38:15.820 --> 00:38:19.160
Or is it if you're starting a new project, it's 2.0 for sure?

00:38:19.160 --> 00:38:29.080
I say that 95% of people should be starting on the most recent version of Django, for which our book still certainly absolutely applies.

00:38:29.080 --> 00:38:38.400
And then, you know, upgrade as soon as, maybe not as soon as the next version of Django comes out, but like the first patch release, right?

00:38:38.400 --> 00:38:42.680
Because that's when all the secondary packages and projects update.

00:38:42.680 --> 00:38:45.320
It's just like that with Python, right?

00:38:45.320 --> 00:38:57.700
Like as much as I can't wait till 3.7 comes out for Python, I'm going to probably wait a little bit before start coding in it because I know that there are packages that I use that won't be supported yet.

00:38:57.700 --> 00:39:03.420
As much as I like to be on the bleeding edge of things, I don't have that luxury.

00:39:03.420 --> 00:39:08.180
You also don't want to wake up in the middle of the night because it's leaking memory or some weird thing like that, right?

00:39:09.100 --> 00:39:09.500
Yeah.

00:39:09.500 --> 00:39:16.960
So if you look at the dates, like Django 1.11 is scheduled to be supported till April 2020.

00:39:16.960 --> 00:39:20.420
Django 2.1 is till December 2019.

00:39:20.420 --> 00:39:23.820
So that's like right on the cusp of the Python 2 cutoff anyway.

00:39:23.820 --> 00:39:26.540
So there's not a huge difference like currently.

00:39:26.540 --> 00:39:27.020
No.

00:39:27.020 --> 00:39:28.460
At four months, right?

00:39:28.460 --> 00:39:32.660
So that's not, I don't know, if I was starting on new, I would definitely go for the 2.01.

00:39:32.660 --> 00:39:33.920
But yeah, it's just me, I guess.

00:39:34.020 --> 00:39:35.880
I always try to do the latest and greatest.

00:39:35.880 --> 00:39:36.180
Yeah.

00:39:36.180 --> 00:39:45.900
So another recommendation you have is like, you probably shouldn't move to 2 if you can't run on Python 3, which is obviously like, it's not, you shouldn't.

00:39:45.900 --> 00:39:49.800
You cannot move to 2 if you cannot run on Python 3, right?

00:39:49.800 --> 00:39:49.860
Yeah.

00:39:49.860 --> 00:39:55.120
So in fact, I really try not to make fun of, you know, other software developers.

00:39:55.120 --> 00:39:56.880
We have a challenging job.

00:39:57.060 --> 00:40:03.860
But sometimes on some of my projects, open source projects like cookie cutter Django, someone will say, hey, it's not working.

00:40:03.860 --> 00:40:08.660
And then they show the stack trace and it's clear they're running 2.7.

00:40:08.660 --> 00:40:13.860
And it's like, well, you're running Django 2.0 with Python 2.7.

00:40:13.860 --> 00:40:14.900
It's just going to break.

00:40:14.900 --> 00:40:16.260
Not intended to work that way.

00:40:16.260 --> 00:40:17.920
But we all make mistakes like that.

00:40:17.920 --> 00:40:20.640
So it's, you know, like I said, I shouldn't make fun of people.

00:40:20.640 --> 00:40:28.620
Well, I think part of it is like, we need a little bit more help from the operating system folks to make this a little bit smoother, right?

00:40:28.620 --> 00:40:33.460
Like on my Mac, if I'm just a person, I know I want Django and I know Django uses Python.

00:40:33.460 --> 00:40:36.620
I type Python and that comes up with a program that does a thing.

00:40:36.620 --> 00:40:43.340
Like I might try to type pip install Django and just run it, right?

00:40:43.340 --> 00:40:46.880
Like there's nothing along that path that's like a big warning slide.

00:40:46.980 --> 00:40:53.880
Like you're set up for failure, but if you don't know, oh, there's this thing where there's a Python 2 and a 3.

00:40:53.880 --> 00:40:54.740
They're incompatible.

00:40:54.740 --> 00:40:57.440
You don't have 3 by default, right?

00:40:57.440 --> 00:41:03.440
I mean, Linux is starting to fix the problem because they're starting to default to Python 3.

00:41:03.440 --> 00:41:07.160
Windows ironically fixed it by not supporting it at all.

00:41:07.160 --> 00:41:08.340
So you have to go seek it out.

00:41:08.340 --> 00:41:10.040
Why would you seek out the old one?

00:41:10.040 --> 00:41:12.140
I actually think that's kind of a good thing.

00:41:12.140 --> 00:41:12.400
Yeah.

00:41:12.400 --> 00:41:14.400
And then Mac comes with just the old one.

00:41:14.400 --> 00:41:15.620
What do you think about all that?

00:41:15.760 --> 00:41:21.640
Like I said, I kind of, I mean, I know with a POSIX operating system, there is no choice.

00:41:21.640 --> 00:41:24.420
I think they do need system Python just to run.

00:41:24.420 --> 00:41:27.200
Operating system experts can correct me there.

00:41:27.200 --> 00:41:32.320
So I don't think taking Python out of OS X or Linux is a solution.

00:41:32.320 --> 00:41:38.040
But in some ways I am envious of the Linux world or not the Linux, the Windows world where

00:41:38.040 --> 00:41:41.300
to run Python, you have to install fresh installation.

00:41:42.300 --> 00:41:50.320
And, you know, maybe the answer is with some of these projects of complexity, such as Pandas

00:41:50.320 --> 00:41:56.320
or Django or whatever is, you know, maybe we could put in something saying, oh, you're running

00:41:56.320 --> 00:41:57.140
the system Python.

00:41:57.140 --> 00:41:58.520
We're not going to let you do that.

00:41:58.520 --> 00:42:01.040
You have to go and install a new version of Python.

00:42:01.420 --> 00:42:04.420
And I don't know how realistic that is.

00:42:04.420 --> 00:42:07.580
I'm just not, I just don't know enough on the subject.

00:42:07.580 --> 00:42:14.640
But having seen beginners stumble through that again and again in the Python world, I definitely

00:42:14.640 --> 00:42:15.320
hear that.

00:42:15.320 --> 00:42:21.480
That would be kind of ideal if we forced people to install an external version of the language.

00:42:21.480 --> 00:42:21.920
Right.

00:42:21.920 --> 00:42:29.020
Or I understand the system needs it, but does it have to default to Python?

00:42:29.020 --> 00:42:34.380
Could it be Python 2 is the thing that is Python 2 and Python is Python 3, right?

00:42:34.380 --> 00:42:39.160
Like it, I feel like they could somehow patch that up and kind of make things more or less

00:42:39.160 --> 00:42:39.660
hang together.

00:42:39.660 --> 00:42:40.800
Probably would take some work.

00:42:40.800 --> 00:42:45.180
My reading is it's probably just not a priority, at least in the macOS world.

00:42:45.420 --> 00:42:49.060
In the operating system world, I just don't see them making it a priority.

00:42:49.060 --> 00:42:54.860
They've got other things on their plate, either for financial reasons or bandwidth reasons.

00:42:54.860 --> 00:43:01.860
But I wonder, you know, is it possible when you run a library like Pandas, for example, can

00:43:01.860 --> 00:43:04.500
we detect whether or not you're running the system Python?

00:43:04.500 --> 00:43:10.900
And if so, throwing that flag down saying, hey, you need to go to python.org or install

00:43:10.900 --> 00:43:17.080
Wakanda rather than forcing people to learn the hard way that screwing their system Python

00:43:17.080 --> 00:43:18.540
is going to be really painful.

00:43:18.540 --> 00:43:18.880
Yeah.

00:43:18.880 --> 00:43:23.720
I mean, probably the error you get the vast majority of the time is like this particular

00:43:23.720 --> 00:43:27.760
method or this attribute, like an attribute error or something to that effect or an import

00:43:27.760 --> 00:43:28.080
error.

00:43:28.080 --> 00:43:29.520
And that means nothing to people.

00:43:29.520 --> 00:43:30.520
It's just like, oh, it's broken.

00:43:30.520 --> 00:43:31.000
Right.

00:43:31.000 --> 00:43:33.460
But if you got a wrong version of Python error.

00:43:33.460 --> 00:43:33.980
Exactly.

00:43:33.980 --> 00:43:38.120
That actually would go a long ways towards, oh, I have the wrong version of Python.

00:43:38.120 --> 00:43:39.260
Not like, oh, it's broken.

00:43:39.260 --> 00:43:40.280
It just doesn't work.

00:43:40.520 --> 00:43:40.740
Wow.

00:43:40.740 --> 00:43:43.260
That's a really awesome idea, Mike.

00:43:43.260 --> 00:43:46.040
I wonder what we can do with it going forward.

00:43:46.040 --> 00:43:48.620
It's not hard.

00:43:48.620 --> 00:43:49.500
Right.

00:43:49.500 --> 00:43:51.280
Just check system version.

00:43:51.280 --> 00:43:51.560
Right.

00:43:51.560 --> 00:43:55.180
But it's it's seems like just a little bit of communication.

00:43:55.180 --> 00:43:57.260
But yeah, I I hear the problem.

00:43:57.260 --> 00:44:01.760
I would prefer that the operating systems come with modern Python if they're going to have

00:44:01.760 --> 00:44:01.920
it.

00:44:01.920 --> 00:44:03.840
But who knows what what could we do?

00:44:03.840 --> 00:44:09.320
This portion of Talk Python To Me is brought to you by ActiveState.

00:44:09.680 --> 00:44:14.100
ActiveState gives you a faster way to build and secure open source runtimes from your first

00:44:14.100 --> 00:44:15.300
line of code through to production.

00:44:15.300 --> 00:44:19.500
Every second you spend building your Python distro or trying to secure your Python programs

00:44:19.500 --> 00:44:22.060
is less time spent doing the work you love.

00:44:22.060 --> 00:44:25.740
You've got better things to do than trying to resolve dependencies or making sure that you

00:44:25.740 --> 00:44:28.300
tick off all security boxes when you ship to production.

00:44:28.300 --> 00:44:33.240
Standardize on your Python builds so you can have less friction in the development cycle and

00:44:33.240 --> 00:44:34.660
you can deliver apps faster.

00:44:34.660 --> 00:44:39.120
You can also get a unique server side way to verify your Python applications at runtime.

00:44:39.120 --> 00:44:42.580
Bake security right into your code without impacting performance.

00:44:42.580 --> 00:44:43.660
Go faster.

00:44:43.660 --> 00:44:47.940
Spend more time doing the work you love and comply with your enterprise security needs.

00:44:47.940 --> 00:44:53.580
Try ActiveState and see why it was chosen by IBM, Microsoft, NSA, Siemens, PepsiCo and more.

00:44:53.580 --> 00:44:57.660
Join millions of developers who trust ActiveState to build their open source language distros.

00:44:58.040 --> 00:45:01.820
Visit talkpython.fm/ActiveState for a special offer.

00:45:01.820 --> 00:45:04.260
That's talkpython.fm/ActiveState.

00:45:04.260 --> 00:45:07.240
Greetings from the expo booth here at PyCon.

00:45:07.240 --> 00:45:10.200
I just want to add one quick thing to that spot you just heard.

00:45:10.200 --> 00:45:13.560
The ActiveState folks just had a really cool announcement.

00:45:13.560 --> 00:45:18.040
So if you're here at PyCon, drop by their booth and ask them about it.

00:45:18.040 --> 00:45:19.180
They'd love to tell you about it.

00:45:19.180 --> 00:45:19.680
All right.

00:45:19.680 --> 00:45:20.740
Hope you enjoy this episode.

00:45:20.740 --> 00:45:25.080
And if you didn't make it to PyCon this year, you owe it to yourself to do it next time.

00:45:27.000 --> 00:45:27.500
All right.

00:45:27.500 --> 00:45:32.220
So generally, you're thinking the advice is, unless you have some kind of major blocker,

00:45:32.220 --> 00:45:35.400
one of these edge cases we talked about, it's all about Django too.

00:45:35.400 --> 00:45:36.840
It's all about Django too.

00:45:36.840 --> 00:45:38.280
Always go forward.

00:45:38.280 --> 00:45:44.300
Is there more to it than pip install dash capital U Django to upgrading?

00:45:44.300 --> 00:45:47.600
Or do I need to change configuration files or anything like that?

00:45:47.600 --> 00:45:49.820
In a perfect world, it's really easy.

00:45:49.820 --> 00:45:54.240
You just do pip install dash U Django, then run your tasks and deploy.

00:45:54.660 --> 00:46:01.060
But the Django world has a large and comprehensive ecosystem of packages and products.

00:46:01.060 --> 00:46:06.060
You know, Audrey and I had a part in building and maintaining it for a long time.

00:46:06.060 --> 00:46:08.360
We've stepped away in the past, I guess, two years.

00:46:09.300 --> 00:46:13.600
So sometimes your auxiliary packages don't work.

00:46:13.600 --> 00:46:17.060
And this is why it's so critical to have tests.

00:46:17.060 --> 00:46:19.300
Because, I mean, you know the drill.

00:46:19.300 --> 00:46:22.600
You update a package and then you run your tasks.

00:46:22.600 --> 00:46:29.200
And if something breaks, then you see if it's something in your code that's breaking or if it's something in a third-party package.

00:46:29.360 --> 00:46:32.060
And then in which case, maybe you need to update that.

00:46:32.060 --> 00:46:39.900
And tools like pyup.io, which is created and maintained by my good friend, Jan Eskabauer, that certainly makes it easier.

00:46:39.900 --> 00:46:42.160
But you still have to run those tasks.

00:46:42.160 --> 00:46:46.020
And this is, you know, my favorite reason to include tests.

00:46:46.020 --> 00:46:52.640
It's less to find bugs and more to make upgrades for versions of Python and Django and other tools easier.

00:46:52.640 --> 00:46:55.900
It's more the smoke test rather than the nuanced unit test, right?

00:46:55.900 --> 00:46:57.620
Like, does it generally hang together?

00:46:57.620 --> 00:46:58.360
Exactly.

00:46:58.360 --> 00:47:04.780
So fortunately, what I found is upgrading from 1.11 to 2.0 is pretty easy.

00:47:04.780 --> 00:47:16.080
There is none of the, from 1.10 to 1.11, I think it was, the way that Django handled cross-site request forgeries was changed.

00:47:16.080 --> 00:47:32.620
And if you had a busy, you know, very, very busy project with millions of users, if you deployed it and all of a sudden for a few minutes, everybody's forms stopped validating, that made upgrades or upgrading from 1.10 to 1.11 challenging.

00:47:32.620 --> 00:47:38.860
But fortunately, with going to 1.11 to 2.0, for us, it's been really trivial.

00:47:38.860 --> 00:47:40.840
It's been really sweet and easy.

00:47:40.840 --> 00:47:54.760
So I think that was kind of intentional when they went from 1.11 to 2.0 and the big change being the version of Python or that it doesn't support 2.7 is just to keep that advance easier.

00:47:54.760 --> 00:47:56.620
Yeah, it's clever to make that there.

00:47:56.620 --> 00:48:01.880
So that sort of decision to say the way people perceive it, the change is going to be actually really small.

00:48:01.880 --> 00:48:07.760
So encouraging people to get on that new track that's Python 3.0 only is really not scary.

00:48:07.760 --> 00:48:12.980
It's not like, oh, we've changed some settings, config format or something, and you've got to make sure you change that, too.

00:48:12.980 --> 00:48:14.840
For us, at least, it's been very easy.

00:48:14.840 --> 00:48:19.520
And this doesn't just apply to Django with Pandas or other tools.

00:48:19.520 --> 00:48:29.680
This is one that, like I said, is a great justification for having tests is that it makes these upgrades easier, especially as we move to the Python 3.0 only world of the future.

00:48:29.680 --> 00:48:39.300
Yeah, just create a new virtual environment, check it out again somewhere else, do the upgrade, run the requirements, do the upgrade, run your tests.

00:48:39.300 --> 00:48:41.020
If that works, you're probably good, right?

00:48:41.020 --> 00:48:44.040
You don't have to break what you have sitting on your main desk, right?

00:48:44.040 --> 00:48:44.560
Absolutely.

00:48:44.560 --> 00:48:44.980
Nice.

00:48:44.980 --> 00:48:46.420
So what's the future, Django?

00:48:46.420 --> 00:48:50.460
I'm not a core developer, so people often think that I am.

00:48:50.460 --> 00:48:53.700
So I don't really know too much about what's coming.

00:48:53.700 --> 00:49:00.900
When I have looked at the roadmap, there hasn't been anything super concrete that's changing.

00:49:00.900 --> 00:49:08.840
But again, I'm not really in the loop, and I don't go to that many Django-specific conferences, so I just don't know.

00:49:08.840 --> 00:49:12.820
There are some things that I would love to see, though.

00:49:12.820 --> 00:49:15.660
Deployment is still kind of a pain.

00:49:15.660 --> 00:49:26.900
I know there's services like Python Anywhere and Heroku and now Zappa that make it easier, but I've always wondered if there's a way to make those hooks a little bit better and easier.

00:49:27.460 --> 00:49:34.040
And also, we're in a world of data science, and for better or for worse.

00:49:34.040 --> 00:49:42.220
And having Django integrate better with those tools, I think, is something we're going to see more of in the future.

00:49:42.620 --> 00:50:00.280
There aren't that many huge and easy to lose, not huge, I guess that's the wrong term, but comprehensive libraries with good documentation on how to integrate, pulling data out of a server, running it through Pandas or PyTorch or whatever, and then displaying that with Django.

00:50:00.280 --> 00:50:09.180
There's the odd blog post or Stack Overflow answer, but I'm guessing in this year we're going to see that start to change.

00:50:09.600 --> 00:50:14.620
Because part of data science is displaying your data, displaying the results.

00:50:14.620 --> 00:50:18.000
And you can crunch numbers all you want.

00:50:18.000 --> 00:50:18.940
You can data wrangle.

00:50:18.940 --> 00:50:20.040
You can do all that stuff.

00:50:20.040 --> 00:50:29.280
But if you don't display your data, especially with a large project that needs to be able to do this for its end users, who's your customer?

00:50:29.280 --> 00:50:30.200
The sales team?

00:50:30.200 --> 00:50:31.740
That may not be enough for you.

00:50:31.740 --> 00:50:32.120
For sure.

00:50:32.120 --> 00:50:38.340
And we've got things like Jupyter, JupyterLab, and there's a whole explosion of notebook solutions.

00:50:38.840 --> 00:50:47.020
But in the end, maybe you want to show it, like you said, not publish a paper of data to your sales team, but give them dashboards within the app and things like that.

00:50:47.020 --> 00:50:47.460
Yeah.

00:50:47.460 --> 00:50:55.280
And not to bring up politics, but I don't know too much about the whole thing with Cambridge Analytica.

00:50:55.280 --> 00:51:01.020
But from what I'm gathering, part of what they were giving were reports to end users.

00:51:01.980 --> 00:51:15.360
And, you know, while that might have been done for the wrong cause and the wrong purpose, there's a sales opportunity for you, which is for consultants or companies around the world, which is you have this framework, Django.

00:51:15.360 --> 00:51:26.320
You have all these machine learning and data science tools that are accessible via Python, providing a means for publishing that data is part and parcel in what we do as engineers.

00:51:26.660 --> 00:51:27.060
Yeah, for sure.

00:51:27.060 --> 00:51:29.360
And making that easier and beautiful, that'd be awesome.

00:51:29.360 --> 00:51:30.340
All right.

00:51:30.340 --> 00:51:36.320
Well, let's go ahead and actually have one more question before we drop off, Django, that I wanted to, I threw here at the end, I want to ask you.

00:51:36.720 --> 00:51:49.900
So one of the really powerful things that we have in Python 3 these days, and it started 3.4, 3.5, but really came into its own in 3.5 with async and away is the whole asynchronous programming model.

00:51:49.900 --> 00:51:56.680
And that's like largely missing from the main web frameworks, right?

00:51:56.680 --> 00:52:04.280
Like, just you can't throw an async Jenga view up there or an async flask view or an async pyramid view or whatever, right?

00:52:04.280 --> 00:52:06.540
And a wait on various things.

00:52:06.540 --> 00:52:08.560
Do you see stuff like that coming?

00:52:08.560 --> 00:52:09.520
Do you think it's important?

00:52:09.520 --> 00:52:11.440
I think it's critically important.

00:52:11.440 --> 00:52:25.980
One of the things is when you play with a language like modern Python outside of the web or with Go or with JavaScript is async is just getting easier and easier to implement.

00:52:25.980 --> 00:52:27.420
It's more straightforward.

00:52:28.020 --> 00:52:37.660
And the issue, though, with Python web frameworks is that this is a very hard problem, be it Django, Flask, Pyramid, or whatever.

00:52:37.660 --> 00:52:38.760
They're all based on a WSGI.

00:52:38.760 --> 00:52:40.160
They're all based on WSGI.

00:52:40.160 --> 00:52:45.020
And WSGI follows a very precise request and response cycle.

00:52:45.020 --> 00:52:56.720
And while Andrew Godwin has been working on channels for Django, which provides an asynchronous system and it's powered by asyncio under the hood.

00:52:56.720 --> 00:53:00.260
But they're all these like we have Quart for Flask, which is really nice.

00:53:00.260 --> 00:53:03.300
But they're all like, we're going to take this and make a copy of it.

00:53:03.300 --> 00:53:07.020
And it'll be really, really close to the thing that you want to have.

00:53:07.020 --> 00:53:07.480
Right.

00:53:07.480 --> 00:53:08.720
Django, Flask, whatever.

00:53:08.720 --> 00:53:09.340
Right.

00:53:09.340 --> 00:53:13.880
But it's just they have not made their way into these major, the actual official major frameworks.

00:53:13.880 --> 00:53:24.440
I think that Django is too resistant to breaking backwards compatibility that I don't see it happening in the next couple of years, which I think is kind of a shame.

00:53:24.520 --> 00:53:30.260
You know, I think Andrew Godwin should just be committing right to core, right to the master branch.

00:53:30.260 --> 00:53:31.300
Yeah.

00:53:31.300 --> 00:53:32.640
The stuff he's doing is awesome.

00:53:32.640 --> 00:53:36.400
I had him on the show quite a while ago and people can go back and listen to the whole episode on that.

00:53:36.400 --> 00:53:36.820
Yeah.

00:53:37.100 --> 00:53:41.660
I think Flask's API is pretty stable, but there are async clones for Flask.

00:53:41.660 --> 00:53:42.980
I think there's Sanek.

00:53:42.980 --> 00:53:44.740
There's API star.

00:53:44.740 --> 00:53:46.240
There's a bunch of these things.

00:53:46.240 --> 00:53:52.120
But even though these things exist, deployment isn't really that straightforward.

00:53:52.300 --> 00:53:58.720
I know that you can deploy a channels application on Heroku and I'm pretty sure you can probably do it on Python anywhere.

00:53:58.720 --> 00:54:01.140
But it's not the default operation.

00:54:01.140 --> 00:54:04.880
It's not for people who are just new to the system.

00:54:04.880 --> 00:54:06.220
It's an advanced topic.

00:54:06.560 --> 00:54:11.700
And I think that's a shame because the way of the world is async, right?

00:54:11.700 --> 00:54:12.640
That's the trend.

00:54:12.640 --> 00:54:14.080
And it's not a trend.

00:54:14.080 --> 00:54:15.560
It's the way things are going.

00:54:16.360 --> 00:54:22.040
Now, Andrew Godwin has his own specification that he wrote or actually created.

00:54:22.040 --> 00:54:27.520
It's not his specification called ASCII, which is asynchronous service gateway interface.

00:54:27.520 --> 00:54:38.020
But until I think we have a long way, I think WSGI is so entrenched in our Python world that it's really hard to break out.

00:54:38.020 --> 00:54:39.820
And I think it's a shame.

00:54:39.820 --> 00:54:45.780
And I think if someone came up with a business model to get around that, they would make a lot of money.

00:54:45.920 --> 00:54:48.300
I know I would use that system in a heartbeat.

00:54:48.300 --> 00:55:06.140
As much as I like using EC2 and playing around Zap on Lambda to be able to do asynchronous easily with easy deployments without having to stand up my own server or use a platform as a service system that's super integrated in itself.

00:55:06.140 --> 00:55:08.140
For me, that would be awesome.

00:55:08.140 --> 00:55:09.860
I'd love to see something like that.

00:55:09.860 --> 00:55:13.140
But I think that's not going to happen for several years.

00:55:13.140 --> 00:55:13.680
Yeah.

00:55:13.780 --> 00:55:17.460
It's kind of a bit of a chicken and egg kind of blockade thing.

00:55:17.460 --> 00:55:18.660
But it'll break free.

00:55:18.660 --> 00:55:19.680
It'll come out.

00:55:19.680 --> 00:55:21.360
It just sooner would be better.

00:55:21.360 --> 00:55:27.560
Every time I hear somebody say, oh, we're switching to go for because the performance is better async and whatever.

00:55:27.700 --> 00:55:30.940
Part of the problem is somewhat self-inflicted.

00:55:30.940 --> 00:55:41.400
And it could easily be fixed with just a slight, like basically a one function called deep, deep down from process request or whatever it's called to like process async request.

00:55:41.400 --> 00:55:43.740
And it like kind of cracks loose, you know.

00:55:43.740 --> 00:55:44.840
But yeah.

00:55:44.840 --> 00:55:45.060
Okay.

00:55:45.060 --> 00:55:49.460
Someday we can look forward to the future with async methods and all the major frameworks.

00:55:49.460 --> 00:55:49.820
Yeah.

00:55:49.820 --> 00:55:50.720
I can't wait.

00:55:50.720 --> 00:55:52.380
These creative and powerful.

00:55:52.380 --> 00:55:52.920
Yeah.

00:55:52.920 --> 00:55:53.860
Knockoffs.

00:55:53.860 --> 00:55:55.720
But let's bring those back in.

00:55:55.720 --> 00:55:56.120
Right.

00:55:56.120 --> 00:55:56.580
Nice.

00:55:56.580 --> 00:55:56.780
Okay.

00:55:56.780 --> 00:55:57.920
Well, let's touch really.

00:55:57.920 --> 00:55:59.100
We're getting low on time.

00:55:59.100 --> 00:56:01.720
But maybe just tell us a little bit about your Django book.

00:56:01.720 --> 00:56:03.980
It's been one of the more popular ones.

00:56:03.980 --> 00:56:05.620
So you have two scoops of Django, right?

00:56:05.620 --> 00:56:06.000
Yeah.

00:56:06.000 --> 00:56:07.060
Two scoops of Django.

00:56:07.060 --> 00:56:09.800
And it's been out since 2013.

00:56:09.800 --> 00:56:13.360
We're on the fourth edition, which is kind of awesome.

00:56:13.360 --> 00:56:22.160
If we do another version, we won't release it until next year, which is when the next time a long-term support version of Django is released.

00:56:22.160 --> 00:56:24.400
And if we do it, we'll make.

00:56:24.400 --> 00:56:26.060
You're going to call it two scoops of Django 2?

00:56:26.060 --> 00:56:26.760
2.2.

00:56:26.760 --> 00:56:29.660
It'll be two scoops of Django 2.2 if we do it.

00:56:29.660 --> 00:56:32.580
And because it's so much work to do.

00:56:32.800 --> 00:56:35.800
If you want to inflict pain on an enemy, get them to write a book.

00:56:35.800 --> 00:56:41.620
And if we do it, we're planning some substantial changes.

00:56:41.620 --> 00:56:48.360
Like we'd probably have much more, touch a lot more on asynchronous stuff, especially with Python 3.

00:56:48.360 --> 00:56:52.480
And we'll get to get rid of all of the Python 2 stuff, which will be awesome.

00:56:52.480 --> 00:56:52.940
Yeah, yeah.

00:56:52.940 --> 00:56:53.460
That's really cool.

00:56:53.460 --> 00:56:55.640
So what are some of the core principles from your book?

00:56:55.640 --> 00:56:58.120
With two scoops of Django, it's a big book.

00:56:58.120 --> 00:56:59.520
It's 550 pages.

00:56:59.520 --> 00:57:03.580
But you can boil it down to you want to embrace best practices.

00:57:03.580 --> 00:57:14.700
Pet bait, good import policies, having tasks, be aware of security, understand your tools, and try to keep your implementation of everything as simple as possible.

00:57:15.080 --> 00:57:22.220
Because your business logic, no matter what your project is, is never going to be as simple as you think it's going to be.

00:57:22.220 --> 00:57:28.160
The other thing that we did that really helped with it was have a lot of fun examples.

00:57:28.520 --> 00:57:30.340
I mean, that's the theme, ice cream, right?

00:57:30.340 --> 00:57:32.680
Audrey insisted on that.

00:57:32.680 --> 00:57:35.680
And she did the illustrations.

00:57:35.680 --> 00:57:40.280
And while she was also doing the illustrations, I need to point out, she wrote more of the book than I did.

00:57:40.280 --> 00:57:45.000
So I'm the loud one on social media, but she's the more productive one.

00:57:45.000 --> 00:57:49.820
You don't go to MIT and not know how to write about Python and Django.

00:57:50.460 --> 00:57:52.680
And of course, there's the ice cream theme.

00:57:52.680 --> 00:57:55.080
And that ties into the fun examples.

00:57:55.080 --> 00:57:56.640
A lot of programming books.

00:57:56.640 --> 00:57:59.840
We've seen a lot of changes since the release of our book.

00:57:59.840 --> 00:58:04.120
And other books like, you know, Land of Lisp, they've gotten more colorful.

00:58:04.120 --> 00:58:10.120
But when we first came out, we were like a fresh rock being dropped into the pond.

00:58:10.120 --> 00:58:11.680
It was kind of awesome at the time.

00:58:11.680 --> 00:58:14.380
And now we're not so significant, which is kind of sad.

00:58:14.500 --> 00:58:16.600
A fresh replacement for a few and a bar.

00:58:16.600 --> 00:58:17.380
Or a spam.

00:58:17.380 --> 00:58:18.220
I love spam.

00:58:18.220 --> 00:58:20.800
But yeah, that had gotten very old.

00:58:20.800 --> 00:58:21.440
That's for sure.

00:58:21.440 --> 00:58:22.560
All right, cool.

00:58:22.560 --> 00:58:24.080
So definitely recommend your book.

00:58:24.080 --> 00:58:24.920
It's a good one.

00:58:24.920 --> 00:58:29.640
I guess one final thing I want to ask you about, because we were talking before we hit record.

00:58:29.640 --> 00:58:32.840
You have some good advice for folks is PyCon is coming up.

00:58:32.840 --> 00:58:35.600
This episode, I don't remember how the timing is going to line up.

00:58:35.600 --> 00:58:37.780
This is going to be like right around PyCon.

00:58:37.780 --> 00:58:40.540
It may be the week of PyCon that this comes out.

00:58:40.540 --> 00:58:43.540
So what's your advice for people getting the most out of that conference?

00:58:43.920 --> 00:58:48.100
My advice to PyCon is, first of all, you should go if you can.

00:58:48.100 --> 00:58:54.460
And if you can't go to the one in the U.S. or North America, you should go to your local regional one.

00:58:54.460 --> 00:58:58.240
And then if you go, don't hang out with your friends.

00:58:58.240 --> 00:59:00.060
Make new friends.

00:59:00.060 --> 00:59:02.140
You are there to broaden your horizons.

00:59:02.140 --> 00:59:04.620
And hanging out with your friends, I know it's easy.

00:59:04.620 --> 00:59:06.020
And I know you're nervous.

00:59:06.020 --> 00:59:07.060
I know you're scared.

00:59:07.060 --> 00:59:10.360
But by making new friends, you're going to broaden your horizons.

00:59:10.360 --> 00:59:11.800
You're going to learn new ideas.

00:59:11.800 --> 00:59:13.560
You're going to make new connections.

00:59:13.560 --> 00:59:16.240
And that is why you are there.

00:59:16.240 --> 00:59:20.760
And while you're doing that, don't show off how much you know.

00:59:20.760 --> 00:59:23.380
Instead, ask questions.

00:59:23.380 --> 00:59:39.360
And yeah, if someone starts to explain something that's super trivial and obvious to you, maybe you've got a PhD in a particular field and it's on your label and someone starts to explain it to you, then yeah, you can start showing off how much you know.

00:59:39.360 --> 00:59:42.040
But really try to focus on asking questions.

00:59:42.040 --> 00:59:46.740
Because you're there to learn, not to show off what you know.

00:59:46.940 --> 00:59:57.920
And I know as someone who has gone to conferences and hire people, I'd rather hire someone who is eager to learn and find out new things than a know-it-all.

00:59:57.980 --> 00:59:58.980
I definitely second that.

00:59:58.980 --> 00:59:59.560
Yeah, for sure.

00:59:59.560 --> 01:00:06.440
And then if you have been to a conference before or if it's your first one, volunteer to help in a session.

01:00:06.440 --> 01:00:09.160
If there's a volunteer process, get involved.

01:00:09.640 --> 01:00:13.140
And again, the reason is you're there to make connections.

01:00:13.140 --> 01:00:17.680
You never know who is going to be there helping out with you.

01:00:17.680 --> 01:00:26.740
I've certainly made some life-changing differences in my career by volunteering and just happening to meet that right person.

01:00:26.740 --> 01:00:29.580
And so that's really important.

01:00:29.580 --> 01:00:33.600
But overall, just try to break free of the patterns that you have.

01:00:33.800 --> 01:00:38.220
And if you're worried about looking like an idiot, don't.

01:00:38.220 --> 01:00:39.780
Because people will forget you.

01:00:39.780 --> 01:00:46.920
If you do something that's embarrassing and you think it's embarrassing, but most people won't really care.

01:00:46.920 --> 01:00:47.780
They'll be like, oh, whatever.

01:00:47.780 --> 01:00:50.940
It's just another overeager conference goer.

01:00:51.380 --> 01:00:56.320
I know I've done some things that are really embarrassing and no one remembers but me.

01:00:56.320 --> 01:00:58.120
Like, I can assure you that.

01:00:58.120 --> 01:01:00.360
And I'm not talking about offensive things.

01:01:00.360 --> 01:01:01.320
Like, don't be offensive.

01:01:01.320 --> 01:01:11.480
But if you happen to start explaining to this middle-aged guy, you know, that Python 3 is going to be taking over on January 1.

01:01:11.480 --> 01:01:14.040
And then someone points out to you that's Guido Van Rossum.

01:01:14.040 --> 01:01:16.480
You know, he's not going to remember that.

01:01:16.480 --> 01:01:20.240
In fact, he would probably appreciate somebody coming up and saying that to him.

01:01:20.660 --> 01:01:21.280
Yeah, you're not.

01:01:21.280 --> 01:01:22.460
It's going to be okay.

01:01:22.460 --> 01:01:27.560
Just break free of your normal habits and broaden your horizons.

01:01:27.560 --> 01:01:28.100
Good advice.

01:01:28.100 --> 01:01:37.880
One thing about PyCon, at least PyCon US, because it's so large, that there's an opportunity to tie all three of those suggestions up into one quick and easy thing.

01:01:37.880 --> 01:01:40.600
A lot of conferences have people on the stage.

01:01:40.600 --> 01:01:42.080
There's one track or something.

01:01:42.080 --> 01:01:43.960
There they have the open sessions.

01:01:43.960 --> 01:01:49.380
And so you can volunteer by proposing and kicking off an open session.

01:01:49.940 --> 01:01:51.440
Your friends may not come.

01:01:51.440 --> 01:01:54.380
And you have to ask questions because there's no presenter.

01:01:54.380 --> 01:01:56.800
So it's all about sitting there and having a conversation.

01:01:56.800 --> 01:02:00.840
So I definitely recommend people embrace the open session side of things.

01:02:00.840 --> 01:02:02.920
Open space, whatever they call it officially.

01:02:02.920 --> 01:02:05.200
Because that's something that's not recorded.

01:02:05.200 --> 01:02:07.220
It's only a live experience.

01:02:07.220 --> 01:02:08.220
And it gets you involved.

01:02:08.220 --> 01:02:08.740
Absolutely.

01:02:09.040 --> 01:02:09.320
Nice.

01:02:09.320 --> 01:02:09.880
All right.

01:02:09.880 --> 01:02:12.320
Well, we're just about out of time.

01:02:12.320 --> 01:02:16.720
But before we call it a show, let's ask you the two questions.

01:02:16.720 --> 01:02:19.960
So if you're going to write some Python code, some Django code, what editor do you use?

01:02:20.380 --> 01:02:24.240
So I run and I have a 2011 MacBook Air.

01:02:24.880 --> 01:02:29.960
And so an IDE like PyCharm is just going to break it.

01:02:29.960 --> 01:02:32.620
It worked several years ago, but it's not going to work now.

01:02:33.220 --> 01:02:38.000
So I just use Atom because it runs and it runs fast these days.

01:02:38.000 --> 01:02:46.080
And also if I need to install it on a new machine, as much as I like Sublime, what I like about Atom is I can just install it and go.

01:02:46.220 --> 01:02:51.940
Because we have a couple test machines for Windows and other operating systems that I don't use that often.

01:02:51.940 --> 01:02:56.160
And I can just get Atom going in about 20 minutes.

01:02:56.160 --> 01:03:00.360
It's something that's always there and you don't have to change depending on where you are.

01:03:00.360 --> 01:03:01.120
That's pretty nice.

01:03:01.120 --> 01:03:05.380
And I don't need to learn arcane commands like with Vim or something else.

01:03:05.380 --> 01:03:05.900
Exactly.

01:03:05.900 --> 01:03:06.580
Exactly.

01:03:06.580 --> 01:03:07.340
I'm with you on that.

01:03:07.340 --> 01:03:09.780
So notable PyPI package?

01:03:09.780 --> 01:03:10.980
So I'm going to list two.

01:03:10.980 --> 01:03:12.140
I know we're short on time.

01:03:12.140 --> 01:03:16.240
The first one is Black, which is the uncompromising code formatter.

01:03:16.240 --> 01:03:18.200
And it's awesome.

01:03:18.200 --> 01:03:22.560
I'm replacing PyFlakes and all these other tools on my project with it.

01:03:22.560 --> 01:03:30.300
And the reason why is because I cannot keep, this is my dark secret, I cannot keep single quotes and double quotes from getting into my code.

01:03:30.300 --> 01:03:32.360
And Black just fixes all of that.

01:03:32.360 --> 01:03:33.880
And no one complains or yells at me.

01:03:33.880 --> 01:03:34.920
Oh, it fixes that.

01:03:34.920 --> 01:03:35.960
That's pretty interesting.

01:03:35.960 --> 01:03:36.800
Yeah.

01:03:36.800 --> 01:03:44.140
So we're trying to figure out on our projects how to get it to run and clean stuff up the way we want.

01:03:44.140 --> 01:03:46.160
But yeah, Black is awesome.

01:03:46.160 --> 01:03:48.700
And comes in any color you want, as long as it's black.

01:03:48.700 --> 01:03:49.280
Exactly.

01:03:49.280 --> 01:03:52.920
And the guy who founded it, Rikash Langa, he's a friend of mine.

01:03:52.920 --> 01:03:54.260
But that's not why I use it.

01:03:54.260 --> 01:03:55.280
Well, maybe a little bit.

01:03:55.280 --> 01:03:56.420
That's why I noticed it.

01:03:56.420 --> 01:03:58.020
But it's Black is awesome.

01:03:58.020 --> 01:03:58.580
Okay, cool.

01:03:58.580 --> 01:04:00.800
And then another one's close to home for you guys, right?

01:04:00.840 --> 01:04:04.720
Yeah, that's Cookie Cutter because, well, packaging.

01:04:04.720 --> 01:04:07.420
And it's our most popular project.

01:04:07.420 --> 01:04:09.660
It's got over 7,000 GitHub stars.

01:04:09.660 --> 01:04:16.760
There's a lot of Fortune 500 companies who use it, which is kind of flattering in government organizations.

01:04:16.760 --> 01:04:22.180
Whenever I want to ego trip, I just go into GitHub and search for Cookie Cutter packages.

01:04:22.180 --> 01:04:23.760
Yeah, there's a bunch now.

01:04:23.760 --> 01:04:24.260
It's really cool.

01:04:24.260 --> 01:04:24.620
Yeah.

01:04:24.620 --> 01:04:25.660
Nice to see that doing well.

01:04:25.660 --> 01:04:25.980
Okay.

01:04:25.980 --> 01:04:26.400
Awesome.

01:04:26.400 --> 01:04:28.280
Yeah, I definitely recommend Cookie Cutter as well.

01:04:28.460 --> 01:04:33.780
A lot of the web frameworks are starting to adopt it as the way to scaffold up the apps as well.

01:04:33.780 --> 01:04:35.500
Pyramid went all in on that.

01:04:35.500 --> 01:04:36.340
I don't know about Django.

01:04:36.340 --> 01:04:37.700
They're not using it, are they?

01:04:37.700 --> 01:04:43.220
No, but there's a lot of templates for building Django projects that use Cookie Cutter.

01:04:43.220 --> 01:04:43.720
Right.

01:04:43.720 --> 01:04:49.640
There's independent templates that you can just, you know, Cookie Cutter or whatever the link is and create your Django project, right?

01:04:49.640 --> 01:04:50.140
Exactly.

01:04:50.140 --> 01:04:50.780
Yeah, nice.

01:04:50.780 --> 01:04:52.380
All right, final call to action.

01:04:52.380 --> 01:04:54.100
People are excited about Django 2.

01:04:54.100 --> 01:04:56.000
Dropping that Python 2 aspect.

01:04:56.000 --> 01:04:57.620
What do you recommend for them?

01:04:57.620 --> 01:04:58.280
Final call to action.

01:04:58.280 --> 01:05:08.300
Use Django 2.0, the most recent version of Django, if you can, and buy our book because even though it says 1.11 on the label, it still applies.

01:05:08.300 --> 01:05:08.780
That's awesome.

01:05:08.780 --> 01:05:10.680
And of course, your packaging course as well, right?

01:05:10.680 --> 01:05:11.140
Yes.

01:05:11.140 --> 01:05:13.480
It's available in both English and Spanish.

01:05:13.480 --> 01:05:20.520
Although we talked a lot about Django, the course itself doesn't mention or doesn't have anything to do with Django.

01:05:20.520 --> 01:05:25.140
It's Python specific or it's Django free, however you want to call it.

01:05:25.140 --> 01:05:25.320
Yeah.

01:05:25.320 --> 01:05:27.100
Perfect.

01:05:28.100 --> 01:05:28.320
Perfect.

01:05:28.320 --> 01:05:28.540
Perfect.

01:05:28.540 --> 01:05:30.500
So I'll put a link to all that stuff in the show notes.

01:05:30.500 --> 01:05:30.860
Okay.

01:05:30.860 --> 01:05:31.380
All right, Danny.

01:05:31.380 --> 01:05:32.360
Thank you so much for being on the show.

01:05:32.360 --> 01:05:34.820
It was great to chat with you and talk about the web.

01:05:34.820 --> 01:05:35.920
Thank you for having me.

01:05:35.920 --> 01:05:36.280
Yeah.

01:05:36.280 --> 01:05:37.600
Past, present, and future.

01:05:37.600 --> 01:05:39.120
It's going to be a good ride, right?

01:05:39.120 --> 01:05:39.760
Absolutely.

01:05:39.760 --> 01:05:40.200
Yep.

01:05:40.200 --> 01:05:40.620
Talk to you later.

01:05:40.620 --> 01:05:40.820
Bye.

01:05:41.620 --> 01:05:44.200
This has been another episode of Talk Python To Me.

01:05:44.200 --> 01:05:45.200
Today's guest.

01:05:45.200 --> 01:05:47.180
Today's guest has been Daniel Roy Greenfield.

01:05:47.180 --> 01:05:50.960
And this episode has been brought to you by MongoDB and Active State.

01:05:51.560 --> 01:05:54.420
Interested in seeing how web apps are built with Python and MongoDB?

01:05:54.420 --> 01:06:00.640
Register for my webinar I'm doing with MongoDB over at mongodb.com slash webinar slash Python.

01:06:00.640 --> 01:06:01.400
See you there.

01:06:01.400 --> 01:06:06.960
Active State gives you a faster way to build and secure open source runtimes.

01:06:07.140 --> 01:06:13.980
From your first line of code through to production, check it out at talkpython.fm/active state.

01:06:13.980 --> 01:06:15.560
Want to level up your Python?

01:06:15.560 --> 01:06:20.700
If you're just getting started, try my Python jumpstart by building 10 apps or our brand new

01:06:20.700 --> 01:06:22.560
100 days of code in Python.

01:06:22.560 --> 01:06:26.320
And if you're interested in more than one course, be sure to check out the everything bundle.

01:06:26.320 --> 01:06:28.620
It's like a subscription that never expires.

01:06:28.620 --> 01:06:30.820
Be sure to subscribe to the show.

01:06:30.820 --> 01:06:33.020
Open your favorite podcatcher and search for Python.

01:06:33.020 --> 01:06:34.260
We should be right at the top.

01:06:34.260 --> 01:06:39.640
You can also find the iTunes feed at /itunes, Google Play feed at /play,

01:06:39.640 --> 01:06:43.580
and direct RSS feed at /rss on talkpython.fm.

01:06:43.580 --> 01:06:45.440
This is your host, Michael Kennedy.

01:06:45.440 --> 01:06:46.800
Thanks so much for listening.

01:06:46.800 --> 01:06:47.880
I really appreciate it.

01:06:47.880 --> 01:06:49.800
Now get out there and write some Python code.

01:06:49.800 --> 01:07:10.420
I'll see you next time.