Pyhonのクラスに関することで細かいことになるのですが
server = HTTPServer((host, port), Handler)
正常に動作しますが
hand=Handler() にして
server = HTTPServer((host, port),hand )
に変更すると以下のようなエラー(標記)になってしまいます。
インスタンスにしてから引数にセットするとなぜエラーになるのかわかりませんので
ご教授よろしくお願いいたします。
ソースはさらに下にあります。
(python3-toku) pi@raspberrypi:~/toku1/01-04-a1/package_parts $ python app_server.py __main__ Traceback (most recent call last): File "app_server.py", line 147, in <module> run(app) File "app_server.py", line 85, in run hand=Handler() TypeError: __init__() missing 3 required positional arguments: 'request', 'client_address', and 'server
ソース
※の部分3点を変更
python
1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3from http.server import BaseHTTPRequestHandler, HTTPServer 4import os, time 5 6import wiringpi 7from parts import Led 8 9# グローバル変数 10_application = None 11_server = None 12 13 14class Handler(BaseHTTPRequestHandler): 15 """ HTTPリクエストを処理するクラス """ 16 17 def do_GET(self): 18 """ GETメソッドによるHTTPリクエストを処理する関数 """ 19 global _application 20 if self.path == '/shutdown': 21 self._do_response('shutdown') 22 global _server 23 if _server is not None and _server.socket is not None: 24 _server.socket.close() 25 _server = None 26 return 27 if _application is not None: 28 result, response_body = _application.exec(self.path) 29 if result: 30 self._do_response(response_body) 31 else: 32 result = self._do_file_response(self.path) 33 if not result: # 上記にあてはまらない場合は対応するパスがない 34 self.send_error(404, 'File Not Found: {0}'.format(self.path)) 35 return 36 37 def _do_response(self, s): 38 """ 省略 """ 39 40 def _do_file_response(self, url_path): 41 """ 省略""" 42 43def run(app=None, host='0.0.0.0', port=8080, cam=None): 44 """ サーバー起動用関数 45 app: アプリケーション機能拡張用オブジェクト exec()メソッドが必要 46 host: 待機するIPアドレス 47 port: 待機するポート 48 cam: mjpeg_server用カメラオブジェクト start(), stop(), capture() メソッドが必要 49 """ 50 global _application 51 global _server 52 _application = app 53 hand=Handler() ※-----ここを追加 54 server = HTTPServer((host, port),hand )※-------これに変更 エラーになる 55 #server = HTTPServer((host, port), Handler)※---これをこコメントアウト 正常 56 print(time.asctime(), 'Server start - {0}:{1}'.format(host, port)) 57 try: 58 _server.serve_forever() 59 except ValueError: 60 print('remote shutdown') 61 except KeyboardInterrupt: 62 print('KeyboardInterrupt') 63 finally: 64 if _server is not None and _server.socket is not None: 65 _server.socket.close() 66 print(time.asctime(), 'Server stop - {0}:{1}'.format(host, port)) 67 68 69if __name__ == '__main__': # このファイルがスクリプトとして実行される時だけ処理を実行 70 71 print(__name__) 72 #run() 73 # -- 定数宣言 -- # 74 # LEDのGPIO番号 75 LED_PIN = 4 76 # HTTPレスポンス用HTMLデータ 77 HTML_TEXT = """ 78 <!doctype html> 79 <html> 80 <head> 81 <meta charset="UTF-8"> 82 <title>toku1/01</title> 83 </head> 84 <body> 85 <p><input type="button" value="点灯" onclick="location.href='/led/1'"></p> 86 <p><input type="button" value="消灯" onclick="location.href='/led/0'"></p> 87 <p><input type="button" value="停止" onclick="location.href='/shutdown'"></p> 88 </body> 89 </html> 90 """ 91 92 93 class Led01(Led): 94 """ app_server対応版parts.LEDクラス """ 95 96 def exec(self, path): 97 """ ルーティング処理を記述 """ 98 if path == '/led/0': 99 self.set_status(0) # LED消灯 100 elif path == '/led/1': 101 self.set_status(1) # LED点灯 102 else: 103 return False, '' 104 result_body = self.render_template() 105 return True, result_body 106 107 def render_template(self): 108 """ レンダリング処理を記述 """ 109 return HTML_TEXT 110 111 # 自作のLED01を使ったWebアプリの実行 112 wiringpi.wiringPiSetup() 113 app = Led01(LED_PIN) 114 run(app) 115 116 117 118 119
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/11 11:52