Найти - Пользователи
Полная версия: как вывести содержимое environ['wsgi.input'] на страницу ?
Начало » Python для новичков » как вывести содержимое environ['wsgi.input'] на страницу ?
1
Saytik
- вывод 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 но для меня это пока сложно я там не совсем понимаю что для чего. Хочу разобраться, нигда доступно не расписано что и как …
bismigalis
ты не там смотришь, там предложение от Ian Bicking которое не принято

смотри тут http://webpython.codepoint.net/wsgi_request_parsing_post
Saytik
Спасибо, работает 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]
bismigalis
наверное так

domainname = d.get(b'domainname')[0].decode()
Saytik
логично :-) , спасибо огромное! все ок теперь …
Saytik
еще проблема возникла, при вводе в форму русского текста выдавало:
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]
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB