Django REST framework 学习笔记(一)

环境:
IDEA: PyCharm 2017.3.4 (Professional Edition)
Django: 2.2
Python: 3.6
OS: Windows 10

安装模块

pip install django
pip install djangorestframework
pip install pygments     # 实现代码高亮的模块

创建项目

  1. 直接使用 PyCharm 创建 Django 项目,选择虚拟环境:Virtualenv
    在这里插入图片描述
    然后点击 Run manage.py Task , 跳出manage.py命令窗口,输入 startapp snippets 回车
    在这里插入图片描述
    在这里插入图片描述

  2. 也可以使用命令行创建项目,再在 PyCharm 中打开

    django-admin startproject myProject
    cd myProject
    python manage.py startapp snippets
    

注册app

settings.py 文件中添加

INSTALLED_APPS = (
    ...
    'rest_framework',
    'snippets',
)

编写用于数据存储的Model

打开 snippets/models.py 文件,编辑

from django.db import models

from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles

# Create your models here.


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())


class Snippet(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=200, 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)

    class Meta:
        ordering = ('created',)

数据迁移,同步数据库

打开 Run manage.py Task ,输入

makemigrations snippets
migrate

或者命令行

python manage.py makemigrations snippets
python manage.py migrate

创建Serializer类

  • 将代码段实例序列化和反序列化为json,声明与Django表单非常相似的序列化器
  • snippets 目录下创建 serializers.py 文件,并编辑
# _*_ coding: utf-8 _*_

from rest_framework import serializers
from .models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES


class SnippetSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    title = serializers.CharField(required=False, allow_blank=True, max_length=100)
    code = serializers.CharField(style={'base_template': 'textarea.html'})
    linenos = serializers.BooleanField(required=False)
    language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
    style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')

    def create(self, validated_data):
        return Snippet.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.title = validated_data.get('title', instance.title)
        instance.code = validated_data.get('code', instance.code)
        instance.linenos = validated_data.get('linenos', instance.linenos)
        instance.language = validated_data.get('language', instance.language)
        instance.style = validated_data.get('style', instance.style)
        instance.save()
        return instance
  • 代码中定义了 序列化 / 反序列化 的字段,create()update()方法定义实例的创建或修改,调用serializer.save()保存

使用ModelSerializers

  • 使用 ModelSerializers 能够使代码更简洁
  • 上一步 serializers.py 文件中的 SnippetSerializer 类继承的是 serializers.Serializer
  • 接下来我们让 SnippetSerializer 继承 serializers.ModelSerializer
  • 将上一步的 SnippetSerializer注释
  • 使用下列代码替换 SnippetSerializer 类,达到同样的效果
# 自动确定字段集
# 默认实现 create() 和 update() 方法
class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style')

使用Django shell创建实例

  • PyCharm中打开 Run manage.py Task ,输入
shell
  • 或者命令行:python manage.py shell

输入下列所有命令创建实例:

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser

snippet = Snippet(code='foo = "bar"\n')
snippet.save()

snippet = Snippet(code='print("hello, world")\n')
snippet.save()

创建视图view

  • 使用我们的新建的 Serializer 类编写API视图,一个方法对应一个API
  • 装饰器 csrf_exempt 让我们能够从没有CSRF令牌的客户端POST到此视图
  • 编辑 snippets/views.py文件,并添加以下内容
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from .models import Snippet
from .serializers import SnippetSerializer

# Create your views here.


@csrf_exempt
def snippet_list(request):
    """
    列出所有代码段,或创建新代码段。
    """
    if request.method == 'GET':
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)


@csrf_exempt
def snippet_detail(request, pk):
    """
    检索,更新或删除代码段。
    """
    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        serializer = SnippetSerializer(snippet)
        return JsonResponse(serializer.data)

    elif request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(snippet, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)

    elif request.method == 'DELETE':
        Snippet.delete()
        return HttpResponse(status=204)

配置URL

  • snippets目录下,新建一个urls.py文件,添加以下代码
from django.urls import path
from snippets import views

urlpatterns = [
    path('snippets/', views.snippet_list),
    path('snippets/<int:pk>/', views.snippet_detail),
]

打开 myProject 目录下的 urls.py 文件,添加下列代码

from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    
    path('', include('snippets.urls')),  # 添加
]

访问API

  • 启动运行django
  • 打开浏览器访问:
  1. 获取所有数据:
    http://localhost:8000/snippets/
  2. 获取主键为1的数据:
    http://localhost:8000/snippets/1/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_linbobo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值