Среда:
Python 3.7.7 Windows 10 64бит
Назначение кода:
Показать отчет HTML о моей активности в программном обеспечении. Он использует модуль http.server, загружаемый файлом Report.py, а отчет с данными извлекается index.py. У меня есть скрипт myscript.py, который запускает сервер, вызывая метод StartReportTool () внутри модуля Report.py. Report.py запускает сервер и загружает index.py.
Дерево файлов и папок:
- myscript.py <= call the method in module Report.py to launch web server
- /report
- /report/Report.py <= launch the web server
- /report/index.py <= extract the data and display them in html
Исходный код:
myscript.py:
def report():
from report import Report
Report.StartReportTool()
report()
/ report / Report.py
#coding:utf-8
import http.server
import webbrowser
def StartReportTool():
port=8888
address=("",port)
server=http.server.HTTPServer
handler=http.server.CGIHTTPRequestHandler
handler.cgi_directories=["/"]
httpd=server(address,handler)
print(f"Report tool server started on port {port}")
webbrowser.open('http://localhost:8888/index.py', new=2)
httpd.serve_forever()
index.py:
#coding:utf-8
import cgi
import cgitb
cgitb.enable()
form = cgi.FieldStorage()
print("Content-type: text/html; charset=utf-8\n")
html=f"""
<!DOCTYPE html>
My html code
"" "
Проблема:
Когда я запускаю myscript.py, который запускает мой http.server, мой браузер открывает url 'http://localhost: 8888 / index.py' и показывает ошибку 404 :
Error response
Error code: 404
Message: No such CGI script ('//index.py').
Error code explanation: HTTPStatus.NOT_FOUND - Nothing matches the given URI.
Проведя расследование, я понял, что все в порядке, когда сервер запускается собственным скриптом Report.py:
#coding:utf-8
import http.server
import webbrowser
def StartReportTool():
port=8888
address=("",port)
server=http.server.HTTPServer
handler=http.server.CGIHTTPRequestHandler
handler.cgi_directories=["/"]
httpd=server(address,handler)
print(f"Report tool server started on port {port}")
webbrowser.open('http://localhost:8888/index.py', new=2)
httpd.serve_forever()
StartReportTool() # <======= Here is the line of code which launch the server itself inside the same module
Вы заметили здесь последнюю строчку кода StartReportTool ( ), который вызывает метод внутри самого модуля. И таким образом он работает нормально. Мой index.py загружен правильно.
Проблема возникает, когда метод StartReportTool () вызывается извне метода. I не понимаю причины проблемы. Кто-нибудь понимает источник проблемы, пожалуйста?