目录
新建项目
和helloWord项目一样,就是建项目,搭建Djangorest的项目,现在因为是做代码片段高亮显示的项目,所以,需要一个新表,所以我们需要在model.py里面写一个实体类
创建model,并且生成数据表
from django.db import models
# Create your models here.
# 以下的都是官网复制过来的
from pygments.lexers import get_all_lexers # 语言库
from pygments.styles import get_all_styles # 风格库
# 将语言库里面的语言 放到数组里面
LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
# 将风格库里面的东西放到数组里面
STYLE_CHOICES = sorted((item, item) for item in get_all_styles())
from pygments.lexers import get_lexer_by_name
from pygments.formatters.html import HtmlFormatter
from pygments import highlight
# 创建代码片段表
class Snippet(models.Model):
created = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=100, blank=True, default='')
code = models.TextField()
linenos = models.BooleanField(default=False) # 是否要开启行号
language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100) # 语言选择
style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100) # 风格选择
owner = models.ForeignKey('auth.User', related_name='snippets', on_delete=models.CASCADE, null=True, blank=True)
highlighted = models.TextField(null=True, blank=True) # 具体的代码片段
class Meta:
# 根据数据创建时间 进行排序
ordering = ('created',)
def save(self, *args, **kwargs):
""" 高亮显示相关 """
lexer = get_lexer_by_name(self.language)
linenos = self.linenos and 'table' or False
options = self.title and {
'title': self.title} or {
}
formatter = HtmlFormatter(style=self.style, linenos=linenos, full=True, **options)
self.highlighted = highlight(self.code, lexer, formatter)
super(Snippet, self).save(*args, **kwargs)
创建序列化文件
from rest_framework import serializers
from snippetsapp.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ('id', 'title', 'code', 'linenos', 'language', 'style', 'owner',)
以后这个文件里面的类 就是继承serializers.ModelSerializer,就是这个,一定要记住
view里面的代码
第三级url的路径
from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns
from snippetsapp import views
urlpatterns = [
url(r'^snippets/$', views.SnippetList.as_view(), name='snippet-list'),
url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view(), name='snippet-detail'),
]
urlpatterns = format_suffix_patterns(urlpatterns)
第三级view代码的书写(继承)
工作中,有可能用
# 第三级 实现浏览器输入json后缀,查询数据的方法是
# 方法名称里面写 format=None ,url里面写 urlpatterns = format_suffix_patterns(urlpatterns)
from snippetsapp.models import Snippet
from snippetsapp.serializers import SnippetSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
class SnippetList(APIView):
""" LC 查询全部数据,和新增 """
def get(self, request, format=None):
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = SnippetSerializer(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 SnippetDetail(APIView):
""" RUD """
def get_object(self, pk):
try:
return Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
snippet = self.get_object(pk)
serializer = SnippetSerializer(snippet)
return Response(serializer.data)
def put(self, request, pk, format=None):
snippet = self.get_object(pk)
serializer = SnippetSerializer(snippet, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
snippet = self.get_object(pk)
snippet.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
第3.5级的view
工作中,不用这个
# 第四级
from snippetsapp.models import Snippet
from snippetsapp.serializers import SnippetSerializer
from rest_framework import mixins
from rest_framework import generics
class SnippetList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
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 SnippetDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
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)
第四级的view
最常用的
# 继承工具集(还有视图集) 第四级
class SnippetList(ListCreateAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
# permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
def perform_create(self, serializer):
serializer.save()
class SnippetDetail(RetrieveUpdateDestroyAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
页面展示HTML格式的代码
我们保存到数据库的代码片段是HTML格式的,我们如何再页面进行展示
view里面写
# 进行HTML格式的展示
from rest_framework import renderers
from rest_framework.response import Response
class SnippetHighlight(GenericAPIView):
queryset = Snippet.objects.all()
# 设置渲染器
renderer_classes = (renderers.StaticHTMLRenderer,)
def get(self,request,*args,**kwargs):
snippets = self.get_object()
return Response(snippets.highlighted)
url里面写
url(r'^snippets/(?P<pk>[0-9]+)/highlight/$',
views.SnippetHighlight.as_view(), name='SnippetHighlight'),
局部权限控制
在view里面对应的类方法里面写
# 继承工具集(还有视图集) 第四级
class SnippetList(ListCreateAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
# 访问这个类的 权限的控制
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
def perform_create(self, serializer):
serializer.save()