According to the jsonrpc 1.1 working draft, the request type and response should be application/json not application/javascript. Even if you handle requests that are in other types for compatibility, you probably want your responses to be the correct type.
http://json-rpc.org/wd/JSON-RPC-1-1-WD-20060807.html#RequestHeaders -David On Jul 10, 9:21 am, BenW <benwil...@gmail.com> wrote: > I fixed the above problem with URL reversing by refactoring the > JSONRPCService.__call__ method to grab it from the request object. > > def __call__(self, request, extra=None): > > if request.method == "POST": > return HttpResponse(self.process(request), > mimetype="application/javascript") > > url = request.get_full_path() > return HttpResponse(self.get_smd(url), > mimetype="application/javascript") > > This makes more sense since the service url was already defined in the > urlconf, so there's no point in redefining it just so that it can go > in the SMD. > > I also reworked the get_smd() method in JSONRPCServiceBase to take the > url parameter: > > def get_smd(self, url): > > smd = { > "serviceType": "JSON-RPC", > "serviceURL": url, > "methods": [] > } > > import inspect > for method in self.listmethods(): > sig = inspect.getargspec(self.methods[method]) > smd["methods"].append({ > "name": method, > "parameters": [ {"name": val} for val in sig.args if \ > val not in ("self", "request") ] > }) > > return simplejson.dumps(smd) > > It now defines the smd directly rather than it being defined in > __init__ then populated here. I also added a test to remove 'self' > and 'request' from the reported method parameters since those are > internal and having them reported will cause an RPC client that > imports the remote methods into their namespace (as was discussed in > previous post) to throw errors. > > Purely for my own needs, I added an optional param to > JSONRPCServiceBase.__init__: > > def __init__(self, auth_method=None) > self.auth_method = auth_method > > in JSONRPCServiceBase I fixed up process() to call the auth_method (if > it was defined) to determine if the remote client is allowed to call > that method: > > def process(self, request): > > data = simplejson.loads(request.raw_post_data) > id, method, params = data["id"], data["method"], data > ["params"] > > if self.auth_method: > answer = self.auth_method(request, method, params) > try: > answer, message = answer > except TypeError: > message = "not authorized" > > if not answer: > return self.error(id, 100, message) > > ... > > You can use it like so: > > def adminrpc_auth(request, method, params): > > return request.session.user.is_admin > > adminrpc = JSONRPCService(auth_method=adminrpc_auth) > > @jsonremote(adminrpc) > def save_realm(request, realm_obj): > > return realm_obj > > This way if you have a collection of methods that should only be > available to an admin user, you can test that in one place rather than > in every method. The auth_method can optionally return a custom error > message: > > return request.session.user.is_admin, "Admins Only" > > The default is just "not authorized" -- I'll post my complete mods on > the wiki later. > > Any opinions on my modifications are welcome! > > Thanks, > > Ben --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---