জাজানো রিস্ট ফ্রেমওয়ার্ক: নন-মডেল সিরিয়ালাইজার


158

আমি জ্যাঙ্গো আরআরএসটি ফ্রেমওয়ার্কে শিক্ষানবিস এবং আপনার পরামর্শের প্রয়োজন। আমি একটি ওয়েব পরিষেবা বিকাশ করছি। পরিষেবাটি অন্যান্য পরিষেবাদিগুলিতে আরইএসটি ইন্টারফেস সরবরাহ করতে হবে। আরআরএসটি ইন্টারফেস, যা আমার বাস্তবায়ন করা দরকার তা আমার মডেলগুলির সাথে সরাসরি কাজ করছে না (আমি বোঝাতে চাই, রাখি, পোস্ট করব, অপারেশনগুলি মুছুন)। পরিবর্তে, এটি কিছু গণনার ফলাফল সহ অন্যান্য পরিষেবাদি সরবরাহ করে। একটি অনুরোধে আমার পরিষেবা কিছু গণনা করে এবং ফলাফলগুলি ফিরে দেয় (ফলাফলটি তার নিজস্ব ডাটাবেসে সংরক্ষণ করে না)।

নীচে কীভাবে সেই আরএসটি ইন্টারফেস প্রয়োগ করা যেতে পারে সে সম্পর্কে আমার বোঝার নীচে। আমি ভুল হলে আমাকে সংশোধন করুন।

  1. ক্লাস তৈরি করুন যা গণনা করে। এর নাম দিন 'ক্যালক্লাস'। ক্যালক্লাস তার কাজের মডেলগুলি ব্যবহার করে।
    • গণনার জন্য প্রয়োজনীয় প্যারামগুলি কনস্ট্রাক্টরকে দেওয়া হয়।
    • ক্যালক অপারেশনটি কার্যকর করুন। এটি 'রেজাল্টক্লাস' হিসাবে ফলাফলগুলি ফেরত দেয়।
  2. রেজাল্টক্লাস তৈরি করুন।
    • বস্তু থেকে প্রাপ্ত।
    • এটিতে কেবল ফলাফলের ফলাফল রয়েছে attrib
    • ক্যালক ফলাফলের একটি অংশ টিপলসের টিউপল হিসাবে উপস্থাপিত হয়। আমি যেমন বুঝতে পেরেছি, পরবর্তী ফলাফলগুলির জন্য সেই ফলাফলগুলির জন্য একটি পৃথক শ্রেণি প্রয়োগ করা এবং রেজাল্টক্লাসে এই জাতীয় সামগ্রীর তালিকা যুক্ত করা আরও ভাল।
  3. রেজাল্টক্লাসের জন্য সিরিয়ালাইজার তৈরি করুন।
    • সিরিয়ালাইজারের কাছ থেকে প্রাপ্ত।
    • ক্যালকের ফলাফলগুলি কেবল পঠনযোগ্য, তাই ক্ষেত্রগুলির জন্য বেশিরভাগ ক্ষেত্রের জন্য ক্লাসের মতো বিশেষ শ্রেণীর পরিবর্তে ফিল্ড শ্রেণি ব্যবহার করুন।
    • আমার রেজাল্টক্লাসে বা সিরিয়ালাইজারে সংরক্ষণের () পদ্ধতিটি উত্সাহিত করা উচিত নয়, কারণ আমি ফলাফলগুলি সংরক্ষণ করতে যাচ্ছি না (আমি কেবল অনুরোধে তাদের ফিরিয়ে দিতে চাই)।
    • নেস্টেড ফলাফলের জন্য সিরিয়ালায়িতকরণ করুন (উপরে উল্লিখিত টিপলসের টুপল মনে রাখবেন)।
  4. গণনার ফলাফলগুলি ফেরতের জন্য ভিউ তৈরি করুন।
    • এপিআইভিউ থেকে প্রাপ্ত
    • দরকার মাত্র ()।
    • অনুরোধ থেকে প্রাপ্ত প্যারামগুলির সাথে ক্যালকক্লাস তৈরি করুন, এর ক্যালক কল করুন (), রেজাল্টক্লাস পান, সিরিয়ালাইজার তৈরি করুন এবং এতে রেজাল্টক্লাস পাস করুন, প্রতিক্রিয়া (সিরিয়ালাইজার.ডাটা) ফেরান।
  5. URL গুলি
    • আমার ক্ষেত্রে এপিআই রুট নেই। বিভিন্ন ক্যালক ফলাফল (ডিফারফর্মের সাথে ক্যালক) পেতে আমার কেবল ইউআরএল থাকা উচিত।
    • এপিআই ব্রাউজিংয়ের জন্য কলিং ফর্ম্যাট_সফিক্স_প্যাটার্ন যুক্ত করুন।

আমি কি কিছু রেখে গেলাম? পদ্ধতির কি সাধারণভাবে সঠিক?


এই পদ্ধতিটি সঠিক এবং আমার কাছে গ্রহণযোগ্য উত্তরের চেয়ে আরও মার্জিত দেখাচ্ছে (ফলাফলগুলি পুনরায় ব্যবহারযোগ্য ফলাফলের ধরণে ডেটা আবদ্ধ করা হয়েছে)। তবে দিন শেষে এটি বেশিরভাগ ব্যক্তিগত পছন্দের প্রশ্ন এবং উভয় পন্থাই কাজটি করে।
zepp.lee

উত্তর:


157

