1.前提
首先需要安装Flask,通过pip list的方式查看是否安装了Flask
本人使用的版本为:Flask 1.1.1
2.开始创建一个Flask项目
创建后发现具有一个templates文件夹和static文件夹,还有一个app.py这个文件
1.启动后发现可以访问
2.查看当前的app.py文件
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
3.分析当前的app.py中的代码,
-
app = Flask(__name__)
这里应该就是创建一个Flask的实例,并传递这个py文件的名称 - 发现
app.run()
应该就相当于springboot中的SpringApplication.run()
,都是启动的入口类 -
@app.route('/')
就相当于当前SpringBoot中的注解@RequestMapping("/")
,是用来通过这个url才能访问这个方法的控制器 -
return 'Hello World!'
表示返回的内容为text/html
,就是直接将这个当作文本返回不做任何处理
可以通过以上的分析实现访问控制@app.route(’/’),可以通过定义路由的方式实现方法的调用
3.查看Flask的官方文档
本人访问的是:Flask快速上手
3.1 创建一个hello路由
@app.route("/hello")
def hello():
return "你好张三!" # 这里默认返回的数据为text/html
3.2 创建一个rest风格的路由并传递参数
# 使用restful实现当前的操作
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % (username)
@app.route("/user/del/<int:del_id>")
def del_user_by_id(del_id):
return "当前删除的用户编号为:%d" % (del_id)
3.3 关于路由定向(这里是指路由的结尾为/)
例如:有一个路由为@app.route("/hello/")
,如果访问的路径为/hello的时候会自动定向到/hello/这个路由中
,但是注意不能同时存在@app.route("/hello/")和@app.route("/hello")会报错的!
# 使用当前的模板测试,就是将当前的html静态页面放在当前的templates
@app.route('/hello/')
def hello():
return "hello"
3.4 创建一个返回json数据的路由
在当前的Flask中默认如果使用返回的数据类型为:dict(字典类型)时默认返回的数据为json的数据类型
app.route("/json")
def json_result():
return {"username": "张三", "age": 18, "pwd": "123456"} # 如果返回的数据为字典类型的数据默认会转换为json数据返回
这里出现了乱码所以需要添加这个解决json乱码问题:app.config['JSON_AS_ASCII'] = False
3.5 转发(就是页面的转发)
1.在当前的Flask中使用转发需要导入render_template模块
:from flask import render_template
2.在导入后需要编写当前的html页面,就是当前render_template需要转发的页面
,这个html页面需要写在当前的templates文件夹中
!
# 使用当前的模板测试,就是将当前的html静态页面放在当前的templates
@app.route('/hello/')
@app.route('/hello/<name>')
def hello():
# assert name is not None 断言的简单使用
return render_template('hello.html')
当前的hello.html页面
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
3.6 转发并传递参数过去
这里默认使用路径参数,传递参数的时候需要使用name=name的方式传递,
等号左边的的name就是当前的html页面使用的参数
,等号后面的参数就是需要传递的数据
# 使用当前的模板测试,就是将当前的html静态页面放在当前的templates
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
# assert name is not None 断言的简单使用
return render_template('hello.html', name=name)
3.7 模板的语法
由于当前的Flask的模板语法是参照当前的Django的语法实现的,所以直接使用当前Django的语法即可!
3.8 重定向到页面
使用重定向的时候需要导入redirect模块
:from flask import redirect
@app.route("/redirect/", methods=["GET"])
def redirect_page():
return redirect(location="/hello")
3.9 获取提交的参数
这里假设用户登录操作!
在当前的Flask中获取提交的参数有两种一种就是表单的提交一种就是GET请求的参数
,都需要导入request模块
才能使用:from flask import request
- 获取当前的GET请求中的参数需要使用 :request.args[“参数名称”]
- 获取当前的POST请求中的参数需要使用:request.form[“参数名称”]
- 获取上传的文件需要使用:request.files[‘表单提交文件的表单名’]
登录界面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录界面</title>
</head>
<body>
<form action="login" method="post">
<input type="text" name="loginName"/> <br/>
<input type="text" name="loginPwd"/> <br/>
<input type="submit" value="登录"/> <br/>
{{ msg }}
</form>
</body>
</html>
登录成功的页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这里是主页面</title>
</head>
<body>
<h1>登录成功!欢迎用户:{{ loginName }}</h1>
</body>
</html>
后台的处理表单提交的方法
@app.route('/')
def to_login_page():
return render_template("login.html")
@app.route("/login", methods=["POST"])
def login():
loginName = request.form["loginName"]
loginPwd = request.form["loginPwd"]
if loginName == "admin" and loginPwd == "admin":
print("login success")
return render_template("index.html", loginName=loginName)
else:
return render_template("login.html", msg="用户名或密码错误!")
@app.route("/addUser", methods=["GET", "POST"])
def get_form_params():
# 使用三元表达式写入请求的方式
method_way = "POST" if request.method == "POST" else "GET"
username = None
# 通过当前的request.form[] 方式获取的是post请求传递的参数,不能用于get请求获取参数,如果参数不存在的话就会报错
if "username" in request.form: # 用于处理post请求的数据,一般用于处理表单提交的数据
username = request.form["username"]
elif "username" in request.args: # 一般用于当前的get请求传递的参数或者数据
username = request.args["username"]
return "当前使用的请求方式为:{0},传递的参数为:{1}".format(method_way, username)
3.10 使用session的方式传递参数
在Flask中使用session的时候需要导入session模块:from flask import session
在使用的时候还需要定义secret_key
:app.secret_key = "10010"
(这里随便瞎写的)
@app.route('/')
def to_login_page():
return render_template("login.html")
@app.route("/login", methods=["POST"])
def login():
loginName = request.form["loginName"]
loginPwd = request.form["loginPwd"]
if loginName == "admin" and loginPwd == "admin":
print("login success")
session["userName"] = loginName # 使用session的时候需要设置secret_key
return render_template("index.html", loginName=loginName)
else:
return render_template("login.html", msg="用户名或密码错误!")
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这里是主页面</title>
</head>
<body>
<h1>登录成功!欢迎用户:{{ loginName }}</h1>
<h1>Session中的内容:{{ session.userName }}</h1>
</body>
</html>
4.总结
1.使用返回数据为json的时候一定要设置app.config['JSON_AS_ASCII'] = False
,否者出现乱码问题
2.在获取提交的数据的时候有两种处理方式:request.args和request.form
3.在使用session的时候需要设置app.secret_key ,否者会报错的!
4.在使用模板html的时候语法与当前的Django的语法基本一致