模板定义自动发现规则
1.建立自定义发现规则
前端
2.设置监控项原型
java
item keypython
proc.num[
, linux, , ]
user为主机的用户名, cmdline为ps-ef查询出的进程信息描述
在weblogic中,可使用它的java进程目录是否在进程中存在来判断weblogic是否挂掉
1.字典操做
git
python与 oracle客户端的关系
web
agent的配置
HostMetadataItem=system.uname
应用:主机元数据,应用在自动注册的动做上
syste.uname >>> Linux zabbix 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64redis
orm中建立新对象,create get_or_create() 对于NOT NULL的字段,不给他赋值也能建立? 为啥?shell
es 用索引中的内容来匹配相应的索引,再删除。数据库
POST twitter/_delete_by_query { "query": { "match": { "message": "some message" } } }
screen命令的使用django
screen -r monitor 进入运行monitor进程的screen,进入屏幕后,就跟直接运行同样,相似于windows的虚拟桌面,在一台主机上开了第二个linux屏幕。
在screen内,ctrl + a +d 退出当前屏幕,
es的快照在恢复时,需保证这条索引已经被删除,才能恢复成功
tzinfo的问题。datetime对象是能够比较大小的。
class Token(models.Model): """ The default authorization token model. """ key = models.CharField("Key", max_length=40, primary_key=True) user = models.ForeignKey( settings.AUTH_USER_MODEL, related_name="auth_token", on_delete=models.CASCADE, verbose_name="User" ) created = models.DateTimeField("Created", auto_now_add=True) class Meta: db_table = 'token' verbose_name = "Token" verbose_name_plural = "Tokens" def save(self, *args, **kwargs): if not self.key: self.key = self.generate_key() return super(Token, self).save(*args, **kwargs) def generate_key(self): return binascii.hexlify(os.urandom(20)).decode() def __str__(self): return self.key
import calendar import datetime import json import requests tmp = {} year = 2019 for i in range(1, 13): days = calendar.monthcalendar(year=2019, month=i) for k in days: for v in k: if v != 0: if i < 10: if v < 10: tmp[int(str(year) + '0' + str(i) + '0' + str(v))] = '' else: tmp[int(str(year) + '0' + str(i) + str(v))] = '' else: if v < 10: tmp[int(str(year) + str(i) + '0' + str(v))] = '' else: tmp[int(str(year) + str(i) + str(v))] = '' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36" } # 返回数据:工做日对应结果为 0, 休息日对应结果为3, 节假日对应的结果为1 for k in tmp.keys(): url = 'http://api.goseek.cn/Tools/holiday?date=%d' % k res = requests.get(url=url, headers=headers) if res.status_code == 200: data = json.loads(res.text)['data'] if data == 0: tmp[k] = 0 elif data == 1: tmp[k] = 1 elif data == 3: tmp[k] = 3 with open('%s年节假日对照表.txt'%datetime.date.today().year, 'w') as f: f.write(json.dumps(str))
这个api可能存在访问不良,还须要多加判断,
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
and or的使用
使用and 起到了两层if的做用,先对and前的条件进行判断,经过在对and后的条件进行判断,两个都过变量获得and后的值,若是两个条件中有一个不通,变量就获得or后的值,通常在变量初始化好用
xxx.objects.filter(id=1).update(updatetime = datetime.datetime.today() )
if [ $1 == shell ] then xxxxx要作的事 fi
def a(): pass def b(): pass def c(): pass func = eval(var) var = 'a'传入时。func 等价于 a函数的内存地址 func() 等价于 a(),调用函数
报错
解决方案:
第一种: Try to uninstall celery 4.1.0 and replace to 3.1.24
第二种: pip install eventlet, 启动celeryworker时: celery -A celery_app worker --loglevel=info -P eventlet
@app.task def add(x, y): time.sleep(3) return x + y import task if __name__ == '__main__': # 以前这样写,直接就执行 函数 task.add() # 如今把函数添加到执行队列中,参数写在delay中 # result不是函数的执行结果,他是个对象 # delay是延迟执行,在调用执行的 方式一: result = task.add.delay(2, 3) 方式二: result = task.add.apply_async(args=[4, 3], eta=task_time) 跟delay差很少 # 当即执行的, # task.add.s()(2,3) # 这个任务惟一的id print(result.id)
查看任务结果
celery任务执行结果又九种状态,
from celery.result import AsyncResult from task import app # 用获取到的任务id,指定任务名称 async = AsyncResult(id='ac2a7e52-ef66-4caa-bffd-81414d869f85', app=app) if async.successful(): # successful()方法是AsyncResult对状态的封装,实际上就是任务执行完获得的对象的state == 'SUCCESS'。 # 任务执行的结果,也就是返回值 # 这里的get有个坑,他会等待任务就绪,也就是说,任务不就绪的话会一直卡住, result = async.get() print(result) elif async.failed(): #是FAILED的封装 print('执行失败') elif async.status == 'PENDING': print('任务等待中被执行') elif async.status == 'RETRY': print('任务异常后正在重试') elif async.status == 'STARTED': print('任务已经开始被执行')
执行命令
celery worker -A celery_app_task -l info
drf的token验证机制
django 的 MIDDLEWARE 中包含的如下两个 MIDDLEWARE
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
能够在一个 request 进来的时候,将request里的 cookie 里面的 session_id 转换成咱们的 user !!!!! 也就是咱们以前看到的 request.user 。
配置drf的中间件
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', )}
官方文档显示 restful 提供的 auth 有三种 :
BasicAuthentication 、 TokenAuthentication 、 SessionAuthentication 。
SessionAuthentication :跟django中的机制是同样的, 经常使用于浏览器,
由于浏览器会自动设置 cookie ,并将他的 cooike 和session 带到服务器,
因此先后端分离的系统用这种机制比较少见,可是仍是能够作。
TokenAuthentication : 是须要重点关注的,使用他前 ,必须先将 'rest_framework.authtoken'
添加到 django 的 INSTALLED_APPS 中。
INSTALLED_APPS = ( ... 'rest_framework.authtoken' )
这个tokenauth会给咱们建立一张表,外键关联到user表,凡有表的app都要加入到app中,否则不会生成表。
迁移
python manage.py makemigrations
python manage.py migrate
使用python manage.py createsuperuser 建立超级用户
from rest_framework.authtoken.models import Token
token须要咱们本身建立,使用Token.objects.create(user=self.request.user)
表中的key字段就是咱们要的token
此时,前端在访问的时候就可使用这个token来表述用户身份了
HTTP头中
Authorization: Token xxxxxxxxx
注意token后的空格,key通常40长
settings文件中配置REST_FRAMEWORK
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', \#token验证 'rest_framework.authentication.TokenAuthentication',)}
此时,就能够在视图中添加验证类,
from rest_framework.authentication import TokenAuthentication(或者IsAuthentication都行)
这样,就把django自带的token用起来了
缺点:
1.这个token是存在服务器中的,若是一个分布式系统要用同一套的验证系统,就会出现问题。除非两个服务器有同一份用户数据,
- 这个token 是没有过时时间的,并且泄露了别人能够一直用。
\n
,前端在往数据库中存储的时候自动加上了转义符\
,因此,当要使用这个参数进行splitlines()的时候,多是切割不成功的。import smtplib from email.header import Header from email.mime.text import MIMEText #配置邮箱服务 smtp = smtplib.SMTP('smtp_server,'25') smtp.helo('plain') smtp.ehlo() smtp.starttls() smtp.set_debuglevel(1) #登陆 smtp.login('username',pwd') #构造消息 msg = MIMEText('要发送的消息', 'plain', 'utf-8') msg['From'] = u'Sdata Monitor <从哪儿发送>' msg['Subject'] = Header(u'标题', 'utf-8').encode() msg['To'] = ['245088135@qq.com'] msg['To'] = ','.join(['xxxxxx@qq.com']) #发送邮件 #注意msg的as_string()方法 smtp.sendmail('smtp_server', ['接收者邮箱‘’], msg.as_string()) #msg 'Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: base64\nFrom: xxxxx <xxxxxx>\nSubject: =?utf-8?q?xxxxxx?=\nTo: xxxx@xx.com\n\nYXNkYXNkYXNkYXNk\n'
{ "touser" : "UserID1|UserID2|UserID3", "toparty" : "PartyID1|PartyID2", "totag" : "TagID1 | TagID2", "msgtype" : "text", "agentid" : 1, "text" : { "content" : "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。" }, "safe":0 }
touser、toparty、totag根据情境选择,能够为空,但不能同时为空
setting_manager类里面已经包含了从缓存中取数据的函数。缓存中取不到就去数据库中取。
with open('requirements.txt','r') as r: with open('requirements_new.txt','w') as w: data = r.read() data.pop(0) data.pop(0) for i in data: i = i.split(' ',1) i[1] = i[1].strip() i = '=='.join(i) w.write(i)
while 1: res = AsyncResult(id=task_id, app=send_msg) if res.ready(): break else: time.sleep(0.5) continue
条件没达成,就休眠0.5秒继续执行一次任务,知道条件达成,break
以为这种方式仍是很差,之后还得改
消息发送平台的重点在权限,不一样帐号登录的用户用不一样的key调用第三方短信平台,再记录下发送记录供之后审计使用。三张表,用户表,介质表,设置表,用介质表作中介,链接用户和设置,使用户和设置项配对起来。
setting.objects.filter(media_id=media.objects.get(user_id=self.request.user.id).value).values()这样就获得全部符合条件的数据,再循环遍历获得一个字典
#一个列表 l = [a 20 b 30 c 40 d 60] #要把这个作成一个字典 #这样来 data = dict(zip( [i for i in l[::2]], [j for j in l[1::2]] )) 这样就能够获得想要的字典, 切片设置步长和起始位置是颇有用的
还须要多练啊,想的东西仍是太少,需求下来要先好好把关键点记下来,舍本取末,真的菜。
在django-admin中,能够建立类,建立方法,对模型的展现进行定制化。