flask最近终于发布了它的1.0版本更新,从项目开源到最近的1.0版本flask已经走过了8个年头。
python爱好群,
如果你想要学好python最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐一个学习的组织:Python资源共享
有大神为大家解决各种python学习问题,希望可以帮到大家
# app.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
运行python app.py,打开浏览器访问http://localhost:5000/就可以看到页面输出了Hello World!
flask的诞生于2010年的愚人节,本来它只是作者无意间写的一个小玩具,没想到它却悄悄流行起来了。漫长的8年时间,flask一直没有发布一个严肃的正式版本,但是却不能阻挡它成了github上最受好评的Python Web框架。
flask内核内置了两个最重要的组件,所有其它的组件都是通过易扩展的插件系统集成进来的。这两个内置的组件分别是werkzeug和jinja2。
werkzeug是一个用于编写Python WSGI程序的工具包,它的结构设计和代码质量在开源社区广受褒扬,其源码被尊为Python技术领域最值得阅读的开源库之一。
# wsgi.py from werkzeug.wrappers import Request, Response @Request.application def application(request): return Response('Hello World!') if __name__ == '__main__': from werkzeug.serving import run_simple run_simple('localhost', 4000, application)
运行python wsgi.py打开浏览器访问http://localhost:4000/就可以看到页面输出了Hello World!
Have you looked at werkzeug.routing? It's hard to find anything that's simpler, more self-contained, or purer-WSGI than Werkzeug, in general — I'm quite a fan of it!
by Alex Martelli, the author of 《Python in a Nutshell》 && 《Python Cookbook》
jinja2是一个功能极为强大的模板系统,它完美支持unicode中文,每个模板都运行在安全的沙箱环境中,使用jinja2编写的模板代码非常优美。
{% extends "layout.html" %} {% block body %}
- {% for user in users %}
- {{ user.username }} {% endfor %}
werkzeug和jinja2这两个库的共同特点是编写的代码赏心悦目,作者Armin Ronacher选择这两个库来作为flask的基石说明作者有非常挑剔的代码品味。那么作者是谁呢,铛!他是一位来自澳大利亚的帅哥!
好,闲话少说言归正传,接下来我们开始体验flask的神奇魅力。
安装flask
pip install flask
圆周率计算API
圆周率可以使用正整数的平方倒数之和求得,当这个级数趋于无限时,值会越来越接近圆周率。
# flask_pi.py import math from flask import Flask, request app = Flask(__name__) @app.route("/pi") def pi(): # 默认参数 n = int(request.args.get('n', '100')) s = 0.0 for i in range(1, n): s += 1.0/i/i return str(math.sqrt(6*s)) if __name__ == '__main__': app.run()
运行python flask_pi.py,打开浏览器访问http://localhost:5000/pi?n=1000000,可以看到页面输出3.14159169866,这个值同圆周率已经非常接近。
注意pi()的返回值不能是浮点数,所以必须使用str转换成字符串
再仔细观察代码,你还会注意到一个特殊的变量request,它看起来似乎是一个全局变量。从全局变量里拿当前请求参数,这非常奇怪。如果在多线程环境中,该如何保证每个线程拿到的都是当前线程正在处理的请求参数呢?所以它不能是全局变量,它是线程局部变量,线程局部变量外表上和全局变量没有差别,但是在访问线程局部变量时,每个线程得到的都是当前线程内部共享的对象。