2012-06-13 2 views
2

У меня есть установка apache + mod_wsgi + python3.1. (Plain, no Django или другая инфраструктура.) Я могу писать приложения, которые выводят HTML, но я не могу заставить базовый веб-форму + парсер POST работать, поэтому я также могу обрабатывать ввод. Я нашел несколько примеров в Интернете, которым уже несколько лет, и используйте python2 и несколько страниц, описывающих «проблемы, о которых вы должны знать» с python3, которые делают примеры python2 устаревшими (длинный список проблем с кодировкой, новый для python3 и т. Д.).Пример веб-формы Bare bones с использованием python3 и mod_wsgi (без Django)?

У кого-нибудь есть код python3 («def application (environ, start_response): ...»), который размещает небольшую веб-форму UTF-8 с несколькими короткими меню, которые при отправке (POST) он, помещает эти пункты меню UTF-8 в строки python3? Скрипт python3, который правильно обрабатывает проблемы, говоря о правильном количестве байтов для чтения из запроса, не изменяет UTF-8 для символов, отличных от ASCII, не использует устаревшие функции и т. Д., Которые могут быть использованы как шаблон bare-bones для людей, пытающихся использовать mod_wsgi + python3 для ввода и вывода?

ответ

2
from urllib.parse import parse_qsl 

def application(environ, start_response): 
    try: 
     path = environ['PATH_INFO'] 
    except KeyError: 
     path = environ['REQUEST_URI'].decode('utf-8').split('=', 1)[1] 
    method = environ['REQUEST_METHOD'] 
    get = dict(parse_qsl(environ['QUERY_STRING'], keep_blank_values=True)) 
    post = dict(parse_qsl(environ['wsgi.input'].read().decode('utf-8'))) 

    if path == '/my_form': 
     start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')]) 
     yield '''\ 
<form action="" method="POST"> 
    <label for="name">What is your name?</label> 
    <input type="text" name="name"/> 
    <input type="submit"/> 
</form>'''.encode('utf-8') 
     if method == 'POST' and 'name' in post: 
      yield "<p>Hello, {}!</p>".format(post['name']).encode('utf-8') 
    else: 
     start_response('404 Not Found', [('Content-Type', 'text/html')]) 
     yield "<h1>404 Not Found</h1>".encode('utf-8') 
+1

Спасибо, BlaXpirit. Мне потребовалось некоторое время, чтобы выяснить, что нужно редактировать, чтобы заставить это работать (я не мог использовать имя моей формы в «if path ==»/my_form », но должен был установить ее в« if path = = '' "), но теперь он работает. Теперь, когда у меня есть рабочая стартовая точка, я могу экспериментировать с вариациями. – Glen

+0

@Glen Я использовал локальный сервер CherryPy для проверки этого, ваш сервер, вероятно, делает что-то другое с 'environ'. Вы должны зарегистрировать его: 'yield str (environ) .encode ('utf-8')', беспорядок с адресной строкой браузера (не забудьте удалить 'if path == ...'!) И посмотрите, какие изменения там и подходит для получения пути. –

+0

Просто комментарий: Python - дико популярный язык в наши дни. Apache - сервер №1. Текущий и будущий python - python3, а текущий и будущий стандарт для python на apache - mod_wsgi. Так как же может быть, что проще найти примерный код для построения всего веб-сервера в * emacs lisp *, ради всего святого, чем простая веб-форма «привет, мир» в python3? Почему это так мало интересует? Разве я не понимаю что-то фундаментальное в веб-приложениях python, которое ставит вопрос о том, как написать простой «привет, мир» на апаче, странно экзотическом или совершенно неуместном? – Glen

2

Возможно, вы не хотите каких-либо фреймворков, но я рекомендую вам попробовать Bottle. Он не требует какой-либо установки, вы можете просто положить файл bottle.py в папку вашего проекта, и вы готовы к работе.
И да, он работает с Python 3!

import bottle 
from bottle import get, post, request 

@get('/my_form') 
def show_form(): 
    return '''\ 
<form action="" method="POST"> 
    <label for="name">What is your name?</label> 
    <input type="text" name="name"/> 
    <input type="submit"/> 
</form>''' 

@post('/my_form') 
def show_name(): 
    return "Hello, {}!".format(request.POST.name) 

application=bottle.default_app()  # run in a WSGI server 
#bottle.run(host='localhost', port=8080) # run in a local test server 
+0

Вы правы, что я не хочу рамки. Возможно, я не единственный, кто хотел бы увидеть основной скелет рабочей веб-формы python3 в mod_wsgi. Но я благодарен за ваш ответ, потому что, узнав, как это сделать вручную, я также хочу понять мои другие варианты. – Glen

Смежные вопросы