从Python到Apache再到CGI
三天学完Python的我,没有想到一个CGI让我研究了两天,没有大牛带路的日子,我是要记录一下自己成长的过程了。也最终明白了一个道理,坚持很重要。。。。虽然我是前端,可是知识没有边界。。。。
目录
- 一、Apache安装和启动
- 二、CGI启动
内容
一、Apache安装和启动(windowS)
-
下载地址:Apache
-
根据自己的电脑系统安装相应的版本,如图:
下载地址 -
修改配置文件
配置文件地址httpd.conf
,具体地址,在apache
安装目录里面如下图:
- 修改默认目录,将
SRVROOT
默认的c:/Apache24
,修改为apache24
的安装目录,以我自己的安装为例:
修改根目录地址
地址应该是:D:/httpd-2.4.41-win64-VS16/Apache24
写法如下:
SeverRoot -
修改端口号如下图:
端口号1
端口号2
- 修改默认目录,将
-
启动服务,找到
启动服务bin
目录下的ApacheMonitor.exe
,双击,如图:
-
打开浏览器,如果显示如下效果,证明服务启动成功,效果如图:
服务启动成功
自己的测试文件应该如何启动:
文件存放位置为htdocs
,建立自己的测试文件hello.py
,如下图:
至此,
apache
安装并启动成功。
二、CGI启动
CGI
的文件存放目录为 apache24
下面的cgi-bin
,如图所示:
在此目录下,我新建了dyx.cgi
测试文件,文件内容如下:
之后我们按照配置的路径,在浏览器打开文件,效果如下:
CGI启动失败
然后我们去查看一下log日志:目录为apache24
下面的logs
文件夹,如图:
提示如下图:
日志提示
然后经过研究,得出:
该错误的原因是cgi
文件写的内容有缺失,之后在文件头部增加一行代码,来告诉服务用什么来解析文件,也就是要把python.exe
的安装路径写进去,路径查找如下图:
代码如下:
#!C:/Users/v_yanxdai/AppData/Local/Programs/Python/Python37
print("Content-type:text/html\r\n\r\n")
print('')
print('<b>Hello--我是CGI 文件</b>')
然后浏览器打开页面依然报错,查看log日志,报错如下:
Log拒绝访问之后,查看了很多文档,毕竟身边都是前端,也没法找人探讨,只能自己摸索,查看了几种解决方案,大致如下:
- 方案1:增加文件编码代码:
# -*- coding: utf8 -*-
- 方案2:引入
gci
import cgi import cgitb;cgitb.enable()
- 方案3:修改
httpd.conf
配置文件# Options Indexes FollowSymLinks Options +Indexes +FollowSymLinks +Multiviews # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # AllowOverride FileInfo AuthConfig Limit # # AllowOverride None AllowOverride all
然而这些方案还是没有解决我的问题,极尽放弃的边缘,又坚持看了一些文档,把第一行的代码#!C:/Users/v_yanxdai/AppData/Local/Programs/Python/Python37
修改为:#!C:/Users/v_yanxdai/AppData/Local/Programs/Python/Python37/python.exe
,打开浏览器页面显示如下:
原因:
我们脚本中的第一行文本有点儿神秘。它看起来应该是一条注释,因为它起始于一个符号,但是它看起来太有意义,以至于不仅仅是注释。事实上,这个是被用来告诉操作系统将执行此脚本所用的解释器的名字。 每个脚本都应该把这一文本行作为它的第一行。
至此,
CGI
启动成功。
注意:
如果CGI返回的内容是html页面,有可能会出现页面乱码的情况,效果如下:
乱码
增加如下代码即可
import codecs, sys
# CGI处理模块
import cgi, cgitb
sys.stdout = codecs.getwriter('utf-8')(sys.stdout.buffer)
效果如下:
成功
至此2天的时间已经耗完,好在问题得到了解决,总结经验就是,第一要学会看Log日志,第二就是,多尝试。第三就是遇到问题,要耐心解决,能解决问题比没有遇到任何问题更能增加我们对新知识的理解。