Skip to content

Commit

Permalink
feat: add leancloud.Engine#current variable
Browse files Browse the repository at this point in the history
  • Loading branch information
aisk committed Oct 13, 2016
1 parent 5b5eefd commit 580a1af
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 2 deletions.
8 changes: 7 additions & 1 deletion leancloud/engine/__init__.py
Expand Up @@ -24,14 +24,15 @@
from .leanengine import before_delete
from .leanengine import after_delete
from .leanengine import user
from .leanengine import current
from .leanengine import register_on_bigquery

__author__ = 'asaka <lan@leancloud.rocks>'


class Engine(object):
def __init__(self, wsgi_app):
self.current_user = user
self.current = current
self.origin_app = wsgi_app
self.cloud_app = context.local_manager.make_middleware(CORSMiddleware(AuthorizationMiddleware(LeanEngineApplication())))

Expand All @@ -54,6 +55,11 @@ def __call__(self, environ, start_response):
return self.cloud_app(environ, start_response)
return self.origin_app(environ, start_response)

@property
def current_user(self):
warnings.warn('Engine.current_user is deprecated, please use Engine.current.user instead', leancloud.LeanCloudWarning)
return user

@staticmethod
def on_bigquery(*args, **kwargs):
warnings.warn('on_bigquery is deprecated, please use on_insight instead', leancloud.LeanCloudWarning)
Expand Down
9 changes: 9 additions & 0 deletions leancloud/engine/context.py
Expand Up @@ -5,5 +5,14 @@

__author__ = 'asaka <lan@leancloud.rocks>'


class Current(object):
__slots__ = ['user', 'session_token', 'meta']
def __init__(self):
self.user = None
self.session_token = None
self.meta = None


local = Local()
local_manager = LocalManager([local])
16 changes: 15 additions & 1 deletion leancloud/engine/leanengine.py
Expand Up @@ -28,6 +28,7 @@
logger = logging.getLogger('leancloud.cloudcode.cloudcode')

user = context.local('user')
current = context.local('current')


class LeanEngineError(Exception):
Expand Down Expand Up @@ -83,13 +84,20 @@ def __call__(self, environ, start_response):

@classmethod
def process_session(cls, environ):
request = environ['leanengine.request']
context.local.current = context.Current()
context.local.current.meta = {
'remote_address': get_remote_address(request),
}

if environ['_app_params']['session_token'] not in (None, ''):
session_token = environ['_app_params']['session_token']
user = leancloud.User.become(session_token)
context.local.current.user = user
context.local.current.session_token = session_token
context.local.user = user
return

request = environ['leanengine.request']
try:
data = json.loads(to_native(request.get_data()))
except ValueError:
Expand All @@ -99,6 +107,8 @@ def process_session(cls, environ):
if 'user' in data and data['user']:
user = leancloud.User()
user._update_data(data['user'])
context.local.current.user = user
context.local.current.session_token = user.get_session_token()
context.local.user = user
return

Expand Down Expand Up @@ -366,3 +376,7 @@ def dispatch_on_bigquery(event, params):

ok = True if params['status'] == 'OK' else False
return func(ok, params)


def get_remote_address(request):
return request.headers.get('x-real-ip') or request.headers.get('x-forwarded-for') or request.remote_addr
8 changes: 8 additions & 0 deletions tests/test_engine.py
Expand Up @@ -456,6 +456,11 @@ def current_user():
TestCurrentUser.query.equal_to('user', user).find()
assert user.get('username') == saved_user.get('username')

# test current
assert engine.current.session_token == session_token
assert user.get('username') is engine.current.user.get('username')
assert 'remote_address' in engine.current.meta

response = requests.get(url + '/__engine/1/functions/current_user', headers={
'x-avoscloud-application-id': TEST_APP_ID,
'x-avoscloud-application-key': TEST_APP_KEY,
Expand All @@ -472,3 +477,6 @@ def before_xxx_save(xxx):
'x-avoscloud-application-key': TEST_APP_KEY,
}, json={'object': {}, 'user': {'username': saved_user.get('username')}})
assert response.status_code == 200

# cleanup
saved_user.destroy()

0 comments on commit 580a1af

Please sign in to comment.