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
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)
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 ]
测试
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