我正在开发一个我必须展示的网站
1)具有html内容类型的网页
2)还提供api json端点来开发网络或移动应用程序。
目前,对于html网页,我使用了djangos视图和表单。
对于api我正在使用Django休息框架视图和序列化器。
但是经过DRF后我发现DRF可以呈现多种格式。
HTML&表单REST框架适用于返回两种API样式 响应和常规HTML页面。另外,可以使用序列化器 作为HTML表单并在模板中呈现。
http://www.django-rest-framework.org/topics/html-and-forms/
您可以使用TemplateHTMLRenderer返回常规HTML页面 使用REST框架,或从一个返回HTML和API响应 单一终点。
http://www.django-rest-framework.org/api-guide/renderers/#templatehtmlrenderer
由于有一个视图(一个端点),我可以同时获得html和api,这不会减少我的编码工作。
我打算只使用DRF视图和搜索器代替DJango表单和任何类型内容的视图。
如果我只使用DRF会有什么挫折。
答案 0 :(得分:6)
没有Django就不能使用DRF,因为DRF不是一个自治框架 因此,为了使用DRF,您将基于Django应用程序。因此,使用Django视图的选项取决于您和您想要解决的问题。
通常,仅使用DRF视图和序列化程序没有任何缺点,但正如我所提到的,这取决于手头的问题。有些线程列出了使用DRF原因的一些原因,可以找到here和here。
最后,DRF为您提供了使用选项request.accepted_renderer
的“情境”渲染器的选项(直接来自文档):
在某些情况下,您可能希望视图使用不同的序列化样式,具体取决于接受的媒体类型。如果您需要这样做,您可以访问request.accepted_renderer以确定将用于响应的协商渲染器。
例如:
@api_view(('GET',)) @renderer_classes((TemplateHTMLRenderer, JSONRenderer)) def list_users(request): """ A view that can return JSON or HTML representations of the users in the system. """ queryset = Users.objects.filter(active=True) if request.accepted_renderer.format == 'html': # TemplateHTMLRenderer takes a context dict, # and additionally requires a 'template_name'. # It does not require serialization. data = {'users': queryset} return Response(data, template_name='list_users.html') # JSONRenderer requires serialized data as normal. serializer = UserSerializer(instance=queryset) data = serializer.data return Response(data)
涵盖了问题的第二部分。
答案 1 :(得分:-1)
我想您希望查看自己的API信息,并提供一些可以创建其他对象的表单。为此,您可以使用rest-framework
中的APIView我有一个类似这样的项目:
from rest_framework.views import APIView
from rest_framework.response import Response
class MonitorList(APIView):
''' List all Monitors, or create a new Monitor '''
def get(self, request, format=None):
monitors = Monitor.objects.all()
serializer = MonitorSerializer(monitors, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = MonitorSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class MonitorDetail(APIView):
''' GET, PUT AND DELETE METHODS FOR Monitor '''
def get_object(self, pk):
try:
return Monitor.objects.get(pk=pk)
except Monitor.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
monitor = self.get_object(pk=pk)
serializer = MonitorSerializer(monitor)
return Response(serializer.data)
def put(self, request, pk, format=None):
monitor = self.get_object(pk=pk)
serializer = MonitorSerializer(monitor, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
monitor = self.get_object(pk=pk)
monitor.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
如果你想要创建或编辑某个对象的选项,你应该有post,put甚至补丁方法。可以阅读docs以获取有关DRF视图的更多信息。希望我能帮助你。 :)