Доступ к данным POST из WSGI

Я думаю, что лучший способ справиться с этим - использовать существующие коды ответа HTTP-протокола, в частности 401 Unauthorized.

Вот как я его решил:

  1. Сторона сервера: если сеанс истекает, а запрос - ajax. отправьте заголовок кода 401 ответа
  2. Сторона клиента: привязка к событиям ajax
    $('body').bind('ajaxSuccess',function(event,request,settings){
    if (401 == request.status){
        window.location = '/users/login';
    }
    }).bind('ajaxError',function(event,request,settings){
    if (401 == request.status){
        window.location = '/users/login';
    }
    });
    

IMO это более общий и вы не пишете новые пользовательские спецификации / заголовок. Вам также не нужно изменять какие-либо из ваших существующих вызовов ajax.

Изменить: в комментарии @ Rob ниже, 401 (код состояния HTTP для ошибок аутентификации) должен быть индикатором. См. 403 Запрещенные vs 401 Неавторизованные HTTP-ответы для более подробной информации. При этом некоторые веб-фреймворки используют 403 для ошибок аутентификации и авторизации, поэтому соответствующим образом адаптируйте их. Спасибо, Роб.

34
задан Evan Fosmark 13 February 2009 в 06:10
поделиться

4 ответа

Принятие Вас пытается получить просто данные POST в объект FieldStorage:

# env is the environment handed to you by the WSGI server.
# I am removing the query string from the env before passing it to the
# FieldStorage so we only have POST data in there.
post_env = env.copy()
post_env['QUERY_STRING'] = ''
post = cgi.FieldStorage(
    fp=env['wsgi.input'],
    environ=post_env,
    keep_blank_values=True
)
29
ответ дан 27 November 2019 в 16:50
поделиться

Я предложил бы, чтобы Вы посмотрели на то, как некоторые платформы делают это для примера. (Я не рекомендую никому единственного, просто с помощью них в качестве примера.)

Вот код от Werkzeug:

http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/wrappers.py#L150

, который звонит

http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/utils.py#L1420

, Это немного сложно для суммирования здесь, таким образом, я не буду.

0
ответ дан 27 November 2019 в 16:50
поделиться
body= ''  # b'' for consistency on Python 3.0
try:
    length= int(environ.get('CONTENT_LENGTH', '0'))
except ValueError:
    length= 0
if length!=0:
    body= environ['wsgi.input'].read(length)

Примечание, что WSGI еще не полностью указан для Python 3.0 и большой части популярной инфраструктуры WSGI, не было преобразовано (или был 2to3d, но не правильно протестировал). (Даже wsgiref.simple_server не будет работать.) Вы находитесь в в течение грубого времени, делая WSGI на 3,0 сегодня.

22
ответ дан 27 November 2019 в 16:50
поделиться

У меня это сработало (в Python 3.0):

import urllib.parse

post_input = urllib.parse.parse_qs(environ['wsgi.input'].readline().decode(),True)
5
ответ дан 27 November 2019 в 16:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: