flask与djiango的区别
djiango是一个大而全的框架。
djiango内部为我们提供了非常多的组件: orm/session/cookie/admin/form/modelform/路由/视图/模板/中间件/分页/auth/contenttype/缓存/信号/多数据库连接
flask 是一个轻量级的框架,本身没有什么太多的功能:路由/视图/模板jinja2/session/中间件,第三方组件非常齐全。
注意事项:djiango的请求是逐一封装和传递。flask请求是利用是上下文管理来实现的。
flask快速使用
安装命令
pip3 install flask
与此同时会安装 依赖 Jinja2 和 Werkzeug
wsgi-Werkzeug
模板-Jinja2
使用flask构建服务
from flask import Flask
# 创建flask对象
app = Flask(__name__)
# 路由和视图函数放在一起
@app.route("/index")
def index():
return "hello world"
if __name__ == '__main__':
app.run()
使用werkzeug构建服务
from werkzeug.serving import run_simple
def func(environ, start_response):
print("请求来了")
pass
if __name__ == '__main__':
run_simple('127.0.0.1', 5000, func)
app.run()方法的源码如下得知:
得出结论:flask构建服务的底层就是使用的werkzeug构建服务。
1.flask框架是基于werkzeug的wsgi实现,flask自己没有wsgi。
2.用户请求一旦到来,就会执行app.__call__方法。
视图模板
默认的模板路径 templates
from flask import Flask, render_template
app = Flask(__name__, template_folder="templates")
@app.route("/login")
def login():
return render_template("login.html")
if __name__ == '__main__':
app.run()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
登录
</body>
</html>
jsonify返回json数据
from flask import Flask, jsonify
app = Flask(__name__, template_folder="templates")
@app.route("/login")
def login():
return jsonify({"code":200, "data":[1,2,3]})
if __name__ == '__main__':
app.run()
简单的登录功能
request
redirect
render_template
request.method
request.form.get(变量名) 取表单变量的值,Post方式提交的参数
from flask import Flask, render_template, request, redirect
app = Flask(__name__, template_folder="templates")
@app.route("/login", methods=["GET", "POST"])
def login():
method = request.method
if method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
if username == 'admin' and password == '123':
return redirect("/index")
error = '用户名密码错误'
return render_template("login.html", error=error)
@app.route("/index")
def index():
return render_template("index.html")
if __name__ == '__main__':
app.run()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form method="post">
用户名:<input type="text" name="username" /><br/>
密码:<input type="text" name="password" /><br/>
<input type="submit" value="提交"><span style="color:red">{{error}}</span>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>首页</h1>
</body>
</html>
request.args.get(变量名) url地址上传递的参数,get方式传递的参数
返回数据类型
1.return render_tempalte("模板文件")
2.return jsonfy({“name”:"aa"})
3.return redirect("/index") or return redict(url_for("idx"))
4.return "xxx" # 返回字符串
完整版,简单的登录、首页、修改、删除、session登录验证功能
from flask import Flask, render_template, request, redirect, url_for, session
app = Flask(__name__, template_folder="templates")
# 使用session时需要,值可以先随便写一个
app.secret_key = "12345"
# 定义一个全局变量来当做数据库
DATA_DICT = {
1: {'name': '张三', 'age': 18, 'gender': '男'},
2: {'name': '李四', 'age': 22, 'gender': '男'}
}
@app.route("/login", methods=["GET", "POST"])
def login():
method = request.method
if method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
if username == 'admin' and password == '123':
session['xx'] = username
return redirect("/index")
error = '用户名密码错误'
return render_template("login.html", error=error)
# endpoint给路由取了个别名,如果不指定,endpoint的默认值为函数名
# endpoint的值不能重名
@app.route("/index", endpoint="index_page")
def index():
username = session.get('xx')
if not username:
# 如果未登录则跳转到登录页面
return redirect("/login")
return render_template("index.html", DATA_DICT=DATA_DICT)
@app.route("/edit", methods=['GET', "POST"])
def edit():
username = session.get('xx')
if not username:
# 如果未登录则跳转到登录页面
return redirect("/login")
id = request.args.get('nid')
id = int(id)
if request.method == 'POST':
name = request.form.get('name')
age = request.form.get('age')
gender = request.form.get('gender')
DATA_DICT[id]['name'] = name
DATA_DICT[id]['age'] = age
DATA_DICT[id]['gender'] = gender
return redirect(url_for("index_page"))
info = DATA_DICT[id]
return render_template("edit.html", info=info)
# 默认就是str类型,可以不写
@app.route("/del/<int:nid>")
def delete(nid):
username = session.get('xx')
if not username:
# 如果未登录则跳转到登录页面
return redirect("/login")
print(f"nid={nid}")
# 根据key删除dict的元素
del DATA_DICT[nid]
# 通过url_for来重定向跳转
return redirect(url_for("index_page"))
if __name__ == '__main__':
app.run()
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>首页</h1>
<table border="1">
<thead>
<td>序号</td>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
<td>操作</td>
</thead>
<tbody>
{% for key, value in DATA_DICT.items() %}
<tr>
<td>{{key}}</td>
<td>{{value.get('name')}}</td>
<td>{{value['age']}}</td>
<td>{{value.gender}}</td>
<td>
<a href="/edit?nid={{key}}">编辑</a>
<a href="/del/{{key}}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form method="post">
用户名:<input type="text" name="username" /><br/>
密码:<input type="text" name="password" /><br/>
<input type="submit" value="提交"><span style="color:red">{{error}}</span>
</form>
</body>
</html>
edit.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>编辑</title>
</head>
<body>
<form method="post">
<input type="text" name="name" value="{{info.name}}"><br/>
<input type="text" name="age" value="{{info.age}}"><br/>
<input type="text" name="gender" value="{{info.gender}}"><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>