Heads up! To view this whole video, sign in with your Courses account or enroll in your free 7-day trial. Sign In Enroll
Preview
Start a free Courses trial
to watch this video
Handling PUT and DELETE requests requires a bit more work and control than GET and POST do. Let me show you how to handle these two really useful HTTP methods.
Related Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign upRelated Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign up
So this video has a new workspace.
0:00
So again, you should close yours and
open the new one.
0:02
And then you'll be able to see the get and
post methods.
0:05
So like here's the post for
courses and the stuff for views.
0:09
I want to talk about what I
did in reviews real quick.
0:15
Some of you may have noticed this,
0:20
I kinda left it in to see how
your debugging skills were.
0:21
But if you leave your review
fields as just course,
0:24
which is fine, then it becomes really hard
to turn it into the URL for the course.
0:28
So I actually added a new
one called for_course,
0:33
and we just set that to
be where the course goes.
0:36
So we never actually reveal like the
course's ID which doesn't really matter
0:39
one way or the other, but
that's the way that I've been doing it.
0:43
And then inside post, create sends
back the record that was created so
0:47
you can just grab the review and add
the course to it, send it right through.
0:53
So again, this is in the workspace so
you can look through all of it.
0:58
So we've talked get,
we've talked about post, and so for
1:01
this one I want to focus on put and
delete.
1:05
And again I'm going to
do them on courses and
1:08
you can kind of replicate
them onto reviews.
1:10
Put requests are for updating records.
1:13
So we're going to be working on here
in the course resource on the courses.
1:16
But unlike patch requests, they have to
contain all of the data for the record,
1:20
not just the updated pieces.
1:24
So with a patch, you can send in,
I need to change the title, and
1:26
send just the title.
1:29
With put you have to
send the entire record.
1:31
Now I'm not going to implement
patch in this course, but
1:34
feel free to experiment
with it if you want to.
1:37
So let's talk about put.
1:39
So first of all i'm gonna marshal
this with the course fields.
1:41
Cuz put's always going
to be a single record.
1:45
And so then we need to parse
the args like usual, so
1:48
self.reqparse.parse_args.
1:53
Make sure the arguments are good.
1:56
And then because of how peewee works,
1:58
we have to kind of write
our query a little funny.
2:00
So we'll do query = models.Course.update
and we're going to update it
2:04
with the args .where(models.Course.id==id)
that was passed in.
2:09
That line's a little long, but
whatever I'm just gonna leave it.
2:18
And query.execute to actually run
execute to actually run the query.
2:22
And then what do we want to return?
2:30
Well what we wanna do is we want to
return, oops no need to type return twice.
2:32
Add reviews and
then I wanna go fetch the new model again.
2:37
So
models.course.get(models.course.id==id)).
2:43
So add reviews to that.
2:49
Right?
2:52
This lines not long, 73,
I read the lines wrong.
2:53
Okay, so, but here's the thing though.
2:55
I am going to do the some
of the other ones too.
2:59
This is a put and it's gonna come back
automatically with a 200, so that's fine,
3:02
I'm gonna go ahead and specify that.
3:07
But I need to add a header to this.
3:08
So let's put a parenthesis right there, so
that we can break this to the next line.
3:10
And we're gonna add
a dictionary here at the end.
3:15
So this 200, specifies the status code.
3:18
This dictionary has any additional
headers that you want to include.
3:21
So let's include the location header.
3:23
And then inside that location header,
we're gonna use url_for.
3:26
And we're gonna say
resources.courses.course.
3:28
And the id is going to be equal to the id.
3:33
So close that dictionary.
3:36
Close that tuple that reusing
just to hold everything together.
3:38
I'm gonna save that.
3:42
Now, a lot of put is just like post.
3:43
Right?
Right, we look up here at post.
3:46
Post and
put aren't super different, right.
3:48
Take the args, parse them, and use them.
3:52
Unlike post,
where I could do models.Course.create,
3:54
p requires me to do this query thing.
3:56
But we already went over that,
so that's cool.
3:58
And I'm gonna actually reuse
this pattern for delete as well.
4:01
So I don't mind having something
a little different right here.
4:05
You may not have seen the returning of a
tuple before, but we can talk about that.
4:08
This one's the response body.
4:13
So this'll be a template,
or for right now,
4:16
it's gonna be a thing that gets marshaled.
4:19
So it'll be JSON data.
4:21
This is the status code like
we talked about, right?
4:23
So this one's 200, because there's
not a status code that relates to,
4:25
I updated everything, put is actually
a little bit weird in this though.
4:30
According to the http spec,
put should have an empty body.
4:34
So nothing in the body.
4:38
And a status code of 204,
which means there's no body, but
4:39
that's not very useful.
4:42
So instead I'm sending back the updated
record and a status code of 200,
4:44
to indicate that the body is not empty.
4:48
And finally in the dictionary,
like I said, is the different headers.
4:50
So in this view I'm going to
send back the location header to
4:54
where the updated record is.
4:57
Which is what you would do with
the empty body in the 204.
4:58
It's on the location so
they know where to go.
5:01
I'm kind of just mixing
these two things up.
5:04
Yeah?
Maybe?
5:09
Okay, cool whatever.
5:11
So let's actually take this stuff and
let's paste it here into delete.
5:12
Cuz I'm here, I might as well
use the delete method, right?
5:19
So we're gonna change this to delete, and
we don't have any arguments for delete,
5:22
we just delete stuff.
5:27
So where the Course.id==id.
5:28
And then we're gonna execute that.
5:30
And then, to be good,
5:32
we're gonna send back an empty body and
a 204 because that's what it should be.
5:34
And I'm gonna send back a location, but
the location's gonna go to go to courses,
5:41
not to course,
because this record's been deleted.
5:46
So we just send them on to somewhere new.
5:50
Right?
5:53
We send them on to where
the other stuff is.
5:54
And, of course, we can get rid of
the parentheses there if we want to or
5:59
you can leave them.
6:03
It's up to you.
All right, so let's try this out.
6:04
First of all though,
let's create a new post.
6:06
All right.
So let's look at our body.
6:10
Let's call this object oriented python.
6:12
And object-oriented-python.
6:17
All right.
6:22
So, there's our body.
6:23
And if we send this post in to,
let's make sure that we're not, yeah,
6:25
there we go, okay.
6:30
We send those into courses.
6:31
Then we should get a 200 Okay,
and we should get this back.
6:33
You know, while I'm here let's
go change something real quick.
6:36
So we can send that back, let's send back
6:41
a 201 and I can send back location URL for
6:46
resources.courses.course', id=course.id
and
6:51
for this we should have
the parenthesis and
6:58
we'll break it here for that.
7:03
Yeah, cool.
7:11
So that gets us to 80.
7:12
All right.
7:13
Sorry, sidetracked, okay so [LAUGH]
we created one and we get back a 200.
7:14
Now, though, we'll get back a 201,
which is the created status code.
7:20
So okay, cool, so now I don't want to do
a put, and I wanna change some of this.
7:25
So I'm gonna actually change it,
so I'm gonna take out that hyphen.
7:31
And i'm going to send this through.
7:35
And I got a 405.
7:38
And that's right.
7:39
That's not allowed.
7:40
Because we're going to courses like that.
7:43
So instead we should go to courses/2.
7:45
All right, let's do a get real quick.
7:51
Yep.
So there is that.
7:54
All right so now let's do a PUT,
look at our body, look at our URL too.
7:55
Okay, so send that, and now we get
back the new one, and we get this.
8:01
And if we look at headers
we have a location header.
8:05
So this is the location we would
go to to get that new resource.
8:10
Cool, so I go to the update and
I got the header, right?
8:14
I really want to stress this, if you're
not going to send back body content,
8:18
please, please, please, please,
please, please, please, please,
8:22
please send back the location header.
8:26
Because that way users of your API
know where to go to get that new data.
8:29
Right?
8:34
And it may not even be the same
location that they put to.
8:35
You might let them do /put/update or
something, right?
8:38
Like courses/to/update, and
that's what they put to.
8:42
But then they have to go back
to courses/to to get the record.
8:44
Just tell them where to go,
that's all I'm asking for.
8:50
Okay, so now this demo right here,
8:53
this wouldn't be complete
without trying the delete.
8:56
This data's gonna be ignored.
8:59
I'm gonna to send it just because it's
there, but this data's gonna be ignored.
9:00
So let's hit send on the delete.
9:03
We get back a 204 No Content.
9:06
Which is correct,
there should be no content.
9:07
And if we look at headers, our location
header tells us to go back to courses.
9:10
Right.
No response.
9:14
Got the location,
which is where I want to go to.
9:16
Cool.
So if I was to go to this location,
9:18
if I was to follow this.
9:21
As I should, right?
9:23
And I do a get and I Send.
9:28
And I look at the body.
9:30
I only have the Python collections that
I created before I do not have object or
9:32
a Python that I created.
9:36
So that's what I want to do.
9:38
Okay, so I'm going to build the basics
of the review end points between
9:39
these videos.
9:41
I got a lot to show you with them
once we got authentication set up.
9:43
You should try to build the put and
9:46
delete methods on the reviews by yourself,
see if you can do those.
9:48
Our basic API is complete.
9:53
We have all of the crud operations, and
we're ACDP methods and headers like pros.
9:55
Now it's time to batten down
the hatches on our API, so
9:59
it can withstand the storms
of the open internet.
10:02
You need to sign up for Treehouse in order to download course files.
Sign upYou need to sign up for Treehouse in order to set up Workspace
Sign up