1. Web开发

CS即客户端、服务器编程。客户端、服务端之间需要使用Socket,约定协议、版本(往往使用的协议是TCP或者UDP),指定地址和端口,就 可以通信了。 客户端、服务端传输数据,数据可以有一定的格式,双方必须先约定好。

BS编程,即Browser、Server开发。Browser浏览器,一种特殊的客户端,支持HTTP(s)协议,能够通过URL向服务端发起请求,等待服务端返回HTML 等数据,并在浏览器内可视化展示的程序。 Server,支持HTTP(s)协议,能够接受众多客户端发起的HTTP协议请求,经过处理,将HTML等数据返回给浏览 器。

本质上来说,BS是一种特殊的CS,即客户端必须是一种支持HTTP协议且能解析并渲染HTML的软件,服务端必须是能够接收多客户端HTTP访问的服务器软件。 HTTP协议底层基于TCP协议实现。

BS开发分为两端开发:

  • 客户端开发,或称前端开发。HTML、CSS、JavaScript等
  • 服务端开发,Python有WSGI、Django、Flask、Tornado等

2.HTTP协议

2.1 无状态、有连接和短连接

无状态:指的是服务器无法知道2次请求之间的联系,即使是前后2次同一个浏览器也没有任何数据能够判断出是同 一个浏览器的请求。后来可以通过cookie、session来判断。有连接:是因为它基于TCP协议,是面向连接的,需要3次握手、4次断开。 短连接:Http 1.1之前,都是一个请求一个连接,而Tcp的连接创建销毁成本高,对服务器有很大的影响。所以, 自Http 1.1开始,支持keep-alive,默认也开启,一个连接打开后,会保持一段时间(可设置),浏览器再访问该 服务器就使用这个Tcp连接,减轻了服务器压力,提高了效率。

Http协议是无状态协议。同一个客户端的两次请求之间没有任何关系,从服务器端角度来说,它不知道这两个请求来自同一个客户端。

2.2 URL

URL可以说就是地址,uniform resource locator 统一资源定位符,每一个链接指向一个资源供客户端访问。schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]

scheme 模式、协议:http、ftp、https、fifile、mailto等等。host:port :www.baidu.com:80 ,80端口是默认端口可以不写。域名会使用DNS解析,域名会解析成IP才能使用。实际上会对解析后返回的IP的TCP的80端口发起访问。/path/to/resource:path,指向资源的路径。?key1=value1&key2=value2: query string,查询字符串,问号用来和路径分开,后面key=value形式,且使用&符号分割。

2.3 HTTP消息

消息分为Request、Response。Request:浏览器向服务器发起的请求 Response:服务器对客户端请求的响应。

  • 请求报文由Header消息报头、Body消息正文组成(可选):请求报文第一行称为请求行
  • 响应报文由Header消息报头、Body消息正文组成(可选) :响应报头第一行称为状态行
  • 每一行使用回车和换行符作为结尾
  • 如果有Body部分,Header、Body之间留一行空行

请求报文:

  • 请求消息行:请求方法Method 请求路径 协议版本CRLF
  • 请求方法Method:GET、POST、HEAD

常见的传递信息的方式:

  1. GET方法使用Query String :通过查询字符串在URL中传递参数,而URL在请求报文的头部的第一行;例如:http://www.baidu.com?name=刘亦菲&age=33
  2. POST方法提交数据:请求时提交的数据是在请求报文的正文Body部分。
  3. URL中本身就包含着信息:http://www.python.org/downloads/release/python-374/

响应报文:

  • 响应消息行:协议版本 状态码 消息描述CRLF
  • status code状态码:状态码在响应报文header部分(响应头)的第一行;

2.4 cookie技术

  • 键值对信息
  • 是一种客户端、服务器端传递数据的技术
  • 一般来说cookie信息是在服务器端生成,返回给浏览器端的
  • 浏览器端可以保持这些值,浏览器对同一域发起每一请求时,都会把Cookie信息发给服务器端
  • 服务端收到浏览器端发过来的Cookie,处理这些信息,可以用来判断这次请求是否和之前的请求有关联

曾经Cookie唯一在浏览器端存储数据的手段,目前浏览器端存储数据的方案很多,Cookie正在被淘汰。当服务器收到HTTP请求时,服务器可以在响应头里面添加一个Set-Cookie键值对。浏览器收到响应后通常会保存这些Cookie,之后对该服务器每一次请求中都通过Cookie请求头部将Cookie信息发送给服务器。另外,Cookie的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。可以使用 Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE

