و-جانغو بسيط الباقي هو إطار خفيف جدا أن تقدم سوى العظام أساسيات عارية من ما هو مطلوب لخلق واجهات برمجة التطبيقات مريحة على رأس جانغو.
تركيب
1. تثبيت باستخدام نقطة أو easy_install:
- نقطة تثبيت الراحة أو easy_install تثبيت بقية
2. إضافة ExceptionMiddleware إلى قائمة الطبقات الوسيطة (اختياري):
- MIDDLEWARE_CLASSES + = ['rest.exceptions.ExceptionMiddleware']
- هذه الخطوة اختيارية وهناك حاجة إلا إذا كنت تريد أن تكون قادرة على إثارة HttpError من وجهة نظر.
3. إضافة الحزمة إلى قائمة التطبيقات المثبتة (اختياري):
- INSTALLED_APPS + = ['بقية']
- هذه الخطوة اختيارية وهناك حاجة فقط إذا كنت تخطط لاستخدام زودت قيادة جانغو مخصصة (ق).
لماذا إطار آخر REST؟
هذا سؤال كبير، وأبسط الجواب على ذلك هو أن هذه الحقيقة ليست إطارا في كل شيء، ولكن اسمحوا لي أن أشرح قليلا أبعد من ذلك.
مع الأخذ في الآراء على أساس طبقي في الإصدار 1.3 من جانغو، إطار شبكة الإنترنت لديها كل شيء تقريبا كان يحتاج بنيت في خلق واجهات برمجة التطبيقات مريحة، ولكن فقط عدد قليل من الأشياء مفقودة. هذا "الإطار" لوازم تلك الأشياء القليلة الماضية.
التفكير في REST بسيطة مثل التعليمات البرمجية التي كنت قد كتبت للحصول على آراء القائم على الطبقة العاملة بشكل صحيح كمنصة للتنمية API مريحة. نظر من وجهة النظر هذه، عليك أن تبدأ لفهم ما هو REST1 بسيط؛ انها عبارة عن مجموعة من التعليمات البرمجية التي تجعل من الممكن لخلق واجهات برمجة التطبيقات مريحة مع مناظر جانغو على أساس طبقي، لا أكثر ولا أقل.
إذا أردت خلق API الخاص من جهة، يعملون على كل URL الماضي، ثم وهذا هو الإطار بالنسبة لك. إذا كنت تريد شيئا أكثر من ذلك بقليل الكامل المميز الذي يعالج خلق مساحات واسعة من API الخاص بك من نماذج جانغو وأشياء من هذا القبيل، واسمحوا لي أن أقترح بعض الأطر ممتازة: Tastypie، المكبس، وجانغو REST.
كيف يمكنني استخدامه؟
لا يوجد شيء إليها، وأنها تعمل تماما مثل كنت أتوقع أن --- افتراض كنت على دراية وجهات النظر جانغو والطبقية. دعونا نلقي نظرة على سبيل المثال:
# ===============
# views.py
# ===============
الرف استيراد
جسون استيراد
من django.http استيراد HttpResponse
من بقية الموارد الواردات
من rest.exceptions استيراد HttpError
الطبقة MyResource (الموارد):
على & nbsp؛ مواطنه الحصول على (الذات، والطلب، * وسائط **، kwargs):
على & nbsp؛ ديسيبل = shelve.open ('/ تمة / ديسيبل')
على & nbsp؛ البيانات = ديكت (ديسيبل)
على & nbsp؛ db.close ()
على & nbsp؛ العودة HttpResponse (json.dumps (البيانات)، CONTENT_TYPE = 'التطبيق / جسون "، الحالة = 200)
على & nbsp؛ مرحلة ما بعد مواطنه (النفس، طلب، * وسائط **، kwargs):
على & nbsp؛ ديسيبل = shelve.open ('/ تمة / ديسيبل')
على & nbsp؛ اسم = request.POST.get ('اسم'، '')
على & nbsp؛ ديسيبل [اسم] = صحيح
على & nbsp؛ db.sync ()
على & nbsp؛ db.close ()
على & nbsp؛ العودة HttpResponse (الحالة = 201)
على & nbsp؛ حذف مواطنه (النفس، طلب، الاسم):
على & nbsp؛ ديسيبل = shelve.open ('/ تمة / ديسيبل')
& nbsp؛ إذا لم db.has_key (شارع (الاسم)):
على & nbsp؛ db.close ()
على & nbsp؛ رفع HttpError ('اسم غير موجود "، الحالة = 404)
على & nbsp؛ ديل (DB [اسم])
على & nbsp؛ db.sync ()
على & nbsp؛ db.close ()
على & nbsp؛ العودة HttpResponse (الحالة = 200)
لذلك، في المثال views.py أعلاه، قمنا المستوردة الطبقة الموارد، التي يرث ببساطة من جانغو في عرض الصف وتقدم الصلصة اضافية للحصول على كل الطرق HTTP يعمل بشكل صحيح. ثم، ونحن خلق فئة جديدة يرث من فئة الموارد، ونضيف وظيفة لفئة جديدة جهدنا لمعالجة كل طريقة HTTP أننا نريد للسماح. والشرط الوحيد هو أن اسم وظيفة يجب أن تطابق HTTP اسم الأسلوب، حتى الحصول على أو الحصول على مكالمة GET وهكذا دواليك. بسيطة بما فيه الكفاية، أليس كذلك؟ لذا، دعونا نرى كيف لعقف الموارد لدينا:
# ===============
# urls.py
# ===============
من django.conf.urls أنماط الاستيراد، تشمل، رابط
من MyResource استيراد .views
urlpatterns = أنماط (''،
على & nbsp؛ رابط (ص '؟ ^ API / موارد / $'، MyResource.as_view ())،
على & nbsp؛ رابط (ص '؟ ^ API / موارد / (P [ل-ZA-Z -] +) / $'، MyResource.as_view ())،
)
وurls.py العينة أعلاه يظهر بالضبط كيف كنا نذهب حول إنشاء أنماط URL للموارد سبيل المثال لدينا. مرة أخرى، إذا كنت على دراية وجهات النظر الطبقة جانغو مقرها، ينبغي أن يكون هناك أي مفاجآت هنا.
المصادقة
فما حول مصادقة؟ حسنا، هل يمكن ببساطة استخدام وظيفة method_decorator كما تشير مستندات جانغو لتزيين كل طريقة في الموارد الخاصة بك مع الديكور التوثيق المناسب. على افتراض انك تريد حماية الموارد كله هل يمكن أيضا تزيين نتيجة الدعوة إلى as_view في URLconf. كل من هذه الخيارات صحيحة تماما، ويمكنك أن لا تتردد في استخدامها، وهذا الإطار لا توفر خيار آخر، ولكن.
في وحدة rest.auth.decorators ستجد الديكور هناك والتي يمكنك استخدامها لإضافة المصادقة إلى الموارد الخاصة بك. دعونا نلقي نظرة على بعض الأمثلة باستخدام رمز عينة لدينا من أعلاه:
# ===============
# views.py
# ===============
الرف استيراد
جسون استيراد
من django.http استيراد HttpResponse
من بقية الموارد الواردات
من rest.exceptions استيراد HttpError
من rest.auth.decorators يستورد login_required، admin_required
الطبقة MyResource (الموارد):
على & nbsp؛ مواطنه الحصول على (الذات، والطلب، * وسائط **، kwargs):
على & nbsp؛ ديسيبل = shelve.open ('/ تمة / ديسيبل')
على & nbsp؛ البيانات = ديكت (ديسيبل)
على & nbsp؛ db.close ()
على & nbsp؛ العودة HttpResponse (json.dumps (البيانات)، CONTENT_TYPE = 'التطبيق / جسون "، الحالة = 200)
على & nbsp؛login_required
على & nbsp؛ مرحلة ما بعد مواطنه (النفس، طلب، * وسائط **، kwargs):
على & nbsp؛ ديسيبل = shelve.open ('/ تمة / ديسيبل')
على & nbsp؛ اسم = request.POST.get ('اسم'، '')
على & nbsp؛ ديسيبل [اسم] = صحيح
على & nbsp؛ db.sync ()
على & nbsp؛ db.close ()
على & nbsp؛ العودة HttpResponse (الحالة = 201)
على & nbsp؛admin_required
على & nbsp؛ حذف مواطنه (النفس، طلب، الاسم):
على & nbsp؛ ديسيبل = shelve.open ('/ تمة / ديسيبل')
& nbsp؛ إذا لم db.has_key (شارع (الاسم)):
على & nbsp؛ db.close ()
على & nbsp؛ رفع HttpError ('اسم غير موجود "، الحالة = 404)
على & nbsp؛ ديل (DB [اسم])
على & nbsp؛ db.sync ()
على & nbsp؛ db.close ()
على & nbsp؛ العودة HttpResponse (الحالة = 200)
على افتراض أننا لا مانع إذا كان أي شخص يرى لدينا مجموعة من الأسماء، ونحن يمكن أن تترك أن واحدا كما هو، ولكن دعونا نفترض أن لدينا شروط صارمة على الذين يمكن إضافة وحذف الأسماء. على افتراض أنه يمكن للمستخدمين المسجلين فقط إضافة أسماء، أضفنا الديكور login_required إلى أسلوب آخر. ونحن لا مانع إن وجدت أعضائنا إضافة أسماء جديدة، ولكن نحن لا نريد اسما ليتم حذفها عن طريق الخطأ من قاعدة البيانات الخاصة بنا، لذلك دعونا تزيين ان احد مختلف مع الديكور admin_required. admin_required ببساطة يجعل من أن يتم تسجيل المستخدم في وهو مستخدم السوبر قبل أن يتم منح حق الوصول إلى وظيفة الرأي.
الآن، وهذا يمكن الحصول على مملة بعض الشيء اذا كان لدينا الكثير من الموارد، وأنهم جميعا تميل إلى أن تكون متطلبات التوثيق نفسها. لذا، فإن الديكور المصادقة تعمل على كل الفئات وأساليب. في المثال التالي نحن إضافة شرط الخارق لكل طريقة التي تقدمها الموارد ببساطة عن طريق تزيين الطبقة الموارد:
# ===============
# views.py
# ===============
الرف استيراد
جسون استيراد
من django.http استيراد HttpResponse
من بقية الموارد الواردات
من rest.exceptions استيراد HttpError
من rest.auth.decorators استيراد admin_required
admin_required
الطبقة MyResource (الموارد):
على & nbsp؛ مواطنه الحصول على (الذات، والطلب، * وسائط **، kwargs):
على & nbsp؛ ديسيبل = shelve.open ('/ تمة / ديسيبل')
على & nbsp؛ البيانات = ديكت (ديسيبل)
على & nbsp؛ db.close ()
على & nbsp؛ العودة HttpResponse (json.dumps (البيانات)، CONTENT_TYPE = 'التطبيق / جسون "، الحالة = 200)
على & nbsp؛ مرحلة ما بعد مواطنه (النفس، طلب، * وسائط **، kwargs):
على & nbsp؛ ديسيبل = shelve.open ('/ تمة / ديسيبل')
على & nbsp؛ اسم = request.POST.get ('اسم'، '')
على & nbsp؛ ديسيبل [اسم] = صحيح
على & nbsp؛ db.sync ()
على & nbsp؛ db.close ()
على & nbsp؛ العودة HttpResponse (الحالة = 201)
على & nbsp؛ حذف مواطنه (النفس، طلب، الاسم):
على & nbsp؛ ديسيبل = shelve.open ('/ تمة / ديسيبل')
& nbsp؛ إذا لم db.has_key (شارع (الاسم)):
على & nbsp؛ db.close ()
على & nbsp؛ رفع HttpError ('اسم غير موجود "، الحالة = 404)
على & nbsp؛ ديل (DB [اسم])
على & nbsp؛ db.sync ()
على & nbsp؛ db.close ()
على & nbsp؛ العودة HttpResponse (الحالة = 200)
قبل أن نغادر موضوع الديكور المصادقة هناك اثنين من أكثر البنود أود أن أشير إلى. أولا، سبب وجيه آخر لاستخدام الديكور المصادقة الإطار كلما أمكن ذلك هو أنه عندما فشل مصادقة عودتهم الإجابة الصحيحة من وجهة نظر مريحة للنظر. فإن نموذجية الديكور المصادقة جانغو محاولة لإعادة توجيه المستخدم إلى صفحة تسجيل الدخول. في حين أن هذا شيء عظيم عندما كنت على صفحة ويب، عند الوصول إلى الموارد من أي نوع آخر من العميل، وتلقي 401 (غير مصرح بها) هو استجابة المفضلة واحد التي يتم إرجاعها عند استخدام بسيطة الديكور المصادقة REST.
البند الآخر الذي أود أن أشير إليه هو المصادقة الديكور signature_required. العديد من واجهات برمجة التطبيقات باستخدام التوقيع آمن للتعرف على المستخدم وذلك قمنا بإضافة الديكور المصادقة من شأنها أن تضيف هذه الوظيفة إلى الموارد الخاصة بك. سوف الديكور signature_required يتوقع أن HMAC، على النحو المحدد من قبل RFC 2104، يتم إرسالها مع طلب HTTP من أجل مصادقة المستخدم. هو مبني على HMAC حول المفتاح السري للمستخدم وذلك يجب أن يكون هناك وسيلة للالديكور signature_required للحصول على هذا المفتاح السري ويتم ذلك من خلال توفير الديكور مع دالة التي تأخذ كائن جانغو HttpRequest وأي عدد من الموضعية والكلمة الحجج على النحو المحدد في URLconf. دعونا نلقي نظرة على مثال من استخدام الديكور signature_required مع شركائنا كود الموارد العينة:
# ===============
# views.py
# ===============
الرف استيراد
جسون استيراد
من django.http استيراد HttpResponse
من بقية الموارد الواردات
من rest.exceptions استيراد HttpError
من rest.auth.decorators استيراد signature_required
secret_key مواطنه (طلب، * وسائط **، kwargs):
على & nbsp؛ المستخدم = User.objects.get (PK = kwargs.get ('رمز المستخدم'))
على & nbsp؛ user.secret_key عودة
signature_required (secret_key)
الطبقة MyResource (الموارد):
على & nbsp؛ مواطنه الحصول على (الذات، والطلب، * وسائط **، kwargs):
على & nbsp؛ ديسيبل = shelve.open ('/ تمة / ديسيبل')
على & nbsp؛ البيانات = ديكت (ديسيبل)
على & nbsp؛ db.close ()
على & nbsp؛ العودة HttpResponse (json.dumps (البيانات)، CONTENT_TYPE = 'التطبيق / جسون "، الحالة = 200)
على & nbsp؛ مرحلة ما بعد مواطنه (النفس، طلب، * وسائط **، kwargs):
على & nbsp؛ ديسيبل = shelve.open ('/ تمة / ديسيبل')
على & nbsp؛ اسم = request.POST.get ('اسم'، '')
على & nbsp؛ ديسيبل [اسم] = صحيح
على & nbsp؛ db.sync ()
على & nbsp؛ db.close ()
على & nbsp؛ العودة HttpResponse (الحالة = 201)
على & nbsp؛ حذف مواطنه (النفس، طلب، الاسم):
على & nbsp؛ ديسيبل = shelve.open ('/ تمة / ديسيبل')
& nbsp؛ إذا لم db.has_key (شارع (الاسم)):
على & nbsp؛ db.close ()
على & nbsp؛ رفع HttpError ('اسم غير موجود "، الحالة = 404)
على & nbsp؛ ديل (DB [اسم])
على & nbsp؛ db.sync ()
على & nbsp؛ db.close ()
على & nbsp؛ العودة HttpResponse (الحالة = 200)
وهناك أيضا أخرى الديكور دعا auth_required الذي يعمل في نفس الطريقة كما signature_required (بمعنى أنه يأخذ وظيفة يقوم بإرجاع المفتاح السري كذلك) ولكن ذلك يتطلب أن المستخدم إما بتسجيل الدخول أو لديه توقيع صالح قبل منحهم الوصول إلى المورد.
وأخيرا، إذا كنت تستخدم الديكور signature_required أو auth_required في التعليمات البرمجية وتحتاج إلى مساعدة إضافية قليلا التصحيح الموارد الخاصة بك، وتحديدا كنت بحاجة الى مساعدة توليد توقيع آمن، يوفر REST بسيطة أمر مخصص يسمى urlencode أن يأخذ مجموعة من البيانات كمفتاح / أزواج قيمة والمفتاح السري اختياري وإرجاع URL سلسلة المشفرة التي يمكنك نسخ ولصق مباشرة في أمر حليقة أو أداة أخرى مفيدة مثل وحدة التحكم REST للكروم. يتم سرد مثال عن كيفية استخدام الأمر urlencode أدناه:
٪ الثعبان manage.py urlencode --secret مفتاح = اختبار فو = 1 بار = 2 = 3 الباز اسم = 'ماكسويل المطرقة "
التحقق من صحة النموذج
إذا كنت ترغب في استخدام نموذج للتحقق من صحة البيانات الواردة في طلب REST (على سبيل المثال، وهو المنصب لخلق مورد جديد) يمكنك تشغيل إلى بعض المشاكل باستخدام الطبقة ModelForm جانغو. على وجه التحديد، لنفترض أن لديك نموذج يحتوي على العديد من سمات اختيارية مع القيم الافتراضية المحددة. إذا قمت بإرسال طلب إلى إنشاء مثيل جديد من هذه الفئة ولكنها تشمل بيانات عن عدد قليل من السمات الاختيارية فقط، وكنت أتوقع أن الكائن شكل خلق لكم لن تفشل المصادقة منذ حفظ الكائن سيعني التي من شأنها أن السجل الجديد ببساطة ينتهي مع القيم الافتراضية لسمات في عداد المفقودين. وهذا هو، ومع ذلك، ليس هو الحال مع الطبقة ModelForm جانغو. انها تنتظر لمعرفة كافة البيانات في كل طلب، وسوف تفشل إذا أي مفقود.
لحل هذه المشكلة، يوفر الإطار REST بسيط فئة ModelForm في rest.forms أن يرث من ModelForm جانغو وتهيئة طلب وارد مع القيم الافتراضية من وجوه النموذج الكامن وراء أية سمات المفقودة. وهذا يسمح للالتحقق من صحة النموذج للعمل بشكل صحيح وللكائن الجديد ليتم حفظها مع جزء فقط من مجموعة كاملة من سمات ترسل في غضون الطلب. استخدام فئة، وذلك ببساطة استيراده بدلا من وضعها الطبيعي جانغو ModelForm ويكون لديك فئة النموذج يرث منه بدلا من لجانغو.
القادمة
تبقى على اطلاع على التحديثات إلى الإطار. في حين تم إنشاؤه أصلا مع فكرة توفير مجرد الحد الأدنى اللازم لاستخدام طرق جانغو على أساس طبقي لخلق واجهات برمجة التطبيقات مريحة، لا يزال هناك عدد قليل من السمات لطيفة التي نحن في عملية إضافة التي نعتقد أنها سوف تكمل الإطار جيدا في حين لا يزال يجري الحقيقية لمثل الحد الأدنى لدينا. الأكثر إثارة من هذه التحديثات سيكون إضافة التفاوض المحتوى التلقائي للاستجابات عاد من الموارد
المتطلبات:.
بيثون
جانغو
لم يتم العثور على التعليقات