一.python现阶段三大主流框架Django Tornado Flask的对比

特点:
1.Django的特点是大而全,集成了很多组件,属于全能型框架
2.tornado的主要特点是原生异步非阻塞,在IO密集型和多任务处理上占有绝对优势,属于专注型框架
3.flask的的特点是小而轻,原生组件几乎为0

使用类型:
1.Django适用于大型的web应用,由于内部的组件足够强大,可以使开发一气呵成
2.tornado适用于api后端应用,常服务于游戏后台,因为内部的异步非阻塞非常稳
3.简单的应用用flask非常简洁,大型的应用Django和flask都可以

缺点:
1.djnago的缺点是资源一次性全部加载,会造成资源浪费
2.tornado太干净了,连个session都不支持
3.flask相对不稳当,由于依赖第三方

二.下载

pip3 install flask

第三方组件:http://flask.pocoo.org/

三.简单实现

1.三行启动flask

from flask import Flask ,jsonify
app = Flask(__name__)
app.run(debug=True)

2.六行带视图函数

from flask import Flask  #导入flask类
app = Flask(__name__) #实例化一个flask对象app

@app.route("/") #router装饰器
def index(): #视图函数
return "aaa"

app.run("0.0.0.0",5000,debug=True) #启动flask web应用

四.Flask中的Render Redirect HttpResponse

1.Flask中的HttpResponse其实 就是直接返回字符串

@app.route("/")
def index():
return "aaa"

2.Flask中的Redirect

from flask import Flask,redirect

app = Flask(__name__)

@app.route("/")
def index():
return redirect("/index") #在访问"/"时,重定向到"/index"

@app.route("/index")
def index1():
return "重定向"

app.run("0.0.0.0",5000,debug=True)

3.Flask中的render

from flask import Flask,render_template

app = Flask(__name__)

@app.route("/index")
def index1():
return render_template('index.html')

