Python App Engine Put (self) :
-
20-09-2019 - |
문제
이 미들웨어를 사용하여 앱을 편안하게 만들고 있지만 내 양식 매개 변수가 나오지 않는 것 같습니다.
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 기본 클래스를 정의 할 수 있습니다 (해킹!).
제휴하지 않습니다 StackOverflow