restful协议理解:面向资源开发

restful协议

     ----  一切皆是资源,操作只是请求方式

     ----book表增删改查
/books/ books
/books/add/ addbook
/books/(\d+)/change/ changebook
/books/(\d+)/delete/ delbook ----book表增删改查
/books/ -----get books ----- 返回当前所有数据
/books/ -----post books ----- 返回提交数据 /books/(\d+)-----get bookdetail ----- 返回当前查看的单条数据
/books/(\d+)-----put bookdetail ----- 返回更新数据
/books/(\d+)-----delete bookdetail ----- 返回空 class Books(View):
def get(self,request):
pass # 查看所有书籍 def post(self,request):
pass # 添加书籍 class BooksDetail(View):
def get(self,request,id):
pass # 查看具体书籍 def put(self,request,id):
pass # 更新某本书籍 def delete(self,request,id):
pass # 删除某本书籍

restful协议理解

安装restframework

pip3 install djangorestframework 
Django序列化方式
# 方式1:
# publish_list=list(Publish.objects.all().values("name","email")) # 方式2:
# from django.forms.models import model_to_dict
# publish_list=Publish.objects.all()
# temp=[]
# for obj in publish_list:
# temp.append(model_to_dict(obj)) # 方式3:(使用django框架的serializers方法)
        # from django.core import serializers # ret=serializers.serialize("json",publish_list)       方式4:使用rest_framework进行序列化
        功能1:从querySet--->json
        功能2:从json---->querySet         步骤1:from rest_framework import serializers
        步骤2:用modelserializer(类似modelForm)
          序列化querySet:
              book_list=Book.objects.all()
              bs=BookSerializers(book_list,many=True)
          序列化对象:
            obj=Book.objects.filter(pk=id).first()
            bs=BookSerializers(obj)
           备注:需要继承APIView类才能与rest-framwork序列化类相配合使用

一、初级处理视图方式

urls.py;两个url 一个处理全部数据,一个处理单条数据

   处理全部数据:

    get与post

     处理单条数据

    get、put(更新)与delete

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Books/$', views.Books.as_view(),name='book'),
url(r'^Books_detail/(\d+)/$', views.Book_detail.as_view(),name='Books_detail'),
url(r'^Author/$', views.AuthorView.as_view(),name='Author'),
url(r'^AuthorDetail/(\d+)/$', views.perBookView.as_view(),name='AuthorDetail'), ]

views.py:

from django.shortcuts import render,HttpResponse,redirect
from app01.serilizer import *
from django.views import View
from app01.models import *
from rest_framework.response import Response
from rest_framework import serializers
# Create your views here.
from rest_framework.views import APIView from rest_framework import mixins
from rest_framework import generics

全部视图查看处理类
class Books(APIView):
def get(self,request):
book_list=Book.objects.all()
bs=BookSerializers(book_list,many=True)
return Response(bs.data) def post(self,request):
bs=BookSerializers(data=request.data)
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return Response(bs.errors) 某条数据处理类
class Book_detail(APIView):
def get(self,request,id):
obj=Book.objects.filter(pk=id).first()
bs=BookSerializers(obj)
return Response(bs.data) def put(self,request,id):
obj=Book.objects.filter(pk=id).first()
bs=BookSerializers(obj,data=request.data)
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return Response(bs.errors) def delete(self,request,id):
Book.objects.filter(pk=id).delete()
return Response() class AuthorView(APIView):
def get(self,request):
author_list=Author.objects.all()
bs=Authorserializers(author_list,many=True)
return Response(bs.data) def post(self,request): ps=Authorserializers(data=request.data)
if ps.is_valid():
print(ps.validated_data)
ps.save() # create方法
return Response(ps.data)
else:
return Response(ps.errors) class perBookView(APIView):
#查看一条
def get(self,request,id):
authors_obj=Author.objects.filter(pk=id).first()
aa=Authorserializers(authors_obj)
return Response(aa.data) #更新一条
def put(self,request,id):
obj=Author.objects.filter(pk=id).first()
sobj=Authorserializers(obj,data=request.data)
if sobj.is_valid():
sobj.save()
return Response(sobj.data)
else:
return Response(sobj.errors) #删除一条
def delete(self,request,id):
Author.objects.filter(pk=id).delete()
return Response()

数据库

from django.db import models

# Create your models here.
from django.db import models # Create your models here. class Book(models.Model):
title=models.CharField(max_length=32)
price=models.IntegerField()
pub_date=models.DateField(null=True)
publish=models.ForeignKey("Publish")
authors=models.ManyToManyField("Author")
def __str__(self):
return self.title class Publish(models.Model):
name=models.CharField(max_length=32)
email=models.EmailField()
def __str__(self):
return self.name class Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
def __str__(self):
return self.name

