标签: simplehttpserver

如何从Python脚本中杀死SimpleHTTPServer?

我试图用来http.server测试Python项目中的所有链接.如果我在运行脚本之前启动服务器,我可以让我的脚本工作,然后当我关闭终端窗口时服务器停止.但我真的很喜欢脚本本身启动和停止服务器.

我制作了一个测试脚本,只需启动服务器,获取页面并证明服务器正在运行,然后停止服务器.我似乎无法得到服务器的pid.当我尝试在脚本运行后杀死此脚本报告的pid时,我收到一条消息,表明没有这样的进程; 但服务器仍在运行.

如何获取服务器的正确pid,或者更一般地说如何从脚本中停止服务器?

import os
import requests
from time import sleep

# Start server, in background.
print("Starting server...")
os.system('python -m http.server &')
# Make sure server has a chance to start before making request.
sleep(1)

print "Server pid: "
os.system('echo $$')

url = 'http://localhost:8000/index.html'
print("Testing request: ", url)
r = requests.get(url)
print("Status code: ", r.status_code)
Run Code Online (Sandbox Code Playgroud)

python simplehttpserver python-requests

7
推荐指数
1
解决办法
9481
查看次数

Python SSL 服务器给了我“501 Unsupported method GET”

我已经按照此链接构建了一个带有 SSL 的简单文件服务器。

from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl

httpd = HTTPServer(('localhost', 4443), BaseHTTPRequestHandler)

# openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
httpd.socket = ssl.wrap_socket (httpd.socket, keyfile="key.pem", certfile='cert.pem', server_side=True)

httpd.serve_forever()
Run Code Online (Sandbox Code Playgroud)

我创建了一个证书成功,key.pemcert.pem文件路径都很酷,我可以使用启动服务器python server.py。我被要求输入密码,输入它,然后它冻结了一会儿,然后它似乎运行。

但是,当我输入一些 URL 时,例如https://localhost:4443/index.html我得到500 Unsupported method GET。错误代码解释:HTTPStatus.NOT_IMPLEMENTED - 服务器不支持此操作。我需要做更多的事情来让我的服务器为当前目录提供服务吗?到目前为止,我刚刚使用过python -m http.server 8000SimpleHTTPServer在 Mac 上时)。我使用的是 Python 3。

这是一个将保持本地状态所以不要担心PEM文件和服务器脚本通过它暴露(如果它有效!)。我也同意证书不受信任并指示 Chrome 无论如何访问该页面。我只需要它来允许我访问相机,而不必将我的应用程序部署到具有合法证书的某个地方。

python simplehttpserver python-3.x

7
推荐指数
1
解决办法
8731
查看次数

python的SimpleHTTPServer do_GET和do_POST函数如何工作?

我出于学习目的创建了以下小型 HTTP 服务器:

import SimpleHTTPServer
import SocketServer

class ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):

    def do_GET(self):
        print(self.headers)
        SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)

    def do_POST(self):
        print(self.headers)
        form = cgi.FieldStorage(
            fp=self.rfile,
            headers=self.headers,
            environ={'REQUEST_METHOD':'POST',
                 'CONTENT_TYPE':self.headers['Content-Type'],

def main():
    port = 50738
    Handler = ServerHandler(1000)
    httpd = SocketServer.TCPServer(("192.168.X.Y", port), Handler)

    print "serving at port", port
    httpd.serve_forever()


if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

我的假设如下:

  • 我的类“ServerHandler”通过两个函数(即 go_GET 和 do_POST)扩展了 SimpleHTTPServer.SimpleHTTPRequestHandler 类
  • main() 函数创建一个服务器处理程序对象和绑定到我选择的 IP 地址和端口的服务器套接字,并调用一个函数来无限期地服务/监听。

旁白:通过查看Python DOC https://docs.python.org/2/library/simplehttpserver.html ,我知道 SimpleHTTPServer.SimpleHTTPRequestHandler 有一个名为 do_GET 的方法,我认为该方法会被我的 ServerHandler 类中的 do_GET 覆盖?

问题:与 do_GET 和 do_POST 相关的幕后发生了什么?是否是这样的情况:一旦我们让此服务器侦听指向特定 IP:PORT 的 HTTP“活动”,它就会自动知道传入信号是 …

python simplehttpserver server

7
推荐指数
1
解决办法
1万
查看次数

Python SimpleHTTPServer

有没有办法让Python SimpleHTTPServer支持mod_rewrite?

我正在尝试使用历史API作为位置API来使用Ember.js,为了使其工作,我必须:

1) add some vhosts config in WAMP (not simple), or
2) run python -m simpleHTTPServer (very simple)
Run Code Online (Sandbox Code Playgroud)

