Python вставляет символы новой строки в заголовок запроса - PullRequest
0 голосов
/ 05 апреля 2020

Некоторый фон. Этот код берет данные из сценария сбора данных и затем отправляет их в защищенный REST API в Django. У меня есть ключ API, и это единственная строка в файле api.key. У меня также есть URL для публикации в файле post.url (он выглядит как http://example.com/api/, а затем я объединяю правильное имя узла API в конце).

Код ниже для моего узла API солнечных данных (публикует данные, собранные с солнечных панелей)

import gather_solar as gs
import requests
import json
import os

def post_solar():
print("DEBUG: start solar")
data = gs.gather_solar()
api_key = None
url = None
try:
    here = os.path.dirname(os.path.abspath(__file__))
    filename = os.path.join(here, 'api.key')
    file = open(filename, "r")
    api_key = file.readline()
    api_key.replace('\n', '')
except Exception as e:
    print("ERROR: " + str(e))

try:
    here = os.path.dirname(os.path.abspath(__file__))
    filename = os.path.join(here, 'post.url') #server will use different url
    file = open(filename, "r")
    url = file.readline()
    url.replace('\n', '')
except Exception as e:
    print("ERROR: " + str(e))

if api_key is not None and url is not None:
    authorization = "Token " + api_key
    authorization.replace('\n', '')
    headers = {
        'Content-Type': 'application/json; charset=UTF-8',
        'Authorization': authorization
    }
    json_data = json.dumps(data)
    url += "solar/"        
    url.replace('\n', '')
    print(url)
    req = requests.Request('POST', url, data=json_data, headers=headers)
    prepared = req.prepare()
    print("DEBUG: POST Headers: " + str(prepared.headers))
    print("DEBUG: POST Body: " + str(prepared.body))

    s = requests.Session()
    response = s.send(prepared)
    print("DEBUG: Response Code: " + str(response.status_code))
    print("DEBUG: Response Headers: " + str(response.headers))
    print("DEBUG: Response Data: " + str(response.json()))
else:
    print("DEBUG: Error with API key")

print("DEBUG: end solar")

Я выполняю код на сервере Ubuntu через AWS и у меня настроена и запущена Apache 2. Однако всякий раз, когда я запускаю этот скрипт, я получаю сообщение о том, что мой токен недействителен, и он показывает токен как «Token abcd ... abcd \ n». Это особенно расстраивает, потому что у меня нет этой проблемы, когда я запускаю скрипт локально (код Visual Studio на Win10). Как вы можете видеть, я пытался удалить любые строки, где это возможно, но это, похоже, не помогает. Любая помощь будет принята с благодарностью

1 Ответ

1 голос
/ 05 апреля 2020

replace() не меняет строку (строки являются неизменяемыми); он возвращает новую строку. Итак:

api_key = file.readline()
api_key.replace('\n', '')

оставляет \n на api_key, и вы игнорируете новую строку, возвращаемую replace().

. Вы можете просто вставить строку перед присваиванием:

api_key = file.readline().strip()
...