我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【apache+cgi+python】c

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【apache+cgi+python】c

虽然现在开发web用的都是一些成熟的框架, 使我们可以不用关心底层的接口逻辑, 但是多了解一些底层的知识对我们也是有帮助的。

虽然在效率上cgi接口远不如其它几个接口, 但是它足够简单, 非常适合新手入门。

本文使用python,curl, 在ubuntu + apache环境下为大家展示cgi接口的基本原理。

本人小菜一枚, 文中错误在所难免, 希望大家能够不吝赐教。

首先、配置apache、htaccess

网站根目录为/var/www, 我们放试验脚本的目录为/var/www/python-cgi。

apache的配置

$ gedit /etc/apache2/sites-available/default

<VirtualHost *:80>
    DocumentRoot /var/www
    <Directory "/var/www/python-cgi/">
        Options +ExecCGI +FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost> 

在/var/www/python-cgi目录下放个.htaccess文件,内容为

AddHandler cgi-script .py
DirectoryIndex py-cgi-index.py
AddType text/html .py
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ py-cgi-index.py/$1 [L]
</IfModule> 

在/var/www/python-cgi目录下放个py-cgi-index.py文件, 然后添加可执行权限。

$ chmod a+x py-cgi-index.py 

环境配置就完成了。

一、cgi的hello world

cgi的通信依靠stdout与浏览器通信。 所以简单地在py-cgi-index.py里面写:

#!/usr/bin/env python
print 'hello world' 

这样写是不对的。 cgi接口规定,cgi脚本输出的开头应该是http header。 而hello world这种字符无法被识别为任何有效的http header, 所以如果访问http://localhost/python-cgi,会返回500错误。

解决办法有两个:

1、写上http header。 header与body之间必须有一个空行,以识别前面的是header,后面的是body。 代码改成:

#!/usr/bin/env python
print 'Content-Type: text/html\n\nhello world' 

2、空白http header。 不写http header的情况下,apache会自动补上header。 代码改成:

#!/usr/bin/env python
print '\nhello world' 

关于header,我还要再说一个问题。 cgi脚本的stdout首先要交给apache, apache会对stdout进行一些处理。 如果使用curl -i查看返回的http header, 会发现,header部分被补全了:

HTTP/1.1 200 OK
Date: Sun, 06 Jan 2013 02:49:21 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Content-Length: 20
Content-Type: text/html 

二、服务器参数

在php中,有一个重要的全局变量叫$_SERVER,它包含了服务器的一些参数。 那么在我们的cgi脚本中,如何获得这些参数呢? 答案是环境变量。 代码改成:

#!/usr/bin/env python
import os
print 'Content-Type: text/html\n\n'
for i in os.environ:
    print '%s => %s'%(i,os.environ[i]) 

就可以看到,os.environ中有我们需要的很多参数, 包括:

REDIRECT_QUERY_STRING
REDIRECT_STATUS
SERVER_SOFTWARE
SCRIPT_NAME
SERVER_SIGNATURE
REQUEST_METHOD
PATH_INFO
REDIRECT_URL
SERVER_PROTOCOL
QUERY_STRING
PATH
HTTP_USER_AGENT
SERVER_NAME
REMOTE_ADDR
PATH_TRANSLATED
SERVER_PORT
SERVER_ADDR
DOCUMENT_ROOT
SCRIPT_FILENAME
SERVER_ADMIN
HTTP_HOST
REQUEST_URI
HTTP_ACCEPT
GATEWAY_INTERFACE
REMOTE_PORT 

三、get参数

最常用的向服务器提交参数的方法就是get。 我们这里用curl来模拟:

$ curl -i http://localhost/python-cgi/xxx?aaa=bbb\&ccc=ddd 

然后可以看到:

os.environ['QUERY_STRING']变成了aaa=bbb&ccc=ddd 

这个就是get参数。 不过, 在这里, 我们需要手工地按照'&'来切分各个query段。

四、post参数

除了get以外, 用户名、密码、文件上传等通常都是使用post来提交。 那么cgi脚本中如何获得post的数据呢? 答案是stdin。 代码改成:

#!/usr/bin/env python
print 'Content-Type: text/html\n\n'
while True:
    i = raw_input()
    if i is None:
        break
    print i 

1、简单的post参数:

$ curl -i --data "ggg=hhh" --data "iii=jjj" http://localhost/python-cgi/xxx?aaa=bbb\&ccc=ddd\&eee=fff 

它会输出:

ggg=hhh&iii=jjj 

之后我们需要手动地按照&分隔各个段。

2、文件上传:

$ curl -i --form upload=@filepath --form name=elephant http://localhost/python-cgi/xxx?aaa=bbb\&ccc=ddd\&eee=fff 

它会输出:

------------------------------11c41e187464
Content-Disposition: form-data; name="upload"; filename="filepath"
Content-Type: application/octet-stream

中间的是文件内容

------------------------------11c41e187464
Content-Disposition: form-data; name="name"

elephant
------------------------------11c41e187464--

并且此时,os.environ中有一个重要的值:

CONTENT_TYPE => multipart/form-data; boundary=----------------------------11c41e187464 

boundary后面的是分隔线。 之后需要人为地按照这个分隔线来区分各个段的内容, 并且还要解析Content-Disposition的内容。

