run4way
@run4way

Python: как обработать кириллица из GET?

Добрый день. Есть простой скрипт, одна часть передаёт данные из формы через GET. Другая парсит url и забирает оттуда эти данные. Проблема в том, что кириллические символы не обрабатываются как положено - не работает upper, например. И если раньше я побеждал такое при помощи decode('utf-8'), то на сервере ни decode, ни encode, ни другие способы не помогают.

Хост расположен у OpenShift.
Linux version 2.6.32-573.7.1.el6.x86_64 (mockbuild@x86-031.build.eng.bos.redhat.com) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-16)

LANG=en_US.UTF-8

Python 2.7.8


#!/usr/bin/python
# -*- coding: utf-8 -*-
import os

virtenv = os.environ['OPENSHIFT_PYTHON_DIR'] + '/virtenv/'
virtualenv = os.path.join(virtenv, 'bin/activate_this.py')
try:
    execfile(virtualenv, dict(__file__=virtualenv))
except IOError:
    pass
#
# IMPORTANT: Put any additional includes below this line.  If placed above this
# line, it's possible required libraries won't be in your searchable path
#
import urlparse
def application(environ, start_response):

    ctype = 'text/plain'
    if environ['PATH_INFO'] == '/health':
        response_body = "1"
    elif environ['PATH_INFO'] == '/env':
        response_body = ['%s: %s' % (key, value)
                    for key, value in sorted(environ.items())]
        response_body = '\n'.join(response_body)
    elif environ['PATH_INFO'] == '/' or environ['PATH_INFO'] == '/main':
        ctype = 'text/html'
        response_body = '''<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>Welcome to OpenShift</title>
</head>
<body>
    <form action="/justdoit" method="get">
        <input type="text" name="name">
        <input type="text" name="code">
        <input type="submit" value="Send">
    </form>
</body>
</html>'''

    elif environ['PATH_INFO'] == '/justdoit':
        ctype = 'text/html'
        params = urlparse.parse_qs(environ.get('QUERY_STRING','utf-8'))
        name = params.get('name', [''])[0]
        code = str(params.get('code', [''])[0])

.......................... далее код опущен

    status = '200 OK'
    response_headers = [('Content-Type', ctype), ('Content-Length', str(len(response_body)))]
    start_response(status, response_headers)
    return [response_body]

#
# Below for testing only
#
if __name__ == '__main__':
    from wsgiref.simple_server import make_server
    httpd = make_server('localhost', 8051, application)
    # Wait for a single request, serve it and quit.
    httpd.handle_request()
  • Вопрос задан
  • 461 просмотр
Пригласить эксперта
Ответы на вопрос 1
sim3x
@sim3x
Проще будет поставить джангу или фласк и ими все сделать

Сам скрипт лучше выбросить целиком - он непонятно что делает
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы