Django rest framework(2)
Django rest framework(1)에서 django rest framework를 이용해 CRUD를 해보았습니다.
그 과정에 사용자 인증을 통해 인증된 사용자에 한해서만 사용 가능하도록 해보겠습니다.
Authentication & Permissions
Models
project/app/models.py
의 Memo
클래스에 owner 필드를 추가합니다.
1
2
3
4
class Memo(models.Model):
...
owner = models.ForeignKey('auth.User', related_name='memo', on_delete=models.CASCADE)
...
수정을 한 후에는 db.sqlite3
파일과 migrations
디렉토리를 제거해준 후 다시 migrate합니다.
Serializers
MemoSerializer
에 owner를 추가하고 UserSerializer
클래스를 만들어줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
from django.contrib.auth.models import User
class MemoSerializer(serializers.HyperlinkedModelSerializer):
...
owner = serializers.ReadOnlyField(source='owner.username')
...
class Meta:
model = Memo
fields = ('id', 'title', 'content', 'owner', 'created')
class UserSerializer(serializers.ModelSerializer):
memo = serializers.PrimaryKeyRelatedField(many=True, queryset=Memo.objects.all())
class Meta:
model = User
fields = ('id', 'username', 'memo')
Views
MemoList
클래스에 owner
필드를 저장할 perform_create
함수를 작성하고 권한을 관리해 줄 permission_classes
속성을 지정합니다.
IsOwnerOrReadOnly
는 아래에 추가적으로 만들어 줄 클래스입니다.
추가적으로 UserList
와 UserDetail
클래스를 만들어줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
from app.serializers import UserSerializer
from django.contrib.auth.models import User
from rest_framework import permissions
from app.permissions import IsOwnerOrReadOnly
class MemoList(generics.ListCreateAPIView):
queryset = Memo.objects.all()
serializer_class = MemoSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class MemoDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Memo.objects.all()
serializer_class = MemoSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly)
class UserList(generics.GenericAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetail(generics.GenericAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
URLs
app의 urls.py
에 url 패턴을 추가합니다.
1
2
3
4
5
urlpatterns = [
...
url(r'^users$', views.UserList.as_view()),
url(r'^users/(?P<pk>[0-9]+)$', views.UserDetail.as_view()),
]
project의 urls.py
에 아래와 같이 추가해주면 브라우저에서 “Log in” 버튼이 활성화 됩니다.
1
2
3
4
urlpatterns = [
...
url(r'^api-auth/$', include('rest_framework.urls')),
]
Permissions
project/app/permissions.py
를 추가하고 작성자를 확인하는 클래스를 만듭니다.
1
2
3
4
5
6
7
from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj.owner == request.user
Create users
아래의 명령어를 이용해 사용자를 만들어주세요!
Execution
댓글남기기