Here's a good example of how Python decorators work behind the scenes: http://en.wikipedia.org/wiki/Python_syntax_and_semantics#Decorators. Essentially, the @csrf_exempt decorator is a function, meaning that when you use it to decorate a class, you reassign the name of that class to a function which returns a class instance. This creates problems when you use super() or anything else that expects a class (and gets a function instead).
This is the correct way to decorate a class-based view: https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating-the-class. Except I don't think that DjangoSoapApp is a view (?) so you'll need to find where the actual view is and decorate that instead. _Nik On 7/5/2012 2:00 PM, Nikolas Stevenson-Molnar wrote: > Try removing the @csrf_exempt decorator (for testing, you can disable > CSRF for the site in your settings file by commenting out the > CsrfViewMiddleware). > > _Nik > > On 7/5/2012 1:03 PM, Jeff Silverman wrote: >> # soaplib v2.0.0beta2 (from memory) >> # Django v1.3 (stable) >> # NOTE: CSRF middleware has been turned off! >> # For urls.py, see: https://gist.github.com/935812 >> >> import soaplib >> from soaplib.core.service import rpc, DefinitionBase >> from soaplib.core.model.primitive import String, Integer >> from soaplib.core.model.clazz import Array >> >> from django.views.decorators.csrf import csrf_exempt >> >> >> class HelloWorldService(DefinitionBase): >> @rpc(String,Integer,_returns=Array(String)) >> def say_hello(self, name, times): >> results = [] >> for i in range(0, times): >> results.append('Hellow, %s' %name) >> return results >> >> >> from soaplib.core.server.wsgi import Application >> from django.http import HttpResponse >> >> import StringIO >> class DumbStringIO(StringIO.StringIO): >> def read(self, n): >> return self.getvalue() >> >> @csrf_exempt >> class DjangoSoapApp(Application): >> def __call__(self, request): >> django_response = HttpResponse() >> >> def start_response(status, headers): >> status, reason = status.split(' ', 1) >> django_response.status_code = int(status) >> for header, value in headers: >> django_response[header] = value >> >> environ = request.META.copy() >> environ['CONTENT_LENGTH'] = len(request.raw_post_data) >> environ['wsgi.input'] = DumbStringIO(request.raw_post_data) >> environ['wsgi.multithread'] = False >> >> # print help(DjangoSoapApp) >> >> response = super(DjangoSoapApp, self).__call__(environ, >> start_response) >> django_response.content = '\n'.join(response) >> return django_response >> >> >> print type(DjangoSoapApp) >> soap_application = soaplib.core.Application([HelloWorldService], >> 'tns') >> #import pdb; pdb.set_trace() >> hello_world_service = DjangoSoapApp(soap_application) >> >> >> On Jul 5, 2:54 pm, Nikolas Stevenson-Molnar <nik.mol...@consbio.org> >> wrote: >>> Would you please provide the source for mysite.BDSCheckUser.views? >>> >>> _Nik >>> >>> On 7/5/2012 11:37 AM, Jeff Silverman wrote: >>> >>> >>> >>>> Resulting output, >>>> Help on function DjangoSoapApp in module mysite.BDSCheckUser.views: >>>> DjangoSoapApp(*args, **kwargs) >>>> On Jul 5, 2:31 pm, Nikolas Stevenson-Molnar <nik.mol...@consbio.org> >>>> wrote: >>>>> Hmmm, I can't think of what may be happening. One more debug thing to >>>>> try, print the help of DjangoSoapApp just before the problem line: >>>>> print help(DjangoSoapApp) >>>>> That way, if the DjangoSoapApp symbol is getting reassigned to a >>>>> function somewhere along the way, that might clue you in. >>>>> _Nik >>>>> On 7/5/2012 11:17 AM, Jeff Silverman wrote: >>>>>> I've been flip flopping my views.py between that snippet, and >>>>>> https://gist.github.com/935809, which is a bit different, but easier >>>>>> to follow. >>>>>> On Jul 5, 2:03 pm, Nikolas Stevenson-Molnar <nik.mol...@consbio.org> >>>>>> wrote: >>>>>>> Is your code still the same as you posted >>>>>>> earlier:http://djangosnippets.org/snippets/2638/?Andtheerror is >>>>>>> occuring on >>>>>>> ln 28? >>>>>>> _Nik >>>>>>> On 7/5/2012 11:01 AM, Jeff Silverman wrote: >>>>>>>> The print output is: >>>>>>>> <type 'function'> >>>>>>>> On Jul 5, 1:38 pm, Nikolas Stevenson-Molnar <nik.mol...@consbio.org> >>>>>>>> wrote: >>>>>>>>> Hmmm, not sure about this one. Try printing out the type of >>>>>>>>> DjangoSoapApp before that line is called: >>>>>>>>> print type(DjangoSoapApp) >>>>>>>>> _Nik >>>>>>>>> On 7/5/2012 5:20 AM, Jeff Silverman wrote: >>>>>>>>>> Ok, I'm further along, I think. Now I'm getting the following >>>>>>>>>> response = super(DjangoSoapApp, self).__call__(environ, >>>>>>>>>> start_response) >>>>>>>>>> (Pdb) p start_response >>>>>>>>>> <function start_response at 0x25d1ed8> >>>>>>>>>> (Pdb) super(DjangoSoapApp, self).__call__(environ, start_response) >>>>>>>>>> *** TypeError: super() argument 1 must be type, not function >>>>>>>>>> On Jul 3, 3:47 pm, Nikolas Stevenson-Molnar <nik.mol...@consbio.org> >>>>>>>>>> wrote: >>>>>>>>>>> Looking at the soaplib source, it looks like it required requests >>>>>>>>>>> to be >>>>>>>>>>> made using POST. If you're loading this in a web browser to test, >>>>>>>>>>> then >>>>>>>>>>> you're making a GET request. Try making a POST request (using >>>>>>>>>>> something >>>>>>>>>>> like Fiddler) instead. >>>>>>>>>>> https://github.com/soaplib/soaplib/blob/master/src/soaplib/core/serve... >>>>>>>>>>> (line 84/85) >>>>>>>>>>> _Nik >>>>>>>>>>> On 7/3/2012 12:20 PM, Jeff Silverman wrote: >>>>>>>>>>>> http://djangosnippets.org/snippets/2638/ >>>>>>>>>>>> On Jul 3, 2:56 pm, Nikolas Stevenson-Molnar >>>>>>>>>>>> <nik.mol...@consbio.org> >>>>>>>>>>>> wrote: >>>>>>>>>>>>> Would you please provide a reference to the snippet or to your >>>>>>>>>>>>> complete >>>>>>>>>>>>> code? It's hard to understand what's going on from this small bit. >>>>>>>>>>>>> _Nik >>>>>>>>>>>>> On 7/3/2012 11:33 AM, Jeff Silverman wrote: >>>>>>>>>>>>>> Thanks for the reply. Removing that did not change the result. >>>>>>>>>>>>>> Just >>>>>>>>>>>>>> an FYI, but I copied the code verbatim from the snippet. that's >>>>>>>>>>>>>> why I >>>>>>>>>>>>>> cannot understand what's going on. I continually get >>>>>>>>>>>>>> the405method >>>>>>>>>>>>>> not allowed error regardless. >>>>>>>>>>>>>> On Jul 3, 1:28 pm, Nikolas Stevenson-Molnar >>>>>>>>>>>>>> <nik.mol...@consbio.org> >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>> I'm not sure that this is the problem, but typically >>>>>>>>>>>>>>> constructors should >>>>>>>>>>>>>>> not have a return value. Try removing the "return" from your >>>>>>>>>>>>>>> DjangoSoapApp constructor. >>>>>>>>>>>>>>> _Nik >>>>>>>>>>>>>>> On 7/3/2012 6:32 AM, Jeff Silverman wrote: >>>>>>>>>>>>>>>> Below is the code from the views.py >>>>>>>>>>>>>>>> The405is retunred from the 'return super(DjangoSoapApp, >>>>>>>>>>>>>>>> self).__init__(Application(services, tns))' statement. I am >>>>>>>>>>>>>>>> using >>>>>>>>>>>>>>>> python 2.6, soaplib20 and django 1.3. I am struggling to >>>>>>>>>>>>>>>> understand >>>>>>>>>>>>>>>> what exactly is wrong here. >>>>>>>>>>>>>>>> class HelloWorldService(DefinitionBase): >>>>>>>>>>>>>>>> @soap(String,Integer,_returns=Array(String)) >>>>>>>>>>>>>>>> def say_smello(self,name,times): >>>>>>>>>>>>>>>> results = [] >>>>>>>>>>>>>>>> for i in range(0,times): >>>>>>>>>>>>>>>> results.append('Hello, %s'%name) >>>>>>>>>>>>>>>> return results >>>>>>>>>>>>>>>> class DjangoSoapApp(WSGIApplication): >>>>>>>>>>>>>>>> csrf_exempt = True >>>>>>>>>>>>>>>> def __init__(self, services, tns): >>>>>>>>>>>>>>>> """Create Django view for given SOAP soaplib services >>>>>>>>>>>>>>>> and >>>>>>>>>>>>>>>> tns""" >>>>>>>>>>>>>>>> return super(DjangoSoapApp, >>>>>>>>>>>>>>>> self).__init__(Application(services, tns)) >>>>>>>>>>>>>>>> def __call__(self, request): >>>>>>>>>>>>>>>> django_response = HttpResponse() >>>>>>>>>>>>>>>> def start_response(status, headers): >>>>>>>>>>>>>>>> django_response.status_code = int(status.split(' >>>>>>>>>>>>>>>> ', 1)[0]) >>>>>>>>>>>>>>>> for header, value in headers: >>>>>>>>>>>>>>>> django_response[header] = value >>>>>>>>>>>>>>>> response = super(DjangoSoapApp, >>>>>>>>>>>>>>>> self).__call__(request.META, >>>>>>>>>>>>>>>> start_response) >>>>>>>>>>>>>>>> django_response.content = '\n'.join(response) >>>>>>>>>>>>>>>> return django_response >>>>>>>>>>>>>>>> # the view to use in urls.py >>>>>>>>>>>>>>>> hello_world_service = DjangoSoapApp([HelloWorldService], >>>>>>>>>>>>>>>> '__name__')- Hide quoted text - >>>>>>>>>>>>>>> - Show quoted text -- Hide quoted text - >>>>>>>>>>>>> - Show quoted text -- Hide quoted text - >>>>>>>>>>> - Show quoted text -- Hide quoted text - >>>>>>>>> - Show quoted text -- Hide quoted text - >>>>>>> - Show quoted text -- Hide quoted text - >>>>> - Show quoted text -- Hide quoted text - >>> - Show quoted text - > -- 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.