Статус 405 из очереди задач
-
25-10-2019 - |
Вопрос
Я хочу разрешить статус 405, который я получу из очереди задач при попытке генерировать отчет:
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
Код, который создает задачу,
class CreateReportHandler(webapp2.RequestHandler):
def get(self):
logging.info('creating report task')
taskqueue.add(url=r'/report/')
self.redirect('/')
И я маршрутирован с WebApp2:
Route(r'/createreport/', handler=CreateReportHandler, name='createreport'),
Тогда я должен быть в состоянии сделать это работой Cron, но когда я его тестирую, я получаю 405 от доступа к этому коду, что время, если я попытаюсь запустить его напрямую:
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')
Как я могу решить статус 405 и пройти через исполнение?
Спасибо
Решение
Я приехал из Gae/J-Land, поэтому я не знаком с Python, но я столкнулся 405
Ответ от моего работника TaskQueue раньше. В моем случае это вызвано установкой TaskOption
метод POST
При строительстве Task
, в то время как мой обработчик только служит GET
Запросы.
РЕДАКТИРОВАТЬ: После проверки Taskqueue.add () документы, Похоже, что используемый метод по умолчанию, если метод не указан (как в вашем примере кода), является сообщением, в то время как ваш обработчик, по -видимому, может обслуживать запросы GET.
Мое предложение было бы четко указать, что ваша задача использует метод получения вместо поста, или изменить метод обработки вашего обработчика в Post, а не получить.
Другие советы
Просто хочу добавить один возможный сценарий с момента быстрого поиска "TaskQueue 405"Все заканчивается на этой странице:
Я получил 405 ошибок, потому что не указал параметр «цели». taskqueue.add()
В конечном итоге добавляет задачу в цель по умолчанию, где мои обработчики находятся в отдельном бэкэнд -модуле.
Если цель не задана, то задачи вызываются в той же версии приложения, где они были включены. Таким образом, если вы включили задачу из версии приложения по умолчанию без указания цели в очереди, задача вызывает в версии приложения по умолчанию.