2013-06-18 33 views
9

スニペットモデルを独自のカスタムユーザーモデルに置き換える以外は、django RESTフレームワークチュートリアルを実行します。しかし、私はAPIをテストしようとしたとき、私は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

そこに、AttributeErrorを上げるべきではありません - 私はただ修正しましたそれは今マスターの中で。あなたがマスターに対して実行したときに表示されます何を代わりに

は今、このアサーションエラーです:

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

現時点ではフレームワークのチュートリアルをやっていますが、私はかなり初心者だから私の意見を書き直すのではなく、フレームワークのsettings.pyの権限設定を以下に変更しました。もはやモデルからパーミッションを取っていません。

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

ちょうどこれで問題が発見された - しかし、カールを使用して、私は認証済みだとして、ブラウザで素晴らしい作品を、私はそうは認証がないと文句を言いませんよ詳細:( – purchas

2

これが最も簡単です:

@api_view(['POST']) 
@permission_classes((permissions.AllowAny,)) 
def my_view(request) 
# ... 
関連する問題