cookie的缺点:

  • Cookie一般明文传输(Secure是加密传输),安全性极差,不要传输敏感数据
  • 有4kB大小限制
  • 每次请求中都会发送Cookie,增加了流量。

2.5 session技术

WEB 服务器端,尤其是动态网页服务端Server,有时需要知道浏览器方是谁?但是HTTP是无状态的,怎么办?

服务端会为每一次浏览器端第一次访问生成一个SessionID,用来唯一标识该浏览器,通过Set-Cookie发送到浏览器端浏览器端收到之后并不永久保持这个Cookie,只是会话级的。浏览器访问服务端时,会使用Cookie,也会带上这 个SessionID的Cookie值。

服务端会维持这个SessionID一段时间,如果超时,会清理这些超时没有人访问的SessionID。如果浏览器端发来的 SessionID无法在服务端找到,就会自动再次分配新的SessionID,并通过Set-Cookie发送到浏览器端以覆盖原有的 存在浏览器中的会话级的SessionID。

3.WSGI

wsgi(Web Server Gateway Interface) 主要规定了服务器端和应用程序间的接口。

3.1 WSGI服务器——wsgiref

wsgiref是Python提供的一个WSGI参考实现库,不适合生产环境使用。wsgiref.simple_server 模块实现一个简单的WSGI HTTP服务器。

import wsgiref
from wsgiref.simple_server import make_server, demo_app, WSGIServer, WSGIRequestHandler# 启动一个WSGI服务器
wsgiref.simple_server.make_server(host, port, app, server_class=WSGIServer,handler_class=WSGIRequestHandler)
# 一个两参数函数,小巧完整的WSGI的应用程序的实现
wsgiref.simple_server.demo_app(environ, start_response)
# 返回文本例子ip = '127.0.0.1'
port = 9999
server = make_server(ip, port, demo_app)  # demo_app应用程序,可调用
server.serve_forever()  # server.handle_request() 执行一次

WSGI 服务器作用:

  • 监听HTTP服务端口(TCPServer,默认端口80)
  • 接收浏览器端的HTTP请求并解析封装成environ环境数据
  • 负责调用应用程序,将environ数据和start_response方法两个实参传入给Application
  • 将应用程序响应的正文封装成HTTP响应报文返回浏览器端

3.2 WSGI APP 应用程序端

  1. 应用程序应该是一个可调用对象:Python中应该是函数、类、实现了 __call__ 方法的类的实例
  2. 这个可调用对象应该接收两个参数
from wsgiref.simple_server import make_server  # , demo_app  # 不能用于生产环境
# simple_server只是作为参考用,不能用于生产环境return_res = b'abc~~~'def app(environ, start_response):  # 函数实现for k, v in environ.items():if k.startswith('HTTP_'):print(k, v)start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])return [return_res]class App:  # 通过类实现def __init__(self, environ, start_response):self.environ = environself.start_response = start_responsedef __iter__(self):self.start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])yield from [b'Curry ', b'Green']class Application:  # 通过类实现def __call__(self, environ, start_response):for k, v in environ.items():if k.startswith('HTTP_'):print(k, v)start_response("200 OK", [('Content-Type', 'text/html; charset=utf-8')])# 返回可迭代对象html = "<h1>金州拉文</h1>".encode("utf-8")return [html]# 上述三种方法选一种即可
# ws = make_server('127.0.0.1', 9999, app)  # app为应用程序,可调用
# ws = make_server('127.0.0.1', 9999, App)  # app为应用程序,可调用ws = make_server('127.0.0.1', 9999, Application())  # app为应用程序,可调用
ws.serve_forever()  # server.handle_request()执行一次# app 先调用start_response;demo_app返回可迭代对象,内部是内容,最后拼接

3.2.1 environ

environ是包含Http请求信息的dict字典对象

start_response应该在返回可迭代对象之前调用,因为它返回的是Response Header。返回的可迭代对象是 Response Body。

3.3 服务器端

服务器程序需要调用符合上述定义的可调用对象APP,传入environ、start_response,APP处理后,返回响应头和可迭代对象的正文,由服务器封装返回浏览器端。


# 返回网页的例子
from wsgiref.simple_server import make_serverdef application(environ, start_response):status = '200 OK'headers = [('Content-Type', 'text/html;charset=utf-8')]start_response(status, headers)# 返回可迭代对象html = '<h1>马哥教育欢迎你</h1>'.encode("utf-8")return [html]ip = '127.0.0.1'
port = 9999
server = make_server(ip, port, application)
server.serve_forever()  # server.handle_request() 一次

