Python开发学习笔记(12)————WSGI协议
1.wsgi协议
1)浏览器请求动态页面流程
a。浏览器发送http请求动态资源给web服务器,
b。默认调用应用程序框架的application函数,application必须有两个参数,一个是字典,一个是函数的引用。
c。通过引用调用web服务器的方法,设置返回的状态和头信息
d。调用返回,应用程序框架查询数据库等,生成动态页面的body信息
e。应用程序框架把生成的body信息返回给web服务器的调用
f。web服务器把数据返回给浏览器。
2)定义wsgi接口
简单版
def application(environ, start_response):
start_response(‘200 OK;, [(‘Content-Type’, ‘text/html’)])
return ‘Hello World’
environ----一个包含所有HTTP请求信息的dict对象;
start_response----一个发送HTTP响应的函数;
2.闭包
闭包将一些变量和函数封装在函数中,起到封装作用。
同时,相较于类的实例对象,闭包的每个对象占用的空间小
对比:
1>匿名函数能够完成基本的简单功能,传递的是这个函数的引用,只有功能
2>普通函数能够完成较为复杂的功能,传递的是这个函数的引用,只有功能
3>闭包能够完成较为复杂的功能,传递的是这个闭包中的函数以及数据,因此传递的是功能+数据
4>对象能够完成最为复杂的功能,传递的是很多数据+很多功能,因此传递的是功能+数据
在闭包的内部函数中使用 nonlocal ,即可调用外部函数定义的变量值。
4.路由
路由告诉请求应当去执行什么程序
5.伪静态、静态和动态
1)静态URL
静态URL类似域名/news/2012-5-18/110.html,我们一般称为真静态url,每个网页有真实的物理路径。
优点:网站打开速度快,无需运算;网址结构友好,利于记忆。对SEO有好处
SEO:搜索引擎优化
缺点:对于中大型网站,产生的页面多,不好管理
2)动态URL
动态URL类似 域名/News.asp?id=5或者域名/DAk.php?id=17,带有?的URL,我们一般称为动态网址,每个URL只是一个逻辑地址,并不是真实物理存在服务器硬盘中。
优点:适合中大型网站,修改页面方便,因为是逻辑地址,占用硬盘空间比静态空间小。
缺点:需要进行运算,打开速度稍慢。URL结构复杂,不利于记忆。
3)伪静态URL
伪静态URL类似域名/course/74.html这个URL和真静态URL类似。通过伪静态规则把动态URL伪装成静态网址。也是逻辑地址,不存在物理地址。
优点:URL比较友好,利于记忆,适合大中型网站
缺点:设置麻烦,服务器要支持重写规则。访问速度不会变快,因为实质上会额外的进行运算,增加了服务器的负担,速度反而变慢,对于现在的服务器这种影响可以忽略。对SEO没有什么减分影响。
6.日志功能
1)日志级别
五个等级:
DEBUG:详细的信息,通常只出现在诊断问题上
INFO:确认一切按预期运行
WARNING:一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如,磁盘空间低)这个软件还能按预期工作。
ERROR:更严重的问题,软件没能执行一些功能
CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行。
2)日志输出
一种是输出控制台,另一种是记录到文件中,如日志文件。
1>输出到控制台
代码:
import logging
loging.basicConfig(level=logging.WARNING,
format=’%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s’)
#开始使用log功能
logging.info(‘this is logging info message’)
logging.debug(‘this is logging debug message’)
logging.warning(‘this is logging a warning message’)
logging.error(‘this is logging error message’)
logging.critical(‘this is logging critical message’)
2>log日志文件写入文件
import logging
loging.basicConfig(level=logging.WARNING,
filename=“log.txt”
filemode=“w”
format=’%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s’)
#开始使用log功能
logging.info(‘this is logging info message’)
logging.debug(‘this is logging debug message’)
logging.warning(‘this is logging a warning message’)
logging.error(‘this is logging error message’)
logging.critical(‘this is logging critical message’)
3>既要把日志输出到控制台,还要写入日志文件
代码:
import logging
#第一步,创建一个logger
logger = logging.getLogger()
logger.setLevel(logging.INFO) #log等级总开关
#第二步,创建一个handler,用于写入日志文件
logfile = ‘./log.txt’
fh = logging.FileHandler(logfile, mode=’a’) # open的打开模式这里可以进行参考
fh.setLevel(logging.DEBUG) # 输出到file的log等级的开关
#第三步,再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.WARNING) # 输出到console的log等级的开关
#第四步,定义handler的输出格式
formatter = logging.Formatter(“%(asctime)s-%(filename)s[line:%(lineno)d]- - %(levelname)s: %(message)s”)
fh.setFormatter(formatter)
ch.setFormatter(formatter)
#第五步,将logger添加到handler里面
logger.addHandler(fh)
logger.addHandler(ch)
#日志
logging.debug(‘this is logging debug message’)
logging.info(‘this is logging info message’)
logging.warning(‘this is logging a warning message’)
logging.error(‘this is logging error message’)
logging.critical(‘this is logging critical message’)
推荐阅读