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子應用的對應位置

電商項目(買家/賣家)

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