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