Hello all,

I am trying to use Google App Engine queues API, and I am having
problems with this. It seems that in some part of the process the CSRF
it's not working or it's getting problems with the api.

as I understand the api executes the task calling the url and making
and http request in background.

The complete url is the API is calling is →
http://localhost.localdomain:8000/admin/cooking/recipe/36/chefworker/

When it raises this exception:

    Traceback (most recent call last):
      File "/home/mariocesar/Proyectos/Cooking/cooking/django/core/
handlers/base.py", line 100, in get_response
        response = callback(request, *callback_args,
**callback_kwargs)
      File "/home/mariocesar/Proyectos/Cooking/cooking/django/views/
decorators/csrf.py", line 24, in wrapped_view
        resp.csrf_exempt = True
    AttributeError: 'NoneType' object has no attribute 'csrf_exempt'

So, the csrf middleware, the cookie, some data or the response itself
is missing from the request that the GAE api makes to execute the task
in the background.

How to solve this without disabling CSRF on Django? however, it's
posible to have views for workers using  djangoappengine at all?

Down are the models.py and admin.py files I am using.

**models.py**

    from django.db import models

    class Recipe(models.Model):
        name = models.CharField(max_length=140)
        description = models.TextField()
        cooking_time = models.PositiveIntegerField()
        status = models.CharField(max_length=40)

        def __unicode__(self):
            return self.name

        def cookthis(self):
            import time
            self.status = 'The chef is cooking this recipe'
            self.save()
            time.sleep(obj.cooking_time)
            self.status = 'It\'s done ! the recipe is ready to serve'
            self.save()

**admin.py**

    import logging

    from django.contrib import admin, messages
    from django.http import HttpResponse
    from django.utils.functional import update_wrapper
    from django.contrib.admin.util import unquote
    from django.shortcuts import get_object_or_404, render_to_response
    from django import template
    from django.core.urlresolvers import reverse
    from google.appengine.api import taskqueue
    from google.appengine.api.taskqueue import TaskAlreadyExistsError

    from cooking.models import Recipe
    from django.views.decorators.csrf import csrf_exempt

    class AdminRecipe(admin.ModelAdmin):
        def get_urls(self):
            from django.conf.urls.defaults import patterns, url

            def wrap(view):
                def wrapper(*args, **kwargs):
                    return self.admin_site.admin_view(view)(*args,
**kwargs)
                return update_wrapper(wrapper, view)

            info = self.model._meta.app_label,
self.model._meta.module_name

            urlpatterns = super(AdminRecipe, self).get_urls()
            myurls = patterns('',
                url(r'^(.+)/cook/$',
                    wrap(self.cook_view),
                    name='%s_%s_chefworker' % info),
                url(r'^(.+)/chefworker/$',
                    wrap(self.chefworker_worker),
                    name='%s_%s_chefworker' % info),
            )
            return myurls + urlpatterns

        def cook_view(self, request, object_id, extra_context=None):
            obj = get_object_or_404(Recipe, pk=unquote(object_id))
            if request.POST:
                try:
                    taskqueue.add(
                        name="recipie-%s" % obj.id,
                        url=reverse('admin:cooking_recipe_chefworker',
args=(obj.id,))
                    )
                    messages.add_message(request, messages.INFO, 'Chef
is cooking the recipe.')
                except TaskAlreadyExistsError:
                    messages.add_message(request, messages.ERROR,
'chef is already cooking that recipe.')

            context_instance = template.RequestContext(request,
current_app=self.admin_site.name)
            return render_to_response("admin/cooking/recipe/
cook_view.html", {'object': obj}, context_instance=context_instance)

        #TODO: Add csrf token on form
        @csrf_exempt
        def chefworker_worker(self, request, object_id,
extra_context=None):
            import time

            if request.POST:
                obj = get_object_or_404(Recipe, pk=unquote(object_id))
                obj.cookthis()

            return HttpResponse('done')

    admin.site.register(Recipe, AdminRecipe)


A VERY IMPORTANT NOTE:
Was hard to debug this error, cause the dev_appserver logger was just
raising 403 errors, no other info; so, I have to patch the file google/
appengine/api/taskqueue/taskqueue_stub.py line 574 and add
"logging.info('response --- \n%s' % result)" to get the output of the
exceptions.

I would appreciate any help

Best Regards

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.

Reply via email to