জ্যাঙ্গো-রেস্ট-ফ্রেমওয়ার্ক কোনও মডেলের সাথে বেঁধে না রেখে এমনকি ভাল কাজ করে। আপনার পদ্ধতিটি ঠিক মত শোনাচ্ছে তবে আমি বিশ্বাস করি যে আপনি সবকিছু কাজ করার জন্য কয়েকটি ধাপ ছাঁটাতে পারেন।

উদাহরণস্বরূপ, বিশ্রাম কাঠামোটি কয়েকটি বিল্ট-ইন রেন্ডারারগুলির সাথে আসে। বাক্সের বাইরে এটি API গ্রাহককে JSON এবং XML ফেরত দিতে পারে। আপনি প্রয়োজনীয় পাইথন মডিউলটি ইনস্টল করে আপনি ওয়াইএএমএল সক্ষম করতে পারেন। জ্যাঙ্গো-রেস্ট-ফ্রেমওয়ার্ক আপনার পক্ষ থেকে কোনও অতিরিক্ত কাজ ছাড়াই ডিক, তালিকা এবং টিপলের মতো কোনও বেসিক অবজেক্টকে আউটপুট দেবে।

সুতরাং মূলত আপনাকে কেবল ফাংশন বা শ্রেণি তৈরি করতে হবে যা আর্গুমেন্ট গ্রহণ করে, প্রয়োজনীয় সমস্ত গণনা করে এবং এর ফলাফলগুলি বিশ্রাম এপিআই ভিউতে একটি টিপলে ফেরত দেয়। যদি জেএসওএন এবং / অথবা এক্সএমএল আপনার প্রয়োজনগুলি মাপসই করে তবে জ্যাঙ্গো-রেস্ট-ফ্রেমওয়ার্ক আপনার জন্য সিরিয়ালাইজেশনটির যত্ন নেবে।

আপনি এক্ষেত্রে 2 এবং 3 পদক্ষেপ এড়িয়ে যেতে পারেন, এবং কেবল গণনার জন্য একটি ক্লাস এবং এপিআই গ্রাহকের কাছে উপস্থাপনের জন্য একটি ক্লাস ব্যবহার করতে পারেন।

এখানে কয়েকটি স্নিপেট আপনাকে সাহায্য করতে পারে:

দয়া করে মনে রাখবেন যে আমি এটি পরীক্ষা করেছি না। এটি কেবল উদাহরণ হিসাবে বোঝানো হয়েছে, তবে এটি কার্যকর হওয়া উচিত :)

ক্যালক্লাস:

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

বিশ্রামদর্শন:

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

আপনার 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'),
)

আপনি যখন http://example.com/api/v1.0/resource/?format=json অ্যাক্সেস করবেন তখন এই কোডটির তালিকাগুলির একটি তালিকা আউটপুট করা উচিত । একটি প্রত্যয় ব্যবহার করেন, তাহলে আপনি প্রতিস্থাপন করতে পারেন ?format=jsonসঙ্গে .json। আপনি যে এনকোডিংটি ফিরে পেতে চান তা আপনি যোগ করতে "Content-type"বা "Accept"শিরোলেখগুলিতেও নির্দিষ্ট করতে পারেন ।

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

আশা করি এটি আপনাকে সাহায্য করবে।


2
হাই গ্যাব্রিয়েল! আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ! আমার পরিকল্পনা অনুযায়ী আমার যা প্রয়োজন তা আমি ইতিমধ্যে বাস্তবায়ন করেছি। ঠিকভাবে কাজ করে! আমি আরও ভাল জসন আউটপুট জন্য সিরিয়াল ব্যবহার করেছি।
জখর

3
আমি এই প্রস্তাবটি অনুসরণ করতে চেষ্টা করেছি কিন্তু আমি পেতে: "একটি দৃশ্য যে নাই DjangoModelPermissions প্রয়োগ করা যাচ্ছে না .modelবা .queryset। সম্পত্তি"। আমি প্রদত্ত সঠিক উদাহরণটি চেষ্টা করেছি। এটি জাঙ্গো-বিশ্রাম-কাঠামোর সাম্প্রতিক সংস্করণ সহ কিছু হতে পারে?
অরল্যান্ডো

এই উদাহরণটি কিছু সময় আগে লেখা হয়েছে। আমার তখন থেকে আবার জ্যাঙ্গোর সাথে কাজ করার সুযোগ হয়নি। তবে আপনি এখানে দরকারী কিছু পেতে পারেন: django-rest-framework.org/api-guide/routers
গ্যাব্রিয়েল সামফিরা

1
এই উদাহরণটি হ'ল আমার প্রয়োজনটি হ'ল একটি পরিষেবা যা কোনও নন মডেল সিরিয়ালাইজার ছাড়াই কিছু অপারেশন করছে!
খলিল তবলাল

: @Orlando: একটি চেহারা এখানে কিভাবে সঙ্গে Đăng-restframework 3 একটি অ-মডেল দেখার জন্য অনুমতি যুক্তিবিজ্ঞান নির্দিষ্ট বাস্তবায়ন হয়েছে stackoverflow.com/a/34040070/640916
djangonaut

-1

Url.py এ ফাংশন লগইন_প্রযুক্তি প্রয়োজন

from django.contrib.auth.decorators import login_required

যদি এটি কোনও উত্তরের পরিবর্তে কেবল একটি মন্তব্য হয় তবে add a commentসেশনটি ব্যবহার করার কথা বিবেচনা করুন
লুচাস্কাভ্যালঙ্কেতে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.