preface

今天我开始自学flask了,由此记录学习中的点点滴滴。

有问题请联系我(Mr.Leo 18500777133@sina.cn)

include:

  1. 简介flask
  2. hello world
  3. 配置管理
  4. 调试模式

为什么还需学习flask

  1. 作为一个pythonic,掌握一个web框架远远不够的,所以你需要再次学其他的主流框架
  2. flask社区很活跃,也是一款主流的框架。
  3. 与django相比,flask没有提供更多的功能,都是靠开发者自己去选择哪些模块去完成自己需要做的事情,也就是说,微框架的形式给开发者更大的选择空间。

简介flask

  1. 依赖三个库

    1.1. Jinja2: 默认的模版引擎。

    1.2. Werkzeug: 一个包含WSGI,路由,调试的工具集。

    1.3. Itsdangerous: 基于Django的签名模块(http://bit.ly/28QV7FB)的签名实现。

  2. flask本身尽量保持了内核的精简,其设计初衷就是不会为替开发者做太多的决策,而且就替你做了选择,你也可以很容易的替换。举两个例子:

    2.1. 对数据库层面的操作,使用SQLAlchemy,MongoEngine,不用ORM而直接基于Mysql-python这样的底层驱动进行开发都是可以的。选择权都在你手中。

    2.2. 可以把默认的jinja2模版引擎替换成Mako或者其他模版引擎都是非常容易的。

hello world

都是采用python2.7的版本编写

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello World!' if __name__ == '__main__':
app.run(host='0.0.0.0',port=9000)

代码解释下:

  1. from flask import Flask是引入这个模块
  2. app = Flask(__name__) app是Flask的实例。它接受包或者模块的名字作为参数 ,但是一般我们都是传入__name__,让flask.helpers.get_root_path函数通过传入的这个参数确定程序的根目录,以便获得静态文件和模版文件的目录。
  3. @app.route('/') 这个相当于django里面的url 匹配一样(url路由系统),在flask里面我们通过app.route装饰器将URL和执行的方法(视图函数)的关系保存到app.url_map属性上。处理URL和视图关系的程序就是路由。
  4. app.run(host='0.0.0.0',port=9000),执行app.run就可以启动服务器了。默认flask是监听本地的127.0.0.1,端口为5000,我们通过host和port来自己设定指定的地址和端口。当服务器启动后,会调用werkzeug.serving.run_simple 进入轮询,默认使用单进程单线程的werkzeug.serving.BaseWSGIServer 处理请求,实际使用的是标准库BaseHttpServer。HTTPServer,通过select.select做0.5秒的While True事件轮询。
  5. 需要说明的是,app.run启动方法只适合调试,不要再生产环境中使用,生产环境应该使用Gunicorn或者uWSGI。
总结上我们访问的流程:
  1. 我们访问"http://127.0.0.1:9000",通过app.url_map找到注册的"/"这个URL,就找到了对应的处理方法(hello world)去执行,返回“hello world”,状态码为200,如果访问其他的URL,没有在flask里面注册的话,就会返回404。

配置管理

玩过django的人都知道,django项目里面有settings这个配置文件,我们可以不断的往里添加我们的配置项,但是在Flask里面没有这个东西,怎么办?

  1. 通过硬编码方式写到代码文件里面,如key=value。
  2. 通过app.config.方法来添加,支持三种方式来添加:

    2.1. 直接在代码文件里面通过app.config.update方法添加,app.config.update是继承了Python内置数据结构的dict。如下所示:
app.config.update(
DEBUG=True,
FUCK='shit',)

2.2. 我们可以把配置单独写到一个配置文件里面,假设这个文件名为settings,文件内容如下:

A=1
B=2

那么我们可以通过三种方式来加载

2.2.1. 通过配置文件加载

# 1. 直接通过字符串的模块名字引入:
app.config.from_object('settings')
# 2. 引入之后直接传入模块对象:
import settings
app.config.from_object(settings)

2.2.2. 通过文件名加载。直接传入文件名字,但是不限于只用py为后缀的文件名:

app.config.from_pyfile('settings.py',silent=True)   # 默认配置文件不存在的时候会抛出异常,使用silent=True的时候只是返回False,但是不会抛出异常。

2.2.3. 通过环境变量加载。这种方式依赖支持silent参数,获得路径后其实还是使用from_pyfile的方式加载。

>export YOURAPPLICATION_SETTINGS='settings.py'  # 这里在shell下export一个变量
app.config.from_envar('YOURAPPLICATION_SETTINGS')

调试模式

虽然app.run这样的方式适用于启动本地的开发服务器,但是每次修改完代码都是人工手动重启一次,那么为了方便让她自动重启在修改完代码之后,我们可以这样,开启调试模式,那么Flask会自动重启当你修改完代码之后,并在错误时提供一个能获得错误上下文以及可以执行代码的调试页面。

我们有两种途径来启用调试模式:

  1. 直接在应用对象上设置:
app.debug = True
app.run()
  1. 作为run参数传入
app.run(debug=True)

需要注意点是,开启调试模式会成为一个巨大的安全隐患,因此他绝对不可以用于生成环境下。 Werkzeug从0.11版本开始默认启用 PIN(Persoanl Identification Number)码的身份验证,旨在调试环境下的攻击者更难利用调试器。启动程序的时候可以看到类似这样的:

 * Running on http://0.0.0.0:9000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 340-109-987 # 就是这个PIN码

当程序有异常进入错误堆栈模式的时候,第一次点击某个堆栈想看对应的变量的值的时候,就需要输入PIN码,PIN码默认过期时间是8小时,时效之前不需要重复输入。

当然也可以这样设置PIN码的值

WERKZEUG_DEBUG_PIN = 123456

1 最简单的hello world的更多相关文章

  1. 【造轮子】打造一个简单的万能Excel读写工具

    大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...

  2. Fabio 安装和简单使用

    Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...

  3. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  4. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  5. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  6. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  7. 使用 Nodejs 搭建简单的Web服务器

    使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...

  8. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面

    前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...

  9. 简单入门canvas - 通过刮奖效果来学习

    一 .前言 一直在做PC端的前端开发,从互联网到行业软件.最近发现移动端已经成为前端必备技能了,真是不能停止学习.HTML5新增的一些东西,canvas是用的比较多也比较复杂的一个,简单的入门了一下, ...

  10. 简单粗暴地理解js原型链--js面向对象编程

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

随机推荐

  1. Go Revel - Interceptors(拦截器)

    `interceptor`拦截器是revel框架在执行一个`action`的前后所调用的函数.他允许以AOP方式进行开发,这种模式非常有用: 1.记录请求日志 2.错误处理 3.状态保持 在revel ...

  2. 主流HTML5游戏框架的分析和对比

    本文主要选取了Construct2.ImactJS.LimeJS.GameMaker.CreateJS.lycheeJS.Crafty.three.js.melonJS.Turbulenz.Quint ...

  3. PowerDesigner使用教程【转】

    PowerDesigner使用教程 —— 概念数据模型   一.概念数据模型概述    概念数据模型也称信息模型,它以实体-联系(Entity-RelationShip,简称E-R)理论为基础,并对这 ...

  4. Android指南 - 样式和主题

    本文翻译自:https://developer.android.com/guide/topics/ui/themes.html Style和theme词汇是专用术语,下文直接使用而不翻译. 样式和主题 ...

  5. 【jquery】jquery 自定义滚动条

    可以自由的给滚动条定义背景,上下按钮,当然不仅仅是颜色,连图片当背景也可以.支持鼠标滚轮,点击滚动条滚轴定位,上下按钮久按加速,兼容 ie,firefox,chrome. 调用方法: $(" ...

  6. PHP数组缓存:三种方式JSON、序列化和var_export的比较

    使用PHP的站点系统,在面对大数据量的时候不得不引入缓存机制.有一种简单有效的办法是将PHP的对象缓存到文件里.下面我来对这3种缓存方法进行说明和比较. 第一种方法:JSONJSON缓存变量的方式主要 ...

  7. HTML5数据推送SSE原理及应用开发

    JavaScript表达行为,CSS表达外观,注意HTML既表达结构(逻辑结构),又表达内容(数据本身)通常需要更新数据时,并不需要更新结构,正是这种不改变组织结构仅改变数据的诉求,推动了数据拉取和数 ...

  8. JQ 获取窗体的高度

    alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(document).height()); //浏览器时下窗口文档的高度 alert($(docum ...

  9. Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex files define Lcom/lidroid/xutils/task/TaskHandler;

    Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex files defi ...

  10. 安卓程序代写 网上程序代写[转]eclipse快捷键

    F 键类 F2 显示详细信息 F3 跳到声明或定义的地方 Ctrl + 键类 Ctrl+1 快速修复 ( 最经典的快捷键 , 就不用多说了 ) Ctrl+D 删除当前行 Ctrl+E 快速显示当前 E ...