前言

Flask框架作为一个python极简化的web框架,它不像Django那样的重型,非常适合快速开发一些小型的应用。本人用flask开发了几个项目之后,慢慢研究flask底层的一些原理,开始一步步总结flask框架的使用方法以及设计原理。共勉!

Flask框架简介

  • 基于Werkzeug工具箱编写的轻量级Web开发框架,主要面向需求简单的小应用;

  • 本身相当于一个内核,其他几乎所有的功能都需要用第三方的扩展来实现;

  • 核心是Werkzeug和Jinja2(路由模块和模板引擎);

安装环境

  • 安装Flask和所有可能相关依赖的包:

将所有相关的包放置在一个txt文件,如:requires.txt,内容如下:

alembic==0.9.4
amqp==2.2.2
billiard==3.5.0.3
celery==4.1.0
certifi==2017.7.27.1
chardet==3.0.4
Flask==0.10.1
Flask-Migrate==2.1.0
Flask-Script==2.0.5
Flask-Session==0.3.1
Flask-SQLAlchemy==2.2
Flask-WTF==0.14.2
Jinja2==2.9.6
kombu==4.1.0
Mako==1.0.7
  • 创建一个python新的虚拟环境,执行安装:

可参考:http://www.cnblogs.com/cwp-bg/p/7701231.html

pip install -r requires.txt

创建一个简单的应用程序

from flask import Flask
app = Flask(__name__) # 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return 'ok' if __name__ == '__main__':
app.run()

执行启动后我们在浏览器输入:http://127.0.0.1:5000就可以访问我们刚刚建立的网站了,就这么方便!

  • app初始化简介
# Flask实例的源码:
class Flask(_PackageBoundObject):
def __init__(self, import_name, # 指定应用的名字和工程目录,默认为__name__
static_path=None, # 是静态文件存放的路径,会赋值给static_url_path参数
static_url_path=None, # 设置静态文件路由的前缀,默认为“/static”
static_folder='static', # 静态文件的存放目录, 默认值为"static"
template_folder='templates', # 模板文件的存放目录,默认值为"templates"
instance_path=None, # 设置配置文件的路径,在instance_relative_config=True情况下生效
instance_relative_config=False # 设置为True表示配置文件相对于实例路径而不是根路径
root_path=None) # # 应用程序的根路径
  • 运行测试app程序
app.run(host=None, # 设置ip,默认127.0.0.1
port=None, # 设置端口,默认5000
debug=None) # 设置是否开启调试,默认false

app的配置参数详解

flask实例化后会加载默认的配置参数,我们也可以手动设置参数更新默认的配置,常用的参数选项有:

DEBUG:是否启用debug模式,默认false。
TESTING :启用/禁止测试模式
SECRET_KEY :密钥,在启用session等很重要
SESSION_COOKIE_NAME :设置保存的session在 cookie 的名称
SESSION_COOKIE_DOMAIN:设置会话的域,默认是当前的服务器,因为Session是一个全局的变量,可能应用在多个app中;设置这个参数必须设置SERVER_NAME,否则报错
PERMANENT_SESSION_LIFETIME:session失效时间,作为一个 datetime.timedelta 对象,也可以用秒表示;
LOGGER_NAME:日志记录器的名称,默认__name__;
SERVER_NAME:服务器的名称以及端口,需要它为了支持子域名 (如: 'myapp.dev:5000')
MAX_CONTENT_LENGTH:设置一个请求所允许的最大的上传数据量,单位字节;
SEND_FILE_MAX_AGE_DEFAULT: 设置调用send_file发送文件的缓存时间;
TRAP_HTTP_EXCEPTIONS:如果这个值被设置为 True , Flask 不会执行 HTTP 异常的错误处理, 而是像对待其它异常一样,通过异常栈让它冒泡;
PREFERRED_URL_SCHEME:设置URL 模式用于 URL 生成。如果没有设置 URL 模式,默认将为 http 。
JSON_AS_ASCII:默认情况下 Flask 序列化对象成 ascii 编码的 JSON。 如果不对该配置项就行设置的话,Flask 将不会编码成 ASCII 保持字符串原样,并且返回 unicode 字符串。jsonfiy 会自动按照 utf-8 进行编码并且传输。
JSON_SORT_KEYS:默认情况下 Flask 将会依键值顺序的方式序列化 JSON。 这样做是为了确保字典哈希种子的独立性,返回值将会一致不会造成 额外的 HTTP 缓存。通过改变这个变量可以重载默认行为。 这是不推荐也许会带来缓存消耗的性能问题。
JSONIFY_PRETTYPRINT_REGULAR:如果设置成 True (默认下),jsonify 响应对象将会完美地打印。

加载配置文件的方法

  • 通过加载文件设置参数
app.config.from_pyfile("./config.cfg") # 指定参数的路径,内容按行书写,配置文件放置在与app的同目录下

