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
-~----------~----~----~----~------~----~------~--~---

Reply via email to