This commit is contained in:
yumoqing 2020-04-26 15:16:31 +08:00
parent e11a398439
commit 35b6d7a565
5 changed files with 89 additions and 38 deletions

View File

@ -86,7 +86,8 @@ class PressableLabel(ButtonBehavior, Text):
class HTTPDataHandler(EventDispatcher): class HTTPDataHandler(EventDispatcher):
def __init__(self, url,method='GET',params={}, def __init__(self, url,method='GET',params={},
headers={}, headers={},
files={} files={},
stream=False
): ):
EventDispatcher.__init__(self) EventDispatcher.__init__(self)
self.url = url self.url = url
@ -94,6 +95,7 @@ class HTTPDataHandler(EventDispatcher):
self.params = params self.params = params
self.headers = headers self.headers = headers
self.files=files self.files=files
self.stream=stream
self.hc = App.get_running_app().hc self.hc = App.get_running_app().hc
self.register_event_type('on_success') self.register_event_type('on_success')
self.register_event_type('on_error') self.register_event_type('on_error')
@ -129,6 +131,8 @@ class HTTPDataHandler(EventDispatcher):
self.hc(self.url,method=self.method, self.hc(self.url,method=self.method,
params=p, params=p,
headers=h, headers=h,
files=self.files,
stream=self.stream,
callback=self.onSuccess, callback=self.onSuccess,
errback=self.onError) errback=self.onError)

35
kivyblocks/hostimage.py Normal file
View File

@ -0,0 +1,35 @@
import tempfile
from kivyblocks.baseWidget import HTTPDataHandler
from kivyblocks.utils import blocksImage, absurl
from kivy.uix.image import Image
class HostImage(Image):
def __init__(self, target,**kwargs):
self.options = kwargs
self.target = target
kwargs['source'] = blocksImage('running.gif')
url = kwargs.get('url')
del kwargs['url']
super().__init__(**kwargs)
self.downloadImage(url)
def downloadImage(url):
realurl = absurl(url,self.target.parenturl)
loader = HTTPDataHandler(url,stream=True)
loader.bind(on_success=self.createTmpfile)
loader.bind(on_failed=self.showBadImage)
loader.handle()
def showBadImage(self,o,e):
self.source = blocksImage('break.png')
def createTmpfile(self,o,resp):
fn = tempfile.NamedTemporaryFile(delete=True)
with open(fn, 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
# f.flush()
self.source = fn

View File

@ -152,7 +152,7 @@ class PageLoader(EventDispatcher):
filter filter
} }
events: events:
'on_bufferraise': erase 'on_deletepage': erase
""" """
class RelatedLoader(PageLoader): class RelatedLoader(PageLoader):
@ -244,8 +244,6 @@ class RelatedLoader(PageLoader):
class Paging(PageLoader): class Paging(PageLoader):
def __init__(self,**options): def __init__(self,**options):
PageLoader.__init__(self,**options) PageLoader.__init__(self,**options)
self.adder = options.get('adder')
self.clearer = options.get('clearer')
self.target = options.get('target') self.target = options.get('target')
self.init() self.init()
@ -254,6 +252,7 @@ class Paging(PageLoader):
kwargs['size_hint_y'] = None kwargs['size_hint_y'] = None
kwargs['height'] = CSize(2) kwargs['height'] = CSize(2)
kwargs['orientation'] = 'horizontal' kwargs['orientation'] = 'horizontal'
kwargs['spacing'] = CSize(1)
self.widget = BoxLayout(**kwargs) self.widget = BoxLayout(**kwargs)
self.b_f = PagingButton(text="|<") self.b_f = PagingButton(text="|<")
self.b_p = PagingButton(text="<") self.b_p = PagingButton(text="<")
@ -270,16 +269,6 @@ class Paging(PageLoader):
if self.filter: if self.filter:
self.widget.add_widget(self.filter) self.widget.add_widget(self.filter)
def show_page(self,o,d):
super().show_page(o,data)
d = DictObject(**d)
self.total_cnt = d.total
self.calculateTotalPage()
self.clearer()
for r in d.rows:
self.adder(r)
self.loading = False
def loadFirstPage(self,o=None): def loadFirstPage(self,o=None):
if self.curpage == 1: if self.curpage == 1:
print('return not loading') print('return not loading')

