python笔记四 REST Framework 实现 restful api

python笔记一 django搭建服务器全栈开发
python笔记二 django自带后台管理系统、模版渲染以及使用mysql数据库
python笔记三 react + django 实现前后端分离
python笔记四 REST Framework 实现 restful api
python笔记五 django headers带jwt实现自动登录,密码加密存储

第一次看到REST Framework的时候一脸懵逼,这是啥。然后在网上查了一下,写了个demo,才知道这货有什么用。

上一篇做了前后端分离,django只负责接口,有一些地方不太友好。
一个是数据,从数据库里取出来的数据是字节数组,而我们需要的是对象,这就需要反序列化,虽然转化之后是对象,但是并不是想要的格式,还需要处理一下。
另一个就是路由,在urls里边写path,对应views的一个函数,看起来没什么问题,但是如果网站对数据操作比较多,比如说有很多个表,我要对每个表的数据进行删除操作,两种方式,一种是写不同的url,对应不同的删除函数,另一种是只有一个url,对应一个函数,传过来的参数带一个字段,根据这个字段判断应该删除哪个表里的数据,这两种方法都不太好。

REST Framework对这两块都做了比较好的处理,当然不只这一点,还有很多功能,暂时还没用到。

一、安装配置

先看一下初始化的项目结构,具体怎么新建项目如果不明白看前几篇笔记。

service
    ├── db.sqlite3
    ├── manage.py
    ├── server
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    └── service
        ├── __init__.py
        ├── __pycache__
        │   ├── __init__.cpython-37.pyc
        │   ├── settings.cpython-37.pyc
        │   └── urls.cpython-37.pyc
        ├── settings.py
        ├── urls.py
        └── wsgi.py

修改models.py

from django.db import models
import uuid

# Create your models here.
class Person(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid1, editable=False, null=False) #如果没有这个字段  会有一个默认的自增id
    name = models.CharField(max_length = 6, null = False)
    age = models.IntegerField()
    time = models.DateTimeField(auto_now = True, null = False)

1、安装

 pip3 install djangorestframework

添加rest_frameworkINSTALLED_APPS

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'server',  
    'rest_framework'
]

server目录下新建一个serializers.py文件

from rest_framework import serializers
from server.models import Person

class PersonSerializer(serializers.ModelSerializer):
    class Meta:
        model = Person
        fields = ('id', 'name', 'age', 'time')

server目录下新建一个urls.py作为路由

from server import views
from server.views import PersonViewSet

urlpatterns = [

]

修改service文件夹下的urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include

urlpatterns = [
    path('admin/', admin.site.urls),
    url('', include('server.urls'))
]

二、实现restful api

两种方式

1、APIView

views.py里新建一个Test的类

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response

# Create your views here.
class Test(APIView):
    def get(self, request):
        a = request.GET['a']
        res = {
            'success': True,
            'data': 'a'
        }
        return Response(res)

添加到server > urls.py

from server import views
from django.conf.urls import url

urlpatterns = [
    url('test/', views.Test.as_view())
]

postman测试一下

image.png

这样就实现了一个接口,如果需要其他类型的请求,只需要在Test类里新建post、put等方法,前端发送请求的url是一样的,不同的请求方式会自动匹配到不同的函数。

2、ViewSets

views.py修改如下

from django.shortcuts import render
from rest_framework.response import Response
from rest_framework import viewsets
from rest_framework.decorators import list_route
from server.serializers import PersonSerializer
from server.models import Person
import json
import uuid

# Create your views here.
class PersonViewSet(viewsets.ModelViewSet):

    @list_route(methods = ['post'])
    def new_person(self, request):
        data = json.loads(request.body)
        data['id'] = uuid.uuid1()
        Person.objects.create(**data)
        res = {
            'success': True,
            'data': data
        }
        return Response(res)

    @list_route(methods = ['get'])
    def all_person(self, request):
        data = PersonSerializer(Person.objects.all(), many = True).data
        res = {
            'success': True,
            'data': data
        }
        return Response(res)

server > urls.py修改如下

from django.conf.urls import url, include
from server.views import PersonViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'', PersonViewSet, base_name="person")

urlpatterns = [
    url('', include(router.urls))
]

postman测试一下
先用post添加一组数据

image.png

然后用get读取
image.png

注意数据格式,并没有做格式化,RESR Framework 已经做好了,可以对比一下之前的笔记看一下。

**mixins类的通用视图

把上边的PersonViewSet类修改如下

from rest_framework import viewsets
from server.serializers import PersonSerializer
from server.models import Person

class PersonViewSet(viewsets.ModelViewSet):
    queryset = Person.objects.all()
    serializer_class = PersonSerializer

保存,然后访问 http://127.0.0.1:8000,你没看错,就这几行代码。
先post一组数据

image.png

再get一个

image.png

什么都没做,只用了两行代码就搞定了,REST Framework已经全都做好了,routerget和自带的list绑定、postcreate绑定。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353