前倾回顾
# 1 vue3 ref
-放在组件上 ref='myhello'
-在父组件中取 const myhello=ref()
-myhello.value.属性/方法
-在子组件上要暴露
# 2 vue3 toRefs 和toRef
-person=reactive({name:lqz,age:19})
-let {name,age}=toRefs(person)
-let name =toRef(person,'name')
return {...toRefs(person)}
return{name:ref(name),age:ref(age)}
# 3 axios 发送请求
-普通使用:安装 ,导入使用
const filmList=reactive({result:[]})
axios.get().then()
async function load(){
let response=await axios.get('')
filmList.result=response.data.results
}
-对axios封装:
-请求发出去之前
-响应回来以后
###### 封装示例
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
})
}
# 4 禅道---》项目管理软件
# 5 pip 换源
# 6 虚拟环境
-以后每个项目使用独立的一个虚拟环境
-1 装两个模块
-2 配置环境变量:
-key:value
-path:xxx;sss;ss; 以后只要在这些路径下的命令
可以在cmd的任意位置敲命令都有响应
-3 运行bat文件---》bat(批处理--》vb脚本),exe(可执行文件) win上的可执行文件
-4 使用命令创建:mkvirtualenv -p python39 虚拟环境名称
-机器上装了
python3.9:python python39 pip pip39
python3.10:python python310 pip pip310
python2.7:python python2 pip pip2
-创建了虚拟环境:系统环境里有 python3.8 和 python3.9
-创建了虚拟环境:进入虚拟环境有标签
python pip ---》虚拟环境的
python3.8---》系统的python3.8
-5 命令:
mkvirtualenv -p python3 虚拟环境名称
workon 虚拟环境名字
deactivate
-6 pycharm中指定某个虚拟环境
-增加一个本地环境--》python.exe--->
# 7 创建后台项目
-在创建项目的python环境中,一定要先指定版本装django===》否则会装最新
-虚拟环境已经创建了,不用在pycharm中二次创建了,直接指定即可
今日内容
后端项目目录调整
# ### 1 目录调整成如下结构
"""
├── luffy_api
├── logs/ # 项目运行时/开发时日志目录 - 包
├── manage.py # 脚本文件
├── luffy_api/ # 项目主应用,开发时的代码保存 - 包
├── apps/ # 开发者的代码保存目录,以模块[子应用]为目录保存 - 包
├── libs/ # 第三方类库的保存目录[第三方组件、模块] - 包
├── settings/ # 配置目录 - 包
├── dev.py # 项目开发时的本地配置
└── prod.py # 项目上线时的运行配置
├── urls.py # 总路由
└── utils/ # 多个模块[子应用]的公共函数类库[自己开发的组件]
└── scripts/ # 保存项目运营 开发时的脚本文件 - 文件夹
"""
### 2 创建app,需要来到apps目录下--->以后创建的app,就在apps目录下了
cd luffy_api/apps
python ../../manage.py startapp user
### 3 注册app
-我们想,创建了app,以后只要在配置文件中注册app名字即可
-需要把 apps目录,加入环境变量
-sys.path 加入
# 在settings中加入
import sys
import os
path = os.path.join(BASE_DIR, 'luffy_api', 'apps')
sys.path.insert(0, path)
print(sys.path)
### 4 把配置文件放到了settings下,命名为dev.py
-运行项目跑不起来了---》原因是--》项目运行,需要先找到配置文件,现在找不到了
-修改 manage.py 内的代码
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.dev')
-以后项目上线,不是使用manage.py 跑,而使用wsig.py 跑,现在先改好【目前用不到】
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.pro')
-asgi.py 也改好【目前用不到】
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.pro')
## 5 配置文件改了路径,BASE_DIR也就跟着变了,不是项目根路径了,修改如下
from pathlib import Path
import sys
import os
# BASE_DIR已经不是项目根路径了---》项目路径下的 luffy_api---》把小luffy_api和apps都加入到了环境变量
# 现在环境变量里有:项目根路径,把小luffy_api和apps----》以后导入模块,可以从下面三个目录下导起
BASE_DIR = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(BASE_DIR))
path = os.path.join(BASE_DIR, 'apps')
sys.path.insert(0, path)
## 6 如果项目不能运行了
-先用命令运行看看:python manage.py runserver
-如果他也不能运行,就是有问题---》就要解决问题
-如果命令能运行,绿色箭头运行不了
-删除,再重新建一个即可
# 项目
-项目名
总路由
配置文件
wsgi
-apps
app01
app01
-libs
-utils
后端数据库创建
使用mysql
root账号和密码--->万一泄露---》整个数据库就不安全了
创建个用户,这个用户只对当前项目 库 有权限
# mysql 创建用户并授权---》5.7
1.管理员连接数据库
>: mysql -uroot -p1234
2.创建数据库
>: create database luffy default charset=utf8;
3.查看用户
>: select user,host from mysql.user;
4.创建用户 设置权限账号密码
# 授权账号命令:grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码'
4.1 配置任意ip都可以连入数据库的账户
>: grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
4.2 由于数据库版本的问题,可能本地还连接不上,就给本地用户单独配置
>: 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?
后端user表
# 用户表使用 auth的user表,现在扩写 user表
###### 1 配置使用mysql数据库
# 保护用户名密码
# os.environ # 机器系统的环境变量
# user = os.environ.get('MS_USER')
# pwd = os.environ.get('MS_PWD')
###如果取不到,用后面的
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
}
}
# 可以使用pymysql,但是需要 打补丁
# 直接使用mysqlclient,就不需要任何操作 pip install mysqlclient
#### 2 创建user表
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='icon', default='icon/default.png')
class Meta:
db_table = 'luffy_user' # 修改表名
verbose_name = '用户表'
verbose_name_plural = verbose_name
def __str__(self):
return self.username
### 3 配置文件配置
###配置用户表
AUTH_USER_MODEL = 'user.User'
###4 迁移:---一定不要忘了注册app 有可能会找不到manage.py 快捷工具
python manage.py makemigrations
python manage.py migrate
后端配置
导包爆红问题
# 1 把三个目录加入到环境变量了---》项目根路径,小luffy_api,apps
以后导入模块,可以从上述任意一个路径导入起
from luffy_api.apps.user.models import User
from apps.user.models import User
from user.models import User #这样写没问题---》但是pycharm提示错误--》让pycharm不报错
#2 解决Pycharm 导包爆红问题
-在文件夹上点右键---》做成source root
# 3 总结
# 如果在app内部,就用相对导入
# 如果在app外部,就从apps路径导起---最短路径
封装logger
# 1 项目肯定要记录日志
-logru
-python内置的logging模块---》以它为例讲
# 2 只需要按步骤配置即可
-1 配置文件加入:
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': {
'console': {
# 实际开发建议使用WARNING
'level': 'DEBUG',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'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, # 是否让日志信息继续冒泡给其他的日志处理系统
},
}
}
-2 在utils中写common_logger.py
import logging
logger = logging.getLogger('django')
-3 以后再用的位置:
from utils.common_logger import logger
class TestLoggerView(APIView):
def get(self, request):
logger.info("info级别")
logger.error('error级别')
return Response('测试日志')
封装项目异常处理
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)})
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'utils.common_exceptions.exception_handler',
}