使用rest_framework序列化前转化成类方式

from rest_framework import serializers
from app01.models import *
class Authorserializers(serializers.ModelSerializer):
class Meta:
model=Author
fields="__all__" class BookSerializers(serializers.ModelSerializer):
class Meta:
model=Book
fields='__all__'

二、mixin类处理视图方式

generics.GenericAPIView继承了APIView,扩写的方法有:
处理全部数据:
 get全部: mixins.ListModelMixin,
 post: mixins.CreateModelMixin 处理单条数据:
  get某条:  mixins.RetrieveModelMixin
  put(修改某条):   mixins.UpdateModelMixin
  delete(删除某条): mixins.DestroyModelMixin
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Publishs/$', views.Publishs.as_view()),
url(r'^Publish_detail/(?P<pk>\d+)/$', views.PublishDetail.as_view())

urls.py

from django.db import models

# Create your models here.
from django.db import models # Create your models here. class User(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32) class Token(models.Model):
user=models.OneToOneField("User")
token = models.CharField(max_length=128) def __str__(self):
return self.token class Book(models.Model):
title=models.CharField(max_length=32)
price=models.IntegerField()
pub_date=models.DateField()
publish=models.ForeignKey("Publish")
authors=models.ManyToManyField("Author")
def __str__(self):
return self.title class Publish(models.Model):
name=models.CharField(max_length=32)
email=models.EmailField()
def __str__(self):
return self.name class Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
def __str__(self):
return self.name

models.py

from app01.models import *
from rest_framework import serializers class Publishkserializer(serializers.ModelSerializer):
class Meta:
model=Publish
fields='__all__'
from app01.myserializer import *
# Create your views here.
from rest_framework import mixins
from rest_framework import generics
from django.views import View
from rest_framework.views import APIView
from app01.models import * #1mixin类编写视图--------------------------------- class Publishs(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):#扩写了APIView
#必须是固定死的queryset
queryset = Publish.objects.all()
print('queryset---------------------',queryset)
#必须是serializer_class
serializer_class = Publishkserializer
print(serializer_class, '') def get(self, request, *args, **kwargs):
print('')
return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs) class PublishDetail(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,generics.GenericAPIView):
queryset = Publish.objects.all()
print(queryset,'')
serializer_class = Publishkserializer 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)

views.py

三、基于通用类的处理视图方式

相比mixin视图处理方式

处理全部数据:
  generics.ListCreateAPIView
处理单条:   generics.RetrieveUpdateDestroyAPIView
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^Author/$', views.Authors.as_view()),
url(r'^Author_detail/(?P<pk>\d+)/$', views.AuthorDetail.as_view()), ]

urls.py

#2使用通用的基于类的视图---------------------------------------
from rest_framework import mixins
from rest_framework import generics
from app01.models import *
from app01.myserializer import *
class Authors(generics.ListCreateAPIView): queryset = Author.objects.all()
# print(queryset,'111111111111')
print(queryset,'')
serializer_class = Authorserializer class AuthorDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Author.objects.all()
serializer_class = Authorserializer

views.py

from django.db import models

# Create your models here.
from django.db import models # Create your models here. class User(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32) class Token(models.Model):
user=models.OneToOneField("User")
token = models.CharField(max_length=128) def __str__(self):
return self.token class Book(models.Model):
title=models.CharField(max_length=32)
price=models.IntegerField()
pub_date=models.DateField()
publish=models.ForeignKey("Publish")
authors=models.ManyToManyField("Author")
def __str__(self):
return self.title class Publish(models.Model):
name=models.CharField(max_length=32)
email=models.EmailField()
def __str__(self):
return self.name class Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
def __str__(self):
return self.name

models.py

from app01.models import *
from rest_framework import serializers
class Authorserializer(serializers.ModelSerializer):
class Meta:
model=Author
fields='__all__'

四、viewsets.ModelViewSet

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [ url(r'^Authors/$', views.AuthorsViewSet.as_view({"get": "list", "post": "create"}), name="book_list"),
url(r'^Authors/(?P<pk>\d+)/$', views.AuthorsViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy'
}), name="book_detail"), ]

urls.py

