title: Change xmlns:wsse namespace in SOAP request with Python Zeep
body: <p>When using Zeep (Python3.7) to send data to a SOAP API, the <code>wsse:Security</code> header generated is <code>http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd</code></p>
  
  <p>The result of this is the error:</p>
  
  <pre><code>zeep.exceptions.Fault: SOAP Security Header UsernameToken is required for operation 'ProcessMessage'
  </code></pre>
  
  <p>If I then take the raw request XML and send that to the API (via SOAPUI), I get the same issue. However, if I change this value to the value that was in the example I've been sent alongside the WSDL of <code>http://schemas.xmlsoap.org/ws/2002/07/secext</code>, the request completes successfully and I get a success response from the API.</p>
  
  <p>I have tried many things, including explicitely defining the namespace in Security element header:</p>
  
  <pre><code>header = xsd.Element(
      '{http://schemas.xmlsoap.org/ws/2002/07/secext}Security',
      xsd.ComplexType([
          xsd.Element(
              'UsernameToken',
              xsd.ComplexType([
                  xsd.Element('Username', xsd.String()),
                  xsd.Element('Password', xsd.String()),
              ])
          )
      ])
  )
  </code></pre>
  
  <p>However, this doesn't seem to fix the issue.</p>
  
  <p>I've also tried:</p>
  
  <pre class="lang-py prettyprint-override"><code>client.set_default_soapheaders([header_value])
  </code></pre>
  
  <p>Again, no joy.</p>
  
  <p>Is there a way of doing this within Zeep (I'm open to a different SOAP package, although Zeep seemed the most actively maintained)? Or am I missing something in my request format entirely that could be causing this issue?</p>
  
  <p>Code below. Thank you in advance!</p>
  
  <pre class="lang-py prettyprint-override"><code>header = xsd.Element(
      'Security',
      xsd.ComplexType([
          xsd.Element(
              'UsernameToken',
              xsd.ComplexType([
                  xsd.Element('Username', xsd.String()),
                  xsd.Element('Password', xsd.String()),
              ])
          )
      ])
  )
  
  header_value = header(UsernameToken={'Username': user, 'Password': password})
  
  client.service.ProcessMessage(_soapheaders=[header_value], Payload=dataobj)
  </code></pre>
  
  <p>In terms of generated XML, the above example gives the following:</p>
  
  <pre><code>&lt;soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/07/secext"&gt;
    &lt;soap-env:Header&gt;
      &lt;wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"&gt;
        &lt;wsse:UsernameToken&gt;
          &lt;wsse:Username&gt;username&lt;/wsse:Username&gt;
          &lt;wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"&gt;password&lt;/wsse:Password&gt;
        &lt;/wsse:UsernameToken&gt;
      &lt;/wsse:Security&gt;
    &lt;/soap-env:Header&gt;
    &lt;soap-env:Body&gt;
        ### REQUEST BODY
    &lt;/soap-env:Body&gt;
  &lt;/soap-env:Envelope&gt;
  </code></pre>
  
  <p>Which does not work</p>
  
  <p>However, by simply changing the <code>wsse:Security xmlns:wsse</code> value to <code>http://schemas.xmlsoap.org/ws/2002/07/secext</code> in the raw XML and pasting that into SOAPUI, that works.</p>