python+django搭建测试平台(一)

参考github开源代码:https://github.com/githublitao/api_automation_test

环境搭建

新建项目

  • 选择django框架+虚拟环境


    image

数据库配置

  1. 修改settings.py

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '127.0.0.1',  # 数据库主机
            'PORT': 3306,  # 数据库端口
            'USER': 'root',  # 数据库用户名
            'PASSWORD': 'admin1234',  # 数据库用户密码
            'NAME': 'api_test'  # 数据库名字
        }
    }
    
  2. 安装相关库:

    pip install mysqlclient==1.4.6

    pip install wheel

中间件配置

  1. 前提:使用rest-framework框架
    • 安装 :

      pip install djangorestframework

    • 修改settings.py :

      INSTALLED_APPS添加'rest_framework'

  1. 格式化响应输出

    • 新建utils文件夹,新建custom_response_middleware.py

      class CustomResponseMiddleware:
      def __init__(self, get_response):
          self.get_response = get_response
           # 配置和初始化
      
      def __call__(self, request):
      
          # 在这里编写视图和后面的中间件被调用之前需要执行的代码
          # 这里其实就是旧的process_request()方法的代码
          response = self.get_response(request)
          # if "code" not in response.data:
          #
          #     data = response.data
          #     response.data={
          #         "code":"0000",
          #         "message":"查询成功",
          #         "data":response.data
          #     }
          #     # 因返回时已经render过response,要想让这里的修改有效,需要手动在render一次
          # response._is_rendered = False
          # response.render()
          # response["content-length"]=len(response.content)
          # 在这里编写视图调用后需要执行的代码
          # 这里其实就是旧的 process_response()方法的代码
          return response
      
      def process_template_response(self, request, response):# 推荐
          if "code" not in response.data:
              data = response.data
              response.data={
                  "code":"0000",
                  "message":"操作成功",
                  "data":response.data
              }
          # 在这里编写视图调用后需要执行的代码
          # 这里其实就是旧的 process_response()方法的代码
      
          return response
      
    • 修改settings.py :

      MIDDLEWARE中最前面增加'utils.custom_response_middleware.CustomResponseMiddleware'。(响应中间件放最前面,请求中间件放最后面)

    • 重写异常类 utils/custom_exception.py

      from rest_framework import status
      from rest_framework.exceptions import ValidationError
      from rest_framework.views import exception_handler as drf_exception_handler
      from utils.custom_response import CustomResponse
      
      
      def exception_handler(exc,context):
          """
          自定义异常处理
          :param exc: 别的地方抛的异常就会传给exc
          :param context: 字典形式。抛出异常的上下文(即抛出异常的出处;即抛出异常的视图)
          :return: Response响应对象
          """
          response = drf_exception_handler(exc,context)
          if response is None:
              # drf 处理不了的异常
              print('%s - %s - %s' % (context['view'], context['request'].method, exc))
              return CustomResponse({'detail': '服务器错误'}, code=500,msg="服务器内部错误",status=status.HTTP_500_INTERNAL_SERVER_ERROR, exception=True)
          if isinstance(exc,ValidationError):
              message = ""
              data = response.data
              for key in data:
                  message += ";".join(data[key])
              return CustomResponse(None,code="9999",msg=message)
          return response
      
      

      修改settings.py

      REST_FRAMEWORK = {
          'EXCEPTION_HANDLER':'utils.custom_exception.exception_handler',
      }
      
    • 重写响应 utils/custom_response.py

      from rest_framework.response import Response
      
      
      # 重写响应
      class CustomResponse(Response):
      
          def __init__(self, *args, code='0000', msg="成功", **kwargs):
              # 格式化data
              data = {
                  "code": code,
                  "message": msg
              }
              if args is not None:
                  data["data"] = args[0]
                  kwargs["data"] = data
              elif "data" in kwargs:
                  data["data"] = kwargs["data"]
                  kwargs["data"] = data
      
              super().__init__(**kwargs)
      
      

新建应用

  • python manage.py startapp guoya_api
  • 添加应用到settings.pyINSTALLED_APPS

路由分发

主路由:
```
urlpatterns = [
    path('admin/', admin.site.urls),
    path('v01/', include('guoya_api.urls')), 
]
```

子路由:
```
urlpatterns = [

]
```

models

文件位置:guoya_api>models

直接使用开源代码中的models:

https://github.com/githublitao/api_automation_test/blob/master/api_test/models.py

  • 数据迁移

    生成迁移脚本:

    python manage.py makemigrations

    执行迁移标本:

    python manage.py migrate

对模型创建序列化器

文件位置:guoya_api>serializers.py

直接使用开源代码中的serializers:

https://github.com/githublitao/api_automation_test/blob/master/api_test/serializers.py

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343