SORU
28 Kasım 2012, ÇARŞAMBA


Django REST çerçeve: model olmayan seri hale getirici

Django REST çerçevesinde yeni başladım ve tavsiyene ihtiyacım var. Bir web hizmeti geliştiriyorum. Hizmet diğer hizmetler için DİNLENME arayüzü sağlamak için vardır. Uygulamak için gereken DİNLENME arayüzü, bu modeller doğrudan (get, post, delete işlemleri koyabilirim) ile çalışmıyor. Bunun yerine, bazı hesaplama sonuçları ile diğer hizmetleri sağlar. Bir istek üzerine hizmetimi bazı hesaplamalar yapar ve sonuçları (kendi veritabanında sonuçları depolamak değil) geri döner.

Aşağıda arayüzü uygulanan olabilir nasıl benim anlayış. Eğer yanlışım varsa düzeltin.

  1. Hesaplamalar yapar sınıf oluşturun. Bu ''. CalcClass adı CalcClass çalışmalarında modelleri kullanır.
    • Hesaplamalar için gerekli parametreler yapıcı geçti.
    • Hesaplama işlemi uygulamak. Sonuç olarak döndürür''. ResultClass
  2. ResultClass Oluşturun.
    • Nesne türetilir.
    • Sadece öznitelikleri hesaplama sonuçlarını içeren vardır.
    • Hesaplama sonuçları bir parçası dizilerini dizi olarak temsil edilir. Anladığım kadarıyla, daha da seri hale getirme bu sonuçlar için ayrı bir sınıf uygulamak için daha iyi ve bu tür nesnelerin listesini ResultClass eklemek olacaktır.
  3. ResultClass için seri hale getirici oluşturun.
    • Serializers kaynaklanıyor.Seri hale getirici.
    • Hesaplama sonuçları salt okunur, yani alanlar, İntegerField gibi özel sınıflar yerine, çoğunlukla Alan sınıf kullanın.
    • Kaydet impl değilim() sonuçlarını depolamak için gitmiyorum çünkü ne seri hale getirici ResultClass, ne de, yöntem (sadece istek üzerine iade etmek istiyorum).
    • İç içe sonuçları (dizilerini yukarıda başlık hatırlıyorum) İmpl seri hale getirici.
  4. Görünüm hesaplama sonuçları döndürmek için oluşturun.
    • APİView kaynaklanıyor.
    • Almak lazım sadece().
    • Get() parametreler isteği ile alınan CalcClass oluşturmak, calc çağrı(), ResultClass, seri hale getirici oluşturmak ve ResultClass pas, geri Tepki(seri hale getirici.veri).
  5. Url
    • Benim durumumda apı kök yok. Sadece çeşitli hesaplama sonuçları almak için URL (fark parametreler ile calc) gerekirdi.
    • Apı tarama için arama format_suffix_patterns ekleyin.

Bir şey mi kaçırdım? Bu yaklaşım genel olarak doğru mu?

CEVAP
29 Kasım 2012, PERŞEMBE


Django-rest-çerçeve iyi bir model bile bağlayarak çalışır. Yaklaşımınız Tamam görünüyor, ama bazı adımları her şeyi çalışma almak için kesebilirsiniz inanıyorum.

Örneğin, dinlenme çerçeve birkaç yerleşik render ile birlikte geliyor. Kutunun dışında ve API tüketiciye JSON XML dönebilirsiniz. Ayrıca sadece gerekli python modülü yükleyerek YAML etkinleştirebilirsiniz. Django-rest-çerçeve dict, list gibi herhangi bir temel nesne çıktı ve herhangi bir ekstra iş olmadan başlık.

Yani temelde, yalnızca bağımsız değişkenleri alır, gerekli hesaplamaları yapar ve görünümü apı geri KALANI için bir demet içinde sonuçları döndüren bir işlev veya sınıf oluşturmak zorunda. Eğer JSON ve/veya XML ihtiyaçlarınıza uygun, django-rest-çerçeve sizin için serileştirme ilgilenir.

Bu durumda 2 ve 3 numaralı adımları atlayın ve sadece API tüketici için hesaplamalar ve sunum için bir sınıf kullanabilirsiniz.

Burada size yardımcı olabilecek birkaç parçacıkları:

Lütfen bu test etmedim unutmayın. Sadece bir örnek olarak anlamı var :)

Bu CalcClass:

class CalcClass(object):

    def __init__(self, *args, **kw):
        # Initialize any variables you need from the input you get
        pass

    def do_work(self):
        # Do some calculations here
        # returns a tuple ((1,2,3, ), (4,5,6,))
        result = ((1,2,3, ), (4,5,6,)) # final result
        return result

GERİSİ görünüm:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from MyProject.MyApp import CalcClass


class MyRESTView(APIView):

    def get(self, request, *args, **kw):
        # Process any get params that you may need
        # If you don't need to process get params,
        # you can skip this part
        get_arg1 = request.GET.get('arg1', None)
        get_arg2 = request.GET.get('arg2', None)

        # Any URL parameters get passed in **kw
        myClass = CalcClass(get_arg1, get_arg2, *args, **kw)
        result = myClass.do_work()
        response = Response(result, status=status.HTTP_200_OK)
        return response

Senin urls.py:

from MyProject.MyApp.views import MyRESTView
from django.conf.urls.defaults import *

urlpatterns = patterns('',
    # this URL passes resource_id in **kw to MyRESTView
    url(r'^api/v1.0/resource/(?P<resource_id>\d )[/]?$', login_required(MyRESTView.as_view()), name='my_rest_view'),
    url(r'^api/v1.0/resource[/]?$', login_required(MyRESTView.as_view()), name='my_rest_view'),
)

Bu kod 8 ** erişim listeleri bir liste çıktı. Eğer bir sonek kullanarak, yerini alabilir mi ?format=json .json. Ayrıca "İçerik-tipi" ya da "Kabul" başlıkları. ekleyerek almak istediğiniz kodlama belirtebilirsiniz

[
  [
    1, 
    2, 
    3
  ], 
  [
    4, 
    5, 
    6
  ]
]

Bu sana yardımcı olur umarım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Anthony

    Eric Anthony

    13 AĞUSTOS 2011
  • 10 Daughters, 2 Sons

    10 Daughters

    10 Mart 2009
  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007