سؤال

أنا أستخدم هذه البرامج الوسيطة لجعل تطبيقي مريحًا، ولكن يبدو أن معلمات النموذج الخاصة بي لا تأتي من خلال:

from google.appengine.ext import webapp

class RestHTTPMiddleware(object):
  def __init__(self, app):
    self.app = app

  def __call__(self, environ, start_response):
    method = webapp.Request(environ).get('_method')
    request = Request(environ)
    environ['wsgi.input'] = StringIO.StringIO(request.body)

    if method:
      environ['REQUEST_METHOD'] = method.upper()

    return self.app(environ, start_response)

عندما أقوم بإرسال نموذج وتصحيحه باستخدام:

def put(self):
    logging.debug(self.request.get('description'))

المسجل فارغ.يتم استدعاء طريقة put(self)، وقد قمت باختبارها باستخدام المسجل وتظهر رسالة تصحيح الأخطاء الخاصة بي.

المراجعة الثانية:

from google.appengine.ext import webapp
from webob import Request
import logging
import StringIO

class RestHTTPMiddleware(object):
  def __init__(self, app):
    self.app = app

  def __call__(self, environ, start_response):
    request = Request(environ)
    environ['wsgi.input'] = StringIO.StringIO(request.body)

    method = webapp.Request(environ).get('_method')

    if method:
      environ['REQUEST_METHOD'] = method.upper()

    return self.app(environ, start_response)

أحدث التغييرات:

from google.appengine.ext import webapp
from webob import Request
import logging
import StringIO

class RestHTTPMiddleware(object):
  def __init__(self, app):
    self.app = app

  def __call__(self, environ, start_response):
    request = Request(environ)
    body = StringIO.StringIO(request.body)

    method = webapp.Request(environ).get('_method', None)

    if method:
      environ['REQUEST_METHOD'] = method.upper()
      environ['wsgi.input'] = body

    return self.app(environ, start_response)
هل كانت مفيدة؟

المحلول

إنشاء مثيل webapp.Request واستدعاء .get عليه يؤدي إلى قراءة نص الطلب وتحليل معلمات النموذج فيه.عندما يبدأ تطبيق الويب الفعلي الخاص بك لاحقًا، فإنه يقوم بإنشاء كائن طلب آخر، ويحاول مرة أخرى قراءة نص الطلب - ولكن تمت قراءته بالفعل، لذلك لا يتم إرجاع أي شيء.

يمكنك تعديل برنامجك الوسيط لتخزين نسخة من نص الطلب وإعادته إلى بيئة WSGI.هناك خيارات أخرى:

  • إذا كانت وسيطة _method ستكون دائمًا معلمة سلسلة استعلام بدلاً من معلمة نموذج منشورة، فيمكنك استخدام webapp.Request(environ).GET.get('method')، الذي لن يقرأ نص الطلب.
  • هل يمكن تجاوز WSGIApplication.يتصل لتغيير كيفية الإرسال.
  • يمكنك فئة فرعية WSGIApplication وتوفير ملف مخصص REQUEST_CLASS, ، كونها وظيفة تقوم ببناء كائن طلب حقيقي، ثم تقوم بتعديل البيئة التي تم تمريرها لتناسبك (الاختراق!).
  • يمكنك تحديد فئة أساسية مخصصة لتطبيق Webapp RequestHandler تقوم بتنفيذ التهيئة ()، والوصول إلى إملاء WSGI لكائن الطلب وتغيير الطريقة (الاختراق!).
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top