Django框架(十)--视图类,DRF(restful),接口总结

一、web开发与视图类,restful

(一)视图类

视图:可以被调用的的对象,接收一个请求,返回响应。

之前写的是函数视图。

以类定义的视图,叫做类视图。

函数视图:以函数定义的视图,每个视图处理一个请求,一种类型的请求。代码可读性较差。

类视图:以类定义的视图,定义各种方法分别处理不同请求。

(二)视图类的使用

视图

在这里插入图片描述

路由

在这里插入图片描述

结果–使用postman发送请求,进行验证

在这里插入图片描述

post、put、delete发送请求,有csrf验证

将指定视图避免csrf验证的方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

优化视图–返回统一格式

在这里插入图片描述

1.实现get请求

get:获取商品数据

传id参数时,查询指定id的数据,不传id参数时,查询所有数据

class GoodsView(View):
    def __init__(self):
        super().__init__()
        # 构造一个返回的格式
        self.result = {
            'version':'v1.0',
            'code':200,
            'data':''
        }
        self.obj=Goods
    def get(self,request):
        # 返回商品信息
        id = request.GET.get('id')
        if id:
            goods = self.obj.objects.filter(id=id)
        else:
            goods = self.obj.objects.all()
        data=[]
        for one in goods:
            data.append({
                'goods_number':one.goods_number,
                'goods_name':one.goods_name,
                'goods_price':one.goods_price,
                'goods_count':one.goods_count,
                'goods_location':one.goods_location,
                'goods_safe_date':one.goods_safe_date,
                'goods_pro_time':one.goods_pro_time,
            })
        self.result['data']=data
        return JsonResponse(self.result)

发送请求
在这里插入图片描述
在这里插入图片描述

2.实现post请求

def post(self,request):
    # 用来保存数据
	data = request.POST
	goods = self.obj()
	goods.goods_number=data.get('goods_number')
	goods.goods_name=data.get('goods_name')
    goods.goods_price=data.get('goods_price')
    goods.goods_count=data.get('goods_count')
    goods.goods_location=data.get('goods_location')
    goods.goods_safe_date=data.get('goods_safe_date')
    goods.goods_status=data.get('goods_status')
    goods.save()
    self.result['data']={
        'id':goods.id,
        'data':'保存成功'
    }
	return JsonResponse(self.result)

发送请求
在这里插入图片描述

数据库
在这里插入图片描述

3.实现put请求

import json

转成json对象,序列化
	json.dumps
	json.dump 操作文件  文件->xxx.json  经常配合open使用
反序列化
	json.loads
	json.load 操作文件  xxx.json->文件  经常配合open使用
def put(self,request):
    # 更新数据
    # 更新指定id的商品的名字
    # request.body是一个bytes类型
    # json.loads需要一个string类型 bytes->string decode
    data = json.loads(request.body.decode())
    print(data)
    id=data.get('id')
    goodsname=data.get('goodsname')
    goods=self.obj.objects.get(id=id)
    goods.goods_name=goodsname
    goods.save()
    self.result['data'] = {
        'id':id,
        'data':'商品名称更新成功'
    }
return JsonResponse(self.result)

发送请求
在这里插入图片描述数据库
在这里插入图片描述

4.实现delete请求

def delete(self,request):
    # 获取商品id,将该数据删除
    data = json.loads(request.body.decode())
    id = data.get('id')
    self.obj.objects.filter(id=id).delete()
    self.result['data']={
        'id':id,
        'data':'商品删除成功'
    }
return JsonResponse(self.result)

发送请求
在这里插入图片描述

(三)DRF–Django Restful Framework

pep8:编码规范

restful:一种接口的编写风格,设计风格

讲究资源

DRF就是django提供的一种restful编写风格的接口插件

1.基本使用

安装

pip install djangorestframework
pip install django-filter

在这里插入图片描述
在这里插入图片描述

配置settings.py

django安装的插件是以app的形式存在的
在这里插入图片描述
在这里插入图片描述

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES':[
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]
}

过滤器

在这里插入图片描述

from rest_framework import serializers
from LoginUser.models import *

class GoodsSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:    # 元类
        model = Goods    # 遍历的对象
        fields = [
            'id',
            'goods_number',
            'goods_name',
            'goods_price',
            'goods_count',
            'goods_location',
            'goods_safe_date',
            'goods_status',
            'goods_pro_time',
        ]

class UsersSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:    # 元类
        model = LoginUser    # 遍历的对象
        fields = [
            'email',
            'password',
            'username',
            'phone_number',
            'photo',
            'age',
            'gender',
            'address',
        ]

视图

在这里插入图片描述

路由

在这里插入图片描述

使用

在这里插入图片描述

所有数据
在这里插入图片描述
指定id的数据
在这里插入图片描述

2.添加增删改功能

视图

在这里插入图片描述

postman发送请求

在这里插入图片描述

报错:认证缺失,“未提供身份验证凭据”。

(四)接口总结

1.种类

函数视图,类视图,DRF

2.返回数据类型方式

HttpResponse,JsonResponse,HttpResponseRidirect,render…

DRF提供了增删改查的方法

查(get)
  • 获取单条数据
    • 通过id
    • http://127.0.0.1:8000/API/goods/1/
  • 获取所有数据
    • http://127.0.0.1:8000/API/goods/
增(post)
  • http://127.0.0.1:8000/API/goods/
  • 需要携带参数
删(delete)

http://127.0.0.1:8000/API/goods/

修改(put)

http://127.0.0.1:8000/API/goods/

3.接口的作用

  • 提供数据支持
  • 爬虫
  • ajax动静分离
  • 扩大了数据的可用范围

二、增添个人中心页

视图

@loginVaild
def personal_info(request):
    user_id = request.COOKIES.get('userid')
    user = LoginUser.objects.filter(id=user_id).first()
    if request.method=="POST":
        data = request.POST
        user.phone_number=data.get('phone_number')
        user.age=data.get('age')
        user.gender=data.get('gender')
        user.address=data.get('address')
        user.photo=request.FILES.get('photo')
        user.save()
    return render(request,'personal.html',locals())

路由

在这里插入图片描述

模板

{% extends 'base.html' %}
{% block title %}
  个人中心
{% endblock %}
{% block content %}
  <form action="#" method="post" enctype="multipart/form-data">
  {% csrf_token %}
  <table class="table ">
    <tr>
      <td style="width: 300px;" rowspan="3">
        <img style="width: 100%;" src="/static/{{ user.photo }}" alt=""><br>
        <input type="file" name="photo">
      </td>
      <td>邮箱:</td>
      <td><input type="text" value="{{ user.email }}" disabled></td>
      <td>联系电话:</td>
      <td><input name="phone_number" type="text" value="{{ user.phone_number }}"></td>
    </tr>
    <tr>
      <td>年龄:</td>
      <td><input name="age" type="text" value="{{ user.age }}"></td>
      <td>性别:</td>
      <td><input type="text" name="gender" value="{{ user.gender }}"></td>
    </tr>
    <tr>
      <td>家庭住址:</td>
      <td><input type="text" name="address" value="{{ user.address }}"></td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td colspan="5" style="text-align: center">
        <input type="submit" class="btn btn-primary" value="完善用户信息">
      </td>
    </tr>
  </table>

  </form>
{% endblock %}

三、Django项目结构

一个项目中可能有多个模块,在一个项目中创建多个app进行管理,分别负责各自的功能模块,可移植性比较强,方便管理。

电商项目分两个app进行管理,一个是管理后台(卖家),一个web前端(买家)

(一)创建一个项目Qshop

创建两个app:

一个负责卖家 Saller

一个负责买家 Buyer

配置
在这里插入图片描述
在这里插入图片描述
将之前编写的电商项目的文件,复制到这个新项目的Saller子应用的对应位置

电商项目(买家/卖家)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章