• 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()函数执行的内容不会被打断,会继续运行下去

  • 相关阅读:
    day09
    初识socket
    java正则表达式
    Servlet 3.0 新特性详解
    spring利用PropertiesFactoryBean管理属性配置文件properties
    MyBatis获取插入记录的自增主键
    深入学习理解java-ThreadLocal
    Mybatis批量执行语句
    MyBatis使用二级缓存
    编码的理解
  • 原文地址:https://www.cnblogs.com/jingzaixin/p/13328383.html
Copyright © 2020-2023  润新知