문제

이 미들웨어를 사용하여 앱을 편안하게 만들고 있지만 내 양식 매개 변수가 나오지 않는 것 같습니다.

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를 인스턴스화하고. 실제 WebApp이 나중에 시작되면 다른 요청 객체를 인스턴스화하고 다시 한 번 요청 본문을 읽으려고하지만 이미 읽은 것이므로 아무것도 반환되지 않습니다.

미들웨어를 수정하여 요청 본문 사본을 저장하고 WSGI 환경에 다시 넣을 수 있습니다. 다른 옵션이 있습니다.

  • _Method arg가 항상 게시 된 양식 매개 변수 대신 쿼리 문자열 매개 변수 인 경우 webapp.request (Environ) .get.get ( 'method')를 사용할 수 있으며 요청 본문을 읽지 않습니다.
  • 당신은 무시할 수 있습니다 WSGIAPPLICATION.전화 그것이 파견되는 방식을 바꾸려면.
  • WSGIAPPLICATION 서브 클래스 및 사용자 정의를 제공 할 수 있습니다 request_class, 실제 요청 객체를 구축하는 함수 인 다음, 귀하에게 적합한 환경을 수정합니다 (Hack!).
  • 초기화 ()를 구현하고 요청 객체의 wsgi dict에 도달하고 메소드를 변경하는 사용자 정의 웹 app requestHandler 기본 클래스를 정의 할 수 있습니다 (해킹!).
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top