因此,当我在浏览器中打开它localhost:3000并点击导航(例如关于和用户)时,它运行良好.URL由Ember.js 分别更改为localhost:3000/aboutlocalhost:3000/users.

但是当我尝试localhost:3000/about直接在新选项卡中打开时,python Web服务器只返回404.

我让我的.htaccess将所有内容重定向到index.html,但我怀疑python简单的web服务器并没有真正读取htaccess文件(我对吗?)

我已经尝试下载PHP 5.4.12并运行内置的Web服务器,url和htaccess mod_rewrite运行良好.但是我仍然不愿意从稳定的5.3升级到(可能仍然不稳定)5.4.12,所以如果有一种方法可以在python简单的web服务器中支持mod_rewrite,那将是首选.

谢谢你的回答.

python simplehttpserver ember.js

6
推荐指数
3
解决办法
4836
查看次数

Python SimpleHTTPServer 404 页面

我最近一直在使用 Python 的 SimpleHTTPServer 在我的网络上托管文件。我想要一个自定义的 404 页面,所以我研究了这个并得到了一些答案,但我仍然想使用我拥有的这个脚本。那么,我必须添加什么才能在此脚本中添加 404 页面?

import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler


HandlerClass = SimpleHTTPRequestHandler
ServerClass  = BaseHTTPServer.HTTPServer
Protocol     = "HTTP/1.0"

if sys.argv[1:]:
    port = int(sys.argv[1])
else:
    port = 80
server_address = ('192.168.1.100', port)

HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)

sa = httpd.socket.getsockname()
print "Being served on", sa[0], "port", sa[1], "..."
httpd.serve_forever()
Run Code Online (Sandbox Code Playgroud)

python simplehttpserver httpserver

6
推荐指数
1
解决办法
5567
查看次数

如何从 Python HTTP 服务器调用函数?

我想为我的一个应用程序提供一个 Web 界面。为了实现这一点,我BaseHTTPRequestHandlerBaseHTTPServer包中进行子类化(到我调用的类中_RequestHandler)并实现我自己的 HTTPHEAD / GET / POST / PUT请求处理程序。

当我收到对“普通文件”的请求时,我只需打开它,从文件系统中读取它并将其提供给浏览器。效果很好。但是,作为一个 Web 界面,我还想将某些请求传达给应用程序后端。为此,我希望我的服务器提供一个接口,通过该接口可以注册某些 URL 的回调函数(由后端),当有注册 URL 的请求传入并传递请求头和正文时,将调用该回调函数到为该 URL 注册的请求处理程序(= 回调函数)。

IE。我希望能够做这样的事情。

def callback_function(request):
   # Do some processing.
   return response

srv = WebServer(port = 8080, webroot = "htdocs/")
srv.register("/cgi-bin/test", callback_function)
srv.run()
Run Code Online (Sandbox Code Playgroud)

现在,当有人使用浏览器请求某个尚未注册的任意 URL 时,Web 服务器将加载指定的文件(相对于“Web 根目录”)并传送它。

我原则上知道如何实现这一点。将应以不同方式处理的 URL 放入字典中。对于每个请求,检查请求的 URL 是否在字典中。如果是,则将请求数据(HTTP header 和 body)放入“请求对象”中,调用为该 URL 注册的回调函数并将该请求对象传递给它。从回调函数获取响应对象,提取其内容(HTTP 标头和正文)并将其提供给客户端。如果 URL 不在“特殊处理”字典中,则只需从文件系统(相对于“Web 根”)加载文件并提供服务。

问题是,为了运行网络服务器,我必须做这样的事情。

server = HTTPServer(("localhost", port), _RequestHandler)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)

现在的问题是我无法将对象(实例)传递_RequestHandler构造函数 …

python simplehttpserver basehttprequesthandler

