from rest_framework.reverse import reverse
from django.http import JsonResponse, HttpResponse, Http404
from django.shortcuts import render
from django.contrib.auth.models import User, Group
from rest_framework.parsers import JSONParser
from django.views.decorators.csrf import csrf_exempt
from rest_framework import viewsets, permissions
from rest_framework.decorators import api_view
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import mixins
from rest_framework import generics
from .models import Article, Company, Stuff
from quickstart.serializers import UserSerializer, GroupSerializer, ArticleSerializer, CompanySerializer,StuffSerializer
# Create your views here.
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated]
class GroupViewSet(viewsets.ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
permission_classes = [permissions.IsAuthenticated]
@csrf_exempt # 如果不用@api_view, 必须加csrf_exempt
#@api_view(['GET', 'POST'])
def article_list(request):
# List all code articles, or create a new article
if request.method == "GET":
qs = Article.objects.all()
serializer = ArticleSerializer(qs, many=True)
print(qs)
print(serializer.data)
return JsonResponse(serializer.data, safe=False)
elif request.method == "POST":
input_data = JSONParser().parse(request)
serializer = ArticleSerializer(data=input_data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=status.HTTP_201_CREATED)
return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# @csrf_exempt
@api_view(['GET', 'PUT', 'DELETE'])
def article_detail(request, pk):
# retrieve , update or delete a row of article model
try:
row = Article.objects.get(pk=pk)
except Article.DoesNotExist:
return HttpResponse(status=404)
if request.method == "GET":
serializer = ArticleSerializer(row)
return JsonResponse(serializer.data)
elif request.method == "PUT":
input_data = JSONParser().parse(request)
serializer = ArticleSerializer(row, data=input_data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data)
return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == "DELETE":
row.delete()
return HttpResponse(status=status.HTTP_204_NO_CONTENT)
# -----------------------------------------------------------
# 用 classed based view 方式重写视图
# -----------------------------------------------------------
class ArticleList(APIView):
"""List all article for GET request, or create a new article for POST request"""
def get(self, request, format=None):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.error, status=status.HTTP_400_BAD_REQUEST)
class ArticleDetail(APIView):
"""for Retrieve, update, delete view"""
def get_object(self, pk):
try:
return Article.objects.get(pk=pk)
except:
raise Http404
# cache this page
@method_decorator(cache_page(60*60*2))
def get(self, request, pk, format=None):
row = self.get_object(pk)
serializer = ArticleSerializer(row)
return Response(serializer.data)
def put(self, request, pk, format=None):
row = self.get_object(pk)
serializer = ArticleSerializer(row, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.error, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
row = self.get_object(pk)
row.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
# -----------------------------------------------------------
# 用 MIXINS 进一步简化 classed based view 编程
# -----------------------------------------------------------
"""
class CompanyList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
queryset = Company.objects.all()
serializer_class = CompanySerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class CompanyDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin,generics.GenericAPIView ):
# 必须有设置属性 queryset 与 serializer_class
queryset = Company.objects.all()
serializer_class = CompanySerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
"""
# -----------------------------------------------------------
# 在Mixins基础上,使用通用视图进一步简化 classed based view 编程
# -----------------------------------------------------------
class CompanyList(generics.ListCreateAPIView):
queryset = Company.objects.all()
serializer_class = CompanySerializer
class CompanyDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Company.objects.all()
serializer_class = CompanySerializer
# List and detail view for Stuff
class StuffList(generics.ListCreateAPIView):
# queryset = Stuff.objects.all()
serializer_class = StuffSerializer
def get_queryset(self):
qs = Stuff.objects.select_related('company')
return qs
class StuffDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Stuff.objects.all()
serializer_class = StuffSerializer
def get_queryset(self):
qs = Stuff.objects.select_related('company')
return qs
# -----------------------------------------------------------
# Creating an endpoint for the root of our API
# -----------------------------------------------------------
@api_view(['GET'])
def api_root(request, format=None):
return Response({
# 'users': reverse('article_list'),
# 'groups': reverse('article_detail'),
})
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
RestTutorial.zip (56个子文件)
RestTutorial
db.sqlite3 160KB
student_rest
__init__.py 0B
tests.py 63B
admin.py 282B
migrations
__init__.py 0B
0001_initial.py 1KB
__pycache__
0001_initial.cpython-39.pyc 1020B
__init__.cpython-39.pyc 173B
serializers.py 206B
apps.py 161B
models.py 756B
urls.py 508B
__pycache__
serializers.cpython-39.pyc 629B
urls.cpython-39.pyc 440B
__init__.cpython-39.pyc 162B
views_cbv.cpython-39.pyc 953B
models.cpython-39.pyc 1KB
views.cpython-39.pyc 2KB
apps.cpython-39.pyc 450B
admin.cpython-39.pyc 543B
views.py 2KB
views_cbv.py 570B
RestTutorial
__init__.py 0B
wsgi.py 417B
urls.py 1KB
settings.py 4KB
__pycache__
urls.cpython-39.pyc 1KB
__init__.cpython-39.pyc 162B
settings.cpython-39.pyc 2KB
wsgi.cpython-39.pyc 575B
asgi.py 417B
quickstart
__init__.py 0B
tests.py 63B
admin.py 668B
migrations
__init__.py 0B
0001_initial.py 822B
0003_auto_20230319_1421.py 1KB
0002_auto_20230319_1214.py 1KB
__pycache__
0001_initial.cpython-39.pyc 883B
0003_auto_20230319_1421.cpython-39.pyc 1KB
__init__.cpython-39.pyc 171B
0002_auto_20230319_1214.cpython-39.pyc 1KB
serializers.py 2KB
apps.py 158B
models.py 2KB
urls.py 696B
__pycache__
serializers.cpython-39.pyc 3KB
urls.cpython-39.pyc 629B
__init__.cpython-39.pyc 160B
models.cpython-39.pyc 3KB
views.cpython-39.pyc 6KB
apps.cpython-39.pyc 445B
admin.cpython-39.pyc 950B
views.py 7KB
manage.py 690B
test
demo-1.html 1KB
共 56 条
- 1
资源评论
__弯弓__
- 粉丝: 8742
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功