Web应用和Web框架
一、Web应用
二、Web框架
三、wsgiref模块
一、Web应用
1、什么是Web应用?
Web应用程序是一种可以通过Web访问的应用程序,特点是用户很容易访问,只需要有浏览器即可,不需要安装其他软件。
2、Web应用程序的模式
应用程序有两种模式,即C/S、B/S两种,C/S是客户端/服务器端程序,这类程序一般独立运行;而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助谷歌,火狐等浏览器来运行。Web应用程序一般是B/S模式。在网络编程的意义下,浏览器是一个socket客户端,服务器是一个socket服务端。
3、实例
import socket # 导入模块 def handle_request(client):
request_data = client.recv(1024) # 接收数据
print('request data:',request_data)
client.send('HTTP/1.1 200 OK\r\n\r\n'.encode('utf8')) # 发送请求
client.send("<h1 style='color:blue'>Hello world</h1>".encode('utf8')) def main():
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 实例化
sock.bind(('localhost',8800)) # 指定连接的服务器及端口
sock.listen(5) # 监听 while True:
print('waiting....')
connection,address = sock.accept() # 收到数据
handle_request(connection) #处理连接
connection.close() # 关闭连接 if __name__ == '__main__':
main()
注意:
报文格式: 请求/响应首行
请求/响应头
请求头
请求头
... 请求/响应体(如user=cc&pwd=123)# 注意:只有POST请求才会有请求体,请求头与请求体之间使用“\r\n\r\n”进行区分,其余请求首行、请求头之间均用“\r\n”分隔 b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.134 Safari/537.36 Vivaldi/2.5.1525.40\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\n' b'POST / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive\r\nContent-Length: 15\r\nCache-Control: max-age=0\r\nOrigin: http://127.0.0.1:8080\r\nUpgrade-Insecure-Requests: 1\r\nContent-Type: application/x-www-form-urlencoded\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.134 Safari/537.36 Vivaldi/2.5.1525.40\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\nReferer: http://127.0.0.1:8080/\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\nuser=cc&pwd=123'
二、Web框架
1、什么是Web框架?
Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。
2、Web框架的特点
大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法,并且实现了许多功能,开发人员使用框架提供的方法可以更快完成自己的业务逻辑,快速开发web应用,避免反复造轮子,节省了许多时间和精力,大大提高了开发的效率。
三、wsgiref模块
1、wsgi协议
最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。如果要动态生成HTML,就需要把上述步骤自己来实现。
接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花很长时间去读HTTP规范。
正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。
这个接口就是WSGI:Web Server Gateway Interface。
wsgi协议简单理解,就是wsgi server调用wsgi application接口的约定,即当有个请求到达wsgi server时,wsgi server通过调用wsgi application提供的接口来处理这个请求。
2、wsgiref模块
wsgiref模块就是python基于wsgi协议开发的服务模块。wsgiref模块是由server和handler组成,server用于监听端口,接收请求;handler用于处理请求。
3、wsgiref简单示例
#!/usr/bin/env python3
#!-*- coding:utf-8-*-
# write by cc from wsgiref.simple_server import make_server def application(environ,start_response):
# environ : 按照http协议解析数据,解析后的数据格式为字典
# start_response : 按照http协议的格式组装数据
print(environ,type(environ)) # <class 'dict'>
# return [b"<h1>Hello Web</h1>"] # 返回的格式必须是列表,内容必须是二进制数据
path = environ.get("PATH_INFO") # 获取当前路径
start_response('200 Ok',[('Content_Type','text/html')]) #
if path == '/index':
with open('index.html','r') as f:
data = f.read()
elif path == '/login':
with open('login.html','r') as f:
data = f.read() return [data.encode('utf-8')] '''
environ = {'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\CC9102\\AppData\\Roaming', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'DESKTOP-3UMV17V', 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer', 'FPS_BROWSER_USER_PROFILE_STRING': 'Default', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\CC9102', 'LOCALAPPDATA': 'C:\\Users\\CC9102\\AppData\\Local', 'LOGONSERVER': '\\\\DESKTOP-3UMV17V', 'NUMBER_OF_PROCESSORS': '4', 'ONEDRIVE': 'C:\\Users\\CC9102\\OneDrive', 'ONEDRIVECONSUMER': 'C:\\Users\\CC9102\\OneDrive', 'OS': 'Windows_NT', 'PATH': 'D:\\python37\\;D:\\python37\\Scripts\\;D:\\python27\\;D:\\python27\\Scripts;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;D:\\UltraEdit;D:\\Calibre\\;C:\\Users\\CC9102\\AppData\\Local\\Microsoft\\WindowsApps;D:\\Bandizip\\', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 61 Stepping 4, GenuineIntel', 'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '3d04', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMFILES': 'C:\\Program Files', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'PROGRAMW6432': 'C:\\Program Files', 'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules', 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM_HOSTED': '1', 'PYTHONIOENCODING': 'UTF-8', 'PYTHONPATH': 'E:\\PyCharmFiles', 'PYTHONUNBUFFERED': '1', 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\Windows', 'TEMP': 'C:\\Users\\CC9102\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\CC9102\\AppData\\Local\\Temp', 'USERDOMAIN': 'DESKTOP-3UMV17V', 'USERDOMAIN_ROAMINGPROFILE': 'DESKTOP-3UMV17V', 'USERNAME': 'CC9102', 'USERPROFILE': 'C:\\Users\\CC9102', 'WINDIR': 'C:\\Windows', 'SERVER_NAME': 'DESKTOP-3UMV17V.DHCP HOST', 'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '8080', 'REMOTE_HOST': '', 'CONTENT_LENGTH': '', 'SCRIPT_NAME': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.2', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/', 'QUERY_STRING': '', 'REMOTE_ADDR': '127.0.0.1', 'CONTENT_TYPE': 'text/plain', 'HTTP_HOST': '127.0.0.1:8080', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.134 Safari/537.36 Vivaldi/2.5.1525.40', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9', 'wsgi.input': <_io.BufferedReader name=468>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>, 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>} <class 'dict'> 'PATH_INFO': '/', 'QUERY_STRING': '', 'REMOTE_ADDR': '127.0.0.1',
'CONTENT_TYPE': 'text/plain',
'HTTP_HOST': '127.0.0.1:8080',
'HTTP_CONNECTION': 'keep-alive',
''' # 封装socket(实例化一个socket对象,并传入参数)
httped = make_server("",8080,application) # 等待用户连接,相当于 conn,addr = sock.accept(),用户连接后自动调用application方法
httped.serve_forever()
这个实例程序可以看作是一个Web框架,它的实现过程就是这样几步:
第一步,写一个Web应用(application),即wsgiref application,除了函数,也可以是类(flask),参数为 environ和start_response;
第二步,通过封装socket,创建一个httped服务器,并监听8080端口(可随机指定,不与其他程序端口冲突即可),等待用户连接;
第三步,当有客户端请求时得到匹配,即用户输入对应网址时,在浏览器显示对应的页面。
注意两点:
第一点:environ为一个字典,保存系统变量以及请求相关属性,例如请求路径,请求参数,请求方法等等;start_response为函数,设置response的状态码和header,然后application函数的返回值为response的body。
第二点:response状态码设置为200时,表示请求成功,在headers添加返回数据类型为text/html,返回的数据必须为二进制字符串。
Web应用和Web框架的更多相关文章
- 关于web开发前端h5框架的选择
关于web开发前端h5框架的选择 看了很多移动版框架都是基于app混合式开发的,不是单独h5网站的基于h5开发的web框架从组件丰富度,兼容性,相关教程来说bootstrap还是最好的react和vu ...
- java DI 框架spring(web)、Guice(web)、Dagger&Dagger2(android)
java DI 框架spring(web).Guice(web).Dagger&Dagger2(android) (待续...)
- jQuery Mobile 是创建移动 web 应用程序的框架。
jQuery Mobile jQuery Mobile 是创建移动 web 应用程序的框架. jQuery Mobile 适用于所有流行的智能手机和平板电脑. jQuery Mobile 使用 HTM ...
- PHP做Web开发的MVC框架(Smarty使用说明 )
PHP做Web开发的MVC框架(Smarty使用说明 ) 一.Smarty简明教程 1.安装演示 下载最新版本的Smarty-3.1.12,然后解压下载的文件.接下来演示Smarty自带的demo例子 ...
- 将web容器置于OSGi框架下进行web应用的开发
将web容器置于OSGi框架下,其实就是将web容器做成OSGi支持的Bundle,再安装到OSGi框架中,这里使用的是Jetty容器. 1.创建一个Eclipse插件项目,在此插件下创建一个WebR ...
- Java开发工程师(Web方向) - 04.Spring框架 - 第2章.IoC容器
第2章.IoC容器 IoC容器概述 abstract: 介绍IoC和bean的用处和使用 IoC容器处于整个Spring框架中比较核心的位置:Core Container: Beans, Core, ...
- Web应用渗透测试框架Arachni
Web应用渗透测试框架Arachni Arachni是一款Ruby语言编写的Web应用渗透测试框架.当用户指定目标后,该框架可以自动扫描网站页面,对页面中的链接.表单.Cookie.HTTP He ...
- Java Web学习总结(28)——Java Web项目MVC开源框架SSH和SSM比较
SSH和SSM定义 SSH 通常指的是 Struts2 做控制器(controller),spring 管理各层的组件,hibernate 负责持久化层. SSM 则指的是 SpringMVC 做控制 ...
- web开发-MVC IoC 框架(转)
随着Web应用的商业逻辑包含逐渐复杂的公式分析计算.决策支持等,使客户机越 来越不堪重负,因此将系统的商业分离出来.单独形成一部分,这样三层结构产生了. 其中‘层’是逻辑上的划分. 三层体系结构是将整 ...
- Web前端三大主流框架是什么?Web前端前景与就业形势
近十年以来,IT行业发展火热,衍生了很多新职业,例如UI设计师.开发工程师.软件测试工程师等等,在众多备受瞩目的新生职业中,Web前端工程师是其中的一员.那么Web前端三大主流框架是什么呢? 一.We ...
随机推荐
- Monkey框架(基础知识篇) - monkey启动与参数介绍
一.monkey启动 直接PC启动:> adb shell monkey [options] <count> shell 端启动:> adb shell >monkey ...
- Hadoop综合大作业1
本次作业来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3363 一.课程评分标准: 分数组成: 考勤 10 平时作业 30 爬 ...
- [转]Windows内存堆内容整理总结
在系统安全研究中,堆,是一个极其重要的内存区域以及研究的热点.堆,区别于栈区.全局数据区以及代码区,它的主要作用是允许程序在运行时动态地申请某个大小的内存空间.本文将从宏观到微观,简单梳理总结一下Wi ...
- MySQL8.0项目启动遇到的问题
写在前面 看到jeecg论坛更新了jeecg-boot版本, 比较新颖的技术都有, down代码, 执行sql脚本, 起项目, 本来是一气呵成的事儿遇到了两个问题, 做个记录. 环境: IDEA201 ...
- ora-8176原因及解决方法
在oracle undo_retention范围内,且_undo_autotune=false的情况下,一个语句执行的时候仍然发生ora-8176,语句如下: INSERT INTO XXX SELE ...
- 如何解决“HttpException (0x80004005): 超过了最大请求长度”问题
.net mvc项目在做上传文件时,出现这个问题,上传文件的是通过表单提交,后台是通过请求里面获取文件信息的 1.问题截图: 堆栈信息 “/”应用程序中的服务器错误.超过了最大请求长度.说明: 执行当 ...
- Intellij idea 告警:URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)
URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs) 一.快捷键方式 鼠标移动到出错的的地方 ...
- 《精通CSS第3版》(6)内容布局(定位+水平布局)
- <img>的title和Alt有什么区别?
Alt是<img>的特有属性,是图片内容的等价描述,用于图片无法加载时显示,读屏器阅读图片. title 可提高图片高可访问性,除了纯装饰图片外都必须设置有意义的值,搜索引擎会重点分析.鼠 ...
- js 秒的倒计时,将秒转换为时分秒显示
在VUE 中的使用 {{moveMin}} // ...methods: { // 补0 formatBit (val) { val = +val ? val : ' + val }, // 秒转时分 ...