接口
一.编程语言里面的接口
1.Interface
接口在编程语言中指的是一个抽象类型,是抽象方法的集合;
它的特点如下:
-
接口包含类要实现的方法,但是接口自己无法被实例化
-
接口里的定义函数没有过程,且必须被继承的子类重写
-
类通过继承接口的方式,来继承接口的抽象方法;
-
类描述对象的属性和方法(实现接口的类,必须实现接口内所描述的所有方法,否则必须声明为抽象类);
总结:接口只定义规范,不负责具体实现(具体实现由具体的实现者完成)!
相当于一个接口有很多方法,这些方法都在这个接口里面被定义,但是这些方法的实现方式是另外的
2.Python中的Interface
python中的接口概念是借助第三方库来实现的,一般是Zope.interface
pip install zope.interface
- demo
from zope.interface import Interface
from zope.interface.declarations import implementer
# 定义接口
class IHost(Interface):
def goodmorning(self,host):
"""Say good morning to host"""
#继承接口
@implementer(IHost)
class Host:
def goodmorning(self, guest):
"""Say good morning to guest"""
return "Good morning, %s!" % guest
if __name__ == '__main__':
p = Host()
hi = p.goodmorning('Tom')
print(hi)
二.开发系统的Web 接口
1.发布会添加接口
from django.http import JsonResponse
from blog.models import Event
from django.core.exceptions import ValidationError
# 添加发布会接口
def add_event(request):
#接口入参
eid = request.POST.get('eid', '') # 发布会id
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 status == ''or address == '' or start_time == '':
return JsonResponse({'status': 10021, 'message': 'parameter error'})
# id存在校验
result = Event.objects.filter(id=eid)
if result:
return JsonResponse({'status': 10022, 'message': 'event id already exists'})
#name存在校验
result = Event.objects.filter(name=name)
if result:
return JsonResponse({'status': 10023, 'message': 'event name already exists'})
#判断发布会状态是否为空,为空则置为1
if status == '':
status = 1
#逻辑:创建新的Event数据
try:
Event.objects.create(id=eid, name=name, limit=limit, address=address,status=int(status), start_time=start_time)
except ValidationError as e:
error = 'start_time format error. It must be in YYYY-MM-DD HH:MM:SS format.'
return JsonResponse({'status': 10024, 'message': error})
return JsonResponse({'status': 200, 'message': 'add Even success'})
这里通过POST请求获取到发布会的数据
2.发布会查询接口
from django.core.exceptions import ValidationError, ObjectDoesNotExist
#发布会查询接口
def get_event_list(request):
eid = request.GET.get("eid", "") # 发布会id
name = request.GET.get("name", "") # 发布会名称
# 不可同时为空
if eid == '' and name == '':
return JsonResponse({'status': 10021, 'message': 'parameter error'})
if eid != '':
event = {}
try:
result = Event.objects.get(id=eid)
except ObjectDoesNotExist:
return JsonResponse({'status': 10022, 'message': 'query result is empty'})
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': 'success', 'data': event})
#使用name进行模糊查询
if name != '':
datas = []
results = Event.objects.filter(name__contains=name)
if results:
for r in results:
event = {}
event['name'] = r.name
event['limit'] = r.limit
event['status'] = r.status
event['address'] = r.address
event['start_time'] = r.start_time
datas.append(event)
return JsonResponse({'status': 200, 'message': 'success', 'data': datas})
else:
return JsonResponse({'status': 10022, 'message': 'query result is empty'})
这里通过GET请求获取到发布会的数据,这里参数不可以同时为空,但是可以其中一个为空。
如果eid不为空,因为id具有唯一性,则根据传递的eid查找发布会数据;
如果name不为空,则使用的是模糊查找(name__contains),这里使用event存储每一个会议的数据,然后放到data里面,最后返回的json里面就是data数据。
- sunmmary
这样的处理思路很适合多个参数的情况,如果接口数据很多,最后只需要一个data返回即可
return JsonResponse({'status': 200, 'message': 'success', 'data': datas})
3.嘉宾添加接口
# 添加嘉宾接口
def add_guest(request):
eid = request.POST.get('eid', '') # 关联发布会id
realname = request.POST.get('realname', '') # 姓名
phone = request.POST.get('phone', '') # 手机号
email = request.POST.get('email', '') # 邮箱
# 参数为空校验
if eid == '' or realname == '' or phone == '':
return JsonResponse({'status': 10021, 'message': 'parameter error'})
# 如果会议不存在,不可以签到
result = Event.objects.filter(id=eid)
if not result:
return JsonResponse({'status': 10022, 'message': 'event id null'})
# 会议没有开放,不可以签到
result = Event.objects.get(id=eid).status
if not result:
return JsonResponse({'status': 10023, 'message': 'event status is not available'})
#人数限制
event_limit = Event.objects.get(id=eid).limit # 发布会限制人数
guest_limit = Guest.objects.filter(event_id=eid) # 发布会已添加的嘉宾数
if len(guest_limit) >= event_limit:
return JsonResponse({'status': 10024, 'message': 'event number is full'})
#时间判断
event_time = Event.objects.get(id=eid).start_time # 发布会时间
etime = str(event_time).split(".")[0]
timeArray = time.strptime(etime, "%Y-%m-%d %H:%M:%S")
e_time = int(time.mktime(timeArray))
now_time = str(time.time()) # 当前时间
ntime = now_time.split(".")[0]
n_time = int(ntime)
if n_time >= e_time:
return JsonResponse({'status': 10025, 'message': 'event has started'})
try:
Guest.objects.create(realname=realname, phone=int(phone), email=email,
sign=0, event_id=int(eid))
except IntegrityError:
return JsonResponse({'status': 10026,
'message': 'the event guest phone number repeat'})
return JsonResponse({'status': 200, 'message': 'add guest success'})
4.嘉宾查询接口
# 嘉宾查询接口
def get_guest_list(request):
eid = request.GET.get("eid", "") # 关联发布会id
phone = request.GET.get("phone", "") # 嘉宾手机号
if eid == '':
return JsonResponse({'status': 10021, 'message': 'eid cannot be empty'})
if eid != '' and phone == '':
datas = []
results = Guest.objects.filter(event_id=eid)
if results:
for r in results:
guest = {}
guest['realname'] = r.realname
guest['phone'] = r.phone
guest['email'] = r.email
guest['sign'] = r.sign
datas.append(guest)
return JsonResponse({'status': 200, 'message': 'success', 'data': datas})
else:
return JsonResponse({'status': 10022, 'message': 'query result is empty'})
if eid != '' and phone != '':
guest = {}
try:
result = Guest.objects.get(phone=phone, event_id=eid)
except ObjectDoesNotExist:
return JsonResponse({'status': 10022, 'message': 'query result is empty'})
else:
guest['realname'] = result.realname
guest['phone'] = result.phone
guest['email'] = result.email
guest['sign'] = result.sign
return JsonResponse({'status': 200, 'message': 'success', 'data': guest})
5.嘉宾签到接口
# 嘉宾签到接口
def user_sign(request):
eid = request.POST.get('eid', '') # 发布会id
phone = request.POST.get('phone', '') # 嘉宾手机号
# 参数校验
if eid == '' or phone == '':
return JsonResponse({'status': 10021, 'message': 'parameter error'})
#不存在的会议id
result = Event.objects.filter(id=eid)
if not result:
return JsonResponse({'status': 10022, 'message': 'event id null'})
# 会议不可以签到
result = Event.objects.get(id=eid).status
if not result:
return JsonResponse({'status': 10023,
'message': 'event status is not available'})
#会议时间不允许签到
event_time = Event.objects.get(id=eid).start_time # 发布会时间
etime = str(event_time).split(".")[0]
timeArray = time.strptime(etime, "%Y-%m-%d %H:%M:%S")
e_time = int(time.mktime(timeArray))
now_time = str(time.time()) # 当前时间
ntime = now_time.split(".")[0]
n_time = int(ntime)
if n_time >= e_time:
return JsonResponse({'status': 10024, 'message': 'event has started'})
#手机号不存在不可以签到
result = Guest.objects.filter(phone=phone)
if not result:
return JsonResponse({'status': 10025, 'message': 'user phone null'})
#该会议是否有这个用户
result = Guest.objects.filter(event_id=eid, phone=phone)
if not result:
return JsonResponse({'status': 10026, 'message': 'user did not participate in the conference'})
#判断该用户是否已经签到
result = Guest.objects.get(event_id=eid, phone=phone).sign
if result:
return JsonResponse({'status': 10027, 'message': 'user has sign in'})
else:
Guest.objects.filter(event_id=eid, phone=phone).update(sign='1')
return JsonResponse({'status': 200, 'message': 'sign success'})
6.配置接口路径
include方法可以作为其他url的链接,也可以作为其他链接的根路径。例如
- Django/urls.py
from django.urls import include, path
urlpatterns = [
path('community/', include('aggregator.urls')),
path('contact/', include('contact.urls')),
]
这里不能给每个函数都配置一个路径,所以使用api作为总路径,再在模块里面新建一个模块
- urls.py
from django.urls import path
from blog import views_if
urlpatterns = [
# guest system interface:
# ex : /api/add_event/
path('add_event/', views_if.add_event, name='add_event'),
# ex : /api/add_guest/
path('add_guest/', views_if.add_guest, name='add_guest'),
# ex : /api/get_event_list/
path('get_event_list/', views_if.get_event_list, name='get_event_list'),
# ex : /api/get_guest_list/
path('get_guest_list/', views_if.get_guest_list, name='get_guest_list'),
# ex : /api/user_sign/
path('user_sign/', views_if.user_sign, name='user_sign'),
]
三.编写Web 接口文档
对于每个接口都需要名称查询发布会接口
举个例子
描述查询发布会接口
| 参数 | 备注 |
|---|---|
| URL | http://127.0.0.1:8000/api/get_event_list/ |
| 调用方式 | GET |
| 传入参数 | eid 发布会id;name 发布会名称 |
| 返回值 | json |
| 状态码 | error code |
| 说明 | eid 或name 两个参数二选一 |
本文介绍了Django中接口的概念,包括编程语言中的接口和Python中的Interface。讲解了如何开发系统的Web接口,如发布会的添加、查询,嘉宾的添加、查询和签到,并详细阐述了接口路径的配置。此外,还强调了编写Web接口文档的重要性,以查询发布会接口为例进行说明。

1540

被折叠的 条评论
为什么被折叠?