from rest_framework import mixins
from rest_framework import generics
from rest_framework import viewsets
from app01.models import *
from app01.myserializer import *
class AuthorsViewSet(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = Authorserializer

views.py

from django.db import models

# Create your models here.

class User(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32) class Token(models.Model):
user=models.OneToOneField("User")
token = models.CharField(max_length=128) def __str__(self):
return self.token class Book(models.Model):
title=models.CharField(max_length=32)
price=models.IntegerField()
pub_date=models.DateField()
publish=models.ForeignKey("Publish")
authors=models.ManyToManyField("Author")
def __str__(self):
return self.title

models.py

from app01.models import *
from rest_framework import serializers class Publishkserializer(serializers.ModelSerializer):
class Meta:
model=Publish
fields='__all__' class Bookserializer(serializers.ModelSerializer):
class Meta:
model=Book
fields='__all__' class Authorserializer(serializers.ModelSerializer):
class Meta:
model=Author
fields='__all__'

myserializer.py

五注册方式

restful知识点之二restframework视图的更多相关文章

  1. arcgis api 4.x for js 自定义 Draw 绘制手绘面以及手绘线,只针对二维视图(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...

  2. C#开发BIMFACE系列28 服务端API之获取模型数据13:获取三维视点或二维视图列表

    系列目录     [已更新最新开发文章,点击查看详细] 本篇主要介绍如何获取一个模型中包含的三维视点或二维视图列表. 请求地址:GET https://api.bimface.com/data/v2/ ...

  3. java基础知识点补充---二维数组

    #java基础知识点补充---二维数组 首先定义一个二维数组 int[][] ns={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; 实现遍 ...

  4. restful知识点之六rest-framework组件流程图

  5. restful知识点之三restframework认证-->权限-->频率

    认证.权限.频率是层层递进的关系 权限业务时认证+权限 频率业务时:认证+权限+频率 局部认证方式 from django.conf.urls import url,include from djan ...

  6. restframework 视图

    重要知识点 as_view()获取的是view方法名,当url配版成功,执行view方法 一.逻辑封装(mixins, generics) path('author/', views.AuthorVi ...

  7. 前端新人学习笔记-------html/css/js基础知识点(二)

    4月7日学到的知识点:     一:<img src="1.png" alt="美女"/> alt是给图片添加介绍,当图片没加载出来时,会直接显示a ...

  8. Django编写RESTful API(二):请求和响应

    欢迎访问我的个人网站:www.comingnext.cn 前言 在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每一个URL代表着一个资源.当然我 ...

  9. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

随机推荐

  1. SELinux 引起的 Docker 启动失败

    问题描述 Linux OS 版本 CentOS Linux release 7.2.1511 (Core) 启动Docker service docker start 启动失败信息 原因分析 Erro ...

  2. 如何统计Visual Studio Code项目的代码行数

    背景 年底到了,公司一年一度做述职报告的时间又到了,每到此时小伙伴们都想方设法的去做一些代码层面的汇总.在此交给大家个小妙招,走过路过不要错过哈,, 解决方案 使用Visual Studio Code ...

  3. c# 小票打印

    c# 在进行小票打印时大致有三种方法. 1. 使用水晶报表进行打印.可以参考:https://www.cnblogs.com/aitong/p/10717786.html 2. 在 PrintDocu ...

  4. 用js实现匹配文本中的电话号、固定电话号

    思路: 1.用正则取出所有数字串 说起来容易,做起来难,开始只是简单的/D+/,后边发现这样做会将固定电话分成两段数字串,后经百度找到解决办法 /[^0-9/-]/ 意思是非数字不包括-作为分割 2. ...

  5. C#常用的引用

    1.使用ConfigurationManager需要在.net引用中添加System.Configuration引用 2.使用HttpContext需要在.net引用中添加System.Web引用

  6. (转)Linux服务器SNMP常用OID

    原文:https://www.haiyun.me/archives/linux-snmp-oid.html 收集整理一些Linux下snmp常用的OID,用做服务器监控很不错.服务器负载: 1 2 3 ...

  7. TortoiseGit学习系列之Git和TortoiseGit的区别

    不多说,直接上干货! Git和TortoiseGit的区别: TortoiseGit的安装和使用依赖Git.

  8. 【Bigdecimal】

    ---恢复内容开始--- 大位数除法的时候注意1/3问题:异常:[Exception in thread "main" java.lang.ArithmeticException: ...

  9. webpack使用extract-text-webpack-plugin打包时提示错误Use Chunks.groupsIterable and filter by instanceof Entryp

    转自:https://blog.csdn.net/gezilan/article/details/80020417 前提条件: 当前时间是2018年4月20日. webpack的最新版本为是 v4.6 ...

  10. [生活] 日常英语学习笔记-NEVER HAVE I EVER游戏

    逛油管,看视频,学英语. 大家要过周末了说啥 Happy Sunday Have a restful  Sunday 有个空闲的周末 我们正在看电影 We are watching movie it ...