基本概念
1. wsgi
Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。
两个实现该协议的模块:
- wsgiref
wsgiref示例:
from wsgiref.simple_server import make_server
def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]
if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8000, run_server)
httpd.serve_forever()
- werkzeug
werkzeug示例:
from werkzeug.wrappers import Response
from werkzeug.serving import run_simple
def run_server(environ, start_response):
response = Response('hello')
return response(environ, start_response)
if __name__ == '__main__':
run_simple('127.0.0.1', 8000, run_server)
Flask源码入口:
from werkzeug.wrappers import Response
from werkzeug.serving import run_simple
class Flask(object):
def __call__(self,environ, start_response):
response = Response('hello')
return response(environ, start_response)
def run(self):
run_simple('127.0.0.1', 8000, self)
app = Flask()
if __name__ == '__main__':
app.run()
设置监听的HTTP方法
我们可以在app.route()装饰器中使用methods参数传入一个包含监听的HTTP方法的可迭代对象,比如
通过定义方法列表,可以为同一个URL规则定义多个视图函数,分别处理不同HTTP方法的请求。
Flask内置变量转换器
修改配置文件
app.config.from_object("python类或类的路径")
配置SECRET_KEY
因为flask的session是通过加密之后放到了cookie中。所以有加密就有密钥用于解密,所以,只要用到了flask的session模块就一定要配置“SECRET_KEY”这个全局宏。一般设置为24位的字符。
Session在Flask中的运行机制
当请求到来时,flask读取cookie中session对应的值,并将该值解密并反序列化成字典,存入内存中以便视图函数使用。
当请求结束时,flask会读取内存中session字典的值,进行序列化和加密,写入到用户cookie中。
Flash
在session中存储一个数据,读取时通过pop将数据取出。
from flask import Flask,flash,get_flashed_messages
@app.route('/page1')
def page1():
print('page1')
flash('零时数据','error')
flash('data','info')
return 'session'
@app.route('/page2')
def page2():
print(get_flashed_messages(category_filter=['error']))
return 'session'
MiddleWare
__call__方法在用户发起请求时才执行,
我们要做的时在call执行前做一个操作,执行后做一个操作。
Class MiddleWare:
def __init__(self,old):
self.old=old
def __call__(self,*args,**kwargs):
print('前')
ret=self.old(*args,**kwargs)
print('后')
return ret
if __name__ == "__main__":
app.wsgi_app = MiddleWare(app.wsgi_app)
app.run()
特殊装饰器
- @app.before_request
- @app.after_request
- 如果在执行x1的时候return,那么执行顺序为绿色箭头。
- @app.first_request
只有第一次请求的时候运行,之后不在运行。
- @app.errorhandler
当用户请求的页面错误时可以使用这个装饰器为用户跳转到你指定的错误显示页面上。
- @template_global
函数的调用一般有两种方式。
1. 定义的函数func可以作为参数传到html页面上,然后再调用。(func)
2.使用@template_global装饰器装饰的函数,不用传参就可以直接在页面上调用。(func1)
{{func(2)}}
{{func2(3)}}
Flask中endpoint的理解
Blueprint(蓝图)
目标:给开发者提供目录结构
1. 项目结构
2. from flask import Blueprint
蓝图名=Blueprint('蓝图名',name)
3.app与蓝图注册连接
app.register_blueprint(ac)
五种请求钩子(也就是特殊装饰器)