Eve: Building RESTful APIs with MongoDB and Flask Transcripts
Chapter: Fine-tuning your REST service
Lecture: Handling datetime values
0:01 One question that often comes up of Stack Overflow is
0:03 how do you store datetime values, and how do you query for them.
0:08 Well, the thing is, Json comes with no date types,
0:11 so usually Rest services fall back to parsing matching strings
0:16 and then store them as datetime values.
0:20 In order for that to work properly however,
0:22 client server need to agree on a standard string format for datetime fields.
0:27 By default, Eve accepts datetime fields as rfc1123 strings,
0:33 this format is the de facto standard in Rest and more in general, on the internet.
0:40 To give you an idea of what an rfc1123 date looks like,
0:45 let's just take a look at the values for the
0:48 updated and created metafields in any Eve document,
0:52 we have a string of course,
0:54 the first value within the string is the actual day, 3 letters,
0:58 comma and then the full date,
1:01 then the hours, minutes and seconds for the time,
1:05 and finally the timezone, very simple, staightforward, easy to read.
1:10 So let's try to perform a query on a date field,
1:13 here for example, I am asking for all the people
1:16 which have been updated at a date greater than or equal to Tue, 20 Feb.
1:24 So let's send this query in and we get a number of documents back, 6 total.
1:30 If we go back and update and change the date to 21 Feb,
1:36 we should get back a couple of documents right, 2 documents total.
1:41 So as you can see, the date we used for our queries
1:44 is matching in format the date we have on the documents,
1:48 and this is the rfc1123 format.
1:53 But what if you need to have
1:55 some different kind of string format in your documents?
1:59 Well, we can do that very easily,
2:01 we just need to go back to our code editor and type in something like this,
2:05 date format is the setting which allows you
2:07 to change the default format for datetime sting values,
2:12 here we are saying to Eve
2:14 I don't want to use rfc1123, I want to use this format instead.
2:18 If you are curious about this string in here,
2:21 you should know that this is the standard Python notation for datetime stings,
2:27 we are using what is called the strf time format
2:32 so you can go here on the Python website and look at the documentation
2:38 where you get a very nice table with all the meanings,
2:41 all the values, strings you can use or directive as they are code
2:46 to the format of your string.
2:49 So back to the editor we go and I am basically saying
2:53 I only want day month and year in my date format.
2:57 Now if I go back to Postman,
3:01 let me first save, and relaunch the server as usual,
3:06 now if we perform the same query here with the old format
3:12 we should get nothing back exactly,
3:15 because there you have no matches for this string format
3:18 but if we say that we only want to use the date with this format here
3:26 which should match the one we defined,
3:28 we should get back on track exactly,
3:32 so two documents and two fields.
3:34 Let's try with 20, 7 documents, yes,
3:38 that makes sense because we are losing precision here
3:40 with the same query we were getting 6 documents before
3:44 but now, we aren't providing any time information,
3:47 so we're getting all the documents for the 20 Feb and one more document.
3:54 Keep in mind that the date format settings
3:57 has an epath not only on the queries, but also on the Json payloads,
4:03 so when you change the format, you also need to change your payloads,
4:07 for example, here I am still trying to write a document
4:10 with the rfc1123 standard format,
4:14 if I try to send a request to my service,
4:16 I get an error because born is not of datetime type,
4:20 it actually is, but it is not conforming to our new standard,
4:24 so what we need to do here, of course, is go and update this field
4:31 and try to post again, and it will work.