Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 触发异常:';非类型';对象没有属性';app&x27;_Python_Python 3.x_Flask - Fatal编程技术网

Python 触发异常:';非类型';对象没有属性';app&x27;

Python 触发异常:';非类型';对象没有属性';app&x27;,python,python-3.x,flask,Python,Python 3.x,Flask,使用Python3和Flask获取错误 在下面显示的代码中,您会注意到我将端口定义为8080。将其定义为端口80在我拥有的另一个应用程序中运行良好,该应用程序为我家的植物浇水,并在动态网页上显示结果,但在这里,它因权限拒绝错误而崩溃。为什么,考虑到两者都是以完全相同的方式在Raspbian上使用相同的版本创建的 但这不是问题所在。真正的问题是为什么它在同一个应用程序中甚至不能保持一致 #!/usr/bin/python3 from flask import Flask, render_templ

使用Python3和Flask获取错误

在下面显示的代码中,您会注意到我将端口定义为8080。将其定义为端口80在我拥有的另一个应用程序中运行良好,该应用程序为我家的植物浇水,并在动态网页上显示结果,但在这里,它因权限拒绝错误而崩溃。为什么,考虑到两者都是以完全相同的方式在Raspbian上使用相同的版本创建的

但这不是问题所在。真正的问题是为什么它在同一个应用程序中甚至不能保持一致

#!/usr/bin/python3
from flask import Flask, render_template, redirect, url_for
from imapclient import IMAPClient 
import email
import time 
import sys
import os
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(1) # number of executor
import logging 

logging.basicConfig(filename='/home/pi/mailbox_event.log',level=logging.WARNING)
HOSTNAME = 'imap.plus.net' 
USERNAME = 'megapower+rob' 
PASSWORD = 'aqp-hRM-2Nb-qh9'

MAILBOX = 'INBOX' 
NEWMAIL_OFFSET = 0 
MAIL_CHECK_FREQ = 10 #number of seconds for mail check

m1 = ""
m2 = ""
m3 = ""
m4 = ""

app = Flask(__name__)

def TimeNowIs():
    TimeNow = time.strftime('%d/%m/%Y at %H:%M:%S')
    return TimeNow

print("Hi" )
print("Mailbox here")
print("Just starting up")
logging.info("Mailbox App starting up")

def template(title = "Mail Display!", text = TimeNowIs(), m1 = " ", m2 = " ", m3 = " ", m4 = " "):
    text, m1, m2, m3, m4 = ""
    templateData = {
        'title' : title,
        'text' : text,
        'm1' : m1,
        'm2' : m2,
        'm3' : m3,
        'm4' : m4
        }
    return templateData

@app.route("/")

def main():
    text = TimeNowIs()
    m1 = "Hi"
    m2 = "Mailbox here"
    m3 = "Just starting up"
    m4 = "Going to check your mail"

    list_object = [text, m1, m2, m3, m4]
    return render_template('main.html', text_to_send = list_object)

def getmail():
    try:
        print("Logging in")
        server = IMAPClient(HOSTNAME, use_uid=True, ssl=False)
        server.login(USERNAME, PASSWORD)
        server.select_folder('INBOX', readonly=True)
    except:
        connected = False
        server = ""
        logging.warning('Logon failed')
        print("Logon failed")
    else:
        connected = True
        print("Logon succeeded")

        messages = server.search('UNSEEN')
        print("we have %d unread emails." % len(messages))

        for uid, message_data in server.fetch(messages, 'RFC822').items():
            email_message = email.message_from_bytes(message_data[b'RFC822'])
            m1 = (uid, email_message.get('From'), email_message.get('Subject')) 
            print(m1)

        text = TimeNowIs()
        m1 = "Well now"
        m2 = "I've checked your mail"
        m3 = "you should see something here"
        m4 = "that isn't the start up message"

        list_object = [text, m1, m2, m3, m4]

        print("Logging out")
        server.logout()
    return render_template('main.html', text_to_send = list_object)


def printmail():
    try:
        while True:
            os.system("clear")
            timeString = time.strftime('%d/%m/%Y at %H:%M:%S')
            print("Checking mail")
            print(timeString)
            getmail()

            print("Waiting")
            time.sleep(MAIL_CHECK_FREQ)

    except KeyboardInterrupt:
        print("Shutting down")
        logging.info('System closed by Ctrl-C')
        print("Goodbye")
        #os.system("sudo reboot")

    except Exception as e:
        logging.warning('Exception triggered: ' + str(e))
        print("Exception triggered: " + str(e))
#        os.system("sudo reboot")
    pass
    return

if __name__ == "__main__":
    executor.submit(printmail)
    app.run(host='0.0.0.0', port=8080, debug=True)
我在这里争取的是这样一个场景:printmail()作为一个永久循环运行,除非被杀死或发生致命异常,该异常将被记录,然后Pi重新启动。您将从所附的图像中看到main()正在运行,并且list_对象已写入网页

但是,当调用getmail()时,m1会被写入终端,因此我知道我们在这方面没有问题,但是呈现模板失败,因为“NoneType”对象没有属性“app”


我想知道这是怎么回事,因为返回render_模板行,并且创建list_对象的代码与main()中的代码相同。

Flask render_模板函数希望能够访问Flask应用程序上下文。 您可以在此处看到render_模板实现:

from.globals import\u app\u ctx\u stack

ctx=\u app\u ctx\u stack.top
ctx.app.update\u模板\u上下文(上下文)
返回渲染(
ctx.app.jinja\u环境获取或选择模板(模板名称或列表),
上下文
ctx.app,
)

您需要找到一种方法,使您的执行器线程能够访问flask localstack上下文