Anzeige:
Ergebnis 1 bis 9 von 9

Thema: python requests multiple header mit variable

  1. #1
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.255

    python requests multiple header mit variable

    Ich habe fuer requests zwei Header

    - "Content-Type": "application/json"
    - "COMPANY-Authentication": "' + work_value + '"

    Zusammengeklebt sehen die ja auch gut aus
    - '{da_header_one + ', ' + da_header_two}'

    Aber ich bekomme dann ein

    - AttributeError: 'str' object has no attribute 'items'

    Code:
    Traceback (most recent call last):
      File "/home/druuhl/git/operating/bin/./ases2", line 255, in <module>
        __main__()
      File "/home/druuhl/git/operating/bin/./ases2", line 48, in __main__
        __get_basic_customer_data__(work_value)
      File "/home/druuhl/git/operating/bin/./ases2", line 142, in __get_basic_customer_data__
        gql_out = __get_graphql_data__(da_endpoint, da_mode, da_query, da_headers)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/druuhl/git/operating/bin/./ases2", line 238, in __get_graphql_data__
        response = requests.post(
                   ^^^^^^^^^^^^^^
      File "/usr/lib/python3/dist-packages/requests/api.py", line 115, in post
        return request("post", url, data=data, json=json, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3/dist-packages/requests/api.py", line 59, in request
        return session.request(method=method, url=url, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3/dist-packages/requests/sessions.py", line 573, in request
        prep = self.prepare_request(req)
               ^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3/dist-packages/requests/sessions.py", line 484, in prepare_request
        p.prepare(
      File "/usr/lib/python3/dist-packages/requests/models.py", line 369, in prepare
        self.prepare_headers(headers)
      File "/usr/lib/python3/dist-packages/requests/models.py", line 489, in prepare_headers
        for header in headers.items():
                      ^^^^^^^^^^^^^
    AttributeError: 'str' object has no attribute 'items'
    Eine Idee ?
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  2. #2
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    22.062
    Zitat Zitat von Huhn Hur Tu Beitrag anzeigen
    Eine Idee ?
    Den relevanten Code posten.
    Ich bin root - ich darf das.

  3. #3
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.255
    Da Code einself
    da_endpoint = 'https://FOO-live.server.lan:443/customer/graphql'
    da_mode = 'post'
    da_header_one = '"Content-Type": "application/json"'
    da_header_two = '"FOO-Authentication": "' + work_value + '"'
    da_headers = {da_header_one + ', ' + da_header_two}


    gql_out = __get_graphql_data__(da_endpoint, da_mode, da_query, da_headers)


    def __get_graphql_data__(gql_endpoint, gql_mode, gql_query, gql_headers):

    ## GraphQL Tooluser Credentials
    parser = configparser.ConfigParser()
    parser.read(credentials_path)
    gql_user = parser.get('GRAPHQL', 'gql_user')
    gql_pass = parser.get('GRAPHQL', 'gql_pass')

    try:
    response = requests.post(
    gql_endpoint,
    headers = str(gql_headers),
    auth=HTTPBasicAuth(gql_user, gql_pass),
    data=gql_query,
    verify='/etc/ssl/certs/FOO.pem'
    )
    ## DEBUG
    #print('###### DEBUG requests response OUTPUT')
    return response.text

    except OSError:
    print('Ein Problem HTTP ' + response + ' mit ' + gql_endpoint)
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  4. #4
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    22.062
    Hab's nicht nachgestellt, aber alles aus Google meint: headers = str(gql_headers) - dass da das str nix verloren hat.
    Ich bin root - ich darf das.

  5. #5
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.819
    [edit]ohne da jetzt wirklich drin zu sein, aber die Zeile:
    da_headers = {da_header_one + ', ' + da_header_two}

    stinkt ein bisschen - sa https://onlinegdb.com/lV6CUDuq7

    Code:
    work_value = "42"
    da_header_one = '"Content-Type": "application/json"'
    da_header_two = '"FOO-Authentication": "' + work_value + '"'
    da_headers = {da_header_one + ', ' + da_header_two}
    da_json1 = {da_header_one, da_header_two}
    da_json2 = {da_header_two, da_header_one}
    da_json3 = {"Content-Type": "application/json", "FOO-Authentication": "42"}
    print(f"text1: {da_headers}")
    print(f"json1: {da_json1}")
    print(f"json2: {da_json2}")
    print(f"json3: {da_json3}")
    Ausgabe:
    Code:
    text1: {'"Content-Type": "application/json", "FOO-Authentication": "42"'}
    json1: {'"FOO-Authentication": "42"', '"Content-Type": "application/json"'}
    json2: {'"FOO-Authentication": "42"', '"Content-Type": "application/json"'}
    json3: {'Content-Type': 'application/json', 'FOO-Authentication': '42'}
    Ich vermute mal du willst json3
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  6. #6
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.255
    Nochmal nachgebaut in ipython

    Code:
    In [10]: import json
    
    In [11]: ttt = '{"Content-Type": "application/json", "FOO-Authentication": "42"}'
    
    In [12]: print(json.loads(ttt))
    {'Content-Type': 'application/json', 'FOO-Authentication': '42'}
    Soweit so fein.
    Aber ich braeuchte da nochmal eine Machete fuer mein geistiges Unterholz
    Code:
    In [31]: response = requests.post(
        ...: gql_endpoint,
        ...: headers = gql_headers,
        ...: auth=HTTPBasicAuth(gql_user, gql_pass),
        ...: data=gql_query,
        ...: verify='/etc/ssl/certs/COMPANYrootca2022ec.pem'
        ...: )
        ...: ## DEBUG
        ...: #print('###### DEBUG requests response OUTPUT')
        ...: return response.text
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    Cell In [31], line 1
    ----> 1 response = requests.post(
          2 gql_endpoint,
          3 headers = gql_headers,
          4 auth=HTTPBasicAuth(gql_user, gql_pass),
          5 data=gql_query,
          6 verify='/etc/ssl/certs/COMPANYrootca2022ec.pem'
          7 )
          8 ## DEBUG
          9 #print('###### DEBUG requests response OUTPUT')
         10 return response.text
    
    File /usr/lib/python3/dist-packages/requests/api.py:115, in post(url, data, json, **kwargs)
        103 def post(url, data=None, json=None, **kwargs):
        104     r"""Sends a POST request.
        105
        106     :param url: URL for the new :class:`Request` object.
       (...)
        112     :rtype: requests.Response
        113     """
    --> 115     return request("post", url, data=data, json=json, **kwargs)
    
    File /usr/lib/python3/dist-packages/requests/api.py:59, in request(method, url, **kwargs)
         55 # By using the 'with' statement we are sure the session is closed, thus we
         56 # avoid leaving sockets open which can trigger a ResourceWarning in some
         57 # cases, and look like a memory leak in others.
         58 with sessions.Session() as session:
    ---> 59     return session.request(method=method, url=url, **kwargs)
    
    File  /usr/lib/python3/dist-packages/requests/sessions.py:573, in  Session.request(self, method, url, params, data, headers, cookies,  files, auth, timeout, allow_redirects, proxies, hooks, stream, verify,  cert, json)
        560 # Create the Request.
        561 req = Request(
        562     method=method.upper(),
        563     url=url,
       (...)
        571     hooks=hooks,
        572 )
    --> 573 prep = self.prepare_request(req)
        575 proxies = proxies or {}
        577 settings = self.merge_environment_settings(
        578     prep.url, proxies, stream, verify, cert
        579 )
    
    File /usr/lib/python3/dist-packages/requests/sessions.py:484, in Session.prepare_request(self, request)
        481     auth = get_netrc_auth(request.url)
        483 p = PreparedRequest()
    --> 484 p.prepare(
        485     method=request.method.upper(),
        486     url=request.url,
        487     files=request.files,
        488     data=request.data,
        489     json=request.json,
        490     headers=merge_setting(
        491         request.headers, self.headers, dict_class=CaseInsensitiveDict
        492     ),
        493     params=merge_setting(request.params, self.params),
        494     auth=merge_setting(auth, self.auth),
        495     cookies=merged_cookies,
        496     hooks=merge_hooks(request.hooks, self.hooks),
        497 )
        498 return p
    
    File  /usr/lib/python3/dist-packages/requests/models.py:369, in  PreparedRequest.prepare(self, method, url, headers, files, data, params,  auth, cookies, hooks, json)
        367 self.prepare_method(method)
        368 self.prepare_url(url, params)
    --> 369 self.prepare_headers(headers)
        370 self.prepare_cookies(cookies)
        371 self.prepare_body(data, files, json)
    
    File /usr/lib/python3/dist-packages/requests/models.py:489, in PreparedRequest.prepare_headers(self, headers)
        487 self.headers = CaseInsensitiveDict()
        488 if headers:
    --> 489     for header in headers.items():
        490         # Raise exception on invalid header value.
        491         check_header_validity(header)
        492         name, value = header
    
    AttributeError: 'str' object has no attribute 'items'
    Functionsaufruf
    Code:
      gql_out = __get_graphql_data__(da_endpoint, da_mode, da_query, da_headers)
    Function
    Code:
    def __get_graphql_data__(gql_endpoint, gql_mode, gql_query, gql_headers):
    
      ## GraphQL Tooluser Credentials
      parser = configparser.ConfigParser()
      parser.read(credentials_path)
      gql_user = parser.get('GRAPHQL', 'gql_user')
      gql_pass = parser.get('GRAPHQL', 'gql_pass')
    
      try:
        response = requests.post(
        gql_endpoint,
        headers = str(gql_headers),
        auth=HTTPBasicAuth(gql_user, gql_pass),
        data=gql_query,
        verify='/etc/ssl/certs/COMPANYrootca2022ec.pem'
        )
        ## DEBUG
        #print('###### DEBUG requests response OUTPUT')
        return response.text
    
      except OSError:
        print('Ein Problem HTTP ' + response + ' mit ' + gql_endpoint)
    Geändert von Huhn Hur Tu (17.04.24 um 05:23 Uhr)
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  7. #7
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    22.062
    btw: es gibt übigens neben der
    Zitierfunktion
    auch die
    Code:
    Funktion für Code-Formatierung
    - gerade bei Code, der ggf. Syntaxrelevante Leerzeichen hat und generell auch sonst eine massive Lesbarkeitsverbesserung.
    Ich bin root - ich darf das.

  8. #8
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.819
    Wenn man von unten nach oben liest bzw sich die tiefste Exception ansieht:
    Code:
    File /usr/lib/python3/dist-packages/requests/models.py:489, in PreparedRequest.prepare_headers(self, headers)
    487 self.headers = CaseInsensitiveDict()
    488 if headers:
    --> 489 for header in headers.items():
    490 # Raise exception on invalid header value.
    491 check_header_validity(header)
    492 name, value = header
    
    AttributeError: 'str' object has no attribute 'items'
    => PreparedRequest.prepare_headers(self, headers) wird mit headers vom Typ String aufgerufen, es wird aber was anderes erwartet.
    Dann die Funktion:
    Code:
    def __get_graphql_data__(gql_endpoint, gql_mode, gql_query, gql_headers):
    
      #...
      try:
        response = requests.post(
          # ...
          headers = str(gql_headers),
          # ...
        )
    
      #...
    Ich würde ja drauf wetten, das headers = str() die Probleme erzeugt. Ich würde mal tippen, dass es da ein Dictionary bzw json erwartet und empfehlen, Strings wenn irgendwie möglich zu meiden.

    => headers = gql_headers bzw headers = to_dict(gql_headers)

    [edit]Ab Python 3.9 kannst man Dictionaries recht einfach kombinieren, mit dem üblichen Foo:
    Code:
    work_value = '42'
    da_header_one = {'Content-Type' : 'application/json'}
    da_header_two = {'Content-Type' : 'application/foo', 'FOO-Authentication' : work_value}
    da_headers_1 = da_header_one | da_header_two
    da_headers_2 = da_header_two | da_header_one
    print(f'da_headers_1: {da_headers_1}')
    print(f'da_headers_2: {da_headers_2}')
    Code:
    Ausgabe:
    da_headers_1: {'Content-Type': 'application/foo', 'FOO-Authentication': '42'}
    da_headers_2: {'Content-Type': 'application/json', 'FOO-Authentication': '42'}
    Geändert von nopes (15.04.24 um 22:14 Uhr) Grund: Typos
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  9. #9
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.255
    Sorry fuer die Formatierung, ich bin halt Jira versaut und upper Case und slash allergisch, habe es gefixt.

    Die Header nach json casten war dann die Loesung.
    Code:
    def __get_graphql_data__(gql_endpoint, gql_mode, gql_query, gql_headers):
    
      js_headers = json.loads(gql_headers)
    
      ## GraphQL Tooluser Credentials
      parser = configparser.ConfigParser()
      parser.read(credentials_path)
      gql_user = parser.get('GRAPHQL', 'gql_user')
      gql_pass = parser.get('GRAPHQL', 'gql_pass')
    
      try:
        response = requests.post(
        gql_endpoint,
        headers = js_headers,
        auth=HTTPBasicAuth(gql_user, gql_pass),
        data=gql_query,
        verify='/etc/ssl/certs/COMPANYrootca2022ec.pem'
        )
        ## DEBUG
        #print('###### DEBUG requests response OUTPUT')
        return response.text
    Danke euch
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


Ähnliche Themen

  1. Seltsame HTTP-Requests
    Von PierreS im Forum Sicherheit
    Antworten: 21
    Letzter Beitrag: 17.04.08, 13:58
  2. Python - Paramiko für python 2.5
    Von Moesli im Forum Anwendungen Allgemein, Software
    Antworten: 2
    Letzter Beitrag: 13.12.07, 10:36
  3. SUCHE: fuse python bindings für python 2.4 und Suse 10
    Von skurial im Forum System installieren und konfigurieren
    Antworten: 4
    Letzter Beitrag: 20.11.05, 16:21
  4. Log der client-requests
    Von marian_2 im Forum Router und Netzaufbau
    Antworten: 0
    Letzter Beitrag: 04.02.04, 12:28
  5. ARP Requests
    Von Liberace im Forum Router und Netzaufbau
    Antworten: 0
    Letzter Beitrag: 14.10.03, 07:41

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •