Python的Flask开发框架简单上手笔记


Posted in Python onNovember 16, 2015

最简单的hello world

#!/usr/bin/env python
# encoding: utf-8

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
  return 'hello world'

if __name__ == '__main__':
  app.run(debug=True)
  #app.run(host='127.0.0.1', port=8000)

之后,访问http://localhost:5000

支持post/get提交

@app.route('/', methods=['GET', 'POST'])

多个url指向

@app.route('/')
@app.route('/index')

不管post/get使用统一的接收

from flask import request
args = request.args if request.method == 'GET' else request.form
a = args.get('a', 'default')

处理json请求
request的header中

"Content-Type": "application/json"

处理时:

data = request.get_json(silent=False)

获取post提交中的checkbox

{%for page in pages %}
<tr><td><input type=checkbox name=do_delete value="{{ page['id'] }}"></td><td>
{%endfor%}

page_ids = request.form.getlist("do_delete")

使用url中的参数

@app.route('/query/<qid>/')
def query(qid):
  pass

在request开始结束dosomething
一般可以处理数据库连接等等

from flask import g

app = .....

@app.before_request
def before_request():
  g.session = create_session()

@app.teardown_request
def teardown_request(exception):
  g.session.close()

注册Jinja2模板中使用的过滤器

@app.template_filter('reverse')
def reverse_filter(s):
  return s[::-1]

或者

def reverse_filter(s):
  return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter

可以这么用

def a():...
def b():...

FIL = {'a': a, 'b':b}
app.jinja_env.filters.update(FIL)

注册Jinja2模板中使用的全局变量

JINJA2_GLOBALS = {'MEDIA_PREFIX': '/media/'}
app.jinja_env.globals.update(JINJA2_GLOBALS)

定义应用使用的template和static目录

app = Flask(__name__, template_folder=settings.TEMPLATE_FOLDER, static_folder = settings.STATIC_PATH)

使用Blueprint

from flask import Blueprint
bp_test = Blueprint('test', __name__)
#bp_test = Blueprint('test', __name__, url_prefix='/abc')

@bp_test.route('/')

--------
from xxx import bp_test

app = Flask(__name__)
app.register_blueprint(bp_test)

实例:

bp_video = Blueprint('video', __name__, url_prefix='/kw_news/video')
@bp_video.route('/search/category/', methods=['POST', 'GET'])
#注意这种情况下Blueprint中url_prefix不能以 '/' 结尾, 否则404

使用session
包装cookie实现的,没有session id

app.secret_key = 'PS#yio`%_!((f_or(%)))s'

然后

from flask import session

session['somekey'] = 1
session.pop('logged_in', None)

session.clear()

#过期时间,通过cookie实现的
from datetime import timedelta
session.permanent = True
app.permanent_session_lifetime = timedelta(minutes=5)

反向路由

from flask import url_for, render_template

@app.route("/")
def home():
  login_uri = url_for("login", next=url_for("home"))
  return render_template("home.html", **locals())

上传文件

<form action="/image/upload/" method="post" enctype="multipart/form-data">
<input type="file" name="upload" />

接收

f = request.files.get('upload')
img_data = f.read()

直接返回某个文件

return send_file(settings.TEMPLATE_FOLDER + 'tweet/tweet_list.html')

请求重定向

flask.redirect(location, code=302) the redirect status code. defaults to 302.Supported codes are 301, 302, 303, 305, and 307. 300 is not supported.

@app.route('/')
def hello():
  return redirect(url_for('foo'))

@app.route('/foo')
def foo():
  return'Hello Foo!'

获取用户真实ip
从request.headers获取

real_ip = request.headers.get('X-Real-Ip', request.remote_addr)
或者, 使用werkzeug的middleware 文档

from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)
return json & jsonp
import json
from flask import jsonify, Response, json

data = [] # or others
return jsonify(ok=True, data=data)

jsonp_callback = request.args.get('callback', '')
if jsonp_callback:
  return Response(
      "%s(%s);" % (jsonp_callback, json.dumps({'ok': True, 'data':data})),
      mimetype="text/javascript"
      )
return ok_jsonify(data)

配置读取方法

# create our little application :)
app = Flask(__name__)

# Load default config and override config from an environment variable
app.config.update(dict(
  DATABASE='/tmp/flaskr.db',
  DEBUG=True,
  SECRET_KEY='development key',
  USERNAME='admin',
  PASSWORD='default'
))
app.config.from_envvar('FLASKR_SETTINGS', silent=True)


------------------
# configuration
DATABASE = '/tmp/minitwit.db'
PER_PAGE = 30
DEBUG = True
SECRET_KEY = 'development key'

# create our little application :)
app = Flask(__name__)
app.config.from_object(__name__)
app.config.from_envvar('MINITWIT_SETTINGS', silent=True)

几个不常用的方法

