質問するログイン新規登録

回答編集履歴

4

追記

2021/07/02 16:13

投稿

sequelanonymous
sequelanonymous

スコア123

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

追記

2021/07/02 16:13

投稿

sequelanonymous
sequelanonymous

スコア123

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

修正

2021/07/02 16:08

投稿

sequelanonymous
sequelanonymous

スコア123

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
- - app.run()を定義して実行する前提の場合
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

修正

2021/07/02 16:03

投稿

sequelanonymous
sequelanonymous

スコア123

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)