Statut 405 de la file d'attente des tâches
-
25-10-2019 - |
Question
Je veux résoudre un état 405 que je reçois de la file d'attente des tâches lorsque vous essayez de générer un rapport:
2012-02-16 03:56:53.012 /report/ 405 3ms 0kb AppEngine-Google; (+http://code.google.com/appengine)
2012-02-16 03:56:53.007 /createreport/ 302 20ms 0kb Mozilla/5.0 (X11; Linux x86_64; rv:2.0) Gecko/20100101 Firefox/4.0
I 2012-02-16 03:56:52.990 creating report task
Le code qui crée la tâche est
class CreateReportHandler(webapp2.RequestHandler):
def get(self):
logging.info('creating report task')
taskqueue.add(url=r'/report/')
self.redirect('/')
et je l'ai dirigé avec webapp2:
Route(r'/createreport/', handler=CreateReportHandler, name='createreport'),
alors je devrais être en mesure de faire une tâche cron, mais quand je le tester j'obtenir un 405 de l'accès de ce code qui fois si je tente de l'exécuter directement:
class Report(webapp2.RequestHandler):
def get(self):
# Create a conversion request from HTML to PDF.
users = User.query()
today = date.today()
startdate = date(today.year, today.month, 1) # first day of month
html = None
for user in users:
if user.activity() > 0:
logging.info('found active user %s %s' % (user.firstname, user.lastname))
html = '<html><body><table border="1">'
html = html + '<tr><td>ORDER</td><td colspan="2">----DISTRIBUTOR----</td><td>ORDER</td><td>Silver</td><td>%</td><td>Total</td><td>Bonus</td></tr>'
level = user.level()
distributor = user
while distributor.has_downline():
downline = User.query(User.sponsor == distributor.key).order(User.lastname).fetch()
for person in downline: # to this for whole downline
orders = model.Order.all().filter('distributor_id =' , person.key.id()).filter('created >' , startdate).filter('status =', 'PAID').fetch(999999)
silver = 0
name = person.firstname +' '+ person.lastname
for order in orders:
logging.info('found orders')
for idx,item in enumerate(order.items):
purchase = model.Item.get_by_id(long(item.id()))
amount = int(order.amounts[idx])
silver = silver + amount*purchase.silver/1000.000
if len(name) > 13:
name = name[13]
html = html + '<tr><td>' + str(order.created.date().day)+'/'+ str(order.created.date().month )+'</td><td>' + filters.makeid(person.key.id()) +'</td><td>' + name + '</td><td>' + str(order.key().id()) + '</td><td>' + str(silver)
dist_level = order.dist_level
bonus = 0
if level == 5 and dist_level == 4:
bonus = 0.05
if level == 5 and dist_level == 3:
bonus = 0.1
if level == 5 and dist_level == 2:
bonus = 0.13
if level == 5 and dist_level == 1:
bonus = 0.35
if level == 4 and dist_level == 3:
bonus = 0.05
if level == 4 and dist_level == 2:
bonus = 0.08
if level == 4 and dist_level == 1:
bonus = 0.3
if level == 3 and dist_level == 2:
bonus = 0.03
if level == 3 and dist_level == 1:
bonus = 0.25
if level == 2 and dist_level == 1:
bonus = 0.2
html = html + '</td><td>' + str(bonus) + '</td><td>' + str(order.total)
bonusmoney = bonus * float(order.total)
html = html + '</td><td>' + str(bonusmoney) + '</td></tr>'
distributor = person
html = html + '</table>'
asset = conversion.Asset("text/html", html, "test.html")
conversion_obj = conversion.Conversion(asset, "application/pdf")
rpc = conversion.create_rpc()
conversion.make_convert_call(rpc, conversion_obj)
result = rpc.get_result()
if result.assets:
for asset in result.assets:
logging.info('emailing report')# to %s' % user.email)
message = mail.EmailMessage(sender='noreply@bnano.se',
subject='Report %s %s' % (user.firstname, user.lastname))
message.body = 'Here is the monthly report'
message.to = 'niklasro@gmail.com'
message.bcc = 'fridge@koolbusiness.com'
message.attachments = ['report.pdf', asset.data]
message.send()
logging.info('message sent')
Comment puis-je résoudre le statut 405 et passer à travers l'exécution?
Merci
La solution
Je suis venu de GAE / J-terre, donc je ne suis pas familier avec Python, mais je l'avais rencontré une réponse 405
de mon travailleur TaskQueue avant. Dans mon cas, il est causé du fait de régler la méthode de TaskOption
à POST
pendant la construction du Task
, alors que mon gestionnaire ne sert que les demandes GET
.
EDIT: Après avoir vérifié la TaskQueue.add () docs , il apparaît que la méthode par défaut utilisée si la méthode n'est pas spécifiée (comme dans votre exemple de code) est POST, alors que votre gestionnaire ne semble en mesure de répondre aux requêtes GET.
Ma suggestion serait préciser explicitement que vos utilisations de travail au lieu de la méthode GET POST, ou modifier la méthode traitée de votre gestionnaire en POST au lieu de GET.
Autres conseils
Je veux juste ajouter un scénario possible depuis une recherche rapide de " TaskQueue 405 " toutes les extrémités vers le haut dans cette page:
Je suis 405 erreurs car ne spécifiait pas un paramètre « cible ». taskqueue.add()
finit par ajouter la tâche à la cible par défaut, où mes gestionnaires sont sur un module de back-end séparé.
Si la cible est non spécifiée, alors les tâches sont appelées sur la même version de l'application où ils ont été en file d'attente. Donc, si vous un en file d'attente tâche à partir de la version de l'application par défaut sans spécifier une cible sur la file d'attente, la tâche est invoquée dans la version de l'application par défaut.