廖雪峰Python学习笔记day17

学习笔记day16

# python study day17

# web开发历史 :
# 1 静态页面。
# 2 C语言的CGI通用网络接口 
# 3 脚本语言 
# 4 以脚本语言为基础的MVC等各种web框架

# 响应类型:
# 200表示成功,
# 3xx 表示重定向, 
# 4xx 表示客户端发送的请求有错误,
# 5xx表示服务器处理请求有错误
# 一个完整的 Web 应用包含了如下流程:
# 1 浏览器向服务器发送一个 request;
# 2 服务器接收并处理 request,然后生成一个 HTML 文件;
# 3 服务器向浏览器返回一个包含 HTML 源码的 response;
# 4 浏览器接收 HTML 并将其显示出来。
# WSGI接口(Web Server Gateway Interface) 用来接收并处理 request
# 一个基本的 WSGI 接口需要传入两个参数:
# 一个包含 request 信息的字典;
# 一个返回 response 的方法。 
# 这两个方法需要由 Web 服务器提供,
# 即由服务器调用 WSGI 接口从而实现完整 Web 应用的流程。
# 使用python内置wsgi服务器运行WSGI服务
# def application(environ, start_response):
#     start_response('200 OK', [('Content-Type', 'text/html')])
#     body = '<h1>hello, %s!</h1>' % (environ['PATH_INFO'][1:] or 'web')
#     return [body.encode('utf-8')]
# from wsgiref.simple_server import make_server
# httpd = make_server('', 8000, application)
# print('Server http on port 8000...')
# httpd.serve_forever() 
# 打开浏览器预览 http://localhost:8000/aaa >>> hello aaa!

# 写WSGI接口处理函数, 就是针对每个HTTP请求进行响应
# Flask 开源web框架 处理URL到函数的映射.常见的还有
# Django:全能型Web框架;
# web.py:一个小巧的Web框架;
# Bottle:和Flask类似的Web框架;
# Tornado:Facebook的开源异步Web框架。
# 实现3个URL函数处理
# from flask import Flask
# from flask import request
# app = Flask(__name__)
# 
# @app.route('/', method=['GET', 'POST'])
# def home():
#     return '<h1>welcome to Home Page</h1>'
# 
# @app.route('/signin', method=['GET'])
# def signin_form():
#     return '''<form action="/signin" method="post">
#             <p><input name="username"></p>
#             <p><input name="password" type="password"></p>
#             <p><button type="submit">SIGN IN</button></p></form> '''
# 
# @app.route('/signin', methods=['POST'])
# def signin():
#     # 需要从request对象读取表单内容
#     if request.form['username'] == 'admin' and request.form['password'] == 'password':
#         return '<h2>Hello, admin</h2>'
#     return '<h3>Bad username or password!</h3>'
# 
# if __name == '__main__':
#     app.run()
# 
#  * Serving Flask app "untitled0" (lazy loading)
#  * Environment: production
#    WARNING: This is a development server. Do not use it in a production deployment.
#    Use a production WSGI server instead.
#  * Debug mode: off
#  * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
# 127.0.0.1 - - [10/Dec/2020 15:28:21] "GET / HTTP/1.1" 200 -
# 127.0.0.1 - - [10/Dec/2020 15:28:22] "GET /favicon.ico HTTP/1.1" 404 -
# 127.0.0.1 - - [10/Dec/2020 15:28:26] "GET /signin HTTP/1.1" 200 -

# 模板(MVC) Python和HTML前后端分离,html代码写在模板里,提高效率
# from flask import Flask, request, render_template
# app = Flask(__name__)
# @app.route('/', methods=['GET', 'POST'])
# def home():
#     return render_template('home.html')
# @app.route('/signin', methods=['GET'])
# def signin_form():
#     return render_template('form.html')
# @app.route('/signin', methods=['POST'])
# def signin():
#     username = request.form['username']
#     password = request.form['password']
#     if username=='admin' and password=='password':
#         return render_template('signin-ok.html', username=username)
#     return render_template('form.html', message='Bad username or password', username=username)
# if __name__ == '__main__':
#     app.run()
# #
# <html>
# <head>
#   <title>Please Sign In</title>
# </head>
# <body>
#   {% if message %}
#   <p style="color:red">{{ message }}</p>
#   {% endif %}
#   <form action="/signin" method="post">
#     <legend>Please sign in:</legend>
#     <p><input name="username" placeholder="Username" value="{{ username }}"></p>
#     <p><input name="password" placeholder="Password" type="password"></p>
#     <p><button type="submit">Sign In</button></p>
#   </form>
# </body>
# </html>

# 解决CPU和IO之间速度不匹配问题; 1 多线程多进程 2 异步IO
# 真正意义上的 异步IO 是说内核直接将数据拷贝至用户态的内存单元,再通知程序直接去读取数据。
# select / poll / epoll 都是同步IO的多路复用模式
# 
# 1.同步和异步
# 同步和异步关注的是消息通信机制
# 所谓同步,就是在发出一个*调用*时,没得到结果之前,该*调用*就不返回。但是一旦调用返回就得到返回值了,*调用者*主动等待这个*调用*的结果
# 所谓异步,就是在发出一个*调用*时,这个*调用*就直接返回了,不管返回有没有结果。当一个异步过程调用发出后,*被调用者*通过状态,通知来通知*调用者*,或者通过回调函数处理这个调用
# 
# 2.阻塞和非阻塞
# 阻塞和非阻塞关注的是程序在等待调用结果时的状态
# 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才返回
# 非阻塞调用是指在不能立即得到结果之前,该调用不会阻塞当前线程
# 
# 网络上的例子
#老张爱喝茶,废话不说,煮开水。
#出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
#1 老张把水壶放到火上,立等水开。(同步阻塞);立等就是阻塞了老张去干别的事,老张得一直主动的看着水开没,这就是同步
#2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞);老张去看电视了,这就是非阻塞了,但是老张还是得关注着水开没,这也就是同步了
#3 老张把响水壶放到火上,立等水开。(异步阻塞);立等就是阻塞了老张去干别的事,但是老张不用时刻关注水开没,因为水开了,响水壶会提醒他,这就是异步了
#4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞);老张去看电视了,这就是非阻塞了,而且,等水开了,响水壶会提醒他,这就是异步了
#所谓同步异步,只是对于水壶而言。普通水壶,同步;响水壶,异步。对应的也就是消息通信机制
#虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。
#所谓阻塞非阻塞,仅仅对于老张而言。立等的老张,阻塞;对应的也就是程序等待结果时的状态
#看电视的老张,非阻塞。
#情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值