回答編集履歴
4
追記
answer
CHANGED
|
@@ -53,7 +53,6 @@
|
|
|
53
53
|
> アプリケーション側は、このコールバック用callableオブジェクトを呼び出すことでステータスコードとレスポンスヘッダをサーバ側に伝え、さらに本文を生成するiterableオブジェクト(イテレータやリストなど)を戻り値として返す。
|
|
54
54
|
> サーバ側は、これらを用いてクライアントへのレスポンスを生成する。
|
|
55
55
|
|
|
56
|
-
|
|
57
56
|
- [WSGIアプリケーションとは?WebフレームワークからWSGIサーバーまで](https://blog.hirokiky.org/entry/2018/09/30/183840)
|
|
58
57
|
> PythonのWebアプリケーションは WSGI という仕様に則って開発されています。 WSGIに則って作られたWebアプリケーション(WSGIアプリケーション)は、WSGIの仕様に則ったサーバー(WSGIサーバー)上で動作させられます。
|
|
59
58
|
|
|
@@ -69,4 +68,6 @@
|
|
|
69
68
|
|
|
70
69
|
- [gunicornでPython製Webアプリケーションを動作させよう(DjangoとFlask)](https://blog.hirokiky.org/entry/2018/10/06/151830)
|
|
71
70
|
|
|
72
|
-
> FlaskでWebアプリケーションを作った場合、 app = Flask(...) でインスタンス化した app 自体がWSGIアプリケーションです。 例えば myapp.py というファイル内に app という名前でFlaskアプリケーションがある場合、以下のように gunicorn で起動できます。
|
|
71
|
+
> FlaskでWebアプリケーションを作った場合、 app = Flask(...) でインスタンス化した app 自体がWSGIアプリケーションです。 例えば myapp.py というファイル内に app という名前でFlaskアプリケーションがある場合、以下のように gunicorn で起動できます。
|
|
72
|
+
|
|
73
|
+
- [http.server](https://docs.python.org/3/library/http.server.html#module-http.server)
|
3
追記
answer
CHANGED
|
@@ -39,4 +39,34 @@
|
|
|
39
39
|
start_response('200 OK', [('Content-Type', 'text/plain')])
|
|
40
40
|
body = f"Method was {environ['REQUEST_METHOD']}"
|
|
41
41
|
return [body.encode('utf-8')]
|
|
42
|
-
```
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
=======
|
|
45
|
+
参考になったURL
|
|
46
|
+
- [Web_Server_Gateway_Interfaceのwikipedia](https://ja.wikipedia.org/wiki/Web_Server_Gateway_Interface)
|
|
47
|
+
> WSGIには二つの側 — サーバ側とアプリケーション側が存在する。WSGIは、リクエスト情報・レスポンスヘッダ・レスポンス本文を、両者の間でどのようにやりとりするかをPythonのAPIとして定義している。
|
|
48
|
+
>
|
|
49
|
+
> Webサーバにリクエストが来ると、次のような流れでやりとりが行なわれる:
|
|
50
|
+
>
|
|
51
|
+
> サーバ側が、クライアントからリクエストを受ける。
|
|
52
|
+
> サーバ側は、アプリケーション側がエントリポイントとして提供するcallableオブジェクト(関数やクラスインスタンスなど __call__ が定義されたオブジェクト)を呼び出して、その引数として環境変数と1つのコールバック用callableオブジェクトを渡す。
|
|
53
|
+
> アプリケーション側は、このコールバック用callableオブジェクトを呼び出すことでステータスコードとレスポンスヘッダをサーバ側に伝え、さらに本文を生成するiterableオブジェクト(イテレータやリストなど)を戻り値として返す。
|
|
54
|
+
> サーバ側は、これらを用いてクライアントへのレスポンスを生成する。
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
- [WSGIアプリケーションとは?WebフレームワークからWSGIサーバーまで](https://blog.hirokiky.org/entry/2018/09/30/183840)
|
|
58
|
+
> PythonのWebアプリケーションは WSGI という仕様に則って開発されています。 WSGIに則って作られたWebアプリケーション(WSGIアプリケーション)は、WSGIの仕様に則ったサーバー(WSGIサーバー)上で動作させられます。
|
|
59
|
+
|
|
60
|
+
> environ: HTTPリクエストの情報(ヘッダーの値など)
|
|
61
|
+
> start_response: HTTPレスポンスのコード、返すヘッダーを指定して呼び出すための関数
|
|
62
|
+
> 戻り値: HTTPのボディーになるバイト型のイテラブル
|
|
63
|
+
|
|
64
|
+
> ブラウザー: HTTPでサーバーと通信する
|
|
65
|
+
> WSGIサーバー: HTTPの解釈、WSGIアプリケーションを呼び出し、結果をHTTPで返すサーバー
|
|
66
|
+
> WSGIアプリケーション: 上記仕様でHTTPの内容を返すPythonの呼び出し可能オブジェクト
|
|
67
|
+
> (Python)Webフレームワーク: Viewなど一部の処理を書くだけでWebアプリケーションが作れるPythonパッケージ
|
|
68
|
+
> ユーザーの書いたViewなどを読み込んで、WSGIアプリケーションとして動作する
|
|
69
|
+
|
|
70
|
+
- [gunicornでPython製Webアプリケーションを動作させよう(DjangoとFlask)](https://blog.hirokiky.org/entry/2018/10/06/151830)
|
|
71
|
+
|
|
72
|
+
> FlaskでWebアプリケーションを作った場合、 app = Flask(...) でインスタンス化した app 自体がWSGIアプリケーションです。 例えば myapp.py というファイル内に app という名前でFlaskアプリケーションがある場合、以下のように gunicorn で起動できます。
|
2
修正
answer
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
- flask runで起動するwerkzeug(simple_runをつかう)の場合、[ここ](https://github.com/pallets/werkzeug/blob/f7b53ee8a81f015c6c85659959004328237a3c8c/src/werkzeug/serving.py#L293)
|
|
7
7
|
- CPythonにあるwsgirefのsimple_serverのmake_serverをつかってPython xx.pyで起動する場合、[ここ](https://github.com/python/cpython/blob/bb3e0c240bc60fe08d332ff5955d54197f79751c/Lib/wsgiref/handlers.py#L225)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
=======
|
|
10
|
-
flask runの補足:
|
|
10
|
+
flask runで起動する場合の補足:
|
|
11
11
|
- host, port指定していない場合、127.0.0.1と5000が設定されるとこ、[ここ](https://github.com/pallets/flask/blob/ba6db2e30783f81673bb8a6b5218f7bb8efa8f27/src/flask/app.py#L905)
|
|
12
12
|
|
|
13
13
|
- werkzeugからsimple_runをimportしてるの[ここ](https://github.com/pallets/flask/blob/ba6db2e30783f81673bb8a6b5218f7bb8efa8f27/src/flask/app.py#L920)
|
|
@@ -20,6 +20,23 @@
|
|
|
20
20
|
|
|
21
21
|
- CPythonでHTTPServerが定義されている箇所、[ここ](https://github.com/python/cpython/blob/17b16e13bb444001534ed6fccb459084596c8bcf/Lib/http/server.py#L132)
|
|
22
22
|
|
|
23
|
-
python xx.pyの補足:
|
|
23
|
+
simple_serverをつかってpython xx.pyで起動する場合の補足:
|
|
24
24
|
- werkzeugと同様、simple_serverでもCPython内で定義されたHTTPServerが利用されてる
|
|
25
|
+
|
|
26
|
+
=======
|
|
27
|
+
混乱しそうなポイント:
|
|
25
|
-
|
|
28
|
+
app.run()は、フレームワークを利用してappをつくらないといけない。
|
|
29
|
+
ex) app = Flask(__name__)
|
|
30
|
+
pythonのみで起動するには、標準モジュールのwsgirefのutility郡を利用する。
|
|
31
|
+
|
|
32
|
+
もしくは、wsgiサーバーで下記のような感じでよんであげる。
|
|
33
|
+
wsgi_appというcallableなオブジェクトを指定してgunicorn側でよぶ。
|
|
34
|
+
```python
|
|
35
|
+
# app.py
|
|
36
|
+
# gunicorn app:wsgi_app
|
|
37
|
+
# curl http://localhost:8000
|
|
38
|
+
def wsgi_app(environ, start_response):
|
|
39
|
+
start_response('200 OK', [('Content-Type', 'text/plain')])
|
|
40
|
+
body = f"Method was {environ['REQUEST_METHOD']}"
|
|
41
|
+
return [body.encode('utf-8')]
|
|
42
|
+
```
|
1
修正
answer
CHANGED
|
@@ -21,6 +21,5 @@
|
|
|
21
21
|
- CPythonでHTTPServerが定義されている箇所、[ここ](https://github.com/python/cpython/blob/17b16e13bb444001534ed6fccb459084596c8bcf/Lib/http/server.py#L132)
|
|
22
22
|
|
|
23
23
|
python xx.pyの補足:
|
|
24
|
+
- werkzeugと同様、simple_serverでもCPython内で定義されたHTTPServerが利用されてる
|
|
24
|
-
app.run()を定義して実行する前提の場合。
|
|
25
|
+
- app.run()を定義して実行する前提の場合。
|
|
25
|
-
|
|
26
|
-
HTTPserverでリクエストをうけつけてるの[ここ](https://github.com/python/cpython/blob/bb3e0c240bc60fe08d332ff5955d54197f79751c/Lib/http/server.py#L132)
|