質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

415閲覧

PythonのSessionRequestへ渡すquery(json)のvalueの一部を変数で渡したいが実現できない

msy47

総合スコア26

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/02/03 11:39

実現したいこと

SessionRequestへ渡すquery(json)のvalueの一部を変数で渡したい、
のですが、そもそも実現可能なのでしょうか。
いくつかのサイトでjsonを変数に置き換えるような記述を参考にして
試したのですが、いずれも変数として認識されず。
お知恵をいただきたく、投稿しました。

前提

利用するAPI
SD-WAN vManage v20.9 - SD-WAN API Docs - Document - Cisco Developer
Monitoring - Application Aware Routingの「POST /statistics/approute/fec/aggregation」

変数にしたい箇所

"value": [ "172.16.254.16" ]

実現したいこと

system_ip = ”172.16.254.16” query_data = (略)"value": ["system_ip"](略) print(query_data) 結果 (略)"value": ["172.16.254.16"](略)

発生している問題・エラーメッセージ

IPの箇所を変数「system_ip」として連続で受け取りたい

query_data = (略)"value": ["172.16.254.16"](略) device_list = session.post(url=device_url, json=query_data, headers=heades_post, verify=False)

該当のソースコード

import json import boto3 import csv import numpy as np import pandas as pd import requests import os import urllib3 from datetime import datetime urllib3.disable_warnings(urlib3.exceptions.InsecureRequests.InsecureRequestWarning) def lambda_handler(event, context): s3 = boto3.resource(`s3`) bucket_name _ os.environ.get(`S3_BUCKET`) vmange_info_df = pd.read_csv(vnamage_info) device_info = "tmp/device_info.csv" bucket.download_file(os.environ.get(`CSV_DEVICE_INFO`), device_info) device_info_df = pd.read.csv(device_info) ipsec_tunnel_df = get_request(vmanage_info_df) def get_request(vmanage_info_df): api_datalist = [] for row in vmanage_info_df.itertuples(): vmanage_host = row[1] vmanage_port = row[2] vmanage_username = row[3] vmanage_password = row[4] base_url = `https://%s:%s`%(vmanage_host, vmanage_port) login_action = `/j_security_check` login_data = {`j_username` : vmanage_username, `j_password` : vmanage_password} login_url = base_url + login_action session = requests.session() login_response = session.post(url=login_url, data=login_data, verify=False) if login_token.status_code = 200: if b`<html>` in login_token.content: print("Login token Failed") exit(1) session.headers[`X-XSRF-TOKEN`] = login_token.content device_url = base_url + `/dataservice/device` df = pd.json_normalize(json_data["data"]) df = df[(df["device-type"] == "vedge") & (df["reachability"] == "reachable")] for data in df.itertuples() deviceid = data[1] nat_translation_url = base_url + `/dataservice/devie/ip/nat/translation?deviceId=` + deviceid nat_translation_list = sessin.get(url=nat_translation_url, verify=False) if nat_translation_list.status_code == 200: json_data = nat_translation_list.json = () else: print(nat_translation_list.status_code) df = pd.json_normalize(json_data["data"] print(df) print(len(df))

流用したいロジック
1つ目のAPIのDevice結果を、2つ目のAPIで受け取り実行したい

device_url = base_url + `/dataservice/device` df = pd.json_normalize(json_data["data"]) df = df[(df["device-type"] == "vedge") & (df["reachability"] == "reachable")] for data in df.itertuples() deviceid = data[1] nat_translation_url = base_url + `/dataservice/devie/ip/nat/translation?deviceId=` + deviceid

試したこと

ベースQuery(json)

query_data = (略)"value": ["172.16.254.16"](略)

検証1

system_ip = "172.16.254.16" query_data = (略)"value": [" + system_ip + "](略) print(query_data) 結果 (略)"value": [" + system_ip + "](略)

検証2

system_ip = "172.16.254.16" query_data = (略)"value": ["+`system_ip`+"](略) 結果 (略)"value": [" + `system_ip` + "](略)

検証3

system_ip = "172.16.254.16" query_data = (略)"value": ["`system_ip`"](略) 結果 (略)"value": ["`system_ip`"](略)

補足情報(FW/ツールのバージョンなど)

Python3.9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

質問の意図をうまく汲み取れているかわかりませんが、こういうことですか?

python

1import json 2 3json_literal = """ 4{ 5 "value": ["172.16.254.16"] 6} 7""" 8 9data = json.loads(json_literal) 10 11system_ip = data["value"][0] 12# system_ip = "172.16.254.16" 13 14query_data = f'"value": ["{system_ip}"]' 15# query_data = "value": ["172.16.254.16"]

json は、辞書型のオブジェクトとして扱えば自由に加工できます。

投稿2023/02/03 14:35

Demerara

総合スコア397

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msy47

2023/02/03 18:02

回答ありがとうございます! ちょっと理解が追いついておらず、こちらも組み込めれば柔軟性がありそうなので試してみます!
guest

0

ベストアンサー

下記ではどうでしょうか・

python

1 2system_ip = "172.16.254.16" 3query_data = ()"value": [system_ip]() 4 5device_list = session.post(url=device_url, json=query_data, headers=heades_post, verify=False)

※ heades_post は、正しくは「headers_post」である可能性もあります。

投稿2023/02/03 14:29

編集2023/02/03 14:30
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msy47

2023/02/03 18:01

こちらで動作確認できました!ありがとうございます!
guest

0

該当のソースコード

に query_data がないのでどこを直すべきかわからなかったのですが、f 文字列は検討されましたでしょうか。

投稿2023/02/03 14:22

urbainleverrier

総合スコア200

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msy47

2023/02/03 18:02

そのような仕様があるのですね、ご助言ありがとうございます!こちらも試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問