使用 JSON 处理 GET 和 POST 请求的简单 Python 服务器
Simple Python server to process GET and POST requests with JSON
我正在尝试创建一个简单的 Python 服务器来测试我的前端。它应该能够处理 GET 和 POST 请求。在将数据转换为 HTTP request/response 之前,数据应始终采用 JSON 格式。应调用具有相应名称的脚本来处理每个请求。
server.py
#!/usr/bin/env python
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import SocketServer
import json
import urlparse
import subprocess
class S(BaseHTTPRequestHandler):
def _set_headers(self):
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
def do_GET(self):
self._set_headers()
parsed_path = urlparse.urlparse(self.path)
request_id = parsed_path.path
response = subprocess.check_output(["python", request_id])
self.wfile.write(json.dumps(response))
def do_POST(self):
self._set_headers()
parsed_path = urlparse.urlparse(self.path)
request_id = parsed_path.path
response = subprocess.check_output(["python", request_id])
self.wfile.write(json.dumps(response))
def do_HEAD(self):
self._set_headers()
def run(server_class=HTTPServer, handler_class=S, port=8000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print 'Starting httpd...'
httpd.serve_forever()
if __name__ == "__main__":
from sys import argv
if len(argv) == 2:
run(port=int(argv[1]))
else:
run()
用于处理请求的 testscript.py
示例,在本例中只是 return 一个 JSON 对象。
#!/usr/bin/env python
return {'4': 5, '6': 7}
服务器应该例如 return {'4': 5, '6': 7}
格式的响应 http://www.domainname.com:8000/testscript.
我的问题是我不知道如何在它们之间传递变量,我需要帮助才能让它工作。
这里是python中服务器客户端的例子。我正在使用 bottle 库来处理对服务器的请求并创建服务器。
服务器代码
import subprocess
from bottle import run, post, request, response, get, route
@route('/<path>',method = 'POST')
def process(path):
return subprocess.check_output(['python',path+'.py'],shell=True)
run(host='localhost', port=8080, debug=True)
它在 localhost:8080
上启动服务器。您可以将您想要的文件名传递给运行 运行。确保该文件位于同一路径中,以便上述代码正常工作,或者将路径适当地更改为来自不同目录的 运行。路径对应于文件名,并且在给定任何路径时调用 process
函数。如果找不到文件,则会引发异常内部服务器错误。您也可以从子目录调用脚本。
客户代码
import httplib, subprocess
c = httplib.HTTPConnection('localhost', 8080)
c.request('POST', '/return', '{}')
doc = c.getresponse().read()
print doc
它向 localhost:8080/return
调用 POST 请求
return.py
def func():
print {'4': 5, '6': 7}
func()
确保打印输出响应,因为我们正在使用 subprocess.check_output()
,因为它只捕获打印语句。
在subprocess
中使用Popen
打开连续连接而不是check_output
将参数传递给服务器中的函数
检查此 documentation 如何提取 POST 或 GET 值
我用这个:
https://gist.github.com/earonesty/ab07b4c0fea2c226e75b3d538cc0dc55
from apiserve import ApiServer, ApiRoute
class MyServer(ApiServer):
@ApiRoute("/popup")
def addbar(req):
return {"boo":req["bar"]+1}
@ApiRoute("/baz")
def justret(req):
if req:
raise ApiError(501,"no data in for baz")
return {"obj":1}
MyServer("127.0.0.1",8000).serve_forever()
那个特定的包装器允许您轻松地侦听某些框架混淆的端口 0(随机高端口)。它自动处理所有路由的 GET/POST 请求,并将 URI 参数与顶级 JSON 对象参数合并。在大多数情况下,这对我来说已经足够了。
它比大多数框架轻很多。要点中的测试用例更好地展示了它是如何工作的。
喜欢Flask
的人多了一个选择。这个框架非常流行并且有很好的文档记录。
创建文件wsgi.py
(名称很重要,以免以后与环境变量打交道)内容如下:
from flask import Flask, request
app = Flask(__name__)
@app.route('/object/<path_param>')
def get_object(path_param):
return {
'path_param': path_param,
'query_param': request.args.get('q', "'q' not set"),
}
if __name__ == '__main__':
app.run()
运行 终端中的服务器如:flask run --reload --host "127.0.0.1" --port 7777
发送如下查询:curl -i http://localhost:7777/object/something?q=q
另外不要忘记pip3 install flask
来完成这项工作。
我正在尝试创建一个简单的 Python 服务器来测试我的前端。它应该能够处理 GET 和 POST 请求。在将数据转换为 HTTP request/response 之前,数据应始终采用 JSON 格式。应调用具有相应名称的脚本来处理每个请求。
server.py
#!/usr/bin/env python
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import SocketServer
import json
import urlparse
import subprocess
class S(BaseHTTPRequestHandler):
def _set_headers(self):
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
def do_GET(self):
self._set_headers()
parsed_path = urlparse.urlparse(self.path)
request_id = parsed_path.path
response = subprocess.check_output(["python", request_id])
self.wfile.write(json.dumps(response))
def do_POST(self):
self._set_headers()
parsed_path = urlparse.urlparse(self.path)
request_id = parsed_path.path
response = subprocess.check_output(["python", request_id])
self.wfile.write(json.dumps(response))
def do_HEAD(self):
self._set_headers()
def run(server_class=HTTPServer, handler_class=S, port=8000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print 'Starting httpd...'
httpd.serve_forever()
if __name__ == "__main__":
from sys import argv
if len(argv) == 2:
run(port=int(argv[1]))
else:
run()
用于处理请求的 testscript.py
示例,在本例中只是 return 一个 JSON 对象。
#!/usr/bin/env python
return {'4': 5, '6': 7}
服务器应该例如 return {'4': 5, '6': 7}
格式的响应 http://www.domainname.com:8000/testscript.
我的问题是我不知道如何在它们之间传递变量,我需要帮助才能让它工作。
这里是python中服务器客户端的例子。我正在使用 bottle 库来处理对服务器的请求并创建服务器。
服务器代码
import subprocess
from bottle import run, post, request, response, get, route
@route('/<path>',method = 'POST')
def process(path):
return subprocess.check_output(['python',path+'.py'],shell=True)
run(host='localhost', port=8080, debug=True)
它在 localhost:8080
上启动服务器。您可以将您想要的文件名传递给运行 运行。确保该文件位于同一路径中,以便上述代码正常工作,或者将路径适当地更改为来自不同目录的 运行。路径对应于文件名,并且在给定任何路径时调用 process
函数。如果找不到文件,则会引发异常内部服务器错误。您也可以从子目录调用脚本。
客户代码
import httplib, subprocess
c = httplib.HTTPConnection('localhost', 8080)
c.request('POST', '/return', '{}')
doc = c.getresponse().read()
print doc
它向 localhost:8080/return
return.py
def func():
print {'4': 5, '6': 7}
func()
确保打印输出响应,因为我们正在使用 subprocess.check_output()
,因为它只捕获打印语句。
在subprocess
中使用Popen
打开连续连接而不是check_output
将参数传递给服务器中的函数
检查此 documentation 如何提取 POST 或 GET 值
我用这个:
https://gist.github.com/earonesty/ab07b4c0fea2c226e75b3d538cc0dc55
from apiserve import ApiServer, ApiRoute
class MyServer(ApiServer):
@ApiRoute("/popup")
def addbar(req):
return {"boo":req["bar"]+1}
@ApiRoute("/baz")
def justret(req):
if req:
raise ApiError(501,"no data in for baz")
return {"obj":1}
MyServer("127.0.0.1",8000).serve_forever()
那个特定的包装器允许您轻松地侦听某些框架混淆的端口 0(随机高端口)。它自动处理所有路由的 GET/POST 请求,并将 URI 参数与顶级 JSON 对象参数合并。在大多数情况下,这对我来说已经足够了。
它比大多数框架轻很多。要点中的测试用例更好地展示了它是如何工作的。
喜欢Flask
的人多了一个选择。这个框架非常流行并且有很好的文档记录。
创建文件wsgi.py
(名称很重要,以免以后与环境变量打交道)内容如下:
from flask import Flask, request
app = Flask(__name__)
@app.route('/object/<path_param>')
def get_object(path_param):
return {
'path_param': path_param,
'query_param': request.args.get('q', "'q' not set"),
}
if __name__ == '__main__':
app.run()
运行 终端中的服务器如:flask run --reload --host "127.0.0.1" --port 7777
发送如下查询:curl -i http://localhost:7777/object/something?q=q
另外不要忘记pip3 install flask
来完成这项工作。