Есть ли способ принимать параметры только из запроса POST? Если я использую cgi.FieldStorage() из модуля cgi, он принимает параметры как от запроса GET, так и от POST.
По умолчанию большинство вещей в модуле cgi
объединяют os.environ['QUERY_STRING']
и sys.stdin
(в формате, предложенном os.environ['CONTENT_TYPE']
). Таким образом, простым решением было бы изменить os.environ
или, вернее, предоставить альтернативу без строки запроса.
# make a COPY of the environment
environ = dict(os.environ)
# remove the query string from it
del environ['QUERY_STRING']
# parse the environment
form = cgi.FieldStorage(environ=environ)
# form contains no arguments from the query string!
Игнасио Васкес-Абрамс предлагает избегать модуля cgi
вообще; современные веб-приложения python обычно должны придерживаться интерфейса WSGI. Это может выглядеть так:
import webob
def application(environ, start_response):
req = webob.Request(environ)
if req.method == 'POST':
# do something with req.POST
# still a CGI application:
if __name__ == '__main__':
import wsgiref.handlers
wsgiref.handlers.CGIHandler().run(application)
webob
- это самый тонкий webob
без рамок для wsgi (он даже менее волшебен, чем cgi
но в целом более полезен). Вы действительно должны построить свое приложение поверх надежной платформы и сосредоточиться на конкретной проблеме, которую вы пытаетесь решить
Из документации, я думаю, вы можете сделать следующее:
form = cgi.FieldStorage()
if isinstance(form["key"], cgi.FieldStorage):
pass #handle field
Этот код не проверен.
cgi.MiniFieldStorage
. Это может быть небезопасно (например, когда вы сталкиваетесь с запросом POST с параметрами URL), но это быстрое решение.