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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Q&A

解決済

1回答

2437閲覧

pythonのhttp.serverを使ったWebサーバ上のスクリプトの読み込みができない

marimo0

総合スコア5

Python 3.x

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

0グッド

0クリップ

投稿2021/08/07 02:34

pythonのhttp.serverで簡易的なhhtpサーバを立てているのですが、使用を想定している環境がネット接続なしの環境のため、jquery、bootstrap等のスクリプトを CDNではなくhttpサーバ上のファイルから読み込みたいと思っています。

下記が試しているサンプルコードになります。
Sample.htmlでは CDN(コードではコメントアウト)での読み込みはうまくいくものの、同階層に配置したjquery-3.6.0.min.jsを読み込めない状態となっています。

HttpHandlerのdo_GETやdo_POSTを使えばうまくいきそうかなと試しているのですが上手くいかず…
方法を知っている方いましたらご教授お願い致します。

Python

1(Server.py) 2 3from http import server 4from http.server import BaseHTTPRequestHandler,ThreadingHTTPServer 5import threading 6 7 8class Server: 9 def __init__(self) : 10 self.HOST = 'localhost' 11 self.HTTP_PORT = 8080 12 self.client = None 13 14 self.https = ThreadingHTTPServer((self.HOST, self.HTTP_PORT),HttpHandler) 15 16 def start(self): 17 threading.Thread(target=self.https.serve_forever).start() 18 19 def shutdown(self): 20 self.https.shutdown() 21 22 def new_client(self,client,server): 23 self.client =client 24 25class HttpHandler(BaseHTTPRequestHandler): 26 def do_GET(self): 27 with open('Sample.html', mode='r', encoding='utf-8') as html: 28 response_body = html.read() 29 self.send_response(200) 30 self.send_header('Content-type', 'text/html; charset=utf-8') 31 self.end_headers() 32 self.wfile.write(response_body.encode('utf-8')) 33 34 35if __name__=="__main__": 36 server = Server() 37 server.start()

html

1(Sample.html) 2 3<!DOCTYPE html> 4<html lang="ja"> 5<head> 6 <script type="text/javascript" src="jquery-3.6.0.min.js"></script> 7 <!-- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> --> 8 <script> 9 $(function(){ 10 $(".No1").css("color","blue") 11 }); 12 </script> 13</head> 14<body> 15<div class="No1">TestText</div> 16</body> 17 18</html> 19

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

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

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

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

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

guest

回答1

0

ベストアンサー

現状のコードの問題点は、サーバーが無条件に Sample.html ファイルを出力してます。
jquery-3.6.0.min.js ファイルを要求されても、Sample.html ファイルを返しているので、
正しく読み込めてない状態になるはずです。

CDN等の外部サーバから読み込む場合は、問題ありませんが、
同階層に配置した場合は、同HTTPサーバー経由になるので、
この点を正しく扱えるように do_GET を実装する必要があります。

検証用URL

全てのケースで Sample.html が表示されているはずです。


解決策:

  • do_GET メソッド内でパス (self.path)を判別し、適切な内容を返す。

 ファイル内容だけでなく、レスポンスのヘッダ情報も適切な形式を設定。

  • もしくは、既存の簡易実装である SimpleHTTPRequestHandler を利用。

 独自に実装する場合も、SimpleHTTPRequestHandlerクラスのdo_GET, send_head メソッドのコードが参考になります。


参考

 Source Code へのリンク有。

投稿2021/08/07 05:24

teamikl

総合スコア8664

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

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

marimo0

2021/08/07 06:57

参考リンクを参照しながら、do_GETの実装を下記のようにすることで問題を解決することができました。 わかりやすい解決策の明示、ありがとうございました。 class HttpHandler(BaseHTTPRequestHandler): def do_GET(self): if 'jquery' in self.requestline: with open(f'jquery-3.6.0.min.js', mode='r', encoding='utf-8') as jquery: response_body = jquery.read() self.send_response(200) self.send_header('Content-type', 'text/javascript; charset=utf-8') self.end_headers() self.wfile.write(response_body.encode('utf-8')) else: with open(f'Sample.html', mode='r', encoding='utf-8') as html: response_body = html.read() self.send_response(200) self.send_header('Content-type', 'text/html; charset=utf-8') self.end_headers() self.wfile.write(response_body.encode('utf-8'))
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問