flask基础之安装和使用入门(一)

https://www.cnblogs.com/cwp-bg/p/8916575.html

前言

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

Flask框架简介

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

  • 自己至关于一个内核,其余几乎全部的功能都须要用第三方的扩展来实现;web

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

安装环境

  • 安装Flask和全部可能相关依赖的包:

将全部相关的包放置在一个txt文件,如:requires.txt,内容以下:json

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.htmlflask

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就能够访问咱们刚刚创建的网站了,就这么方便!api

  • 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的视图函数集中,其主要有三个参数:ruby

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不被更改;

参考

  • https://dormousehole.readthedocs.io/en/latest
相关文章
相关标签/搜索