webapp2 handlers for @task. Use this in your webapp2 app. Also supports webapp
Project description
# appenginetaskutils
This is the repo for the appengine task utils library. It generates the appenginetaskutils package
## Install
Use the python package for this library. You can find the package online [here](https://pypi.python.org/pypi/appenginetaskutils).
Change to your Python App Engine project's root folder and do the following:
> pip install appenginetaskutils --target lib
Or add it to your requirements.txt. You'll also need to set up vendoring, see [app engine vendoring instructions here](https://cloud.google.com/appengine/docs/python/tools/using-libraries-python-27).
## @task
The most basic element of the taskutils library is task(). This decorator function is designed to be used as a replacement for [deferred](https://cloud.google.com/appengine/articles/deferred).
### Configuring @task
When using deferred you have a builtin to configure in app.yaml to make it work. For taskutils.task, you need to add the following to your app.yaml and/or \<servicename\>.yaml file:
handlers:
- url: /_ah/task/.*
script: taskutils.app
login: admin
This rule creates a generic handler for task to defer work to background push tasks.
Add it at the top of the list (to make sure other rules don't override it).
### Importing task
You can import task into your modules like this:
from taskutils import task
### Using task as a decorator
You can take any function and make it run in a separate task, like this:
@task
def myfunction():
... do stuff ...
Just call the function normally, eg:
myfunction()
You can use @task on any function, including nested functions, recursive functions, recursive nested functions, the sky is the limit. This is possible because of use of [yccloudpickle](https://medium.com/the-infinite-machine/python-function-serialisation-with-yccloudpickle-b2ff6b2ad5da#.zei3n0ibu) as the underlying serialisation library.
Your function can also have arguments, including other functions:
def myouterfunction(mapf):
@task
def myinnerfunction(objects):
for object in objects:
mapf(object)
...get some list of lists of objects...
for objects in objectslist:
myinnerfunction(objects)
def dosomethingwithobject(object):
... do something with an object ...
myouterfunction(dosomethingwithobject)
The functions and arguments are being serialised and deserialised for you behind the scenes.
When enqueuing a background task, the App Engine Task and TaskQueue libraries can take a set of parameters. You can pass these to the decorator:
@task(queue="myqueue", countdown=5)
def anotherfunction():
... do stuff ...
Details of the arguments allowed to Tasks are available [here](https://cloud.google.com/appengine/docs/python/refdocs/google.appengine.api.taskqueue), under **class google.appengine.api.taskqueue.Task(payload=None, \*\*kwargs)**. The task decorator supports a couple of extra ones, detailed below.
### Using task as a factory
You can also use task to decorate a function on the fly, like this:
def somefunction(a, b):
... does something ...
somefunctionintask = task(somefunction, queue="myqueue")
Then you can call the function returned by task when you are ready:
somefunctionintask(1, 2)
You could do both of these steps at once, too:
task(somefunction, queue="myqueue")(1, 2)
### transactional
Pass transactional=True to have your [task launch transactionally](https://cloud.google.com/appengine/docs/python/datastore/transactions#transactional_task_enqueuing). eg:
@task(transactional=True)
def myserioustransactionaltask():
...
### includeheaders
If you'd like access to headers in your function (a dictionary of headers passed to your task, it's a web request after all), set includeheaders=True in your call to @task. You'll also need to accept the headers argument in your function.
@task(includeheaders=True)
def myfunctionwithheaders(amount, headers):
... stuff ...
myfunctionwithheaders(10)
App Engine passes useful information to your task in headers, for example X-Appengine-TaskRetryCount.
### other bits
When using deferred, all your calls are logged as /_ah/queue/deferred. But @task uses a url of the form /_ah/task/\<module\>/\<function\>, eg:
/_ah/task/mymodule/somefunction
which makes debugging a lot easier.
This is the repo for the appengine task utils library. It generates the appenginetaskutils package
## Install
Use the python package for this library. You can find the package online [here](https://pypi.python.org/pypi/appenginetaskutils).
Change to your Python App Engine project's root folder and do the following:
> pip install appenginetaskutils --target lib
Or add it to your requirements.txt. You'll also need to set up vendoring, see [app engine vendoring instructions here](https://cloud.google.com/appengine/docs/python/tools/using-libraries-python-27).
## @task
The most basic element of the taskutils library is task(). This decorator function is designed to be used as a replacement for [deferred](https://cloud.google.com/appengine/articles/deferred).
### Configuring @task
When using deferred you have a builtin to configure in app.yaml to make it work. For taskutils.task, you need to add the following to your app.yaml and/or \<servicename\>.yaml file:
handlers:
- url: /_ah/task/.*
script: taskutils.app
login: admin
This rule creates a generic handler for task to defer work to background push tasks.
Add it at the top of the list (to make sure other rules don't override it).
### Importing task
You can import task into your modules like this:
from taskutils import task
### Using task as a decorator
You can take any function and make it run in a separate task, like this:
@task
def myfunction():
... do stuff ...
Just call the function normally, eg:
myfunction()
You can use @task on any function, including nested functions, recursive functions, recursive nested functions, the sky is the limit. This is possible because of use of [yccloudpickle](https://medium.com/the-infinite-machine/python-function-serialisation-with-yccloudpickle-b2ff6b2ad5da#.zei3n0ibu) as the underlying serialisation library.
Your function can also have arguments, including other functions:
def myouterfunction(mapf):
@task
def myinnerfunction(objects):
for object in objects:
mapf(object)
...get some list of lists of objects...
for objects in objectslist:
myinnerfunction(objects)
def dosomethingwithobject(object):
... do something with an object ...
myouterfunction(dosomethingwithobject)
The functions and arguments are being serialised and deserialised for you behind the scenes.
When enqueuing a background task, the App Engine Task and TaskQueue libraries can take a set of parameters. You can pass these to the decorator:
@task(queue="myqueue", countdown=5)
def anotherfunction():
... do stuff ...
Details of the arguments allowed to Tasks are available [here](https://cloud.google.com/appengine/docs/python/refdocs/google.appengine.api.taskqueue), under **class google.appengine.api.taskqueue.Task(payload=None, \*\*kwargs)**. The task decorator supports a couple of extra ones, detailed below.
### Using task as a factory
You can also use task to decorate a function on the fly, like this:
def somefunction(a, b):
... does something ...
somefunctionintask = task(somefunction, queue="myqueue")
Then you can call the function returned by task when you are ready:
somefunctionintask(1, 2)
You could do both of these steps at once, too:
task(somefunction, queue="myqueue")(1, 2)
### transactional
Pass transactional=True to have your [task launch transactionally](https://cloud.google.com/appengine/docs/python/datastore/transactions#transactional_task_enqueuing). eg:
@task(transactional=True)
def myserioustransactionaltask():
...
### includeheaders
If you'd like access to headers in your function (a dictionary of headers passed to your task, it's a web request after all), set includeheaders=True in your call to @task. You'll also need to accept the headers argument in your function.
@task(includeheaders=True)
def myfunctionwithheaders(amount, headers):
... stuff ...
myfunctionwithheaders(10)
App Engine passes useful information to your task in headers, for example X-Appengine-TaskRetryCount.
### other bits
When using deferred, all your calls are logged as /_ah/queue/deferred. But @task uses a url of the form /_ah/task/\<module\>/\<function\>, eg:
/_ah/task/mymodule/somefunction
which makes debugging a lot easier.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
im_task_webapp2-0.1.0.tar.gz
(3.4 kB
view details)
Built Distribution
File details
Details for the file im_task_webapp2-0.1.0.tar.gz
.
File metadata
- Download URL: im_task_webapp2-0.1.0.tar.gz
- Upload date:
- Size: 3.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 335bb090a2ee8d01feaac38c3ef44cf50aa28928f89e9757712db06eacc8f004 |
|
MD5 | b213fa8a40cd83e68fdea2ae112ef4bc |
|
BLAKE2b-256 | a216431a7442a32d542aca9ea01294939d7ba5afa2c26685dc9ed35b941cb362 |
File details
Details for the file im_task_webapp2-0.1.0-py2.py3-none-any.whl
.
File metadata
- Download URL: im_task_webapp2-0.1.0-py2.py3-none-any.whl
- Upload date:
- Size: 6.4 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f0a964d156291d9e66181bd54de5b4ef17da510261116d01aa5714087c81500e |
|
MD5 | d5073c2ab4c91c8edfceeacce90a03f1 |
|
BLAKE2b-256 | 8c12f4e23ec0fba4ecbe138104c462aa705b921dc8064f174c39f07ee2b2f1c5 |