所以我写了一个解析文本的模块;某些关键字具有不同的能力并创造不同的东西。
我正在建立一个网站,我想做的就是单击按钮,将一些文本div
放入我的 Python 函数中,然后替换为该函数的输出
我以前从未将 Python 用于 Web 内容,而 Django 在这里似乎有点矫枉过正,因为我需要做的就是运行一个函数,而其他一切都是纯 HTML、CSS 和 JS
那么有没有一种简单的方法可以做到这一点?
正如我在其他答案中所描述的那样使用 CGI是可行的,并且设置起来很简单,但它有点原始,并且有为每个请求启动一个新进程的开销。另一个更常见的解决方案是使用 WSGI,即 Web 服务器网关接口,在PEP 333 for Python 2 和PEP 3333 for Python 3 中定义。
有了它,您的 Python 代码将定义一个调用的函数,该函数application
接受两个参数environ
和start_response
,并返回一个可迭代对象。例如,下面是你如何输出一个静态的“Hello, world!”:
def application(environ, start_response):
start_response(200, [('Content-Type', 'text/html')])
yield "Hello, world!"
要解析输入,您可以cgi.FieldStorage
再次使用,但这一次,显式传递文件以从中读取数据,该文件恰好隐藏在environ
key 下wsgi.input
:
import cgi
def application(environ, start_response):
start_response(200, [('Content-Type', 'text/html')])
fields = cgi.FieldStorage(environ['wsgi.input'])
if 'name' in fields:
name = fields['name'].value
yield "Hello, {name}.".format(cgi.escape(name))
else:
yield "Please POST a name parameter."
这种方法的缺点是涉及更多的服务器配置,这chmod
与 CGI 脚本的即插即用方法相反。好处是你有很多包装器让你的事情变得容易:举几个轻量级的包装器,有Werkzeug和WebOb。甚至还有Flask对你隐藏了很多,但仍然设法拥有一个最小的界面。
如果您想在 Web 上运行 python 代码,另一个选择是使用Jython,这是一个基于 JVM 的 python 实现。听起来您不需要很多库模块,因此 Jython 的主要限制(无法访问 C 编译的 python 扩展)并不是一个大问题。大多数服务器和大多数 Web 客户端都有一个可以运行 Jython 的 JVM。这里有一些用于在服务器端或其他环境中部署 Jython 的资源 正如您在第二个参考资料中所见,您还可以将 Jython 静态编译为可嵌入页面中的小程序 - 但前提是您使用的是 2.1 版本,而不是当前版本2.5 系列。
您可以使用 CGI 脚本。CGI 脚本的调用方式几乎与在命令行上调用它们的方式相同,因此它应该相当直观。Python 有一个cgi
模块可以完成一些工作。
一个简单的 CGI 脚本可能如下所示:
#!/usr/bin/env python
import cgi
def main():
fields = cgi.FieldStorage()
print("Content-Type: text/html")
print()
if 'name' in fields:
name = fields['name'].value
print("Hello, {name}.".format(name=cgi.escape(name)))
else:
print("Please POST a name parameter.")
if __name__ == '__main__':
main()
该cgi
模块的文档有更多示例。
为了让您的服务器运行它,您必须向脚本添加适当的权限(可能chmod +x
)并将其放在 CGI 脚本的指定目录中,通常命名为cgi-bin
.
就机械而言,就是这样。有时习惯 PHP 的人希望其他语言允许将代码嵌入到更大的文档中,例如:
<?py import cgi ?>
<?py fields = cgi.FieldStorage() ?>
<h1>Greeting</h1>
<p>Hello, <?py print(fields['name'].value) ?>.</p>
Python 不是为此而设计的。Python 不像 PHP 那样将逻辑嵌入到内容中,而是以相反的方式工作,将内容嵌入到逻辑中。可以想象,以这种方式对所有内容进行硬编码会很快变得丑陋。
在 Python 中通常处理这种情况的方式是使用模板。例如,您有一个如下所示的模板:
<h1>Greeting</h1>
<p>Hello, {name}.</p>
然后,您的 Python 脚本会执行以下操作:
# assuming template has already been read into a variable
name = fields['name'].value
# other logic...
print(template.format(name=name))