django - डीजेंगो-रेस्ट-फ्रेमवर्क: एपीआई संस्करण




api rest (2)

ऐसा करने का एक तरीका मीडिया प्रकार के हिस्से के रूप में निर्दिष्ट संस्करण होना है।

गिटहब वर्तमान में उनके एपीआई के लिए क्या करता है।

आप अपने स्वीकृत शीर्षकों में मीडिया प्रकार पैरामीटर भी शामिल कर सकते हैं, उदाहरण के लिए Accept: application/json; version=beta Accept: application/json; version=beta , जो JSONRenderer विरुद्ध सफलतापूर्वक मेल JSONRenderer । फिर आप स्वीकार किए गए मीडिया प्रकार के आधार पर अलग-अलग व्यवहार करने के लिए अपने विचार को कोड कर सकते हैं, here देखें।

एपीआई में वर्जनिंग के लिए कई अलग-अलग पैटर्न हैं, और मैं नहीं कहूंगा कि अभी तक सही दृष्टिकोण के आसपास कोई बड़ी सहमति है, लेकिन यह एक उचित संभावना होगी।

जनवरी 2015 अपडेट करें : बेहतर संस्करण समर्थन 3.1.0 रिलीज में आने वाला होगा। [यह पुल अनुरोध] देखें

मार्च 2015 अपडेट करें : संस्करण एपीआई के लिए डॉक्स अब उपलब्ध हैं

( https://github.com/tomchristie/django-rest-framework/pull/2285 ) अधिक जानकारी के लिए।

इसलिए इसके चारों ओर गुमराह करना प्रतीत होता है कि आम सहमति यह है कि आरईएसटी यूआरआई में संस्करण संख्या एम्बेड करना एक बुरा अभ्यास और बुरा विचार है।

यहां तक ​​कि एसओ पर भी इसका समर्थन करने वाले मजबूत समर्थक हैं।
उदाहरण के लिए एपीआई संस्करण के लिए सर्वोत्तम अभ्यास?

मेरा सवाल यह है कि इसे पूरा करने के लिए django-rest-framework में स्वीकृति हेडर / सामग्री वार्तालाप का उपयोग करने के प्रस्तावित समाधान को कैसे पूरा किया जाए।

यह ढांचे में सामग्री बातचीत की तरह दिखता है,
http://django-rest-framework.org/api-guide/content-negotiation/ स्वीकार्य एमआईएम प्रकारों के आधार पर स्वचालित रूप से इच्छित मूल्यों को स्वचालित रूप से वापस करने के लिए कॉन्फ़िगर किया गया है। यदि मैं कस्टम प्रकारों के लिए स्वीकृति शीर्षलेख का उपयोग शुरू करता हूं, तो मैं ढांचे के इस लाभ को खो दूंगा।

क्या ढांचे में इसे पूरा करने का कोई बेहतर तरीका है?


अद्यतन करें:

वर्जनिंग अब ठीक से समर्थित है।

आपके लिंक से कुछ जवाब हैं:

हमने यूआरएल में संस्करण डालने के लिए व्यावहारिक और उपयोगी पाया। यह एक नज़र में आप क्या उपयोग कर रहे हैं यह बताने में आसान बनाता है। स्वीकार्य उत्तर के सुझाव के अनुसार, हम आसानी से उपयोग, छोटे / क्लीनर यूआरएल इत्यादि के लिए उपनाम / foo / foo / (नवीनतम संस्करण) करते हैं। पीछे की संगतता हमेशा के लिए रखना अक्सर लागत-निषिद्ध और / या बहुत मुश्किल है। हम बहिष्कार के उन्नत नोटिस, यहां सुझाए गए रीडायरेक्ट, डॉक्स और अन्य तंत्र जैसे रीडायरेक्ट देना पसंद करते हैं।

इसलिए हमने इस दृष्टिकोण को लिया, साथ ही ग्राहकों को अनुरोध हेडर (एक्स-वर्जन) में संस्करण निर्दिष्ट करने की इजाजत दी गई, यहां बताया गया है कि हमने यह कैसे किया:

एपीआई ऐप के साथ संरचना:

.
├── __init__.py
├── middlewares.py
├── urls.py
├── v1
│   ├── __init__.py
│   ├── account
│   │   ├── __init__.py
│   │   ├── serializers.py
│   │   └── views.py
│   └── urls.py
└── v2
    ├── __init__.py
    ├── account
    │   ├── __init__.py
    │   ├── serializers.py
    │   └── views.py
    └── urls.py

प्रोजेक्ट urls.py:

url(r'^api/', include('project.api.urls', namespace='api')),

एपीआई ऐप स्तर urls.py:

from django.conf.urls import *

urlpatterns = patterns('',
    url(r'', include('project.api.v2.urls', namespace='default')),
    url(r'^v1/', include('project.api.v1.urls', namespace='v1')),
)

संस्करण स्तर urls.py

from django.conf.urls import *
from .account import views as account_views
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('account', account_views.AccountView)
router.register('myaccount', account_views.MyAccountView)
urlpatterns = router.urls

path_info को बदलकर सही कोड पर स्विच करने के लिए एक मिडलवेयर बनाएं, कृपया ध्यान दें कि एक ऐसी चेतावनी है जो प्रोजेक्ट लेवल यूआरएल में परिभाषित नेमस्पेस ('एपीआई') लचीला नहीं है और इसे मिडलवेयर में जाना आवश्यक है:

from django.core.urlresolvers import resolve
from django.core.urlresolvers import reverse


class VersionSwitch(object):

    def process_request(self, request):
        r = resolve(request.path_info)
        version = request.META.get('HTTP_X_VERSION', False)
        if r.namespace.startswith('api:') and version:
            old_version = r.namespace.split(':')[-1]
            request.path_info = reverse('{}:{}'.format(r.namespace.replace(old_version, version), r.url_name), args=r.args, kwargs=r.kwargs)

नमूना यूआरएल:

curl -H "X-Version: v1" http://your.domain:8000/api/myaccount/




django-rest-framework