1 项目结构

以下主要是以drf编写api时的结构为示例。

1.1 APP结构

1.1.1 单APP

例如:订单系统

1.1.2 Base + 业务APP

例如:供应链系统

1.1.3 独立的APP

app中的功能各自独立的,每个app中编写自己的 models / views 等。

1.2 视图结构

1.2.1 view.py

1.2.2 views + 文件

根据业务拆分成多个视图文件,每个视图文件中实现指定的一些业务。

1.2.3 views + 文件夹

这里的router路由需要注意:

1.3 返回值

1.3.1 自定义mixins

将视图中的 mixins相关的视图重写,业务视图继承自己视图,对于各种情况的返回值进行定制:

1.内置返回

对于认证、权限等组件进行自定义,实现返回自定义的格式数据。

2.视图返回

对于用户请求的返回值进行定制。

1.3.2 自定义异常处理机制

在之前学习源码时,我们知道:请求到来都会执行dispatch方法,在 try...except代码块中:

  • 触发:认证、权限、限流等
  • 执行视图
  • 上述过程如果出现异常,则由 self.handle_exception(exc)对异常处理并封装返回值,然后返回。

1.handle_exception源码

2.自定义exception_handler

详细案例见:dbhot11.zip

utils/handlers.py
from django.http import Http404

from rest_framework import exceptions
from rest_framework.response import Response
from rest_framework.exceptions import ValidationError
from rest_framework.exceptions import Throttled
from rest_framework.exceptions import PermissionDenied
from rest_framework.exceptions import NotAuthenticated
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.views import set_rollback def exception_handler(exc, context):
if isinstance(exc, Http404):
exc = exceptions.NotFound()
exc.ret_code = 1001
elif isinstance(exc, PermissionDenied):
exc = exceptions.PermissionDenied()
exc.ret_code = 1002
elif isinstance(exc, (AuthenticationFailed, NotAuthenticated)):
exc.ret_code = 1003
elif isinstance(exc, Throttled):
exc.ret_code = 1004
elif isinstance(exc, ValidationError):
exc.ret_code = 1005 # 只处理drf相关的异常
if isinstance(exc, exceptions.APIException):
headers = {}
if getattr(exc, 'auth_header', None):
headers['WWW-Authenticate'] = exc.auth_header
if getattr(exc, 'wait', None):
headers['Retry-After'] = '%d' % exc.wait if isinstance(exc.detail, (list, dict)):
data = exc.detail
else:
code = getattr(exc, 'ret_code', None) or -1
data = {'code': code, 'detail': exc.detail} set_rollback()
return Response(data, status=exc.status_code, headers=headers)
return None
utils/exceptions.py
from rest_framework import exceptions

class ExtraException(exceptions.APIException):

    def __init__(self, detail=None, ret_code=None, code=None):
super().__init__(detail, code)
self.ret_code = ret_code
views.py
from rest_framework import exceptions
from rest_framework import serializers
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin
from rest_framework.mixins import CreateModelMixin, RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin
from rest_framework.authentication import BaseAuthentication
from rest_framework.permissions import BasePermission
from rest_framework.throttling import BaseThrottle from api import models
from utils.exceptions import ExtraException class ExtraAuthentication(BaseAuthentication):
def authenticate(self, request):
raise exceptions.AuthenticationFailed("认证失败") def authenticate_header(self, request):
return "api" class ExtraPermission(BasePermission):
def has_permission(self, request, view):
return False def has_object_permission(self, request, view, obj):
return False class ExtraThrottle(BaseThrottle):
def allow_request(self, request, view):
return False class DemoSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
fields = "__all__" class DemoView(ListModelMixin, CreateModelMixin, RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin,
GenericViewSet):
# authentication_classes = [ExtraAuthentication]
# throttle_classes = [ExtraThrottle]
# permission_classes = [ExtraPermission]
queryset = models.UserInfo.objects.all()
serializer_class = DemoSerializer def perform_create(self, serializer):
self.dispatch
if True:
# 自定义错误
# raise ExtraException("数据异常")
raise ExtraException("更新失败", ret_code=9000)
serializer.save() def finalize_response(self, request, response, *args, **kwargs):
response = super().finalize_response(request, response, *args, **kwargs)
if response.exception:
return response response.data = {'code': 0, 'data': response.data}
return response

3.正常返回

def finalize_response(self, request, response, *args, **kwargs):
response = super().finalize_response(request, response, *args, **kwargs)
if response.exception:
return response response.data = {'code': 0, 'data': response.data}
return response

可以通过自定义 DrfGenericViewSet

from rest_framework.viewsets import GenericViewSet as DrfGenericViewSet

class GenericViewSet(DrfGenericViewSet):
def finalize_response(self, request, response, *args, **kwargs):
response = super().finalize_response(request, response, *args, **kwargs)
if response.exception:
return response
response.data = {'code': 0, 'data': response.data}
return response

可以定义到中间件中使用:

from django.utils.deprecation import MiddlewareMixin

class ReturnCodeMiddleware(MiddlewareMixin):
def process_response(self, request, response):
if not hasattr(response, 'exception'):
return response if response.exception:
return response response.data = {'code': 0, 'data': response.data}
response._is_rendered = False
response.content = response.render().content
return response

2 事务

2.1 局部事务(*)

基于上下文管理,如果出现异常则自动回滚;无异常则自动提交。

from rest_framework.views import APIView
from rest_framework.response import Response
from django.db import transaction
from api import models class Demo1View(APIView):
def get(self, request, *args, **kwargs):
try:
with transaction.atomic():
models.UserInfo.objects.create(name='v1', age=1)
models.Order.objects.create(name='v1', age=1)
except Exception as e:
print("异常,自动回滚") return Response("...")

事务提交的回调函数(本质上就是事务完成后,自动执行一个函数):

from rest_framework.views import APIView
from rest_framework.response import Response
from django.db import transaction
from api import models
from functools import partial def db_success_callback(*args, **kwargs):
print(args, **kwargs) class Demo1View(APIView):
def get(self, request, *args, **kwargs):
try:
with transaction.atomic():
# 回调函数,事务正常提交自动执行
transaction.on_commit(db_success_callback)
transaction.on_commit( partial(db_success_callback, 11, 22, 33) ) models.UserInfo.objects.create(name='v1', age=1)
models.Order.objects.create(title='v1', count=1)
except Exception as e:
print("异常,自动回滚") # on_commit回调函数内部异常时不会回滚 return Response("...")

回滚到 指定事务点:

from rest_framework.views import APIView
from rest_framework.response import Response
from django.db import transaction
from api import models class Demo1View(APIView):
def get(self, request, *args, **kwargs):
try:
with transaction.atomic():
# 回调函数,事务正常提交自动执行
n1 = transaction.savepoint()
models.UserInfo.objects.create(name='v1', age=1)
n2 = transaction.savepoint()
models.UserInfo.objects.create(name='v2', age=1) # 必须在事务里面,回顾到指定 事务点,后续东西不提交
transaction.savepoint_rollback(n2)
except Exception as e:
print("异常,自动回滚", e) # on_commit回调函数内部异常时不会回滚 return Response("...")

2.2 视图事务

针对整个视图进行开启事务:

  • 视图内,有数据库操作异常,自动回滚
  • 视图内,有其他异常,不会回滚。
from rest_framework.views import APIView
from rest_framework.response import Response
from django.db import transaction, IntegrityError
from api import models class Demo1View(APIView): @transaction.atomic
def get(self, request, *args, **kwargs):
try:
models.UserInfo.objects.create(name='v100', age=1)
models.UserInfo.objects.create(name="v200", age="xxx") # 有异常,回滚,即:v100不会保存
int("asdf") # 有异常,不会滚,即:两条数据正常保存到数据库
except Exception as e:
pass
return Response("...")

定义事务点,自定义回滚位置:

from rest_framework.views import APIView
from rest_framework.response import Response
from django.db import transaction, IntegrityError
from api import models class Demo1View(APIView): @transaction.atomic
def get(self, request, *args, **kwargs):
try:
models.UserInfo.objects.create(name='v10', age=1)
n1 = transaction.savepoint()
models.UserInfo.objects.create(name="v11", age=1)
n2 = transaction.savepoint()
models.UserInfo.objects.create(name='v12', age=1)
n3 = transaction.savepoint()
models.UserInfo.objects.create(name='v13', age=1) # 后续读取到某些值后,发现 v12不应该创建,那么就可以主动回滚(只生成n2之前的)
transaction.savepoint_rollback(n2)
except Exception as e:
print("有异常", e)
return Response("...")

2.3 全局事务

效率低:项目中一般不会使用。

如果想要开启全局事务,需要在连接数据库时多设置一个参数:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dbhot4',
'USER': 'root',
'PASSWORD': 'root123',
'HOST': '127.0.0.1',
'PORT': '3306',
'ATOMIC_REQUESTS': True
}
}
  • 只要视图函数执行异常,无论是什么原因触发,均自动回滚。

    class Demo1View(APIView):
    def get(self, request, *args, **kwargs):
    models.UserInfo.objects.create(name='v1', age=1)
    models.UserInfo.objects.create(xxxxxxx='v2', age=1) # 错误
    return Response("...")
    class Demo1View(APIView):
    def get(self, request, *args, **kwargs):
    models.UserInfo.objects.create(name='v1', age=1)
    models.UserInfo.objects.create(name='v2', age=1)
    int("asdf") # 错误
    return Response("...")
  • 如果视图函数执行不报错(try处理异常,也叫不报错),则不会回滚

    class Demo1View(APIView):
    def get(self, request, *args, **kwargs):
    try:
    models.UserInfo.objects.create(name='v1', age=1)
    models.UserInfo.objects.create(xxxxxxx='v2', age=1)
    int("xxx")
    except Exception as e:
    pass
    return Response("...") # 视图函数执行没有报错,不会滚回。

如果开启了全局事务,想要免除某个指定的函数不需要开启事务,则可以使用:

from rest_framework.views import APIView
from rest_framework.response import Response
from django.db import transaction, IntegrityError
from api import models
from django.utils.decorators import method_decorator @method_decorator(transaction.non_atomic_requests, name='dispatch')
class Demo1View(APIView): def get(self, request, *args, **kwargs):
models.UserInfo.objects.create(name='v100', age=1)
models.UserInfo.objects.create(name="v200", age="xxx") # 报错
return Response("...")

3 Logging日志

什么时候用到日志?

  • 可预知的情况,写日志
  • 不可预知情况,写日志

3.1 基础版

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
import logging

# 1. 对日志进行配置
logging.basicConfig(
filename='error.log', # 日志文件
format='%(asctime)s : %(message)s', # 写日志时,文件的格式。
datefmt='%Y-%m-%d %H:%M:%S %p',
level=20 # 级别,以后只有大于20的级别时,才能真正日志内容写入到文件中。
) # 2.写日志
"""
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
"""
logging.debug("你好呀") # 10,你好呀
logging.info("中午好") # 10,你好呀
logging.error("你傻呀") # 40,你傻呀

默认这种形式不支持在文件中写入日志:

import logging
import traceback # 1. 对日志进行配置
logging.basicConfig(
filename='v10.log', # 日志文件
format='%(asctime)s : %(message)s', # 写日志时,文件的格式。
datefmt='%Y-%m-%d %H:%M:%S %p',
level=20 # 级别,以后只有大于20的级别时,才能真正日志内容写入到文件中。
) # 2. 对日志进行配置(不生效,因为已配置过后生成在内存,不再支持设置)
logging.basicConfig(
filename='v100.log', # 日志文件
format='%(asctime)s : %(message)s', # 写日志时,文件的格式。
datefmt='%Y-%m-%d %H:%M:%S %p',
level=20 # 级别,以后只有大于20的级别时,才能真正日志内容写入到文件中。
) logging.error("沙雕alex")

3.2 对象版(支持多文件)

  • Formatter,格式化。

  • FileHandler,维护文件,专门用于往文件中写内容。

  • Logger,定义级别,大于这个级别才调用 FileHandler 去写内容。

  • 写日志

    logger = Logger()
    logger.error("内容") # 10 "xxx"

示例1:

import logging

# 定义 Formatter
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s") # 定义 FileHandler
handler_object = logging.FileHandler('v2.log', 'a', encoding='utf-8')
handler_object.setFormatter(fmt) # 定义 Logger
logger_object = logging.Logger('s1', level=logging.INFO) # 20
logger_object.addHandler(handler_object) # ===>写日志<====
logger_object.error("alex是个大sb") # 40>20则写入日志

示例2:

import logging

# 定义 Formatter
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s") # 定义 FileHandler
handler_object = logging.FileHandler('v2.log', 'a', encoding='utf-8')
handler_object.setFormatter(fmt) handler_object2 = logging.FileHandler('v22.log', 'a', encoding='utf-8')
handler_object2.setFormatter(fmt) # 定义 Logger
logger_object = logging.Logger('s1', level=logging.INFO) # 20
logger_object.addHandler(handler_object)
logger_object.addHandler(handler_object2) # 写日志
logger_object.error("alex是个大sb")

3.3 配置版

示例1:简单配置

import logging.config

# 1. 定义字典
LOGGING_CONFIG = {
"version": 1,
"disable_existing_loggers": True, # 删除已存在其他日志的Handler
'formatters': {
'standard': {
'format': '{asctime} {levelname} :{message}',
'style': '{',
"datefmt": '%Y-%m-%d %H:%M:%S %p',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler', # 写到终端的输出流中
'formatter': 'standard', # 用到的什么格式
},
'demo': {
"class": 'logging.handlers.RotatingFileHandler', # 写到文件中
'formatter': 'standard',
'filename': 'demo.log', # 日志的文件名
'maxBytes': 1024, # 根据文件大小拆分日志
'backupCount': 30, # 5份文件
"encoding": "utf-8"
}
},
'loggers': {
'nb': {
'handlers': ['console', 'demo'],
'level': "INFO", # >=20 则触发日志
'propagate': False
}
}
} # 2. 根据自定对logging进行配置
logging.config.dictConfig(LOGGING_CONFIG) # 3. 写日志
logger_object = logging.getLogger("nb")
logger_object.info('6666666666')

示例2:多文件配置

import logging.config

