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.

Reply via email to