Простота Django создания интерфейса RESTful

Вместо простого удара используйте Make-файл, затем определите количество одновременных заданий с make -jX, где X количество заданий для выполнения сразу.

Или можно использовать wait (" man wait"): запустите несколько дочерних процессов, звоните wait - это выйдет, когда дочерние процессы закончатся.

maxjobs = 10

foreach line in `cat file.txt` {
 jobsrunning = 0
 while jobsrunning < maxjobs {
  do job &
  jobsrunning += 1
 }
wait
}

job ( ){
...
}

, Если необходимо сохранить результат задания, затем присвойте их результат переменной. После wait Вы просто проверяете то, что содержит переменная.

10
задан Peter Mortensen 24 November 2009 в 16:45
поделиться

6 ответов

Это, вероятно, довольно легко сделать.

Сопоставления URL-адресов легко построить, например:

urlpatterns = patterns('books.views',
  (r'^books/$', 'index'),
  (r'^books/(\d+)/$', 'get'))

Django поддерживает сериализацию модели , поэтому легко включить моделей в XML:

from django.core import serializers
from models import Book

data = serializers.serialize("xml", Book.objects.all())

Объедините их с декораторами , и вы сможете создавать быстрые и быстрые обработчики:

from django.http import HttpResponse
from django.shortcuts import get_object_or_404

def xml_view(func):
  def wrapper(*args, **kwargs):
    result = func(*args, **kwargs)
    return HttpResponse(serializers.serialize("xml", result),
        mimetype="text/xml")
  return wrapper

@xml_view
def index(request):
  return Books.objects.all()

@xml_view
def get(request, id):
  return get_object_or_404(Book, pk=id)
15
ответ дан 3 December 2019 в 15:52
поделиться

(пришлось отредактировать наиболее очевидные ссылки.)

+1 для поршня - (ссылка выше). Раньше я использовал apibuilder (открытый исходный код Washington Times), но Piston мне проще. Самым трудным для меня является определение структуры URL-адресов для API и помощь с регулярными выражениями. Я также использовал сурлекс , который значительно упрощает эту работу.

Пример использования этой модели для группы (из системы расписания, над которой мы работаем):

class Group(models.Model):
    """
    Tree-like structure that holds groups that may have other groups as leaves. 
    For example ``st01gp01`` is part of ``stage1``.
    This allows subgroups to work. The name is ``parents``, i.e.::

        >>> stage1group01 = Group.objects.get(unique_name = 'St 1 Gp01')
        >>> stage1group01
        >>> <Group: St 1 Gp01>
        # get the parents...
        >>> stage1group01.parents.all()
        >>> [<Group: Stage 1>]

    ``symmetrical`` on ``subgroup`` is needed to allow the 'parents' attribute to be 'visible'.
    """
    subgroup = models.ManyToManyField("Group", related_name = "parents", symmetrical= False, blank=True)
    unique_name = models.CharField(max_length=255)
    name = models.CharField(max_length=255)
    academic_year = models.CharField(max_length=255)
    dept_id = models.CharField(max_length=255)
    class Meta:
        db_table = u'timetable_group'
    def __unicode__(self):
        return "%s" % self.name

И этот фрагмент urls.py (обратите внимание, что surlex позволяет легко настраивать макросы регулярных выражений):

from surlex.dj import surl
from surlex import register_macro
from piston.resource import Resource
from api.handlers import GroupHandler
group_handler = Resource(GroupHandler)

# add another macro to our 'surl' function
# this picks up our module definitions
register_macro('t', r'[\w\W ,-]+')

urlpatterns = patterns('',
# group handler
# all groups
url(r'^groups/$', group_handler),
surl(r'^group/<id:#>/$', group_handler),
surl(r'^group/<name:t>/$', group_handler),)

Затем этот обработчик будет следить за выводом JSON (по умолчанию), а также может выполнять XML и YAML .

class GroupHandler(BaseHandler):
    """
    Entry point for Group model
    """

    allowed_methods = ('GET', )
    model = Group
    fields = ('id', 'unique_name', 'name', 'dept_id', 'academic_year', 'subgroup')

    def read(self, request, id=None, name=None):
        base = Group.objects
        if id:
            print self.__class__, 'ID'
            try:
                return base.get(id=id)
            except ObjectDoesNotExist:
                return rc.NOT_FOUND
            except MultipleObjectsReturned: # Should never happen, since we're using a primary key.
                return rc.BAD_REQUEST
        else:
            if name:
                print self.__class__, 'Name'
                return base.filter(unique_name = name).all()
            else:
                print self.__class__, 'NO ID'
                return base.all()

Как видите,

4
ответ дан 3 December 2019 в 15:52
поделиться

Чуть более года назад я написал веб-службу REST на Django для крупной компании в Сиэтле, которая занимается потоковой передачей мультимедиа в Интернете.

Django отлично подходит для этой цели. Как заметил «платный ботаник», конфигурация URL-адресов Django замечательна: вы можете настроить свои URL-адреса так, как вы хотите, и заставить их обслуживать соответствующие объекты.

Единственное, что мне не понравилось: Django ORM абсолютно не поддерживает двоичные большие двоичные объекты. Если вы хотите обслуживать фотографии или что-то в этом роде, вам нужно будет хранить их в файловой системе, а не в базе данных. Поскольку мы использовали несколько серверов, мне приходилось выбирать между написанием моей собственной поддержки BLOB или поиском какой-либо инфраструктуры репликации, которая будет поддерживать все серверы в актуальном состоянии с последними двоичными данными. (Я решил написать собственную поддержку BLOB. Это было несложно, так что меня действительно раздражало, что ребята из Django не справились с этой работой. Должен быть один, а желательно только один, очевидный способ что-то сделать.)

Мне очень нравится Django ORM. Это действительно упрощает работу с базой данных; вам не нужно знать какой-либо SQL. (Мне не нравится SQL, и мне нравится Python, так что это двойная победа.) «Интерфейс администратора», который вы получаете бесплатно, дает вам отличный способ просматривать ваши данные и вставлять данные во время тестирования и разработка.

Я безоговорочно рекомендую Django.

1
ответ дан 3 December 2019 в 15:52
поделиться

Он может отвечать любыми данными. JSON / XML / PDF / pictures / CSV ...

Сам Django поставляется с набором сериализаторов .

Править

Я только что взглянул на Piston ] - выглядит многообещающе. Лучшая особенность:

Не мешает.

:)

2
ответ дан 3 December 2019 в 15:52
поделиться

Взгляните на Piston, это мини-фреймворк для Django для создания RESTful API.

Недавняя запись в блоге Эрика Хольшера дает больше информации о преимуществах использования Piston: Большие проблемы в Django, в основном решаемые: API

3
ответ дан 3 December 2019 в 15:52
поделиться

Что касается вашего комментария о том, что сторонний код не нравится - это очень плохо, потому что подключаемые приложения - одна из величайших особенностей django . Как и другие ответили, поршень сделает большую часть работы за вас.

2
ответ дан 3 December 2019 в 15:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: