增加develop相关
This commit is contained in:
parent
680a0dceeb
commit
a3cb4bb34c
|
@ -0,0 +1,3 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
|
@ -0,0 +1,5 @@
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class DevelopConfig(AppConfig):
|
||||||
|
name = 'apps.develop'
|
|
@ -0,0 +1,3 @@
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# Create your models here.
|
|
@ -0,0 +1 @@
|
||||||
|
from rest_framework import serializers
|
|
@ -0,0 +1,44 @@
|
||||||
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
from distutils import command
|
||||||
|
from rest_framework.response import Response
|
||||||
|
from celery import shared_task
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
from server.settings import DATABASES, BACKUP_PATH, SH_PATH, SD_PWD
|
||||||
|
|
||||||
|
@shared_task
|
||||||
|
def backup_database():
|
||||||
|
"""
|
||||||
|
备份数据库
|
||||||
|
"""
|
||||||
|
import datetime
|
||||||
|
name = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
|
||||||
|
command = 'echo "{}" | sudo -S pg_dump "user={} password={} dbname={}" > {}/hberp_{}.sql'.format(
|
||||||
|
SD_PWD,
|
||||||
|
DATABASES['default']['USER'],
|
||||||
|
DATABASES['default']['PASSWORD'],
|
||||||
|
DATABASES['default']['NAME'],
|
||||||
|
BACKUP_PATH + '/database',
|
||||||
|
name)
|
||||||
|
completed = subprocess.run(command, shell=True, capture_output=True, text=True)
|
||||||
|
return completed
|
||||||
|
|
||||||
|
@shared_task
|
||||||
|
def reload_server_git():
|
||||||
|
command = 'bash {}/git_server.sh'.format(SH_PATH)
|
||||||
|
completed = subprocess.run(command, shell=True, capture_output=True, text=True)
|
||||||
|
return completed
|
||||||
|
|
||||||
|
@shared_task
|
||||||
|
def reload_server_only():
|
||||||
|
command = 'echo "{}" | sudo -S service supervisor reload'.format(SD_PWD)
|
||||||
|
completed = subprocess.run(command, shell=True, capture_output=True, text=True)
|
||||||
|
return completed
|
||||||
|
|
||||||
|
@shared_task
|
||||||
|
def backup_media():
|
||||||
|
command = 'bash {}/backup_media.sh'.format(SH_PATH)
|
||||||
|
completed = subprocess.run(command, shell=True, capture_output=True, text=True)
|
||||||
|
return completed
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
|
@ -0,0 +1,13 @@
|
||||||
|
from django.db.models import base
|
||||||
|
from rest_framework import urlpatterns
|
||||||
|
from django.urls import path, include
|
||||||
|
from rest_framework.routers import DefaultRouter
|
||||||
|
from apps.develop.views import BackupDatabase, BackupMedia, ReloadServerGit, ReloadServerOnly
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('reload_server_git/', ReloadServerGit.as_view()),
|
||||||
|
path('reload_server_only/', ReloadServerOnly.as_view()),
|
||||||
|
path('backup_database/', BackupDatabase.as_view()),
|
||||||
|
path('backup_media/', BackupMedia.as_view())
|
||||||
|
]
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
from django.db import transaction
|
||||||
|
from django.shortcuts import render
|
||||||
|
from rest_framework.decorators import permission_classes
|
||||||
|
from rest_framework.views import APIView
|
||||||
|
from rest_framework.permissions import IsAdminUser, AllowAny
|
||||||
|
from rest_framework.response import Response
|
||||||
|
from apps.develop.tasks import backup_database, backup_media, reload_server_git, reload_server_only
|
||||||
|
from rest_framework.exceptions import APIException
|
||||||
|
# Create your views here.
|
||||||
|
|
||||||
|
|
||||||
|
class ReloadServerGit(APIView):
|
||||||
|
permission_classes = [IsAdminUser]
|
||||||
|
def post(self, request):
|
||||||
|
"""
|
||||||
|
拉取代码并重启服务
|
||||||
|
"""
|
||||||
|
completed = reload_server_git()
|
||||||
|
if completed.returncode == 0:
|
||||||
|
return Response()
|
||||||
|
else:
|
||||||
|
raise APIException(completed.stdout)
|
||||||
|
|
||||||
|
class ReloadServerOnly(APIView):
|
||||||
|
permission_classes = [IsAdminUser]
|
||||||
|
def post(self, request):
|
||||||
|
"""
|
||||||
|
仅重启服务
|
||||||
|
"""
|
||||||
|
completed = reload_server_only()
|
||||||
|
if completed.returncode == 0:
|
||||||
|
return Response()
|
||||||
|
else:
|
||||||
|
raise APIException(completed.stdout)
|
||||||
|
|
||||||
|
|
||||||
|
class BackupDatabase(APIView):
|
||||||
|
permission_classes = [IsAdminUser]
|
||||||
|
def post(self, request):
|
||||||
|
"""
|
||||||
|
备份数据库到指定位置
|
||||||
|
"""
|
||||||
|
completed = backup_database()
|
||||||
|
if completed.returncode == 0:
|
||||||
|
return Response()
|
||||||
|
else:
|
||||||
|
raise APIException(completed.stdout)
|
||||||
|
|
||||||
|
class BackupMedia(APIView):
|
||||||
|
permission_classes = [IsAdminUser]
|
||||||
|
def post(self, request):
|
||||||
|
"""
|
||||||
|
备份资源到指定位置
|
||||||
|
"""
|
||||||
|
completed = backup_media()
|
||||||
|
if completed.returncode == 0:
|
||||||
|
return Response()
|
||||||
|
else:
|
||||||
|
raise APIException(completed.stdout)
|
|
@ -38,6 +38,7 @@ class DrfRequestLog(BaseModel):
|
||||||
data = models.TextField(null=True, blank=True)
|
data = models.TextField(null=True, blank=True)
|
||||||
response = models.TextField(null=True, blank=True)
|
response = models.TextField(null=True, blank=True)
|
||||||
errors = models.TextField(null=True, blank=True)
|
errors = models.TextField(null=True, blank=True)
|
||||||
|
agent = models.TextField(null=True, blank=True)
|
||||||
status_code = models.PositiveIntegerField(null=True, blank=True, db_index=True)
|
status_code = models.PositiveIntegerField(null=True, blank=True, db_index=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -9,6 +9,7 @@ from server.settings import myLogger
|
||||||
from django.db import connection
|
from django.db import connection
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
from apps.utils.snowflake import idWorker
|
from apps.utils.snowflake import idWorker
|
||||||
|
from user_agents import parse
|
||||||
|
|
||||||
class CreateUpdateModelAMixin:
|
class CreateUpdateModelAMixin:
|
||||||
"""
|
"""
|
||||||
|
@ -99,9 +100,10 @@ class MyLoggingMixin(object):
|
||||||
|
|
||||||
def handle_exception(self, exc):
|
def handle_exception(self, exc):
|
||||||
response = super().handle_exception(exc)
|
response = super().handle_exception(exc)
|
||||||
err_str = traceback.format_exc()
|
if response.status_code >= 500: # 如果是服务器错误额外记录日志到文件
|
||||||
self.log["errors"] = err_str
|
err_str = traceback.format_exc()
|
||||||
myLogger.error('{}-{}'.format(self.log['request_id'], err_str))
|
self.log["errors"] = err_str
|
||||||
|
myLogger.error('{}-{}'.format(self.log['id'], err_str))
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def finalize_response(self, request, response, *args, **kwargs):
|
def finalize_response(self, request, response, *args, **kwargs):
|
||||||
|
@ -140,6 +142,7 @@ class MyLoggingMixin(object):
|
||||||
"response_ms": self._get_response_ms(),
|
"response_ms": self._get_response_ms(),
|
||||||
"response": self._clean_data(rendered_content),
|
"response": self._clean_data(rendered_content),
|
||||||
"status_code": response.status_code,
|
"status_code": response.status_code,
|
||||||
|
"agent": self._get_agent(),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
|
@ -210,6 +213,10 @@ class MyLoggingMixin(object):
|
||||||
if user.is_anonymous:
|
if user.is_anonymous:
|
||||||
return None
|
return None
|
||||||
return user
|
return user
|
||||||
|
|
||||||
|
def _get_agent(self, request):
|
||||||
|
"""Get os string"""
|
||||||
|
return str(parse(request.META['HTTP_USER_AGENT']))
|
||||||
|
|
||||||
def _get_response_ms(self):
|
def _get_response_ms(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -10,7 +10,7 @@ drf-yasg==1.20.0
|
||||||
psutil==5.9.0
|
psutil==5.9.0
|
||||||
pillow==9.0.1
|
pillow==9.0.1
|
||||||
opencv-python==4.5.5.62
|
opencv-python==4.5.5.62
|
||||||
gunicorn==20.1.0
|
daphne==3.0.2
|
||||||
redis==4.1.4
|
redis==4.1.4
|
||||||
user-agents==2.2.0
|
user-agents==2.2.0
|
||||||
daphne==3.0.2
|
daphne==3.0.2
|
||||||
|
|
|
@ -46,6 +46,7 @@ INSTALLED_APPS = [
|
||||||
'drf_yasg',
|
'drf_yasg',
|
||||||
'rest_framework',
|
'rest_framework',
|
||||||
"django_filters",
|
"django_filters",
|
||||||
|
'apps.develop',
|
||||||
'apps.utils',
|
'apps.utils',
|
||||||
'apps.third',
|
'apps.third',
|
||||||
'apps.system',
|
'apps.system',
|
||||||
|
@ -294,14 +295,14 @@ LOGGING = {
|
||||||
},
|
},
|
||||||
# log 调用时需要当作参数传入
|
# log 调用时需要当作参数传入
|
||||||
'log': {
|
'log': {
|
||||||
'handlers': ['error', 'info', 'console', 'default'],
|
'handlers': ['error', 'info'],
|
||||||
'level': 'INFO',
|
'level': 'INFO',
|
||||||
'propagate': True
|
'propagate': True
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# 实例化myLogger
|
# 实例化myLogger
|
||||||
myLogger = logging.getLogger(__name__)
|
myLogger = logging.getLogger('log')
|
||||||
|
|
||||||
# 大华ICC平台
|
# 大华ICC平台
|
||||||
DAHUA_ENABLED = conf.DAHUA_ENABLED
|
DAHUA_ENABLED = conf.DAHUA_ENABLED
|
||||||
|
@ -316,4 +317,9 @@ XX_ENABLED = conf.XX_ENABLED
|
||||||
XX_BASE_URL = conf.XX_BASE_URL
|
XX_BASE_URL = conf.XX_BASE_URL
|
||||||
XX_LICENCE = conf.XX_LICENCE
|
XX_LICENCE = conf.XX_LICENCE
|
||||||
XX_USERNAME = conf.XX_USERNAME
|
XX_USERNAME = conf.XX_USERNAME
|
||||||
XX_BUILDID = conf.XX_BUILDID
|
XX_BUILDID = conf.XX_BUILDID
|
||||||
|
|
||||||
|
# 运维相关
|
||||||
|
SD_PWD = conf.SD_PWD
|
||||||
|
BACKUP_PATH = conf.BACKUP_PATH
|
||||||
|
SH_PATH = conf.SH_PATH
|
Loading…
Reference in New Issue