Принимать параметры только из POST-запроса в python

1

Есть ли способ принимать параметры только из запроса POST? Если я использую cgi.FieldStorage() из модуля cgi, он принимает параметры как от запроса GET, так и от POST.

  • 2
    Могу ли я предложить вам избежать CGI в первую очередь?
  • 0
    Вы имеете в виду модуль Python CGI? Если да, нет проблем, чтобы избежать этого. Я просто хочу сделать то, что я просил.
Показать ещё 1 комментарий
Теги:
cgi
post

2 ответа

2
Лучший ответ

По умолчанию большинство вещей в модуле 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)
  • 0
    Отлично! Они оба хороши, но я предпочитаю не использовать внешние модули в этом случае, поэтому я буду использовать первый способ. Большое спасибо!
  • 0
    Это неудачно. При работе с веб-приложениями совершенно невероятный объем работы. webob - это самый тонкий webob без рамок для wsgi (он даже менее волшебен, чем cgi но в целом более полезен). Вы действительно должны построить свое приложение поверх надежной платформы и сосредоточиться на конкретной проблеме, которую вы пытаетесь решить
0

Из документации, я думаю, вы можете сделать следующее:

form = cgi.FieldStorage()
if isinstance(form["key"], cgi.FieldStorage):
     pass #handle field

Этот код не проверен.

  • 0
    Кажется, это способ отклонить параметр «ключ», и я не хочу этого. Я хочу принимать параметр только из запроса POST, а не GET.
  • 0
    Это должно обрабатывать только запросы POST. Параметры URL в запросах GET используют cgi.MiniFieldStorage . Это может быть небезопасно (например, когда вы сталкиваетесь с запросом POST с параметрами URL), но это быстрое решение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню