增加develop相关

This commit is contained in:
caoqianming 2022-04-11 09:17:39 +08:00
parent 680a0dceeb
commit a3cb4bb34c
14 changed files with 152 additions and 7 deletions

0
apps/develop/__init__.py Normal file
View File

3
apps/develop/admin.py Normal file
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

5
apps/develop/apps.py Normal file
View File

@ -0,0 +1,5 @@
from django.apps import AppConfig
class DevelopConfig(AppConfig):
name = 'apps.develop'

View File

3
apps/develop/models.py Normal file
View File

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

View File

@ -0,0 +1 @@
from rest_framework import serializers

44
apps/develop/tasks.py Normal file
View File

@ -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

3
apps/develop/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

13
apps/develop/urls.py Normal file
View File

@ -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())
]

59
apps/develop/views.py Normal file
View File

@ -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)

View File

@ -38,6 +38,7 @@ class DrfRequestLog(BaseModel):
data = models.TextField(null=True, blank=True)
response = 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)
class Meta:

View File

@ -9,6 +9,7 @@ from server.settings import myLogger
from django.db import connection
from django.utils.timezone import now
from apps.utils.snowflake import idWorker
from user_agents import parse
class CreateUpdateModelAMixin:
"""
@ -99,9 +100,10 @@ class MyLoggingMixin(object):
def handle_exception(self, exc):
response = super().handle_exception(exc)
err_str = traceback.format_exc()
self.log["errors"] = err_str
myLogger.error('{}-{}'.format(self.log['request_id'], err_str))
if response.status_code >= 500: # 如果是服务器错误额外记录日志到文件
err_str = traceback.format_exc()
self.log["errors"] = err_str
myLogger.error('{}-{}'.format(self.log['id'], err_str))
return response
def finalize_response(self, request, response, *args, **kwargs):
@ -140,6 +142,7 @@ class MyLoggingMixin(object):
"response_ms": self._get_response_ms(),
"response": self._clean_data(rendered_content),
"status_code": response.status_code,
"agent": self._get_agent(),
}
)
try:
@ -210,6 +213,10 @@ class MyLoggingMixin(object):
if user.is_anonymous:
return None
return user
def _get_agent(self, request):
"""Get os string"""
return str(parse(request.META['HTTP_USER_AGENT']))
def _get_response_ms(self):
"""

View File

@ -10,7 +10,7 @@ drf-yasg==1.20.0
psutil==5.9.0
pillow==9.0.1
opencv-python==4.5.5.62
gunicorn==20.1.0
daphne==3.0.2
redis==4.1.4
user-agents==2.2.0
daphne==3.0.2

View File

@ -46,6 +46,7 @@ INSTALLED_APPS = [
'drf_yasg',
'rest_framework',
"django_filters",
'apps.develop',
'apps.utils',
'apps.third',
'apps.system',
@ -294,14 +295,14 @@ LOGGING = {
},
# log 调用时需要当作参数传入
'log': {
'handlers': ['error', 'info', 'console', 'default'],
'handlers': ['error', 'info'],
'level': 'INFO',
'propagate': True
},
}
}
# 实例化myLogger
myLogger = logging.getLogger(__name__)
myLogger = logging.getLogger('log')
# 大华ICC平台
DAHUA_ENABLED = conf.DAHUA_ENABLED
@ -316,4 +317,9 @@ XX_ENABLED = conf.XX_ENABLED
XX_BASE_URL = conf.XX_BASE_URL
XX_LICENCE = conf.XX_LICENCE
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