Python对象实例未保存在Flask应用程序上下文中

时间:2019-03-06 14:25:03

标签: python-3.x flask google-api-client flask-extensions

我已经制作了简单的Flask扩展名,其中包含Google API Client for Python

where (select ...) = ANY(assemblies)

在我的oauth2回调视图中,我通过调用基于凭据创建API客户端实例的class ProximityBeaconAPI: ''' Simple Flask extension for accessing Google Proxmity Beacon API. https://developers.google.com/resources/api-libraries/documentation/proximitybeacon/v1beta1/python/latest/ ''' def __init__(self, app=None, credentials=None): if app: self.init_app(app) if credentials: self.init_api(credentials) def init_app(self, app): ''' Initialize Flask app for extension ''' self.app = app self._project_id = app.config.PROJECT_ID @property def is_initialized(self): ''' Checks if Proximity Beacon API is initialized. :return: bool ''' ctx = _app_ctx_stack.top return hasattr(ctx, 'proximitybeaconapi') def init_api(self, credentials): ''' Initialize Proximity Beacon API :param credentials: google.oauth2.credentials.Credentials object ''' proximitybeaconapi = discovery.build( OAUTH2.API_NAME, OAUTH2.API_VERSION, credentials=credentials) ctx = _app_ctx_stack.top if ctx is not None: if not hasattr(ctx, 'proximitybeaconapi'): ctx.proximitybeaconapi = proximitybeaconapi def get_utoken(self): ''' Checks if for beacon with given name u_token attachment is set. :param beacon_name: name of the beacon :param namespace: namespace ''' beacon_name = self.get_default_auth_beacon_name() ctx = _app_ctx_stack.top namespace = self.get_default_project_namespace().split('/')[1] namespaced_type = '{}/u_token'.format(namespace) query = { 'beaconName': beacon_name, 'namespacedType': namespaced_type } resp = ctx.proximitybeaconapi.beacons().attachments().list(**query).execute() b64_data = resp['attachments'][0]['data'] return self._base64_to_str(b64_data) def is_utoken_valid(self, u_token): ''' Checks if recieved token is valid with current u_token attachment. :param u_token: incomming u_token :return: True or False ''' incomming_token = self._base64_to_str(u_token) current_token = self.get_utoken() return incomming_token == current_token 方法来初始化Google API:

init_api

然后在另一个端点中,我调用使用初始化的早期客户端库的方法def init_api(self, credentials): ''' Initialize Proximity Beacon API :param credentials: google.oauth2.credentials.Credentials object ''' proximitybeaconapi = discovery.build( OAUTH2.API_NAME, OAUTH2.API_VERSION, credentials=credentials) ctx = _app_ctx_stack.top if ctx is not None: if not hasattr(ctx, 'proximitybeaconapi'): ctx.proximitybeaconapi = proximitybeaconapi 。 我的端点

get_token

def post(self): data = api.payload u_token = data.pop('u_token') token = beaconapi.get_utoken() # other code ... 利用客户端的方法:

get_utoken

但是我遇到def get_utoken(self): ''' Checks if for beacon with given name u_token attachment is set. :param beacon_name: name of the beacon :param namespace: namespace ''' beacon_name = self.get_default_auth_beacon_name() ctx = _app_ctx_stack.top # getting client from application context # ... response = ctx.proximitybeaconapi.beacons().attachments().list(**query) return response 错误,尽管我早些时候在应用上下文中设置了此属性:

AttributeError: 'AppContext' object has no attribute 'proximitybeaconapi'

当我在调用最后一个端点时使用 File "/home/devaerial/Source/automoticz-server/automoticz/utils/beacons.py", line 61, in get_default_auth_beacon_name response = ctx.proximitybeaconapi.beacons().list(q=query).execute() AttributeError: 'AppContext' object has no attribute 'proximitybeaconapi' 设置ctx客户端实例时,proximitybeaconapi上下文似乎没有保存

我在这里做什么错了?

P.S:我正在遵循Flask官方文档中的this示例。

0 个答案:

没有答案