TypeError: строковые индексы должны быть целыми числами в django - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь сохранить JSON в bigchainDB. Но проблема в том, что когда я жестко кодирую объект json и вещаю среди других узлов, он становится успешным. Но когда я отправляю тот же объект json от почтальона, я получаю сообщение об ошибке string indices must be integers

Это моя функция

 def index(request):
    root = settings.BIGCHAINDB
    bdb = BigchainDB(root)
    alice, bob = generate_keypair(), generate_keypair()
    insertDB =  json.dumps(request.body.decode("utf-8"))
    jsonDict =  json.loads(insertDB)
    prepared_token_tx = bdb.transactions.prepare(
        operation='CREATE',
        signers=alice.public_key,
        recipients=[([bob.public_key], 10)],
        asset=jsonDict)
    fulfilled_token_tx = bdb.transactions.fulfill(
        prepared_token_tx,
        private_keys=alice.private_key)
    bdb.transactions.send_commit(fulfilled_token_tx)
    txid = fulfilled_token_tx['id']
    return HttpResponse(txid)

JSON OBJECT:

{"данные": { "cphNumber": "321", "farmName": "313", "addressLine1": "13", "addressLine2": "13", «регион»: «13», "postalCode": "13", "corrName": "13", "corrAddressLine1": "131", "corrAddressLine2": "31", "corrRegion": "31", "corrCountry": "321", "corrPostal": "31", "corrMobile": "321", "corrEmail": "31", "agentName": "31", "agentAddressLine1": "313", "agentAddressLine2": "132", "agentRegion": "13", "agentCountry": "132", "agentPostal": "132", "брн": "13", "animalSpecies": "132" }}

Django Version: 2.1.7
Python Version: 3.7.1
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'api']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/home/user/miniconda3/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/home/user/miniconda3/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "/home/user/miniconda3/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/user/miniconda3/lib/python3.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
  54.         return view_func(*args, **kwargs)

File "/home/user/Desktop/blockchain/api/views.py" in index
  48. 		asset=jsonDict)

File "/home/user/miniconda3/lib/python3.7/site-packages/bigchaindb_driver/driver.py" in prepare
  254.             inputs=inputs,

File "/home/user/miniconda3/lib/python3.7/site-packages/bigchaindb_driver/offchain.py" in prepare_transaction
  132.         inputs=inputs,

File "/home/user/miniconda3/lib/python3.7/functools.py" in wrapper
  824.         return dispatch(args[0].__class__)(*args, **kw)

File "/home/user/miniconda3/lib/python3.7/site-packages/bigchaindb_driver/offchain.py" in _prepare_create_transaction_dispatcher
  45.     return prepare_create_transaction(**kwargs)

File "/home/user/miniconda3/lib/python3.7/site-packages/bigchaindb_driver/offchain.py" in prepare_create_transaction
  196.         asset=asset['data'] if asset else None,

Exception Type: TypeError at /api/
Exception Value: string indices must be integers

Любое предложение приветствуется. Заранее спасибо.

1 Ответ

1 голос
/ 18 апреля 2019

Проблема здесь в том, что вы используете json.dumps() на request.body, который уже является строкой. Поэтому, когда вы используете json.loads(), ваши данные не будут проанализированы в dict.

 def index(request):
    root = settings.BIGCHAINDB
    bdb = BigchainDB(root)
    alice, bob = generate_keypair(), generate_keypair()
    insertDB =  request.body.decode("utf-8")  # Don't use json.dumps() here
    jsonDict =  json.loads(insertDB)
    prepared_token_tx = bdb.transactions.prepare(
        operation='CREATE',
        signers=alice.public_key,
        recipients=[([bob.public_key], 10)],
        asset=jsonDict)
    fulfilled_token_tx = bdb.transactions.fulfill(
        prepared_token_tx,
        private_keys=alice.private_key)
    bdb.transactions.send_commit(fulfilled_token_tx)
    txid = fulfilled_token_tx['id']
    return HttpResponse(txid)

* 1009 Docs *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...