Как исправить «Описание кода ошибки: HTTPStatus.NOT_FOUND - Ничто не соответствует заданному URI». в http.server Python 3.7? - PullRequest
0 голосов
/ 05 августа 2020

Среда:

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 не понимаю причины проблемы. Кто-нибудь понимает источник проблемы, пожалуйста?

...