前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django_rest框架片段高亮显示实践项目(一)url和view里面的代码的书写

Django_rest框架片段高亮显示实践项目(一)url和view里面的代码的书写

作者头像
一写代码就开心
发布2022-01-21 14:48:53
7030
发布2022-01-21 14:48:53
举报
文章被收录于专栏:java和pythonjava和python

目录

新建项目

在这里插入图片描述
在这里插入图片描述

和helloWord项目一样,就是建项目,搭建Djangorest的项目,现在因为是做代码片段高亮显示的项目,所以,需要一个新表,所以我们需要在model.py里面写一个实体类

创建model,并且生成数据表

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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)

创建序列化文件

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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的路径

代码语言:javascript
复制
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代码的书写(继承)

工作中,有可能用

代码语言:javascript
复制
#  第三级  实现浏览器输入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

工作中,不用这个

代码语言:javascript
复制
#   第四级
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

最常用的

代码语言:javascript
复制
# 继承工具集(还有视图集)  第四级
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里面写

代码语言:javascript
复制
# 进行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里面写

代码语言:javascript
复制
 url(r'^snippets/(?P<pk>[0-9]+)/highlight/$', 
views.SnippetHighlight.as_view(), name='SnippetHighlight'),
在这里插入图片描述
在这里插入图片描述

局部权限控制

在view里面对应的类方法里面写

代码语言:javascript
复制
# 继承工具集(还有视图集)  第四级
class SnippetList(ListCreateAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

    # 访问这个类的   权限的控制
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

    def perform_create(self, serializer):
        serializer.save()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 新建项目
  • 创建model,并且生成数据表
  • 创建序列化文件
  • view里面的代码
    • 第三级url的路径
      • 第三级view代码的书写(继承)
        • 第3.5级的view
          • 第四级的view
            • 页面展示HTML格式的代码
            • 局部权限控制
            相关产品与服务
            文件存储
            文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档