如何防止对象的 class 改变
How to prevent an object's class from changing
我在使用对象的 Flask 应用程序中遇到问题。函数第一次是 运行,它 运行 完全没问题。第二次是 运行,但是,我得到一个错误,指出 'str' 对象没有属性 SubmitFeedResult。我可以通过重新启动应用程序并再次 运行ning 函数来解决这个问题(然后 运行 没问题)。在函数 运行 之后,对象被更改为字符串,我想知道是否有办法防止对象的 class 更改为字符串(我倾向于否,因为它这样做由于我正在使用的库中的源代码),或者解决这个问题的好方法。对于其他用户成功申请运行,我不能有对象 class str
几个月前我问过这个问题,简单地解决了,但现在问题又回来了。对于某些上下文,这是原始 post 的 link:
这是主要功能:
@app.route('/submission/', methods=['GET','POST'])
def feed_submission():
if request.method == 'POST':
file = request.files['file']
# Only XML files allowed
if not allowed_filetype(file.filename):
output = '<h2 style="color:red">Filetype must be XML! Please upload an XML file.</h2>'
return output
raise ValueError('Filetype Must Be XML.')
# Read file and encode it for transfer to Amazon
file_name = request.form['file_name']
f = file.read()
u = f.decode("utf-8-sig")
c = u.encode("utf-8")
feed_content = c
submit_feed_response = conn.submit_feed(
FeedType=feed_operation(file_name),
PurgeAndReplace=False,
MarketplaceIdList=[MARKETPLACE_ID],
content_type='text/xml',
FeedContent=feed_content)
feed_info = submit_feed_response.SubmitFeedResult.FeedSubmissionInfo.FeedSubmissionId
return redirect(url_for('feed_result', feed_id=feed_info))
else:
return render_template('submit_feed.html',access_key=MWS_ACCESS_KEY,secret_key=MWS_SECRET_KEY,
merchant_id=MERCHANT_ID,marketplace_id=MARKETPLACE_ID)
在这个函数 运行s 之后,它重定向到这个函数到 return 请求的响应:
@app.route('/feed-result/<int:feed_id>')
def feed_result(feed_id):
response = MWSConnection._parse_response = lambda s,x,y,z: z
submitted_feed = conn.get_feed_submission_result(FeedSubmissionId=feed_id)
result = Response(submitted_feed, mimetype='text/xml')
return(result)
我在问题发生之前和之后记录了 submit_feed_response
的类型和值的信息,以查看导致错误的原因:
typeof1 = type(submit_feed_response)
val1 = submit_feed_response
typeof_conn1 = type(conn)
app.logger.warning("Type of submit_feed_response (original): " + str(typeof1))
app.logger.warning("Value of submit_feed_response: " + str(val1))
在日志中,当应用 运行 正常运行时,我看到:
Type of submit_feed_response (original): <class 'boto.mws.response.SubmitFeedResponse'>
Value of submit_feed_response: SubmitFeedResponse{u'xmlns': u'http://mws.amazonaws.com/doc/2009-01-01/'}(SubmitFeedResult: SubmitFeedResult{}(FeedSubmissionInfo: FeedSubmissionInfo{}...
失败后,我看到(如预期的那样)类型是字符串:
Type of submit_feed_response: <type 'str'>
Value of submit_feed_response: <?xml version="1.0"?>
......
这是回溯:
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\flask\app.py", line 2000, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Python27\lib\site-packages\flask\app.py", line 1991, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "C:\Python27\lib\site-packages\flask\app.py", line 1567, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Python27\lib\site-packages\flask\app.py", line 1988, in wsgi_app
response = self.full_dispatch_request()
File "C:\Python27\lib\site-packages\flask\app.py", line 1641, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Python27\lib\site-packages\flask\app.py", line 1544, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Python27\lib\site-packages\flask\app.py", line 1639, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Python27\lib\site-packages\flask\app.py", line 1625, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\CTS 41\Documents\Amazon-app\application.py", line 98, in feed_submission
feed_info = submit_feed_response.SubmitFeedResult.FeedSubmissionInfo.FeedSubmissionId
AttributeError: 'str' object has no attribute 'SubmitFeedResult'
似乎库导致对象 return 一个字符串,一旦它是 运行。有没有一个好的 pythonic 方法解决这个问题?即我是否能够以某种方式更改对象的 class 以确保它保持不变,或者将其从内存中完全删除?我尝试了一个 try except 块,但返回同样的错误。
编辑
我已将问题缩小为:
response = MWSConnection._parse_response = lambda s,x,y,z: z
在函数 feed_result
中。 return 来自 boto 的 XML 响应(调用不会自然地以 XML 格式返回,我不确定 return 它的另一种方法XML,参考How can I return XML from boto calls?).
我决定插入
MWSConnection._parse_response = None
行上方
feed_info = feed.SubmitFeedResult.FeedSubmissionInfo.FeedSubmissionId
,但是它仍然返回同样的错误。有没有办法可以在 运行 一次后从内存中清除这个函数?我需要这个函数来正确地提供响应,但也许有更好的方法?
我能够解决这个问题。如问题中所述,问题源于 feed_result
中的 response = MWSConnection._parse_response = lambda s,x,y,z: z
行。此行是将响应解析为 XML 并提供服务所必需的,这导致在调用此函数后将提要提交的响应解析为 XML 字符串。为了解决这个问题,我检查了 feed
是否不是字符串,并像我最初那样检索了 ID:
if type(feed) is not str:
feed_info = feed.SubmitFeedResult.FeedSubmissionInfo.FeedSubmissionId
如果是字符串,则使用 ElementTree 将其解析为 XML 字符串以检索 ID:
else:
tree = et.fromstring(feed)
xmlns = {'response': '{http://mws.amazonaws.com/doc/2009-01-01/}'}
info = tree.find('.//{response}FeedSubmissionId'.format(**xmlns))
feed_info = info.text
现在无需重新启动应用程序即可正常工作。
我在使用对象的 Flask 应用程序中遇到问题。函数第一次是 运行,它 运行 完全没问题。第二次是 运行,但是,我得到一个错误,指出 'str' 对象没有属性 SubmitFeedResult。我可以通过重新启动应用程序并再次 运行ning 函数来解决这个问题(然后 运行 没问题)。在函数 运行 之后,对象被更改为字符串,我想知道是否有办法防止对象的 class 更改为字符串(我倾向于否,因为它这样做由于我正在使用的库中的源代码),或者解决这个问题的好方法。对于其他用户成功申请运行,我不能有对象 class str
几个月前我问过这个问题,简单地解决了,但现在问题又回来了。对于某些上下文,这是原始 post 的 link:
这是主要功能:
@app.route('/submission/', methods=['GET','POST'])
def feed_submission():
if request.method == 'POST':
file = request.files['file']
# Only XML files allowed
if not allowed_filetype(file.filename):
output = '<h2 style="color:red">Filetype must be XML! Please upload an XML file.</h2>'
return output
raise ValueError('Filetype Must Be XML.')
# Read file and encode it for transfer to Amazon
file_name = request.form['file_name']
f = file.read()
u = f.decode("utf-8-sig")
c = u.encode("utf-8")
feed_content = c
submit_feed_response = conn.submit_feed(
FeedType=feed_operation(file_name),
PurgeAndReplace=False,
MarketplaceIdList=[MARKETPLACE_ID],
content_type='text/xml',
FeedContent=feed_content)
feed_info = submit_feed_response.SubmitFeedResult.FeedSubmissionInfo.FeedSubmissionId
return redirect(url_for('feed_result', feed_id=feed_info))
else:
return render_template('submit_feed.html',access_key=MWS_ACCESS_KEY,secret_key=MWS_SECRET_KEY,
merchant_id=MERCHANT_ID,marketplace_id=MARKETPLACE_ID)
在这个函数 运行s 之后,它重定向到这个函数到 return 请求的响应:
@app.route('/feed-result/<int:feed_id>')
def feed_result(feed_id):
response = MWSConnection._parse_response = lambda s,x,y,z: z
submitted_feed = conn.get_feed_submission_result(FeedSubmissionId=feed_id)
result = Response(submitted_feed, mimetype='text/xml')
return(result)
我在问题发生之前和之后记录了 submit_feed_response
的类型和值的信息,以查看导致错误的原因:
typeof1 = type(submit_feed_response)
val1 = submit_feed_response
typeof_conn1 = type(conn)
app.logger.warning("Type of submit_feed_response (original): " + str(typeof1))
app.logger.warning("Value of submit_feed_response: " + str(val1))
在日志中,当应用 运行 正常运行时,我看到:
Type of submit_feed_response (original): <class 'boto.mws.response.SubmitFeedResponse'>
Value of submit_feed_response: SubmitFeedResponse{u'xmlns': u'http://mws.amazonaws.com/doc/2009-01-01/'}(SubmitFeedResult: SubmitFeedResult{}(FeedSubmissionInfo: FeedSubmissionInfo{}...
失败后,我看到(如预期的那样)类型是字符串:
Type of submit_feed_response: <type 'str'>
Value of submit_feed_response: <?xml version="1.0"?>
......
这是回溯:
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\flask\app.py", line 2000, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Python27\lib\site-packages\flask\app.py", line 1991, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "C:\Python27\lib\site-packages\flask\app.py", line 1567, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Python27\lib\site-packages\flask\app.py", line 1988, in wsgi_app
response = self.full_dispatch_request()
File "C:\Python27\lib\site-packages\flask\app.py", line 1641, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Python27\lib\site-packages\flask\app.py", line 1544, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Python27\lib\site-packages\flask\app.py", line 1639, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Python27\lib\site-packages\flask\app.py", line 1625, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\CTS 41\Documents\Amazon-app\application.py", line 98, in feed_submission
feed_info = submit_feed_response.SubmitFeedResult.FeedSubmissionInfo.FeedSubmissionId
AttributeError: 'str' object has no attribute 'SubmitFeedResult'
似乎库导致对象 return 一个字符串,一旦它是 运行。有没有一个好的 pythonic 方法解决这个问题?即我是否能够以某种方式更改对象的 class 以确保它保持不变,或者将其从内存中完全删除?我尝试了一个 try except 块,但返回同样的错误。
编辑
我已将问题缩小为:
response = MWSConnection._parse_response = lambda s,x,y,z: z
在函数 feed_result
中。 return 来自 boto 的 XML 响应(调用不会自然地以 XML 格式返回,我不确定 return 它的另一种方法XML,参考How can I return XML from boto calls?).
我决定插入
MWSConnection._parse_response = None
行上方
feed_info = feed.SubmitFeedResult.FeedSubmissionInfo.FeedSubmissionId
,但是它仍然返回同样的错误。有没有办法可以在 运行 一次后从内存中清除这个函数?我需要这个函数来正确地提供响应,但也许有更好的方法?
我能够解决这个问题。如问题中所述,问题源于 feed_result
中的 response = MWSConnection._parse_response = lambda s,x,y,z: z
行。此行是将响应解析为 XML 并提供服务所必需的,这导致在调用此函数后将提要提交的响应解析为 XML 字符串。为了解决这个问题,我检查了 feed
是否不是字符串,并像我最初那样检索了 ID:
if type(feed) is not str:
feed_info = feed.SubmitFeedResult.FeedSubmissionInfo.FeedSubmissionId
如果是字符串,则使用 ElementTree 将其解析为 XML 字符串以检索 ID:
else:
tree = et.fromstring(feed)
xmlns = {'response': '{http://mws.amazonaws.com/doc/2009-01-01/}'}
info = tree.find('.//{response}FeedSubmissionId'.format(**xmlns))
feed_info = info.text
现在无需重新启动应用程序即可正常工作。