路飞之-后台日志封装-前后端分离的rbac项目演示-全局异常处理封装-封装Response-luffy数据库创建-软件开发模式-User模块用户表-django的配置文件-开启media访问

今日内容概要

  • 1 后台日志封装

  • 2 前后端分离的rbac项目演示

  • 3 全局异常处理封装

  • 4 luffy数据库创建

    • 4.1 创建用户创建库
    • 4.2 使用项目连接库
  • 5 软件开发模式

  • 6 User模块用户表

  • 7 django的配置文件

  • 8 开启media访问

今日内容详细

1 后台日志封装

# 以后 项目肯定要记录日志
日志都可以打印到控制台
日志都可以写到日志文件中
日志存到某个库中
所有项目日志统一管理 sentry:django写到服务 手机日志的 可以展开 开源 # 以后 在项目中不要出现print 以后都用日志 logger.info() 以后项目上线 只需要调整日志级别 低级别的日志就不打印了 于是日志输出不用删掉 # 操作步骤:django中集成日志步骤 django使用的就是python内置的日志模块
第一步:在配置稳健者加入 日志配置 ---大字典
详情见项目配置文件
第二步:在utils新建 common_logger.py 得到日志对象
import logging
logger = logging.getLogger('django')
第三步:在任意想用日志的地方 导入使用即可
from utils.common_logger import logger
logger.info('info级别的日志')
logger.error('error级别的日志')
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': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': {
# 实际开发建议使用ERROR
'level': 'WARNING',
'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 前后端分离的rbac项目演示

# 后台:https://gitee.com/liuqingzheng/rbac_manager
# 前端:https://gitee.com/liuqingzheng/vue_admin

3 全局异常处理封装

# 前端 要接收的格式 要统一 无论后端是否出错

# 三大认证 视图类的方法中只要出现了异常 就会执行一个函数 但是这个函数只能处理drf的异常---> 我们需要自己写个函数 既能处理drf异常 又能处理django异常 这样统一返回格式 前端看到格式都统一了

# 使用步骤
第一步:在utils中新建common_exceptions.py
第二步:写个函数
第三步:配置配置文件 以后只要出现了异常 都会走咱们的函数
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'utils.common_exceptions.exception_handler',
}
第四步:勇敢大胆写代码 即便报错 程序不会崩 并且会记录日志 并且处理成统一格式
# 测试异常是否能正常处理
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.exceptions import APIException class TestException(APIView):
def get(self, request):
# drf 异常
# raise APIException('drf抛出异常') # 未知错误
# l = [1,22, 5455]
# print(l[7]) # django主动抛错误
# raise Exception('出错了')
return Response('ok')
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
from utils.common_logger import logger # 只要走到这个函数中,一定是出异常了,所以要记录日志
def exception_handler(exc, context):
# 1 记录日志 : 哪个ip地址,用户id是多少,访问哪个路径,执行哪个视图函数,出了什么错
request = context.get('request')
view = context.get('view')
ip = request.META.get('REMOTE_ADDR')
user_id = request.user.pk
path = request.get_full_path()
response = drf_exception_handler(exc, context)
if response:
logger.warning('drf出了异常,异常是:%s' % str(exc))
# drf的异常已经处理了--->直接取detail 会有点小小的问题,碰到再解决
res = Response({'code': 999, 'msg': response.data.get('detail', '服务器异常,请联系系统管理员')})
else:
# djagno的异常,咱们要处理
logger.error('用户【%s】,ip地址为【%s】,访问地址为【%s】,执行视图函数为【%s】,出错是【%s】' % (user_id, ip, path, str(view), str(exc)))
res = Response({'code': 888, 'msg': '服务器异常,请联系系统管理员'}) return res

4 封装Response

# 本身drf有Response 但是咱们公司规定 前端收到的格式都是固定的
-{code:100,msg:提示,data:{}/[]}
-{code:100,msg:提示,token:asdfasd,user:lqz} # 对Response进行封装 封装后 code msg可以不传 不传就用默认的 # 使用步骤
第一步:在utils下新建common_response.py
第二步:封装APIResponse
第三步:导入使用 视图函数的方法 返回时 都使用咱们自己的
class APIResponse(Response):
def __init__(self, code=100, msg='成功', status=None, headers=None, **kwargs):
data = {'code': code, 'msg': msg}
if kwargs: # 有值,说明,传了 除了code msg status headers 以外的,咱们都要返回给前端,放到这个data中
data.update(kwargs)
# Response(data=data,status=status,headers=headers)
super().__init__(data=data, status=status, headers=headers) # 不要return,你可以这样做 self.data=data self.status=status

5 luffy数据库创建

5.1 创建用户创建库

# 数据库尽量使用双数 好用
# 路飞项目此处使用5.7.28
http://c.biancheng.net/view/2412.html # 因为28是低版本 这个适用
# 创建luffy数据库
# 之前项目操作数据库 都是使用root用户 root用户权限太高了 我们一般不会使用root
# 如果开发人员是root权限 数据安全性会很差 # 开发人员 专门创建一个用户 用户只对当前项目的库有操作权限 # 创建一个luffy库 创建luffy用户 luffy用户只对luffy库有操作权限 # 创建luffy数据库
"""
1.管理员连接数据库
>: mysql -uroot -proot 2.创建数据库
>: create database luffy default charset=utf8; 3.查看用户
>: select user,host,password from mysql.user;
只有root用户,要创建luffy用户 # 5.7往后的版本
>: select user,host,authentication_string from mysql.user;
""" #创建路飞用户,授予luffy库所有权限
"""
设置权限账号密码
# 授权账号命令:grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码' 1.配置任意ip都可以连入数据库的账户
>: grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?'; 2.由于数据库版本的问题,可能本地还连接不上,就给本地用户单独配置
>: grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?'; 3.刷新一下权限
>: flush privileges; 只能操作luffy数据库的账户
账号:luffy
密码:Luffy123?
"""

面试题:utf8 utf8mb4 有什么区别

# utf8:
一个字符,占两个字节(byte--->1个byte是8个比特位 10101010),有些生僻字存不了
# utf8mb4:
一个字符,占4个字节,可以存储表情符号(占四个字节)、生僻字 # utf-8编码 和 mysql的utf8 不是一个东西:
咱们学的utf-8是可变长的,1到4字节表示一个字符,而mysql的utf8是固定占两个字节。 # 说明
增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。 理论上讲, UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。

5.2 使用项目连接库

# 项目操作mysql,需要安装模块
-pymysql
-mysqlDB
-mysqlclient -历史:原来py2上有个操作mysql的模块叫mysqlDB,但到py3,没有支持py3,django默认使用这个模块去连接mysql,默认使用-mysqlDB连接,-mysqlDB不支持py3,运行报错
-我们使用pymysql,作为连接mysql的数据库模块,但是需要加代码
imprort pymysql
pymysql.install_as_mysqldb() # 猴子补丁 -django 2.2.2以后,还使用pymysql,需要改djagno源代码 -统一使用mysqlclient来作为操作mysql的底层库
-基于py2的mysqldb,在py3上重新了,但是名字改成了mysqlclient
-使用mysqlclient,只需要安装这个模块,不需要再写任何代码,直接用即可 -但是:mysqlclient 这个模块,不好装
-win 一般人品好,人品好,pip install mysqlclient
-人品不好,装不了,centos部署项目,后面会讲centos上如何装 # mysqlclient
pip install mysqlclient ###### 配置文件修改,连接mysql,使用路飞用户 # 用户名密码写死在代码中了,保证安全
name = os.environ.get('LUFFY_NAME', 'luffy')
password = os.environ.get('LUFFY_PASSWORD', 'Luffy123?')
# 拓展:有的公司,直接有个配置中心---》服务--》只用来存放配置文件 DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'luffy',
'USER': name,
'PASSWORD': password,
'HOST': '127.0.0.1',
'PORT': 3306
}
}

6 软件开发模式

# 瀑布模式:bbs项目就是按照这种模式
-需求分析---》设计--》创建数据库 所有都创建---》开发(3个月)---》交给测试--》测试通过---》上线 # 敏捷开发
-需求分析---》设计---》只设计一个板块---》开发(2周)---》交给测试---》运维上线(测试环境)
-设计---》只设计一个板块---》开发(2周)---》交给测试---》运维上线(测试环境) -一个sprint周期
-scrum敏捷项目管理

7 User模块用户表

# 自定义用户表配置
AUTH_USER_MODEL = 'home.User'
# 你决定用auth表扩写 项目一定不要先迁移 先建好用户表再迁移
已经迁移完了,再想用auth的user表
-删库,删迁移文件所有app
# 你决定使用auth表扩写,项目一定不要先迁移,先建好用户表再迁移
已经迁移完了,再想用auth的user表
-删库,删迁移文件所有app
-删admin和auth的迁移文件 # 用户表使用auth表扩写 pip install Pillow
class User(AbstractUser):
# 扩写手机号和头像字段
mobile = models.CharField(max_length=11, unique=True)
# 需要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 # 遇到的问题,明明小luffyapi已经加入到环境变量,程序运行没问题,但是表迁移,就报错,找不到模块
-打印了看一下,确实环境变量有,但是不是个字符串,是个对象
-程序运行,是没问题
-迁移有问题:配置文件中转成字符串,就解决了
-删admin和auth的迁移文件

8 django的配置文件

# pathlib  # 3.6 以后 处理文件路径的模块 原来是os

# 面试题 md5是对称加密还是非对称加密
对称加密:加密的秘钥和解密的秘钥是同一个
非对称加密:加密使用公钥加密 解密使用私钥解密 使用公钥是不能解密的
摘要算法:没有解密一说 # 运行django 0.0.0.0上 局域网内 所有人都能访问
from pathlib import Path
import os
import sys # 项目根路径
# 我们就是要让小路飞路径作为项目根路径
BASE_DIR = Path(__file__).resolve().parent.parent # 项目根路径, 小路飞luffy_api路径 D:\pythonProject03\luffy_api\luffy_api
# print(BASE_DIR)
# 把 apps 路径加入到环境变量
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
# 把BASE_DIR也加入到环境变量,以后直接从小路飞开始导起即可
sys.path.insert(0, str(BASE_DIR))
# print(sys.path)
# 以后从大路飞开始导起,或者小路飞开始导起,或者apps开始导起都可以 # 秘钥,涉及到加密的django中,都会用它
SECRET_KEY = 'django-insecure-!g(8l%fw_#t$pz$x4jdf#e3$b4+c%xzqyq@3zki08vj&i)z4k-' # 项目是以debug模式运行,还是非debug模式运行 # 项目上线,要改成false
# debug=True 代码可以热更新
# 调试模式下,对开发者更友好:可以列出所有路径.报了错,前端能看到
DEBUG = False
# 它搭配debug=False,它的意思是,允许我的项目部署在哪个ip地址上,* 表示允许部署在所有地址上
ALLOWED_HOSTS = ['*'] # django 是多个app组成的,里面配置app,默认带的app,django内置的app
# django 是一个大而全的框架,有很多内置app:
# admin后台管理,
# auth权限管理,
# contenttypes表中存app也表的关系,
# sessions session表,django的session相关
# messages:消息框架,flask讲闪现,是一样的东西
# staticfiles:静态资源的 INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # 'luffy_api.apps.home', # luffy_api在环境变量,直接从这一层开始导起, 太长了,以后就想 注册 home
# 'luffy_api.apps.user'
'home',
'user'
] # 中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', # 安全相关中间件
'django.contrib.sessions.middleware.SessionMiddleware', # session相关中间件
'django.middleware.common.CommonMiddleware', # 带不带 / 问题
'django.middleware.csrf.CsrfViewMiddleware', # csrf 认证,生成csrf串
'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',
],
},
},
] # 项目运行的配置---》项目上线运行,使用uwsgi 运行 application()
WSGI_APPLICATION = 'luffy_api.wsgi.application' # 用户名密码写死在代码中了,保证安全
name = os.environ.get('LUFFY_NAME', 'luffy')
password = os.environ.get('LUFFY_PASSWORD', 'Luffy123?')
# 拓展:有的公司,直接有个配置中心---》服务--》只用来存放配置文件 # 数据库配置,mysql 主从搭建完,读写分离
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'luffy',
'USER': name,
'PASSWORD': password,
'HOST': '127.0.0.1',
'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 = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False # 静态资源
STATIC_URL = '/static/' #
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

9 开启media访问

# 配置文件中加入
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # 总路由中设置
# re_path('^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT})
path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT}) # 访问http://127.0.0.1:8000/media/icon/default.png即可拿到暴露文件 # 以后使用django的配置文件都用这个
from django.conf import settings

扩展

# 期终架构相关
前端---> 看人家开源的前端项目 看不懂
第一种情况 vue+java---> 分析有哪些接口 drf复现出来
第二种情况:你新建前端项目 你看到它哪个页面好看 copy只要里面的template和style
js东西自己写 # https://zhuanlan.zhihu.com/p/370167569 # windows安装 mysql 5.7
https://zhuanlan.zhihu.com/p/571585588

