【发布时间】:2016-09-30 19:36:23
【问题描述】:
尝试尝试并构建一个解决使用 UrlRequest 的类,以检查给定的 URL 是否有效。结果比预期的要困难一些!
问题是定义为类的一部分的 on_success 和 on_failure/error 方法永远不会被调用。该脚本抛出以下输出(基于打印命令):
http://www.google.com
request sent
URL doesn't work
现在我怀疑我是从 test_connection 方法获取返回码(“None”),而不是 connectionSuccess 或 connectionFailure。我怎样才能让电话等待后者之一给予回报?欢迎任何建议。谢谢。
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.network.urlrequest import UrlRequest
class WebExplorer():
def test_connection(self, path):
self.path = path
print (self.path)
req = UrlRequest(self.path,on_failure=self.connectionFailure,on_error=self.connectionFailure,on_success=self.connectionSuccess)
print ("request sent")
def connectionSuccess(self,*args):
print ("connectionSuccess")
return 0
def connectionFailure(self,*args):
print ("connectionFailure")
return 1
class MainScreen(FloatLayout):
def __init__(self, **kwargs):
super(MainScreen, self).__init__(**kwargs)
self.address = 'http://www.google.com'
if WebExplorer().test_connection(self.address) == 0:
print ("URL works")
else:
print ("URL doesn't work")
class App(App):
def build(self):
return MainScreen()
if __name__ == "__main__":
App().run()
更新 2016-09-27 我改变了我的代码,我花了几个小时试图找出问题所在。先上代码:
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.network.urlrequest import UrlRequest
class WebExplorer():
def test_connection(self, path):
self.path = path
req = UrlRequest(self.path,on_failure=self.connectionFailure,on_error=self.connectionFailure,on_success=self.connectionSuccess)
req.wait()
return (self._return_value)
def connectionSuccess(self, req, results):
print ("Success")
self._return_value = [0,results]
def connectionFailure(self, req, results):
print ("Failure")
self._return_value = [1,results]
class MainScreen(FloatLayout):
def __init__(self, **kwargs):
super(MainScreen, self).__init__(**kwargs)
self.URLtest = ['http://www.ikea.com/','https://www.google.com','https://www.sdfwrgaeh.com']
for URL in self.URLtest:
self.returnCode = WebExplorer().test_connection(URL)
if self.returnCode[0] == 0:
print ("Correct URL")
else:
print ("Wrong URL")
class App(App):
def build(self):
return MainScreen()
if __name__ == "__main__":
App().run()
为什么是 3 个网址?因为一个是“正确的”(宜家),一个是重定向(谷歌),一个是完全伪造的。事实证明,该代码仅适用于第一个。当结果是失败/错误时,req.wait 不起作用(顺便说一句,我不知道这两者之间有什么区别)。
所以问题是如何使 req.wait 进程失败,或者如何使用正确的错误代码退出类。我考虑使用 Clock.schedule_interval 定期检查状态,但是由于 URL 不正确时甚至不执行事件方法,所以我无处设置变量-_-
【问题讨论】:
标签: kivy urlrequest