Definir uma “variável pré-pedido global” em Django em Middleware
-
18-09-2019 - |
Pergunta
Eu estou tentando combinar o Google App Engine com autenticação RPX Agora usuário e uma acesso por usuário limitado padrão.
O padrão de acesso de limitação por usuário depende User.get_current_user global da GAE (), como-assim:
from google.appengine.api import users
class CurrentUserProperty(db.UserProperty):
def checkCurrentUser(self, value):
if value != users.get_current_user():
raise db.BadValueError(
'Property %s must be the current user' % self.name)
return value
def __init__(self, verbose_name=None, name=None):
super(CurrentUserProperty, self).__init__(
verbose_name, name, required=True,
validator=self.checkCurrentUser)
No entanto, com GAE Utilities' sessões armazenar identificador do usuário do RPX, não há nenhuma mundial Usuário .
A solução mais óbvia para mim é criar alguma variável usuário global (de alguma forma localizada no atual solicitação / thread) no middleware. No entanto, eu não faria isso a menos que eu estava confiante de que não havia condições de corrida.
Existe alguma maneira de obter a identidade do usuário atual (como armazenado na variável solicitação de sessão) para o CurrentUserProperty quando CurrentUserProperty é construída?
Obrigado pela leitura.
Editar :
google do Reading GAE / appengine / ferramentas / dev_appserver.py: 578, que faz a:
579 env['USER_ID'] = user_id
e google / appengine / api / users.py: 92ff onde se lê:
92 if _user_id is None and 'USER_ID' in os.environ:
93 _user_id = os.environ['USER_ID']
parece sugerir que é possível definir com segurança o ambiente em uma única solicitação do Google App Engine (mas posso estar errado!).
Presumivelmente, então, eu posso definir uma variável de ambiente em middleware. Tem cheiro de problemas, então eu gostaria de saber se alguém tem (semelhante) abordou esta.
Solução
instâncias do Google App Engine (e de fato, CGI em geral) são garantidos para ser single-threaded, assim, definir uma variável de ambiente por solicitação é realmente seguro - na verdade, todas as informações sobre a solicitação atual é passado através do ambiente atual ! Apenas certifique-se que você _un_set a variável de ambiente, se o usuário não está logado, para que você não pode ter um pedido não autenticado obter a autenticação do pedido anterior para acertar a mesma instância.