Status 405 aus der Task -Warteschlange
-
25-10-2019 - |
Frage
Ich möchte einen Status 405 beheben, den ich aus der Task -Warteschlange bekomme, wenn ich versuche, einen Bericht zu generieren:
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
Der Code, der die Aufgabe erstellt, ist
class CreateReportHandler(webapp2.RequestHandler):
def get(self):
logging.info('creating report task')
taskqueue.add(url=r'/report/')
self.redirect('/')
Und ich habe es mit WebApp2 geleitet:
Route(r'/createreport/', handler=CreateReportHandler, name='createreport'),
Dann sollte ich in der Lage sein, es zu einem Cron -Job zu machen, aber wenn ich es testet, bekomme ich einen 405 vom Zugriff dieses Codes, was ausfällt, wenn ich versuche, ihn direkt auszuführen:
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')
Wie kann ich den Status 405 lösen und die Ausführung durchstehen?
Vielen Dank
Lösung
Ich kam aus GAE/J-Land, also bin ich mit Python nicht vertraut, aber ich war begegnet 405
Antwort von meinem TaskQueue -Arbeiter zuvor. In meinem Fall ist es aufgrund der Einstellung der Einstellung der TaskOption
Methode an POST
Beim Aufbau der Task
, während mein Handler nur dient GET
Anfragen.
Bearbeiten: Nachdem Sie das überprüft haben TaskQueue.add () docs, Es sieht so aus,
Mein Vorschlag wäre ausdrücklich festzustellen, dass Ihre Aufgabe die GET -Methode anstelle von Post verwendet oder die gehandhabte Methode Ihres Handlers in Post anstatt zu erhalten.
Andere Tipps
Ich möchte nur ein mögliches Szenario hinzufügen, seit eine schnelle Suche nach "TaskQueue 405"Alles landet auf dieser Seite:
Ich habe 405 Fehler, weil kein "Ziel" -Parameter angegeben wurde. taskqueue.add()
Fügt dem Standardziel eine Aufgabe hinzu, bei der meine Handler auf einem separaten Backend -Modul befinden.
Wenn das Ziel nicht spezifiziert ist, werden die Aufgaben auf derselben Version der Anwendung aufgerufen, in der sie aufgenommen wurden. Wenn Sie also eine Aufgabe aus der Standard -Anwendungsversion aufgenommen haben, ohne ein Ziel in der Warteschlange anzugeben, wird die Aufgabe in der Standard -Anwendungsversion aufgerufen.