前期文件准备
时间
TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = False
缓存
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', 'TIMEOUT': 60, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期) 'OPTIONS': { 'MAX_ENTRIES': 300, # 最大缓存个数(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) }, 'KEY_PREFIX': '', # 缓存key的前缀(默认空) 'VERSION': 'v1', # 缓存key的版本(默认1) } } CACHE_MIDDLEWARE_SECONDS = 10 CACHE_MIDDLEWARE_KEY_PREFIX = ""
'django.middleware.cache.FetchFromCacheMiddleware', # 内存缓存配置缓存配置配置
'django.middleware.cache.UpdateCacheMiddleware', # 内存缓存配置缓存配置
数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'client_statistics', 'USER': 'client_dataer', 'PASSWORD': 'client_Data_378ymj', 'HOST': '117.50.4.148', 'PORT': 3306, } }
restframe
REST_FRAMEWORK = { # 使用Django的标准`django.contrib.auth`权限管理类, # 或者为尚未认证的用户,赋予只读权限. 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.AllowAny', ], # 用户身份认证 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # 配置jwt 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), # 版本管理 'DEFAULT_VERSION': 'v1', # 默认版本 'ALLOWED_VERSIONS': ['v1'], # 允许的版本 'VERSION_PARAM': 'version' # URL中获取值的key }
日志
LOGGING = { 'version': 1, # 暂时只支持1 'disable_existing_loggers': False, # 'formatters': { 'standard': { 'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s' }, 'simple': { 'format': '%(levelname)s %(asctime)s %(module)s %(message)s' }, }, 'filters': { }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', # 'include_html': True, }, 'default': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(STATIC_ROOT + '/logs/', 'all.log'), # 日志输出文件 'maxBytes': 1024 * 1024 * 5, # 文件大小 'backupCount': 5, # 备份份数 'formatter': 'simple', # 使用哪种formatters日志格式 }, 'error': { 'level': 'ERROR', 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(STATIC_ROOT + '/logs/', 'error.log'), 'maxBytes': 1024 * 1024 * 5, 'backupCount': 5, 'formatter': 'standard', }, 'console': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'standard' }, 'request_handler': { 'level': 'DEBUG', 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(STATIC_ROOT + '/logs/', 'script.log'), 'maxBytes': 1024 * 1024 * 5, 'backupCount': 5, 'formatter': 'standard', }, # '/tmp/test.log', # 'scprits_handler': { # 'level': 'DEBUG', # 'class': 'logging.handlers.RotatingFileHandler', # 'filename': os.path.join(STATIC_ROOT + '/logs/', 'script.log'), # 'maxBytes': 1024 * 1024 * 5, # 'backupCount': 5, # 'formatter': 'standard', # } }, 'loggers': { 'django': { 'handlers': ['default', 'console'], 'level': 'DEBUG', 'propagate': False }, 'django.request': { 'handlers': ['request_handler'], 'level': 'DEBUG', 'propagate': False, }, # 'scripts': { # 'handlers': ['scprits_handler'], # 'level': 'INFO', # 'propagate': False # }, # 'myapp.views': { # 'handlers': ['default', 'error'], # 'level': 'DEBUG', # 'propagate': True # }, } }
中间件
class MiddlewareMixin(object): def __init__(self, get_response=None): self.get_response = get_response super(MiddlewareMixin, self).__init__() def __call__(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) if not response: response = self.get_response(request) if hasattr(self, 'process_response'): response = self.process_response(request, response) return response class CORSMiddleware(MiddlewareMixin): def process_response(self, request, response): if request.method == "OPTIONS": response['Access-Control-Allow-Origin'] = '*' response['Access-Control-Allow-Headers'] = '*' response['Access-Control-Allow-Methods']='*' else: response['Access-Control-Allow-Origin'] = '*' return response
JWT模块 +登录
settings: JWT_AUTH = { 'JWT_EXPIRATION_DELTA': timezone.timedelta(seconds=30000), # 6小时过期 'JWT_AUTH_HEADER_PREFIX': 'JWT', 'JWT_VERIFY': True, 'JWT_AUTH_COOKIE': None, 'JWT_SECRET_KEY': SECRET_KEY, } url: from rest_framework_jwt.views import obtain_jwt_token url(r'^admin_login/', obtain_jwt_token),
from django.contrib.auth import get_user_model from django.contrib.auth.backends import ModelBackend from rest_framework.exceptions import ValidationError from rest_framework import status from django.db.models import Q from channel import models Manager = get_user_model() class CustomBackend(ModelBackend): """ 定义用户登录方式(手机号/邮箱登录) username和password拿到的是字符串格式 """ def authenticate(self, request, username=None, password=None, **kwargs): try: manager = Manager.objects.get(Q(mobile_number=username) | Q(email=username)) if manager.check_password(password): return manager else: raise ValidationError('用户名或密码错误', code=status.HTTP_400_BAD_REQUEST) except Exception as e: raise ValidationError('用户名或密码错误', code=status.HTTP_400_BAD_REQUEST)
随机验证
def random_num(length=6): seed = "1234567890" sa = [] for i in range(length): sa.append(random.choice(seed)) salt = ''.join(sa) return salt
循环生成每一天数据
def get_day_info(begin_time_datetime, last_time_datetime, day_info): while last_time_datetime >= begin_time_datetime: """ 循环显示每一天的数据,按照当前时间加上明天时间,去当天时间 再把当前时间-1,再循环取值 """ # next_day = end_time_datetime + datetime.timedelta(2) #明天的起始时间 last_day = last_time_datetime - datetime.timedelta(1) active_count_day = models.AppUser.objects.filter(create_date__gte=last_day, create_date__lte=last_time_datetime).all().count() bill_count_day = models.Installment.objects.filter(create_date__gte=last_day, create_date__lte=last_time_datetime).all().count() loan_count_day = models.Installment.objects.filter(status=12, create_date__gte=last_day, create_date__lte=last_time_datetime).all().count() loan_money_day = models.Installment.objects.filter(status=12, create_date__gte=last_day, create_date__lte=last_time_datetime).all().aggregate( loan_sum=Sum('apply_amount')) now_date_str = str(last_time_datetime - datetime.timedelta(1)).split(' ')[0] now_day_info = {now_date_str: { 'date': now_date_str, 'active_count_day': active_count_day, 'bill_count_day': bill_count_day, 'loan_count_day': loan_count_day, 'loan_money_day': loan_money_day.get('loan_sum', 0) }} day_info.append(now_day_info) # 用列表装每天数据,用作显示 last_time_datetime -= datetime.timedelta(1) return day_info
导出excel
def export_excel(day_info_list): """ 明天kid里面的model 通过发送post请求,前端返回day_info_list=['2018-01-01':{‘day_info’:day_info},'2018-01-01':{‘day_info’:day_info}] """ logger.info(day_info_list) #获取信息的日志 filename=day_info_list.pop(-1) try: wb = xlwt.Workbook(encoding='utf-8') sheet = wb.add_sheet(u'人员表单') style_heading = xlwt.easyxf(""" font: name Arial, colour_index white, bold on, height 0xA0; align: wrap off, vert center, horiz center; pattern: pattern solid, fore-colour 0x19; borders: left THIN, right THIN, top THIN, bottom THIN; """ ) style_body = xlwt.easyxf(""" font: name Arial, bold off, height 0XA0; align: wrap on, vert center, horiz left; borders: left THIN, right THIN, top THIN, bottom THIN; """ ) fmts = [ 'M/D/YY', ] style_body.num_format_str = fmts[0] # 写标题栏 sheet.write(0, 0, '日期', style_heading) sheet.write(0, 1, '渠道名称', style_heading) sheet.write(0, 2, '激活数', style_heading) sheet.write(0, 3, '提单数', style_heading) sheet.write(0, 4, '放款数', style_heading) sheet.write(0, 5, '放款金额', style_heading) sheet.write(0, 6, '退款数', style_heading) sheet.write(0, 7, '退款金额', style_heading) # 写数据 row = 1 for day_dct in day_info_list: for day,day_info in day_dct.items(): sheet.write(row, 0, day_info['date'], style_body) sheet.write(row, 1, day_info.get('channel_name','全部'), style_body) sheet.write(row, 2, day_info['active_count_day'], style_body) sheet.write(row, 3, day_info['bill_count_day'], style_body) sheet.write(row, 4, day_info['loan_count_day'], style_body) sheet.write(row, 5, day_info.get('loan_money_day','0'), style_body) sheet.write(row, 6, 0,) sheet.write(row, 7, 0) row = row + 1 filename=filename+'.xls' output = BytesIO() wb.save(output) logger.info(filename) #日志获取文件信息 response = HttpResponse(content_type='application/vnd.ms-excel') # 设置HttpResponse的类型 response['Content-Disposition'] = 'attachment;filename=%s'%filename response.write(output.getvalue()) return response except Exception: ret_error = {'code': 404} import json ret_error = json.dumps(ret_error) return HttpResponse(ret_error)

浙公网安备 33010602011771号