flask 基本使用
flask 简介
django是个大而全的框架,flask是一个轻量级的框架。
django内部为我们提供了非常多的组件:orm / session / cookie / admin / form / modelform / 路由 / 视图 / 模板 / 中间件 / 分页 / auth / contenttype / 缓存 / 信号 / 多数据库连接
flask框架本身没有太多的功能:路由/视图/模板(jinja2)/session/中间件 ,第三方组件非常齐全。
注意:django的请求处理是逐一封装和传递; flask的请求是利用上下文管理来实现的。
flask快速使用
安装
pip3 install flask
view
from flask import Flask
# 创建flask对象
app = Flask(__name__)
@app.route('/index')
def index():
return 'hello world'
@app.route('/login')
def login():
return 'login'
if __name__ == '__main__':
app.run()
总结:
- flask框架是基于werkzeug的wsgi实现,flask自己没有wsgi。
- 用户请求一旦到来,就会之
app.__call__
方法 。 - 写flaks标准流程
flask路由
from flask import Flask
# 创建flask对象
app = Flask(__name__)
@app.route('/login',methods=['GET','POST'])
def login():
return 'login'
if __name__ == '__main__':
app.run()
路由的参数(别名)
我访问 /index 得到 login
from flask import Flask,render_template,redirect,url_for
# 创建flask对象
app = Flask(__name__)
@app.route('/index')
def index():
return redirect(url_for('login'))
@app.route('/login',methods=['GET','POST'],endpoint="login")
def login():
return 'login'
if __name__ == '__main__':
app.run()
动态路由
view
from flask import Flask,render_template,redirect,url_for,request
# 创建flask对象
app = Flask(__name__,template_folder='templates')#template_folder这个参数是控制模板文件夹的默认 templates 可以不写
@app.route('/index')
def index():
return render_template('index.html')#先创建templates文件夹
# 获取?后面的值
@app.route('/edit1')
def edit1():
name=request.args.get('name')
print(name)
return 'ok'
#默认是字符串类型
@app.route('/edit2/<name>')
def edit2(name): # 默认字符串类型
print(name)
return 'ok'
#默认是字符串类型
@app.route('/edit3/<int:nid>')
def edit3(nid): # 默认字符串类型
print(nid)
return 'ok'
if __name__ == '__main__':
app.run()
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>测试</h1>
<a href="/edit1?name=小强">编辑1</a>
<a href="/edit2/小强2">编辑2</a>
<a href="/edit3/3">编辑3</a>
</body>
</html>
获取提交的数据
from flask import request
@app.route('/index')
def login():
request.args # GET形式传递的参数
request.form # POST形式提交的参数
返回数据
@app.route('/index')
def login():
return render_template('模板文件')
return jsonify()#jsom
reutrn redirect('/index/') # reutrn redirect(url_for('idx'))返回别名
return "...."#返回值
模板处理
view
@app.route('/login',methods=['GET','POST'])
def login():
error = '用户名或密码错误'
# return render_template('login.html',**{'error':error})
return render_template('login.html',error=error)
DATA_DICT = {
1: {'name':'陈硕',"age":73},
2: {'name':'汪洋',"age":84},
}
@app.route('/index',endpoint='idx')
@auth
def index():
data_dict = DATA_DICT
return render_template('index.html',data_dict=data_dict)
html
{{ error }}#传来什么就是什么
{% for key,value in data_dict.items() %}
<tr>
<td>{{key}}</td>
<td>{{ value.name}}</td>
</tr>
{% endfor %}
装饰器
import functools
def auth0(func):
print(2)
@functools.wraps(func)
def inner(*args, **kwargs):
return func(*args, **kwargs)
print(22)
return inner
def auth1(func):
print('1')
@functools.wraps(func)
def inner(*args, **kwargs):
return func(*args, **kwargs)
print(11)
return inner
@auth0
@auth1
def index():
print('index')
打印结果
1
11
2
22
#离他进的先执行·
保存用户会话信息session
装饰器验证
def auth(func):
@functools.wraps(func)
def inner(*args,**kwargs):
username = session.get('xxx')
if not username:
return redirect(url_for('login'))
return func(*args,**kwargs)
return inner
添加session
app.secret_key = 'uo3kj9sd78ij3l4kj9sd87fj'#要设置这个 key 不然报错
@app.route('/login',methods=['GET','POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
user = request.form.get('user')
pwd = request.form.get('pwd')
if user == 'changxin' and pwd == "dsb":
session['xxx'] = 'changxin'
return redirect('/index')
error = '用户名或密码错误'
return render_template('login.html',error=error)# 相当于return render_template('login.html',**{'error':error})
被验证的加了装饰器的
@app.route('/del/<int:nid>')
@auth
def delete(nid):
del DATA_DICT[nid]
# return redirect('/index')
return redirect(url_for("idx"))
- flask的session是保存在:加密的形式保存在浏览器的cookie上。
- 装饰器相关
- 编写装饰器,记得加functools
- 多个装饰器的应用
非学,无以致疑;非问,无以广识