FluidDB.py is a Python module based upon work by Seo Sanghyeon. The module has been extracted, extended and unit-tests were added by me (Nicholas Tollervey).
This post leads you from signing up to FluidDB to executing commands and queries using fluiddb.py. It assumes you’re already familiar with the concepts behind FluidDB and that you’re a developer looking to experiment with the API. If you’re not familiar or need a refresher take a look at the following slides:
We’ll be using Python but don’t assume any familiarity with that language. So lets get started…
When you sign up for FluidDB the following steps happen:
- An object representing the new user is created and tagged with useful information. You can get the object’s id with the following call to the API: https://fluiddb.fluidinfo.com/users/terrycojones (replace “terrycojones” with the username you’re interested in). This will return a JSON object containing the user’s “real” name and the object id. You can see what’s tagged to the user’s object by making a call like this: https://fluiddb.fluidinfo.com/objects/05eee31e-fbd1-43cc-9500-0469707a9bc3 (replacing the id with that of the object representing the user you’re interested in).
- A new top-level namespace is also created with the same name as the new user. The default permissions (which can be changed later) mean that only the new user is allowed to create new namespaces or tags in this location but everything is openly readable. You can find out what’s in a namespace with an API call like this: https://fluiddb.fluidinfo.com/namespaces/terrycojones?returnDescription=True&returnNamespaces=True&returnTags=True which returns a JSON dictionary containing lists of child tags, namespaces and the namespace’s description.
In order to access the API with your new credentials you need to use basic HTTP authentication over SSL (i.e. the URI starts with “https”). Obviously, using the raw API with a browser or tools such as curl or wget isn’t practical for most people. Hence the need for fluiddb.py as a wrapper (there are lots of API wrappers for FluidDB in many different languages, check out our list of libraries on our website for more information).
Installing fluiddb.py is as simple as typing:
$ pip install -U fluiddb.py
or
$ easy_install fluiddb.py
or, if you want to install from source:
$ git clone https://github.com/ntoll/fluiddb.py.git
$ cd fluiddb.py
$ python setup.py install
Simply import fluiddb to get started. The following Python terminal session demonstrates what I mean:
$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import fluiddb
The fluiddb.instance variable indicates which instance of FluidDB the module is using (it defaults to the main instance – the sandbox can be used for the purposes of testing/experimentation). Make use of the fluiddb.MAIN and fluiddb.SANDBOX “constants” to change instance as shown below.
>>> fluiddb.SANDBOX
'https://sandbox.fluidinfo.com'
>>> fluiddb.instance = fluiddb.SANDBOX
>>> fluiddb.MAIN
'https://fluiddb.fluidinfo.com'
>>> fluiddb.instance = fluiddb.MAIN
Use the login and logout functions to, er, login and logout (what did you expect..?):
>>> fluiddb.login('username', 'password')
>>> fluiddb.logout()
The most important function provided by the fluiddb module is call(). You must supply at least the HTTP method and path as the first two arguments to a call to the REST API. For example, the following call gets information about Terry Jones:
>>> fluiddb.call('GET', '/users/terrycojones')
({'status': '200', 'content-length': '69', 'content-location': 'https://fluiddb.fluidinfo.com/users/terrycojones', 'server': 'nginx/0.7.65', 'connection': 'keep-alive', 'cache-control': 'no-cache', 'date': 'Fri, 14 Jan 2011 15:15:51 GMT', 'content-type': 'application/json'}, {u'name': u'Terry Jones', u'id': u'05eee31e-fbd1-43cc-9500-0469707a9bc3'})
Notice how call() returns a tuple containing two items:
- The header dictionary
- The content of the response (if there is any)
Often it is simply better to do the following:
>>> headers, content = fluiddb.call('GET', '/users/test')
So the response headers get put into the “headers” variable and the actual content of the response is found in the “content” variable.
It is also possible to send the path as a list of path elements:
>>> headers, content = fluiddb.call('GET', ['about','yes/no','test','foo'])
Which will ensure that each element is correctly percent encoded even if it includes problem characters like slash: ‘/’ (essential for using the “about” based API).
If the API involves sending json data to FluidDB simply send the appropriate Python dict object and fluiddb.py will “jsonify” it appropriately for you:
>>> headers, content = fluiddb.call('POST', '/objects', body={'about': 'an-example'})
If the body argument isn’t a Python dictionary then you must be HTTP PUTting a tag-value on an object. In which case, it’s possible to set the mime-type of the value passed in body:
>>> headers, content = fluiddb.call('PUT', '/about/an-example/test/foo', body='<html><body>Hello, World!</body></html>', mime='text/html')
If you’re PUTting a primitive value then the fluiddb.py will automatically provide the correct mime-type for you:
>>> headers, content = fluiddb.call('PUT', '/about/an-example/test/foo', 12345)
To send URI arguments simply append them as arguments to the call() method:
>>> headers, content = fluiddb.call('GET', '/permissions/namespaces/test', action='create')
The “action = ‘create'” argument will be turned into “?action=create” appended to the end of the URL sent to FluidDB.
Furthermore, if you want to send some custom headers to FluidDB (useful for testing purposes) then supply them as a dictionary via the custom_headers argument:
>>> headers, content = fluiddb.call('GET', '/users/test', custom_headers={'Origin': 'http://foo.com'})
Finally, should you be sending a query via the /values endpoint then you can supply the list of tags whose values you want returned via the tags argument. For example, the following call will return the about-tag value and the twitter screen name of those twitter users I have met in the real world:
>>> headers, content = fluiddb.call('GET', '/values', tags=['fluiddb/about', 'twitter.com/users/screen_name'], query='has ntoll/met')
If this walkthrough isn’t enough then check out the three screencasts below. I made them a few months ago so I’m demonstrating an older version of fluiddb.py but it’s pretty much unchanged (only the implementation details described in part two have changed a little).
Using FluidDB’s RESTful API with fluiddb.py (Part 1)
Using FluidDB’s RESTful API with fluiddb.py (Part 2)
Using FluidDB’s RESTful API with fluiddb.py (Part 3)
As always, if you have any question, encounter problems or simply want to give us feedback, get in touch!
[…] This post was mentioned on Twitter by Nicholas Tollervey. Nicholas Tollervey said: New blog post: Exploring FluidDB with fluiddb.py http://bit.ly/ih1HQw […]
Pingback by Tweets that mention FluidDB » Blog Archive » Exploring FluidDB with fluiddb.py -- Topsy.com — January 14, 2011 @ 11:11 am