路飞项目--02

news2024/12/22 19:37:12

补充: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',
}

今日思维导图:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机组成与体系结构Ⅱ】虚拟存储器以及虚拟变换(实验)

实验7:虚拟存储器以及虚拟变换 一、实验目的 1:加深对虚拟存储器基本概念、基本组织结构以及基本工作原理的理解。 2:掌握页式、段式,段页式存储的原理以及地址变换的方法。 3:理解LRU与随机替换的基本思想。 二、…

easy Exsel导出

目录 一、首先引入依赖 二、然后封装一个VO 三、Controller层 四、Service实现类 引用样式 自适应列宽 自适应行高 五、测试 postman ​编辑 浏览器 异常 分配到这个任务了,写个小demo记录下,具体可参考EasyExcel官方文档 我用的是web上传…

redis数据安全(五)事务

一、概念: 1、介绍:Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命…

css实现动态水波纹效果

效果如下: 外层容器 (shop_wrap): 设置外边距 (padding) 提供一些间距和边距 圆形容器 (TheCircle): 使用相对定位 (position: relative),宽度和高度均为 180px,形成一个圆形按钮圆角半径 (border-radius) 设置为 50%&…

Linux编译器--gcc和g++使用

gcc和g使用 一、gcc/g的作用1.1 预处理1.2 编译1.3 汇编1.4 链接 二、静态库和动态库三、make/Makefile3.1 make/Makefile3.2 依赖关系和依赖方法3.3 多文件编译3.4 make原理3.5 项目清理 四、linux下的第一个小程序-进度条4.1 行缓冲区的概念4.2 \r和\n4.3 进度条代码 一、gcc…

rt-thread修改全局中断屏蔽函数,解决内核频繁关闭中断影响精密计时问题

带rtt-nano实时操作系统的小板子需要读取单总线设备,使用软件延时吧,总是由于时隙不精确,通信不稳定。按说不稳定情况也不频繁,但考虑到未来需要对上百、上千米外的单总线设备通信,开发的时候偷个懒,到应用…

Jmeter后置处理器——JSON提取器

目录 1、简介 2、使用步骤 1)添加线程组 2)添加http请求 3) 添加JSON提取器 1、简介 JSON是一种简单的数据交换格式,允许互联网应用程序快速传输数据。JSON提取器可以从JSON格式响应数据中提取数据、简化从JSON原始数据中提取特定…

《Unix环境高级编程》第三版源代码编译报错汇总(WSL)

文章目录 Error: unable to disambiguate: -dylib (did you mean --dylib ?)undefined reference to majorerror: ‘FILE’ has no member named ‘__pad’; did you mean ‘__pad5’?error: ‘FILE’ has no member named ‘_flag’; did you mean ‘_flags’?error: ‘FIL…

AAAI 2024 | TEx-Face,5秒内按需生成照片级3D人脸

本文介绍一篇来自浙江大学ReLER实验室的工作,"Controllable 3D Face Generation with Conditional Style Code Diffusion",目前该文已被AAAI 2024录用。 论文题目: Controllable 3D Face Generation with Conditional Style Code D…

(C语言)冒泡排序

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现buble_sort函数&#xff1b; void buble_sort(int arr[], int sz) {//初始化变量值&#xff1b;int i 0;//嵌套循环冒泡排序&#xff1b;//外层循环&…

adb、monkey的下载和安装

adb下载 官网网址&#xff1a;Downloads - ADB Shell 尽量不要下载最新的ADB Kits&#xff0c;因为兼容性可能不太好。 点击下载 ADB Kits 作者下载的版本是1.0.36 解压adb 到指定的目录即可。 然后把adb配置 环境变量。 检查adb是否安装成功

android 自定义八边形进度条

自定义八边形动画效果图如下 绘制步骤&#xff1a; 1.先绘制橙色底部八边形实心 2.黑色画笔绘制第二层&#xff0c;让最外层显示一条线条宽度即可 3.再用黄色画笔绘制黄色部分 4.使用渐变画笔根据当前进度绘制覆盖黄色部分 5.使用黑色画笔根据当前进度绘制刻度条 6.黑色画笔绘制…

C语言经典练习3——[NOIP2008]ISBN号码与圣诞树

前言 在学习C语言的过程中刷题是很重要的&#xff0c;俗话说眼看千遍不如手动一遍因为在真正动手去刷题的时候会暴露出更多你没有意识到的问题接下来我就为各位奉上两道我认为比较有代表性的题 1. [NOIP2008]ISBN号码 1.1 题目描述 每一本正式出版的图书都有一个ISBN号码与之对…

BKP备份寄存器读取

1.简介&#xff1a; BKP&#xff08;Backup&#xff09;备份寄存器是一种特殊的功能寄存器&#xff0c;用于存储某些设备的备份数据。这些数据通常是非常重要的&#xff0c;因此需要定期备份以防止意外丢失。 具体来说&#xff0c;BKP寄存器可以用于以下几种情况&#xff1a;…

100天精通鸿蒙从入门到跳槽——第6天:TypeScript 知识储备:类

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

保留图片原画质图片无损放大

在数字时代&#xff0c;图片的放大和缩放是常见的操作。然而&#xff0c;传统的图片放大方法往往会导致图片质量的损失&#xff0c;使得图片的细节和清晰度降低。为了解决这个问题&#xff0c;水印云推出了一项新的功能——无损放大&#xff0c;让你可以在不损失图片质量的情况…

精选100 GPTs深度解析专题

精选100 GPTs深度解析专题 背景 1月10日&#xff0c;GPT应用商店&#xff08;GPT Store&#xff09;的正式上线&#xff0c;GPT技术的应用已经呈现爆炸性增长。目前&#xff0c;市场上已经出现了超过300万种GPTs&#xff0c;应用领域涵盖图像生成、写作、效率提升、研究分析、编…

部署Sqli-labs靶场:一篇文章解析全过程

部署Sqli-labs靶场&#xff1a;一篇文章解析全过程 0x01 前言 Sqli-labs是一个在线的SQL注入练习平台&#xff0c;提供了一系列关卡供用户练习SQL注入的技巧和防范方法。在这个平台上&#xff0c;用户可以尝试注入攻击&#xff0c;并测试自己的技能和工具&#xff0c;同时也可…

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

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

CS8370错误,这是由于使用了C# 7.3中不支持的功能

目录 背景: 第一种方法: 第二种办法: 背景: 在敲代码的时候&#xff0c;程序提示报错消息提示:CS8370错误&#xff0c;那么这是什么原因导致的&#xff0c;这是由于使用了C# 7.3中不支持的功能&#xff0c;不支持该功能&#xff0c;那就是版本太低我们就需要升级更高的版本&…