Flask相对于Django是一个比较微小的服务器,是一个微服务Web框架,几行代码就能建一个简单地服务,如下代码。但并不是说他不如Django,flask就相当于毛坯房,里面很多东西都需要自己去装饰,所以定制化很强。而Django相当于精修的房子,能够直接领包入户,Django是比较繁重的。
一个简单地Flask服务器:
from flask import Flask # 创建服务 app = Flask(__name__) # 使用装饰器配置路由,当收到该路由请求时就会执行下面的函数 # 在Flask程序中使用路由我们称之为注册路由,是使用程序实例提供的app.route()装饰器注册路由,而括号内的字符串就是url,注册路由的过程就是完成了 url和python类或函数映射的过程,可以理解为会有一张表保存了url与python类或函数的对应关系。 @app.route("/") def main(): return "<h1>Hello WOrld</h1>" if __name__ == "__main__": # 执行服务 app.run()
常见的请求实现
- GET请求
请求的参数放在了request.args内,使用request.args.get(‘参数名’)得到参数值
from flask import Flask, request, jsonify # request是请求对象,是一个全局对象 # jsonify是将字典对象转为json的方法,使用json.dumps()同样可以 app = Flask(__name__) # get请求实现 # http://127.0.0.1:5000/get?name=hxd&age=12 @app.route("/get", methods=['GET']) def get_request(): name = request.args.get('name') age = request.args.get('age') return jsonify({"name": name, "age": age}) if __name__ == "__main__": app.run()
POST请求
请求的数据放在request.from内, 使用dict(request.from)将其转为字典即可提取里面的值了
服务端:
from flask import Flask, request # request是请求对象,是一个全局对象 # jsonify是将字典对象转为json的方法,使用json.dumps()同样可以 app = Flask(__name__) # post方式实现 @app.route("/post", methods=['POST']) def post_request(): data = dict(request.form) values = request.values print(values) return data
客户端 :
import requests import json url = "http://127.0.0.1:5000/post" data = { "name": "hxd", "age": "21" } data = requests.post(url=url, data=data).text print(data)
Flask的模板和重定向
前面我们返回给用户的只是一个简单地Hello World, 但是当我们需要返回跟更大的html代码就需要将html代码保存在文件里了,使用模板就是在用户请求时返回html文件
需要在服务根目录下创建一个templates文件夹,里面存放html文件
如:
在templates创建一个index.html文件,并写入如下内容
<html> <head> <title>Flask</title> <meta chaset="utf-8"> </head> <body> <center> <h1>Flask Nb!</h1> </center> </body> </html>
python代码
from falsk import Flask, render_template app = Flask() @app.route("/", methods=["GET"]) def mian(): return render_template("index.html") if __name__ == "__main__"
模板语言
- 变量
后端:
@app.route("/",methods=('get','post')) def test(): name = "Flask" return render_template('index.html',name = name)
前端:
<html> <head> <title>模板语言</title> <meta chaset="utf-8"> </head> <body> <h1>{{name}}, NB!</h1> </body> </html>
流程控制
后端
dic = [{"name": "Python", "rank": 2}, {"name": "Java", "rank": 3}, {"name": "C", "rank": 1}] @app.route("/rank") def rank(): return render_template("rank.html", dic=dic)
前端 :
<html> <head> <title>模板语言</title> <meta chaset="utf-8"> </head> <body> <table> <tr> <th>语言</th> <th>排行</th> </tr> {% for name, rank in dic.items() %} <tr> <td>{{name}}</td> <td>{{rank}}</td> </tr> {% endif %} // </table> </body> </html>
在for循环内你可以访问这些变量:
loop.index 当前循环迭代的次数(从 1 开始)
loop.index0 当前循环迭代的次数(从 0 开始)
loop.revindex 到循环结束需要迭代的次数(从 1 开始)
loop.revindex0 到循环结束需要迭代的次数(从 0 开始)
loop.first 如果是第一次迭代,为 True
loop.last 如果是最后一次迭代,为 True)
loop.length 序列中的项目数
loop.cycle 在一串序列间期取值的辅助函数
if判断
{% if dic[1].name == python %} <h2>第一个语言是python</h2> {% elif dic[1].rank == 1 %} <h2>第一个显示的语言排名是第一名</h2> {% else %} <h2>第一个显示的语言既不是python,也不排第一</h2> {% endif %}
防止xss攻击
Flask有防止xss攻击的措施,所以你传递的参数如果是html代码就不会正常显示,所以需要做以下措施
后端:
from flask import Markup # 导入 flask 中的 Markup 模块 tag = Markup('<h1>伟大诞生自平凡</h1>') # 然后再讲tag作为参数传递给前端使用
前端:
{{tag | safe}} # 加上管道符 |safe
重定向(redirect)
可以将一个路由重定向到另一个路由,比如我们在登录时,输入的密码错误,这是服务器应该重定向到登录界面,但输入的密码正确,我们就重定向到个人首页。
from falsk import Flask, redirect app = Flask() @app.route("/", methods=["GET"]) def mian(): return redirect("http://www.baidu.com") if __name__ == "__main__"