mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-04 09:57:55 +03:00 
			
		
		
		
	Merge master
This commit is contained in:
		
						commit
						159c3de9fc
					
				| 
						 | 
					@ -26,7 +26,7 @@ There is a live example API for testing purposes, [available here][sandbox].
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Requirements
 | 
					# Requirements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Python (2.6.5+, 2.7, 3.2, 3.3)
 | 
					* Python (2.6.5+, 2.7, 3.2, 3.3, 3.4)
 | 
				
			||||||
* Django (1.4.11+, 1.5.5+, 1.6, 1.7)
 | 
					* Django (1.4.11+, 1.5.5+, 1.6, 1.7)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Installation
 | 
					# Installation
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -415,6 +415,10 @@ The [HawkREST][hawkrest] library builds on the [Mohawk][mohawk] library to let y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HTTP Signature (currently a [IETF draft][http-signature-ietf-draft]) provides a way to achieve origin authentication and message integrity for HTTP messages. Similar to [Amazon's HTTP Signature scheme][amazon-http-signature], used by many of its services, it permits stateless, per-request authentication. [Elvio Toccalino][etoccalino] maintains the [djangorestframework-httpsignature][djangorestframework-httpsignature] package which provides an easy to use HTTP Signature Authentication mechanism.
 | 
					HTTP Signature (currently a [IETF draft][http-signature-ietf-draft]) provides a way to achieve origin authentication and message integrity for HTTP messages. Similar to [Amazon's HTTP Signature scheme][amazon-http-signature], used by many of its services, it permits stateless, per-request authentication. [Elvio Toccalino][etoccalino] maintains the [djangorestframework-httpsignature][djangorestframework-httpsignature] package which provides an easy to use HTTP Signature Authentication mechanism.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Djoser
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Djoser][djoser] library provides a set of views to handle basic actions such as registration, login, logout, password reset and account activation. The package works with a custom user model and it uses token based authentication. This is a ready to use REST implementation of Django authentication system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[cite]: http://jacobian.org/writing/rest-worst-practices/
 | 
					[cite]: http://jacobian.org/writing/rest-worst-practices/
 | 
				
			||||||
[http401]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2
 | 
					[http401]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2
 | 
				
			||||||
[http403]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.4
 | 
					[http403]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.4
 | 
				
			||||||
| 
						 | 
					@ -449,3 +453,4 @@ HTTP Signature (currently a [IETF draft][http-signature-ietf-draft]) provides a
 | 
				
			||||||
[hawk]: https://github.com/hueniverse/hawk
 | 
					[hawk]: https://github.com/hueniverse/hawk
 | 
				
			||||||
[mohawk]: http://mohawk.readthedocs.org/en/latest/
 | 
					[mohawk]: http://mohawk.readthedocs.org/en/latest/
 | 
				
			||||||
[mac]: http://tools.ietf.org/html/draft-hammer-oauth-v2-mac-token-05
 | 
					[mac]: http://tools.ietf.org/html/draft-hammer-oauth-v2-mac-token-05
 | 
				
			||||||
 | 
					[djoser]: https://github.com/sunscrapers/djoser
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,7 +49,7 @@ Some reasons you might want to use REST framework:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
REST framework requires the following:
 | 
					REST framework requires the following:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Python (2.6.5+, 2.7, 3.2, 3.3)
 | 
					* Python (2.6.5+, 2.7, 3.2, 3.3, 3.4)
 | 
				
			||||||
* Django (1.4.11+, 1.5.5+, 1.6, 1.7)
 | 
					* Django (1.4.11+, 1.5.5+, 1.6, 1.7)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The following packages are optional:
 | 
					The following packages are optional:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -164,8 +164,8 @@ Once again, many thanks to all the generous [backers and sponsors][kickstarter-s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[lts-releases]: https://docs.djangoproject.com/en/dev/internals/release-process/#long-term-support-lts-releases
 | 
					[lts-releases]: https://docs.djangoproject.com/en/dev/internals/release-process/#long-term-support-lts-releases
 | 
				
			||||||
[2-4-release-notes]: release-notes#240
 | 
					[2-4-release-notes]: release-notes#240
 | 
				
			||||||
[view-name-and-description-settings]: ../api-guide/settings/#view-names-and-descriptions
 | 
					[view-name-and-description-settings]: ../api-guide/settings#view-names-and-descriptions
 | 
				
			||||||
[client-ip-identification]: ../api-guide/throttling/#how-clients-are-identified
 | 
					[client-ip-identification]: ../api-guide/throttling#how-clients-are-identified
 | 
				
			||||||
[2-3-announcement]: 2.3-announcement
 | 
					[2-3-announcement]: 2.3-announcement
 | 
				
			||||||
[github-labels]: https://github.com/tomchristie/django-rest-framework/issues
 | 
					[github-labels]: https://github.com/tomchristie/django-rest-framework/issues
 | 
				
			||||||
[github-milestones]: https://github.com/tomchristie/django-rest-framework/milestones
 | 
					[github-milestones]: https://github.com/tomchristie/django-rest-framework/milestones
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -210,7 +210,9 @@ We recommend the [`django-reusable-app`][django-reusable-app] template as a good
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Linking to your package
 | 
					## Linking to your package
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Once your package is decently documented and available on PyPI open a pull request or issue, and we'll add a link to it from the main REST framework documentation.
 | 
					Once your package is decently documented and available on PyPI open a pull request or issue, and we'll add a link to it from the main REST framework documentation. You can add your package under **Third party packages** of the API Guide section that best applies, like [Authentication][authentication] or [Permissions][permissions]. You can also link your package under the [Third Party Resources][third-party-resources] section.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We also suggest adding it to the [REST Framework][rest-framework-grid] grid on Django Packages.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[cite]: http://www.w3.org/People/Berners-Lee/FAQ.html
 | 
					[cite]: http://www.w3.org/People/Berners-Lee/FAQ.html
 | 
				
			||||||
[code-of-conduct]: https://www.djangoproject.com/conduct/
 | 
					[code-of-conduct]: https://www.djangoproject.com/conduct/
 | 
				
			||||||
| 
						 | 
					@ -225,3 +227,7 @@ Once your package is decently documented and available on PyPI open a pull reque
 | 
				
			||||||
[docs]: https://github.com/tomchristie/django-rest-framework/tree/master/docs
 | 
					[docs]: https://github.com/tomchristie/django-rest-framework/tree/master/docs
 | 
				
			||||||
[mou]: http://mouapp.com/
 | 
					[mou]: http://mouapp.com/
 | 
				
			||||||
[django-reusable-app]: https://github.com/dabapps/django-reusable-app
 | 
					[django-reusable-app]: https://github.com/dabapps/django-reusable-app
 | 
				
			||||||
 | 
					[authentication]: ../api-guide/authentication.md
 | 
				
			||||||
 | 
					[permissions]: ../api-guide/permissions.md
 | 
				
			||||||
 | 
					[third-party-resources]: third-party-resources.md
 | 
				
			||||||
 | 
					[rest-framework-grid]: https://www.djangopackages.com/grids/g/django-rest-framework/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,7 @@ To submit new content, [open an issue](https://github.com/tomchristie/django-res
 | 
				
			||||||
* [djangorestframework-jwt](https://github.com/GetBlimp/django-rest-framework-jwt) - Provides JSON Web Token Authentication support.
 | 
					* [djangorestframework-jwt](https://github.com/GetBlimp/django-rest-framework-jwt) - Provides JSON Web Token Authentication support.
 | 
				
			||||||
* [hawkrest](https://github.com/kumar303/hawkrest) - Provides Hawk HTTP Authorization.
 | 
					* [hawkrest](https://github.com/kumar303/hawkrest) - Provides Hawk HTTP Authorization.
 | 
				
			||||||
* [djangorestframework-httpsignature](https://github.com/etoccalino/django-rest-framework-httpsignature) - Provides an easy to use HTTP Signature Authentication mechanism.
 | 
					* [djangorestframework-httpsignature](https://github.com/etoccalino/django-rest-framework-httpsignature) - Provides an easy to use HTTP Signature Authentication mechanism.
 | 
				
			||||||
 | 
					* [djoser](https://github.com/sunscrapers/djoser) - Provides a set of views to handle basic actions such as registration, login, logout, password reset and account activation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Permissions
 | 
					### Permissions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,7 @@ from collections import namedtuple
 | 
				
			||||||
from django.conf.urls import patterns, url
 | 
					from django.conf.urls import patterns, url
 | 
				
			||||||
from django.core.exceptions import ImproperlyConfigured
 | 
					from django.core.exceptions import ImproperlyConfigured
 | 
				
			||||||
from django.core.urlresolvers import NoReverseMatch
 | 
					from django.core.urlresolvers import NoReverseMatch
 | 
				
			||||||
 | 
					from django.utils.datastructures import SortedDict
 | 
				
			||||||
from rest_framework import views
 | 
					from rest_framework import views
 | 
				
			||||||
from rest_framework.response import Response
 | 
					from rest_framework.response import Response
 | 
				
			||||||
from rest_framework.reverse import reverse
 | 
					from rest_framework.reverse import reverse
 | 
				
			||||||
| 
						 | 
					@ -277,7 +278,7 @@ class DefaultRouter(SimpleRouter):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        Return a view to use as the API root.
 | 
					        Return a view to use as the API root.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        api_root_dict = {}
 | 
					        api_root_dict = SortedDict()
 | 
				
			||||||
        list_name = self.routes[0].name
 | 
					        list_name = self.routes[0].name
 | 
				
			||||||
        for prefix, viewset, basename in self.registry:
 | 
					        for prefix, viewset, basename in self.registry:
 | 
				
			||||||
            api_root_dict[prefix] = list_name.format(basename=basename)
 | 
					            api_root_dict[prefix] = list_name.format(basename=basename)
 | 
				
			||||||
| 
						 | 
					@ -286,7 +287,7 @@ class DefaultRouter(SimpleRouter):
 | 
				
			||||||
            _ignore_model_permissions = True
 | 
					            _ignore_model_permissions = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            def get(self, request, *args, **kwargs):
 | 
					            def get(self, request, *args, **kwargs):
 | 
				
			||||||
                ret = {}
 | 
					                ret = SortedDict()
 | 
				
			||||||
                for key, url_name in api_root_dict.items():
 | 
					                for key, url_name in api_root_dict.items():
 | 
				
			||||||
                    try:
 | 
					                    try:
 | 
				
			||||||
                        ret[key] = reverse(
 | 
					                        ret[key] = reverse(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -140,16 +140,16 @@
 | 
				
			||||||
                            {% if post_form %}
 | 
					                            {% if post_form %}
 | 
				
			||||||
                                <ul class="nav nav-tabs form-switcher">
 | 
					                                <ul class="nav nav-tabs form-switcher">
 | 
				
			||||||
                                    <li>
 | 
					                                    <li>
 | 
				
			||||||
                                        <a name='html-tab' href="#object-form" data-toggle="tab">HTML form</a>
 | 
					                                        <a name='html-tab' href="#post-object-form" data-toggle="tab">HTML form</a>
 | 
				
			||||||
                                    </li>
 | 
					                                    </li>
 | 
				
			||||||
                                    <li>
 | 
					                                    <li>
 | 
				
			||||||
                                        <a name='raw-tab' href="#generic-content-form" data-toggle="tab">Raw data</a>
 | 
					                                        <a name='raw-tab' href="#post-generic-content-form" data-toggle="tab">Raw data</a>
 | 
				
			||||||
                                    </li>
 | 
					                                    </li>
 | 
				
			||||||
                                </ul>
 | 
					                                </ul>
 | 
				
			||||||
                            {% endif %}
 | 
					                            {% endif %}
 | 
				
			||||||
                            <div class="well tab-content">
 | 
					                            <div class="well tab-content">
 | 
				
			||||||
                                {% if post_form %}
 | 
					                                {% if post_form %}
 | 
				
			||||||
                                    <div class="tab-pane" id="object-form">
 | 
					                                    <div class="tab-pane" id="post-object-form">
 | 
				
			||||||
                                        {% with form=post_form %}
 | 
					                                        {% with form=post_form %}
 | 
				
			||||||
                                            <form action="{{ request.get_full_path }}"
 | 
					                                            <form action="{{ request.get_full_path }}"
 | 
				
			||||||
                                                  method="POST" enctype="multipart/form-data" class="form-horizontal" novalidate>
 | 
					                                                  method="POST" enctype="multipart/form-data" class="form-horizontal" novalidate>
 | 
				
			||||||
| 
						 | 
					@ -164,7 +164,7 @@
 | 
				
			||||||
                                        {% endwith %}
 | 
					                                        {% endwith %}
 | 
				
			||||||
                                    </div>
 | 
					                                    </div>
 | 
				
			||||||
                                {% endif %}
 | 
					                                {% endif %}
 | 
				
			||||||
                                <div {% if post_form %}class="tab-pane"{% endif %} id="generic-content-form">
 | 
					                                <div {% if post_form %}class="tab-pane"{% endif %} id="post-generic-content-form">
 | 
				
			||||||
                                    {% with form=raw_data_post_form %}
 | 
					                                    {% with form=raw_data_post_form %}
 | 
				
			||||||
                                        <form action="{{ request.get_full_path }}" method="POST" class="form-horizontal">
 | 
					                                        <form action="{{ request.get_full_path }}" method="POST" class="form-horizontal">
 | 
				
			||||||
                                            <fieldset>
 | 
					                                            <fieldset>
 | 
				
			||||||
| 
						 | 
					@ -186,16 +186,16 @@
 | 
				
			||||||
                            {% if put_form %}
 | 
					                            {% if put_form %}
 | 
				
			||||||
                                <ul class="nav nav-tabs form-switcher">
 | 
					                                <ul class="nav nav-tabs form-switcher">
 | 
				
			||||||
                                    <li>
 | 
					                                    <li>
 | 
				
			||||||
                                        <a name='html-tab' href="#object-form" data-toggle="tab">HTML form</a>
 | 
					                                        <a name='html-tab' href="#put-object-form" data-toggle="tab">HTML form</a>
 | 
				
			||||||
                                    </li>
 | 
					                                    </li>
 | 
				
			||||||
                                    <li>
 | 
					                                    <li>
 | 
				
			||||||
                                        <a  name='raw-tab' href="#generic-content-form" data-toggle="tab">Raw data</a>
 | 
					                                        <a  name='raw-tab' href="#put-generic-content-form" data-toggle="tab">Raw data</a>
 | 
				
			||||||
                                    </li>
 | 
					                                    </li>
 | 
				
			||||||
                                </ul>
 | 
					                                </ul>
 | 
				
			||||||
                            {% endif %}
 | 
					                            {% endif %}
 | 
				
			||||||
                            <div class="well tab-content">
 | 
					                            <div class="well tab-content">
 | 
				
			||||||
                                {% if put_form %}
 | 
					                                {% if put_form %}
 | 
				
			||||||
                                    <div class="tab-pane" id="object-form">
 | 
					                                    <div class="tab-pane" id="put-object-form">
 | 
				
			||||||
                                        <form action="{{ request.get_full_path }}"
 | 
					                                        <form action="{{ request.get_full_path }}"
 | 
				
			||||||
                                              method="POST" enctype="multipart/form-data" class="form-horizontal" novalidate>
 | 
					                                              method="POST" enctype="multipart/form-data" class="form-horizontal" novalidate>
 | 
				
			||||||
                                            <fieldset>
 | 
					                                            <fieldset>
 | 
				
			||||||
| 
						 | 
					@ -209,7 +209,7 @@
 | 
				
			||||||
                                        </form>
 | 
					                                        </form>
 | 
				
			||||||
                                    </div>
 | 
					                                    </div>
 | 
				
			||||||
                                {% endif %}
 | 
					                                {% endif %}
 | 
				
			||||||
                                <div {% if put_form %}class="tab-pane"{% endif %} id="generic-content-form">
 | 
					                                <div {% if put_form %}class="tab-pane"{% endif %} id="put-generic-content-form">
 | 
				
			||||||
                                    {% with form=raw_data_put_or_patch_form %}
 | 
					                                    {% with form=raw_data_put_or_patch_form %}
 | 
				
			||||||
                                        <form action="{{ request.get_full_path }}" method="POST" class="form-horizontal">
 | 
					                                        <form action="{{ request.get_full_path }}" method="POST" class="form-horizontal">
 | 
				
			||||||
                                            <fieldset>
 | 
					                                            <fieldset>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user