一.构建mock模块的model
新建一个mock app(manage.py 里执行命令startapp mock)
再在setting里面给mock app注册一下
mock系统的主要功能就是提供一个个伪造的接口,然后在前端或者安卓ios调用这些接口时,给出相应的相应,如500,200之类
而每个接口都如下,有服务器,有具体的路径
所以我们先来给mock app建model,这个model存储服务器名,服务器根路径等字段
再定义一个model,这个model存储跟在上一个model根路径后面的请求字段等等,这边用到了外键,并且其中的参数on_delete有多种用法,可以参考https://blog.csdn.net/kuangshp128/article/details/78946316
再定义一个model,这个model存放着针对每个接口的响应请求,如500,200
贴一下model
from django.db import models
# Create your models here.
#服务器model
class ServerName(models.Model):
name = models.CharField(max_length=20,verbose_name='服务器名')
path = models.CharField(max_length=40,verbose_name='服务器根路径')
class Meta:
db_table = 'mock_server_name'
verbose_name = '服务器'
verbose_name_plural = verbose_name
ordering = ['-id']
def __str__(self):
return self.name
#服务器下的接口model
class Api_Str(models.Model):
api_kind = models.CharField(max_length=50,verbose_name='接口的种类')
path = models.CharField(max_length=100,verbose_name='接口路由')
#定义一个外键,指明在哪个服务器下面。models.CASCADE代表如果关联的键被删除,这个表里响应的数据也被删除
server = models.ForeignKey(ServerName,verbose_name='所属服务器',on_delete=models.CASCADE)
class Meta:
db_table = 'mock_api_name'
verbose_name = '服务器下接口地址'
verbose_name_plural = verbose_name
def __str__(self):
return self.api_kind
class Response(models.Model):
name = models.CharField(max_length=20,verbose_name='响应名称')
json = models.TextField(verbose_name='返回报文')
delay = models.IntegerField(default=1,verbose_name='响应延迟')
#这个响应有针对的固定请求,所以需要一个外键,指向上一个model
to_api = models.ForeignKey(Api_Str,verbose_name='响应指向接口',on_delete=models.CASCADE)
class Meta:
db_table = 'mock_response_name'
verbose_name = '接口响应'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
把mock的model同步到数据库
二.给model添加数据
在admin里注册一下刚刚创建的mock app,可以在后台对其创建的model进行操作
from django.contrib import admin
# Register your models here.
from mock.models import ServerName, Api_Str, Response
class admin_ServerName(admin.ModelAdmin):
list_display = ('name','path')
search_fields = ('name','path')
list_filter = ('name',)
class admin_Api(admin.ModelAdmin):
list_display = ('api_kind','path','server')
search_fields = ('api_kind','server')
list_filter = ('server',)
class admin_Response(admin.ModelAdmin):
list_display = ('name','json','delay','to_api')
search_fields = ('name',)
list_filter = ('name',)
admin.site.register(ServerName,admin_ServerName)
admin.site.register(Api_Str,admin_Api)
admin.site.register(Response,admin_Response)
注册完成后通过admin后台为这几个model添加数据
三.逻辑处理
然后我们来做几个url,从数据库读取数据组成接口,在浏览器输入,可以正常访问
先测试一下有没有成功获取正则表达式传过来的两个变量,获取成功
详细补充一下view里面的方法
class mock_server(View):
def get(self,request,server_name,api_name):
if server_name ==None or server_name=='':
return HttpResponse('服务器名不能为空')
if api_name == None or api_name == '':
return HttpResponse('接口路径不能为空')
# filter查找出来的是一个列表对象
server_list = ServerName.objects.filter(path=server_name)
if not server_list:
return HttpResponse('服务器名不存在')
api_list = Api_Str.objects.filter(path=api_name,server=server_list[0])
if not api_list:
return HttpResponse('接口名错误')
response_list = Response.objects.filter(to_api=api_list[0])
if not response_list:
return HttpResponse('无响应')
#响应有成功失败等多个,任选一个
response = response_list[random.randint(0,len(response_list)-1)]
delay = response.delay
json = response.json
time.sleep(delay)
return HttpResponse(json)
在我们请求访问的时候,由于view里面的time.sleep,所以要等一会才会刷新页面,出结果
mock系统的核心内容到此就结束了。
四.一点补充
如果一个url需要在登陆后才能访问,可以在url里加上一个login_required函数,这样这个url就需要登录后才能访问(也可以在登录admin后台后再访问这个路由,可以访问成功。)
如果登陆后需要在页面上显示登录用户的信息
这两个问题是我在实现页面的增删改查的时候遇到的。我会把项目完整的源代码放在Django实战搭建mock系统(一)最前面,其他的都是些基础的问题。