我试图用来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) 我已经按照此链接构建了一个带有 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.pem和cert.pem文件路径都很酷,我可以使用启动服务器python server.py。我被要求输入密码,输入它,然后它冻结了一会儿,然后它似乎运行。
但是,当我输入一些 URL 时,例如https://localhost:4443/index.html我得到500 Unsupported method GET。错误代码解释:HTTPStatus.NOT_IMPLEMENTED - 服务器不支持此操作。我需要做更多的事情来让我的服务器为当前目录提供服务吗?到目前为止,我刚刚使用过python -m http.server 8000(SimpleHTTPServer在 Mac 上时)。我使用的是 Python 3。
这是一个将保持本地状态所以不要担心PEM文件和服务器脚本通过它暴露(如果它有效!)。我也同意证书不受信任并指示 Chrome 无论如何访问该页面。我只需要它来允许我访问相机,而不必将我的应用程序部署到具有合法证书的某个地方。
我出于学习目的创建了以下小型 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)
我的假设如下:
旁白:通过查看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支持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/about和localhost: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 在我的网络上托管文件。我想要一个自定义的 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) 我想为我的一个应用程序提供一个 Web 界面。为了实现这一点,我BaseHTTPRequestHandler从BaseHTTPServer包中进行子类化(到我调用的类中_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构造函数 …
我只是想从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
我正在尝试在 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)
服务器启动,但脚本执行在服务器启动后停止。我启动线程后的代码永远不会执行。
如何让服务器启动然后让代码继续执行?
您好,我需要有关如何使用 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) 我想编写Python脚本,它将:
现在代码看起来像这样:
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专家来说是微不足道的,但是我们将不胜感激.
simplehttpserver ×10
python ×8
httpserver ×2
python-3.x ×2
server ×2
delphi ×1
ember.js ×1
indy ×1
indy10 ×1
python-2.7 ×1
servlets ×1