# 1. 定义字典
LOGGING_CONFIG = {
"version": 1,
"disable_existing_loggers": True, # 删除已存在其他日志的Handler
'formatters': {
'standard': {
'format': '{asctime} {levelname} {threadName} :{message}',
'style': '{',
"datefmt": '%Y-%m-%d %H:%M:%S %p',
},
'simple': {
'format': '%(asctime)s %(levelname)s %(message)s',
'style': '%',
"datefmt": '%Y-%m-%d',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
'run': {
# 运行日志,按天自动分割
"class": 'logging.handlers.TimedRotatingFileHandler', # 基于时间
'formatter': 'standard',
'filename': "run.log",
'when': 'D', # 根据天拆分日志
'interval': 1, # 1天
'backupCount': 3, # 保留备份
"encoding": "utf-8"
},
'error': {
# 错误日志,按照文件大小分割
"class": 'logging.handlers.RotatingFileHandler',
'formatter': 'standard',
'filename': 'error.log',
'maxBytes': 1024 * 1025 * 50, # 根据文件大小拆分日志 50M
'backupCount': 5,
"encoding": "utf-8"
},
},
'loggers': {
'run': {
'handlers': ['run'],
'level': "INFO", # >=20 则触发日志
'propagate': True # 触发父级-->’root'
},
'error': {
'handlers': ['console', 'error'],
'level': "ERROR", # >=20 则触发日志
'propagate': False
}
},
'root': {
'handlers': ['console', ],
'level': 'DEBUG',
'propagate': True
}
} # 2. 根据自定对logging进行配置
logging.config.dictConfig(LOGGING_CONFIG) # 3. 写日志
# root = logging.getLogger()
# root.info("测试测试") # run = logging.getLogger('run')
# run.info("测试测试") # run = logging.getLogger('error')
# run.info("有信息了")
# run.error("错误了")

示例3:过滤

import logging

class CallbackFilter(logging.Filter):
def __init__(self, callback):
self.callback = callback def filter(self, record):
if self.callback(record):
return True
return False class DynamicFilter(logging.Filter):
def filter(self, record):
# record,包含了日志相关的对象 logging.LogRecord
# print(record, type(record))
if not record.msg:
return False
return True
import logging.config

# 1. 定义字典
LOGGING_CONFIG = {
"version": 1,
"disable_existing_loggers": True, # 删除已存在其他日志的Handler
'formatters': {
'standard': {
'format': '{asctime} {levelname} {threadName} :{message}',
'style': '{',
"datefmt": '%Y-%m-%d %H:%M:%S %p',
},
'simple': {
'format': '%(asctime)s %(levelname)s %(message)s',
'style': '%',
"datefmt": '%Y-%m-%d',
},
},
"filters": {
"dy": {
"()": "utils.DynamicFilter"
},
"call": {
"()": "utils.CallbackFilter",
"callback": lambda record: len(record.msg) > 4
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
'run': {
# 运行日志,按天自动分割
"class": 'logging.handlers.TimedRotatingFileHandler',
'formatter': 'standard',
'filters': ["dy", 'call'],
'filename': "run.log",
'when': 'D', # 根据天拆分日志
'interval': 1, # 1天
'backupCount': 3, # 保留备份
"encoding": "utf-8"
},
'error': {
# 错误日志,按照文件大小分割
"class": 'logging.handlers.RotatingFileHandler',
'formatter': 'standard',
'filename': 'error.log',
'maxBytes': 1024 * 1025 * 50, # 根据文件大小拆分日志 50M
'backupCount': 5,
"encoding": "utf-8"
},
},
'loggers': {
'run': {
'handlers': ['run'],
'level': "INFO", # >=20 则触发日志
'propagate': True
},
'error': {
'handlers': ['console', 'error'],
'level': "ERROR", # >=20 则触发日志
'propagate': False
}
},
'root': {
'handlers': ['console', ],
'level': 'DEBUG',
'propagate': True
}
} # 2. 根据自定对logging进行配置
logging.config.dictConfig(LOGGING_CONFIG) # 3. 写日志
run = logging.getLogger('run')
run.info("测试测xxxxx")

3.4 Django

###########
# LOGGING #
###########
import os
# BASE_LOG_DIR = BASE_DIR / 'log'
BASE_LOG_DIR = os.path.join(BASE_DIR, 'log')
BASE_LOG_DIR.mkdir(exist_ok=True) # 文件夹不存在则创建,存在不创建 # The callable to use to configure logging
LOGGING_CONFIG = "logging.config.dictConfig" # Custom logging configuration.
# 1. 定义字典
LOGGING = {
"version": 1,
"disable_existing_loggers": False, # 删除已存在其他日志的Handler
'formatters': {
'standard': {
'format': '{asctime} {levelname} {threadName} :{message}',
'style': '{',
"datefmt": '%Y-%m-%d %H:%M:%S %p',
},
'simple': {
'format': '%(asctime)s %(levelname)s %(message)s',
'style': '%',
"datefmt": '%Y-%m-%d',
},
},
# "filters": {
# "dy": {
# "()": "django.utils.log.RequireDebugFalse"
# },
# "call": {
# "()": "django.utils.log.CallbackFilter",
# "callback": lambda record: len(record.msg) > 4
# }
# },
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
'run': {
# 运行日志,按天自动分割
"class": 'logging.handlers.TimedRotatingFileHandler',
'formatter': 'standard',
# 'filters': ["dy", 'call'],
'filename': os.path.join(BASE_LOG_DIR, 'run.log'),
'when': 'D', # 根据天拆分日志
'interval': 1, # 1天
'backupCount': 3, # 保留备份
"encoding": "utf-8"
},
'error': {
# 错误日志,按照文件大小分割
"class": 'logging.handlers.RotatingFileHandler',
'formatter': 'standard',
'filename': os.path.join(BASE_LOG_DIR, 'error.log'),
'maxBytes': 1024 * 1025 * 50, # 根据文件大小拆分日志 50M
'backupCount': 5,
"encoding": "utf-8"
},
},
'loggers': {
'run': {
'handlers': ['run'],
'level': "INFO", # >=20 则触发日志
'propagate': True
},
'error': {
'handlers': ['console', 'error'],
'level': "ERROR", # >=40 则触发日志
'propagate': False
}
},
'root': {
'handlers': ['console', ],
'level': 'DEBUG',
'propagate': True
}
}
logger = logging.getLogger("error")
logger.error("...")
logger = logging.getLogger("run")
logger.info("...")
logger = logging.getLogger()
logger.info("...")

32 项目结构 & 事务 & Logging日志的更多相关文章

  1. python 项目实战之logging日志打印

    官网介绍:https://docs.python.org/2/library/logging.html 一. 基础使用 1.1 logging使用场景 日志是什么?这个不用多解释.百分之九十的程序都需 ...

  2. day23单例模式 , 日志处理 , 项目结构目录

    # day23笔记 ## 一.补充,作业 ### 1.字符串格式化 ```pythonmsg = "我是%(n1)s,年龄%(n2)s" % {'n1': 'alex', 'n2' ...

  3. SpringBoot整合Mybatis之项目结构、数据源

    已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...

  4. 微信开发准备(二)--springmvc+mybatis项目结构的搭建

    转自:http://www.cuiyongzhi.com/post/34.html 前面一篇有说道如何在MyEclipse中搭建maven项目,这里将继续介绍如何在搭建好的基础maven项目中引入我们 ...

  5. ASP.NET Core 2.0 : 三. 项目结构

    本章我们一起来对比着ASP.NET Framework版本看一下ASP.NET Core 2.0的项目结构.(此后的文章也尽量这样对比着, 方便学习理解.) 关注差异, 也为项目迁移做准备. 新建项目 ...

  6. django中介模型,CBV模型,及logging日志配制

    1.中介模型 中介模型,这个是在我们创建表格时,多对多添加的时候应用到的,通过制定ManyToManyField字段中的through参数来定义,为两者的关系新建一个中介class 为什么会产生这个中 ...

  7. Flink 源码解析 —— 项目结构一览

    Flink 源码项目结构一览 https://t.zsxq.com/MNfAYne 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...

  8. python的logging日志模块(一)

    最近修改了项目里的logging相关功能,用到了Python标准库里的logging模块,在此做一些记录.主要是从官方文档和stackoverflow上查询到的一些内容. 官方文档 技术博客 基本用法 ...

  9. 在Go语言项目中使用Zap日志库

    在Go语言项目中使用Zap日志库 本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项 ...

  10. 使用.NET 6开发TodoList应用(2)——项目结构搭建

    为了不影响阅读的体验,我把系列导航放到文章最后了,有需要的小伙伴可以直接通过导航跳转到对应的文章 : P TodoList需求简介 首先明确一下我们即将开发的这个TodoList应用都需要完成什么功能 ...

随机推荐

  1. (原创)odoo14下qweb模板的前端与后端语法区别

    1.后端(qweb打包) 后端使用t-inherit 指定继承的模板,使用t-inherit-mode 指定继承的模式,使用xpath定位标记,使用position指定扩展位置. 2.前端 前端仍旧使 ...

  2. Neural Network模型复杂度之Batch Normalization - Python实现

    背景介绍 Neural Network之模型复杂度主要取决于优化参数个数与参数变化范围. 优化参数个数可手动调节, 参数变化范围可通过正则化技术加以限制. 本文从参数变化范围出发, 以Batch No ...

  3. 性能再升级,XMeter Cloud 专业版正式上线

    去年 8 月,EMQ 正式在全球市场推出了最简单.快速的 MQTT 负载和场景测试云服务--XMeter Cloud,用户无需部署即可进行 MQTT 测试,以更低的测试成本轻松打造具有竞争力的可靠物联 ...

  4. ipmitool for windows下载网址

    ipmitool for windows版本下载网址 http://ipmiutil.sourceforge.net/

  5. 简易Map模板

    非红黑树,排序+二分搜索,查找修改O(logN),插入删除O(N) #ifndef MAP_H #define MAP_H #include "main.h" /*-------- ...

  6. oracle学习之redo

    Oracle的重做日志基本概念及原理 重做日志文件 redo log file 通常也称为日志文件,它是保证数据库安全和数据库备份与恢复的文件,是数据库安全和恢复的最基本的保障.管理员可以根据日志文集 ...

  7. 解决: 无法打开明确指定的数据库“SSISDB”, 用户 'NT Service\SSISScaleOutMaster150' 登录失败.

    环境: WindowsServer2019Datacenter  SQL Server2019  SSMSv18 事情: SQL安装完成后, 发现系统日志中有如下报错:   解决: 无法打开明确指定的 ...

  8. List<Object>转为对象

    List<Object> list = new ArrayList<>(); List<BMSQ> bmsqList = (List<BMSQ>)(Li ...

  9. map转listmap

    package com;import java.util.*;import java.util.stream.Collectors;public class LambadaTest { public ...

  10. windows环境下部署项目

    有些时候,我们的项目不得不用windows服务器部署,但是需要注意的是,windows服务是无法开启多进程处理请求的. 本文介绍如何在windows上部署flask项目,应用 apache + mod ...