【Django】Day6-接口

本文介绍了Django中接口的概念,包括编程语言中的接口和Python中的Interface。讲解了如何开发系统的Web接口,如发布会的添加、查询,嘉宾的添加、查询和签到,并详细阐述了接口路径的配置。此外,还强调了编写Web接口文档的重要性,以查询发布会接口为例进行说明。

接口

一.编程语言里面的接口

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 接口文档

对于每个接口都需要名称查询发布会接口

举个例子

描述查询发布会接口

参数备注
URLhttp://127.0.0.1:8000/api/get_event_list/
调用方式GET
传入参数eid 发布会id;name 发布会名称
返回值json
状态码error code
说明eid 或name 两个参数二选一
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值