flask使用基础
1、安装
pip install Flask
基本依赖库:
jinja2:实现对模板的处理
werkzeug:本质是socket服务器,用于接收http请求,并对请求进行预处理,然后触发Flaks框架,开发人员基于Flask框架提供的功能对请求进行相应的处理并返回给用户。
2、创建核心对象
from flask import Flask
app = Flask(__name__)
值得注意的是,这里的__name__,一般是模块名或者包名,如果是单个模块,这里直接写__name__肯定是没有问题的。
但是如果使用的是软件包,官方建议的是这里使用硬编码来传入包名。
还可以直接在包的__init__.py文件中穿件方法来实例化我们的app,这样传入的__name__名称也是包名。
def instance_app():
app = Flask(__name__)
...
return app
然后在入口文件中引入instance_app
__name__的名称决定了项目的根目录。项目中的静态文件,模板文件等都是通过根目录路径在寻找的。
默认情况下,静态文件时放在根目录下的static文件夹中的。但是如果我们修改了静态文件夹的位置或者名称,可以在实例化Flaks核心对象的时候指定自定义路径
如上图,默认情况下,Flask实例化可以接受静态文件,模板路径等等,如在根目录下新建文件夹static12,然后上传图片timg.jpg
然后在实例化Flaks核心对象的时候传入自定义静态文件地址
app = Flask(__name__, static_folder='static12', static_url_path='static12')即可
static_folder:是我们自定义的静态文件夹相对于根目录的位置。
static_url_path:用于为静态文件指定不同的路径,static_url_path+filename 整理构成了静态文件的访问路径,默认情况下static_url_path和static_folder是一样的,所以上面的例子,也可以省略掉static_url_path
从下面的源码可以看到,定义了_get_static_url_path()函数用来获取static_url_path,如果我们配置了static_url_path,直接取我们配置的,如果static_url_pathNone,回去取static_folder的值。
最后,调用Flask的add_url_rule函数配置静态文件访问路径,最终执行静态文件访问的是view_func即send_static_file()
所以,我们可以重写send_static_file()函数,可以用来判断是否有权限访问此文件等
2、启动程序
from apps import instance_app(这里apps是我的应用包名)
app = instance_app()
if __name__=="__main__":
app.run(host='0.0.0.0', port=80, thread=True)
1)我们为什么要在入口函数中添加__name__=='__main__'判断?
原因1:加入__name__=="__main__" 确保我们的run()函数只有在当前脚本被python解释器直接执行的时候才会运行,而被其他模块import的时候不会被执行
原因2:开发环境下,我们启动的是flask自带的一个非常简单的服务器,但是在部署到生产环境中时,用的是uwsgi和nginx组合来部署项目,nginx作为前置服务器用来接收我们浏览器发来的请求,转发给uwsgi,
在生产环境中,并不是我们手动的去启动我们的模块,而是通过uwsgi来加载我们的模块来启动代码。
所以如果在生产环境中,我们的入口文件就不再是入口文件了,解了if判断后,app.run就不会去执行。
但是如果不加if判断,生产环境一旦加载了我们的入口文件后,app.run()就会被执行,这样就会导致我们在已经拥有了uwsgi作为外部服务器的同时,又启动了内部服务器,这种情况是不可取的。
3、配置路由
使用核心对象的route()装饰器把函数绑定到对应的url上
@app.route("/hello") # 无参
def say_hello():
return "hello"
@app.route("/hello/<name>") # 有参
def say_hello1(name)
return "hello"+name
flask的url规则基于werkzeug的路由模块。这个模块背后的思想是基于Apache和更早的http服务器主张的先例,保证优雅且唯一的url。
以下面两个规则为例:
@app.route("/hello")
def say_hello():
return "hello"
@app.route("/hello1/")
def say_hello1():
return "hello1"
上面两种情况看起来url很相似,一个加斜线,一个不加斜线,但是他们结尾的斜线在url定义中不同
第一个结尾不带斜线的,如果访问url后面加上斜线,会返回404
第二个结尾带斜线的,如果访问url后面忘了加上斜线,Flask在收到这个请求后,会将请求重定向到到斜线的url上面去,所以我们看到第二种情况中,输入不到斜线的url访问目标函数,浏览器请求了两次,第一次返回301,即告诉浏览器,需要重定向。
3、生成url
通过url_for()来给指定的函数构造url
1)它接收函数名作为第一个参数
url_for("login") # /login
2)它也接收对应url规则的变量部分的命名参数,如一个url需要参数username
url_for("login", username="john") # /login/john
3)对于未知变量部分,会添加到url末尾作为查询参数
url_for("login", next='/') # /login?next=/
4)使用反向构建url的意义:
a)易于维护
b)url构建会自动转义特殊字符和Unicode数据,省去很多麻烦
c)如果我们的应用不是在根路径下面,url_for会妥善的处理这个问题。
4、HTTP方法
通过route()装饰器的methods参数可以定义该方法介绍哪些请求
@app.route("/login", methods=['GET', 'POST'])
from flask import request
def login():
if request.method=='POST':
pass
5、模板渲染
flask配备了jinja2模板引擎,我们可以使用render_template方法来渲染模板。
from flask import render_template
@app.route("/hello/<name>")
def hello(name):
return render_template("index.html", name=name)
6、关于响应
flask转换响应对象的逻辑如下:
1)如果返回的是一个合法的响应对象,它会从视图直接返回
2)如果返回的是一个字符串,它会被转换为该字符串为主体的,状态码为200,MIME类型为‘text/html’的响应对象。
3)如果返回的是一个元组,且元组中的元素可以提供额外的信息。这样的元组必须是(response,status,header)的形式。header作为额外的消息头标志,可以是一个列表或字典。
如果我们想要在视图里操作响应对象,可以使用make_response()函数
如我们有这样一个函数
@app.errorhandler(404)
def not_found(error):
return render_template("error.html",404)
我们只需要将返回值表达式传递给make_response()函数,获取结果对象,并修改,然后返回
from flask import make_response
@app.errorhandler(404)
def not_found(error):
resp = make_response(render_remplate("error.html"),404)
resp.headers[X-something] = 'A-value'
return resp
参考:http://docs.jinkan.org/docs/flask
flask使用基础的更多相关文章
- 知了课堂 Python Flask零基础 笔记整理
目录 起步 安装Python2.7: Python虚拟环境介绍与安装: pip安装flask: 认识url: URL详解 web服务器和应用服务器以及web应用框架: Flask 第一个flask程序 ...
- 超实用的Flask入门基础教程,新手必备!
Flask入门基础教程 Flask简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活.轻便.安全且容易上手.它可以很好地结合MVC模式进行开发,开发人员分工合 ...
- 2、flask之基础知识点
本篇导航: 路由系统 视图函数 请求与响应 模版语法 session 蓝图(blueprint).闪现 (flash) 扩展 一.路由系统 1.可传入参数: @app.route('/user/< ...
- flask的基础认识
刚开始学习flask基础知识,有了一点点的认识,所以在此大概写一下自己的理解,详细步骤和功能在代码段介绍: from flask import Flask,render_template,reques ...
- flask之基础知识点
本篇导航: 路由系统 视图函数 请求与响应 模版语法 session 蓝图(blueprint).闪现 (flash) 扩展 一.路由系统 1.可传入参数: @app.route('/user/< ...
- 云效(阿里云)流水线 + nginx + uWsgi + flask + python3 基础环境搭建 --备忘
一.开发环境搭建 1.安装python3 yum -y groupinstall "Development tools" yum -y install zlib-devel bzi ...
- Flask的基础二
一.session 除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需 ...
- Flask框架基础功能
引言 本文简单汇总Flask框架几大基础功能,包括: 路由系统 模板 数据库 几种常用Flask库 一个简单的Flask事例 Flask是一个基于Python,依赖Jinja2模板和WSGI服务的框架 ...
- Flask框架基础--第一篇
1.flask框架和其他几种框架的优缺点对比 Django : 优点 - 大而全所有组件都是有组织内部开发高度定制化 教科书级别的框架 缺点 - 大到浪费资源,请求的时候需要的资源较高 Flask : ...
- Flask开发基础
Flask是一个使用Python编写的轻量级Web应用框架. 模板引擎使用的Jinja2 Flask框架简单易学,但是其保留了扩展的弹性,可以使用Flask-extension 加入ORM ,窗体验证 ...
随机推荐
- [转] Scala 中的异步事件处理
在任何并发性应用程序中,异步事件处理都至关重要.无论事件的来源是什么(不同的计算任务.I/O 操作或与外部系统的交互),您的代码都必须跟踪事件,协调为响应它们而执行的操作.应用程序可以采用两种基本方法 ...
- Linux 防火墙
目录 iptables配置 1. iptables 控制类型 2. 链表规则 3. iptables表 CentOS和RedHat 6.x CentOS和RedHat 7.x ufw ubuntu u ...
- 谈谈装xp官方纯净系统屡次失败的深刻体会
有木有,小硬盘小内存的电脑竟然装不了五六百m大小的xp却能装win7之类的而感到痛失,如果去装win7电脑果断卡死, 用了最流行的制作u盘启动的软件都不行, 任何直接点击安装也不行,点不了安装的那个选 ...
- 单纯linux系统下hadoop2.7.3 eclipse,记一次成功的运行wordcount的注意事项
hadoop要正确安装好 hadoop eclipse plugin要对应相应的eclipse版本 define hadoop location mr master:9000 另一个9001 下面的 ...
- c/c++ 图的创建(二维数组法)
c/c++ 图的创建(二维数组法) 图的概念 图由点和线组成 知道了图中有多少个点,和哪些点之间有线,就可以把一张图描绘出来 点之间的线,分有方向和无方向 创建图 创建图,实际就是创建出节点,和节点之 ...
- 企业级仓库harbor搭建
1.Harbor是什么? Harbor是Vmvare中国团队开发的开源registry仓库,相比docker官方拥有更丰富的权限权利和完善的架构设计,适用大规模docker集群部署提供仓库服务.在企业 ...
- layui form.on('select(xxx)',function(){});绑定失败
使用layui的form.on绑定select选中事件中, form.on()不执行, 主要原因有 1, select标签中没有写lay_filter属性,用来监听 <select id=&qu ...
- npm方法
1. 使用npm 下载全局包 npm install 包名字 -g 安装 npm uninstall 包名字 -g 卸载 2. 安装卸载本地的包 (在哪里执行命令就把包安装在哪个目录的node_mod ...
- 【BZOJ1449】 球队收益
BZOJ1449 球队收益 Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 Sa ...
- yum安装提示Another app is currently holding the yum lock; waiting for it to exit...
在Linux系统中使用yum安装软件时,提示yum处于锁定状态 Another app is currently holding the yum lock; waiting for it to exi ...