Django Web接口开发
什么是接口
接口一般来讲分为两种:
(1)程序内部的接口:方法与方法、模块与模块之间的交互,程序内部抛出的接口,如登录发帖,发帖就必须要登录,如果不登录不能发帖,发帖和登录这两个模块之间就要有交互,就会抛出一个接口,进行内部系统调用。
(2)系统对外的接口:从别人的网站或服务器上获取资源或信息,对方不会提供数据库共享,只能提供一个写好的方法来获取数据,如购物网站和第三方支付之间,购物网站支付时可选择第三方支付方法,但第三方不会提供自己的数据库给购物网站,只会提供一个接口,供购物网站进行调用。
其中内部接口包括:上层服务与下层服务的接口,同级接口。
接口分类
一般也分为两种:
(1)webService接口:走soap协议通过http传输,请求报文和返回报文都是xml格式的。测试时需要通过工具才能进行调用、测试。少数公司还在使用这种接口,如医院等行业。
(2)http api接口:走http协议,通过路径来区分调用的方法,请求和报文都是key-value形式的,返回报文一般都是json串,有get和post等方法。目前来讲,是最常用的。如RESTful基于http协议的接口。
(3)dubbo接口: 走rpc协议,使用rpc协议进行远程调用,直接使用socket通信。传输效率高,并且可以统计出系统之间的调用关系、调用次数。使用Java语言开发,只能用于Java语言开发的项目间的通信,不具备跨语言,跨平台的特点!
接口返回的数据
接口返回的数据一般都是json字符串,json是一种通用的数据类型,格式为key-value。
前后端区别
前端:客户端。通俗来讲,一般情况下,web端或app端能看见的地方以及一些简单的校验,都属于前端,
并且网站上显示的后台管理不属于后端。
后端:服务器端。web端或app端的系统逻辑、如购物时扣除余额,微博发到哪里等都是由后端实现的。后端开发接口供前端调用,接口所在应用程序(服务)在服务器上跑。
Web接口开发
配置接口路径:
1.在项目文件下urls.py添加接口根路径:
#api
path('api/',include('django_web.urls')),
# url(r'^api/',include(('django_web.urls','django_web'),namespace='django_web')),
2.在app应用django_web下新建urls.py添加具体接口:
from django.urls import path
from django_web.views import views_api #在django_web下创建urls.py,配置具体接口的二级目录 urlpatterns = [
# guest system interface:
# ex : /api/add_event/
path('add_event/',views_api.add_event,name='add_event'),
# ex : /api/get_event_list/
path('get_event_list/',views_api.get_event_list,name='get_event_list'),
# ex: /api/add_guest/
path('add_guest/',views_api.add_guest,name='add_guest'),
# ex: /api/get_guest_list/
path('get_guest_list/',views_api.get_guest_list,name='get_guest_list'),
# ex: /api/user_sign/
path('user_sign/',views_api.user_sign,name='user_sign'),
]
3.在创建接口视图函数view_api.py文件,实现具体接口:
# -*- coding: utf-8 -*-
from django_web.models import Event,Guest
from django.http import JsonResponse
from django.core.exceptions import ValidationError,ObjectDoesNotExist
from django.db.utils import IntegrityError
import json
from django.core import serializers
import time #JsonResponse 默认传入参数是字典格式,如果不是,则报错。 #添加发布会接口
def add_event(request):
#POST请求
eid = request.POST.get('eid','')
name = request.POST.get('name','')
limit = request.POST.get('limit','')
status = request.POST.get('status','')
address = request.POST.get('address','')
start_time = request.POST.get('start_time','') if eid == '' or name == '' or limit == '' or address == '' or start_time == '':
#ensure_ascii 禁用ascii码
return JsonResponse({'status':10021,'message':'参数错误'},json_dumps_params={'ensure_ascii':False}) result = Event.objects.filter(id=eid)
if result:
return JsonResponse({'status':10022,'message':'发布会id已存在'},json_dumps_params={'ensure_ascii':False}) result = Event.objects.filter(name=name)
if result:
return JsonResponse({'status':10023,'message':'发布会名称已存在'},json_dumps_params={'ensure_ascii':False}) if status == '':
status = 1 try:
Event.objects.create(id=eid,name=name,limit=limit,status=int(status),address=address,start_time=start_time)
except ValidationError:
error = '开始日期格式错误,必须是:YYYY-MM-DD HH:MM:SS'
return JsonResponse({'status':10024,'message':error})
return JsonResponse({'status':200,'message':'添加成功'}) # 发布会查询接口
def get_event_list(request):
# GET请求
eid = request.GET.get('eid','')
name = request.GET.get('name','')
if eid == '' and name == '':
return JsonResponse({'status':10021,'message':'参数错误'})
if eid != '':
event = {}
# 方法一:
# filter返回由对象组成的列表,特点:返回对象列表不存在,不报错,[]. # if result.exists():
# print("查询的发布会id是:%s"%result[0].id)
# print(type(result))
# # 序列化对象,转成类型字符串
# datas = serializers.serialize('json',result)
# # 字符串转成字典,就没有'\'
# new_datas = json.loads(datas)
# return JsonResponse({'status': 10022, 'message':new_datas})
# else:
# return JsonResponse({'status':10023,'message':'查询对象结果为空'}) # 方法二:
try:
result = Event.objects.get(id=eid)
except ObjectDoesNotExist:
return JsonResponse({'status':10023,'message':'查询对象结果为空'}) else:
#给字典添加键值对
event['name'] = result.name
event['limit'] = result.limit
event['status'] = result.status
event['address'] = result.address
event['start_time'] = result.start_time
return JsonResponse({'status':200,'message':'查询成功','data':event}) if name != '':
datas = []
# 模糊查询:name__contains
results = Event.objects.filter(name__contains=name)
print(results.first())
if results:
for i in results:
event = {}
# 给字典添加键值对
event['name'] = i.name
event['limit'] = i.limit
event['status'] = i.status
event['address'] = i.address
event['start_time'] = i.start_time
datas.append(event)
return JsonResponse({'status':200,'message':'查询成功','datas':datas})
else:
return JsonResponse({'status':10022,'message':'查询的数据不存在'}) # 添加嘉宾接口 def add_guest(request):
# POST请求
eid = request.POST.get('eid','')
realname = request.POST.get('realname','')
phone = request.POST.get('phone','')
email = request.POST.get('email','') if eid == '' or realname == '' or phone == '' or email == '':
return JsonResponse({'status':10021,'message':'参数错误'},json_dumps_params={'ensure_ascii':False}) result = Event.objects.filter(id=eid)
if not result:
return JsonResponse({'status':10022,'message':'发布会id不存在'}) # 判断发布会状态是否有效
result = Event.objects.get(id=eid).status
if not result:
return JsonResponse({'status':10023,'message':'发布会状态无效'}) # object.get只返回一条数据,发布会只有一个,filter返回对象查询集,一个发布会下有多个嘉宾
event_limit = Event.objects.get(id=eid).limit # 发布会限制人数
guest_limit = Guest.objects.filter(event_id=eid) # 发布会已添加的嘉宾数 print(len(guest_limit))
print(event_limit)
if len(guest_limit) >= event_limit:
return JsonResponse({'status':10024,'message':'发布会人数已满'}) event_time = Event.objects.get(id=eid).start_time
#日期字符串转换成日期对象
timeArray = time.strptime(str(event_time),"%Y-%m-%d %H:%M:%S") #返回以秒的日期,入参struct_time。
e_time = int(time.mktime(timeArray))
#获取当前时间(单位:秒)
n_time = int(time.time())
print(e_time)
print(n_time)
if n_time >= e_time:
return JsonResponse({'status':10025,'message':'发布会已经开始了'}) try:
Guest.objects.create(event_id=int(eid),phone=int(phone),sign=0,realname=realname,email=email)
except IntegrityError:
return JsonResponse({'status':10026,'message':'手机号码重复'})
result2 = Event.objects.filter(id=eid)
new_result = serializers.serialize('json',result2)
print(result2)
return JsonResponse({'status':200,'message':'成功添加嘉宾','datas':json.loads(new_result)}) # 查询嘉宾接口
def get_guest_list(request):
# GET请求
eid = request.GET.get('eid','') #关联发布会id
phone = request.GET.get('phone','') if eid == '':
return JsonResponse({'status':10021,'message':'发布会id不能为空'})
#输入发布会id查询,查询发布会下所有嘉宾
if eid != '' and phone == '':
datas = []
results = Guest.objects.filter(event_id=eid)
if results:
for i in results:
guest_list = {}
guest_list['realname'] = i.realname
guest_list['phone'] = i.phone
guest_list['email'] = i.email
guest_list['sign'] = i.sign
datas.append(guest_list)
return JsonResponse({'status':200,'message':'查询成功','datas':datas})
else:
return JsonResponse({'status':10022,'message':'查询的数据不存在'})
# 查询发布会下某个嘉宾
if eid != '' and phone != '':
guest = {}
try:
result = Guest.objects.get(event_id=eid,phone=phone)
except ObjectDoesNotExist:
return JsonResponse({'status':10023,'message':'查询的结果为空'})
else:
guest['realname'] = result.realname
guest['phone'] = result.phone
guest['sign'] = result.sign
guest['email'] = result.email
return JsonResponse({'status':200,'message':'查询成功','datas':guest}) #嘉宾签到接口
def user_sign(request):
# POST接口
eid = request.POST.get('eid','')
phone = request.POST.get('phone','')
if eid == '' or phone == '':
return JsonResponse({'status':10021,'message':'参数错误'}) try:
result = Event.objects.get(id=eid)
except Event.DoesNotExist:
return JsonResponse({'status':10022,'message':'发布会id不存在'})
if result.status is False:
return JsonResponse({'status':10023,'message':'发布会未开启'}) #发布会时间
event_time = result.start_time
timeArray = time.strptime(str(event_time),"%Y-%m-%d %H:%M:%S")
e_time = int(time.mktime(timeArray)) #当前时间
n_time = int(time.time()) if n_time >= e_time:
return JsonResponse({'status':10024,'message':'发布会时间已过'}) #存在发布会后,再校验手机号码:
result = Guest.objects.filter(phone=phone)
if not result:
return JsonResponse({'status':10025,'message':'手机号码不存在'})
else:
for i in result:
if i.event_id == int(eid):
break
else:
return JsonResponse({'status':10026,'message':'嘉宾不属于该发布会'}) result = Guest.objects.get(event_id=eid,phone=phone)
if result.sign is True:
return JsonResponse({'status':10027,'message':'嘉宾已签到'})
else:
result.sign = True
result.save()
return JsonResponse({'status':200,'message':'签到成功'})
Postman接口测试
添加发布会接口
查询发布会接口
添加嘉宾接口
查询嘉宾接口
嘉宾签到接口
接口文档
总结
到此,以上web系统所开发的接口及测试都已完成。
Django Web接口开发的更多相关文章
- 关于《Web接口开发与自动化测试--基于Python语言》
关于封面logo 首先,你会被书封上面logo吸引,这么炫酷?双蛇杖?嗯,这是Requests的新logo. 旧的logo是一只乌龟. 新logo是双蛇杖: 看到新logo我首先想到的是 火爆全网页游 ...
- 《Web接口开发与自动化测试 -- 基于Python语言》 ---前言
前 言 本书的原型是我整理一份Django学习文档,从事软件测试工作的这六.七年来,一直有整理学习资料的习惯,这种学习理解再输出的方式对我非常受用,博客和文档是我主要的输出形式,这些输出同时也帮 ...
- 基于Python的WEB接口开发与自动化测试 pdf(内含书签)
基于Python的WEB接口开发与自动化测试 目录 目 录O V目 录章 Python 学习必知 ................................................... ...
- 《Python Web 接口开发与测试》---即将出版
为什么要出这样一本书? 首先,今年我有不少工作是跟接口自动化相关的,工作中的接口自动化颇有成效. 我一直是一个没有测试大格局的人,在各种移动测试技术爆发的这一年,我却默默耕耘着自己的一亩三分地儿(We ...
- 《Web接口开发与自动化测试 -- 基于Python语言》---现已出版。
终于可以购买了!! 有需要的同学通过下面链接购买. 购买来链接: https://item.jd.com/11806319423.html 为什么要出这样一本书? 首先,今年我有不少工作是跟接口自动化 ...
- JAVA WEB接口开发简述
目录 1. JAVA WEB接口开发简述 1.1. 基本了解 1.2. 提供接口 1.3. 调用接口 1. JAVA WEB接口开发简述 1.1. 基本了解 当我们想去访问其他网站的接口时候,而又不想 ...
- web接口开发基础知识-什么是web接口?
比如我们访问百度的首页,输入的url地址是:https://www.baidu.com/ 那么当我们在浏览器地址栏中输入url,敲回车后,发生了什么事情?怎么就能通过1个url地址就能看到百度的首页了 ...
- web接口开发与测试
最近一直在学习和整理web开发与接口测试的相关资料.接口测试本身毫无任何难度,甚至有很多工具和类库来帮助我们进行接口测试.大多测试人员很难深入了解web接口测试的原因是对web开发不太了解,当你越了解 ...
- 《Web接口开发与自动化测试》学习笔记(一)
一.Django的入门 学习思路:先安装Django,然后在建立一个项目,接着运行这个项目,最后修改一下这个项目的数据,学习一下Django的原理之类的. 1.安装Django $pip instal ...
随机推荐
- JS模板引擎-Mustache模板引擎使用实例1-表格树
1 使用实例代码 1.jsp代码 <!DOCTYPE html> <html lang="zh-CN"> <head> <title> ...
- "const char *" 类型的值不能用于初始化 "char *" 类型的实体
用vs2019发现会出现这样的问题 最后发现只要设置一下就解决了,解决方案如下: 右击该项目,选择属性->c/c++->语言->将符合模式改为否就行了... 设置之后程序没有再报错, ...
- java 字符+操作,字符串+操作
字符额 “+” 操作 是拿字符在计算机底层对应的数值来进行计算的 ‘A’ = 65 A-Z是连续的 'a' = 97 a-z是连续的 '0' = 48 0-9是连续的 算数表达式中包含多个基本数据类型 ...
- 16day 路径信息系列
../ 上一级目录 ./ 当前路径 ~ 返回到家目录 - 两个目录之间进行快速切换 An argument of - is equivalent to $OLDPWD(环境变量) 补充说明: [roo ...
- 题解【Vijos1159】岳麓山上打水
题面 迭代加深搜索模板题. 注意开始时要先对桶的容量从小到大排序. 达到搜索层数时使用完全背包\(\text{check}\)即可. 具体实现参考代码. #include <bits/stdc+ ...
- 什么是kafka,怎么使用? (2) - 内含zookeeper等
zookeeper依赖于java https://baike.baidu.com/item/yum/2835771?fr=aladdin http://yum.baseurl.org/ 去yum官网下 ...
- 完整安装IIS服务
此文主要是针对前面提到的 IIS支持json.geojson文件 添加脚本映射时,提示找不到asp.dll时的解决方法. 主要参考了此文:http://www.kodyaz.com/articles/ ...
- PP: Composite visual mapping for time series visualization
However: The conventional visual mapping maps each data attribute onto a single visual channel Purpo ...
- Windows10 远程桌面连接失败,报CredSSP加密oracle修正错误解决办法
最近Windows10 升级后,发现不能远程连接. 不能访问的都报下面这个错了: 原因:按照提示的微软地址,看了下大致就是服务器端没有更新,而我的win10已经更新了一个安全补丁,如果双方都没有打补丁 ...
- JS定义类的六种方式详解
转载自: http://www.jb51.net/article/84089.htm 在前端开发中,经常需要定义JS类.那么在JavaScript中,定义类的方式有几种,分别是什么呢?本文就JS定义类 ...