我有一个客户端,它将JSON数据发送到服务器。此JSON数据包含一个budget
和epsilon
值。服务器接收数据并检查used_budget
是否为None
,或者换句话说,这是否是来自客户端的第一个请求。如果是,则将used_budget
初始化为0.0。
条件是每当客户端发送JSON有效载荷时,epsilon
值被添加到used_budget
,并且used_budget
与budget
进行比较。如果used_budget
小于budget
,则服务器查询数据库并向客户端返回一些结果,否则服务器应停止接受来自客户端的请求。
问题:当我从客户端发送初始请求时,会初始化一个新会话并添加epsilon
。服务器按预期将结果返回给客户端。但是,当我从客户端发送另一个请求时,服务器不会将其视为同一个会话,而是初始化一个新会话,并且used_budget
值再次设置为0.0。条件检查从未发生。
这是服务器端代码:
class GetParams(Resource):
def get(self):
client_request = json.loads(list(dict(request.args).keys())[0]) # Stores the request in JSON format
budget = client_request['budget']
epsilon = client_request['epsilon']
used_budget = session.get('used_budget') # used_budget used a session variable
# If Client sends the first request then initialize used_budget to 0.0
if used_budget == None:
set_used_budget()
# Check if client has budget for sending queries for a session
if (session['used_budget'] < float(budget)):
session['used_budget'] = session.get('used_budget') + float(epsilon)
result = write_file(client_request) # Write request to file and store the returned query result
print("used budget " + str(session['used_budget']))
return result # Return the query result to the client
else:
error_message = "Budget exceeded - Cannot process queries"
return error_message
api.add_resource(GetParams, '/data') # Route for get()
if __name__ == '__main__':
app.run(port='5890', threaded=True)
这是客户端代码:
# Client sends this data in url
data = {
'query': 'SELECT count(*) FROM accounts',
'epsilon': '1.0',
'budget': '2.0',
}
# Localhost url
url = 'http://127.0.0.1:5890/data'
# Client sends Get request
session = requests.Session()
resp= session.get(url, params=json.dumps(data))
# Client prints the data returned by the server in JSON
print(resp.json())
# Client prints the response code
print(resp)
当我从浏览器运行它时,代码运行良好(即,当我使用两个不同的浏览器时,会话会得到维护(,但当我使用IDE从客户端ping服务器时,会启动一个新的会话。有人能告诉我我在这里做错了什么吗?
之所以会发生这种情况,是因为烧瓶会话的工作方式几乎没有什么不同。会话数据与响应一起传递给客户端,并作为会话cookie存储在客户端上。当您从浏览器发送请求时,浏览器会将会话cookie附加到新请求。当您使用IDE客户端进行请求时,情况并非如此。IDE客户端不维护任何会话cookie,因此每次创建新会话时都会维护。