2016-05-26 13:48:39 +03:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" >
< meta charset = "utf-8" >
< title > Mozilla Grant - Django REST framework< / title >
< link href = "../../img/favicon.ico" rel = "icon" type = "image/x-icon" >
< link rel = "canonical" href = "http://www.django-rest-framework.org/topics/mozilla-grant/" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< meta name = "description" content = "Django, API, REST, Mozilla Grant" >
< meta name = "author" content = "Tom Christie" >
<!-- Le styles -->
< link href = "../../css/prettify.css" rel = "stylesheet" >
< link href = "../../css/bootstrap.css" rel = "stylesheet" >
< link href = "../../css/bootstrap-responsive.css" rel = "stylesheet" >
< link href = "../../css/default.css" rel = "stylesheet" >
<!-- Le HTML5 shim, for IE6 - 8 support of HTML5 elements -->
<!-- [if lt IE 9]>
< script src = "http://html5shim.googlecode.com/svn/trunk/html5.js" > < / script >
<![endif]-->
< script type = "text/javascript" >
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-18852272-2']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script');
ga.type = 'text/javascript';
ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
})();
< / script >
< style >
#sidebarInclude img {
margin-bottom: 10px;
}
#sidebarInclude a.promo {
color: black;
}
@media (max-width: 767px) {
div.promo {
display: none;
}
}
< / style >
< / head >
< body onload = "prettyPrint()" class = "-page" >
< div class = "wrapper" >
< div class = "navbar navbar-inverse navbar-fixed-top" >
< div class = "navbar-inner" >
< div class = "container-fluid" >
< a class = "repo-link btn btn-primary btn-small" href = "https://github.com/tomchristie/django-rest-framework/tree/master" > GitHub< / a >
< a class = "repo-link btn btn-inverse btn-small " rel = "prev" href = "../funding/" >
Next < i class = "icon-arrow-right icon-white" > < / i >
< / a >
< a class = "repo-link btn btn-inverse btn-small " rel = "next" href = "../kickstarter-announcement/" >
< i class = "icon-arrow-left icon-white" > < / i > Previous
< / a >
< a id = "search_modal_show" class = "repo-link btn btn-inverse btn-small" href = "#mkdocs_search_modal" data-toggle = "modal" data-target = "#mkdocs_search_modal" > < i class = "icon-search icon-white" > < / i > Search< / a >
< a class = "btn btn-navbar" data-toggle = "collapse" data-target = ".nav-collapse" >
< span class = "icon-bar" > < / span >
< span class = "icon-bar" > < / span >
< span class = "icon-bar" > < / span >
< / a >
< a class = "brand" href = "http://www.django-rest-framework.org" > Django REST framework< / a >
< div class = "nav-collapse collapse" >
<!-- Main navigation -->
< ul class = "nav navbar-nav" >
< li >
< a href = "../.." > Home< / a >
< / li >
< li class = "dropdown" >
< a href = "#" class = "dropdown-toggle" data-toggle = "dropdown" > Tutorial < b class = "caret" > < / b > < / a >
< ul class = "dropdown-menu" >
< li >
< a href = "../../tutorial/quickstart/" > Quickstart< / a >
< / li >
< li >
< a href = "../../tutorial/1-serialization/" > 1 - Serialization< / a >
< / li >
< li >
< a href = "../../tutorial/2-requests-and-responses/" > 2 - Requests and responses< / a >
< / li >
< li >
< a href = "../../tutorial/3-class-based-views/" > 3 - Class based views< / a >
< / li >
< li >
< a href = "../../tutorial/4-authentication-and-permissions/" > 4 - Authentication and permissions< / a >
< / li >
< li >
< a href = "../../tutorial/5-relationships-and-hyperlinked-apis/" > 5 - Relationships and hyperlinked APIs< / a >
< / li >
< li >
< a href = "../../tutorial/6-viewsets-and-routers/" > 6 - Viewsets and routers< / a >
< / li >
2016-07-14 15:05:57 +03:00
< li >
< a href = "../../tutorial/7-schemas-and-client-libraries/" > 7 - Schemas and client libraries< / a >
< / li >
2016-05-26 13:48:39 +03:00
< / ul >
< / li >
< li class = "dropdown" >
< a href = "#" class = "dropdown-toggle" data-toggle = "dropdown" > API Guide < b class = "caret" > < / b > < / a >
< ul class = "dropdown-menu" >
< li >
< a href = "../../api-guide/requests/" > Requests< / a >
< / li >
< li >
< a href = "../../api-guide/responses/" > Responses< / a >
< / li >
< li >
< a href = "../../api-guide/views/" > Views< / a >
< / li >
< li >
< a href = "../../api-guide/generic-views/" > Generic views< / a >
< / li >
< li >
< a href = "../../api-guide/viewsets/" > Viewsets< / a >
< / li >
< li >
< a href = "../../api-guide/routers/" > Routers< / a >
< / li >
< li >
< a href = "../../api-guide/parsers/" > Parsers< / a >
< / li >
< li >
< a href = "../../api-guide/renderers/" > Renderers< / a >
< / li >
< li >
< a href = "../../api-guide/serializers/" > Serializers< / a >
< / li >
< li >
< a href = "../../api-guide/fields/" > Serializer fields< / a >
< / li >
< li >
< a href = "../../api-guide/relations/" > Serializer relations< / a >
< / li >
< li >
< a href = "../../api-guide/validators/" > Validators< / a >
< / li >
< li >
< a href = "../../api-guide/authentication/" > Authentication< / a >
< / li >
< li >
< a href = "../../api-guide/permissions/" > Permissions< / a >
< / li >
< li >
< a href = "../../api-guide/throttling/" > Throttling< / a >
< / li >
< li >
< a href = "../../api-guide/filtering/" > Filtering< / a >
< / li >
< li >
< a href = "../../api-guide/pagination/" > Pagination< / a >
< / li >
< li >
< a href = "../../api-guide/versioning/" > Versioning< / a >
< / li >
< li >
< a href = "../../api-guide/content-negotiation/" > Content negotiation< / a >
< / li >
< li >
< a href = "../../api-guide/metadata/" > Metadata< / a >
< / li >
2016-07-07 11:41:32 +03:00
< li >
< a href = "../../api-guide/schemas/" > Schemas< / a >
< / li >
2016-05-26 13:48:39 +03:00
< li >
< a href = "../../api-guide/format-suffixes/" > Format suffixes< / a >
< / li >
< li >
< a href = "../../api-guide/reverse/" > Returning URLs< / a >
< / li >
< li >
< a href = "../../api-guide/exceptions/" > Exceptions< / a >
< / li >
< li >
< a href = "../../api-guide/status-codes/" > Status codes< / a >
< / li >
< li >
< a href = "../../api-guide/testing/" > Testing< / a >
< / li >
< li >
< a href = "../../api-guide/settings/" > Settings< / a >
< / li >
< / ul >
< / li >
< li class = "dropdown active" >
< a href = "#" class = "dropdown-toggle" data-toggle = "dropdown" > Topics < b class = "caret" > < / b > < / a >
< ul class = "dropdown-menu" >
< li >
< a href = "../documenting-your-api/" > Documenting your API< / a >
< / li >
2016-07-07 11:41:32 +03:00
< li >
< a href = "../api-clients/" > API Clients< / a >
< / li >
2016-05-26 13:48:39 +03:00
< li >
< a href = "../internationalization/" > Internationalization< / a >
< / li >
< li >
< a href = "../ajax-csrf-cors/" > AJAX, CSRF & CORS< / a >
< / li >
< li >
< a href = "../html-and-forms/" > HTML & Forms< / a >
< / li >
< li >
< a href = "../browser-enhancements/" > Browser Enhancements< / a >
< / li >
< li >
< a href = "../browsable-api/" > The Browsable API< / a >
< / li >
< li >
< a href = "../rest-hypermedia-hateoas/" > REST, Hypermedia & HATEOAS< / a >
< / li >
< li >
< a href = "../third-party-resources/" > Third Party Resources< / a >
< / li >
< li >
< a href = "../contributing/" > Contributing to REST framework< / a >
< / li >
< li >
< a href = "../project-management/" > Project management< / a >
< / li >
< li >
< a href = "../3.0-announcement/" > 3.0 Announcement< / a >
< / li >
< li >
< a href = "../3.1-announcement/" > 3.1 Announcement< / a >
< / li >
< li >
< a href = "../3.2-announcement/" > 3.2 Announcement< / a >
< / li >
< li >
< a href = "../3.3-announcement/" > 3.3 Announcement< / a >
< / li >
2016-07-14 15:05:57 +03:00
< li >
< a href = "../3.4-announcement/" > 3.4 Announcement< / a >
< / li >
2016-05-26 13:48:39 +03:00
< li >
< a href = "../kickstarter-announcement/" > Kickstarter Announcement< / a >
< / li >
< li class = "active" >
< a href = "./" > Mozilla Grant< / a >
< / li >
< li >
< a href = "../funding/" > Funding< / a >
< / li >
< li >
< a href = "../release-notes/" > Release Notes< / a >
< / li >
< / ul >
< / li >
< / ul >
< / div >
<!-- /.nav - collapse -->
< / div >
< / div >
< / div >
< div class = "body-content" >
< div class = "container-fluid" >
<!-- Search Modal -->
< div id = "mkdocs_search_modal" class = "modal hide fade" tabindex = "-1" role = "dialog" aria-labelledby = "myModalLabel" aria-hidden = "true" >
< div class = "modal-header" >
< button type = "button" class = "close" data-dismiss = "modal" aria-hidden = "true" > × < / button >
< h3 id = "myModalLabel" > Documentation search< / h3 >
< / div >
< div class = "modal-body" >
< form role = "form" autocomplete = "off" >
< div class = "form-group" >
< input type = "text" name = "q" class = "form-control" placeholder = "Search..." id = "mkdocs-search-query" >
< / div >
< / form >
< div id = "mkdocs-search-results" > < / div >
< / div >
< div class = "modal-footer" >
< button class = "btn" data-dismiss = "modal" aria-hidden = "true" > Close< / button >
< / div >
< / div >
< div class = "row-fluid" >
< div class = "span3" >
< div id = "table-of-contents" >
< ul class = "nav nav-list side-nav well sidebar-nav-fixed" >
< li class = "main" >
< a href = "#mozilla-grant" > Mozilla Grant< / a >
< / li >
< li >
< a href = "#client-libraries" > Client libraries< / a >
< / li >
< li >
< a href = "#realtime-apis" > Realtime APIs< / a >
< / li >
< li >
< a href = "#accountability" > Accountability< / a >
< / li >
< div class = "promo" >
< hr / >
< div id = "sidebarInclude" >
< / div >
< / ul >
< / div >
< / div >
< div id = "main-content" class = "span9" >
< h1 id = "mozilla-grant" > < a class = "toclink" href = "#mozilla-grant" > Mozilla Grant< / a > < / h1 >
< p > We have recently been < a href = "https://blog.mozilla.org/blog/2016/04/13/mozilla-open-source-support-moss-update-q1-2016/" > awarded a Mozilla grant< / a > , in order to fund the next major releases of REST framework. This work will focus on seamless client-side integration by introducing supporting client libraries that are able to dynamically interact with REST framework APIs. The framework will provide for either hypermedia or schema endpoints, which will expose the available interface for the client libraries to interact with.< / p >
< p > Additionally, we will be building on the realtime support that Django Channels provides, supporting and documenting how to build realtime APIs with REST framework. Again, this will include supporting work in the associated client libraries, making it easier to build richly interactive applications.< / p >
2016-06-24 13:07:42 +03:00
< p > The < a href = "http://www.coreapi.org" > Core API< / a > project will provide the foundations for our client library support, and will allow us to support interaction using a wide range of schemas and hypermedia formats. It's worth noting that these client libraries won't be tightly coupled to solely REST framework APIs either, and will be able to interact with < em > any< / em > API that exposes a supported schema or hypermedia format.< / p >
2016-05-26 13:48:39 +03:00
< p > Specifically, the work includes:< / p >
< h2 id = "client-libraries" > < a class = "toclink" href = "#client-libraries" > Client libraries< / a > < / h2 >
< p > This work will include built-in schema and hypermedia support, allowing dynamic client libraries to interact with the API. I'll also be releasing both Python and Javascript client libraries, plus a command-line client, a new tutorial section, and further documentation.< / p >
< ul >
< li > Client library support in REST framework.< / li >
< li > Schema & hypermedia support for REST framework APIs.< / li >
< li > A test client, allowing you to write tests that emulate a client library interacting with your API.< / li >
< li > New tutorial sections on using client libraries to interact with REST framework APIs.< / li >
< li > Python client library.< / li >
< li > JavaScript client library.< / li >
< li > Command line client.< / li >
< / ul >
< h2 id = "realtime-apis" > < a class = "toclink" href = "#realtime-apis" > Realtime APIs< / a > < / h2 >
< p > The next goal is to build on the realtime support offered by Django Channels, adding support & documentation for building realtime API endpoints.< / p >
< ul >
< li > Support for API subscription endpoints, using REST framework and Django Channels.< / li >
< li > New tutorial section on building realtime API endpoints with REST framework.< / li >
< li > Realtime support in the Python & Javascript client libraries.< / li >
< / ul >
< h2 id = "accountability" > < a class = "toclink" href = "#accountability" > Accountability< / a > < / h2 >
< p > In order to ensure that I can be fully focused on trying to secure a sustainable
& well-funded open source business I will be leaving my current role at < a href = "http://www.dabapps.com" > DabApps< / a >
at the end of May 2016.< / p >
< p > I have formed a UK limited company, < a href = "http://www.encode.io" > Encode< / a > , which will
act as the business entity behind REST framework. I will be issuing monthly reports
from Encode on progress both towards the Mozilla grant, and for development time
funded via the < a href = "../funding/" > REST framework paid plans< / a > .< / p >
<!-- Begin MailChimp Signup Form -->
< p > < link href = "//cdn-images.mailchimp.com/embedcode/classic-10_7.css" rel = "stylesheet" type = "text/css" >
< style type = "text/css" >
#mc_embed_signup{background:#fff; clear:left; font:14px Helvetica,Arial,sans-serif; }
/< em > Add your own MailChimp form style overrides in your site stylesheet or in this style block.
We recommend moving this block and the preceding CSS link to the HEAD of your HTML file. < / em > /
< / style >
< div id = "mc_embed_signup" >
< form action = "//encode.us13.list-manage.com/subscribe/post?u=b6b66bb5e4c7cb484a85c8dd7&id=e382ef68ef" method = "post" id = "mc-embedded-subscribe-form" name = "mc-embedded-subscribe-form" class = "validate" target = "_blank" novalidate >
< div id = "mc_embed_signup_scroll" >
< h2 > Stay up to date, with our monthly progress reports...< / h2 >
< div class = "mc-field-group" >
< label for = "mce-EMAIL" > Email Address < / label >
< input type = "email" value = "" name = "EMAIL" class = "required email" id = "mce-EMAIL" >
< / div >
< div id = "mce-responses" class = "clear" >
< div class = "response" id = "mce-error-response" style = "display:none" > < / div >
< div class = "response" id = "mce-success-response" style = "display:none" > < / div >
< / div > <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups -->
< div style = "position: absolute; left: -5000px;" aria-hidden = "true" > < input type = "text" name = "b_b6b66bb5e4c7cb484a85c8dd7_e382ef68ef" tabindex = "-1" value = "" > < / div >
< div class = "clear" > < input type = "submit" value = "Subscribe" name = "subscribe" id = "mc-embedded-subscribe" class = "button" > < / div >
< / div >
< / form >
< / div >
< script type = 'text/javascript' src = '//s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js' > < / script > < script type = 'text/javascript' > ( function ( $ ) { window . fnames = new Array ( ) ; window . ftypes = new Array ( ) ; fnames [ 0 ] = 'EMAIL' ; ftypes [ 0 ] = 'email' ; fnames [ 1 ] = 'FNAME' ; ftypes [ 1 ] = 'text' ; fnames [ 2 ] = 'LNAME' ; ftypes [ 2 ] = 'text' ; } ( jQuery ) ) ; var $mcj = jQuery . noConflict ( true ) ; < / script >
<!-- End mc_embed_signup --> < / p >
< / div > <!-- /span -->
< / div > <!-- /row -->
< / div > <!-- /.fluid - container -->
< / div > <!-- /.body content -->
< div id = "push" > < / div >
< / div > <!-- /.wrapper -->
< footer class = "span12" >
< p > Documentation built with < a href = "http://www.mkdocs.org/" > MkDocs< / a > .
< / p >
< / footer >
<!-- Le javascript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
< script src = "../../js/jquery-1.8.1-min.js" > < / script >
< script src = "../../js/prettify-1.0.js" > < / script >
< script src = "../../js/bootstrap-2.1.1-min.js" > < / script >
< script src = "https://fund.django-rest-framework.org/sidebar_include.js" > < / script >
< script > var base _url = '../..' ; < / script >
< script src = "../../mkdocs/js/require.js" > < / script >
< script src = "../../js/theme.js" > < / script >
< script >
var shiftWindow = function() {
scrollBy(0, -50)
};
if (location.hash) shiftWindow();
window.addEventListener("hashchange", shiftWindow);
$('.dropdown-menu').on('click touchstart', function(event) {
event.stopPropagation();
});
// Dynamically force sidenav/dropdown to no higher than browser window
$('.side-nav, .dropdown-menu').css('max-height', window.innerHeight - 130);
$(function() {
$(window).resize(function() {
$('.side-nav, .dropdown-menu').css('max-height', window.innerHeight - 130);
});
});
< / script >
< / body >
< / html >