Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 11, 2013 19:07:03

Saytik
От:
Зарегистрирован: 2010-10-17
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

как вывести содержимое environ['wsgi.input'] на страницу ?

- вывод html через шаблонизатор заработал
- свой обработчик urls с помощью regex заработал
теперь не могу получить данные переданные POST запросом.
Чтобы понять как извлекать данные из wsgi.input, хотел бы его просто вывести все переменные настраницу чтобы посмотреть что и как …

def whois(environ, start_response):
start_response("200 OK", [])
data = environ['wsgi.input'].read()
return [data]

но такой код ничего не выводит, только белую страницу и код “200 ОК”.
Кто разбирался, подскажите как сделать плз ?

P.S. да ест описание вот здесь в доке wsgi но для меня это пока сложно я там не совсем понимаю что для чего. Хочу разобраться, нигда доступно не расписано что и как …



Отредактировано Saytik (Окт. 11, 2013 19:07:19)

Офлайн

#2 Окт. 11, 2013 19:13:36

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

как вывести содержимое environ['wsgi.input'] на страницу ?

ты не там смотришь, там предложение от Ian Bicking которое не принято

смотри тут http://webpython.codepoint.net/wsgi_request_parsing_post

Офлайн

#3 Окт. 11, 2013 23:24:05

Saytik
От:
Зарегистрирован: 2010-10-17
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

как вывести содержимое environ['wsgi.input'] на страницу ?

Спасибо, работает POST переменные выбираются, но чтобы их находило надо добавлять b'' в названии, например

environ[b'email']

но есть лажа, когда я подставляю переменную в шаблон html, оно так и выводит его b'12345', а что ему сделать чтобы без b было просто 12345 ?

код вот такой:
def whois(environ, start_response):
    # the environment variable CONTENT_LENGTH may be empty or missing
   try:
      request_body_size = int(environ.get('CONTENT_LENGTH', 0))
   except (ValueError):
      request_body_size = 0
   request_body = environ['wsgi.input'].read(request_body_size)
   d = parse_qs(request_body)
   domainname = d.get(b'domainname')[0] # Returns the first age value.
   template = templ_dir.get_template('whois.html')
   response_body = template.render(whois_result=domainname).encode()
   status = '200 OK'
   response_headers = [('Content-Type', 'text/html'),
                  ('Content-Length', str(len(response_body)))]
   start_response(status, response_headers)
   return [response_body]



Отредактировано Saytik (Окт. 11, 2013 23:24:34)

Офлайн

#4 Окт. 12, 2013 08:13:07

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

как вывести содержимое environ['wsgi.input'] на страницу ?

наверное так

domainname = d.get(b'domainname')[0].decode()

Офлайн

#5 Окт. 12, 2013 11:13:08

Saytik
От:
Зарегистрирован: 2010-10-17
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

как вывести содержимое environ['wsgi.input'] на страницу ?

логично :-) , спасибо огромное! все ок теперь …



Офлайн

#6 Окт. 14, 2013 02:56:08

Saytik
От:
Зарегистрирован: 2010-10-17
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

как вывести содержимое environ['wsgi.input'] на страницу ?

еще проблема возникла, при вводе в форму русского текста выдавало:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-15: ordinal not in range(128)

Нужно в коде выше добавить замену
было
d = parse_qs(request_body)
стало:
d = parse_qs(request_body.decode())
было
domainname = d.get(b'domainname')[0].decode()
стало
domainname = d.get(b'domainname')[0]



конечный код:
import sys
from urllib.parse import parse_qs
from cgi import  escape
from jinja2 import Environment, FileSystemLoader
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
templ_dir = Environment(loader=FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates')))
def whois(environ, start_response):
   try:
      request_body_size = int(environ.get('CONTENT_LENGTH', 0))
   except (ValueError):
      request_body_size = 0
   request_body = environ['wsgi.input'].read(request_body_size)
   d = parse_qs(request_body.decode())
   domainname = escape(d.get('domainname')[0]) 
   template = templ_dir.get_template('whois.html')
   response_body = template.render(whois_result=domainname).encode()
   status = '200 OK'
   response_headers = [('Content-Type', 'text/html'),
                  ('Content-Length', str(len(response_body)))]
   start_response(status, response_headers)
   return [response_body]



Отредактировано Saytik (Окт. 14, 2013 02:56:57)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version