Django 后端搭建

Django 后端搭建

  • 虚拟环境搭建
  • pychrom创建django项目
  • 配置
    • django
      • 安装
    • mysql
      • 安装
      • 配置连接数据库
      • Django REST framework
      • 安装
      • 配置
      • 配置响应中间件
        • 正常响应信息中间件
        • 自定义响应
        • 异常响应中间件
    • 创建APP项目
  • 数据迁移
    • 迁移脚本
    • 序列号器

虚拟环境搭建

  • 打开cmd,cd到\python3\Scripts目录下执行安装>virtualenvwrapper-win

pip install virtualenvwrapper-win

Django 后端搭建_第1张图片

  • 输入workon校验安装是否成功
    Django 后端搭建_第2张图片

  • 配置WORKON_HOME
    本地新建一个文件夹,存储创建的虚拟环境
    Django 后端搭建_第3张图片
    打开环境变量配置,新建WORKON_HOME
    Django 后端搭建_第4张图片
    变量名为:WORKON_HOME
    变量值为:虚拟环境文件夹路径
    Django 后端搭建_第5张图片

  • 重新打开一个cmd校验配置
    Django 后端搭建_第6张图片

  • 使用
    创建虚拟化境

mkvirtualenv 虚拟环境名称
Django 后端搭建_第7张图片


pychrom创建django项目

  • 创建django项目-选择虚拟环境

Django 后端搭建_第8张图片Django 后端搭建_第9张图片

  • 创建后的结构是这样的
    Django 后端搭建_第10张图片

配置

django

安装

pip install django

mysql

(此处用的是mysql)

安装

pip install mysqlclient==1.4.6

配置连接数据库

Django 后端搭建_第11张图片

Django REST framework

(格式化响应输出)

安装

pip install djangorestframework

配置

settings.py文件中配置rest_framework

Django 后端搭建_第12张图片

配置响应中间件

正常响应信息中间件

创建utils中间件文件夹
创建py文件复制以下代码

class ResponseMiddleware:
    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


class ResponseMiddleware:
    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

配置响应中间件

Django 后端搭建_第13张图片
Django 后端搭建_第14张图片

自定义响应


from rest_framework.response import Response


class CustomeResponse(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)

异常响应中间件

from rest_framework import status
from rest_framework.exceptions import ValidationError
from rest_framework.views import exception_handler as drf_exception_handler

from utils.custome_response import CustomeResponse


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 CustomeResponse({
     '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 CustomeResponse(None,code="9999",msg=message)
    return response

创建APP项目

命令行创建

python manage.py startapp APP包名

配置:
Django 后端搭建_第15张图片

路由分发
Django 后端搭建_第16张图片

数据迁移

迁移脚本

迁移脚本

执行数据迁移

python manage.py makemigrations

执行迁移标本,数据库中创建新表

python manage.py migrate

序列号器

创建serializers.py复制序列号器代码
序列号器


待更

你可能感兴趣的:(python,django,中间件)