Google App Engine 대기열 API를 사용하려고하는데이 문제를 테스트하는 데 문제가 있습니다. 프로세스의 일부에서 CSRF가 작동하지 않는 것으로 보입니다.Django에서 Google App Engine 대기열 서비스 사용
api가 url을 호출하고 백그라운드에서 http 요청을 작성하는 작업을 수행함을 이해합니다.
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'
그래서, CSRF 미들웨어, 쿠키, 데이터 나 응답이 자체에서 누락 :이 예외가 발생하면 전체 URL이 API가 호출되는
는 http://localhost.localdomain:8000/admin/cooking/recipe/36/chefworker/
→이다 GAE API가 백그라운드에서 작업을 실행하도록 요청합니다.
장고에서 CSRF를 비활성화하지 않고이를 해결하는 방법은 무엇입니까? 그러나, 그것은 장고 펭귄과 함께 할 수 있습니다.
아래는 내가 사용중인 models.py 및 admin.py 파일입니다.
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)
중요 참고 : 이 오류를 디버깅 dev_appserver 로거 단지 403 오류를 제기 한 원인이 어려웠 , 다른 정보 없음; 그래서 나는 google/appengine/api/taskqueue/taskqueue_stub.py 라인 574에 패치를하고 "logging.info ('응답 --- \ n % s'% 결과)"를 추가하여 출력을 얻어야합니다.
GET을 메서드로 사용하면 프로세스가 백그라운드에서 실행되고 있지 않은 것 같습니다. –
GET을 사용하는 것은 실제로는 가장 깨끗한 작업이 아닙니다. 거의 항상 작업 대기열에 POST를 사용하는 것이 좋습니다. 아래 나의 새로운 대답을 참조하십시오. –