• 二 .Django---framework框架 配置和序列化


    一.配置参数使用

    https://www.cnblogs.com/pythonywy/p/11448868.html

    二.  序列化

    # 注册drf app
    NSTALLED_APPS = [
        # ...
        'rest_framework',
    ]

    https://www.cnblogs.com/heshun/p/10158695.html      DRF - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件

    https://www.cnblogs.com/yuanchenqi/articles/8719520.html     序列化

    开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。
    我们可以通过声明与Django forms非常相似的序列化器
    (serializers)来实现。 models部分:

    分析源码等

        
       
    (
    1)Django的原生request: 浏览器 ------------- 服务器 "GET url?a=1&b=2 http/1.1 user_agent:Google contentType:urlencoded " "POST url http/1.1 user_agent:Google contentType:urlencoded a=1&b=2" request.body: a=1&b=2 request.POST: if contentType:urlencoded: a=1&b=2----->{"a":1,"b":2} (2)restframework 下的APIView: (3) class PublishSerializers(serializers.Serializer): name=serializers.CharField() email=serializers.CharField() PublishSerializers(queryset,many=true) PublishSerializers(model_obj) 总结: 1 reuqest类----源码 2 restframework 下的APIView--源码 url(r'^books/$', views.BookView.as_view(),name="books")# View下的view books/一旦被访问: view(request) ------APIView: dispatch() 3 def dispatch(): 构建request对象 self.request=Request(request) self.request._request self.request.GET # get self.request.data # POST PUT 分发----if get请求: if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed response = handler(request, *args, **kwargs) # self.get(request, *args, **kwargs) return response 4 序列化类 # from django.core import serializers # ret=serializers.serialize("json",publish_list) restframework下的序列类 BookModelSerializers 将queryset或者model对象序列成一json数据 bs=BookModelSerializers(book_list,many=True,context={'request': request}) bs=BookModelSerializers(book,context={'request': request}) 还可以做校验数据,json-------》queryset/model-->记录 bs=BookModelSerializers(data=request.data) if bs.is_valid(): print(bs.validated_data) bs.save() # 重写create方法 5 操作数据: 以Book表为例 class BookView(APIView): # 查看所有书籍 def get(self,request): book_list=Book.objects.all() bs=BookModelSerializers(book_list,many=True,context={'request': request}) return Response(bs.data) # 添加一本书籍 def post(self,request): # post请求的数据 bs=BookModelSerializers(data=request.data) if bs.is_valid(): print(bs.validated_data) bs.save()# create方法 return Response(bs.data) else: return Response(bs.errors) class BookDetailView(APIView): # 查看一本书籍 def get(self,request,id): book=Book.objects.filter(pk=id).first() bs=BookModelSerializers(book,context={'request': request}) return Response(bs.data) # 更新一本书籍 def put(self,request,id): book=Book.objects.filter(pk=id).first() bs=BookModelSerializers(book,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()

     

    1. 序列化简单使用

    model

    #
    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(auto_now=True) publish=models.ForeignKey("Publish",on_delete=models.CASCADE) # ForeignKey一对多 authors=models.ManyToManyField("Author") # ManyToManyField 多对多 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
    viwes
    from
    django.shortcuts import render,HttpResponse from django.views import View from rest_framework.response import Response from .models import * from rest_framework.views import APIView from rest_framework import serializers import json # 为queryset,mode l对象做序列化 class PublishModelSerializers(serializers.ModelSerializer): class Meta: model=Publish fields="__all__" # 这种 序列化 和 上面序列化相同 只是上面简单 一次性 # class PublishSerializers(serializers.Serializer): # name = serializers.CharField() # email = serializers.CharField() class PublishView(APIView): def get(self,request): # restframework # 取数据 print("request.data", request.data) print("request.data type", type(request.data)) # print(request._request.GET) print(request.GET) publish_list= Publish.objects.all()
    # 序列化 # 方式1: # publish_list=list(Publish.objects.all().values("name","email")) # return Response(publish_list)
                              
            # 方式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))
            # return HttpResponse(temp)
                                                   
            # 方式3:
            # from django.core import serializers
            # ret=serializers.serialize("json",publish_list)
            # return HttpResponse(ret)

    # 序列组件 publish_list = Publish.objects.all() ps = PublishModelSerializers(publish_list, many=True) # many表示多个 model对象 queryset多个 return Response(ps.data)

    print("########################################################################") def post(self, request): # 取数据 # 原生request支持的操作 print("POST",request.POST) print("body",request.body) # print(request) print(type(request)) from django.core.handlers.wsgi import WSGIRequest # 新的request支持的操作 print("request.data",request.data) print("request.data type",type(request.data)) # post请求的数据 ps = PublishModelSerializers(data=request.data) if ps.is_valid(): print(ps.validated_data) ps.save() # create方法 return Response(ps.data) else: return Response(ps.errors)

                

    GET     打印
    request.data {}
    request.data type <class 'dict'>
    <QueryDict: {}> 这是============get哈哈哈
    
    
    PSOST   打印  
    POST <QueryDict: {}> 这是post-------------哈哈哈
    body b'' 原数据
    <class 'rest_framework.request.Request'>
    request.data {}
    request.data type <class 'dict'>
    url
    
       url(r'^publishes/$', views.PublishView.as_view(),name="publish"), #  View:view(request)=====APIView:dispatch()

     

    2. ModelSerializer(get put  del)

    retrieve   get/id/
    
    update   put/id/
    
    destroy   delect/id/
    
    list  get
    
    partial_update   patch
    
    create   post

    ----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 # 删除某本书籍

    # 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(auto_now=True)
        publish=models.ForeignKey("Publish",on_delete=models.CASCADE)      # ForeignKey一对多
        authors=models.ManyToManyField("Author")        # ManyToManyField  多对多
        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
    from django.shortcuts import render,HttpResponse
    from django.views import View
    from rest_framework.response import Response
    from .models import *
    from rest_framework.views import APIView
    from rest_framework import serializers
    import json
    def aa(request):
        return HttpResponse("欢迎啊哈哈哈哈")
    
    
    # 为queryset,mode l对象做序列化    
    class PublishModelSerializers(serializers.ModelSerializer):
        class Meta:
            model=Publish
            fields="__all__"
    
    
    
    class PublishDetailView(APIView):
        def get(self, request, pk):
            publish = Publish.objects.filter(pk=pk).first()
            ps = PublishModelSerializers(publish)
            return Response(ps.data)
    
    
    
        def put(self, request, pk):
            publish = Publish.objects.filter(pk=pk).first()
            ps = PublishModelSerializers(publish, data=request.data)
            if ps.is_valid():
                ps.save()
                return Response(ps.data)
            else:
                return Response(ps.errors)
    
    
    
        def delete(self, request, pk):
            Publish.objects.filter(pk=pk).delete()
            return Response()

          
    
    
    url(r'^publishes/(?P<pk>d+)/$', views.PublishDetailView.as_view(),name="detailpublish"), #  View:view(request)=====APIView:dispatch()

     

    4. 重写save中的create方法

    model 类和上面一样
    from django.shortcuts import render,HttpResponse
    from django.views import View
    from rest_framework.response import Response
    from .models import *
    from rest_framework.views import APIView
    from rest_framework import serializers
    import json
    def aa(request):
        return HttpResponse("欢迎啊哈哈哈哈")
    
    
    class BookModelSerializers(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = "__all__"
    
        # #publish=serializers.CharField(source="publish.pk")
        # publish=serializers.HyperlinkedIdentityField(
        #         view_name="detailpublish",
        #         lookup_field="publish_id",
        #         lookup_url_kwarg="pk"
        # )
    
    class BookView(APIView):
        def get(self,request):
            book_list=Book.objects.all()
            bs=BookModelSerializers(book_list,many=True,context={'request': request})    #  many表示多个 model对象 queryset多个
            return Response(bs.data)
        def post(self,request):
            # post请求的数据
            bs=BookModelSerializers(data=request.data)
            if bs.is_valid():
                print(bs.validated_data)
                bs.save()# create方法
                return Response(bs.data)
            else:
                return Response(bs.errors)
          
      url(r'^books/$', views.BookView.as_view(), name="books"),

     

    5. 单条数据的get和put请求

    model类 和 上面一样
    from django.shortcuts import render,HttpResponse
    from django.views import View
    from rest_framework.response import Response
    from .models import *
    from rest_framework.views import APIView
    from rest_framework import serializers
    import json
    def aa(request):
        return HttpResponse("欢迎啊哈哈哈哈")
    
    
    
    class BookModelSerializers(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = "__all__"
    
    
    class BookDetailView(APIView):
    
        def get(self,request,id):
    
            book=Book.objects.filter(pk=id).first()
            bs=BookModelSerializers(book,context={'request': request})
            return Response(bs.data)
    
        def put(self,request,id):
            book=Book.objects.filter(pk=id).first()
            bs=BookModelSerializers(book,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()

    
    
        url(r'^books/(d+)/$', views.BookDetailView.as_view(), name="detailbook"),
  • 相关阅读:
    codeblocks 配置
    2020-7-28
    echarts markPoint在极坐标散点图中不显示value值
    Oracle cve 2020-14644 分析利用以及回显思路
    Openfire Admin Console SSRF&任意文件读取漏洞 CVE-2019-18394 CVE-2019-18393 poc
    Shiro 回显利用工具(burp
    java反序列化提取payload之Xray高级版的shiro回显poc的提取过程
    CVE-2020-3452 CISCO ASA远程任意文件读取 poc
    记事本陈列-历届数学建模大赛优秀论文(含国赛、美赛、研赛)目录
    懒人必备 |通过爬虫 筛选以及查看CSDN 满足相应积分的资源列表 简单好用
  • 原文地址:https://www.cnblogs.com/lovershowtime/p/11645513.html
Copyright © 2020-2023  润新知