最近在学python,刚接触python高级编程-gci编程,照着网上的资料去配置文件 ,但是其中遇到了很多问题,可以说一天都呆坑里,特记录下这些,总结下,也以便帮小伙伴们解决问题。
我参考的是这篇文章:https://blog.csdn.net/qq_24504591/article/details/81670766
但是有些地方有点不同,我接下里会慢慢说
一、实验工具:
Apache2.4、python3.7
这两个文件的下载安装文件的下载可以参照上面的那个兄弟的文章。(python如果你是现在安装,我觉得这篇文章你还是晚点来看,先把之前的基础的东西学下比较好)
二、实验步骤(注意:我们的配置基本上是在Apache24-->conf-->httpd.conf,接下来我就不重复说明):
首先进入httpd.conf文件,来配置,这个文档比较长,大家可以看的的演示图片的相应行号来快速找到需要修改的部分。
1、配置文件的根目录:
设置SRVROOT根目录,目录就是你的Apache的存放路径,比如我的存放路径时D:/Apache24,因为之后到多次用到这个根路径,所以我们为了后期的修改方便,利用引用“${SRVROOT}”的方式来书写配置
2、设置我们的py文档的存储路径,以便Python解释器能够找到它(也就是设置访问权限)
我们选择直接放在根目录的cgi-bin文件夹下
找到下处:
修改成如下:
配置文件:
AllowOverride None
Options Indexes FollowSymLinks ExecCGI
Require all granted
Require host ip
注意,在上面也有一个
3、开启cgi_module modules/mod_cgi.so模块(去掉模块前的注释#):
----------------------------------------------------------------------------坑1----------------------------------------------------------------------------------------
网上很多文章说在配置文件中还需要加:ScScriptInterpreterSource Registry,这个的作用是帮我们找到Pyton解释器用的,但是,注意,这位是win32为操作系统用的,对于64位的没有用,所以我们选择直接在py文件中声明编译器的位置,下面我们会说RegistryScriptInterpreterSource Registry
4、文件配置那块算结束了,我们来写py文件,上面也说了,我们把文件放到cgi-bin文件夹下面。具体代码如下:
#!C:/Users/Administrator/AppData/Local/Programs/Python/Python37/python.exe
# -*- coding: utf-8 -*-
print ("Content-type:text/html\n\n")
print # 空行,告诉服务器结束头部
print ('')
print ('')
print ('')
print ('Hello Word! ')
print ('')
print ('')
print ('Hello Word!
')
print ('')
print ('')
说明:1、第一行是申明我的解释器的位置,记住,一定要写第一行,python的格式规范
2、因为我们用的是Python3.7,输出语句print("")是要加括号的,一定要注意,不然之后会报500错误
3、第三行的print ("Content-type:text/html\n\n"),这是声明格式,此处注意,其中的“\n\n”,两个“\n”,一个都不能少,少了也会报500错误。
大家可能会问,编译器是怎么找到我们的文件的?答案在这里
5、修改端口:
端口可改可不改,防止默认的的80端口被占用,我们改下,我改成"5023"
6、增加解释种类
去掉改行的#注释,并在后面再加上“.py”,以增加对python语言的兼容
7、到上面为止,配置、文件算是写完啦,接下来准备运行了
1、启动服务器
你也可以选择命令行启动
https://blog.csdn.net/weixin_37909363/article/details/80332733
建议命令行启动,这样可以发现无法开启的报错原因。
服务器启动上,碰到很多坑,后面会说
8、进入网址栏,输入 http://localhost:5032/cgi-bin/hello.py
运行成功。
接下来再说说我遇到报错坑:(大部分是在服务器启动的坑)
一、报错:Errors reported here must be corrected before the service can be started.
这句话的意思其实是:如果在这句话出现的时候,有错误的报告出来,那应该先解决这个错误。如果没有出现报错,就可以无视这句话,所以大家在看到这句话的时候,不必惊慌,没事
二、刚说完这句话,我就来事了。
报错:Errors reported here must be corrected before the service can be started.
(OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 : AH00072: make_sock: could not bind to address [::]:443
(OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 : AH00072: make_sock: could not bind to address 0.0.0.0:443
AH00451: no listening sockets available, shutting down
AH00015: Unable to open logs
通常看到这类错误,无疑,就是端口冲突,但是这端口。。。我怎么没见过?我设置的端口不是5023吗?怎么还冲突了?
其实却是是端口冲突了,不过这回事443端口冲突,这是Apache里面的一些服务程序用的端口,意思是我们电脑上443端口已经被占用了,一般解决端口占用问题,有两种解决方法。
1、关掉占用端口的程序
先找到占用端口号的程序PID:netstat -ano|findstr “端口号”
再杀死进程:taskkill /pid {pid}
2、更改配置文件中端口配置,就443端口冲突我们来解决。
找到如下文件目录下:Apache24\conf\extra
更改以下两个文件:httpd-ahssl.conf和httpd-ssl.conf,有443的地方改掉,比如改为442。
还有一种低级错误,会造成端口冲突情况,那就是,重复启动该程序。
三、报错:You don't have permission to access /cgi-bin/hello.py on this server.
这种一般是配置文件出了问题,在设置访问权限的地方配错了,根据以上步骤2即可
四、报错:AH01215: Can't find a default Python.\r: D:/Apache24/cgi-bin/hello.py
报错意思是,没有找到默认的Python编译器,然后我就去看看py文件的路径有没有错,我发现没有错,然后我以为它默认通过系统path下去寻找,但是到系统环境变量里去看,也没错,那我就纳闷了,这不是有编译器吗。
然后才发现,确实是没找到解释器,因为我的python代码有错,print("")方法(千万别跟我一样大意了),需要加括号(),另外“\n\n”少了,这点要注意。
而上面的错误,就是通过查看日志文件得到的信息。Apache/logs/error.log。所以,建议大家,在调错时,要运用好日志文件,这是个很好的东西!