配置apache

我以前web开发基本都是基于java平台的,比如tomcat,servlet等等,由tomcat接收http请求,然后交给servlet处理,servlet处理完成以后把返回结果交给tomcat,由tomcat返回给客户端,这次学习python CGI的时候首先想到的是CGI的圆形原理是什么,怎么处理一次完整的http请求?过程如下:

  1. 客户端发起http请求
  2. apache接收http请求
  3. apache(必须加载了对应的处理模块,如处理python的mod_cgid.so)交给编写好的python脚本处理
  4. python脚本接受参数并输出一个http页面
  5. apache将这些输出返回给客户端

和我们熟悉的servlet处理相比是相当类似的,但是还有两个问题没有解决:

  • tomcat和apache的区别是什么?
  • apache怎么知道把请求交给python处理(即apache的配置)

tomcat和apache的区别

在此不进行复杂的比较,在此列中我只需要知道:

  1. apache是一个高效的http静态服务器,用来处理静态页面的请求(如果需要处理动态请求需要加载对应模块,比如php,perl)
  2. tomcat是一个java应用服务器,可以处理静态请求,也可以处理servlet

配置apache可以处理pyton脚本

  1. 首先安装apache2自不必说,目前大多数linux发行版应该自带了apache2
  2. 配置apache2.conf(有些可能是httpd.conf,可以使用locate定位该文件的位置),修改如下
# apache2.conf配置

# 加载处理python cgi的模块,必须有
LoadModule cgid_module /usr/lib/apache2/modules/mod_cgid.so
# 一定要注意配置的服务器根目录是是什么,我的是/var/www
# 告诉apache2访问/cgi-bin/的时候去 /var/www/cgi-bin/找脚本,注意要有'/'
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
# 对python脚本所在目录进行配置
<Directory "/var/www/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
AddHandler cgi-script cgi
</Directory>
# 识别cgi脚本后缀
AddHandler cgi-script .cgi .py

测试配置

好的姿势都摆好了,可以写一个示例试试配置是否成功。

编写一个python脚本

在/var/www/cgi-bin/目录下新建一个test.py

#!/usr/bin/env python
# -*- coding=utf-8 -*- import cgi
import cgitb;
cgitb.enable() print "Content-type:text/html"
print # 注意此处必须加print打印出一个空行,否则CGI无法解析
print """<HTML>
<HEAD>
<TITLE>CGI Environment</TITLE>
</HEAD>
<BODY>"""
cgi.print_environ()
print "</BODY></HTML>"

修改脚本权限

# 特别注意我使用root用户直接登陆的,此处为了简单起见使用了777,在实际配置重中这是非常不安全的
chmod test.py

启动apache 服务

# 有些可能是httpd
service apache2 start

在浏览器中查看页面

在浏览器中输入:localhost/cgi-bin/test.py

看到下面内容(只要有内容就行,具体内容不一定一样)说明配置成功了

Shell Environment:

CONTEXT_DOCUMENT_ROOT
/var/www/cgi-bin/
CONTEXT_PREFIX
/cgi-bin/
DOCUMENT_ROOT
/var/www/html
....(此处为省略的内容)
::
SERVER_ADMIN
webmaster@localhost
SERVER_NAME
localhost
SERVER_PORT SERVER_PROTOCOL
HTTP/1.1
SERVER_SIGNATURE
<address>Apache/2.4. (Debian) Server at localhost Port </address>
SERVER_SOFTWARE
Apache/2.4. (Debian)

在线编辑器

以上是python web学习之前的一些环境搭建工作,以下是一个简单的pyhton CGI程序,完成一个在线编辑器的功能,可以打开文件,编辑文件,保存文件(需要输入密码)。

整个功能比较简单,不再对详细过程解释,代码如下:

首页

<html>
<head>
<title>editor</title>
</head>
<body>
<form action='edit2.py' method='POST'>
<b>file name</b>
<input type='text' name='filename' />
<input type='submit' value='open' />
</body>
</html>

编辑页面

#!/usr/bin/env python
#-*- coding=utf-8 -*- import cgi
import sys
from os.path import join, abspath # 先 输出头信息,便于后面的信息能正常输出
print """Content-type: text/html""" # 文件所在目录
BASE_DIR = abspath('data') form = cgi.FieldStorage() filename = form.getvalue('filename') if not filename:
print 'please input a filename'
sys.exit() text = open(join(BASE_DIR, filename)).read() print """
<html>
<head>
<title>editing</title>
</head>
<body>
<form action='save.py' method='POST'>
<b>File: %s</b> </br>
<input type='hidden' value='%s' name='filename' />
<b> Password :</b><br />
<input type='password' name='password' /><br />
<b>Text: </b> <br />
<textarea column='20' row='10' name='text'>%s</textarea> </br>
<input type='submit' value='save' />
</form>
</body>
</html>
""" % (filename, filename, text)

保存页面

#!/usr/bin/env python
#-*- coding=utf-8 -*- import cgi
import sys
from os.path import join, abspath # 先输出头信息,便于后面的输出正常
print "Content-type: text/html\n" # 文件所在目录
BASE_DIR = abspath('data') form = cgi.FieldStorage() text = form.getvalue('text')
filename = form.getvalue('filename')
password = form.getvalue('password') # 检查参数是否为空
if not (text and filename and password):
print 'invalid params'
sys.exit()
# 验正密码
if password != '':
print 'invalid params'
sys.exit() f = open(join(BASE_DIR, filename), 'w')
f.write(text)
f.close() print 'the file have been saved'

