服务器动态资源请求

1. 浏览器请求动态页面过程

2. WSGI

怎么在你刚建立的Web服务器上运行一个Django应用Flask应用,如何不做任何改变而适应不同的web架构呢?

在以前,选择 Python web 架构会受制于可用的web服务器,反之亦然。如果架构和服务器可以协同工作,那就好了:

但有可能面对(或者曾有过)下面的问题,当要把一个服务器和一个架构结合起来时,却发现他们不是被设计成协同工作的:

那么,怎么可以不修改服务器和架构代码而确保可以在多个架构下运行web服务器呢?答案就是 Python Web Server Gateway Interface (或简称 WSGI,读作“wizgy”)。

WSGI允许开发者将选择web框架和web服务器分开。可以混合匹配web服务器和web框架,选择一个适合的配对。比如,可以在Gunicorn 或者 Nginx/uWSGI 或者 Waitress上运行 Django, Flask, 或 Pyramid。真正的混合匹配,得益于WSGI同时支持服务器和架构:

web服务器必须具备WSGI接口,所有的现代Python Web框架都已具备WSGI接口,它让你不对代码作修改就能使服务器和特点的web框架协同工作。

WSGI由web服务器支持,而web框架允许你选择适合自己的配对,但它同样对于服务器和框架开发者提供便利使他们可以专注于自己偏爱的领域和专长而不至于相互牵制。其他语言也有类似接口:java有Servlet API,Ruby 有 Rack。

3.定义WSGI接口

WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求。我们来看一个最简单的Web版本的“Hello World!”:

def application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])return 'Hello World!'

上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:

  • environ:一个包含所有HTTP请求信息的dict对象;
  • start_response:一个发送HTTP响应的函数。

整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,把底层web服务器解析部分和应用程序逻辑部分进行了分离,这样开发者就可以专心做一个领域了

不过,等等,这个application()函数怎么调用?如果我们自己调用,两个参数environ和start_response我们没法提供,返回的str也没法发给浏览器。

所以application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器。而我们此时的web服务器项目的目的就是做一个极可能解析静态网页还可以解析动态网页的服务器

接下来是我写的服务器+框架:

服务器:MyWebServer.py

#-*-coding:utf-8-*-
import sys
import re
from socket import *
from multiprocessing import Process
from My_Web_Framework import Application#设置静态文件根目录
HTTP_ROOT_DIR = "./html"WSGI_PYTHON_DIR = "./wsgipython"class HTTPServer(object):''''''def __init__(self, application):"""构造函数,application是框架函数"""self.app = applicationself.tcp_socket = socket(AF_INET, SOCK_STREAM)self.tcp_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)def start(self):self.tcp_socket.listen(128)while True:try:cli_socket, addrs = self.tcp_socket.accept()print("%s  %s:用户已连接" % (addrs[0], addrs[1]))p = Process(target=self.handle_client, args=(cli_socket,))p.start()cli_socket.close()except:print("服务器已经关闭")cli_socket.close()tcp_socket.close()def start_response(self, status, headers):self.response_start = "HTTP/1.1 " + status + "\r\n"server_headers = ""for header in headers:server_headers += "%s: %s\r\n"%headerself.response_headers = server_headersdef handle_client(self,cli_socket):# 接收数据request_data = cli_socket.recv(1024)# 解析HTTP报文协议 request_dataprint("requst_data:", request_data)# 处理响应数据request_lines = request_data.splitlines()print(request_lines)request_da = request_lines[0]# 获取用户想要的请求名file_name = re.match(r"\w+ +(/[^ ]*) ", request_da.decode("utf-8")).group(1)#method = re.match(r"\w+ +/[^ ]* ", request_da.decode("utf-8")).group(1)env = {"PATH_INFO": file_name#"METHOD": method}response_body = self.app(env, self.start_response)response_start_line = self.response_startresponse_header = self.response_headersresponse = response_start_line + response_header + "\r\n" + response_body# 发送数据cli_socket.send(bytes(response, "utf-8"))# cli_socket.send(response)# 关闭套接字cli_socket.close()print("链接已经断开")def bind(self, port):self.tcp_socket.bind(port)def main():sys.path.insert(1,WSGI_PYTHON_DIR)if len(sys.argv) < 2:sys.exit("python MyWebServer.py Module:app")# 适应性导入# python MyWebServer.py My_Web_Framework:appmodule_name, app_name = sys.argv[1].split(":")# module_name = "My_Web_Framework"# app_name = "app"# 动态导入模块m = __import__(module_name)app = getattr(m, app_name)http_server = HTTPServer(app)http_server.bind(("",8000))http_server.start()if __name__ == '__main__':main()

框架My_Web_Framework.py

