2013-06-18 18 views
9

मैं Django बाकी ढांचे ट्यूटोरियल के माध्यम से जा रहा हूँ, मेरे स्वयं के कस्टम उपयोगकर्ता मॉडल के साथ स्निपेट मॉडल की जगह को छोड़कर। हालांकि, जब मैं एपीआई का परीक्षण करने की कोशिश, मैं कोई लाभ नहीं हुआAttributeError: 'USER_LIST' वस्तु में कोई विशेषता '_ignore_model_permissions'

Traceback (most recent call last): 
    File "/Users/AndyFang/Desktop/doorstep-django/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 115, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 
    File "/Users/AndyFang/Desktop/doorstep-django/venv/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "/Users/AndyFang/Desktop/doorstep-django/venv/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 77, in wrapped_view 
    return view_func(*args, **kwargs) 
    File "/Users/AndyFang/Desktop/doorstep-django/venv/lib/python2.7/site-packages/rest_framework/views.py", line 326, in dispatch 
    response = self.handle_exception(exc) 
    File "/Users/AndyFang/Desktop/doorstep-django/venv/lib/python2.7/site-packages/rest_framework/views.py", line 314, in dispatch 
    self.initial(request, *args, **kwargs) 
    File "/Users/AndyFang/Desktop/doorstep-django/venv/lib/python2.7/site-packages/rest_framework/views.py", line 235, in initial 
    self.check_permissions(request) 
    File "/Users/AndyFang/Desktop/doorstep-django/venv/lib/python2.7/site-packages/rest_framework/views.py", line 192, in check_permissions 
    if not permission.has_permission(request, self): 
    File "/Users/AndyFang/Desktop/doorstep-django/venv/lib/python2.7/site-packages/rest_framework/permissions.py", line 131, in has_permission 
    if model_cls is None and getattr(view, '_ignore_model_permissions'): 
AttributeError: 'user_list' object has no attribute '_ignore_model_permissions' 

मैं इसे ठीक करने के लिए विभिन्न चीजों (जैसे प्रारूप सुविधा आदि को अक्षम करने, csrf_exmept टोकन जोड़ने, के रूप में) की कोशिश की है सब हो रहा है। नीचे दिए गए कोड मैंने लिखा है:

serializers.py

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('id', 'email', 'phone_number', 'first_name', 'last_name') 

views.py

@api_view(['GET', 'POST']) 
def user_list(request, format=None): 
    """ 
    List all users, or create a new user. 
    """ 
    if request.method == 'GET': 
    users = User.objects.all() 
    serializer = UserSerializer(users, many=True) 
    return Response(serializer.data) 

    elif request.method == 'POST': 
    serializer = UserSerializer(data=request.DATA) 
    if serializer.is_valid(): 
     serializer.save() 
     return Response(serializer.data, status=status.HTTP_201_CREATED) 
    else: 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 


@api_view(['GET', 'PUT', 'DELETE']) 
def user_detail(request, pk, format=None): 
    """ 
    Retrieve, update or delete a user instance. 
    """    
    try: 
    user = User.objects.get(pk=pk) 
    except User.DoesNotExist: 
    return Response(status=status.HTTP_404_NOT_FOUND) 

    if request.method == 'GET': 
    serializer = UserSerializer(user) 
    return Response(serializer.data) 

    elif request.method == 'PUT': 
    serializer = UserSerializer(user, data=request.DATA) 
    if serializer.is_valid(): 
     serializer.save() 
     return Response(serializer.data) 
    else: 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

    elif request.method == 'DELETE': 
    user.delete() 
    return Response(status=status.HTTP_204_NO_CONTENT) 

urls.py

उत्तर

8

एक बग का एक सा है कि वहां, विशेषताइंटर को वहां नहीं उठाया जाना चाहिए - मैंने अभी तय कर लिया है अब मास्टर में।

इसके बजाय जब आप गुरु के खिलाफ चलाए आप क्या देखेंगे अब इस दावे त्रुटि है:

Cannot apply DjangoModelPermissions on a view that does not have `.model` or `.queryset` property. 

यहां मुद्दा यह है कि DjangoModelPermissions वर्ग केवल अगर यह निर्धारित करने का एक तरीका है जो मॉडल अनुमतियाँ हैं काम कर सकते हैं है दृश्य के लिए आवश्यक है। यदि आप उस अनुमति श्रेणी का उपयोग करना चाहते हैं, तो आपको कक्षा के विचारों के रूप में अपने विचार दोबारा लिखना होगा, और सुनिश्चित करें कि उनके पास model विशेषता उचित रूप से सेट है।