def from_pyfile(self, filename, silent=False):
filename = os.path.join(self.root_path, filename)
pass
  • 通过类设置参数

注意所有的参数必须大写,否则无效。

class Config(object):  # 该类可以定义在一个py文件中然后导入py文件
"""配置参数"""
DEBUG = True
app.config.from_object(Config)
  • 通过json格式的文件配置
# config.json
{
'DEBUG' = True
}
app.config.from_json('config.json') # 配置文件放置在与app的同目录下
  • 直接操作app.config对象进行设置
app.config["DEBUG"] = True
或者
app.config.update({
"DEBUG":True,
})

获取配置参数的方法

app.config.get("DEBUG")
或者
current_app.config.get("DEBUG")

定义视图函数

# 使用methods参数设置
@app.route('/',methods=["POST","GET"])
def index():
return 'ok'

route装饰器会将其装饰的视图函数注册到app的视图函数集中,其主要有三个参数:

rule:api路由,如:'/','/index'等;
methods:设置允许的请求方式,如:'POST','GET'等,如果不设置,默认是GET方法;
endpoint:视图函数的标识符,是请求用来寻找对应的视图函数的键,默认是视图函数的名字。

注意点

  • 相同的路由和请求方式,先定义的覆盖后定义的,如果请求方式不同则不会覆盖;可以对不同的方式请求的分开写视图函数,但视图函数一定不能相同;

  • 同一个视图函数加了多个路由,无论哪一个都可以访问到视图;通过加多层装饰器实现;

  • 默认的请求方式为get;可以同时设置允许get和post请求访问;

@app.route('/test',methods=["POST","GET"])
@app.route('/',methods=["POST","GET"])
def index():
return 'ok'

路由分发

  • 步骤:通过程序实例的route装饰器实现;route装饰器内部会调用add_url_route()方法创建一个Rule对象,将该视图函数的标识符和Rule对象作为键值对加入到app的url_map中。
# 源码
def route(self, rule, **options):
def decorator(f):
endpoint = options.pop('endpoint', None)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator

路由参数转换器

flask允许将参数放置在路由中,通过路由转换器来提取参数。

  • 默认的参数转换器
# 将路由转化为int类型的参数
@app.route('/user/<int:id>')
def hello_itcast(id):
return 'ok %d' %id

<>这种形式写法就是转换器,有int,float,path,default,uuid等几种;

int : 提取整形
float: 提取浮点数
path: 提取路径,包括/
string:提取字符串
default:即不写类型<id>,除了/之外,默认是字符串
uuid:接受 UUID 字符串
  • url的规则细节
  1. 如果url规则以/结尾,请求url没有斜线,则引导到有斜线的页面;

  2. 如果url规则结尾没有斜线,请求带有斜线,则找不到页面;

获取请求数据

# 导入请求对象request,该对象保存了一切请求的信息
from flask import request request.args:获取路径请求的参数,返回一个字典;
request.form:获取表单数据;
request.values:包含from和args的全部内容;
request.cookies:获取cookie得到一个dict;
request.data:获取数据作为字符串存于此;
request.headers:获取请求头;
request.files:获取上传的文件;

返回响应数据

在视图函数中返回的数据默认是一个三个元素的元组,分别表示返回的数据body,返回状态码和添加头部信息。

@app.route('/')
def index():
return 'ok',200,[("a", "b")] # 列表
# return 'ok',200,{"a":"b"} # 字典
# return 'ok',"666 hhhh",{"a":"b"} # 状态码可以随便,不会报错

也可以使用make_response()返回,其会直接创建一个response对象。

@app.route('/')
def test():
return make_response('ok',200,{'a':'b'})

自定义异常处理

所有自定义的异常处理函数会加载到app对象的error_handler_spec属性中保存。

@app.errorhandler(404) # number表示自定义的状态码
def handle_errer(errer):
return errer # 表示错误的信息
# 定义好后,当使用abort函数时,会自动调用这个处理函数;

设置cookie和session

  • 设置coookie
response.set_cookie(key,value,max_age=10) # 设置cookie的键和值,过期时间
# 可以直接设置
response.header["Set-Cookie] = value
# 获取cookie
response.cookie.get(key)
# 删除cookie
response.delete_cookie(key) # 设置过期时间
  • session需要配置secret_key参数
import flask import session
# 设置加密的密匙
app.config["SECRET_KEY"] = “password”
name = session.get("xx") # 获取session中的数据
session.values() # 获取session中的所有键的值
session.keys() # 获取session中的所有键
session.items() # 获取session中的所有键值对

session默认保存在cookie中;通过加密的方式来确保session不被更改;

参考

flask基础之安装和使用入门(一)的更多相关文章

  1. flask基础之AppContext应用上下文和RequestContext请求上下文(六)

    前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...

  2. flask基础之请求处理核心机制(五)

    前言 总结一下flask框架的请求处理流程. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) flask基础之jijia2模板语言进阶(三) flask ...

  3. flask基础之app初始化(四)

    前言 flask的核心对象是Flask,它定义了flask框架对于http请求的整个处理逻辑.随着服务器被启动,app被创建并初始化,那么具体的过程是这样的呢? 系列文章 flask基础之安装和使用入 ...

  4. flask基础之jijia2模板语言进阶(三)

    前言 前面学习了jijia2模板语言的一些基础知识,接下来继续深挖jijia2语言的用法. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) 控制语句 和 ...

  5. flask基础之jijia2模板使用基础(二)

    前言 在以前前后端不分离的时代,后台程序员往往又当爹又当妈,需要将前端程序员写的h5页面填充模板语言.而jijia2是一门十分强大的python的模板语言,是flask框架的核心模块之一.先简单介绍一 ...

  6. sass、less和stylus的安装使用和入门实践

    刚 开始的时候,说实话,我很反感使用css预处理器这种新玩意的,因为其中涉及到了编程的东西,私以为很复杂,而且考虑到项目不是一天能够完成的,也很少是 一个人完成的,对于这种团队的项目开发,前端实践用c ...

  7. 20165223 Linux安装及命令入门

    预备作业3:Linux安装及命令入门 一.VirtualBox和Ubuntu的安装 通过学习实践基于VirtualBox虚拟机安装Ubuntu图文教程,我开始学习虚拟机的安装,根据教程一步步试着安装. ...

  8. Java基础-SSM之Spring MVC入门篇

    Java基础-SSM之Spring MVC入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spring MVC简介 1>.什么是Spring MVC 答:Sprin ...

  9. 20165332 预备作业三 Linux安装及命令入门

    Linux安装及命令入门 一.安装Linux操作系统 由于做的比较晚,结合大多数同学的经验和娄老师的<基于VirtualBox虚拟机安装Ubuntu图文教程>,整个安装过程还算顺利,唯一遇 ...

随机推荐

  1. 【计算机网络】NAT:网络地址转换

    NAT(Network Address Translation,网络地址转换)是1994年提出的.当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因 ...

  2. postman优缺点

    postman优缺点分析 优点:门槛低,上手快 优点: 脚本语言是js 优点:自带各种代码模块 优点:跨平台 优点: 免费版就已经非常强大了,支持http,https协议 优点:有命令行版本,newm ...

  3. Problem D - Non-boring sequences——Contest1004 - National Day Training Contest -- Day3

    今天比赛的时候做的一个坑题.深坑啊. 题目意思是给你一个有n个数的数字序列.要你判断对于这个序列是都满足任意一个子序列都至少含有一个只出现一次的数字. 看完题目后没什么思路,一直以为要用线段树,每次删 ...

  4. python的N个小功能(文本字段对应数值,经纬度计算距离,两个时间点计算时间间隔)

    案例1 >>> import pandas as pd >>> df=pd.DataFrame({'A':[1,2,3],'B':[1,2,3],'C':[1,2, ...

  5. Struts的default.properties五个配置 一般利用按着配置文件的加载的顺序,后面文件和前面文件相同的配置,后面的会把前面的文件的值覆盖的原则 在struts.xml里面进行配置

    1 struts.i18n.encoding=UTF-8 配置编码 2 struts.action.extension=action,, 配置浏览器访问地址的后缀 3 struts.devMode = ...

  6. AtCoder Regular Contest 074 瞎打记

    (很长时间没更新了>_<) 由于机房的网总是奥妙重重,开考30多分钟之后我才登进去... 然后发现T1是个简单枚举,1A.T2是个简单优先队列,1A.T3似乎需要一点推导,先看了T4发现是 ...

  7. Day19内容回顾

    1,Django请求的生命周期 路由系统-视图函数(获取模板+数据->渲染)->字符串返回给用户 2,路由系统 /index/ 函数或类.as_view() /detail(\d+)/ 函 ...

  8. [AT2304] [agc010_c] Cleaning

    题目链接 AtCoder:https://agc010.contest.atcoder.jp/tasks/agc010_c 洛谷:https://www.luogu.org/problemnew/sh ...

  9. Spring Boot系列教程六:日志输出配置log4j2

    一.前言  spring boot支持的日志框架有,logback,Log4j2,Log4j和Java Util  Logging,默认使用的是logback日志框架,笔者一直在使用log4j2,并且 ...

  10. Unity3D手游开发日记(1) - 移动平台实时阴影方案

    阴影这个东西,说来就话长了,很多年前人们就开始研究出各种阴影技术,但都存在各种瑕疵和问题,直到近几年出现了PSSM,也就是CE3的CSM,阴影技术才算有个比较完美的解决方案.Unity自带的实时阴影, ...