simple_server 只是参考用,不能用于生产环境。

WSGI WEB服务器:

  • 本质上就是一个TCP服务器,监听在特定端口上
  • 支持HTTP协议,能够将HTTP请求报文进行解析,能够把响应数据进行HTTP协议的报文封装并返回浏览器端。
  • 实现了WSGI协议,该协议约定了和应用程序之间接口

WSGI APP应用程序:

  • 遵从WSGI协议
  • 本身是一个可调用对象
  • 调用start_response,返回响应头部
  • 返回包含正文的可迭代对象

Web开发和WSGI相关推荐

  1. Web 开发规范 — WSGI

    目录 目录 WSGI 简介 为什么需要 WSGI 这个规范 WSGI 如何工作 WSGI的角色 Server 如何调用 Application application 的两个参数 applicatio ...

  2. Python web 开发:部署一个3行代码的wsgi app

    通过前面的两篇: Python Web开发:从 wsgi 开始 Python Web开发:开发wsgi中间件 我们已经知道我们平时开发的 django.flask 等 python web 项目本质上 ...

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

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

  4. 【Python随笔】python的web开发——WSGI、ASGI、uvicorn与FastAPI

    今天这篇文章,聊一下python在web开发上的一些基础实现,阐述下自己理解中的WSGI.ASGI,以及拿uvicorn+FastAPI的组合举个ASGI应用的例子. WSGI python的web服 ...

  5. pythonweb开发-Web | 浅谈用Python进行Web开发

    Web开发这样一个大概念,对我这种小白来说,想学也不知道从哪下手.在网上广泛地浏览了一下这个方面的文章后,我发现当今Web开发的一大热门语言是Python(最大的当然还是PHP),而恰好我平常用Pyt ...

  6. Day 3: Flask —— 使用Python和OpenShift进行即时Web开发

    最近Packtpub找到了我,让我给他们新出版的关于Flask的书写书评.Flask是一个很流行的Python框架.那本书是Ron DuPlain写的<Flask 即时Web开发>.我决定 ...

  7. js 获得明天0点时间戳_Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战...

    点击上方"测试开发技术",选择设为"设为星标" 优质文章,第一时间送达! 学习全文大概需要 12分钟,内容实战性较强. 1. 前言 本篇将基于Python 3. ...

  8. Python学习笔记:web开发3

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  9. Python学习笔记:web开发2

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. .net ticks 转java_《C#并发编程经典实例》—— 转换.NET事件
  2. RecyclerView 可以与CollapsingToolbarLayout一起使用
  3. 通过踩坑带你读透虚拟机的“锁粗化”
  4. 全球及中国天然气终端销售市场产量预测及发展策略分析报告2021年版
  5. 设计一个程序实现两个任意长的整数的求和运算_深入 Python (7) Karatsuba 实现长整数乘法...
  6. 数据库系统工程师考点分析
  7. P3320:寻宝游戏(生成树)
  8. android 浏览器 div穿透,解决IE 上重叠div 对 mouseover 事件的穿透方法之一
  9. Servlet规范之Filter工作原理
  10. Nginx——配置负载均衡
  11. 2.SOA架构:服务和微服务分析及设计--- 理解面向服务架构
  12. Stream流的使用函数式接口
  13. jquery 开始与结束方法 loading窗
  14. vscode如何更换主题
  15. 《城市大脑系列建设标准规范》立项评审会胜利召开
  16. 在线教育平台项目——需求分析
  17. HPD2368计算机上没有打印机,HPD2368打印机显示堵纸了,打印不了, – 手机爱问
  18. 谷歌浏览器自带的翻译功能无法使用的解决办法
  19. 成功的项目经理,都具有这6种特质
  20. dbeaver创建er图

热门文章

  1. 【无人机】【2019.07】未来无线网络中多个无人机基站的定位
  2. OpenVZ虚拟机安装过程详解
  3. 盗走“马化腾QQ”的16岁少年,如今怎么样了?
  4. 入市须知—什么是熊市?
  5. Python的几个爬虫代码整理(网易云、微信、淘宝、今日头条)
  6. 成都自传-MoccA and 555
  7. python读docx文件_Python读写docx文件的方法
  8. 树莓派搭建百度云同步
  9. oracle max相同,关于oracle:具有相同名称的材料化视图和表
  10. 1-10 Burpsuite 暴力破解用户密码