我们介绍如何使用Apache模块mod_wsgi来运行Python WSGI应用。
安装mod_wsgi
我们假设你已经有了Apache和Python环境,在Linux或者Mac上,那第一步自然是安装。在Ubuntu或Debian环境中,你可以使用apt-get命令来安装:
sudo apt-get install libapache2-mod-wsgi
sudo apt-get install libapache2-mod-wsgi-py3
不过我们建议采用编译安装,这样在任何系统中都可以安装成功,具体步骤如下:
下载源码包
解压后,配置编译选项
一般采用默认配置即可,即执行:
./configure
如果要指定Apache和Python环境,那你需要加上”–with-apxs”和”–with-python”选项:
./configure --with-apxs=/usr/local/apache/bin/apxs --with-python=/usr/local/bin/python
编译并安装
sudo make && make install
在Apache配置文件中载入mod_wsgi
让我们打开Apache的配置文件httpd.conf,默认是在:
$ sudo vi /etc/httpd/conf/httpd.conf # For Linux
$ sudo vi /etc/apache2/httpd.conf # For Mac
在所有”Load Module”配置项的最后,加上载入mod_wsgi的配置,注意Linux和Mac的模块加载路径不同:
LoadModule wsgi_module modules/mod_wsgi.so # For Linux
# LoadModule wsgi_module libexec/apache2/mod_wsgi.so # For Mac
重启Apache来启用配置
$ sudo service httpd restart # For Linux
$ sudo service apachectl restart # For Mac
测试mod_wsgi
最简单的测试方法自然是Hello World,让我们在Apache的DocumentRoot根目录下创建一个文件”test.wsgi”。在文件中,我们写入这样的内容:
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
这里的函数application即为WSGI应用对象,它返回的值就是该应用收到请求后的响应。然后,再打开Apache的配置文件httpd.conf,在其最后加上URL路径映射:
WSGIScriptAlias /test /var/www/test.wsgi
这里我们假设Apache的文档根目录是”/var/www”。
现在你可以打开浏览器,访问一下”http://localhost/test”,如果看到”Hello World!”了,就说明mod_wsgi已经安装成功。
我们可以试试运行Flask应用,当然首先是你本地Python环境已经安装了Flask,我们将”test.wsgi”改为:
from flask import Flask
application = Flask(__name__)
@application.route('/')
def index():
return '
Hello World!
'注意,这里必须要将Flask应用对象命名为”application”,这样才能被mod_wsgi识别。再用浏览器访问下,是不是能看到大标题”Hello World!”?
使用Python虚拟环境
一般我们会将应用安装在虚拟环境中,这样应用的更新只需改变虚拟环境即可,不会影响到其他应用环境。要使用虚拟环境来运行当前WSGI应用的话,你必须在”.wsgi”文件中先执行虚拟环境的启用脚本,基于上面的代码,我们来做如下改动:
activate_this = '/home/bjhee/virtualenv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
from flask import Flask
application = Flask(__name__)
@application.route('/')
def index():
return '
Hello World!
'上例中,我们的虚拟环境在目录”/home/bjhee/virtualenv”下,你可以在其”/bin”子目录中找到启用脚本”activate_this.py”。在WSGI应用的一开始执行它即可。
补充内容
当我们的Python环境中有模块是以.egg压缩包安装的话,WSGI应用运行时需要将.egg压缩包解开。默认的解压路径很有可能没有访问权限,比如Mac下是”/Library/WebServer/.python-eggs”,因此你需要指定临时解压目录。方法有两种,一是在Apache的httpd.conf文件中,使用”WSGIPythonEggs”配置项,配置参数就是我们的临时目录路径;二是设置系统环境变量”PYTHON_EGG_CACHE”。我们建议采用第二种,并将其写在”.wsgi”文件中,这样就不会影响其他的应用:
activate_this = '/home/bjhee/virtualenv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
import os
os.environ['PYTHON_EGG_CACHE'] = '/home/bjhee/.python-eggs'
from flask import Flask
application = Flask(__name__)
@application.route('/')
def index():
return '
Hello World!
'运行前,请确保临时目录(上例中的”/home/bjhee/.python-eggs”)有访问及写权限。
如何在Apache中运行Python脚本
第一步:进入C:\Apache24\cgi-bin: 第二步:在cgi-bin目录下新建一个hello.py文件: 第三步: #!python #coding:utf-8 print("co ...
Ubuntu下在Apache中运行Keystone
最近一次从Github上更新Keystone的代码后,发现原来bin/keystone-all和bin/keystone-manage都不见了,取而代之的是keystone/cmd/目录下的all.p ...
php在apache中运行模式
php在apache中运行模式 (2011-12-18 02:38:27) 标签: 杂谈 分类: 服务器及软件 一.php在php在三种工作方式:Apache 模块DLL) 以下分别比较: 1. ph ...
在notepad++中运行python代码
#在notepad++中运行python代码 ''' 1.安装插件pyNPP, 2.允许插件pyNPP中的第一个和第二个选项即可,如果代码过少代码执行一闪而过,可能无法看到,可加入少量sleep时间即 ...
sublime3中运行python文件
sublime3中运行python文件 tools->build system->new build stystem 粘贴下面代码{"cmd":["pytho ...
转-Pycharm中运行Python代码的几种方式
转自:Pycharm中运行Python代码的几种方式 在pycharm中的Python代码运行会出现各种奇葩的问题,比如,密码输入时不显示或没有提示,给我们带来一些麻烦,下面介绍几种代码运行的几种方式 ...
notepad中运行python, --kali安装后出现乱码
notepad中运行python cmd /k python "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT - ...
Windows 配置Apache以便在浏览器中运行Python script的CGI模式
打开httpd.conf,找到”#ScriptInterpreterSource Registry “,移除前面的注释# (如果找不到这行,就自己添加进去) 找到“Options Indexes Fo ...
linux中运行python
1.在终端中输入: python **.py 2.最爽的方法: emacs中配置python运行环境.
随机推荐
Android 之窗口小部件详解--App Widget
Android 之窗口小部件详解--App Widget 版本号 说明 作者 日期 1.0 添加App Widge介绍和示例 Sky Wang 2013/06/27 1 App ...
MVC过滤器使用案例:统一处理异常顺道精简代码
重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章中,讨论了异常的统一处理,并 ...
Python学习_算数运算函数
记录以grades列表为例,分别定义输出.求和.平均值.方差和标准差函数,并输出相应的值 grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90 ...
c++ 继承学习笔记
三大继承原则(由我杜撰) 基类的私有成员被继承后不可见(优先级最高) 公有继承不改变基类成员属性 保护继承(私有继承)把基类成员变为保护成员(私有成员)
hdu 5256 序列变换 (LIS变形)
序列变换 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
从实例谈OOP、工厂模式和重构
有了翅膀才能飞, 欠缺灵活的代码就象冻坏了翅膀的鸟儿.不能飞翔,就少了几许灵动的气韵.我们需要给代码带去温暖的阳光, 让僵冷的翅膀重新飞起来. 结合实例, 通过应用OOP.设计模式和重构,你会看到代码 ...
bzoj4383(拓扑排序)
给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r-1],a[ ...
TCP的代码
视频已经发布,这里是所有的代码仅供参考. TCP服务器: MainWindow里面的代码: using System; using System.Collections.Generic; using ...
JMeter学习(九)FTP测试计划(转载)
转载自 http://www.cnblogs.com/yangxia-test FTP服务主要提供上传和下载功能.有时间需要我们测试服务器上传和下载的性能.在这里我通过JMeter做一个FTP测试计划 ...