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. ios真机测试问题

    前端页面在ios端真机测试出现的问题 由于苹果对于性能的要求是近乎苛刻,如果没有可点的特性的元素系统默认不会给它响应事件,因此真机测试时容易添加不上绑定事件 解决办法: 1.通过js判断当前是否为苹果 ...

  2. Three.js 前言

    -----------------------------------本文非技术文章,着急开发的小伙伴请绕道----------------------------------------- 最近公司 ...

  3. SpringBoot + Spring MVC国际化使用示例

    项目中需要显示中英文两种语言,所以需要对显示的内容进行国际化,如下是一个示例程序. 程序文件结构,如下图,后面详细列出各文件的代码. 1. 编写maven的pom.xml文件,如下: <proj ...

  4. Unity5 2D Animation

    1. 所有的动画保存在 .anim 后缀的文件里.2. Animation 标签用来编辑一堆 Animation clip,每一个clip是一个图片序列,也就是动图.动画的最小控制单位就是clip,一 ...

  5. DP Intro - poj 2342 Anniversary party

    今天开始做老师给的专辑,打开DP专辑 A题 Rebuilding Roads 直接不会了,发现是树形DP,百度了下了该题,看了老半天看不懂,想死的冲动都有了~~~~ 最后百度了下,树形DP入门,找到了 ...

  6. putty访问虚拟机

    从宿主机中用putty连接虚拟机中的Ubuntu Server. putty默认使用ssh方式连接,这需要在Ubuntu Server中安装ssh服务.使用命令sudo apt-get install ...

  7. 我的Python升级打怪之路【六】:面向对象(二)

    面向对象的一些相关知识点 一.isinstance(obj,cls) 检查实例obj是否是类cls的对象 class Foo(object): pass obj = Foo() isinstance( ...

  8. 九度oj 1002 Grading 2011年浙江大学计算机及软件工程研究生机试真题

    #include<iostream> #include<queue> #include<cstdio> #include<cstring> #inclu ...

  9. Memcached 查询stats及各项状态解释

    一.两个最常用状态查询(掌握第一个就完全OK了) 1)查看状态:printf “stats\r\n” |nc 127.0.0.1 11211      2)模拟top命令查看状态:watch “ech ...

  10. ComboBox ItemHeight 再高一点

    public static void BindData(this ComboBox box, List<KeyValuePair<long, string>> data) { ...