6

Tôi muốn giải quyết tình trạng 405 mà tôi nhận được từ các hàng đợi công việc khi cố gắng để tạo ra một báo cáo:Status 405 từ hàng đợi nhiệm vụ

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 

Các mã tạo nhiệm vụ là

class CreateReportHandler(webapp2.RequestHandler): 

    def get(self): 
     logging.info('creating report task') 
     taskqueue.add(url=r'/report/') 
     self.redirect('/') 

và tôi có nó chuyển với webapp2:

Route(r'/createreport/', handler=CreateReportHandler, name='createreport'), 

sau đó tôi sẽ có thể làm cho nó một công việc định kỳ nhưng khi tôi thử nghiệm nó tôi nhận được một 405 từ truy cập của mã này mà lần ra nếu tôi cố gắng để chạy nó trực tiếp:

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='[email protected]', 
            subject='Report %s %s' % (user.firstname, user.lastname)) 
        message.body = 'Here is the monthly report' 
        message.to = '[email protected]' 
        message.bcc = '[email protected]' 
        message.attachments = ['report.pdf', asset.data] 
        message.send() 
        logging.info('message sent') 

Làm thế nào tôi có thể giải quyết tình trạng 405 và thực hiện thông qua thực hiện?

Cảm ơn bạn

Trả lời

14

Tôi đến từ GAE/J-đất, vì vậy tôi không quen thuộc với Python, nhưng tôi đã gặp 405 phản hồi từ nhân viên hàng tác vụ của tôi trước đó. Trong trường hợp của tôi, nguyên nhân là do đặt phương thức TaskOption thành POST trong khi xây dựng Task, trong khi trình xử lý của tôi chỉ phục vụ yêu cầu GET.

EDIT: Sau khi kiểm tra TaskQueue.add() docs, có vẻ như phương pháp mặc định được sử dụng nếu phương pháp không được chỉ định (như trong ví dụ mã của bạn) là POST, trong khi trình xử lý của bạn dường như chỉ có thể phục vụ các yêu cầu GET.

Đề xuất của tôi sẽ chỉ định rõ ràng rằng tác vụ của bạn sử dụng phương thức GET thay vì POST hoặc thay đổi phương thức xử lý của trình xử lý của bạn thành POST thay vì GET.

+2

Cảm ơn, tôi phát hiện ra điều này cũng giống như vậy đối với tôi - nó đã tạo một http 'POST' thay vì một 'GET' –

1

Chỉ muốn thêm một kịch bản có thể từ một tìm kiếm nhanh của "hàng tác vụ 405" tất cả kết thúc trong trang này:

tôi có 405 sai lầm vì đã không chỉ định một "mục tiêu" tham số. taskqueue.add() kết thúc việc thêm nhiệm vụ vào mục tiêu mặc định, trong đó trình xử lý của tôi nằm trên mô-đun phụ trợ riêng biệt.

Nếu mục tiêu không được chỉ định, thì nhiệm vụ được gọi trên cùng một phiên bản của ứng dụng mà chúng được đặt hàng. Vì vậy, nếu bạn enqueued một nhiệm vụ từ phiên bản ứng dụng mặc định mà không chỉ định một mục tiêu trên hàng đợi, nhiệm vụ được gọi trong phiên bản ứng dụng mặc định.