前提・実現したいこと
私は今学校でPythonを勉強してます。
元々Tkinterで作ったプログラムを発表したところWebアプリ化してみたら勉強になるといわれFlask(ローカルのみ)で実装しようとしています。
Jinja自体初めてで、Webサーバー等不慣れな点もたくさんあるため、アドバイスを頂ければと思っています。
あまり回りにPythonの事で相談できる人が少ないのでここで質問をさせてください。
実装したいプログラム
これらをJinjaで実装する場合、どういった書き方(?)等が理想なのでしょうか?
サーバーサイド側の知識があまりなく今まで書いたこともなかったので、どうしていいか混乱してしまっている状態です。
正直Tkinterで作っていたプログラムをJinjaにどうやって落とし込めばいいのか・・・。
大混乱中なため、どんなことでもアドバイスを頂ければ・・・!と思ってます。
宜しくお願い致します。
以下のソースは元々画像をスクレイピングで保存をする というプログラムの一部になります。
全文載せてしまうと長ったらしいので割愛させて頂きます。
python
1###スクレイピング・データ書き出し・フォルダ指定・作成・変換関数 2def url_get(): 3 counter = 1 4 url = txb.get() 5 html = requests.get(url) 6 soup = BS(html.content, "html.parser") 7 directory = Path(input_text.get() + "/original") 8 os.makedirs(directory, exist_ok=True) 9 for element in soup.find_all("img"): 10 src = element.get("src") 11 if src is None: 12 continue 13 image_url = urllib.parse.urljoin(url, src) 14 print(image_url) 15 imgdata = requests.get(image_url) 16 file_name = image_url.split("/")[-1] 17 if not file_name.endswith((".jpg", ".jpeg", ".png", ".gif")): 18 txt = file_name.find("?") 19 file_name = (file_name[:txt]) 20 print(file_name) 21 file_name = (str(counter) + "_" + file_name) 22 out_path = directory.joinpath(file_name) 23 with open(out_path, mode="wb") as f: 24 a = f.write(imgdata.content) 25 counter += 1 26 time.sleep(0.5) 27 print(file_name) 28 print("finish!!!!") 29 30
該当のソースコード
jinjaで実装しようとしているもの
URLを入れると画像を出す という流れにしたいと思っています。
python
1app = Flask(__name__) 2@app.route("/top", methods=["GET"]) 3def input(): 4 return render_template("input.html", title="TOP") 5@app.route("/", methods=["POST"]) 6def output(): 7 counter = 1 8 name = request.form.get("name") 9 URL = requests.get(name) 10 soup = BS(URL.content, "html.parser") 11 directory = Path("./static/gazou") 12 os.makedirs(directory, exist_ok=True) 13 for element in soup.find_all("img"): 14 src = element.get("src") 15 image_url = urllib.parse.urljoin(URL, src) 16 imgdata = requests.get(image_url) 17 file_name = image_url.split("/")[-1] 18 if not file_name.endswith((".jpg", ".jpeg", ".png", ".gif")): 19 txt = file_name.find("?") 20 file_name = (file_name[:txt]) 21 file_name = (str(counter) + "_" + file_name) 22 out_path = directory.joinpath(file_name) 23 with open(out_path, mode="wb") as f: 24 a = f.write(imgdata.content) 25 counter += 1 26 time.sleep(0.5) 27 return render_template("output.html", name=name, title = "jinja難しい!!!") 28 29@app.route("/upload") 30def upload(): 31 return render_template("upload.html") 32 33###locakhost起動 34if __name__ == "__main__": 35 app.run(port=8080, debug=True, host='localhost') 36
エラーで引っかかってしまうところ
TypeError: Cannot mix str and non-str arguments
image_url = urllib.parse.urljoin(URL, src)
補足情報(FW/ツールのバージョンなど)
VScodeで書いてます。
htmlやCSSも別途で書いてます。
Python 3.9.4 です。
何もかもがゴリゴリの初心者です。
###追記(HTMLファイル)
base.html
html
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <link rel="stylesheet" href="../static/CSS/style.css"> 7 <title>{{ title }}</title> 8</head> 9<body> 10 <h1>ここが変換ベース?</h1> 11 <p>{{file_name}}</p> 12 {% block content %} 13<!-- ここに変換部分が挿入される?? --> 14 15 {% endblock %} 16</body> 17</html> 18
input.html
html
1 2{% extends "base.html" %} 3{% block content %} 4<form action="/top" method="GET" enctype="multipart/form-data"> 5 <input type="url" id="url" name="URL" placeholder="URLを入力"> 6 <input class="submit-button" value="実行" type="submit"> 7</form> 8{% endblock %}
output.html
html
1{% extends "base.html" %} 2{% block content %} 3<p>{{ name }}</p> 4<p>{{ URL }}</p> 5<p>{{ html }}</p> 6<h1>あうとぷっとだよ!!</h1> 7<a href="/top">back top</a> 8{% endblock %}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/23 14:34
2021/07/23 14:49
2021/07/23 16:46
2021/07/23 17:40
2021/07/24 02:27