create a Dockerfile
this image will install python and start a SimpleHTTPServer:
FROM ubuntu ENV DEBIAN_FRONTEND noninteractive CMD ["bash"] RUN apt-get update RUN apt-get install -y python EXPOSE 8000 CMD python -m SimpleHTTPServer 8000
Build project
docker build -t myapp:latest .
run docker image
docker run -P myapp
-P for port forwarding: Publish all exposed ports to random ports
check the web page
find port by:
docker ps -l
This project can be found here:
https://github.com/guoliang-dev/docker-hello-world-python
>python -m SimpleHTTPServer $PORT
After chunked uploading completed, commit the file by:
response = self.dropbox_client.commit_chunked_upload('/backup/docs.zip', upload_id, False) remote_path = response['path']
My understanding was remote_path in the response should be same as the full_path I passed: ‘/backup/docs.zip’, however, the remote_path is: ‘docs.zip’. form client.py /commit_chunked_upload:
The full path to which the chunks are uploaded, *including the file name*. If the destination folder does not yet exist, it will be created.
full path with filename, and it’ll be used by:
url, params, headers = self.request("/commit_chunked_upload/%s" % full_path, params, content_server=True)
a http request to : /commit_chunked_upload//backup/docs.zip will be sent. however, the actual server url is:
https://api-content.dropbox.com/1/commit_chunked_upload/auto/<path>
https://www.dropbox.com/developers/core/docs#commit-chunked-upload
1. fix the SDK :
Following CheckedUpload class, the commit url can be generated by:
path = “/commit_chunked_upload/%s%s” % (self.client.session.root, format_path(path))
2. add ‘auto’ in the front of the remote path:
response = self.dropbox_client.commit_chunked_upload('auto/' + remote_path, upload_id, False)
Create new thread to perform the progress:
http://stackoverflow.com/questions/6783194/background-thread-with-qthread-in-pyqt
Try to keep a reference:
http://stackoverflow.com/questions/8359469/python-threading-thread-scopes-and-garbage-collection
Use single to update progress:
http://stackoverflow.com/questions/9682376/progress-bar-with-pyqt
Example: UploadThread:
class UploadTaskQtThread(QtCore.QThread): tick = QtCore.pyqtSignal(int, name="upload_changed") def __init__(self, client, local_path, remote_path): QtCore.QThread.__init__(self) self.client = client self.local_path = local_path self.remote_path = remote_path def on_progress(self, progress): self.tick.emit(progress * 100) def run(self): self.client.upload_file(self.local_path, self.remote_path, self.on_progress)
Client:
def upload(self, local_file_path, remote_path): self.upload_thread = UploadTaskQtThread(client, local_file_path, remote_path) self.upload_thread.start() self.upload_thread.tick.connect(ui.progressBar.setValue)
User class, has one attribute ‘name’:
#User.py class User(object): def __init__(self, name): self.name=name def sayHi(self): print self.name, " say hi to you" def hello(self, *friends): f1, f2 = friends print "hello my friends: ", f1", and ", f2
Initialize User instance and call the methods:
>>> import User >>> john = User.User("John") >>> john.sayHi() John say hi to you >>> john.hello("Luna", "Peter") hello my friends: Luna and Peter
I got confused, because I come from Java, why every method need a ‘self’? we use the instance invoke the method, why we need to supply the instance itself?
Maybe they are static? let’s try to invoke the method in ‘Static’ way:
>>> User.User.sayHi() Traceback (most recent call last): File "", line 1, in TypeError: unbound method sayHi() must be called with User instance as first argument (got nothing instead)
Ok, how about this:
>>> User.User.sayHi(john) John say hi to you
It seems these instance method can be invoked both by Class and instance… that’s why every method requires a ‘self’?
Ok, let’s add a static method:
@staticmethod def staticHi(): print "Static Hi"
Invoke it:
>>> User.User.staticHi() Static Hi >>> john.staticHi() Static Hi
Static method can be called both by Class and instance.
Some topic about ‘slef’:
http://stackoverflow.com/questions/2709821/python-self-explained
http://neopythonic.blogspot.sg/2008/10/why-explicit-self-has-to-stay.html
// Proudly powered by Apache, PHP, MySQL, WordPress, Bootstrap, etc,.