心得:学完django和rest-framework之后,再来学习flask框架,感觉似曾相识,很多类似的地方,加油,加油~
一、介绍
Django web:
优点:大而全,ORM models ,model Form ,admin ,csrf ,session
缺点:资源浪费
Flask web:
优点:小而精,ORM:x , Form:x , admin:x,csrf:x,session:√,第三方组件 : 全
缺陷:稳定性较差
Tornado:
优点:异步IO非阻塞 原生websocket
缺点:啥都没有
Sanic Web:
优点:速度极快
async def index():
第一个flask示例:
__name__
在自身文件中的含义为当前文件返回的是main
;当其他文件调用时,__name__
表示的是调用文件名返回的是test
。
from flask import Flask
app = Flask(__name__) #实例化app
@app.route("/",methods=["GET","POST"]) #设置路由
def index():
return "Hello World" #返回结果
app.run() #运行
二、Reseponse的五种方式
1. 返回字符串
Django中HTTPResponse对应:return “先帝创业未半而中道崩殂”
@app.route("/",methods=["GET","POST"]) #设置路由
def index():
return "Hello World" #返回结果
2. 返回模板
render: return render_template(“login.html”)
创建模板文件夹templates,将模板文件放入文件夹内
from flask import Flask, render_template
@app.route("/index2")
def index2():
return render_template("index2.html")
3. 重定向和反向解析
重定向:
redirect:return redirect("/login")
from flask import Flask, render_template, redirect,url_for
@app.route("/")
def index1():
return redirect("/index2")
反向解析:
endpoint作用:
1 将名字复杂的函数名利用endpoint简单命名
2 url_for反向访问地址时,是动态获取路由
from flask import Flask, render_template, redirect,url_for
@app.route("/")
def index1():
return redirect(url_for('index2'))
@app.route("/index2",endpoint="index2")
def index2():
return render_template("index2.html")
4.发送文件
将文件发送到网页端,并生成对应的url路由
return send_file() : return send_file(“1.jpg”) 打开并传输文件
from flask import Flask, send_file
@app.route("/img/<filename>")
def img(filename):
return send_file("static/%s"%filename)
5. 发送Json数据
Content-Type 是 application/json , 这样做是符合 HTTP 协议的规定的,并且减小数据量
return jsonify() : return jsonify({“name”:“JWB”,“age”:73}) Content-Type: application/json
使用jsonify返回数据
## jsonify
import json
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/json')
def test_json():
data = {'name': 'lilei', 'age': 30}
return jsonify(data)
app.run(host="0.0.0.0", port=9877)
输出为:
Content-Type: application/json
{"age":30,"name":"lilei"}
使用json.dump返回数据
## json
import json
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/json')
def test_json():
data = {'name': 'lilei', 'age': 30}
return json.dumps(data)
app.run(host="0.0.0.0", port=9877)
输出:
Content-Type: text/html; charset=utf-8
{"name": "lilei", "age": 30}
三、Flask中的request
from flask import request
request.method 请求方式
request.form 存储的是所有FormData中的所有数据
request.args 存储的是所有URL中的所有数据
request.json Content-Type: application/json 存放在request.json中
request.data 当Content-Type无法被解析时,存放原始数据
request.url 请求地址
request.path url路由地址
request.host 主机地址
request.host_url 将主机地址转换为httpurl
request.files
from flask import Flask, render_template, redirect,send_file,url_for,jsonify,request
app = Flask(__name__,static_folder="haha",static_url_path="/statics")
#static_folder 加载本地精通文件地址
#static_url_path 将本地得静态文件全部发送到网页端,类似于send_file,然后html端调用
@app.route("/")
def index1():
return redirect(url_for('index2'))
@app.route("/index2",endpoint="index2")
def index2():
return render_template("index2.html")
@app.route("/login",methods=['GET',"POST"])
def login():
if request.method == "GET":
return render_template("login.html")
else:
dic=request.form.to_dict()
user=dic.get('user',0)
pwd=dic.get('pwd',0)
#print(request.files) #文件字典
#f=request.files.get('f',None) #获取文件
#f.save(f.filename) #存储文件在当前路径下
if user=='tian' and pwd =="123":
return redirect(url_for('index2'))
else:
return render_template("login.html",msg="账号或密码错误")
app.run(debug=True)
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<p><input type="text" name="user"></p>
<p><input type="password" name="pwd"></p>
<p><input type="file" name="f"></p>
<p><input type="submit"></p>
</form>
<h1>{{ msg }}</h1>
</body>
</html>
四、Jinja2基本语法
1 基本用法
符合python用法
{{}} 引用或执行时
{%%} 逻辑代码
Jinja2模板语言中的 for
{% for foo in g %}
{% endfor %}
Jinja2模板语言中的 if
{% if g %}
{% elif g %}
{% else %}
{% endif %}
示例:
STUDENT_LIST = [
{'name': 'Old', 'age': 38, 'gender': '中'},
{'name': 'Boy', 'age': 73, 'gender': '男'},
{'name': 'EDU', 'age': 84, 'gender': '女'}
]
@app.route("/student")
def index():
return render_template("student.html", student=STUDENT_LIST )
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Old Boy EDU</title>
</head>
<body>
Welcome to Old Boy EDU
<div>{{ student }}</div>
<table border="1xp">
{% for foo in student %}
<tr>
<td>{{ foo }}</td>
<td>{{ foo.name }}</td>
<td>{{ foo.get("age") }}</td>
<td>{{ foo["gender"] }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
2 高级用法
safe用法:
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route("/")
def index():
tag = "<input type='text' name='user' value='DragonFire'>"
return render_template("index.html",tag=tag)
app.run("0.0.0.0",5000)
前端处理:
{{ tag | safe}} <!-- 加上个 \ 管道符,然后 safe -->
后端处理:
from flask import Flask
from flask import render_template
from flask import Markup # 导入 flask 中的 Markup 模块
app = Flask(__name__)
@app.route("/")
def index():
tag = "<input type='text' name='user' value='DragonFire'>"
markup_tag = Markup(tag) # Markup帮助咱们在HTML的标签上做了一层封装,让Jinja2模板语言知道这是一个安全的HTML标签
return render_template("index.html", tag=markup_tag)
app.run("0.0.0.0", 5000, debug=True)
jinja2 中代码复用block
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Welcome OldboyEDU</h1>
<h2>下面的内容是不一样的</h2>
{% block content %}
{% endblock %}
<h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
<h1>OldboyEDU is Good</h1>
</body>
</html>
login.html
{% extends "index.html" %}
{% block content %}
<form>
用户名:<input type="text" name="user">
密码:<input type="text" name="pwd">
</form>
{% endblock %}
app.py
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route("/login")
def login():
return render_template("login.html")
app.run("0.0.0.0", 5000, debug=True)
五.Session
Flask 中 session 是需要 secret_key 的
app.secret_key = "yinjiaodawangba"
Flask中的session是保存在 cookie 中的
cookies 中 session 存储的是通过 secret_key 加密后的 key , 通过这个 key 从flask程序的内存中找到用户对应的session信息
session 进行验证:
from flask import Flask, render_template, redirect,send_file,url_for,jsonify,request,session
app = Flask(__name__,static_folder="haha",static_url_path="/statics")
app.secret_key="hahaha"
@app.route("/")
def index1():
if session.get('tian') == "tiantian":
return redirect(url_for('index2'))
else:
return redirect("/login")
@app.route("/login",methods=['GET',"POST"])
def login():
if request.method == "GET":
return render_template("login.html")
else:
dic=request.form.to_dict()
user=dic.get('user',0)
pwd=dic.get('pwd',0)
# print(request.files) #文件字典
# f=request.files.get('f',None) #获取文件
# f.save(f.filename) #存储文件在当前路径下
if user=='tian' and pwd =="123":
session['tian']="tiantian"
return redirect(url_for('index2'))
else:
return render_template("login.html",msg="账号或密码错误")
app.run(debug=True)