前倾回顾
# 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', }
标签:py,luffy,---,02days,user,import,path From: https://www.cnblogs.com/wzh366/p/17972603