python - Python Web 框架、WSGI 和 CGI​​ 如何组合在一起

我有一个 Bluehost我可以在其中将 Python 脚本作为 CGI 运行的帐户。我想这是最简单的 CGI,因为要运行我必须在 .htaccess 中定义以下内容:

Options +ExecCGI
AddType text/html py
AddHandler cgi-script .py

现在,每当我使用 Python 进行 Web 编程时,我都会听到很多关于 WSGI 以及大多数框架如何使用它的信息。但我只是不明白这一切是如何结合在一起的,特别是当我的网络服务器被给定(Apache 在主机的机器上运行)而不是我真正可以玩的东西(除了定义 .htaccess 命令) .

WSGI 怎么样? ,CGI,和框架都连接?如果我想在我的基本 CGI 配置上运行 Web 框架(例如 web.py 或 CherryPy ),我需要了解、安装和做什么?如何安装 WSGI 支持?

最佳答案

WSGI、CGI 和框架是如何连接的?

Apache 监听端口 80。它收到一个 HTTP 请求。它解析请求以找到响应方式。 Apache 有很多响应选择。一种响应方式是使用 CGI 运行脚本。另一种响应方式是简单地提供文件。

在 CGI 的情况下,Apache 准备一个环境并通过 CGI 协议(protocol)调用脚本。这是标准的 Unix Fork/Exec 情况——CGI 子进程继承了一个操作系统环境,包括套接字和标准输出。 CGI 子进程写一个响应,返回给 Apache; Apache 将此响应发送到浏览器。

CGI 原始且令人讨厌。主要是因为它为每个请求 fork 一个子进程,并且子进程必须退出或关闭 stdout 和 stderr 以表示响应结束。

WSGI 是一个基于 CGI 设计模式的接口(interface)。它不一定是 CGI——它不必为每个请求派生一个子进程。它可以是 CGI,但不一定是。

WSGI 在几个重要方面增加了 CGI 设计模式。它为您解析 HTTP 请求 header 并将其添加到环境中。它将任何面向 POST 的输入作为环境中的类文件对象提供。它还为您提供了一个函数来制定响应,从而使您免于大量格式化细节。

如果我想在我的基本 CGI 配置上运行 Web 框架(例如 web.py 或cherrypy),我需要了解/安装/做什么?

回想一下, fork 一个子进程是昂贵的。有两种方法可以解决此问题。

  1. Embedded mod_wsgimod_python 将 Python 嵌入到 Apache 中;没有进程被 fork 。 Apache 直接运行 Django 应用程序。

  2. Daemon mod_wsgimod_fastcgi 允许 Apache 与单独的守护进程(或“长期运行的进程”)交互,使用WSGI 协议(protocol)。您启动长时间运行的 Django 进程,然后配置 Apache 的 mod_fastcgi 以与该进程通信。

请注意,mod_wsgi 可以在任一模式下工作:嵌入式或守护进程。

当您阅读 mod_fastcgi 时,您会发现 Django 使用 flup根据 mod_fastcgi 提供的信息创建一个 WSGI 兼容的接口(interface)。管道是这样工作的。

Apache -> mod_fastcgi -> FLUP (via FastCGI protocol) -> Django (via WSGI protocol)

Django 有几个“django.core.handlers”用于各种接口(interface)。

对于 mod_fastcgi,Django 提供了一个 manage.py runfcgi,它集成了 FLUP 和 handler。

对于 mod_wsgi,有一个核心处理程序。

如何安装 WSGI 支持?

按照这些说明进行操作。

https://code.google.com/archive/p/modwsgi/wikis/IntegrationWithDjango.wiki

背景见此

http://docs.djangoproject.com/en/dev/howto/deployment/#howto-deployment-index

https://stackoverflow.com/questions/219110/

相关文章:

python - 使用 PyCrypto AES 256 加密和解密

installation - 如何从命令行正确设置 CMAKE_INSTALL_PREFIX

python - 检查字符串是否包含数字

python - 如何使 python 命令行程序自动完成任意事物而不是解释器

linux - 我应该选择什么 : GTK+ or Qt?

python - 是否有可能 "hack"Python 的打印功能?

python - pandas loc vs. iloc vs. at vs. iat?

python - 如何在 Python 中加入两个生成器?

python - Seaborn地 block 没有出现

linux - 来自守护程序 : "Conflict ... already in use by c