注意:

  1. 在/var/www/cgi-bin/data下面新建文件edit2.dat,该文件一定是可读可写的
  2. 将以上三个页面复制到cgi-bin目录下,脚本记得修改权限,当前用户必须是可读可执行的
  3. 编写pyhton脚本的时候,返回的html包含header信息的时候,header前面不能有空行,header和正文之间必须有空行

代码位置

http://pan.baidu.com/s/1bo5z4pL

python练习五—简单web应用的更多相关文章

  1. python起个简单web服务器

    在 Linux 服务器上或安装了 Python 的机器上,Python自带了一个WEB服务器 SimpleHTTPServer. 我们可以很简单的使用  python -m SimpleHTTPSer ...

  2. Python Web-第五周-Web Services and XML(Using Python to Access Web Data)

    1.Web Service Overview 1.Data on the Web Python Dictionary 和 Java HashMap间需要建立一个桥梁,可以用XML或是JSON 2.XM ...

  3. Python Socket实现简单web服务器

    #!/usr/bin/python env # coding:utf-8 import socket ip_port = ('127.0.0.1', 80) back_log = 10 buffer_ ...

  4. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  5. 20145216 20145330 《信息安全系统设计基础》 实验五 简单嵌入式WEB 服务器实验

    20145216 20145330 <信息安全系统设计基础> 实验五 简单嵌入式WEB 服务器实验 实验报告封面 实验步骤 1.阅读理解源码 进入/arm2410cl/exp/basic/ ...

  6. 20145208《信息安全系统设计基础》实验五 简单嵌入式WEB 服务器实验

    20145208<信息安全系统设计基础>实验五 简单嵌入式WEB 服务器实验 20145208<信息安全系统设计基础>实验五 简单嵌入式WEB 服务器实验

  7. 20145210 20145226 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验

    20145210 20145226 <信息安全系统设计基础>实验五 简单嵌入式WEB服务器实验 结对伙伴:20145226 夏艺华 实验报告封面 实验目的与要求 · 掌握在ARM开发板实现 ...

  8. 20145221 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验

    20145221 <信息安全系统设计基础>实验五 简单嵌入式WEB服务器实验 实验报告 队友博客:20145326蔡馨熠 实验博客:<信息安全系统设计基础>实验五 简单嵌入式W ...

  9. 20145303 20145339 《信息安全系统设计基础》 实验五 简单嵌入式WEB服务器实验

    20145303 20145339 <信息安全系统设计基础> 实验五 简单嵌入式WEB服务器实验 实验目的与要求 1.掌握在ARM开发板实现一个简单WEB服务器的过程 2.学习在ARM开发 ...

随机推荐

  1. 基于IP的docker private registry 私有仓库的搭建

    鉴于国内的网络环境,如果公司内部大量使用docker,镜像上传下载将是个非常耗时的工作,搭建一个私有仓库可以很好的解决自有镜像的存储,如果你在私有网络,不能使用域名的话,那么本文可以作为一个很好的例子 ...

  2. linux vi如何保存编辑的文件

    按ESC键回到命令模式,输入:w保存即可,或者输入:wq!保存文件并退出. 以下是保存命令: :w   保存文件但不退出vi . :w file 将修改另外保存到file中,不退出vi . :w!   ...

  3. 求N!的位数

    #include<iostream> #include <cstdio> #include <cmath> using namespace std; const d ...

  4. JS中创建多个相同的变量出现的问题

    在做轮播图的时候出现了一个问题:如果定义两个完全相同的变量会发生什么: 1.两个全局变量: var num = 10; var num =100; 这种情况下很明显输出num的话会是100,但是内存中 ...

  5. 插入排序之Java实现

    插入排序类似于大多数人安排扑克牌的方式. 1.从你手中的一张牌开始, 2.选择下一张卡并将其插入到正确的排序顺序中, 3.对所有的卡重复上一步. /** * * 代码理解:只需要记住两点: * 1.当 ...

  6. 解析分享链接在微信内转发防封API接口的实现原理

    域名被微信封了怎么办?相信这是很多做微信的朋友的疑惑,本人也是做防封的,特此写一篇文章,写给域名被微信封的.被秒封的朋友来看.简单个大家讲一下防封原理和实现方式. 域名拦截因素 我们先来了解一下域名为 ...

  7. HDFS-HA高可用

    HDFS-HA工作机制 通过双NameNode消除单点故障 HDFS-HA工作要点 1.元数据管理方式需要改变 内存中各自保存一份元数据: Edits日志只有Active状态的NameNode节点可以 ...

  8. java.lang.OutOfMemoryError: PermGen space (jvm内存泄漏解决办法)

    2.在myeclipse根目录 打开myeclipse.ini 3.在myeclipse中配置内存

  9. Android WebView 打印 Console Log

    通常状况下,添加如下代码即可: mWebView.setWebViewClient(new WebChromeClient {      /*android 低版本 Desperate*/     @ ...

  10. 吴恩达机器学习笔记48-降维目标:数据压缩与可视化(Motivation of Dimensionality Reduction : Data Compression & Visualization)

    目标一:数据压缩 除了聚类,还有第二种类型的无监督学习问题称为降维.有几个不同的的原因使你可能想要做降维.一是数据压缩,数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,而且它也让我们 ...