- PVSM.RU - https://www.pvsm.ru -
Веб-cервис [1] (англ. web service) — идентифицируемая веб-адресом программная система со стандартизированными интерфейсами. Веб-службы могут взаимодействовать друг с другом и со сторонними приложениями посредством сообщений, основанных на определённых протоколах (XML, JSON и т. д.). Веб-служба является единицей модульности при использовании сервис-ориентированной архитектуры приложения.
Одним из подходов создания веб сервиса является rest.
Rest [2] (сокр. англ. Representational State Transfer, «передача состояния представления») — стиль построения архитектуры распределенного приложения. Данные в REST должны передаваться в виде небольшого количества стандартных форматов (например HTML, XML, JSON). Сетевой протокол (как и HTTP) должен поддерживать кэширование, не должен зависеть от сетевого слоя, не должен сохранять информацию о состоянии между парами «запрос-ответ». Утверждается, что такой подход обеспечивает масштабируемость системы и позволяет ей эволюционировать с новыми требованиями.
Django REST framework — удобный инструмент для работы с rest основанный на идеологии фреймворка Django.
Требования к окружению:
Python (2.6, 2.7)
Django (1.3, 1.4, 1.5)
По желанию:
Markdown [3]
PyYAML [4]
django-filter [5]
Установить можно привычной для нас командой pip:
pip install djangorestframework
И можно поставить дополнительные пакеты:
pip install markdown
pip install pyyaml
pip install django-filter
Или же сделать клон проекта с Github:
git clone git@github.com:tomchristie/django-rest-framework.git
cd django-rest-framework
pip install -r requirements.txt
pip install -r optionals.txt
Не забываем прописать приложение в INSTALLED_APPS:
INSTALLED_APPS = (
...
'rest_framework',
)
А также добавить запись в urls.py:
urlpatterns = patterns('',
...
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
)
Url можно ставить любой на Ваш вкус, главное подключить файл с урлами rest framework (rest_framework.urls).
Создадим API для работы с пользователями и их группами.
from django.contrib.auth.models import User, Group, Permission
from rest_framework import serializers
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups')
class GroupSerializer(serializers.HyperlinkedModelSerializer):
permissions = serializers.ManySlugRelatedField(
slug_field='codename',
queryset=Permission.objects.all()
)
class Meta:
model = Group
fields = ('url', 'name', 'permissions')
from django.contrib.auth.models import User, Group
from rest_framework import generics
from rest_framework.decorators import api_view
from rest_framework.reverse import reverse
from rest_framework.response import Response
from quickstart.serializers import UserSerializer, GroupSerializer
@api_view(['GET'])
def api_root(request, format=None):
"""
The entry endpoint of our API.
"""
return Response({
'users': reverse('user-list', request=request),
'groups': reverse('group-list', request=request),
})
class UserList(generics.ListCreateAPIView):
"""
API endpoint that represents a list of users.
"""
model = User
serializer_class = UserSerializer
class UserDetail(generics.RetrieveUpdateDestroyAPIView):
"""
API endpoint that represents a single user.
"""
model = User
serializer_class = UserSerializer
class GroupList(generics.ListCreateAPIView):
"""
API endpoint that represents a list of groups.
"""
model = Group
serializer_class = GroupSerializer
class GroupDetail(generics.RetrieveUpdateDestroyAPIView):
"""
API endpoint that represents a single group.
"""
model = Group
serializer_class = GroupSerializer
Мы создали функцию api_root, которая будет отправной точкой для нашего API. И четыре класса, для связи с моделями и указали какие serializers нужно при этом использовать.
from django.conf.urls import patterns, url, include
from rest_framework.urlpatterns import format_suffix_patterns
from quickstart.views import UserList, UserDetail, GroupList, GroupDetail
urlpatterns = patterns('quickstart.views',
url(r'^$', 'api_root'),
url(r'^users/$', UserList.as_view(), name='user-list'),
url(r'^users/(?P<pk>d+)/$', UserDetail.as_view(), name='user-detail'),
url(r'^groups/$', GroupList.as_view(), name='group-list'),
url(r'^groups/(?P<pk>d+)/$', GroupDetail.as_view(), name='group-detail'),
)
# Format suffixes
urlpatterns = format_suffix_patterns(urlpatterns, allowed=['json', 'api'])
# Default login/logout views
urlpatterns += patterns('',
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
)
Важный момент использование user-detail и group-detail. Для корректной связи с views.py нужно использовать именование вида {modelname}-detail.
В format_suffix_patterns мы указали суфикс для наших urls.
INSTALLED_APPS = (
...
'rest_framework',
)
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',),
'PAGINATE_BY': 10
}
Используя curl в консоли испытаем что же получилось:
bash: curl -H 'Accept: application/json; indent=4' -u admin:password http://127.0.0.1:8000/users/
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"email": "admin@example.com",
"groups": [],
"url": "http://127.0.0.1:8000/users/1/",
"username": "admin"
},
{
"email": "tom@example.com",
"groups": [ ],
"url": "http://127.0.0.1:8000/users/2/",
"username": "tom"
}
]
}
В браузере можно увидить что то подобное:
Ссылки:
Сайт проекта [6]
Github [7]
P.S. Для работы с rest в django есть еще одно не плохое приложение именуемое как django-piston [8]. При желании можно и о нем написать, хотя в использовании оно довольно не сложное.
Автор: int22h
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/django-2/20984
Ссылки в тексте:
[1] Веб-cервис: http://ru.wikipedia.org/wiki/%D0%92%D0%B5%D0%B1-%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D0%B0
[2] Rest: http://ru.wikipedia.org/wiki/REST
[3] Markdown: http://pypi.python.org/pypi/Markdown/
[4] PyYAML: http://pypi.python.org/pypi/PyYAML
[5] django-filter: https://github.com/alex/django-filter
[6] Сайт проекта: http://django-rest-framework.org/
[7] Github: https://github.com/tomchristie/django-rest-framework
[8] django-piston: https://bitbucket.org/jespern/django-piston/wiki/Home
[9] Источник: http://habrahabr.ru/post/160117/
Нажмите здесь для печати.