1

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

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

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

我该如何解决这个非常大的问题?多线程可能有帮助?

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

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

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

4

1 回答 1

0

一种方法是使用事件驱动的系统,如twisted,将您的getIdPResponse方法分成两部分:

  1. 发送请求
  2. 处理响应

那么你的单线程不会阻塞,同时可以为其他客户端分派事件。

如果你想简化你的应用程序逻辑,你可以在上面包裹一层阻塞调用,但这不是我推荐的。

于 2013-01-24T16:33:43.137 回答