5.7mysql下载安装

# 1 地址:https://downloads.mysql.com/archives/community/

# 2 解压并创建配置文件 创建数据目录
# 1 将下载的压缩包解压
# 2 在bin目录同级下创建一个文件,命名为my.ini
# 3 在bin目录同级下创建一个文件夹,命名为data

# 3 编辑配置文件my.ini
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录 ---这里输入你安装的文件路径----
basedir=D:\mysql-8.0.28-winx64\mysql-8.0.28-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql-8.0.28-winx64\mysql-8.0.28-winx64\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为utf8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
# 4 安装mysql 配置服务
# 来到mysql解压后的bin路径下(以管理员身份运行)

# 安装mysql 安装完成后Mysql会有一个随机密码(记住这个密码)
mysqld --initialize --console

# 把mysql创建成系统服务
mysqld --install mysql

# 启动mysql服务
net start mysql
# 如果使用上述方式无法创建服务可以使用如下方式
# 如果使用上述方式无法创建服务可以使用如下方式
# 创建系统服务
sc create mysql binpath= "D:\mysql-8.0.28-winx64\mysql-8.0.28-winx64\bin\mysqld --defaults-file=D:\mysql-8.0.28-winx64\mysql-8.0.28-winx64\\my.ini" start= auto displayname= "mysql8"
# sc create mysql binpath= "D:\mysql-8.0.28-winx64\mysql-8.0.28-winx64\bin\mysqld"

# 删除系统服务
sc delete mysql
# 5 登录修改密码
# 登录(服务启动才能登录)
mysql -uroot -p
# 输入刚刚上面生成的随机密码

# 修改密码(8.0以后)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'lqz123?';

# 修改密码(5.7)
SET PASSWORD FOR 'root'@'localhost'= "lqz123?";
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'lqz123?' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# 6 忘记root密码修改方式
## 1 以系统管理员身份运行cmd.

## 2 查看mysql是否已经启动,如果已经启动,就停止:net stop mysql.

## 3 切换到MySQL安装路径下:D:\mysql-8.0.28-winx64\mysql-8.0.28-winx64\bin;如果已经配了环境变量,可以不用切换了。

## 4 在命令行输入:mysqld -nt --skip-grant-tables

## 5 以管理员身份重新启动一个cmd命令窗口,输入:mysql -uroot -p,Enter进入数据库。

## 6 如果不想改密码,只是想看原来的密码的话,可以在命令行执行这个语句
select host,user,password from mysql.user; # 即可查看到用户和密码

## 7 如果要修改密码的话,在命令行下 依次 执行下面的语句
use mysql
update user set password=password("new_pass") where user="root"; # 'new_pass' 这里改为你要设置的密码
flush privileges;
quit

## 8 重新启动MYSQL,输入密码登录即可!

## 9 mysql -u root -p 输入密码试试吧

补充

# 国际化
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

