webserver - 在 python 服务器中,全局变量

  显示原文与译文双语对照的内容
0 0

背景:对于服务器,我是一个完全的初学者,但是我知道我在 python 编程方面的方式。

我正在尝试使用基本 python 2.7模块( SimpleHTTPServer,CGIHTTPServer等) 设置一个简单的服务器。 服务器需要加载一个全局,只使用一个文件中的几个GB数据来读取一个全局变量,然后,当每个用户访问该页面时,服务器将使用大数据来生成一些输出,然后给用户提供。

例如假设我有一个 4 GB的文件 names.txt,它包含了所有可能的英语名词:


Jack
John
Allison
Richard
...

假设我的目标是阅读整个名单中的名字,然后从这个大的名词列表中随机选择 1 NAME 。 我现在可以使用 python CGIHTTPServer MODULE的本机来完成这个任务。 首先,通过从终端执行 CGIHTTPServer MODULE,直接运行:


python -m CGIHTTPServer

然后有人访问 www.example-server.net:8000/foo.py 然后随机给他们一个名字。 我在 foo.py 中有以下代码:


#!/usr/bin/env python

import random

name_list = list()
FILE = open('names.txt','r')
for line in FILE:
 name = line[:-1]
 name_list.append(name)

FILE.close()
name_to_return = random.choice(name_list)

print"Content-type: text/html"
print
print"<title>Here is your name</title>"
print"<p>" + name_to_return +"</p>"

这是我想要的;但是,它非常低效,因为每个访问强制服务器读取一个 4 GB的文件。

我如何使这个过程成为一个有效的过程,在这个过程中,当服务器启动时,变量 name_list 将立即创建为全局,并且每个访问只从该变量?

时间: 原作者:

0 0

仅供将来参考,如果任何人遇到同样的问题: 我结束了处理程序的子类 CGIHTTPServer 请求并实现了一个新的do_POST() 函数。 如果你有一个没有全局变量的工作CGI脚本,那么类似这样的事情就可以让你开始:


import CGIHTTPServer
import random
import sys
import cgi

class MyRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler):
 global super_important_list
 super_important_list = range(10)
 random.shuffle(super_important_list)

 def do_POST(s): 
"""Respond to a POST request."""
 form = cgi.FieldStorage(fp=s.rfile,headers=s.headers,environ={'REQUEST_METHOD':'POST','CONTENT_TYPE':s.headers['Content-Type'],})
 s.wfile.write("<html><head><title>Title goes here.</title></head>")
 s.wfile.write("<body><p>This is a test.</p>")
 s.wfile.write("<p>You accessed path: %s</p>" % s.path)
 s.wfile.write("<p>Also, super_important_list is:</p>")
 s.wfile.write(str(super_important_list))
 s.wfile.write("<p>Furthermore, you POSTed the following info:")
 for item in form.keys():
 s.wfile.write("<p>Item:" + item)
 s.wfile.write("<p>Value:" + form[item].value)
 s.wfile.write("</body></html>")

if __name__ == '__main__':
 server_address = ('', 8000)
 httpd = CGIHTTPServer.BaseHTTPServer.HTTPServer(server_address, MyRequestHandler)
 try:
 httpd.serve_forever()
 except KeyboardInterrupt:
 sys.exit()

每当某人填写表单并执行POST时,变量 form 将是一个像 key-value 对的字典,它可能不同于你站点的每个用户,但全局变量 super_important_list 对于每个用户都是相同的。

感谢所有回答我问题的人,尤其是 Mike Steder,他向我指出了正确的方向 !

原作者:
0 0

CGI通过生成处理每个请求的进程来工作。 你需要运行驻留在内存中处理HTTP请求的服务器进程。

你可以使用修改的BaseHTTPServer,只需定义你自己的。 在代码中加载数据集一次,然后处理程序的do_GET方法就会随机选取一个。

就我个人而言,我将调查类似 CherryPy作为一个简单的解决方案,是国际海事组织比BaseHTTPServer好很多。 有吨的选择除了cherrypy像 Bottle Flask,Twisted,Django 等等, 当然如果你需要这个服务器在其他网络服务器需要考虑建立一个反向代理或运行 CherryPy WSGI应用。

原作者:
0 0

你可能希望将名称的值存储在数据库中,并根据它们以。 然后你可以随机为一个和z 之间的字母做一个随机的字母,然后再随机地从随机的开始字母中得到一个随机的名字。

原作者:
0 0

生成前缀树( a 。k 。 一旦收到查询,就生成一个随机遍历。

那应该是非常有效的。

原作者:
...