6
推荐指数
0
解决办法
3310
查看次数

从Python的http.server服务文件-正确响应文件

我只是想从http.server提供PDF文件。这是我的代码:

from http.server import BaseHTTPRequestHandler, HTTPServer

class MyServer(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'application/pdf')
        self.send_header('Content-Disposition', 'attachment; filename="file.pdf"')
        self.end_headers()

        # not sure about this part below
        self.wfile.write(open('/filepath/file.pdf', 'rb'))


myServer = HTTPServer(('localhost', 8080), MyServer)
myServer.serve_forever()
myServer.server_close()
Run Code Online (Sandbox Code Playgroud)

我不确定file.pdf现在该如何回应,却一无所获。我相信标头是正确的,但我无法设法将实际文件发送过来。

servlets basehttpserver simplehttpserver httpserver python-3.x

6
推荐指数
1
解决办法
4579
查看次数

在后台启动简单的 python Web 服务器并继续执行脚本

我正在尝试在 python 中启动一个简单的 HTTP Web 服务器,然后使用 selenium 驱动程序对其进行 ping 操作。我可以启动 Web 服务器,但它在服务器启动后“挂起”,即使我已在新线程中启动它。

from socket import *
from selenium import webdriver
import SimpleHTTPServer
import SocketServer
import thread


def create_server():
    port = 8000
    handler = SimpleHTTPServer.SimpleHTTPRequestHandler
    httpd = SocketServer.TCPServer(("", port), handler)
    print("serving at port:" + str(port))
    httpd.serve_forever()


thread.start_new_thread(create_server())

print("Server has started. Continuing..")

browser = webdriver.Firefox()
browser.get("http://localhost:8000")

assert "<title>" in browser.page_source
thread.exit()
Run Code Online (Sandbox Code Playgroud)

服务器启动,但脚本执行在服务器启动后停止。我启动线程后的代码永远不会执行。

如何让服务器启动然后让代码继续执行?

python simplehttpserver

6
推荐指数
1
解决办法
9522
查看次数

如何使用 TIdMultiPartFormDataStream 处理 TIdHTTPServer

您好,我需要有关如何使用 indy 中的 IdHttpServer 检索参数和数据的帮助。

我的许多应用程序使用 TIdMultiPartFormDataStream 通过 php.ini 发送数据。我想使用 TIdHTTPServer 出于某种原因验证参数并将请求转发到其目的地。

我创建了一个简短的示例供您查看。

uses
  IdContext, IdMultipartFormData;

// Server Side------------------------------------------------

IdHTTPServer1.Defaultport := 88;
IdHTTPServer1.active := True;

procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  // the request will be pass through its destination by POST/GET
  // and send the result back to the client apps.
  AResponseInfo.ContentText := ARequestInfo.Params.Text;
end;

// Client Side------------------------------------------------
// This will work using the standard Post or Get
procedure TForm1.btnPost1Click(Sender: TObject);
var
  sl: TStringList;
  res: String;
begin …
Run Code Online (Sandbox Code Playgroud)

delphi indy simplehttpserver indy10

5
推荐指数
1
解决办法
1万
查看次数

Python:运行SimpleHTTPServer并在脚本中向它发出请求

我想编写Python脚本,它将:

  1. 在某个端口上启动SimpleHTTPServer
  2. 向服务器发出请求并通过POST发送一些数据
  3. 在交互模式下通过shell运行脚本并与之交互

现在代码看起来像这样:

import SimpleHTTPServer
import SocketServer
import urllib
import urllib2

# Variables
URL = 'localhost:8000'
PORT = 8000

# Setup simple sever
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print "serving at port", PORT
httpd.serve_forever()

# Getting HTML from the target page
values = {
    'name': 'Thomas Anderson',
    'location': 'unknown'
}
data = urlilib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
html = response.read()
Run Code Online (Sandbox Code Playgroud)

问题是,一旦我运行我的脚本

python -i foo.py
Run Code Online (Sandbox Code Playgroud)

它打印serving at port 8000然后冻结.我敢打赌这对于这里的Python专家来说是微不足道的,但是我们将不胜感激.

python simplehttpserver python-2.7 server

5
推荐指数
1
解决办法
2万
查看次数