模板定義自動發現規則
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中,能夠建立類,建立方法,對模型的展現進行定製化。