1. 程式人生 > 實用技巧 >django 檢視中非同步執行python指令碼

django 檢視中非同步執行python指令碼

python指令碼:autoStaticRDMTask.py

# ----------------------------------------------------------------------
import os, django

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "wanwenyc.settings")
django.setup()
# ----------------------------------------------------------------------
# 獨執行某一個py檔案時會出現如下錯誤:django.core.exceptions.AppRegistryNotReady: Apps aren
't loaded yet.,以上內容可以解決此問題,載入django中的App import datetime from WWTest.base.activeBrowser import ActiveBrowser from threading import Thread def async_call(fn): def wrapper(*args, **kwargs): Thread(target=fn, args=args, kwargs=kwargs).start() return wrapper class GlobalConfig(object
): ISONLINE = False ONLINE_WEB_YUMING= "" ONLINE_LOGIN_ACCOUNT = "" ONLINE_LOGIN_PASSWORD = "" TEST_WEB_YUMING = "http://192.168.8.98:2000/main.do" TEST_LOGIN_ACCOUNT = "xkz" TEST_LOGIN_PASSWORD = "123456" COOKIE_FILE_NAME = "zhongshiyoulogincookie.json" gc = GlobalConfig()
class LoginPage(object): login_account_input_xpath = "/html/body/table/tbody/tr/td/table/tbody/tr/td/div/form/table/tbody/tr[4]/td/input" login_password_input_xpath = "/html/body/table/tbody/tr/td/table/tbody/tr/td/div/form/table/tbody/tr[7]/td/input" # login_code_xpath = "/html/body/div[1]/div/div[3]/div[1]/div/form/div[3]/div/div/div[2]/img" # login_code_input_xpath = "/html/body/div/div/div[2]/div[2]/div/form/div[3]/div/div[1]/div[1]/input" login_button_xpath = "/html/body/table/tbody/tr/td/table/tbody/tr/td/div/form/table/tbody/tr[15]/td/input" loginpage = LoginPage() class LoginPageFunction(object): def isExist(self,activebrowser,x_xpath): try: activebrowser.driver.find_element_by_xpath(x_xpath) return True except: return False def isExistLoginButton(self,activebrowser): return self.isExist(activebrowser,loginpage.login_button_xpath) def login(self,activebroser,loginurl,loginaccount,loginpassword): # activebroser = ActiveBrowser() activebroser = activebroser if gc.ISONLINE: loginurl = gc.ONLINE_WEB_YUMING loginaccount = gc.ONLINE_LOGIN_ACCOUNT loginpassword = gc.ONLINE_LOGIN_PASSWORD else: loginurl = loginurl loginaccount = loginaccount loginpassword = loginpassword activebroser.getUrl(loginurl) activebroser.findEleAndInputNum(0,"xpath",loginpage.login_account_input_xpath,loginaccount) #輸入賬號 activebroser.findEleAndInputNum(0,"xpath",loginpage.login_password_input_xpath,loginpassword) #輸入密碼 # code = activebroser.getcodetext(loginpage.login_code_xpath) # code = activebroser.getCodeTextByThreeInterfase(loginpage.login_code_xpath) # code = input("請輸入驗證碼:") # print("code:%s" %code) # activebroser.findEleAndInputNum(0, "xpath",loginpage.login_code_input_xpath,code) activebroser.findEleAndClick(0,"xpath",loginpage.login_button_xpath) #點選登入 try: activebroser.swithToAlert() activebroser.delayTime(3) activebroser.swithToAlert() except: pass activebroser.writerCookieToJson(gc.COOKIE_FILE_NAME) #寫入cookie lpf = LoginPageFunction() class WebRemoteUphild(object): def __init__(self,loginurl,loginaccount,loginpassword,predate=None): self.activebrowser = ActiveBrowser() # 例項化 self.loginurl = loginurl self.loginaccount = loginaccount self.loginpassword = loginpassword if predate ==None: self.predate = str(datetime.datetime.now().strftime('%Y')) else: self.predate = predate # self.select_xie_yi = select_xie_yi # self.select_jian_kong_yin_zi_list = select_jian_kong_yin_zi_list def login(self): #登入 # lpf.loginwithcookiesauto(self.activebrowser) #登入 lpf.login(activebroser=self.activebrowser, loginurl=self.loginurl, loginaccount=self.loginaccount, loginpassword=self.loginpassword ) #登入 print("登入完成") # self.activebrowser.delayTime(20) #等待20秒,等待頁面刷新出來 #處理彈框 def handleAlert(self): self.activebrowser.swithToAlert() #點選“工作日誌” def clickGongZuoRiZhi(self): #點選“工作日誌” gongzuotizhi_text = "工作日誌" self.activebrowser.findEleAndClick(0,"link_text",gongzuotizhi_text) print("已經點選【工作日誌】") #點選提示彈框的確定 def clickQueDing(self): queding_xpath = "/html/body/div[10]/div[2]/table/tbody/tr/td[2]/input" #先判斷元素是否存在 is_exist_ele = self.activebrowser.is_exist_ele("xpath",queding_xpath) if is_exist_ele: #如果存在元素,則點選 self.activebrowser.findEleAndClick(0,"xpath",queding_xpath) print("已經點選【確定】") def jinRuIframe(self): iframe_xpath = "/html/body/div[4]/iframe" frame_ele = self.activebrowser.findELe("xpath",iframe_xpath) self.activebrowser.swithToIframe(frame_ele) #切換到串列埠引數配置所在frame #退出iframe def quitIframe(self): self.activebrowser.quiteCurrentIframe() #點選"我的工作日誌" def clickMyWorkLog(self): self.jinRuIframe() myworklog_xpath = "/html/body[1]/div[2]/div[2]/table[1]/tbody/tr/td[3]/div/a" self.activebrowser.findEleAndClick(0,"xpath",myworklog_xpath) print("已經點選【我的工作日誌】") self.quitIframe() #退出所有iframe #進入週報Iframe二 def jinRuIframeAboutZhouBaoTwo(self): iframe_xpath = "/html/body[1]/iframe" frame_ele = self.activebrowser.findELe("xpath",iframe_xpath) self.activebrowser.swithToIframe(frame_ele) #切換到串列埠引數配置所在frame #點選“上週” def clickShangZhou(self): self.jinRuIframe() self.jinRuIframeAboutZhouBaoTwo() #點選“上週” shangzhou_link_text = "上週" self.activebrowser.findEleAndClick(0,"link_text",shangzhou_link_text) print("已經點選【上週】") self.quitIframe() # 退出所有iframe #進入週報Iframe三 def jinRuIframeAboutZhouBaoThree(self): iframe_xpath = "/html/body/div[3]/iframe[1]" frame_ele = self.activebrowser.findELe("xpath",iframe_xpath) self.activebrowser.swithToIframe(frame_ele) #切換到串列埠引數配置所在frame #獲取日期,進行日期判斷 def checkData(self): self.jinRuIframe() self.jinRuIframeAboutZhouBaoTwo() self.jinRuIframeAboutZhouBaoThree() print("需要獲取的資訊的年限是【%s】年"% self.predate) #獲取日期 date_xpath = "/html/body[1]/div[1]/ul/li[2]/div[2]/span" date_text = self.activebrowser.findEleAndReturnText(0,"xpath",date_xpath) self.quitIframe() #退出當前iframe print("日期:%s"% date_text) date_year = date_text.split("-")[0].strip() print("年:%s" % date_year) if str(date_year)== str(self.predate): return True else: print("需要獲取的資訊的年限是【%s】年,而實際為【%s】年,停止獲取"% (predate,date_year)) return False #獲取一週即一個周頁面的內容資訊 def getWeekInfo(self): info_list = [] info_dict = {} self.jinRuIframe() self.jinRuIframeAboutZhouBaoTwo() self.jinRuIframeAboutZhouBaoThree() #獲取人員 name_xpath = "/html/body[1]/div[1]/ul/li[1]/div[2]" name_text = self.activebrowser.findEleAndReturnText(0,"xpath",name_xpath) print("人員:%s" % name_text) info_dict["name"] = name_text #獲取日期 date_xpath = "/html/body[1]/div[1]/ul/li[2]/div[2]/span" date_text = self.activebrowser.findEleAndReturnText(0,"xpath",date_xpath) print("日期:%s"% date_text) date_year = date_text.split("-")[0].strip() print("年:%s" % date_year) info_dict["year"] = date_year info_dict["date_range"] = date_text #獲取日記工作情況及存在問題 riji_table_xpath = "/html/body[1]/div[1]/div[11]/table/tbody" riji_tr_ele_list = self.activebrowser.getFatherSonElesList("xpath", riji_table_xpath, "tag_name", "tr") # 獲取tbody選項的所有tr元素 riji_tr_ele_list_count = len(riji_tr_ele_list) print("tr元素列表:") print(riji_tr_ele_list_count) riji_list = [] #一週中所有天的資料的列表 for tr_count_one in range(0, riji_tr_ele_list_count, 2): #步長為2 one_day_info_dict = {} #處理一天的工作情況和存在問題 #獲取一天的工作情況 gongzuoqingkaung_tr_ele = riji_tr_ele_list[tr_count_one] cunzaiwenti_tr_ele = riji_tr_ele_list[tr_count_one+1] gongzuoqingkaung_td_ele_list = gongzuoqingkaung_tr_ele.find_elements_by_tag_name("td") gongzuoqingkaung_td_ele_list_count = len(gongzuoqingkaung_td_ele_list) print("工作情況下td的元素個數:%s" % gongzuoqingkaung_td_ele_list_count) #獲取周資訊 zhou_ele = gongzuoqingkaung_td_ele_list[0] zhou_text = zhou_ele.text print("周情況:") print(zhou_text) one_day_info_dict["date_info"]=zhou_text #獲取工作情況資訊 gongzuoqingkuang_ele = gongzuoqingkaung_td_ele_list[1] gongzuoqingkuang_text = gongzuoqingkuang_ele.text print("工作情況:") print(gongzuoqingkuang_text) #獲取工作內容詳情 gongzuoxiangqing_ele = gongzuoqingkaung_td_ele_list[2] gongzuoxiangqing_div_ele_list = gongzuoxiangqing_ele.find_elements_by_tag_name("div") # 獲取任務名和工作詳情 one_day_gongzuoxiangqing_list = [] for gongzuoxiangqing_div_ele_one in gongzuoxiangqing_div_ele_list: one_task_gongzuoxiangqing_dict ={} #一條div框中記錄的工作內容 gongzuoxiangqing_div_ele_one_html = gongzuoxiangqing_div_ele_one.get_attribute("innerHTML") #獲取div標籤的文字內容 gongzuoxiangqing_div_ele_one_a_ele_list = gongzuoxiangqing_div_ele_one.find_elements_by_tag_name("a") #獲取a連結 one_day_renwumingcheng_list = [] for gongzuoxiangqing_div_ele_one_a_ele_one in gongzuoxiangqing_div_ele_one_a_ele_list: renwumingcheng_text = gongzuoxiangqing_div_ele_one_a_ele_one.text print("任務名稱:%s" % renwumingcheng_text) one_day_renwumingcheng_list.append(renwumingcheng_text) #將任務名稱新增到工作情況字典中 one_task_gongzuoxiangqing_dict["task_name"] = one_day_renwumingcheng_list #獲取工作任務名稱 print("工作詳情div資訊:%s" % gongzuoxiangqing_div_ele_one_html) one_task_gongzuoxiangqing_dict["task_details"] = gongzuoxiangqing_div_ele_one_html one_day_gongzuoxiangqing_list.append(one_task_gongzuoxiangqing_dict) #多條div組成一天的任務 print("工作詳情:") print(one_day_gongzuoxiangqing_list) one_day_info_dict["work"] = one_day_gongzuoxiangqing_list #工作內容儲存到一天工作內容的字典中 #獲取存在問題資訊 cunzaiwenti_td_ele_list = cunzaiwenti_tr_ele.find_elements_by_tag_name("td") #獲取存在問題內容 cunzaiwenti_ele = cunzaiwenti_td_ele_list[0] cunzaiwenti_text = cunzaiwenti_ele.text print("存在問題:%s"%cunzaiwenti_text) #獲取問題詳情資訊 wentixiangqing_ele = cunzaiwenti_td_ele_list[1] wentixiangqing_div_ele_list = wentixiangqing_ele.find_elements_by_tag_name("div") one_day_wentixiangqing_list = [] for wentixiangqing_div_ele_one in wentixiangqing_div_ele_list: one_task_wentixiangqing_dict ={} #一條div框中記錄的工作內容 wentixiangqingxiangqing_div_ele_one_html = wentixiangqing_div_ele_one.get_attribute("innerHTML") #獲取div標籤的文字內容 one_task_wentixiangqing_dict["question_details"] = wentixiangqingxiangqing_div_ele_one_html #儲存問題詳情 one_day_wentixiangqing_list.append(one_task_wentixiangqing_dict) #多條div組成一天的問題 print("問題詳情:") print(one_day_wentixiangqing_list) one_day_info_dict["problem"] = one_day_wentixiangqing_list # 問題儲存到一天工作內容的字典中 print("一天內容的資料:") print(one_day_info_dict) riji_list.append(one_day_info_dict) print("日記列表:") print(riji_list) info_dict["riji_datails"] = riji_list #日記寫入字典 #週記統計資訊 zhouji_xpath = "/html/body[1]/div[1]/div[13]/div" zhouji_ele = self.activebrowser.findELe("xpath",zhouji_xpath) zhouji_html = zhouji_ele.get_attribute("innerHTML") # 獲取div標籤的文字內容 print("週記內容:") print(zhouji_html) info_dict["zhouji_html"] = zhouji_html self.quitIframe() # 退出當前iframe print("一週工作資訊統計:") print(info_dict) import json print(json.dumps(info_dict, indent=1)) #字典樹形結構輸出 return info_dict def closeWeb(self): self.activebrowser.closeBrowse() @async_call def run(self): #登入 self.login() #點選工作日誌 self.clickGongZuoRiZhi() # 點選提示彈框的確定 self.clickQueDing() # 點選"我的工作日誌" self.clickMyWorkLog() #點選上週 self.clickShangZhou() is_continue = self.checkData() while_num = 1 while is_continue: #如果不等於預設年限,則 # 獲取一週即一個周頁面的內容資訊 one_week_info_dict = self.getWeekInfo() # 點選上週 self.clickShangZhou() is_continue = self.checkData() print("獲取資料【%s】次,獲取的資料為:【%s】"% (str(while_num),str(one_week_info_dict))) people_name = one_week_info_dict['name'] rdm_year = one_week_info_dict['year'] rdm_data_range = one_week_info_dict['date_range'] riji_datails_list = one_week_info_dict['riji_datails'] for riji_datails_dict in riji_datails_list: day_date = riji_datails_dict['date_info'] is_week = False day_work_list = riji_datails_dict['work'] for day_work_dict in day_work_list: day_task_name = day_work_dict['task_name'] day_task_desc = day_work_dict['task_details'] #問題 problem_list = riji_datails_dict['problem'] for problem_dict in problem_list: day_task_quse =problem_dict['question_details'] from reportdatas.models import RdmStatic fil_list = RdmStatic.objects.filter(people_name=people_name).\ filter(rdm_year=rdm_year).\ filter(rdm_data_range=rdm_data_range).\ filter(day_date=day_date) fil_list_count = fil_list.count() if fil_list_count == 0: #說明沒有資料要儲存 new_rdmstatic = RdmStatic() new_rdmstatic.people_name = people_name new_rdmstatic.rdm_year = rdm_year new_rdmstatic.rdm_data_range = rdm_data_range new_rdmstatic.day_date = day_date new_rdmstatic.is_week = is_week new_rdmstatic.day_task_name = day_task_name new_rdmstatic.day_task_desc = day_task_desc new_rdmstatic.day_task_quse = day_task_quse new_rdmstatic.save() #儲存日記 #儲存完日誌之後,儲存週記 week_task_deck = one_week_info_dict['zhouji_html'] #週記內容 from reportdatas.models import RdmStatic fil_list = RdmStatic.objects.filter(people_name=people_name). \ filter(rdm_year=rdm_year). \ filter(rdm_data_range=rdm_data_range). \ filter(is_week=True) fil_list_count = fil_list.count() if fil_list_count == 0: # 說明沒有資料則說明沒有周記,儲存週記 new_rdmstatic = RdmStatic() new_rdmstatic.people_name = people_name new_rdmstatic.rdm_year = rdm_year new_rdmstatic.rdm_data_range = rdm_data_range new_rdmstatic.is_week = True new_rdmstatic.week_task_deck = week_task_deck new_rdmstatic.save() # 儲存週記 print("一頁RDM週記錄入完成") while_num = while_num+1 if __name__ == '__main__': loginurl="http://192.168.8.98:2000/main.do" loginaccount="相開徵" loginpassword="xkz190903" predate = "2020" wc = WebRemoteUphild(loginurl=loginurl,loginaccount=loginaccount,loginpassword=loginpassword,predate=predate) wc.run()

