如何在Python脚本输出中取消‘Content-type: text/html’?
首先咱们先理清楚来龙去脉:你脚本里的print ("Content-type: text/html")是手动打印HTTP响应头的代码,这行本质是发给web服务器的指令,正常通过浏览器访问CGI脚本时,浏览器不会显示这行内容——它只是告诉服务器“接下来返回的是HTML格式的内容”。如果你直接在命令行运行脚本,这行才会被打印到控制台,属于正常现象。
根据你的需求,分两种场景给出解决方案:
场景1:通过web服务器访问时,页面意外显示了这行内容(正常情况不会)
如果你的脚本通过Apache、Nginx这类web服务器的cgi-bin运行,但浏览器里却出现了Content-type: text/html,大概率是脚本没有正确用空行分隔HTTP头和内容体(不过看你代码里已经有print("")了)。这时候可以换用cgi模块自动处理头,代替手动打印:
删掉你手动写的两行打印代码:
print ("Content-type: text/html") print("")
然后用cgi模块的方法自动发送头,还能灵活指定内容类型:
import cgi # 要返回HTML内容的话用这个 cgi.print_header(content_type='text/html') # 如果要返回纯文本,改成下面这样 # cgi.print_header(content_type='text/plain')
这样既符合CGI规范,又能避免头内容意外泄露到页面里。
场景2:本地命令行测试脚本时,不想看到这行输出
如果你只是在本地跑脚本时不想看到Content-type: text/html,最简单的方法就是删掉那两行手动打印的代码。但要注意,直接删掉的话通过web服务器运行会报错(因为缺少必要的HTTP头),所以可以加个环境判断,只在CGI环境下打印头:
import os # 判断是否处于web服务器的CGI环境中 if os.getenv('REQUEST_METHOD'): print("Content-type: text/html") print("") # 后续的数据库操作、业务逻辑代码...
这样命令行运行时(没有REQUEST_METHOD环境变量)就不会打印头,通过web服务器访问时又能正常发送头。
另外顺便提一句:你写的select_from_sql函数里SQL语法有问题,正确的SELECT语句应该是SELECT id, source_server, source_path, destination_path FROM posts WHERE uuid = %s,别用values关键字哦。
内容的提问来源于stack exchange,提问作者harika