ध्यान दें कि सिर्फ इसलिए कि आप उन्हें क्लास-आधारित विचारों के रूप में फिर से लिखते हैं, इसका मतलब यह नहीं है कि आपको जेनेरिक क्लास आधारित विचारों का उपयोग करने की आवश्यकता है, फिर भी आप वर्तमान में स्पष्ट दृश्य तर्क रख सकते हैं। कुछ इस तरह:

class UserListView(views.APIView): 
    queryset = User.objects.all() 

    def get(self, request, format=None): 
     users = self.queryset 
     serializer = UserSerializer(users, many=True) 
     return Response(serializer.data) 

    def post(self, request, format=None):  
     serializer = UserSerializer(data=request.DATA) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     else: 
      return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

class UserDetailView(views.APIView): 
    queryset = User.objects.all() 

    def get_object(self, pk) 
     try: 
      return self.queryset.get(pk=pk) 
     except User.DoesNotExist: 
      raise Http404 

    def get(self, request, pk, format=None): 
     user = self.get_object(pk) 
     serializer = UserSerializer(user) 
     return Response(serializer.data) 

    def put(self, request, pk, format=None): 
     user = self.get_object(pk) 
     serializer = UserSerializer(user, data=request.DATA) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data) 
     else: 
      return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

    def delete(self, request, pk, format=None): 
     user = self.get_object(pk) 
     user.delete() 
     return Response(status=status.HTTP_204_NO_CONTENT) 

नोट दोनों ही मामलों में queryset का उपयोग का मतलब DjangoModelPermissions अब इन विचारों को लागू किया जा करने के लिए सक्षम हो जाएगा।

5

आप शायद अपनी सेटिंग में एक डिफ़ॉल्ट अनुमति वर्ग के रूप में DjangoModelPermissions या इसी तरह के सेट है। की तरह कुछ:

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly', 
    ) 
} 

हो जाएगा ताकि डिफ़ॉल्ट चेक द्वारा एक उपयोगकर्ता मॉडल आपके विचार पर आधारित है पर अनुमतियों है या नहीं। यदि आप देखते हैं कि उस पर मॉडल सेट नहीं है, तो यह अनुमतियों को नहीं ढूंढ सकता है। तो आपको दृश्य पर मॉडल सेट करने की जरूरत है।यह जहाँ तक है के रूप में मैं एक वर्ग आधारित APIView में ही संभव देख सकते हैं:

from .models import MyModel 

class MyView(APIView): 

    model = MyModel 

    def get(self, request, pk): 
     # ... 

मामले में आपके विचार एक Django मॉडल पर आधारित नहीं है, आप या तो अपने REST_FRAMEWORK सेटिंग से ऐसा डिफ़ॉल्ट वर्ग निकाल सकते हैं या सेट एक आपके विचार पर कस्टम अनुमति वर्ग, जैसे:

from rest_framework import permissions 

class MyView(APIView) 

    permission_classes = (permissions.IsAuthenticated,) 

    def get(self, request, pk): 
     # ... 

या के रूप में एक समारोह के आधार पर ध्यान में रखते हुए:

from rest_framework import permissions 

@api_view(['GET', 'POST']) 
@permission_classes((permissions.IsAuthenticated,)) 
def my_view(request) 
    # ... 

अधिक जानकारी के लिए अनुमतियां दिखाईके बारे में 210

0

पल में बाकी फ्रेमवर्क ट्यूटोरियल भी करना, मुझे विचारों को फिर से लिखने के बजाय, जैसा कि मैं बहुत नौसिखिया हूं, मैंने नीचे दिए गए ढांचे के लिए मेरी सेटिंग्स.py में अनुमति सेटिंग्स को बदल दिया है और सभी मेरे जैसा अच्छा लगता है अब मैं मॉडल से अनुमति नहीं ले रहा हूं।

'DEFAULT_PERMISSION_CLASSES': [ 
     'rest_framework.permissions.IsAuthenticated', 
    ] 
+0

बस इस के साथ एक समस्या की खोज की - ब्राउज़र में अच्छा काम करता है के रूप में मैं कर रहा हूँ प्रमाणीकृत, तथापि कर्ल का उपयोग कर, मैं इतना शिकायत नहीं कर रहा हूँ कोई प्रमाणीकरण देखते हैं कि विवरण :( – purchas

2

यह सबसे सरल है:

@api_view(['POST']) 
@permission_classes((permissions.AllowAny,)) 
def my_view(request) 
# ... 
संबंधित मुद्दे