Flask之WSGI:Werkzeug

本文介绍了WSGI(Web Server Gateway Interface)的基本概念,解释了它如何作为一个标准接口,使得Web应用程序能够与Web服务器通信。通过示例展示了WSGI应用程序的简单结构,并提到了使用Python内置WSGI服务器的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WSGI

一个Web应用的本质就是:

  1. 浏览器发送一个HTTP请求;

  2. 服务器收到请求,生成一个HTML文档;

  3. 服务器把HTML文档作为HTTP响应的Body发送给浏览器;

  4. 浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。

如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,首先得花个把月去读HTTP规范。

正确的做法是底层代码由专门的服务器软件实现,我们专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心编写Web业务。

这个接口就是WSGI:Web Server Gateway Interface。

接口对应的实现函数应包括两个参数:

  • environ:一个包含所有HTTP请求信息的dict对象;

  • start_response:一个发送HTTP响应的函数。

例子:

 

其中 start_response发送两个参数:1、字符串:http状态码;2、列表:由HTTP Header组成的元组列表

最后返回为body正文内容。

用python内置的wsgi服务器运行:

 

 

Werkzeug 

 参考  http://werkzeug.pocoo.org/docs/0.14/tutorial/#step-3-the-environment

其url和视图被flask框架进行封装,将在flask框架中进行学习。

转载于:https://www.cnblogs.com/brendy/p/9664554.html

* Running on http://198.18.0.1:5000 2025-07-18 02:13:19,215 - werkzeug - INFO - Press CTRL+C to quit 2025-07-18 02:13:19,659 - werkzeug - INFO - 127.0.0.1 - - [18/Jul/2025 02:13:19] "GET /login HTTP/1.1" 200 - 2025-07-18 02:13:23,659 - admin.app - ERROR - Exception on /login [POST] Traceback (most recent call last): File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 1511, in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 919, in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 917, in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 902, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "F:\tg\pyCharm\直播bot\render_template\admin\app.py", line 42, in login return redirect(url_for("home")) ^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\helpers.py", line 232, in url_for return current_app.url_for( ^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 1121, in url_for return self.handle_url_build_error(error, endpoint, values) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 1110, in url_for rv = url_adapter.build( # type: ignore[union-attr] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\werkzeug\routing\map.py", line 924, in build raise BuildError(endpoint, values, method, self) werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'home'. Did you mean 'members' instead? 2025-07-18 02:13:23,668 - admin.app - ERROR - Server error: 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application. 2025-07-18 02:13:23,669 - werkzeug - INFO - 127.0.0.1 - - [18/Jul/2025 02:13:23] "POST /login HTTP/1.1" 500 - 2025-07-18 02:13:23,690 - werkzeug - ERROR - Error on request: Traceback (most recent call last): File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 1511, in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 919, in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 917, in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 902, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "F:\tg\pyCharm\直播bot\render_template\admin\app.py", line 42, in login return redirect(url_for("home")) ^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\helpers.py", line 232, in url_for return current_app.url_for( ^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 1121, in url_for return self.handle_url_build_error(error, endpoint, values) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 1110, in url_for rv = url_adapter.build( # type: ignore[union-attr] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\werkzeug\routing\map.py", line 924, in build raise BuildError(endpoint, values, method, self) werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'home'. Did you mean 'members' instead? During handling of the above exception, another exception occurred: Traceback (most recent call last): File "f:\tg\pyCharm\.venv\Lib\site-packages\werkzeug\serving.py", line 370, in run_wsgi execute(self.server.app) File "f:\tg\pyCharm\.venv\Lib\site-packages\werkzeug\serving.py", line 331, in execute application_iter = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 1536, in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 1514, in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\app.py", line 860, in handle_exception server_error = self.ensure_sync(handler)(server_error) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "F:\tg\pyCharm\直播bot\render_template\admin\app.py", line 240, in internal_server_error return render_template("500.html"), 500 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\templating.py", line 149, in render_template template = app.jinja_env.get_or_select_template(template_name_or_list) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\jinja2\environment.py", line 1084, in get_or_select_template return self.get_template(template_name_or_list, parent, globals) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\jinja2\environment.py", line 1013, in get_template return self._load_template(name, globals) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\jinja2\environment.py", line 972, in _load_template template = self.loader.load(self, name, self.make_globals(globals)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\jinja2\loaders.py", line 126, in load source, filename, uptodate = self.get_source(environment, name) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\templating.py", line 65, in get_source return self._get_source_fast(environment, template) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "f:\tg\pyCharm\.venv\Lib\site-packages\flask\templating.py", line 99, in _get_source_fast raise TemplateNotFound(template) jinja2.exceptions.TemplateNotFound: 500.html
最新发布
07-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值