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