python-flask-uwsgi体验

request -> response
uwsgi 可以粗略的理解为tomcat吧

pip install flask
学习目标

json APi
数据库CRUD
redis缓存
全局的异常处理

flask + gunicorn

$ gunicorn -w 4 myapp:app

在这里插入图片描述

flask + uwsgi 部署

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()

学习flask

我确实是从spring来考虑flask的,比如某个功能在spring中是存在的,那么flask要怎么实现呢?

  1. 第一步创建一个flask应用
from flask import Flask
app = Flask(__name__)
if __name__ == "__main__"
	app.run()
  1. 路由配置规则
    获取url中的值
    获取参数中的值
    指定方法
  2. 模版渲染
  3. 在request之前和之后before_request/ after_request
    很像spring里面的拦截器,比如可以在这里进行登录验证
  4. http状态相关
    redirect
    abort
  5. 一些自己可以丰富的功能
    To register an error handler, use the errorhandler() decorator.

7.The Application Context

flask 背后的故事

访问不同视图处理函数和多个用户访问同一个视图处理函数,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!']

  1. wsgi server这里是怎么处理多个请求的?多进程?多线程?单进程,单线程,异步io
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在不同线程中为什么不会相互干扰?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值