import time# from MyWebServer import HTTPServerHTTP_ROOT_DIR = "./html"class Application(object):""""""def __init__(self, urls):self.urls = urlsdef __call__(self, env, start_response):#路由分发path = env.get("PATH_INFO", "/")print(path)if path.startswith("/static"):# 要访问静态文件 访问方式为ip:端口/static/index.htmlfile_name = path[7:]try:f = open(HTTP_ROOT_DIR + file_name, "rb")file_data = f.read()f.close()except IOError:start_response("404 Not Found", [])return "Not Found"else:# 构造响应数据status = "200 OK"response_header = [("Server","My server")]start_response(status,response_header)return file_data.decode("utf-8")else:for url, handler in self.urls:print(url, " ", path,"\n**************\n")if path == url:return handler(env, start_response)start_response("404 Not Found", [])return "Not Found"def show_ctime(env, start_response):status = "200 OK"headers = [("Content", "text/plain")]start_response(status, headers)return time.ctime()urls = [("/", show_ctime),("/ctime", show_ctime)
]
app = Application(urls)
# if __name__ == "__main__":
#     urls = [
#         ("/", show_ctime),
#         ("/ctime", show_ctime)
#     ]
#     app = Application(urls)
#     http_server = HTTPServer(app)
#     http_server.bind(("", 8000))
#     http_server.start()

动态服务器以及WSGI相关推荐

  1. Python实现web动态服务器

    Python实现http动态服务器,有两种方法,一种是基本的实现方式,可扩展性差,但是是实现服务器的基础,第二种实现不修改服务器和架构代码而确保可以在多个架构下运行web服务器.都使用WSGI(Web ...

  2. asp(动态服务器页面)

    asp(动态服务器页面) ASP即Active Server Pages,是MicroSoft公司开发的服务器端脚本环境,可用来创建动态交互式网页并建立强大的web应用程序. 当服务器收到对ASP文件 ...

  3. 服务器动态文档,动态服务器网页.ppt

    动态服务器网页 修改 删除 记录总数: 当前页:/ 页大小: 首页 ">上页 ">下页 ">末页 " size=2> 综合实例1:聊天室 ...

  4. 页面动态显示服务器,动态服务器页面应用

    动态服务器页面应用 内容精选 换一换 您已经完成了游戏应用的部署.节点和应用运行过程中会产生费用,建议您参照本章节创建应用后,删除应用和节点,避免费用产生.登录CCE控制台.单击左侧导航栏的工作负载 ...

  5. 服务器与wsgi协议,wsgi

    Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口.自 ...

  6. python web开发 网络编程 HTTP协议、Web服务器、WSGI接口

    文章目录 1. HTTP协议 2. Web服务器 3. 静态服务器 创建 web_server.py 4. WSGI 接口 4.1 CGI 通用网关接口 4.2 WSGI 4.3 定义 WSGI 接口 ...

  7. 网络动态服务器-2-传递数据给应用

    #coding=utf-8 import socket import sys from multiprocessing import Process import reclass WSGIServer ...

  8. 微信小程序实现运动步数排名与发布个人动态服务器部署

    1. 项目规划 本项目为基于微信手机应用平台的一款运动互动型小程序,实现了用户即时运动步数群内PK与个人动态的发布,小程序前端采用原生框架,后端采用基于Node的koa2框架,数据库采用MYSQL,对 ...

  9. ae稳定不能获取动态服务器,ae 获取动态链接服务器超时

    ae 获取动态链接服务器超时 内容精选 换一换 IPv6的使用,可以有效弥补IPv4网络地址资源有限的问题.如果当前云服务器使用IPv4,那么启用IPv6后,云服务器可在双栈模式下运行,即云服务器可以 ...

最新文章

  1. 【网络爬虫】(1) 网络请求,urllib库介绍
  2. 类加载器双亲委派模式
  3. 一文读懂MySQL事务锁、事务级别
  4. java基础(网络编程---IP、端口、URL)
  5. 装X数学:高雅的数学表示
  6. 洛谷 P2853 [USACO06DEC]Cow Picnic S-dfs
  7. 概率论公式,你值得拥有
  8. 精美在线课程教育学习培训平台网站模板源码 HTML纯静态
  9. 基于Nginx反向代理及负载均衡
  10. JS中移动端项目取余数和switch于PC端的不同
  11. atitit.thumb生成高质量缩略图 php .net c++ java
  12. Excel在统计分析中的应用—第五章—统计指数-Part3- 综合指数(现期加权指数(帕氏指数))
  13. s5p6818/fs4418系统移植实验二 安装fastboot驱动
  14. 登录验证时第一次帐号密码错误,第二次提交出现错误404,Could not find action or result: /zyf_shop/user_login.action
  15. WiFi模块种类二:单WiFi功能双频WiFi模块
  16. C语言使用socket通过IP138获取外网IP
  17. 华为BLM是什么?有什么用?怎么用?三张图就说清楚了
  18. 吞吐量(TPS)、QPS、并发数、响应时间(RT)说明
  19. 视觉组考核——装甲板识别
  20. 一、旋转矩阵,旋转向量,单位四元数的相互转换总结

热门文章

  1. NYOJ-491 幸运三角形
  2. C# Repeater根据条件后台设置前台行背景色
  3. 笨办法学R编程(1)
  4. 购买笔记本不得不说的11点应用技巧
  5. 什么是DataV数据可视化?
  6. NPM包管理器跟换国内镜像CNPM
  7. Spring Data MongoDB示例
  8. 安卓加java完成登录_从零学习安卓自动化(java+appium方向):完成登录操作+一个主流程(四)...
  9. LeetCode刷题 --杂篇 --数组,链表,栈,队列
  10. 【Day07】v-model 是如何实现的,语法糖实际是什么?