在python anywhere上使用flask从智能合约返回值时遇到问题

2024-09-27 00:19:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在PythonyWhere上使用flask和web3.eth并连接到一个合约,但在返回一个智能合约函数的值时遇到问题。没有记录任何错误。我放置了几个打印语句以查看应用程序停止的位置,并发现当我调用智能合约函数时,应用程序停止

我还应该提到,我能够在本地运行这段代码,而不会出现任何问题

这是最有可能失败的功能:

def getDataFromTokenID(tokenid, contract):
    print('getting uri')
    uri = contract.functions.tokenURI(tokenid).call() # This is where it stops printing
    print('PRINT:',uri)
    html = requests.get(uri)
    name, img_url = html.json()['name'], html.json()['image']
    code = name[-5:]
    return name, img_url, code

在以下蓝图中调用了上述函数:

@TokenInfo.route('/rarity/<int:tokenid>', methods=['GET'])
def sendTokenInfo(tokenid):

    contract_address = ' ' # left empty for posting purposes
    w3 = Web3(Web3.WebsocketProvider(' ')) # left empty purposefully as well
    contract = w3.eth.contract(address=contract_address, abi=contract_abi.abi)

    model = Shape_classifier()
    model.load_state_dict(load(os.getcwd()+'/mysite/app/state_dict.pth'))

    uri = current_app.config['MONGO_URI']
    mongo.init_app(current_app, uri)
    gs = mongo.db.gantomstone_info

    try:
        id_exists = [{"$match": {'_id': tokenid}}, {"$count": "count"}]
        list(gs.aggregate(id_exists))[0]

    except:
        print('getting data from token id')
        name, img_url, serial = getDataFromTokenID(tokenid, contract) ## Stops printing here
        print('opening image')
        img = Image.open(requests.get(img_url, stream=True).raw)
        shape = getImageShape(img, model)
        colors = getColors(getCounts(img))
        rgb_count = getCounts(img)
        serialTF = getCodeInfo(serial)
        to_db = {'_id': tokenid, 'name': name, 'img_url': img_url, 'serial': serial,
                 'shape': shape, 'colors': colors, 'serialTF': serialTF, 'rgb_count': rgb_count}
        gs.insert_one(to_db)

    rarity = getRarity(gs, tokenid)
    gs.update_one({'_id': tokenid}, {
                  '$set': {'rarity_values': rarity}}, upsert=True)

    to_json = list(gs.find({'_id': tokenid}))[0]

    return jsonify(to_json)

我尝试过将合同地址四处移动(从TokenInfo视图函数中移出,并放入函数文件中),但都没有效果。我还尝试更改函数输入以接收get请求args,而不是URL中的int,这也没有什么区别

如果有人知道如何使这项工作,那将是惊人的,我将非常感激

多谢各位


Tags: 函数namegsidjsonappurlimg

热门问题