View File

@ -7,6 +7,7 @@ from .vplayer import VPlayer
from .form import Form, StrSearchForm from .form import Form, StrSearchForm
from .boxViewer import BoxViewer from .boxViewer import BoxViewer
from .pagescontainer import PageContainer from .pagescontainer import PageContainer
from .hostimage import HostImage
r = Factory.register r = Factory.register
r('PageContainer', PageContainer) r('PageContainer', PageContainer)
@ -36,6 +37,7 @@ r('PressableLabel', PressableLabel)
r('Tree',Tree) r('Tree',Tree)
r('TextTree',TextTree) r('TextTree',TextTree)
r('PopupMenu',PopupMenu) r('PopupMenu',PopupMenu)
r('HostImage',HostImage)
if platform == 'android': if platform == 'android':
r('PhoneButton',PhoneButton) r('PhoneButton',PhoneButton)
r('AWebView',AWebView) r('AWebView',AWebView)

View File

@ -89,15 +89,14 @@ class HttpClient:
pre = '/'.join(parts) pre = '/'.join(parts)
return pre return pre
def webcall(self,url,method="GET",params={},files={},headers={}): def _webcall(self,url,method="GET",
params={},
files={},
headers={}
stream=False):
app = App.get_running_app() app = App.get_running_app()
domain = self.url2domain(url) domain = self.url2domain(url)
sessionid = hostsessions.get(domain,None) sessionid = hostsessions.get(domain,None)
print('hostsessions=', hostsessions,
'sessionid=',sessionid,
'domain=',domain,
'url=',url
)
if sessionid: if sessionid:
headers.update({'session':sessionid}) headers.update({'session':sessionid})
elif app.getAuthHeader(): elif app.getAuthHeader():
@ -114,21 +113,8 @@ class HttpClient:
if resp.status_code == 200: if resp.status_code == 200:
h = resp.headers.get('Set-Cookie',None) h = resp.headers.get('Set-Cookie',None)
if h: if h:
print('*************set-Cookie=',h,'domain=',domain)
sessionid = h.split(';')[0] sessionid = h.split(';')[0]
hostsessions[domain] = sessionid hostsessions[domain] = sessionid
try:
data = resp.json()
if type(data) != type({}):
return data
status = data.get('status',None)
if status is None:
return data
if status == 'OK':
return data['data']
return data
except:
return resp.text
if resp.status_code == 401: if resp.status_code == 401:
print('NeedLogin:',url) print('NeedLogin:',url)
raise NeedLogin raise NeedLogin
@ -136,12 +122,46 @@ class HttpClient:
if resp.status_code == 403: if resp.status_code == 403:
raise InsufficientPrivilege raise InsufficientPrivilege
print('Error', url, method, if resp.status_code != 200:
params, resp.status_code, print('Error', url, method,
type(resp.status_code)) params, resp.status_code,
raise HTTPError(resp.status_code) type(resp.status_code))
raise HTTPError(resp.status_code)
return resp
def __call__(self,url,method="GET",params={},headers={},files={},callback=None,errback=None):
def webcall(self,url,method="GET",
params={},
files={},
headers={},
stream=False):
resp = self._webcall(url,method=method,
params=params,
files=files,
headers=headers,
stream=stream)
if stream:
return resp
try:
data = resp.json()
if type(data) != type({}):
return data
status = data.get('status',None)
if status is None:
return data
if status == 'OK':
return data['data']
return data
except:
return resp.text
def __call__(self,url,method="GET",
params={},
headers={},
files={},
stream=False,
callback=None,
errback=None):
def cb(t,resp): def cb(t,resp):
return resp return resp
@ -161,6 +181,7 @@ class HttpClient:
"method":method, "method":method,
"params":params, "params":params,
"files":files, "files":files,
"stream":stream,
"headers":headers "headers":headers
} }
self.workers.add(self.webcall,callback,errback,kwargs=kwargs) self.workers.add(self.webcall,callback,errback,kwargs=kwargs)