五、日志输出

apache有日志功能,我们的cgi脚本能输出到apache的日志中? 答案是肯定的,方法是stderr。 代码改成:

#!/usr/bin/env python
import os
print 'Content-Type: text/html\n\nHello world'
os.stderr.write('this is log') 

在访问之后, 就可以去apache的日志中找输出的内容了。

六、总结

cgi的接口如此的简单, 使用的仅仅是stdin、stdout、stderr、环境变量四个最常用的进程间交换数据的方式。 而且几乎所有语言都能够处理这四项内容。 剩下的事情,

  • http协议规定的东西, 例如在http header添加cookie段可以在浏览器端生成cookie。
  • 编程语言自己来处理的事情, 包括数据库、session、文件读写等。

有空也用c语言写一个吧。

全文完。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【apache+cgi+python】c

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【apache+cgi+python】c

虽然现在开发web用的都是一些成熟的框架, 使我们可以不用关心底层的接口逻辑, 但是多了解一些底层的知识对我们也是有帮助的。虽然在效率上cgi接口远不如其它几个接口, 但是它足够简单, 非常适合新手入门。本文使用python,curl, 在
2023-01-31

apache cgi python

修改apache配置文件如下    AllowOverride None    Options ExecCGI    Order allow
2023-01-31

如何搭建C语言CGI和Apache服务器的开发环境

这期内容当中小编将会给大家带来有关如何搭建C语言CGI和Apache服务器的开发环境,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。今天中午在研究c语言gui时看到了cgi。之前花了些时间找c语言的gui框
2023-06-17

ubuntu如何配置apache运行cgi脚本

这篇“ubuntu如何配置apache运行cgi脚本”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ubuntu如何配置apa
2023-07-04

python cgi 程序demo

http://www.yiibai.com/python/python_cgi_programming.html公共网关接口或CGI,Web服务器和一个自定义的脚本之间交换信息是是一组定义的标准..CGI规范在由NCSA和NCSA定义的CG
2023-01-31

Python网页编程(CGI)

1)程序简单,引用几个关键处理即可:#coding=utf-8#!/usr/bin/python# CGI处理模块from os import environimport cgi, cgitb# 创建 FieldStorage 的实例化fo
2023-01-31

Python CGI编程是什么

这篇文章主要讲解了“Python CGI编程是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python CGI编程是什么”吧!Python CGI编程什么是CGICGI 目前由NCSA
2023-06-08

【Python进阶】04、CGI编程

一、CGI概述1、CGI简介      CGI(Common Gateway Interface) 是WWW技术中最重要的技术之一,有着不可替代的重要地位。CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和We
2023-01-31

Windows怎么配置Apache以便在浏览器中运行Python script的CGI模式

这篇文章给大家介绍Windows怎么配置Apache以便在浏览器中运行Python script的CGI模式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。现在因为已经安装了2.6的Python,以及支持2.6的Eric
2023-06-05

Fedora中apache如何安装配置使之执行cgi程序

小编给大家分享一下Fedora中apache如何安装配置使之执行cgi程序,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1,安装Fedora apache 首先到Fedora apache的主页下载***版本的Fedora
2023-06-16

python CGI 文件读写注意 50

cgi出现500错误 ,是由于 HTTP表头不对gi的通信依靠stdout与浏览器通信。 所以简单地在py-cgi-index.py里面写: #!/usr/bin/env python print 'hello world' 这样写是不对的
2023-01-31

怎么在Python中交互CGI编程

这篇文章给大家介绍怎么在Python中交互CGI编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题,而不是搞明白语言本身。2
2023-06-14

如何在Windows的Apache服务器上配置对PHP和CGI的支持

这篇文章主要介绍“如何在Windows的Apache服务器上配置对PHP和CGI的支持”,在日常操作中,相信很多人在如何在Windows的Apache服务器上配置对PHP和CGI的支持问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作
2023-06-05

Python + Apache + mo

准备也学学Python,GUI的库太大了,学起来周期太长,先搞搞Web,入了门再说。先搭建Python + Apache + mod_python环境:1、说起服务器,当然少不了Apache,不用安装这么麻烦,下载个XAMPP就好了,注意里
2023-01-31

apache+mod-python

1.install Python最新的Ubuntu操作系统是含有Python的,可以通过 Python --version 查看的:lab@lab:~$ python versionPython 2.7.1+2.install MySQL使
2023-01-31

python-django-apache

今天弄了一天django,想把它架到apache上这是apache的conf配置文件中我加入的内容Listen 127.0.0.1:8888        
2023-01-31

如何使用Python创建第一个CGI程序

本文小编为大家详细介绍“如何使用Python创建第一个CGI程序”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用Python创建第一个CGI程序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。第一个CGI程
2023-06-08

使用python cgi上传文件并计算m

对文件拷贝后进行MD5值比较,看是不是拷贝完全。google和baidu上都是使用md5模块读取所有的文件进内存,在计算md5,导致计算超过1G大小的文件报错。增量计算MD5的方法:#!/usr/bin/pythonimport hashl
2023-01-31

如何编写Python CGI程序与MySQL交互?

假设您想使用Python CGi脚本登录您的帐户,以下是详细信息login.htmlemail:
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录