Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/ryepdx/flask-jsonrpc into…
Browse files Browse the repository at this point in the history
… ryepdx-master
  • Loading branch information
nycholas committed Jul 7, 2014
2 parents feaafb7 + 6fbcf8e commit f7e7481
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 10 deletions.
17 changes: 11 additions & 6 deletions flask_jsonrpc/__init__.py
Expand Up @@ -156,26 +156,31 @@ def _inject_args(sig, types):
sig = '{0}({1})'.format(sig, ', '.join(types))
return sig

def _site_api(site):
def _site_api(site, decorators=[]):
def wrapper(method=''):
response_dict, status_code = site.dispatch(request, method)
if current_app.config['DEBUG']:
logging.debug('request: %s', extract_raw_data_request(request))
logging.debug('response: %s, %s', status_code, response_dict)
return jsonify_status_code(status_code, response_dict), status_code

response_func = jsonify_status_code
for decorator in decorators:
response_func = decorator(response_func)

return response_func(status_code, response_dict), status_code
return wrapper


class JSONRPC(object):

def __init__(self, app=None, service_url='/api', auth_backend=authenticate, site=default_site,
enable_web_browsable_api=False):
enable_web_browsable_api=False, decorators=[]):
self.service_url = service_url
self.browse_url = self._make_browse_url(service_url)
self.enable_web_browsable_api = enable_web_browsable_api
self.auth_backend = auth_backend
self.site = site
self.site_api = _site_api(site)
self.site_api = _site_api(site, decorators=decorators)
if app is not None:
self.app = app
self.init_app(self.app)
Expand Down Expand Up @@ -207,11 +212,11 @@ def _enable_web_browsable_api(self, app, url_prefix=None):
jsonrpc_site_name=self._unique_name(), jsonrpc_site=self.site)

def init_app(self, app):
app.add_url_rule(self.service_url, self._unique_name(), self.site_api, methods=['POST'])
app.add_url_rule(self.service_url, self._unique_name(), self.site_api, methods=['POST', 'OPTIONS'])
app.add_url_rule(self.service_url + '/<method>', self._unique_name('/<method>'), self.site_api, methods=['GET'])

def register_blueprint(self, blueprint):
blueprint.add_url_rule(self.service_url, '', self.site_api, methods=['POST'])
blueprint.add_url_rule(self.service_url, '', self.site_api, methods=['POST', 'OPTIONS'])
blueprint.add_url_rule(self.service_url + '/<method>', '', self.site_api, methods=['GET'])

def method(self, name, authenticated=False, safe=False, validate=False, **options):
Expand Down
12 changes: 8 additions & 4 deletions flask_jsonrpc/site.py
Expand Up @@ -34,6 +34,7 @@
from werkzeug.exceptions import HTTPException

from flask import json, jsonify, current_app, got_request_exception
from flask.wrappers import Response

from flask_jsonrpc.types import Object, Array, Any
from flask_jsonrpc.helpers import extract_raw_data_request, log_exception
Expand Down Expand Up @@ -211,18 +212,21 @@ def response_dict(self, request, D, is_batch=False, version_hint='1.0'):
return None, 204

encoder = current_app.json_encoder()
response['result'] = R
status = 200

# type of `R` should be one of these or...
if not sum([isinstance(R, e) for e in \
if isinstance(R, Response):
status = R.status_code
response['result'] = R.status

elif not sum([isinstance(R, e) for e in \
string_types + integer_types + (dict, list, set, NoneType, bool)]):
try:
rs = encoder.default(R) # ...or something this thing supports
except TypeError as exc:
raise TypeError("Return type not supported, for {0!r}".format(R))

response['result'] = R

status = 200

except Error as e:
# exception missed by others
Expand Down

0 comments on commit f7e7481

Please sign in to comment.