在上篇文章中,我们讲解了restful api的主要概念,让大家有初步的了解。这一篇中,我们将通过python的Django框架,来学习开发restful 架构的接口。
一. 开发环境
开发语言:Python 3.6
IDE :Pycharm
框架:Django 2.2.12
测试工具:Postman
二.开发准备
django开发restful api有两种方式,一种基于视图函数,另一种为类视图的方式。在使用上更加推荐类视图的方式,这样可以使代码层次更加简洁明了。
首先,我们先在pycharm创建一个django的项目,命名为myapi。
运行下面命令,生成新的app,名称为sys_manage,用于测试restful api的功能。运行完成后,可看到新生成的app。
python manage.py startapp sys_manage
在setting文件的INSTALLED_APPS中,增加该app名称
修改sys_manage/models.py文件,增加UserInfo模型,该表用于存储测试的对象信息
运行下面名称,生成对应的数据库表结构
python manage.py makemigrations sys_manage
python manage.py migrate sys_manage
到此,我们的准备工作完成,可以开始进行restful api的开发。
三. restful api开发
上篇有讲到,restful 的每个url代表一个资源,这里由于我们是本地操作,所以web域名用django默认的http://127.0.0.1:8000,完整的url为http://127.0.0.1:8000/api/users ,用来表示用户资源,通过对该url执行http请求(GET、POST、PUT和DELETE),验证我们的restful 功能。
首先,我们在sys_manage/views文件中,创建对应的类视图,名称为User
from django.views.generic import View
from sys_manage.models import UserInfo
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
class User(View):
pass
在msapi/urls.py文件中,增加对该类视图的路由
from django.contrib import admin
from django.urls import path
from sys_manage import views
urlpatterns = [
path('api/users/',views.User.as_view()),
path('api/users/',views.User.as_view()),
]
GET请求
接下来,我们先来写一个对应get请求方法,在get请求包含获取所有用户信息与获取指定用户信息两种,分别对应的url如下
htttp://127.0.0.1:8000/api/users # 获取所有用户信息
http://127.0.0.1:8000/api/users/id # 获取指定ID的用户信息
我们会在函数中判断是否传了id值以及查询条件,来返回对应的数据,代码如下:
class User(View):
def get(self, request,id=0):
search_dict={}
#获取GET传值参数
name=request.GET.get('name')
age=request.GET.get('age')
department=request.GET.get('dep')
#如果存在参数,则添加到搜索条件
if id:
search_dict['id']=id
if name:
search_dict['name']=name
if age:
search_dict['age']=age
if department:
search_dict['department']=department
#根据搜索条件查询结果
users=UserInfo.objects.filter(**search_dict).all()
userinfo=[]
for u in users:
udata={
'id':u.id,
'name':u.name,
'age':u.age,
'departemnt':u.department
}
userinfo.append(udata)
#返回用户信息列表
return JsonResponse({'code':0,'message':'Success!','data':userinfo})
由于数据库目前没有数据,我们可以先在数据库插入几条数据,然后启动项目,通过postman测试get方法
也可以根据id号,获取单个用户信息,如下:
或者,通过参数条件查询
POST请求
下面,我们再写一个处理POST请求的代码,用于生成用户对象,代码如下:
def post(self, request):
data=json.loads(request.body)
name=data.get('name')
age=data.get('age')
departemnt=data.get('dep')
udata={
'name':name,
'age':age,
'department':departemnt
}
user=UserInfo(**udata)
user.save()
return JsonResponse({'code':0,'message':'Success!'})
在POST请求中,会遇到跨域的问题,可以加一个dispatch函数,否则测试时会有403禁止访问的报错。
@csrf_exempt
def dispatch(self,*args, **kwargs):
return super(User,self).dispatch(*args,**kwargs)
我们测试下POST请求,新建一个用户对象,名字为Jim,请求返回成功信息。
再通过GET方法,看一下新用户是否已创建。在标红处可以看到,用户已经创建完成。
除了GET和POST外,还有PUT和DELETE方法,代表更新信息与删除,代码如下 。
大家可以根据代码,自己测试一下。
def put(self, request,id):
update_dict={}
name=request.GET.get('name')
age=request.GET.get('age')
department=request.GET.get('dep')
if name:
update_dict['name']=name
if age:
update_dict['age']=age
if department:
update_dict['department']=department
UserInfo.objects.filter(id=id).update(**update_dict)
return JsonResponse({'code':0,'message':'Success!'})
def delete(self, request,id):
UserInfo.objects.filter(id=id).delete()
return JsonResponse({'code':0,'message':'Success!'})