­

Django:给requests发送请求功能 套一层衣服。

个人的疑问🤔

django我目前还认为django自带的后台管理系统能直接改成测试平台(主要原因前端不会画)

做了个啥?

也是在学django,然后了解了simple UI,就先试试了给requests发请求这块套了个壳子,就有了这个小东西,做这个东西的时候也是一边翻之前买的django书籍,一边百度。。。

用了些啥?

Django 2.2

simple UI

sqllite(django 自带的)

requests

样子

  • 登录

    Snipaste_2020-09-04_12-38-50.png

  • 首页

    Snipaste_2020-09-04_12-40-45.png

  • 用例管理

    Snipaste_2020-09-04_12-42-38.png

  • 新增用例

    Snipaste_2020-09-04_12-42-23.png

  • 执行用例

    Snipaste_2020-09-04_12-45-56.png

  • 响应结果:

    • 列表栏会显示

    • 详情页也会显示

    • 点击发送请求按钮,也会显示不过不会处理,出现多选用例发送请求时只会显示最后一条用例的结果,效果差不多是这样的。

      Snipaste_2020-09-04_12-47-52.png

目录结构

Snipaste_2020-09-04_13-04-46.png

代码展示

  • models.py

    from django.contrib.auth.models import User
    from django.db import models
    
    # Create your models here.
    from django.utils import timezone
    
    
    class Case(models.Model):
        METHODS = (
            # 前者value存在数据库中, 后者为注释内容显示在后台管理系统中
            ('get', 'GET'),
            ('post', 'POST'),
            ('delete', 'DELETE'),
            ('put', 'PUT'),
        )
        DATA_TYPE = (
            # 前者value存在数据库中, 后者为注释内容显示在后台管理系统中
            ('params', 'PARAMS'),
            ('data', 'DATA'),
            ('json', 'JSON'),
        )
        case_title = models.CharField(max_length=50, verbose_name="用例标题", unique=True)
        case_desc = models.TextField(verbose_name="用例描述")
        request_path = models.CharField(max_length=100, verbose_name="接口路径")
        request_method = models.CharField(max_length=10, choices=METHODS, default=METHODS, verbose_name="请求方式")
        header = models.TextField(verbose_name="请求头", blank=True)
        data_type = models.CharField(max_length=10, choices=DATA_TYPE, default=DATA_TYPE, verbose_name="数据请求形式")
        data = models.TextField(verbose_name="请求数据", blank=True)
        create_time = models.DateTimeField(default=timezone.now, verbose_name="创建时间")
        author = models.CharField(max_length=8, verbose_name="创建者", default=User)
        update_time = models.DateTimeField(auto_now=True, verbose_name="最近更新时间")
        result = models.TextField(verbose_name="响应结果")
    
        def __str__(self):
            return self.case_title
    
        class Meta:
            # 复数形式显示
            # verbose_name = "用例管理"
            # 单数形式
            verbose_name_plural = "用例管理"
            ordering = ["id"]
    
    
  • views.py(因为使用的是admin的后台 目前是没有路由的。。。)

  • admin.py(主要是这里了,没啥技术含量)

    from django.contrib import admin
    from django.http import JsonResponse
    
    from .models import Case
    # Register your models here.
    from .util import http
    
    """
    数据库迁移命令:
    1。 python manage.py makemigrations
    2。 python manage.py migrate
    3。 创建app命令:python manage.py startapp 应用名
    4. 创建管理后台账号,python manage.py createsuperuser
    """
    # admin.site.register(Case)
    
    # 定义显示内容到admin管理系统
    @admin.register(Case)
    class CaseModel(admin.ModelAdmin):
    
        # 设置显示(admin 数据列表页)的字段
        list_display = [
            'case_title', 'request_path', 'request_method', 'header',
            'data_type', 'data', 'create_time', 'author', 'update_time', 'result'
                        ]
        # 新增/修改数据时隐藏字段
        exclude = [
             'create_time'
                        ]
        # 设置字段只读
        readonly_fields = ['result']
    
        # 筛选字段
        list_filter = ['request_method', 'data_type']
    
        # 搜索字段
        search_fields = ['id', 'case_title', 'request_path', 'author']
    
        # 设置时间选择功能
        date_hierarchy = 'create_time'
    
        # 定义按钮
        actions = ['send_http']
    
        # 按钮事件
        def send_http(self, request, queryset):
            # 调用requests发送请求,queryset 会取得model中设置的case_title
            for query in queryset:
                # 得到了这个用例标题
                res = http(query)
            # 在页面上json格式返回响应内容
            return JsonResponse(res, json_dumps_params={'ensure_ascii': False})
        # 设置按钮
        send_http.short_description = '发送请求'
        send_http.icon = 'fas fa-audio-description'
        send_http.type = 'danger'
        send_http.style = 'color:black;'
    
    
    # # 注册
    # admin.site.register(Case, CaseModel)
    
    # 修改网站标题
    admin.site.site_title = "接口测试工具V0.1"
    admin.site.site_header = "Web界面接口测试工具"
    
  • util.py(里面封装了requests发送请求)

    #!/usr/bin/env/python3
    # -*- coding:utf-8 -*-
    """
    @project: apiRequestUtil
    @author: zy7y
    @file: util.py
    @ide: PyCharm
    @time: 2020/9/4
    """
    from json import loads
    
    from .models import Case
    import requests
    session = requests.Session()
    host = '//49.232.203.244:8888/api/private/v1/'
    
    
    def http(title):
        # 根据title查数据
        case = Case.objects.filter(case_title=title).first()
        if case.header == '':
            header = None
        else:
            header = loads(case.header)
    
        # 转换成json/dict
        data = loads(case.data)
        if case.data_type == 'params':
            res = session.request(method=case.request_method, url=host + case.request_path, headers=header, params=data)
        if case.data_type == 'data':
            res = session.request(method=case.request_method, url=host + case.request_path, headers=header, data=data)
        if case.data_type == 'json':
            res = session.request(method=case.request_method, url=host + case.request_path, headers=header, json=data)
        # 将响应存回数据库
        case.result = res.json()
        case.save()
    
        return res.json()
    

弊端

util.py里面 设置了host地址。。。写死的

源码

GitHub://github.com/zy7y/apiRequestUtil_django

Gitee: //gitee.com/zy7y/apiRequestUtil_django

最后

我认为django自带的admin能实现测试平台,不知道是不是个错误的想法,欢迎讨论。