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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

4653閲覧

Flaskで、動的なURLのインラインフレームを作る

mo256man

総合スコア43

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/04/18 05:52

編集2021/04/19 14:49

前提

Flaskで、インラインフレーム内のHTMLを作るには以下のようにします。
ここではmain.htmlの中にsub.htmlが作られるとします。

html

1<iframe src="{{url_for('show_iframe')}}"></iframe>

Python

1@app.route("/hoge") 2def show_iframe(): 3 return render_template("sub.html")

また、リンク先を変数的に扱うには以下のようにします。
ここではsub/1、sub/2、sub/3にアクセスするとsub1.html、sub2.html、sub3.htmlが作られます。

Python

1@app.route("/sub/num") 2def show_sub(num): 3 url = f"sub{num}.html" 4 return render_template(url)

実現したいこと

では、main.htmlのインラインフレーム内に動的にsub1.htmlもしくはsub2.htmlもしくはsub3.htmlを作るにはどうしたらよいのでしょうか。
Pythonだから関数の引数にデフォルト値を指定するやり方もあると便利だと思うのですが。

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

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

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

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

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

guest

回答3

0

解決したようで何よりです。どうしてもmain.html全体の再レンダリングをせずにiframeのsrcだけ変えたい場合は、JavaScriptを組み合わせることになると思います。以下、やっつけ実装の例です。動作確認まではしてないので、間違いがあったらスミマセン。

  • main.html

html

1<iframe id="id1" src="{{ url_for('show_iframe', num=num) }}"></iframe> 2 3<ul> 4 <li><button id="num1">num=1</button></li> 5 <li><button id="num2">num=2</button></li> 6</ul> 7 8<script> 9function changeIframeSrc(num) { 10 targetFrame = document.getElementById("id1"); 11 targetFrame.src="{{ url_for('show_iframe') }}" + "/" + num; 12} 13b1 = document.getElementById("num1"); 14b1.addEventListener("click", event => { changeIframeSrc(1) }); 15b2 = document.getElementById("num2"); 16b2.addEventListener("click", event => { changeIframeSrc(2) }); 17</script>
  • Flaskアプリのコード

python

1# (省略) 2 3# iframeの中のレンダリング 4@app.route("/hoge/", defaults={num: 1}) 5@app.route("/hoge/<int:num>") 6def show_iframe(num): 7 url = f"sub{num}.html" 8 return render_template(url)

投稿2021/04/20 14:41

msiz07

総合スコア172

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

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

mo256man

2021/04/22 12:55

これはすごい! 今回の質問とは別に、JavaScriptでinnerHTMLを変更するようにFlaskのレンダリングも一部だけできないかなとも思っていたのです。 @app.route("/hoge/", defaults={num: 1})  の部分、変数…というか変数の名前を定義するのは @app.route("/hoge/", defaults={"num": 1}) とするのが正しいようですね。
guest

0

自己解決

こうすることで対応できました。
msiz07さんありがとうございます。

html

1<iframe src="url_for('show_sub', num=num)"></iframe>

python

1# 起動時はinframeの中はsub1で決め打ち 2@app.route("/") 3def main(): 4 return render_template("main.html", num=1) 5 6# sub/1、sub/2、sub/3 からの対応 7@app.route("/sub/<int:num>") 8def show_sub(num): 9 return render_template("main.html", num=num) 10 11# iframeの中のレンダリング 12@app.route("/hoge/<int:num>") 13def show_iframe(num): 14 url = f"sub{num}.html" 15 return render_template(url)

main.htmlの中のiframeだけ変更したいが、main.html全体を再レンダリングする必要があるというわけですね。

投稿2021/04/20 13:14

mo256man

総合スコア43

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

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

0

質問の内容を理解できているか確信を持てませんが、やりたいのは以下のようなことでしょうか?

  • main.html

html

1<iframe src="url_for('show_sub', num=num)"></iframe>
  • Flaskアプリのコード

python

1from flask import Flask, render_template 2 3app = Flask(__name__) 4 5@app.route("/hoge/<int:num>") 6def show_iframe(num): 7 return render_template("main.html", num=num) 8 9@app.route("/sub/<int:num>") 10def show_sub(num): 11 url = f"sub{num}.html" 12 return render_template(url)

勘違いなどあれば、ご指摘ください。

投稿2021/04/19 19:47

msiz07

総合スコア172

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

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

mo256man

2021/04/20 12:35

関数 show_sub(num) の戻り値が render_template(url) だと、iframeでなくページそのものが変わってしまいますね。 …わかった! ここではMarkdownが使えないので自己解決欄に書きます。 ヒントありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問