request -> response
uwsgi 可以粗略的理解为tomcat吧
pip install flask
学习目标
json APi
数据库CRUD
redis缓存
全局的异常处理
$ gunicorn -w 4 myapp:app
uwsgi --http 0.0.0.0:8000 --wsgi-file flask_uwsgi.py --callable app --master
flask_uwsgi.py
from app import app
if __name__ == "__main__":
app.run()
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
我确实是从spring来考虑flask的,比如某个功能在spring中是存在的,那么flask要怎么实现呢?
from flask import Flask
app = Flask(__name__)
if __name__ == "__main__"
app.run()
7.The Application Context
访问不同视图处理函数和多个用户访问同一个视图处理函数,faslk对应方式有变化吗?
flask 不同view函数的handler1, handler2使用request
可以参考理解java里面的threadLocal
Python中获得Thread Local的两种方法
「第一种方法」
使用Python自带的threading.local线程局部变量。
问题:它只支持在线程之间作为局部变量
「第二种方法」
使用Werkzeug实现的werkzeug.local.Local类,它的优势在于支持在协程之间作为局部变量。他会优先使用Greenlet的ID而不是现成的ID来保存状态词典。
简单的翻看flask代码,初步的认识是flask是一层包装,在她之下是werkzeug, jinja2
app.run() 在这里是简单的调用了werkzeug的run_simple(), 而run_simple使用的是socket.listen(128)
流程
http -> wsgi server -> application
application模型如下
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return ['Hello World!']
def run_simple(hostname, port, application, use_reloader=False,
use_debugger=False, use_evalex=True,
extra_files=None, reloader_interval=1,
reloader_type='auto', threaded=False,
processes=1, request_handler=None, static_files=None,
passthrough_errors=False, ssl_context=None):
可以通过os.getpid()查看进程id
注意 debugger为False时候, threaded=True才生效
run_simple(‘127.0.0.1’, 5000, app, use_debugger=False, use_reloader=True, processes=1, threaded=True)
通过threading.currentThread().ident查看线程id
2. from flask import request,这里的request在不同线程中为什么不会相互干扰?