में POST का उपयोग कर विदेशीकी के साथ समस्याएं मैं django-tastypie का उपयोग कर एक साधारण एपीआई बना रहा हूं।Django-Tastypie
- एक नोट संसाधन एक नोट एक उपयोगकर्ता द्वारा छोड़ा का प्रतिनिधित्व: विचार मैं दो संसाधन है। केवल उपयोगकर्ता जिसने नोट बनाया है उसे संपादित कर सकते हैं।
- ए टिप्पणी संसाधन। टिप्पणियां किसी भी उपयोगकर्ता द्वारा किसी भी नोट पर छोड़ी जा सकती हैं।
टी एल; डॉ: मैं नोट एक नोट के निर्माता को संपादित करते समय अभी तक किसी भी उपयोगकर्ता एक नोट पर टिप्पणी करने के लिए अनुमति को सीमित करने में असमर्थ हूँ।
मैं प्रमाणीकरण के लिए निम्नलिखित सेटअप का उपयोग कर रहा हूँ:
class CreatedByEditAuthorization(Authorization):
def is_authorized(self, request, object=None, **kwargs):
return True
def apply_limits(self, request, object_list):
if request and request.method != 'GET' and hasattr(request, 'user'):
return object_list.filter(created_by=request.user)
return object_list
संक्षेप में, एक उपयोगकर्ता केवल जिसके लिए वे created_by संपत्ति के बराबर हैं वस्तुओं संपादित करने के लिए अधिकृत किया गया है (वे केवल वस्तुओं वे बनाए संपादित कर सकते हैं) ।
class NoteResource(ModelResource):
comments = fields.ToManyField('myapp.api.resources.CommentResource', 'comments', null=True, blank=True)
created_by = fields.ToOneField('account.api.resources.UserResource', 'created_by')
def obj_create(self, bundle, request, **kwargs):
return super(HapResource, self).obj_create(bundle, request, created_by=request.user)
class Meta:
queryset = Note.objects.all()
allowed_methods = ['get', 'put', 'post']
authorization = CreatedByEditAuthorization()
इसलिए यहाँ, जब एक वस्तु बन जाता है, मैं अपने आप वर्तमान उपयोगकर्ता created_by
विशेषता को देते हैं और उचित प्राधिकरण से लिंक:
यह इस प्रकार जुड़ा हुआ है।
ए Comment
संसाधन सरल है और Note
संसाधन पर ForeignKey
है।
समस्या यह है: यदि उपयोगकर्ता ए नोट बनाता है और उपयोगकर्ता बी उस नोट पर टिप्पणी करने का प्रयास करता है, तो tastypie उस नोट को संपादित करने के लिए एक POST अनुरोध भेजता है (या अनुकरण करता है)। यह प्रयास अस्वीकार कर दिया गया है क्योंकि उपयोगकर्ता बी ने नोट नहीं बनाया है, इसलिए टिप्पणी बनाना विफल हो जाता है।
सवाल यह है: वहाँ एक रास्ता है करने के लिए या तो:
-
नोट संसाधन
या
- बदलें प्राधिकरण योजना के उलट-संबंध बनाने के लिए एक पोस्ट का उपयोग करने से
- रोकें tastypie तो नोट्स केवल उनके निर्माता द्वारा संपादित किया जा सकता है, लेकिन टिप्पणियां आम तौर पर बनाई जा सकती हैं?
किसी भी अंतर्दृष्टि के लिए अग्रिम धन्यवाद।
संपादित करें: मेरे पास एक बड़ी वसा हैक है जो इसे पूरा कर सकता है। मुझे यकीन है कि यह सुरक्षित है, लेकिन मैं सकारात्मक नहीं हूं; मैं सुनिश्चित करने के लिए कुछ प्रश्न बनाने का प्रयास करूंगा।
class SafeForeignKey(fields.ForeignKey):
def build_related_resource(self, value, request=None, related_obj=None, related_name=None):
temp = request.method
if isinstance(value, basestring):
request.method = 'GET'
ret = super(SafeForeignKey, self).build_related_resource(value, request, related_obj, related_name)
request.method = temp
return ret
हर बार जब हम इस संबंधित संसाधन के निर्माण के लिए प्रयास करते हैं, हम (एक GET
के रूप में अनुरोध निशान के बाद से हम उम्मीद करते हैं यह करने के लिए मिलान किया जा: Comment
में fields.ForeignKey
का उपयोग कर Note
से संबंधित करने के बजाय, मैं एक कस्टम फ़ील्ड बनाने एक SELECT
UPDATE
की बजाय क्वेरी जो PUT
या POST
से मेल खाता है)। गलत तरीके से इस्तेमाल होने पर यह वास्तव में बदसूरत और संभावित रूप से असुरक्षित है, और मैं एक बेहतर समाधान की उम्मीद कर रहा हूं।
संपादित करें 2: स्वादिष्ट स्रोत पढ़ने से, जहां तक मैं कह सकता हूं कि क्वेरी द्वारा प्राधिकरण को फ़िल्टर करने का कोई तरीका नहीं है जो वास्तव में भेजा जाएगा।
प्रश्नों के युगल - क्या आप contrib.comments का उपयोग कर रहे हैं? क्या आप प्रमाणीकरण के साथ ही प्राधिकरण का उपयोग कर रहे हैं? मेरे पास एक बहुत ही समान सेटअप प्रतीत होता है (बिना टिप्पणी संसाधन के प्रतीत होता है) जो किसी अन्य उपयोगकर्ता ऑब्जेक्ट पर एक नई टिप्पणी पोस्ट करते समय ठीक काम करता है। – JamesO
@JamesO नहीं, हमारी टिप्पणियां contrib.comments की तुलना में कुछ हद तक समृद्ध हैं (और एक ही समस्या वाले एक पोस्ट से जुड़े अन्य डेटा हैं)। वर्तमान में हम केवल अंतर्निहित प्रमाणीकरण() का उपयोग कर रहे हैं (यानी सभी को प्रमाणित किया गया है)। –
क्या आपने इसे django-tastypie पर एक समस्या के रूप में पोस्ट किया है: https://github.com/toastdriven/django-tastypie/issues? यदि हर बार जब आप इससे संबंधित कुछ बनाते हैं तो यह मूल रूप से अभिभावक रिकॉर्ड को अपडेट करने का प्रयास करता है, यह किसी सुविधा की तुलना में बग के करीब है। –