so googling around it appears that the general consensus is that embedding version numbers in REST URIs is a bad practice and a bad idea.
even on SO there are strong proponents supporting this.
e.g. Best practices for API versioning?
My question is about how to accomplish the proposed solution of using the accept header / content negotiation in the django-rest-framework to accomplish this.
It looks like content negotiation in the framework,
http://django-rest-framework.org/api-guide/content-negotiation/
is already configured to automatically return intended values based on accepted MIME types. If I start using the Accept header for custom types, I'll lose this benefit of the framework.
Is there a better way to accomplish this in the framework?
UPDATE:
versioning is now properly supported.
There are some answers from your link:
So we took this approach, plus allowing clients to specify the version in request header (X-Version), here is how we did it:
Structure in side the API app:
project urls.py:
api app level urls.py:
version level urls.py
create a middleware to switch to the correct code by changing the path_info, please note there is a caveat that namespace ('api') defined in project level urls is not flexible and needs to be known in middleware:
Sample url:
One way of doing this is to have the versioning specified as part of the media type.
This is what GitHub currently do for their API.
You can also include media type parameters in your accept headers, eg
Accept: application/json; version=beta
, which will successfully match againstJSONRenderer
. You can then code your view to behave differently depending on the accepted media type, see here.There's lots of different patterns for versioning in APIs, and I wouldn't say there's any great consensus around the right approach yet, but that'd be one reasonable possibility.
Update Jan 2015: Better versioning support will be incoming in the 3.1.0 release. See [this pull request]
Update March 2015: Docs for the versioning API are now available.
(https://github.com/tomchristie/django-rest-framework/pull/2285) for more details.