python单线程服务器如何处理多客户端

python单线程服务器如何处理多客户端,python,client-server,django-views,Python,Client Server,Django Views,我有一个python服务器,它提供页面。使用IdP(身份提供者)登录这些页面。因此,当用户试图打开我的服务器页面时,他会被重定向到IdP页面。与此同时,我的服务器开始侦听IdP响应。当用户登录in IdP页面时,IdP将数据发送到我的服务器,服务器将处理这些数据并向用户显示我的页面 问题是,如果多个客户端尝试登录,当服务器收到来自一个IdP的第一个响应时,所有用户都将显示我的页面,并使用第一个用户的凭据登录 我的意思是,当服务器开始监听时,它会等待所有人。只有第一个用户登录时,等待登录的所有用户

我有一个python服务器,它提供页面。使用IdP(身份提供者)登录这些页面。因此,当用户试图打开我的服务器页面时,他会被重定向到IdP页面。与此同时,我的服务器开始侦听IdP响应。当用户登录in IdP页面时,IdP将数据发送到我的服务器,服务器将处理这些数据并向用户显示我的页面

问题是,如果多个客户端尝试登录,当服务器收到来自一个IdP的第一个响应时,所有用户都将显示我的页面,并使用第一个用户的凭据登录

我的意思是,当服务器开始监听时,它会等待所有人。只有第一个用户登录时,等待登录的所有用户都将使用相同的凭据登录

我怎样才能解决这个大问题?多线程可能有帮助吗

下面是一些重要的代码。假设我想将idp应答的一些数据加载到我页面登录表单的字段“name”中

class Login(django.forms.SelfHandlingForm):
    def __init__(self, *args, **kwargs):
        super(Login, self).__init__(*args, **kwargs)
        response = self.getIdPResponse()
        self.fields['name'].widget=forms.TextInput(attrs={'value': response['name']})


    def getIdPResponse(self):
        global response
        response = None
        timeout = 300
        class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
            def do_POST(self):
                global response
                self.send_response(200)
                self.send_header("Content-type", "text/html")
                self.end_headers()
                varLen = int(self.headers["Content-Length"])
                #response = urlparse.parse_qs(self.rfile.read(varLen))
                response = self.rfile.read(varLen)

                self.wfile.write("Log-in ok! now you can close this page.")
        httpd = BaseHTTPServer.HTTPServer(('0.0.0.0', 8080), RequestHandler)
        try:
            httpd.socket.settimeout(1)
        except BaseException as e:
            print e
        count = 0
        '''at this point, the IdP page is already showed to the user '''
        while response is None and count < timeout:
           try:
               httpd.handle_request()
               count = count + 1
               print 'waiting for the Idp answer...'
           except Exception as e:
               print e
        return response
类登录(django.forms.SelfHandlingForm):
定义初始化(self,*args,**kwargs):
超级(登录,自我)。\uuuuu初始化(*args,**kwargs)
response=self.getIdPResponse()
self.fields['name'].widget=forms.TextInput(attrs={'value':响应['name']})
def getIdPResponse(自我):
全球反应
响应=无
超时=300
类RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_POST(自我):
全球反应
自我发送_响应(200)
self.send_标题(“内容类型”、“文本/html”)
self.end_头()
varLen=int(self.headers[“内容长度”])
#response=urlparse.parseqs(self.rfile.read(varLen))
响应=self.rfile.read(varLen)
write(“登录确定!现在您可以关闭此页面了。”)
httpd=BaseHTTPServer.HTTPServer(('0.0.0',8080),RequestHandler)
尝试:
httpd.socket.settimeout(1)
除BaseException作为e外:
打印e
计数=0
''此时,IdP页面已显示给用户''
响应为无且计数<超时时:
尝试:
httpd.handle_请求()
计数=计数+1
打印“等待Idp回答…”
例外情况除外,如e:
打印e
返回响应

这样,当用户成功登录时,所有等待登录的用户都将在“name”字段中显示第一次登录的用户的名称。显然我不想这样。

一种方法是使用事件驱动系统,例如,将
getidpreponse
方法分为两部分:

  • 发送请求
  • 处理响应
  • 这样,您的单个线程就不会阻塞,同时可以为其他客户端分派事件


    如果您想简化应用程序逻辑,可以在此基础上封装一层阻塞调用,但这不是我的建议。

    请包含一些代码,特别是与此相关的部分,如何验证客户端,以及如何解析其凭据?好的,我用代码编辑了我的问题。我不确定当他回答你时,我知道什么是我不知道的,但是哪个软件提供了服务器功能?它是一个Python独立软件,还是有apache/nginx/。。。设置?我有apache…但它不涉及这个严格的代码截取。假设我只想在我的页面(由python构建)上显示一些由IdP应答的数据。@ClassStacker-我只想查看发布的代码,它使用的是
    BaseHTTPServer
    directlymm,我想知道threas实际上是阻塞的。。因为我需要在显示页面之前得到答案,否则我无法将数据放入charField。如果线程没有阻塞,页面将在idp回答之前显示。不,这不是正确的思考方式。在事件驱动模型下,您可以选择何时向给定的客户机写入数据,因此您可以选择在数据准备就绪之前不向该客户机写入任何内容。这只意味着你可以在等待的时候处理其他客户的请求。