我通过创建一个继承自HTTPServer和ThreadingMixIn的类来设置一个线程(使用Python线程)HTTP服务器:
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass
Run Code Online (Sandbox Code Playgroud)
我有一个继承自BaseHTTPRequestHandler的处理程序类,我用这样的东西启动服务器:
class MyHandler(BaseHTTPRequestHandler):
...
server = ThreadedHTTPServer(('localhost', 8080), MyHandler)
# Prevent issues with socket reuse
server.allow_reuse_address = True
# Start the server
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
这一切都非常简单.我遇到的问题是,ThreadingMixIn,ForkingMixIn或其他方式,请求最终阻止请求处理程序返回.通过实现此示例代码可以很容易地看到这一点:
class MyHandler(BaseHTTPRequestHandler):
def respond(self, status_code):
self.send_response(status_code)
self.end_headers()
def do_GET(self):
print "Entered GET request handler"
time.sleep(10)
print "Sending response!"
respond(200)
Run Code Online (Sandbox Code Playgroud)
如果服务器同时处理这些,那么我们将能够发送两个请求并看到服务器在发送任何响应之前输入两个GET请求处理程序.相反,服务器将为第一个请求输入GET请求处理程序,等待它返回,然后输入第二个请求(因此第二个请求需要大约20秒才能返回而不是10).
有没有一种直接的方法让我实现一个系统,服务器不等待处理程序返回?具体来说,我正在尝试编写一个系统,在返回任何请求之前等待接收多个请求(一种长轮询)并遇到第一个请求等待阻止任何未来请求连接到服务器的问题.
我想有一个简单的网页,用户可以上传文件.什么是最简单的方法.
我知道如何开始,SimpleHTTPServer但我不知道如何使用上传文件SimpleHTTPServer.我甚至不知道是否有可能.
我找到了一些使用cgi上传文件的代码,但如果我在命令行中执行此代码,它只会在屏幕上打印HTML代码.
我最近尝试实施SimpleHTTPRequestHandler根据接受AJAX请求此.
虽然一切似乎都可以接收来自客户端的请求,但是当我尝试self.wfile.write("foo")时,我无法将任何内容发送回客户端,我在客户端得到了回复; 但是,XmlObject的响应文本是完全空白的!?!
如果有人能够对此有所了解,那就太棒了!
编辑:我认为我的AJAX调用结构正确,因为我得到了Python的响应(我已经检查过调试模式); 但是,当我得到一个对象时,我没有得到任何回复responseText的消息.
我有一个自定义HTTP请求处理程序,可以简化为这样的:
# Python 3:
from http import server
class MyHandler(server.BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
# Here's where all the complicated logic is done to generate HTML.
# For clarity here, replace with a simple stand-in:
html = "<html><p>hello world</p></html>"
self.wfile.write(html.encode())
Run Code Online (Sandbox Code Playgroud)
我想对这个处理程序进行单元测试(即确保我do_GET没有例外地执行),而不实际启动Web服务器.是否有任何轻量级方法来模拟,SimpleHTTPServer以便我可以测试此代码?
有没有办法启动http服务器直接使用ghc -e或runhaskell从shell提供静态文件?
我想用Python提供静态文件.Python 3是否http.server适合在生产中使用?如果没有,为什么不呢?我还有什么选择?
我正在使用 SimpleHTTPServer 的 do_POST 方法来接收文件。如果我使用 curl 上传 png 文件,脚本工作正常,但是每当我使用 python 请求库上传文件时,文件上传但会损坏。这是 SimpleHTTPServer 代码
#!/usr/bin/env python
# Simple HTTP Server With Upload.
import os
import posixpath
import BaseHTTPServer
import urllib
import cgi
import shutil
import mimetypes
import re
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
# Simple HTTP request handler with POST commands.
def do_POST(self):
"""Serve a POST request."""
r, info = self.deal_post_data()
print r, info, "by: ", self.client_address
f = StringIO()
if r:
f.write("<strong>Success:</strong>") …Run Code Online (Sandbox Code Playgroud) 我对web dev和http服务器等世界相当新,但我有一个基本的shell脚本,如下所示:
PORT=2600
if [[ $1 =~ ^[0-9]+$ ]]
then PORT=$1
fi
echo "Starting local http server (ctrl-c to exit)"
echo ""
echo " Demo: http://127.0.0.1:$PORT/demo"
echo ""
python -m SimpleHTTPServer $PORT
Run Code Online (Sandbox Code Playgroud)
它似乎可以正常工作,但是当我在我的演示中更新css文件时,很少和不一致会更新页面上显示的css.对任何html的更改都很好,并且它偶尔会显示css的变化,但我觉得我在这里做了一些根本错误的事情.思考?
如何保存控制台的输出
"192.168.1.1 - - [18/Aug/2014 12:05:59]代码404,消息文件未找到"
到文件?
这是代码:
import SimpleHTTPServer
import SocketServer
PORT = 1548
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print "serving at port", PORT
httpd.serve_forever()
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 无论如何访问该页面。我只需要它来允许我访问相机,而不必将我的应用程序部署到具有合法证书的某个地方。
simplehttpserver ×10
python ×8
cgi ×2
file-upload ×2
ajax ×1
css ×1
haskell ×1
haskell-warp ×1
http ×1
httpserver ×1
javascript ×1
jquery ×1
logging ×1
python-3.x ×1
save ×1
unit-testing ×1
webserver ×1