所以我使用的是静态类成员,因此我可以在类方法和同一个类的静态方法之间共享数据(只有1个类的实例化).我理解这很好,但我只是想知道静态成员什么时候被初始化?它是进口的吗?在第一次使用课程?因为我将从多个模块调用此类的静态成员(因此多于1个import语句).访问静态方法的所有模块是否共享相同的静态数据成员?如果我的主客户端删除了我的类的实例,然后重新创建它(没有完全终止或重新导入东西),我的数据成员是否会被保留?
我是Python的新手(使用v3.3)和网络编程,我整晚都在努力解决问题.我正在向我的服务器发出POST调用并向其发送一些数据,如下所示:
DATA = {"listName":"Test list","listDesc":"A test list with test stuff in it.","refreshMode":"Replace","DBKey":"1","UserDisplaySeq":"1"}
DATA = json.dumps(DATA)
METHOD = "POST"
DATA = DATA.encode("utf-8")
params = "account_id=acct 2"
try:
URL = "http://localhost:8080/lists?" + quote_plus(params)
request = urllib.request.Request(url=URL,data=DATA,method=METHOD)
response = urllib.request.urlopen(request)
...
Run Code Online (Sandbox Code Playgroud)
我还有一个请求处理程序编码如下(这里有很多打印语句用于调试目的):
class MyHandler(BaseHTTPRequestHandler):
...
def do_POST(self):
length = int(self.headers['Content-Length'])
print("HEADERS: ", self.headers)
print (str(length))
print(self.rfile)
post_data = urllib.parse.parse_qs(self.rfile.read(length).decode('utf-8'))
print(post_data)
Run Code Online (Sandbox Code Playgroud)
这会将以下结果打印到控制台:
Starting thread
started httpserver...
HEADERS: Accept-Encoding: identity
User-Agent: Python-urllib/3.3
Content-Length: 138
Content-Type: application/x-www-form-urlencoded
Host: localhost:8080
Connection: close
138
<_io.BufferedReader name=404>
{}
Run Code Online (Sandbox Code Playgroud)
我的问题: …
我试图通过GET向表单数据发送带有表单数据的简单html页面,然后通过POST从表单接收变量.HTML文件看起来像:
<HTML>
<title> My Title</title>
<body>
<form method="post" action="http.py">
<input name="Name" type="text"/>
<input name="Submit" type="submit" value="Submit" />
</form>
</body>
</HTML>
Run Code Online (Sandbox Code Playgroud)
这是python脚本:
import os
import cgi
import sys
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
class customHTTPServer(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
fh=open('index.html','r')
self.wfile.write(fh.read())
return
def do_POST(self):
form = cgi.FieldStorage()
self.send_response(200)
self.end_headers()
self.wfile.write(form['Name'].value)
def main():
try:
server = HTTPServer(('',9111),customHTTPServer)
print 'server started at port 8080'
server.serve_forever()
except KeyboardInterrupt:
server.socket.close()
if __name__=='__main__':
sys.exit(main())
Run Code Online (Sandbox Code Playgroud)
但FieldStorage一直都是空的.我已经尝试检查self.rfile中的内容,并发现如果我尝试执行self.rfile.readlines(),浏览器卡住并看起来像脚本正在等待数据流的结束.我应该从哪里采取我用POST提交的Name变量?
我已经看到了这个问题,但我希望能够从处理程序访问外部POST的数据.
有没有办法做到这一点?
以下是代码:
import BaseHTTPServer
HOST_NAME = ''
PORT_NUMBER=8088
postVars = ''
class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_POST(s):
s.send_response(200)
s.end_headers()
varLen = int(s.headers['Content-Length'])
postVars = s.rfile.read(varLen)
print postVars
server_class = BaseHTTPServer.HTTPServer
httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)
try:
httpd.handle_request()
except KeyboardInterrupt:
pass
print postVars
httpd.server_close()
Run Code Online (Sandbox Code Playgroud)
postVars在Handler期间被评估,但不在MyHandler之后