模板定义自动发现规则
1.创建自定义发现规则
2.设置监控项原型
item key
proc.num[
, , , ]
user为主机的用户名, cmdline为ps-ef查询出的进程信息描述
在weblogic中,可以使用它的java进程目录是否在进程中存在来判断weblogic是否挂掉
1.字典操作
python与 oracle客户端的关系
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_64
orm中创建新对象,create get_or_create() 对于NOT NULL的字段,不给他赋值也能创建? 为啥?
es 用索引中的内容来匹配相应的索引,再删除。
POST twitter/_delete_by_query
{
"query": {
"match": {
"message": "some message"
}
}
}
screen命令的使用
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中,可以创建类,创建方法,对模型的展示进行定制化。
原文:https://www.cnblogs.com/0916m/p/11482032.html