【Django】【五】开发Web接口
【HTTP协议与JSON】
1. HTTP协议
特点如下:
(1)支持客户/服务器模式。
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
(2)灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type标记。
(3)无连接:限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可节省传输时间。
(4)无状态:协议对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要前面信息时它的应答就较快。
8.3 开发系统Web接口
8.3.1 配置接口路径
开发Web接口的访问方式与开发系统的访问方式相同, 为了进行区分, 这里设置Web接口的根目录为'/api/' 通过二级目录表示实现具体功能的接口
.../ guest/urls.py
...
from django.conf.urls import url, include
...
url(r'^api/', include('sign.urls', namespace='sign')),
在sign应用下创建urls.py 即 .../sign/urls.py 用来配置具体接口的二级目录
from django.conf.urls import url
from sign import views_if
urlpatterns = [
# sign system interface:
# ex: /api/add_event/
#url(r'^add_event/', views_if.add_event, name='add_event'),
# ex: /api/add_guest/
#url(r'^add_guest/', views_if.add_guest, name='add_guest'),
# ex: /api/get_event_list/
#url(r'^get_event_list/', views_if.get_event_list, name='get_event_list'),
# ex: /api/get_guest_list/
#url(r'^get_guest_list/', views_if.get_guest_list, name='get_guest_list'),
# ex: /api/user_sign/
#url(r'^api/', include(('sign.urls', 'sign'), namespace='sign')),
]
首先 为了避免Web接口代码与views.py文件中的系统功能代码混在一起,因此需要重新在sign应用下创建views_if.py 用于Web接口的开发。
其次,这里定义的接口路径暂时还未实现,当启动项目时会引起报错,所以,需要将他们先全部注释。接下来每开发一个接口,这里就去掉一个接口的注释,直到所有接口开发完成。
8.3.2 添加发布会接口
.../sign/views_if.py
from django.http import JsonResponse
from sign.models import Event
from django.core.exceptions import ValidationError
#添加发布会接口
def add_event(request):
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 == '':
return JsonResponse({'status': 10021, 'message': 'parameter error'})
result = Event.objects.filter(id=eid)
if result:
return JsonResponse({'status': 10022, 'message': 'event id already exists'})
result = Event.objects.filter(name=name)
if result:
return JsonResponse({'status': 10023, 'message': 'event name already exists'})
if status == '':
status = 1
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 event success'})
8.3.3 查询发布会接口
.../sign/views_if.py
# 查询发布会接口
def get_event_list(request):
eid = request.GET.get('eid', '')
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})
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'})
8.3.4 添加嘉宾接口
.../ sign/views_if.py
# 添加嘉宾接口
def add_guest(request):
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 == '':
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'})
8.3.5 查询嘉宾接口
.../sign/views_if.py
# 查询嘉宾接口
def get_guest_list(request):
eid = request.GET.get('eid', '')
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})
8.发布会签到接口
.../sign/views_if.py
# 发布会签到接口
def user_sign(request):
eid = request.POST.get('eid', '')
phone = request.POST.get('phone', '')
if eid == '' 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_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))
new_time = str(time.time())
ntime = new_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'})
8.4 编写Web接口文档