获取未绑定的本地错误:赋值下面引用了本地变量“ x”

时间:2019-09-19 00:11:34

标签: python

我有一个python flask应用程序,正在从另一个应用程序接收webhook。当它收到Webhook时,它通过执行任务(查找某人的可用性)并通过响应来响应Web应用程序,以进行响应。发送回响应时,在赋值下引用了一个未绑定的局部错误局部变量“ response”。看起来在该级别调用响应会引起问题。 任何帮助将不胜感激。

from flask import Flask
from flask import request
from flask import make_response
import logging
import json
import random
import os
import importlib
import win32com.client
import pywintypes
import datetime
import pythoncom
from gevent.pywsgi import WSGIServer
from gevent import monkey; monkey.patch_all()
import string

pythoncom.CoInitialize()
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(message)s')

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def webhook():
    req = request.get_json(silent=True, force=True)
    logger.info("Incoming request: %s", req)
    intent = get_intent_from_req(req)
    logger.info('Detected intent %s', intent)

    if intent == "Check Schedule Next":
        pythoncom.CoInitialize()
        emailparam = req.get('queryResult').get('parameters').get('email')
        datetime1 = req.get('queryResult').get('parameters').get('date-time').get("date_time")
        datetime2=datetime1.replace('T',' ')
        datetime3=datetime2.replace("-04:00", "")
        print(datetime3)
        pythoncom.CoInitialize()
        class MeetingRoom:
            def __init__(self, inputDate, duration, locationMail):
                self.inputDate = inputDate
                self.oOutlook = win32com.client.Dispatch("Outlook.Application")
                self.bookings = self.oOutlook.CreateItem(1)
                self.bookings.Start = inputDate
                self.bookings.Duration = duration
                self.bookings.Subject = 'Follow Up Meeting'
                self.bookings.MeetingStatus = 1
                self.roomRecipient = self.bookings.Recipients.Add(locationMail)

            def checkRoomAvailability(self):
               bookingDateTime = datetime.datetime.strptime(self.inputDate, '%Y-%m-%d %H:%M:%S')
                self.roomRecipient.resolve
                myDate = bookingDateTime.date()
                pywintypeDate = pywintypes.Time(myDate)
                availabilityInfo = self.roomRecipient.FreeBusy(pywintypeDate, self.bookings.Duration, True)
                timeAvailability = []
                newTime = pywintypeDate
                # print(newTime)
                currentTime = datetime.datetime.now()
                for isAvailable in availabilityInfo:
                    # print(newTime, " :: ", isAvailable)
                    if isAvailable == "0" and newTime > currentTime:
                        timeAvailability.append(newTime)
                    newTime = newTime + datetime.timedelta(minutes=self.bookings.Duration)

                # print(availabilityInfo)
                # for value in timeAvailability:
                #     print(value)
                try:
                    index = timeAvailability.index(bookingDateTime)
                    print(emailparam, "is available")
                    response = {
                    'fulfillmentText': emailparam
                    }
                    # self.bookings.Save()
                    # self.bookings.Send()

                except ValueError:
                    for timestamp in timeAvailability:
                        if bookingDateTime <= timestamp:
                            break
                print("I dont see availability for", emailparam, "at", bookingDateTime, " but next available time is ", timestamp)
                x = ("I dont see availability for", emailparam, "at", bookingDateTime, " but next available time is ", timestamp)
                response = {
                    'fulfillmentText': x
                }
                # def bookMeetingRoom():

        if __name__ == '__main__':
            meetingRoomObj = MeetingRoom(datetime3, 15, emailparam)
            meetingRoomObj.checkRoomAvailability()
        #response = {
        #    'fulfillmentText': emailparam
        #}

    res = create_response(response)
    return res

def get_intent_from_req(req):
    try:
        intent_name = req['queryResult']['intent']['displayName']
    except KeyError:
        return None

    return intent_name

def get__from_req(req):
    try:
        intent_name = req['queryResult']['intent']['displayName']
    except KeyError:
        return None

    return intent_name


def create_response(response):
    res = json.dumps(response, indent=4)

    logger.info(res)

    r = make_response(res)
    r.headers['Content-Type'] = 'application/json'

    return r

if __name__ == '__main__':
    LISTEN = ('0.0.0.0',8080)
    http_server = WSGIServer( LISTEN, app )
    http_server.serve_forever()

2 个答案:

答案 0 :(得分:0)

此行在初始化前先引用response

res = create_response(response)

也许确保所有代码路径都初始化response变量吗?

答案 1 :(得分:0)

解决方案

似乎您在错误的范围内创建了response对象,请将其从函数checkRoomAvailability中删除。

创建响应对象后,在函数checkRoomAvailability中,将其返回

response = {
                'fulfillmentText': x
            }
return response #ADD THIS LINE

删除这些行

 if __name__ == '__main__':
        meetingRoomObj = MeetingRoom(datetime3, 15, emailparam)
        meetingRoomObj.checkRoomAvailability()

然后添加对象创建并在创建响应之前立即调用

meetingRoomObj = MeetingRoom(datetime3, 15, emailparam)
response = meetingRoomObj.checkRoomAvailability()
res = create_response(response)
return res

建议

您对python或作用域的工作方式缺乏基本的了解,所以我建议带一位熟识的朋友 https://docs.python.org/3.3/reference/executionmodel.html