app.run("0.0.0.0",5000,debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>这是index.html</div>
</body>
</html>

4.除Render Redirect HttpResponse外,Flask特有的jsonify与senf_file

(1)jsonify(与json.dumps不同的是会有请求头application/json)

from flask import Flask,render_template,jsonify

app = Flask(__name__)

@app.route("/")
def index1():
return jsonify({"aa":1})

app.run("0.0.0.0",5000,debug=True)

(2)send_file

from flask import Flask,render_template,send_file

app = Flask(__name__)

@app.route("/")
def index1():
name="shy"
return send_file("dvd.mp4")

app.run("0.0.0.0",5000,debug=True)

send_file可以返回文字,文件,图片,视频等等,自动识别文件是什么类型的文件,在Content-Type:后加文件类型

五.八种请求方式

get post delete put
option trace connnect head

methods参数

from flask import Flask,render_template,send_file
app = Flask(__name__)

@app.route("/",methods=["POST"])#规定了methods参数后,其他请求就无法访问该视图函数
def index1():
name="shy"
return send_file("dvd.mp4")

app.run("0.0.0.0",5000,debug=True)

六.request的使用(公共变量)

request.method:获取请求方式的名字

request.form:存放formdata中的数据(前端中表单中的数据)

request.args:获取url中的数据 如:ImmutableMultiDict([('a', '')]),可以to_dict()转化成字典

request.url:访问的完整路径 如:http://127.168.13.61:5000/?a=1

request.path:路由地址 如:/index

request.host:主机地址 如:127.168.13.61:5000

request.host-url:http+主机地址 如:http://127.168.13.61:5000/index

request.json:如果请求头中的contentType:aplication/json,直接序列化

request.data:如果请求头中的contentType:aplication/dfsg,不知道怎么序列化时无法被识别,请求体中的原始数据放到这

request.values:用于查看数据通常不用来获取数据 如:CombinedMultiDict([ImmutableMultiDict([('a', '')]), ImmutableMultiDict([])])

request.files:获取文件信息

request.cookies:获取cookie中的数据

request.headers:获取请求头

注:to_dict方法

to_dict方法:类似这样ImmutableMultiDict,CombinedMultiDict,像字典一样的数据类型,都可以使用to_dict方法,request.values.to_dict():会出现覆盖问题
 

七.jinja2语法(与template几乎一模一样!!!)

1.引用变量(字典的传递)

from flask import Flask,redirect,render_template,request

app = Flask(__name__)

STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'}

@app.route("/login",methods=["GET","POST"])
def login():
print(request.form)
if request.method=="GET":
return render_template('login.html')
if request.form.get("username")=="aaa" and request.form.get("password")=="":
return redirect('/index')
else:
return "登录失败"
@app.route("/index")
def index():
return render_template('index.html',stu=STUDENT)

app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>这是index.html</div>
学生信息{{ stu }}
<table>
<tr>
<td>{{ stu.name }}</td>
<td>{{ stu.age }}</td>
<td>{{ stu.gender }}</td>
</tr>
<tr>

</tr>
</table>
</body>
</html>

2.逻辑代码(列表的传递)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>这是index.html</div>
学生信息{{ stu }}
<table>
<tr>
<td>{{ stu.name }}</td>
<td>{{ stu.age }}</td>
<td>{{ stu.gender }}</td>
</tr>
{% for foo in lis %}
<tr>
<td>{{ foo.name }}</td>
<td>{{ foo.age }}</td>
<td>{{ foo.gender }}</td>
</tr>
{% endfor %}


</table>
</body>
</html>

3.Markup的使用(相当于 |safe,安全标签字符串)(标签字符串的传递)

from flask import Flask,redirect,render_template,request,Markup

app = Flask(__name__)
##############################
word="<p>hahaha</p>"
word1=Markup(word)
##############################
@app.route("/login",methods=["GET","POST"])
def login():
print(request.form)
if request.method=="GET":
return render_template('login.html')
if request.form.get("username")=="aaa" and request.form.get("password")=="":
return redirect('/index')
else:
return "登录失败"
@app.route("/index")
def index():
return render_template('index.html',stu=STUDENT,lis=STUDENT_LIST,word=word1)

app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>这是index.html</div>
##########################
{{ word }}
##########################
</body>
</html>

4.函数的传递

(1)单个函数的传递

from flask import Flask,redirect,render_template,request,Markup

app = Flask(__name__)

def add(a,b):
return a+b

@app.route("/login",methods=["GET","POST"])
def login():
print(request.form)
if request.method=="GET":
return render_template('login.html')
if request.form.get("username")=="aaa" and request.form.get("password")=="":
return redirect('/index')
else:
return "登录失败"
@app.route("/index")
def index():
return render_template('index.html',func=add)

app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>这是index.html</div>
学生信息{{ stu }}
{{ func(1,2) }}
</body>
</html>

(2)template_global,如果数量多的话,变成全局都可以使用的函数

from flask import Flask,redirect,render_template,request,Markup

app = Flask(__name__)

#############################
@app.template_global()#template_global是一个特殊的装饰器
def add(a,b):
return a+b
##############################

@app.route("/login",methods=["GET","POST"])
def login():
print(request.form)
if request.method=="GET":
return render_template('login.html')
if request.form.get("username")=="aaa" and request.form.get("password")=="":
return redirect('/index')
else:
return "登录失败"
@app.route("/index")
def index():
return render_template('index.html')

app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>这是index.html</div>
学生信息{{ stu }}
{{ add(2,2) }}
</body>
</html>

(3)可以传递参数的全局函数

from flask import Flask,redirect,render_template,request,Markup

app = Flask(__name__)

@app.template_filter()
def fil(a,b,c):
return a+b+c

@app.route("/login",methods=["GET","POST"])
def login():
print(request.form)
if request.method=="GET":
return render_template('login.html')
if request.form.get("username")=="aaa" and request.form.get("password")=="":
return redirect('/index')
else:
return "登录失败"
@app.route("/index")
def index():
return render_template('index.html')

app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>这是index.html</div>
学生信息{{ stu }}
{{ 1 |fil(2,3) }}
</body>
</html>

5.宏macro

from flask import Flask,redirect,render_template,request,Markup

app = Flask(__name__)

@app.route("/login",methods=["GET","POST"])
def login():
print(request.form)
if request.method=="GET":
return render_template('login.html')
if request.form.get("username")=="aaa" and request.form.get("password")=="":
return redirect('/index')
else:
return "登录失败"
@app.route("/index")
def index():
return render_template('index.html')

app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>这是index.html</div>
学生信息{{ stu }}
#################定义宏#####################
{% macro create_input(na,ty) %}
用户名:{{ na }}<input type="{{ ty }}" name="{{ na }}">
{% endmacro %}
##################给宏传值#####################
{{ create_input("username","text") }}
</body>
</html>

八.session(公共变量)

from flask import session
app = Flask(__name__)
app.secret_key = "DragonFire" #用来加密的字符串

设置session

session["username"]="shy"

获取session

session.get("username")#如果出现KeyError,说明没有这个key的session

session机制:flask中的session是存储在cookie中的,为了节省flask的开销

flask(一)的更多相关文章

  1. flask+sqlite3+echarts2+ajax数据可视化

    前提: 准备Python + Flask+Sqlite3的平台环境(windows系统) 前面一节介绍flask怎么安装了,剩下sqlite3下载后解压,然后环境变量添加解压路径就行了 附加下载地址: ...

  2. flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法

    flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...

  3. Windows下快速安装Flask的一次经历

    前提: 1.已安装python版本(一般都是2.X) 2.已安装easy_install python安装,记得配置Python的环境变量,例如:我的直接在Path上加 G:\Python 验证安装P ...

  4. 使用Flask设计带认证token的RESTful API接口[翻译]

    上一篇文章, 使用python的Flask实现一个RESTful API服务器端  简单地演示了Flask实的现的api服务器,里面提到了因为无状态的原则,没有session cookies,如果访问 ...

  5. 使用python的Flask实现一个RESTful API服务器端[翻译]

    最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务 ...

  6. python flask (一)

    from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World ...

  7. flask源码分析

    本flask源码分析不间断更新 而且我分析的源码全是我个人觉得是很beautiful的 1 flask-login 1.1 flask.ext.login.login_required(func),下 ...

  8. Python flask 基于 Flask 提供 RESTful Web 服务

    转载自 http://python.jobbole.com/87118/ 什么是 REST REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转 ...

  9. Python flask @app.route

    转载自 http://python.jobbole.com/80956/ 下面是Flask主页给我们的第一个例子,我们现在就由它入手,深入理解“@app.route()”是如何工作的.         ...

  10. Flask 框架入门

    Flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 安装 Flask 依赖两个外部库, We ...

随机推荐

  1. parfor —— matlab 下的并行循环

    parfor:parallel for 循环 我们知道,matlab 更适合的处理对象是矩阵,而不是大规模的循环运算.当有时不得不使用 for 循环时,如果提高 for 循环的执行效率呢.这就是 pa ...

  2. Android 平台下Cordova 调用Activity插件开发

    首先建立一个包名为package com.JiajiaCy.CallActivity; package com.JajaCy.CallActivity; import org.apache.cordo ...

  3. TCL S960T刷机包 乐蛙OS5 稳定版 平滑 优化

    ROM简介 乐蛙OS5完美的最终稳定版 Ver14.10.17 温馨提示:一定要明确系统双成一个完整的包画刷入前开发版,否则会造成系统异常,请务必备份手机刷机前的信息和数据,刷机过程中,为了避免因数据 ...

  4. solr+ Eclipse 4.3+ tomcat 7.5 +winds7(一)

    这种方法是我自己依据对tomcat运行项目流程和solr的运行流程来自己弄的,所以有点麻烦,请到原地址查看心血谢谢:http://blog.csdn.net/chunlei_zhang/article ...

  5. PHP和MySQL Web开发 经典书籍

    <PHP和MySQL Web开发> PHP and MySQL Web Development“使用PHP和MySQL构建数据库驱动的Web应用程序的权威指南” 笔者推荐 PHP和MySQ ...

  6. 给WPF文字加多条修饰线

    原文:给WPF文字加多条修饰线 这是上篇WPF中的文字修饰--上划线,中划线,基线与下划线 最后留给朋友思考的问题. 效果图: XAML代码:<Page xmlns="http://s ...

  7. 组态DNS、搜索域名和主机名

    一个.组态DNS和搜索领域 特别配置DNS该文件是/etc/resolv.conf:同时,我们可以ifcfg-eth0网卡的配置和其他配置文件中指定的. 演示样本: [root@instructor ...

  8. python中string的操作函数

    在python有各种各样的string操作函数.在历史上string类在python中经历了一段轮回的历史.在最开始的时候,python有一个专门的string的module,要使用string的方法 ...

  9. 如何构造请求处理对象链(Pipeline)

    在开发中,我们经常会遇到这样一个场景:传入一个对象,经过不同的节点对这个对象做不同的操作,比如ASP.NET Core 中的pipeline,IIS中的HTTPpipeline等.在这类问题中,往往我 ...

  10. Angular路由守卫 canActivate

    作用 canActivate 控制是否允许进入路由. canActivateChild 等同 canActivate,只不过针对是所有子路由. 关键代码 创建路由守卫 import { Injecta ...