使用Python3和mod_wsgi(无Django)的基础Web表单示例?

3
我有一个apache + mod_wsgi + python3.1的设置。(没有Django或其他框架。)我可以编写输出HTML的应用程序,但似乎无法让基本的Web表单和POST解析器工作,以便我也能处理输入。我在网上找到了一些几年前使用Python2的示例,并且有几个页面描述了“您应该注意的问题”,使Python2示例过时(Python3中新增了许多编码问题等)。 是否有人有Python3代码(“def application(environ,start_response):…”),可以提供一个带有几个短菜单的小UTF-8 Web表单,当您提交(POST)时,可将这些UTF-8菜单选择放入Python3字符串中? 一个处理问题正确的Python3脚本,可以告诉它从请求中读取正确数量的字节,不会混淆非ASCII字符的UTF-8,不会使用已弃用的函数等,可作为模板供尝试使用mod_wsgi + python3进行输入和输出的人使用。
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')

1
谢谢,BlaXpirit。我花了一些时间才弄清楚要编辑什么才能让它工作(我不能在“if path =='/my_form'”中使用我的表单名称,而必须将其设置为“if path==''”),但现在它可以工作了。既然我有了一个工作的起点,我可以尝试各种变化了。 - Glen
@Glen 我使用了本地的CherryPy服务器来测试这个,你的服务器可能会对environ做一些不同的处理。你应该记录它:yield str(environ).encode('utf-8'),在浏览器的地址栏中进行操作(不要忘记删除if path==...!),看看有什么变化并适当地获取路径。 - Oleh Prypin
仅仅是一条评论:Python是当今非常流行的语言。Apache是第一服务器。当前和未来的Python是Python3,而在Apache上的当前和未来标准是mod_wsgi。那么为什么在emacs lisp中构建整个Web服务器的示例代码比在Python3中编写一个简单的“hello, world” Web表单更容易找到呢?为什么这件事如此不受关注?我是否对Python Web应用程序有所误解,使得在Apache上编写一个简单的“hello, world”变得奇异或完全无关紧要? - Glen
@Glen 人们不使用Python 3是因为没有Python 3的Django。Django没有移植,因为Python 3与WSGI存在问题。由于人们不使用Python 3进行Web开发,这些问题并未得到快速解决。这是我的想法。但是Armin Ronacher的思想可能更有趣。 - Oleh Prypin

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

你说得对,我不想要一个框架。我可能不是唯一一个希望在mod_wsgi中看到一个基本的Python3 Web表单工作骨架的人。但是我很感激你的回答,因为在学会如何手动完成之后,我还想了解其他选择。 - Glen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接