图书管理02 View实现

1.模型models.py

from django.db import models

# Create your models here.
class BookInfo(models.Model):
    title = models.CharField(max_length=20, verbose_name='名称')
    pub_date = models.DateField(verbose_name='发布日期')
    desc = models.TextField('简介')
    read = models.IntegerField(default=0, verbose_name='阅读量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_books04'  # 指明数据库表名
        verbose_name = '图书'  # 在admin站点中显示的名称
        verbose_name_plural = verbose_name  # 显示的复数名称

    def __str__(self):
        """定义每个数据对象的显示信息"""
        return self.title
models.py

2.视图 views.py

from django.http import JsonResponse
from django.views import View
import datetime
from .models import *
import json
import copy


# Create your views here.


# 查询单个
class BookView(View):
    def get(self, request, pk=None):
        if pk:
            try:
                book = BookInfo.objects.get(id=pk)
            except Exception as e:
                return JsonResponse({'code': 999, 'msg': 'pk不存在'})
            book_data = {
                'id': book.id,
                'title': book.title,
                'pub_date': book.pub_date,
                'read': book.read,
                'desc': book.desc
            }
            return JsonResponse(book_data)
        else:
            get_dict = copy.copy(request.GET)
            filter_fields = ('title', 'desc')
            query_set = BookInfo.objects.filter(is_delete=False)
            for k, v in get_dict.items():
                if k in filter_fields:
                    query_set = query_set.filter(**{k: v})
                else:
                    return JsonResponse({'code': 999, 'msg': '不允许使用%s字段过滤' % k})
        book_list = []
        for i in query_set:
            book_data = {
                'id': i.id,
                'title': i.title,
                'pub_date': i.pub_date,
                'read': i.read,
                'desc': i.desc
            }
            book_list.append(book_data)
        return JsonResponse(book_list, safe=False)

    def post(self, request):
        data = json.loads(request.body.decode())
        title = data.get('title', None)
        pub_date = data.get('pub_date', None)
        read = data.get('read', 0)
        desc = data.get('desc', None)
        if all([title, pub_date, desc]):
            pass
        else:
            return JsonResponse({'msg': '参数不足'})
        if str(read).isdigit():
            pass
        else:
            return JsonResponse({'msg': 'read类型不正确'})
        try:
            datetime.datetime.strptime(pub_date, '%Y-%m-%d')
        except Exception as e:
            return JsonResponse({'msg': '日期格式有误,请使用"YYYY-MM-DD"格式'})
        book = BookInfo(
            title=title,
            pub_date=pub_date,
            read=read,
            desc=desc
        )
        book.save()
        return JsonResponse({
            'id': book.id,
            'title': book.title,
            'pub_date': book.pub_date,
            'read': book.read,
            'desc': book.desc
        }, status=201)

    def delete(self, request, pk):
        if pk:
            try:
                book = BookInfo.objects.get(id=pk)
                book.is_delete = True
                book.save()
                return JsonResponse({}, status=204)
            except Exception as e:
                return JsonResponse({'code': 999, 'msg': 'pk不存在'})

    def put(self, request, pk):
        data = json.loads(request.body.decode())
        title = data.get('title', None)
        if pk:
            try:
                book = BookInfo.objects.get(id=pk)
                book.title = title
                book.save()
                book_data = {
                    'id': book.id,
                    'title': book.title,
                    'pub_date': book.pub_date,
                    'read': book.read,
                    'desc': book.desc
                }
                return JsonResponse(book_data)
            except Exception as e:
                return JsonResponse({'code': 999, 'msg': 'pk不存在'})


class BooksView(View):
    def get(self, request):
        queryset = BookInfo.objects.filter(is_delete=True)
        book_list = []
        for i in queryset:
            book_data = {
                'id': i.id,
                'title': i.title,
                'pub_date': i.pub_date,
                'read': i.read,
                'desc': i.desc
            }
            book_list.append(book_data)
        return JsonResponse(book_list, safe=False)
views.py

3.路径 urls.py

from django.urls import path,include
from app04.views import *

urlpatterns = [
    path('books/', BookView.as_view()),  #post
    path('books/is_del/', BooksView.as_view()), # 删除图书
    path('books/<int:pk>/', BookView.as_view()), #get,delete,put
]
urls.py

 

测试

import requests
import json

headers = {'Content-Type': 'application/json;charset=UTF-8'}
data = {"title": "天龙八部", "desc": "武侠小说", "pub_date": "2020-12-12", "read": "100"}
pk = 0


# 创建 天龙八部
def post(url):
    global pk
    try:
        resp = requests.post(url, data=json.dumps(data), headers=headers, timeout=2)
    except requests.exceptions.ConnectTimeout as e:
        raise Exception('post:%s, 请求超时' % url)
    except Exception as e:
        raise Exception('post:%s, 请求失败' % url)
    if resp.status_code == 201:
        pass
    else:
        raise Exception('post:%s,响应码不是201' % url)
    try:
        resp_data = json.loads(resp.text)
    except Exception as e:
        raise Exception('post:%s, 响应体json.loads失败' % url)

    try:
        pk = resp_data['id']
    except Exception as e:
        raise Exception('post:%s, 创建图书没有返回id'%url)
    for k in data:
        try:
            d = resp_data[k]
        except Exception as e:
            raise Exception('post:%s, 没有返回%s键' % (url,k))
        if d == data[k]:
            pass
        else:
            raise Exception('post:%s, %s键,创建数据不正确' % (url,k))


# 查询 天龙八部
def search(url):
    params = {'title': '天龙八部'}
    try:
        resp = requests.get(url, params={'title': '天龙八部'})
    except Exception as e:
        raise Exception('search:%s, 请求失败' % url)

    if resp.status_code == 200:
        pass
    else:
        raise Exception('请求失败, 响应码不是200')

    try:
        resp_data = json.loads(resp.text)
    except Exception as e:
        raise Exception('post:%s, 响应体json.loads失败' % url)

    for r in resp_data:
        try:
            d = r['title']
        except Exception as e:
            raise Exception('没有返回"title"键')

        if d == params['title']:
            pass
        else:
            raise Exception('根据title查询图书,返回值title不正确')


# 查询 天龙八部
def get(url, pk):
    try:
        resp = requests.get(url + str(pk) + '/')
    except Exception as e:
        raise Exception('get_pk:%s, 请求失败' % url)

    if resp.status_code == 200:
        pass
    else:
        raise Exception('请求失败, 响应码不是200')

    try:
        resp_data = json.loads(resp.text)
    except Exception as e:
        raise Exception('返回数据不能解析成json')

    try:
        if resp_data['id'] == pk:
            pass
        else:
            raise Exception('获取单个图书失败')
    except Exception as e:
        raise Exception('id获取失败')


def put(url, pk):
    new_data = {'title': '天龙八部后传'}
    try:
        resp = requests.put(url + str(pk) + '/', data=json.dumps(new_data), headers=headers)
    except Exception as e:
        raise Exception('put:%s, 请求失败' % url)

    if resp.status_code == 200:
        pass
    else:
        raise Exception('请求失败, 响应码不是200')

    try:
        resp_data = json.loads(resp.text)
    except Exception as e:
        raise Exception('返回数据不能解析成json')

    try:
        d = resp_data['title']
    except Exception as e:
        raise Exception('数据没有返回title')

    if d == new_data['title']:
        pass
    else:
        raise Exception('修改title失败')


def delete(url, pk):
    try:
        resp = requests.delete(url + str(pk) + '/')
    except Exception as e:
        raise Exception('delete:%s, 请求失败' % url)

    if resp.status_code == 204:
        pass
    else:
        raise Exception('删除status_code不是204')


if __name__ == '__main__':
    ips = [
        '192.168.0.252', #本机
    ]
    for ip in ips:
        try:
            url = 'http://%s:8000/books/' % ip
            print(url)
            post(url)
            get(url, pk)
            search(url)
            put(url, pk)
            delete(url, pk)
        except Exception as e:
            print(e)
            continue
test2

 

posted @ 2020-12-22 20:27  小虾米爱吃鱼  阅读(103)  评论(0编辑  收藏  举报