from flask import abort, flash

abort
if not session.get('logged_in'):
  abort(401)

flash
flash('New entry was successfully posted')

异步调用
想在flask的一个请求中处理异步, 除了使用消息系统, 可以用简单的线程处理

from threading import Thread

def async(f):
  def wrapper(*args, **kwargs):
    thr = Thread(target=f, args=args, kwargs=kwargs)
    thr.start()
  return wrapper

@async
def dosomething(call_args):
  print call_args


in a request handler, call `dosomething`
error handler
@app.errorhandler(404)
def not_found_error(error):
  return render_template('404.html'), 404

@app.errorhandler(500)
def internal_error(error):
  db.session.rollback()
  return render_template('500.html'), 500

项目配置
1.直接

app.config['HOST']='xxx.a.com'
print app.config.get('HOST')

2.环境变量

export MyAppConfig=/path/to/settings.cfg
app.config.from_envvar('MyAppConfig')

3.对象

class Config(object):
   DEBUG = False
   TESTING = False
   DATABASE_URI = 'sqlite://:memory:'

 class ProductionConfig(Config):
   DATABASE_URI = 'mysql://user@localhost/foo'

 app.config.from_object(ProductionConfig)
 print app.config.get('DATABASE_URI') # mysql://user@localhost/foo

4.文件

# default_config.py
HOST = 'localhost'
PORT = 5000
DEBUG = True

app.config.from_pyfile('default_config.py')

EG. 一个create_app方法

from flask import Flask, g

def create_app(debug=settings.DEBUG):
  app = Flask(__name__,
        template_folder=settings.TEMPLATE_FOLDER,
        static_folder=settings.STATIC_FOLDER)

  app.register_blueprint(bp_test)

  app.jinja_env.globals.update(JINJA2_GLOBALS)
  app.jinja_env.filters.update(JINJA2_FILTERS)

  app.secret_key = 'PO+_)(*&678OUIJKKO#%_!(((%)))'

  @app.before_request
  def before_request():
    g.xxx = ...  #do some thing

  @app.teardown_request
  def teardown_request(exception):
    g.xxx = ...  #do some thing

  return app

app = create_app(settings.DEBUG)
host=settings.SERVER_IP
port=settings.SERVER_PORT
app.run(host=host, port=port)
change log:

2013-09-09 create
2014-10-25 update
Python 相关文章推荐
Python中返回字典键的值的values()方法使用
May 22 Python
django实现登录时候输入密码错误5次锁定用户十分钟
Nov 05 Python
Python实现的端口扫描功能示例
Apr 08 Python
python 遍历目录(包括子目录)下所有文件的实例
Jul 11 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
python使用Matplotlib绘制分段函数
Sep 25 Python
Python面向对象之类的封装操作示例
Jun 08 Python
Python将string转换到float的实例方法
Jul 29 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
python爬虫豆瓣网的模拟登录实现
Aug 21 Python
没编程基础可以学python吗
Jun 17 Python
python爬虫筛选工作实例讲解
Nov 23 Python
python实现mysql的单引号字符串过滤方法
Nov 14 #Python
浅析Python中signal包的使用
Nov 13 #Python
Python下rrdtool模块的基本使用方法
Nov 13 #Python
简单了解Python下用于监视文件系统的pyinotify包
Nov 13 #Python
Python的pycurl包用法简介
Nov 13 #Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
Nov 13 #Python
Python设置Socket代理及实现远程摄像头控制的例子
Nov 13 #Python
You might like
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
关于crontab的使用详解
2013/06/24 PHP
四个常见html网页乱码问题及解决办法
2015/09/08 PHP
Laravel 队列使用的实现
2019/01/08 PHP
OfflineSave离线保存代码再次发布使用说明
2007/05/23 Javascript
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
js模仿html5 placeholder适应于不支持的浏览器
2013/01/13 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
Angular.js中下拉框实现渲染html的方法
2017/06/18 Javascript
vue+iview写个弹框的示例代码
2017/12/05 Javascript
python实现简单ftp客户端的方法
2015/06/28 Python
python创建临时文件夹的方法
2015/07/06 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
Python 中如何实现参数化测试的方法示例
2019/12/10 Python
Python使用pickle进行序列化和反序列化的示例代码
2020/09/22 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
nohup的用法
2012/11/26 面试题
小学生竞选班干部演讲稿
2014/04/24 职场文书
党支部换届选举方案
2014/05/08 职场文书
应届生求职信
2014/05/31 职场文书
小学运动会口号
2014/06/07 职场文书
教师自我剖析材料(四风问题)
2014/09/30 职场文书
房屋买卖协议样本
2014/11/16 职场文书
关于空气污染危害的感想
2015/08/11 职场文书
《失物招领》教学反思
2016/02/20 职场文书
Nginx反爬虫策略,防止UA抓取网站
2021/03/31 Servers