Python Flask後端非同步處理(三)

2022-01-18 11:18:50 字數 2674 閱讀 9794

前一篇博文我們已經將基礎知識和環境配置進行了介紹:

,本篇博文在實際應用場景中使用celery,對flask後端進行非同步處理。

首先編寫乙個celerytask.py檔案進行celery的配置,同時耗時任務也寫在該檔案中

from celery import celery

from szheconsole import szhescan

@celery.task

def szheconsole(urls):

try:

for url in urls:

print("="*20)

print(url)

szhescan(url)

except exception as e:

print("錯誤")

print(e)

pass

print("allend!")

使用@celery.task裝飾器修飾耗時函式szheconsole,讓celery能夠正確呼叫。

szhescan函式是另外乙個檔案裡面的函式,即對每乙個url進行單獨的掃瞄,這部分過幾天為了提高掃瞄速度會進行優化,這裡將celery用到專案裡,暫時不改。

呼叫耗時任務szheconsole的地方在index.py檢視函式中,只選呼叫部分**

@login_required

def console():

bugbit, bugtype = core.getbit()

counts = core.getcounts()

ports = core.getport()

services = core.getservices()

target = core.gettargetcount()

try:

lastscantime = baseinfo.query.order_by(baseinfo.id.desc()).first().date

except:

lastscantime = "暫無掃瞄"

pass

if request.method == 'get':

return render_template('console.html', bugbit=bugbit, bugtype=bugtype, counts=counts, lastscantime=lastscantime,

ports=ports, services=services, target=target)

else:

urls = request.form.get('urls')

urls = urls.split()

print(urls)

for url in urls:

redispool.hincrby('targetscan', 'waitcount', 1)

# executor.submit(szheconsole, urls)

szheconsole.delay(urls)

target = core.gettargetcount()

return render_template('console.html', bugbit=bugbit, bugtype=bugtype, counts=counts, lastscantime=lastscantime,

ports=ports, services=services, target=target)

可以看到原來的處理方式是多程序處理

executor.submit(szheconsole, urls)
將原來的處理方式**注釋掉後,關鍵**修改為

szheconsole.delay(urls)
這樣就可以將耗時任務丟給celery進行處理,頁面立即返回

return render_template('console.html', bugbit=bugbit, bugtype=bugtype, counts=counts, lastscantime=lastscantime,ports=ports, services=services, target=target)
接著啟動redis和celery服務,啟動redis自不用說,celery啟動命令為:

celery worker -a celerytask.celery -l info

(可以看出-a引數celery與檔名的關係

執行後的部分截圖為:

接著啟動flask服務,在任務控制台輸入需要掃瞄的**:

新建任務後檢視celery的日誌資訊,可以看到執行成功,同時與使用原生執行緒/程序一樣,瀏覽器立即返回,非同步處理成功。

後面的部落格將學習使用celery中更流行的用法,也是原生執行緒/程序很難做到的部分,如顯示進度條,暫停刪除任務,顯示後台任務狀態等。

既然使用了celery就應當把它的威力發揮到最大,以上

且聽下回 咕咕咕

Python Flask後端非同步處理(二)

在實際的應用場景中,如使用者註冊,使用者輸入了註冊資訊後,後端儲存資訊到資料庫中,然後跳轉至登入介面,這些操作使用者需要等待的時間非常短,但是如果是有耗時任務,比如對輸入的 進行漏洞掃瞄,在後端處理就會花費幾分鐘的時間,不可能讓使用者等待頁面重新整理幾分鐘,所以需要進行後端非同步處理。之前使用的後端...

後端學習 Python Flask

python3 flask.session 第一次訪問網頁需要登入,之後一定時間內不需要登入 首先引入session模組 from flask import session設定乙個用於session加密的金鑰 11 主頁處理函式 defwelcome session.permanent true 設...

Python Flask非同步傳送郵件實現方法解析

第一步,修改工廠函式,配置郵件引數 from flask import flask from config import config from flask sqlalchemy import sqlalchemy from flask mail import mail db sqlalchemy ...