Flask
面向简单需求和小型应用的框架
特点
-
内置开发服务器和调试器
-
与python的单元测试无缝连接
-
使用Jinja2模板(HTML模板)
-
完全兼容WSGI
-
基于Unicode编码
安装
-
pip install flask
-
pip install sqlalchemy
-
pip install flask-wtf
HelloWorld
1 from flask import Flask 2 from flask import render_template 3 from flask import Mark 4 ? 5 app = Flask(__name__) 6 ? 7 @app.route('/') #绑定路由 8 def hello_world(): 9 return 'Hello World!' 10 ? 11 @app.route('/hello/') 12 @app.route('/hello/') 13 def hello(name=None): 14 name = Markup(name) #对字符串做转义处理,比如‘>’转成> 15 return render_template('hello.html',name=name) #hello.html文件保存到templage目录下 16 ? 17 # return redirect('/check') 重定向 18 # return abort(400) 返回400错误 19 ? 20 @app.errorhandler(400) 21 def bad_request(error): 22 return render_template('bad_request.html',400) 23 ? 24 if __name__ == '__main__': 25 app.run(host='0.0.0.0',port=80,debug=false) #运行应用,关闭调试模式 26 27 # html文件 28 29 Hello from Flask 30 {% if name %} 3132 Hello {{ name }} 33
34 {% else %} 3536 Hello World! 37
38 {% endif %}
路由
-
路径中添加变量:
-
@app.route('/login/
') -
@app.route('/login/<int:number>') 此时number传到方法的就是整型而不是字符串
-
-
结尾都要加‘/’
-
Http方法绑定
-
@app.route('/sendMessage',method=['GET','POST'])
-
-
路由地址方向生成
1 import flask import Flask,url_for 2 ? 3 app = Flask(__name__) 4 @app.route('/') 5 def f_root():pass 6 @app.route('/industry') 7 def f_industry():pass 8 @app.route('/book/
') 9 def f_book():pass 10 ? 11 with app.test_request_context(): 12 print(url_for('f_root')) #输出:/ 13 print(url_for('f_industry',name='web')) #输出:/industry?name=web 14 print(url_for('f_book',book_name='Python Book')) #输出:/book/Python%20Book
Context
-
会话上下文
-
会话与用户是一对一的关系
-
通过Cookie实现
-
SessionID
-
-
from flask import session
-
session['xxx']=yyy
-
session.get('xxx')
-
session.new 判断session是不是新建的
-
session.moidified 判断session是否被修改
-
-
-
应用全局对象
-
from flask import g
-
一般用来定义数据库连接和断开
-
请求上下文
-
from flask import request
-
属性名称 访问URL返回的结果 base_url http://localhost/app/page.html path /page.html script_root /app url http://localhost/app/page.html?x=y url_root http://localhost/app/page.html -
属性 作用 form POST或PUT的表单数据 args URL中的参数 values 上面两个属性的所有值 cookies Cookie数据 headers HEAD数据 data MIMETYPE类型数据 files FileStorage类型数据 method 访问方式(POST,PUT,GET等) json 解析json数据 on_json_loading_failed(e) json数据解析失败的回调
-
-
回调接入点
-
@app.before_request:请求调用前处理
-
@app.after_request:请求调用后处理
-
@app.teardown_request:请求调用后强制处理
-
JinJa2
-
{{}}:变量或表达式,{%%}:逻辑控制,{##}:注释
-
过滤器
过滤器 描述 abs(number) 绝对值 attr(object,name) 获取指定属性 capitalize(s) 首字母大写 center(value,width) 字符串居中 default(value,default_value,boolean) 若无值则返回默认值 dictsort(value,case_sensitive,by) 以by的值来排序 escape(s) 转换为HTML表达方式 filesize(value,binary) 文件大小单位 first(sequence) 第一个元素 float(value,default) float类型 forceescape(value) 强制HTML转码 format(value,*attribute) 字符串格式化 groupby(value,attribute) 按照共有属性分组 indent(string,width,indentfirst) 缩进 int(value,,default) int类型 join(value,d=',') 字符串使用逗号连接 last(seq) 最后一个元素 length(obj) 对象长度 list(value) 转成列表 lower(string) 转小写 pprint(value,verbose) 格式化打印 random(seq) 随机元素 replace(string,old,new,count) 替换 reverse(value) 倒序 safe(value) 标记传入的值是安全的 slice(value,slices,fill_width) 切片 sort(value,reverse,case_sensitive,attribute) 排序 string(object) 转字符串 striptags(value) 去除标签 sum(iterable,attribute,start) 求和 title(s) 以标题形式展示 trim(value) 去除首位空格 truncate(s,length,killwords,end) 省略字符串 upper(s) 转大写 wordcount(s) 单词个数 wordwrap(s,width,break_long_words,wrapstring) 字符串分析处理 -
流程控制
-
测试
-
is
-
判断 描述 allable(obj) 是否可调用 defined(value) 是否定义 divisibleby(value,num) 是否可被num整除 escaped(value) 是否被转码 even(value) 是否偶数 iterable(value) 是否可迭代 lower(value) 是否小写 none(value) 是否为空 number(value) 是否数字 odd(value) 是否奇数 sameas(value,order) 是否在内存的同一块地址 sequence(value) 是否序列 undefined(value) 是否未定义 upper(value) 是否大写 string(value) 是否字符串
-
-
判断:{% if %}...{% elif %}...{else}...{%endif%}
-
循环:{% for %}...{% endfor %}
-
特殊变量
变量 描述 loop.index 迭代的次数(从1开始) loop.index0 迭代的次数(从0开始) loop.revindex 到迭代结束的次数(从1开始) loop.revindex0 到迭代结束的次数(从0开始) loop.first 是否第一次迭代 loop.last 是否最后一次迭代 loop.length 迭代长度 loop.cycle 在一串序列间取值的辅助函数
-
-
继承
-
{% extends "base.html" %}
-
{% block xxx %}...{% endblock %}
-
-
SQLAlchemy
-
定义表
-
from sqlalchemy.ext.declarative import declarative_base
-
Base = declarative_base()
-
-
表类继承Base类
-
__tablename__=u'account' 表在数据库中实际的名称
-
-
from sqlalchemy import Column,Integer,String
-
id = Column(Integer,primary_key=True)
-
user = Column(String(50),nullable=False)
-
-
-
定义数据库链接
-
from sqlalchemy import create_engine
-
from sqlalchemy.orm import scoped_session,sessionmaker
-
创建链接
-
engine = create_engine(db_connect_string,connect_args)
-
db_connect_string格式:[database_type]://[user_name]:[password]@[domain]:[port]/[database]?[parameters]
-
例如:mysql:v_user:v_pass@localhost:3306/test_database?charset=utf8
-
-
-
建立会话类型
-
SessionType = scoped_session(sessionmaker(bind=engine,expire_on_commit=False))
-
需要定义获取会话类型方法
1 def GetSession(): 2 return SessionType()
-
session.commit()、session.rollback()、session.close()、session.commit()
-
定义自动进行事务处理的函数
1 from contextlib import contextmanager 2 @contextmanager 3 def session_scope(): 4 session = GetSession() 5 try: 6 yield session 7 session.commit() 8 expect: 9 session.rollback() #异常时自动回滚 10 finally: 11 session.close() #退出时自动关闭,关闭时会自动提交
-
-
-
操作
-
with session_scope as session:
-
查询:session.query().filter() 有or_、and_,两个都需要import,在filter中使用
-
first()
-
all()
-
filter可以使用like
-
in_
-
is_,isnot
-
连接查询join()
-
-
新增:session.add()
-
删除:session.delete()
-
关系
-
ForeignKey():外键设置
-
relationship("子表类名",backref="表名",cascade='all')
-
save_update
-
delete
-
refresh-expire
-
all
-
-
一对多:一张父表、一张子表
-
多对多:一张关系表(即父表)、多张子表
-
-
-
表单
-
Form类
-
from flask.ext.wtf import Form
-
-
Field
-
from wtforms import StringField,BooleanField,HIddenField,TextField,DateTimeField
-
-
Validator
-
显示表单
-
return render_template('xxx.html',form=form)
-
-
获取表单数据
-
form.validate():判断数据是否合法
-
form.xxx.data
-
-
REST
REST:表述性状态传递
-
调用形式
-
GET/resource:查询集合
-
GET/resource/ID:查询个体
-
POST/resource:新增个体或集合
-
PUT/resource/ID:全量修改个体
-
PATCH/resource/ID:部分修改个体
-
DELETE/resource/ID:删除个体
-
Restless插件
-
实例化管理者对象
1 import flask_restless 2 # 实例管理这对象,关联应用和数据库对象 3 manager = flask_restless.APIManager(app,flask_sqlalchemy_db=db)
-
建立Restful接口
manager.create_api(XXX,methods=['GET','POST','DELETE'])
-
定制接口(以下都是create_api的参数)
-
url_prefix:定义接口的UIRL前缀
-
allow_patch_many:是否允许patch
-
allow_delete_many:是否允许delete
-
include_colums:定义需要在接口可见的属性
-
exclude_columns:和include_columns相反
-
preprocessors:接口调用前调用函数
manager.create_api(XXX,preprocessors={'POST'=[foo],'GET_SINGLE'=[trace_log]}) # []中的是方法名 -
postprocessors:接口调用后调用函数
-
| 键 | 含义 |
|---|---|
| POST | post请求时被调用 |
| GET_SINGLE | get单个时被调用 |
| GET_MANY | get集合时被调用 |
| PATCH_SINGLE | patch单个时被调用 |
| PATCH_MANY | patch集合时被调用 |
| PUT_SINGLE | put单个时被调用 |
| PUT_MANY | put集合时被调用 |
| DELETE_SINGLE | delete单个时被调用 |
| DELETE_MANY | delete集合时被调用 |