3

我有一个 apache + mod_wsgi + python3.1 设置。(普通,没有 Django 或其他框架。)我可以编写输出 HTML 的应用程序,但我似乎无法让基本的 Web 表单 + POST 解析器工作,所以我也可以处理输入。我在网上找到了一些使用 python2 多年的示例,还有几页描述了使用 python3 的“您应该注意的问题”,这些问题使 python2 示例过时(python3 新的编码问题的长列表等)

会有人碰巧有python3代码(“def application(environ,start_response):...”),它会放置一个带有几个简短菜单的小型UTF-8 Web表单,当您提交(POST)它时,会将那些将 UTF-8 菜单选择转换为 python3 字符串?一个 python3 脚本,可以正确处理关于告诉它从请求中读取正确的字节数的问题,不会将 UTF-8 用于非 ASCII 字符,不使用不推荐使用的函数等,可以使用作为试图使用 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 回答