路飞项目--02

补充:axios封装

# 普通使用:安装  ,导入使用

const filmList=reactive({result:[]})
axios.get().then()
async function load(){
      let response=await axios.get('')
      filmList.result=response.data.results
}

# 封装示例:请求发出去之前和响应回来以后,请求头中会携带格式

import axios from "axios";
axios.defaults.baseURL = "http://127.0.0.1:8001/api/v1"
const request = axios.create({
    timeout: 5000,
    headers: {
        'Content-Type': "application/json; charset=utf-8"
    }
})

# 请求拦截器:每次发送请求,请求头都会带:Authorization

request.interceptors.request.use(config => {
    config.headers['Authorization'] = localStorage.getItem("token")
    return config
})

# 响应拦截器

request.interceptors.response.use(
    response => {
        console.log("response ->" + response)
        let res = response.data // 真正响应头
        if (res.code === 100) { //自己定制的状态码
            return response.data
        } else {
            Element.Message.error('系统异常,请联系系统管理员')
            return Promise.reject(response.data.msg)
        }
    }
)

# 把对象导出:

export default request

# main.js 

import http from './lib/http'
Vue.prototype.$http = http

# 在某些组件中使用:

this.$http.get("/user/user/", {
        params: { // get请求参数
          username: this.searchForm.username,
          page: this.page,
          size: this.size
        }
      }).then(res => {
        this.tableData = res.results
        this.total = res.count
      })
    }

后端项目目录调整

# 目录调整成如下结构:

├── luffy_api
    ├── logs/                # 项目运行时/开发时日志目录 - 包
    ├── manage.py            # 脚本文件
    ├── luffy_api/          # 项目主应用,开发时的代码保存 - 包
        ├── apps/              # 开发者的代码保存目录,以模块[子应用]为目录保存 - 包
        ├── libs/              # 第三方类库的保存目录[第三方组件、模块] - 包
        ├── settings/          # 配置目录 - 包
            ├── dev.py       # 项目开发时的本地配置
            └── prod.py      # 项目上线时的运行配置
        ├── urls.py            # 总路由
        └── utils/             # 多个模块[子应用]的公共函数类库[自己开发的组件]
    └── scripts/               # 保存项目运营 开发时的脚本文件 - 文件夹

# 创建app:需要来到apps目录下--->以后创建的app,就在apps目录下了

        cd luffy_api/apps
        python ../../manage.py startapp user


# 注册app:在配置文件中注册app名字即可

         把配置文件放到了settings下,命名为 dev.py

         需要把 apps目录,在settings中加入环境变量:     

import sys
import os
sys.path.insert(0, str(BASE_DIR))
path = os.path.join(BASE_DIR, 'apps')
sys.path.insert(0, path)

# 修改其他代码:

# manage.py 内的代码:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.dev')
# 项目上线,使用wsig.py 跑,现在先改好【目前用不到】
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.pro')
# asgi.py 也是关于项目上线,也改好【目前用不到】
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.pro')

# 如果项目不能运行了:
    用命令运行看看:python manage.py runserver

    如果不能运行,就是有问题
    如果命令能运行,绿色箭头运行不了,删除,再重新建一个即可  

创建mysql用户

# 使用mysql:
    root账号和密码,万一泄露,整个数据库就不安全了
    创建个用户,这个用户只对当前项目和库有权限
# mysql 创建用户并授权---》5.7
    1.管理员连接数据库 : mysql -uroot -p

    2.创建数据库: create database luffy default charset=utf8;

    3.查看用户: select user,host from mysql.user;

    
4.创建用户,设置权限账号密码:
        grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码'
  配置任意ip都可以连入数据库的账户
        grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
  由于数据库版本的问题,可能本地还连接不上,就给本地用户单独配置
        grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';    
   刷新权限 : flush privileges;

 如果加root用户允许远程链接:
    grant all privileges on *.* to 'root'@'%' identified by '1234';


5.使用新创建的用户,登录mysql:   mysql -uluffy -p---Luffy123?

用户表创建

# 扩写 auth的user表:

# setting/dev.py 配置用户表
AUTH_USER_MODEL = 'user.User'

# models.py
from django.db import models
from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    mobile = models.CharField(max_length=11, unique=True)
    # 需要pillow包的支持 pip install pillow
    icon = models.ImageField(upload_to='icons', default='icons/default.png')

    class Meta:
        db_table = 'luffy_user'  # 修改表名,无论哪个app里都是luffy_user
        verbose_name = '用户表'
        verbose_name_plural = verbose_name  # 在后台管理显示的表名

    def __str__(self):
        return self.username

# 迁移:一定不要忘了注册app    有可能会找不到manage.py 快捷工具
python manage.py makemigrations
python manage.py migrate

# 配置使用mysql数据库:

   直接使用mysqlclient,就不需要任何操作  pip install mysqlclient

    也可以使用pymysql,但是需要打补丁

# 保护用户名密码   os.environ,机器系统的环境变量
# 如果取不到,使用默认值
user = os.environ.get('MS_USER','luffy')
pwd = os.environ.get('MS_PWD','Luffy123?')
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'luffy',
        'USER': user,
        'PASSWORD': pwd,
        'HOST': 'localhost',
        'PORT': 3306
    }
}

导包爆红问题

#  导入路径:

已经把三个目录加入到环境变量---项目根路径,小luffy_api,apps

from luffy_api.apps.user.models import User
from apps.user.models import User
from user.models import User  #这样写没问题,但是pycharm提示错误

# 解决Pycharm 导包爆红问题:
    在文件夹上点右键,做成 source root
 # 总结
      如果在app内部,就用相对导入
      如果在app外部,就从apps路径导起---最短路径

封装logger

#  setting/dev.py  日志的配置
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            # 日志级别,时间,哪个模块,第几行,日志信息是什么
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },
    },
    # 过滤器
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        # 打印在控制台上,用的simple
        'console': {
            # 实际开发建议使用WARNING
            'level': 'DEBUG',  # 日志级别
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        # 打印在文件中,用的verbose
        'file': {
            # 实际开发建议使用ERROR
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR代表的是小luffyapi
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "luffy.log"),
            # 日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose',
            # 文件内容编码
            'encoding': 'utf-8'
        },
    },
    # 日志对象
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True,  # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}
# utils/common_logger.py
import logging
logger = logging.getLogger('django')    
# 以后再用的位置:
from utils.common_logger import logger
class TestLoggerView(APIView):
    def get(self, request):
        logger.info("info级别")
        logger.error('error级别')
        return Response('测试日志')

封装全局异常处理

# utills/common_exceptions.py
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
from .common_logger import logger


def exception_handler(exc, context):
    # 只要执行到这,一定意味着程序出了异常,记录日志
    resquest = context.get('request')
    user = resquest.user.id or '未登录用户'
    path = resquest.get_full_path()
    view = str(context.get('view'))
    ip = resquest.META.get('REMOTE_ADDR')
    error = str(exc)
    logger.error('用户:[%s],访问路径:[%s],视图类是:[%s],客户端地址:[%s],出错了,错误信息是:[%s]' % (user, path, view, ip, error))  # 尽量详细

    res = drf_exception_handler(exc, context)
    # 后续咱们可以更新细粒度的区分异常:  887   886  833 分别代表什么
    if res:  # drf 异常
        detail = res.data.get('detail') or res.data or '系统异常,请稍后再试'
        return Response({'code': 999, 'msg': detail})
    else:  # 非drf异常
        return Response({'code': 888, 'msg': '系统异常:%s' % str(exc)})
# setting/dev.py   全局异常处理
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utills.common_exceptions.exception_handler',
}

总配置文件dev.py

from pathlib import Path
import os
import sys

# BASE_DIR已经不是项目根路径了--->项目路径下的luffy_api
BASE_DIR = Path(__file__).resolve().parent.parent

