3

Apache + mod_wsgi+python3.1のセットアップがあります。(プレーン、Djangoやその他のフレームワークはありません。)HTMLを出力するアプリを作成できますが、基本的なWebフォームとPOSTパーサーを機能させることができないため、入力も処理できます。数年前にpython2を使用しているいくつかの例をオンラインで見つけました。また、python2の例を廃止するpython3の「注意すべき問題」について説明しているページもいくつかあります(python3の新しいエンコーディングの問題の長いリストなど)。

誰かがpython3コード( "def application(environ、start_response):...")を持っているでしょうか。これは、送信(POST)すると、それらを配置するいくつかの短いメニューを含む小さなUTF-8Webフォームを表示します。 UTF-8メニューの選択肢をpython3文字列に変換しますか?リクエストから読み取る適切なバイト数を指示することに関する問題を適切に処理するpython3スクリプト、非ASCII文字のUTF-8を変更しない、使用できる非推奨の関数などを使用しない入力と出力にmod_wsgi+python3を使用しようとしている人々による最低限のテンプレートとして?

4

2 に答える 2

4
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')
于 2012-06-14T07:40:07.390 に答える
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
于 2012-06-13T13:20:49.610 に答える