一、Flask初识
首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分
三大主流Web框架对比
1.Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不管你用得到用不到,反正它全都有,属于全能型框架
2.Tornado 主要特点是原生异步非阻塞,在IO密集型应用和多任务处理上占据绝对性的优势,属于专注型框架
3.Flask 主要特点小而轻,原生组件几乎为0, 三方提供的组件请参考Django 非常全面,属于短小精悍型框架
Django 通常用于大型Web应用由于内置组件足够强大所以使用Django开发可以一气呵成
Tornado 通常用于API后端应用,游戏服务后台,其内部实现的异步非阻塞真是稳得一批
Flask 通常应用于小型应用和快速构建应用,其强大的三方库,足以支撑一个大型的Web应用
Django 优点是大而全,缺点也就暴露出来了,这么多的资源一次性全部加载,肯定会造成一部分的资源浪费
Tornado 优点是异步,缺点是干净,连个Session都不支持
Flask 优点是精悍简单,缺点是你不会!哈哈哈哈哈哈!
总结:
Flask:1.轻,短小精悍2.快,三行代码开启服务
缺点:1.组件大部分来源于三方,flask-admin,flask-session2.flask大版本更新,组件更新速度慢
Django:1.大而全,admin,models,Form,中间件,session2.一个框架解决所有问题
缺点:1.一旦启动,所有资源全部加载,用不到的,浪费了2.太大了,结构复杂3.所有的组件,全部由Django自身控制
Tornado:1.原生websocket2.异步io3.非阻塞
缺点:
三方及原生组件几乎为0
View Code
Flask 的安装与HelloWorld
Flask的安装特别难,但是以一个多年奋斗在程序界的我,肯定会找出一个最简单的方法教你们,具体操作如下:
pip install Flask
别问我还有没有复杂的方法,没有!
Flask安装完成了,下面使用Flask走一遍仪式:
三行Flask
from flask importFlask
app= Flask(__name__)
app.run()
执行输出:
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
默认端口是5000,访问页面:
因为没有定义路由,所以报404。但是服务是起来了!
六行Flask
from flask importFlask
app= Flask(__name__)
@app.route("/")defindex():return "HelloWorld!!"app.run()
重启程序,刷新页面
实现了Flask 的第一个HelloWorld程序,恭喜恭喜!
解读一下代码
from flask import Flask #导入Flask类
app = Flask(__name__) #实例化Flask对象app
@app.route("/") #app中的route装饰器
def index(): #视图函数
return "HelloWorld!!" #返回响应体
#监听地址为0.0.0.0,表示服务器的所有网卡#5000是监听端口#debug=True表示启动debug模式。当代码有改动时,Flask会自动加载,无序重启!
app.run("0.0.0.0",5000,debug=True) #启动Flask服务
注意:默认的debug模式是关闭的。如有有代码改动,需要重启flask才行生效!
但是开启debug模式,代码一有改动,会立刻加载,无需重启!
还有一点,app = Flask(__name__)。这里面的__name__表示 标识模块的名字的一个系统变量
还可以是 app= Flask("fdsafejisi"),这样运行也没有问题。那么为什么要用__name__呢?
后面学习到蓝图会用到!
启动了Flask,得到了返回值,打印在页面上
本文参考:
二、Render Redirect HttpResponse
HTTPResponse
@app.route("/") #app中的route装饰器
def index(): #视图函数
return "HelloWorld!!" #HttpResponse
在Flask 中的HttpResponse 在我们看来其实就是直接返回字符串
Redirect
from flask import Flask #导入Flask类
from flask import redirect # 导入flask中的redirect
app= Flask(__name__)#app中的route装饰器,用来指定视图函数的URL地址
@app.route("/redi")def redi(): #视图函数
return redirect("/") # redirect跳转至"/"
@app.route("/")def index(): #视图函数
return "hello"
if __name__ == '__main__':
app.run("0.0.0.0", 5000, debug=True)
每当访问"/redi"这个地址的时候,视图函数redi会触发redirect("/") 跳转到url地址: "/" 并会触发"/"对应的视图函数index()
访问url: http://127.0.0.1:5000/redi
查看网页工具,查看网络。它经历了2次请求!
render (render_template)
编辑文件demo.py,代码如下
from flask import Flask #导入Flask类
from flask import render_template #导入flask中的render_template
app= Flask(__name__)
@app.route("/home")def home(): #视图函数
#渲染html模板,返回html页面
return render_template("home.html")if __name__ == '__main__':
app.run("0.0.0.0", 5000, debug=True)
在当前py文件目录中创建templates,在此目录下创建文件home.hml
TitleFlask
重启flask,访问home页面,效果如下:
目录结果如下:
./├── demo.py
└── templates
└── home.html
HTML模板渲染是每个Web框架中都必须有的,至于render_template的具体用法,留个悬念,往后看
注意: 如果要使用 render_template 返回渲染的模板,请在项目的主目录中加入一个目录 templates
否则可能会有一个Jinja2的异常哦
遇到上述的问题,基本上就是你的template的路径问题
为什么要一定要创建templates文件夹呢?叫abc,行不行呢?不行!
看这一行代码
app = Flask(__name__)
使用Ctrl+鼠标左键,点击Falsk,查看源码
def __init__(
self,
import_name,
static_url_path=None,
static_folder='static',
static_host=None,
host_matching=False,
subdomain_matching=False,
template_folder='templates',
instance_path=None,
instance_relative_config=False,
root_path=None
):
看到template_folder变量没有?文件夹必须叫这个名字!
指定templates路径
注意:我的flask程序,是直接用新建py文件写的。所以这一行代码,会飘黄
return render_template("home.html")
怎么解决呢?很简单!执行目录就好了
右键templates文件夹-->Mark Directory as-->Template Folder
选择yes
选择Jinja2,Flask中默认的模板语言是Jinja2
django的模板语言为django,其实django底层也是用Jinja2开发的。其他模板语言同理!
后续会讲到flaks模板语法,你会发现,和django几乎是一样的!
注意:如果直接使用Pycharm创建Flask项目,是不存在这个问题的!
前期学习Flask,要先自己手动折腾,后期就可以用Pycharm创建了!
三、request
每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的
为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互
基于HTML + Flask 写一段前后端的交互
先写一段儿HTML form表单中提交方式是post action地址是 /req
在templates目录创建文件login.html
欢迎登陆
View Code
写好一个标准 form 表单,一点提交,搜就向后端提交一个POST请求过去了
后端的接收方式就 666 了
首先要从 flask 包中导入 request 模块 , 至于为什么要导入 request 呢? 这里不做解释,暂时你就知道 request 如果要用,需要导入
demo.py
from flask import Flask #导入Flask类
from flask import render_template #导入flask中的render_template
from flask import request #导入flask中的request
app= Flask(__name__)
@app.route("/login")deflogin():return render_template("login.html")
@app.route("/req")def home(): #视图函数
print(request)return "ok"
if __name__ == '__main__':
app.run("0.0.0.0", 5000, debug=True)
View Code
重启flask,访问登录页面
提示之后,报错!提示请求方式不被允许!
methods
为什么呢?因为默认路由只允许GET访问。那么需要加一个参数methods,允许POST访问
from flask import Flask #导入Flask类
from flask import render_template #导入flask中的render_template
from flask import request #导入flask中的request
app= Flask(__name__)
@app.route("/login")deflogin():return render_template("login.html")
@app.route("/req",methods=["POST"]) #只允许POST
def home(): #视图函数
print(request) #request对象
print(request.method) #POST看来可以使用这种方式来验证请求方式
#ImmutableMultiDict([('user', 'xiao'), ('pwd', '123')])
print(request.form)#ImmutableMultiDict 它看起来像是Dict,使用字典方式取值
print(request.form["user"]) #xiao
print(request.form.get("pwd")) #123
#字典迭代器对象,keys表示获取所有值
print(request.form.keys())#既然是迭代器,就可以使用for循环了
for i inrequest.form.keys():print(i)return "ok"
if __name__ == '__main__':
app.run("0.0.0.0", 5000, debug=True)
View Code
重新提交一次,就可以了!
查看Pycharm控制台输出:
POST
ImmutableMultiDict([('user', 'xiao'), ('pwd', '123')])
xiao123
user
pwd
View Code
解释一个 @app.route("/req",methods=[