# 把小luffy_api目录加入环境变量
sys.path.insert(0, str(BASE_DIR))

# 把apps目录加入环境变量
path = os.path.join(BASE_DIR, 'apps')
sys.path.insert(0, path)

SECRET_KEY = 'django-insecure-ulid+q0&6jc&*+hdz*)ruv_j4$a3_mhz3635qpq8)2_1)3au(t'

DEBUG = True

ALLOWED_HOSTS = []

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'user',
    'home',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'luffy_api.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates']
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'luffy_api.wsgi.application'

# 保护用户名密码
user = os.environ.get('MS_USER', 'luffy')
pwd = os.environ.get('MS_PWD', 'Luffy123?')
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'luffy',
        'USER': user,
        'PASSWORD': pwd,
        'HOST': 'localhost',
        'PORT': 3306,
    }
}

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

STATIC_URL = '/static/'

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

# 配置用户表
AUTH_USER_MODEL = 'user.User'

# 日志的配置
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            # 日志级别     时间         哪个模块     第几行    日志信息是什么
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },
    },
    # 过滤器
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        # 打印在控制台上,用的simple
        'console': {
            # 实际开发建议使用WARNING
            'level': 'DEBUG',  # 日志级别
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        # 打印在文件中,用的verbose
        'file': {
            # 实际开发建议使用ERROR
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR代表的是小luffyapi
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "luffy.log"),
            # 日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose',
            # 文件内容编码
            'encoding': 'utf-8'
        },
    },
    # 日志对象
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True,  # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}


# 全局异常处理
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utills.common_exceptions.exception_handler',
}

今日思维导图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/331986.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

让代码运行得更快:深入理解进程、线程和协程

让代码运行得更快:深入理解进程、线程和协程 什么是执行体 在深入探讨进程、线程和协程之前,我想先介绍下执行体这个概念。 执行体这个词语是我从七牛云创始人许式伟大佬的专栏中学到的,它代表操作系统中程序执行的载体,涉及到…

makefile,make,gcc/g++ 编译流程分析

文章目录 makefile,make,gcc/g 编译流程分析 makefile,make,gcc/g 编译流程分析 C实现加减乘除四个运算 // // Created by qiufh on 2024-01-17. //#include "add.h"int add(int a, int b) {return a b; } // // Cre…

C++的命名空间域

一、域作用限定符 :: 即是域作用限定符,它的作用是指明一个标识符(变量、函数或类)来自哪一个作用域范围 二、编译器搜索变量、函数等的原则 1.先搜索局部变量,2.再搜索全局变量,3.最后搜索指定的命名空间域 三、…

python数字图像处理基础(十)——背景建模

目录 背景建模背景消除-帧差法混合高斯模型 背景建模 背景建模是计算机视觉和图像处理中的一项关键技术,用于提取视频中的前景对象。在视频监控、运动检测和行为分析等领域中,背景建模被广泛应用。其基本思想是通过对视频序列中的像素进行建模&#xff…

构建中国人自己的私人GPT—限时免费部署

在现实生活中,很多公司或个人的资料是不愿意公布在互联网上的,但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢?于是我们构建自己或公司的本地专属GPT变得非常重要。 先看效果: 解方程,24小…

用友GRP-U8 obr_zdybxd_check.jsp SQL注入漏洞复现

0x01 产品简介 用友GRP-U8R10行政事业内控管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友GRP-U8R10行政事业内控管理软件 obr_zdybxd_check.jsp 接口处存在SQL注入漏洞…

day-13 拿出最少数目的魔法豆

思路 将beans的每个数值当做袋子最后豆子剩余数,选择取豆子最少的一种方案 解题方法 //从小到大,将每个beans[i]作为剩余豆子数 //对于beans[i],i之前的全为零,i之后的全变为beans[i] ansMath.min(ans,sum-(beans.length-i)*bean…

esp32-idf eclipse 定时器的使用demo

esp32定时器的使用demo 1、介绍 ESP32芯片包含两个硬件定时器组。每组有两个通用硬件定时器。它们都是基于16位预分频器和64位自动重载功能的向上向下计数器的64位通用定时器。 2、API接口函数 创建定时器函数: esp_timer_create(); esp_err_t esp_timer_create …

动态pv(nfs方式挂载)

1、定义 发布pvc之后可以生成pv,还可以在共享服务器上直接生成挂载目录 pvc直接绑定和使用pv 2、动态pv依赖两个组件 (1)provisioner卷插件:k8s本身支持的动态pv创建不包括nfs,需要声明和安装一个外部插件provisio…

16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating

16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating ability_main.xml <?xml version"1.0" encoding"utf-8"?> <DirectionalLayoutxmlns:ohos"http://schemas.huawei.com/res/ohos"ohos:height"match_parent"oh…

「优选算法刷题」:盛最多水的容器

一、题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器…

第29关 阿里云开源的k8s容器秒级事件监控软件-Kube-eventer

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。这节课给大家分析一款K8S上宝藏级秒级事件监控报警的开源软件kube-eventer&#xff0c;它是由阿里云开源的&#xff0c;并且难得的还一直有在更新。 天下武功&#xff0c;唯快不破。对于报警监…

ClickHouse学习笔记(六):ClickHouse物化视图使用

文章目录 1、ClickHouse 物化视图2、物化视图 vs 普通视图3、物化视图的优缺点4、物化视图的用法4.1、基本语法4.2、准备表结构4.3、准备数据4.4、查询结果 1、ClickHouse 物化视图 ClickHouse 的物化视图是一种查询结果的持久化&#xff0c;它的存在是为了带来查询效率的提升…

鸿蒙OS4.0兼容性测试

背景 OpenHarmony兼容性测评主要是验证合作伙伴的设备和业务应用满足OpenHarmony开源兼容性定义的技术要求&#xff0c;确保运行在OpenHarmony上的设备和业务应用能稳定、正常运行&#xff0c;同时使用OpenHarmony的设备和业务应用有一致性的接口和业务体验。 OpenHarmony兼容…

MySQL存储函数和存储过程练习题

一、创建表的要求 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 name VARCHAR(50) …

Peter:经济形势不好,一个最大的原因就是诚信道德的缺失 | 程客有话说002

《程客有话说》是我们最新推出的一个访谈栏目&#xff0c;邀请了一些国内外有趣的程序员来分享他们的经验、观点与成长故事&#xff0c;我们尝试建立一个程序员交流与学习的平台&#xff0c;也欢迎大家推荐朋友或自己来参加我们的节目&#xff0c;一起加油。本期我们邀请的程序…

【前端设计】输入框

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 html <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

python数字图像处理基础(六)——模板匹配、直方图

目录 模板匹配概念单对象模板匹配多对象模板匹配 直方图1.查找直方图2.绘制直方图3.掩膜的应用 模板匹配 概念 模板匹配和卷积原理很像&#xff0c;模板在原图像上从原点开始滑动&#xff0c;计算模板与图像被模板覆盖的地方的差别程度&#xff0c;这个差别程度的计算方法在o…

基于WEKWS模型的语音唤醒关键词识别

一、模型描述 1.1 论文解读 本文所使用的模型网络结构继承自论文《Compact Feedforward Sequential Memory Networks for Small-footprint Keyword Spotting》&#xff0c;文中研究了将低秩矩阵分解与传统FSMN相结合的紧凑型前馈顺序记忆网络&#xff08;cFSMN&#xff09;用…

中北数据结构2023真题

雪雾: 设计一个算法&#xff0c;将一个节点值为自然数的单列表拆分成两个单列表&#xff0c;原表中值为偶数的节点保留&#xff0c;而值为奇数的节点&#xff0c;按他们在原表的相对次序组成一个新的单列表 #include <stdio.h> #include <stdlib.h>typedef struct…