一.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的开销

最新文章

  1. 精通Web Analytics 2.0 (6) 第四章:点击流分析的奇妙世界:实际的解决方案
  2. mac java环境变量设置
  3. Saltstack常用模块及API
  4. LINQ to Entities 和LINQ to Objects 的区别
  5. Exit函数
  6. nohup和&amp;的区别
  7. java.util.concurrent.CountDownLatch
  8. wcf自身作为宿主的一个小案例
  9. 使用UIPageControl UIScrollView制作APP引导界面
  10. SharePoint数据视图无法打开
  11. CSS三种样式表
  12. Win10下python3和python2同时安装并解决pip共存问题
  13. 如何用代码禁用SpriteBuilder中创建的关节
  14. 《JAVASCRIPT 高级程序设计》读书笔记六 面向对象的程序设计
  15. python(一)——初识与变量
  16. Redis Python开发指南
  17. shell 判断字符串长度是否不为0
  18. HDU1863 畅通工程 2017-04-12 19:25 59人阅读 评论(0) 收藏
  19. Memcached append 命令
  20. es6精华

热门文章

  1. flex新的心得
  2. Crystal Report - 利用后台代码设计或实现水晶报表工具栏相关功能
  3. Windows SublimeText内使用NDK编译Android so(不用cygwin)
  4. Android中去掉标题的方法总结
  5. Android中的事件处理研究
  6. c语言学习笔记(5)——进制
  7. DDD实战6 WebAPI
  8. WPF图形/文字特别效果之一:交叉效果探讨
  9. 用WPF实现打印及打印预览
  10. git clone命令简介