路飞之-后台日志封装-前后端分离的rbac项目演示-全局异常处理封装-封装Response-luffy数据库创建-软件开发模式-User模块用户表-django的配置文件-开启media访问的更多相关文章

  1. springBoot 搭建web项目(前后端分离,附项目源代码地址)

    springBoot 搭建web项目(前后端分离,附项目源代码地址)   概述 该项目包含springBoot-example-ui 和 springBoot-example,分别为前端与后端,前后端 ...

  2. 在前后端分离的SpringBoot项目中集成Shiro权限框架

    参考[1].在前后端分离的SpringBoot项目中集成Shiro权限框架 参考[2]. Springboot + Vue + shiro 实现前后端分离.权限控制   以及跨域的问题也有涉及

  3. 基于Spring Boot+Spring Security+JWT+Vue前后端分离的开源项目

    一.前言 最近整合Spring Boot+Spring Security+JWT+Vue 完成了一套前后端分离的基础项目,这里把它开源出来分享给有需要的小伙伴们 功能很简单,单点登录,前后端动态权限配 ...

  4. 前后端分离之前端项目构建(grunt+require+angular)

    前言 前段时间做了一个项目,前端开发页面,然后把代码给到后端同学,后端同学通过vm再来渲染页面.后来才发现,这种方式简直是太low了,因为前端代码在服务端同学那里,每次前端需要更改的时候都需要去到服务 ...

  5. idea前后端分离搭建 JavaWeb项目

    我们小组在开发的时候, 承诺了前后端分离, 那么就要求前端和后端需要分开搭建. 不能同时放在一个工程项目中. 大致的思路是开启两个Tomcat, 一个跑前端页面, 一个跑后端程序. 1. idea打开 ...

  6. Vue+Spring Boot 前后端分离的商城项目开源啦!

    新蜂商城 Vue 移动端版本开源啦! 去年开源新蜂商城项目后,就一直在计划这个项目 Vue 版本的改造,2020 年开始开发并且自己私下一直在测试,之前也有文章介绍过测试过程和存在的问题,修改完成后, ...

  7. 分享一个前后端分离的web项目(vue+spring boot)

    Github地址:https://github.com/smallsnail-wh 前端项目名为wh-web 后端项目名为wh-server 项目展示地址为我的github pages(https:/ ...

  8. vue+egg.js+mysql一个前后端分离留言板项目

    一.前序 我相信每个人前端搬运工和我想法都是一样的,都有一个做全栈的梦,无奈面对众多的后台语言,却不从下手,今天由我来带你们潜入全栈的门槛,注意是门槛.能不能学的会后面的内容全靠坚持了. 我今天主要做 ...

  9. jenkins部署前后端分离的vue项目

    1 General Name: 变量名. 类似给分支起一个名字的意思, 可随意取 Description: 描述, 非必填 Parameter Type: 选择 Branch or Tag Defau ...

  10. REST风格框架实战:从MVC到前后端分离(附完整Demo)

    既然MVC模式这么好,难道它就没有不足的地方吗?我认为MVC至少有以下三点不足:(1)每次请求必须经过“控制器->模型->视图”这个流程,用户才能看到最终的展现的界面,这个过程似乎有些复杂 ...

随机推荐

  1. 我让 ChatGPT 写了个 ChatGPT

    这家伙实在是火得过头了,索性讲个它的故事. 去年11月份,OpenAI 推出了 ChatGPT.  这里就不赘述这个家喻户晓玩意的常识了. 要说刚开始也没多少人在意,一个聊天机器人-- 谁稀罕呐. 但 ...

  2. Channel和Stream的单双向问题

    stream分为input和output,为单向. channel为双向,可以write也可以read,但是通过inputstream或者outputstream获取的channle并不能实现双向的数 ...

  3. PHY状态机分析

    PHY的12种状态 enum phy_state { PHY_DOWN = 0, //关闭网卡 PHY_STARTING, //PHY设备准备好了,PHY driver尚为准备好 PHY_READY, ...

  4. zerologon复现

    zerologon漏洞复现 目录 zerologon漏洞复现 漏洞介绍 实验环境 实验开始 一.在github上下载脚本 二.检测是否可以利用 三.利用漏洞 1.清空域控账号密码 2.导出admin凭 ...

  5. 通过 Blob 创建下载文件

    Blob 如上图所示,Blob 对象有三个部分组成,data:image/jpeg 表示该 Blob 是什么类型的文件.base64 是一个二进制到文本的编码,更多细节查看Base64 编码/解码.其 ...

  6. Postgresql 定制执行计划pg_hint_plan

    一.概述 Plan Hint是PG社区官方版"永远"不考虑引入的功能之一,社区开发者的理念是,引入Hint功能,会掩盖优化器本身的问题,导致缺陷不被暴露出来.但对于使用者来讲,遇到 ...

  7. because another server process exited abnormally and possibly corrupted shared memory

    一.环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:4.1.1   二.症状 Red Hat 7.2操作系统部署HGDB 4.1.1后,日志经常出 ...

  8. 域名_服务器_IP之间的关系

    目的: 近期在搞A服务器和云服务器,以及正式环境的B服务器的时候,多次搞不清楚域名,IP的关系. 现在理解看来: IP 分为内网和外网的,以A为例,A是内网的IP,然后申请下来的外网IP是B(还真忘了 ...

  9. python sys.argv(全局文本索引替换)

    #利用sys.argv(实现从程序外部向程序传递参数.)写一个脚本.#全局替换(old_str to new_str,filename)import sys #导入sys模块print(sys.arg ...

  10. 【5】java之日期处理类

    一.Date 类 ​ 在 Java 里提供有一个 java.util.Date 类,可以直接获取当前的日期时间. 范例:获取当前的日期时间 public class TestDemo { public ...