Django基础012--接口开发
全局参数(get,post,put,delete)
接口:/api/parameter
GET:获取全局参数的所有数据
POST:创建全局参数
PUT:更新全局参数
DELETE:删除全局参数
1.创建app
python manage.py startapp example
2.models.py
1 from django.db import models
2
3
4 # Create your models here.
5 class BaseModel(models.Model):
6 '''公共字段'''
7 is_delete_choice = (
8 (1, '删除'),
9 (0, '正常')
10 )
11 is_delete = models.SmallIntegerField(choices=is_delete_choice, default=0, verbose_name='是否被删除')
12 create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) # auto_now_add的意思,插入数据的时候,自动取当前时间
13 update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True) # 修改数据的时候,时间会自动变
14
15 class Meta:
16 abstract = True # 只是用来继承的,不会创建这个表
17
18
19 #全局参数model
20 class Parameter(BaseModel):
21 name = models.CharField(verbose_name='参数名',max_length=200,unique=True)
22 desc = models.CharField(verbose_name='描述', max_length=200)
23 value = models.CharField(verbose_name='参数值', max_length=200)
24
25 def __str__(self):
26 return self.name
27
28 class Meta:
29 db_table = 'parameter'
30 verbose_name = '全局参数信息表'
31 verbose_name_plural = verbose_name
32 #最后创建的在最上面
33 ordering = ['-id']#根据id降序排序
创建表,执行以下命令
python manage.py makemigrations example --指定app生成表的初始化文件
python manage.py migrate example --指定app创建表
3.example/urls.py
1 from django.urls import path
2 from .views import f_parameter,Parameter,SParameter
3
4 urlpatterns = [
5 # FBV
6 path('parameter',f_parameter),
7 #CBV
8 path('c_parameter',Parameter.as_view()),
9 #简化代码
10 path('s_parameter',SParameter.as_view()),
4.项目的urls.py
1 from django.contrib import admin
2 from django.urls import path,include
3 #引入example中的urls
4 from example import urls
5
6 urlpatterns = [
7 path('admin/', admin.site.urls),
8 #include是引入其他app的urls,每个请求都要加上api/
9 path('api/',include(urls)),
10 ]
5.views.py
5.1 FBV模式 func base view
1 # FBV func base view
2 #用函数实现的view
3 def f_parameter(request):
4 data = {'name':'zzl','age':18}
5 if request.method == 'GET':
6 page = request.GET.get('page')#获取前台返回的第几页数据
7 qs = models.Parameter.objects.filter(is_delete=0)#查询出未删除的参数
8 page_obj = Paginator(qs,5)
9 page_data = page_obj.get_page(page)#获取分页的数据
10 data_list = []
11 for data in page_data:
12 #model_to_dict(data,exclude=['is_delete'])
13 # fields:包含哪些字段,
14 # exclude:排除哪些字段
15 # django自带model_to_dict 不处理时间,用自己重写的model_to_dict
16 data_list.append(model_to_dict(data,exclude=['is_delete']))#将qs转成dict并放入list中
17 return JsonResponse({'msg':0,'data':data_list})
18 elif request.method == 'POST':
19 form_obj = forms.ParameterForm(request.POST)
20 f = form_obj.is_valid()
21 if f:
22 models.Parameter.objects.create(**form_obj.cleaned_data)#插入数据
23 return JsonResponse({'code':200,'msg':'成功'})
24 else:
25 return JsonResponse({'code':500,'msg':form_obj.errors.get_json_data()})
26 elif request.method == 'PUT':
27 #django并没有处理PUT的数据 request.PUT
28 #实际put传过来的数据在request.body里
29 #request.body的数据不可用,要导入from django.http import QueryDict,来处理数据
30 #更新数据,需要告知,要更新哪条数据
31 put_data = QueryDict(request.body)
32 print('put_data',put_data)
33
34 p_id = put_data.get('id')#获取前端传过来的数据的id
35 print('p_id',p_id)
36 p_data = models.Parameter.objects.get(id=p_id)
37
38 #参数1是前端传过来的,参数2是数据库中获取的
39 form_obj = forms.ParameterForm(put_data,instance=p_data)
40
41 if form_obj.is_valid():
42 form_obj.save()#如果数据校验通过,就通过form_obj.save方法来更新数据
43 return JsonResponse({'code': 200, 'msg': '成功'})
44 else:
45 return JsonResponse({'code': 500, 'msg': form_obj.errors.get_json_data()})
46 elif request.method == 'DELETE':
47 #删除要先确定是删除哪条数据,需要获取id
48 #删除有1,逻辑删除 2,物理删除
49 #1,逻辑删除:只是通过改变某个字段的状态,重要的数据,有可能在未来通过状态再改回来
50 #2,物理删除,数据不重要,直接delete掉
51 p_id = request.GET.get('id')
52 print(p_id)
53 #逻辑删除
54 #models.Parameter.objects.filter(id=p_id).update(is_delete = 1) #这种更新方式不会触发update_time更新
55 # p_obj = models.Parameter.objects.filter(id=p_id).first()
56 # print(p_obj)
57 # p_obj.is_delete = 1
58 # p_obj.save()#这种方式可以触发update_time更新
59
60 #物理删除
61 models.Parameter.objects.filter(id=p_id).delete()#删除数据
62
63 return JsonResponse({'msg':'delete'})
64 else:
65 return JsonResponse({'msg':'error'})
5.2 CBV模式 class base view
1 #CBV class base view
2 #面向对象的语言,通过class,可以用到继承 多继承 面向对象
3 class Parameter(View):
4 def get(self,request):
5 page = request.GET.get('page') # 获取前台返回的第几页数据
6 qs = models.Parameter.objects.filter(is_delete=0) # 查询出未删除的参数
7 page_obj = Paginator(qs, 5)
8 page_data = page_obj.get_page(page) # 获取分页的数据
9 data_list = []
10 for data in page_data:
11 # model_to_dict(data,exclude=['is_delete'])
12 # fields:包含哪些字段,
13 # exclude:排除哪些字段
14 # django自带model_to_dict 不处理时间,用自己重写的model_to_dict
15 data_list.append(model_to_dict(data, exclude=['is_delete'])) # 将qs转成dict并放入list中
16 return JsonResponse({'msg': 0, 'data': data_list})
17
18 def post(self,request):
19 form_obj = forms.ParameterForm(request.POST)
20 f = form_obj.is_valid()
21 if f:
22 models.Parameter.objects.create(**form_obj.cleaned_data) # 插入数据
23 return JsonResponse({'code': 200, 'msg': '成功'})
24 else:
25 return JsonResponse({'code': 500, 'msg': form_obj.errors.get_json_data()})
26
27 def put(self,request):
28 # django并没有处理PUT的数据 request.PUT
29 # 实际put传过来的数据在request.body里
30 # request.body的数据不可用,要导入from django.http import QueryDict,来处理数据
31 # 更新数据,需要告知,要更新哪条数据
32 put_data = QueryDict(request.body)
33 print('put_data', put_data)
34
35 p_id = put_data.get('id') # 获取前端传过来的数据的id
36 print('p_id', p_id)
37 p_data = models.Parameter.objects.get(id=p_id)
38
39 # 参数1是前端传过来的,参数2是数据库中获取的
40 form_obj = forms.ParameterForm(put_data, instance=p_data)
41
42 if form_obj.is_valid():
43 form_obj.save() # 如果数据校验通过,就通过form_obj.save方法来更新数据
44 return JsonResponse({'code': 200, 'msg': '成功'})
45 else:
46 return JsonResponse({'code': 500, 'msg': form_obj.errors.get_json_data()})
47
48 def delete(self,request):
49 # 删除要先确定是删除哪条数据,需要获取id
50 # 删除有1,逻辑删除 2,物理删除
51 # 1,逻辑删除:只是通过改变某个字段的状态,重要的数据,有可能在未来通过状态再改回来
52 # 2,物理删除,数据不重要,直接delete掉
53 p_id = request.GET.get('id')
54 print(p_id)
55 # 逻辑删除
56 # models.Parameter.objects.filter(id=p_id).update(is_delete = 1) #这种更新方式不会触发update_time更新
57 # p_obj = models.Parameter.objects.filter(id=p_id).first()
58 # print(p_obj)
59 # p_obj.is_delete = 1
60 # p_obj.save()#这种方式可以触发update_time更新
61
62 # 物理删除
63 models.Parameter.objects.filter(id=p_id).delete() # 删除数据
64
65 return JsonResponse({'msg': 'delete'})
5.3 CBV模式 代码优化
5.3.1 custom_view.py
1 #重写model_to_dict
2 import datetime
3 from itertools import chain
4
5 from django.core.paginator import Paginator
6 from django.db.models import Model, Q
7 from django.forms import BaseForm
8 from django.http import JsonResponse, QueryDict
9 from django.views import View
10 from .custom_response import NbResponse
11
12 from example import models
13
14
15 def model_to_dict(instance, fields=None, exclude=None):
16 opts = instance._meta
17 data = {}
18 for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
19 if fields and f.name not in fields:
20 continue
21 if exclude and f.name in exclude:
22 continue
23 value = f.value_from_object(instance)
24 if isinstance(value, datetime.datetime):
25 value = value.strftime('%Y-%m-%d %H:%M:%S')
26 if isinstance(value, datetime.date):
27 value = value.strftime('%Y-%m-%d')
28 data[f.name] = value
29 return data
30
31 class BaseView(View):
32 search_fields = []#定义需要模糊搜素的字段
33 filter_fields = []#定义需要搜索的字段
34 model_class = None
35 fields = [] #指定返回的字段
36 exclude_fields = [] #指定返回时过滤的字段
37 form_class = None
38
39 @property#修饰方法,使方法可以像属性一样访问
40 def model(self):
41 #issubclass 参数1是否为参数2的子类
42 if self.model_class and issubclass(self.model_class,Model):
43 return self.model_class
44 raise Exception('未定义model_class')
45
46 @property # 修饰方法,使方法可以像属性一样访问
47 def form(self):
48 # issubclass 参数1是否为参数2的子类
49 if self.form_class and issubclass(self.form_class, BaseForm):
50 return self.form_class
51 raise Exception('未定义form_class')
52
53 def get_filter_dict(self):
54 filter_dict = {}
55 for field in self.filter_fields:
56 filter_value = self.request.GET.get(field)#获取前端传过来的值
57 if filter_value:
58 filter_dict[field] = filter_value
59 return filter_dict
60
61 #只支持一个字段的模糊查询
62 def get_search_dict(self):
63 search_dict = {}
64 value = self.request.GET.get('search')#获取前台传过来的字段
65 if value:
66 search_dict = {'%s__contains'%self.search_fields[0] : value}
67 print(search_dict)
68 return search_dict
69
70 #支持多个字段的模糊查询
71 def get_search_dict_or(self):
72 value = self.request.GET.get('search')
73 q = Q()
74 if value:
75 for field in self.search_fields:
76 d = {'%s__contains'%field : value}
77 q = Q(**d) | q
78 return q
79
80
81 class GetView(BaseView):
82 def get(self,request):
83 page = request.GET.get('page') # 获取前台返回的第几页数据
84 filter_dict = self.get_filter_dict()#获取需要搜索的字典
85 # search_dict = self.get_search_dict()#获取需要模糊查询的字典
86 # qs = self.model.objects.filter(is_delete=0).filter(**filter_dict).filter(**search_dict) # 查询出未删除的参数
87 search_q = self.get_search_dict_or()#获取需要模糊查询的q
88 qs = self.model.objects.filter(is_delete=0).filter(**filter_dict).filter(search_q) # 查询出未删除的参数
89 page_obj = Paginator(qs, 5)
90 page_data = page_obj.get_page(page) # 获取分页的数据
91 data_list = []
92 for data in page_data:
93 # model_to_dict(data,exclude=['is_delete'])
94 # fields:包含哪些字段,
95 # exclude:排除哪些字段
96 # django自带model_to_dict 不处理时间,用自己重写的model_to_dict
97 data_list.append(model_to_dict(data, fields=self.fields,exclude=self.exclude_fields)) # 将qs转成dict并放入list中
98 return NbResponse(data=data_list)
99
100
101 class PostView(BaseView):
102 def post(self,request):
103 form_obj = self.form(request.POST)
104 f = form_obj.is_valid()
105 if f:
106 self.model.objects.create(**form_obj.cleaned_data) # 插入数据
107 return NbResponse()
108 else:
109 # return JsonResponse({'code': 500, 'msg': form_obj.errors.get_json_data()})
110 return NbResponse(code=500,msg=form_obj.errors.get_json_data())
111
112
113 class PutView(BaseView):
114 def put(self,request):
115 # django并没有处理PUT的数据 request.PUT
116 # 实际put传过来的数据在request.body里
117 # request.body的数据不可用,要导入from django.http import QueryDict,来处理数据
118 # 更新数据,需要告知,要更新哪条数据
119
120 p_id = request.PUT.get('id') # 获取前端传过来的数据的id
121 print('p_id', p_id)
122 p_data = models.Parameter.objects.get(id=p_id)
123
124 # 参数1是前端传过来的,参数2是数据库中获取的
125 form_obj = self.form(request.PUT, instance=p_data)
126
127 if form_obj.is_valid():
128 form_obj.save() # 如果数据校验通过,就通过form_obj.save方法来更新数据
129 return JsonResponse({'code': 200, 'msg': '成功'})
130 else:
131 return JsonResponse({'code': 500, 'msg': form_obj.errors.get_json_data()})
132
133
134 class DeleteView(BaseView):
135 def delete(self,request):
136 # 删除要先确定是删除哪条数据,需要获取id
137 # 删除有1,逻辑删除 2,物理删除
138 # 1,逻辑删除:只是通过改变某个字段的状态,重要的数据,有可能在未来通过状态再改回来
139 # 2,物理删除,数据不重要,直接delete掉
140 p_id = request.GET.get('id')
141 print(p_id)
142 # 逻辑删除
143 # models.Parameter.objects.filter(id=p_id).update(is_delete = 1) #这种更新方式不会触发update_time更新
144 # p_obj = models.Parameter.objects.filter(id=p_id).first()
145 # print(p_obj)
146 # p_obj.is_delete = 1
147 # p_obj.save()#这种方式可以触发update_time更新
148
149 # 物理删除
150 self.model.objects.filter(id=p_id).delete() # 删除数据
151
152 return JsonResponse({'msg': 'delete'})
153
154
155 class NbView(GetView,PostView,PutView,DeleteView):
156 pass
5.3.2 views.py
1 #简化代码--全局参数
2 class SParameter(NbView):
3 # 抽象出不同的地方,让相同的地方复用
4 model_class = models.Parameter#重写了父类的变量
5 #fields = ['name']
6 exclude_fields = ['is_delete']
7 filter_fields = ['value'] #搜索字段
8 search_fields = ['name','desc'] #模糊查询字段
9 form_class = forms.ParameterForm
6.myMiddleWires.py
当请求方式为PUT时,参数是在request.body中获取,且是经过编码后的,获取参数不方便
可以在中间件请求拦截器中,识别请求方式为PUT时,将参数转为request.put
1 from django.middleware.common import MiddlewareMixin
2 from django.http import HttpResponse,QueryDict
3 from sky.settings import DEBUG
4 from example.custom_response import NbResponse
5
6 class PutMethodMiddlerware(MiddlewareMixin):
7 def process_request(self,request):
8 if request.method == 'PUT':
9 request.PUT = QueryDict(request.body)
10
11
12 #出现异常时抛出异常
13 class ExceptionMiddleware(MiddlewareMixin):
14 def process_exception(self,request,exception):
15 if not DEBUG:#上线之后,直接将错误返回,未上线不做拦截,控制台可看
16 #拦截异常的
17 return NbResponse(code=500,msg='系统开小差了,请联系管理员...%s'%exception)
7.custom_response.py
JsonResponse返回json字符串时,如果每次需要返回固定的字段,可以重写JsonResponse里的方法
1 from django.http import JsonResponse
2
3
4 class NbResponse(JsonResponse):
5 def __init__(self,code=200,msg='操作成功',**kwargs):
6 data = {'code':code,'msg':msg}
7 data.update(kwargs)
8 super().__init__(data=data,json_dumps_params={"ensure_ascii": False})
Django基础012--接口开发的更多相关文章
- django 4.get接口开发
根据上一篇文章,有post,那么就有get请求,其余部分不变,就是把post换成get就可以. #views.py from django.http.response import HttpRespo ...
- django 3.post接口开发
如果有了一个项目,还想创建一个项目,那么就是进入项目的路径下,运行命令,比如: cd /Users/newcomer/PycharmProjects/djangoProject python3 man ...
- 【Python】djangorestframework 基于django框架的接口开发
官网:http://www.django-rest-framework.org/#installation 下载:https://pypi.python.org/pypi/djangorestfram ...
- 初识Django —Python API接口编程入门
初识Django —Python API接口编程入门 一.WEB架构的简单介绍 Django是什么? Django是一个开放源代码的Web应用框架,由Python写成.我们的目标是用Python语言, ...
- 微信公众号平台接口开发:基础支持,获取access_token
新建Asp.net MVC 4.0项目 WeChatSubscript是项目UI层 WeChatTools是封装操作访问公众号接口的一些方法类库 获取AccssToken 我们要的得到AccessTo ...
- 微信公众号平台接口开发:基础支持,获取微信服务器IP地址
官方说明 目前看不出来这个接口有哪些具体运用,但是既然有这个接口,那我们就试试能不能用 访问接口 修改WeCharBase.cs,新增以下2个方法 public static string Serve ...
- 接口开发-基于SpringBoot创建基础框架
说到接口开发,能想到的开发语言有很多种,像什么Java啊..NET啊.PHP啊.NodeJS啊,太多可以用.为什么选择Java,究其原因,最后只有一个解释,那就是“学Java的人多,人员招聘范围大,有 ...
- Django Web接口开发
什么是接口 接口一般来讲分为两种: (1)程序内部的接口:方法与方法.模块与模块之间的交互,程序内部抛出的接口,如登录发帖,发帖就必须要登录,如果不登录不能发帖,发帖和登录这两个模块之间就要有交互,就 ...
- python之接口开发基础知识
一.开发接口的作用 1.mock 服务:在别的接口没有开发完成的时候可以模拟一些接口以便测试已经开发完成的接口,例如假的支付接口,模拟支付成功.支付失败. 2.了解接口是如何实现的:数据交互.数据返回 ...
随机推荐
- 26.Qt Quick QML-RotationAnimation、PathAnimation、SmoothedAnimation、Behavior、PauseAnimation、SequentialAnimation和ParallelAnimation
1.RotationAnimationRotationAnimation也是继承于PropertyAnimation组件,但是它有点特殊,它只需要指定taget目标对象,并且不需要指定property ...
- SQL SERVER 实现相同记录为空显示(多列去除重复值,相同的只显示一条数据)
sql server语句查询中碰到结果集有重复数据,需要把这个重复数据汇总成一条显示.其余则正常显示. 使用SQL内置函数 ROW_NUMBER() 加 PARTITION 完成 ROW_NUMBER ...
- Paddle概述
Paddle概述 本文结合深度学习理论与实践,使用百度飞桨平台实现自然语言处理.计算机视觉及个性化推荐等领域的经典应用. 实践部分使用飞桨深度学习开源框架,适配最新的2.0版本,默认使用动态图编程范式 ...
- YOLOv4:目标检测(windows和Linux下Darknet 版本)实施
YOLOv4:目标检测(windows和Linux下Darknet 版本)实施 YOLOv4 - Neural Networks for Object Detection (Windows and L ...
- HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器
HttpServer的特点1.完全采用IOCP模型,实现真正的异步IO,高并发.高可靠: 2.支持4G以上文件下载: 3.支持断点续传: 4.轻量级,体积小,服务器文件仅200多K,无任何依赖库: 5 ...
- 孟老板 BaseAdapter封装 (二) Healer,footer
BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...
- python+selenium基础篇,键盘操作
1.任务要求:打开百度,在百度搜索里面输入python,通过键盘复制python到搜狗搜索,粘贴到搜狗搜索框中 实现代码如下: from selenium import webdriver from ...
- 阿里面试挂了,就因为面试官说我Spring 事务管理(器)不熟练?
前言 事务管理,一个被说烂的也被看烂的话题,还是八股文中的基础股之一.但除了八股文中需要熟读并背诵的那些个传播行为之外,背后的"为什么"和核心原理更为重要. 写这篇文章之前,我 ...
- Vue.js源码解析-Vue初始化流程
目录 前言 1. 初始化流程概述图.代码流程图 1.1 初始化流程概述 1.2 初始化代码执行流程图 2. 初始化相关代码分析 2.1 initGlobalAPI(Vue) 初始化Vue的全局静态AP ...
- .NET Worker Service 作为 Windows 服务运行及优雅退出改进
上一篇文章我们了解了如何为 Worker Service 添加 Serilog 日志记录,今天我接着介绍一下如何将 Worker Service 作为 Windows 服务运行. 我曾经在前面一篇文章 ...