其中在類WebRemoteUphild中的run函式中運用@async_call啟用一個新程序執行類WebRemoteUphild中的run函式,async_call為定義的一個啟動新程序的函式

django 檢視指令碼:views.py

from django.shortcuts import render
from django.views.generic import View   #匯入View
from django.http import HttpResponse
from django.http import HttpResponseRedirect

from wanwenyc.settings import DJANGO_SERVER_YUMING,MEDIA_ROOT
from .models import RdmAutoStatic,RdmStatic,RdmConfig
# Create your views here.

#根據資料庫內容自動合併生成任務名稱和任務詳情及問題詳情
def RdmConfigRequest(request, rdmconfig_id, trackback=None):
    rdmconfig = RdmConfig.objects.get(id=int(rdmconfig_id))  # 獲取用例
    rdm_url = rdmconfig.rdm_url
    rdm_account = rdmconfig.rdm_account
    rdm_password = rdmconfig.rdm_password
    recode_year = rdmconfig.recode_year
    print("RDM網址:%s" % rdm_url)
    print("RDM登入賬號:%s" % rdm_account)
    print("RDM登入密碼:%s" % rdm_password)
    print("RDM統計日誌年限:%s" % recode_year)

    from .autoStaticRDMTask import WebRemoteUphild
    loginurl= rdm_url
    loginaccount= rdm_account
    loginpassword= rdm_password
    predate = recode_year
    print("開始執行非同步函式")
    wc = WebRemoteUphild(loginurl=loginurl,loginaccount=loginaccount,loginpassword=loginpassword,predate=predate)
    wc.run()
    print("函式開始執行完成後")


    print("重定向返回'/reportdatas/rdmconfig/'")
    return HttpResponseRedirect('/reportdatas/rdmconfig/')  #重定向到該頁面

RdmConfigRequest函式執行時會在執行wc.run()的時候啟用一個新程序,然後執行print("函式開始執行完成後")以及後面的指令碼,但是wc.run()函式執行的內容不會被打斷,會繼續執行下去