主要内容:
- 1. Flask基本概述
- 2. 请求相关
- 3. Flask中模板语言 jinja2
- 4. 内置Session
1. Flask 基本概述:
1.1 web框架 Django,Flask, Tornado 的对比
特点:
- 1.Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不管你用得到用不到,反正它全都有,属于全能型框架
- 2.Tornado 主要特点是原生异步非阻塞,在IO密集型应用和多任务处理上占据绝对性的优势,属于专注型框架
- 3.Flask 主要特点小而轻,原生组件几乎为0, 三方提供的组件请参考Django 非常全面,属于短小精悍型框架
使用方面
- Django 通常用于大型Web应用由于内置组件足够强大所以使用Django开发可以一气呵成
- Tornado 通常用于API后端应用,游戏服务后台,其内部实现的异步非阻塞真是稳得一批
- Flask 通常应用于小型应用和快速构建应用,其强大的三方库,足以支撑一个大型的Web应用
优缺点:
- Django 优点是大而全,缺点也就暴露出来了,这么多的资源一次性全部加载,肯定会造成一部分的资源浪费
- Tornado 优点是异步,缺点是干净,连个Session都不支持
- Flask 优点是精悍简单,缺点是过分依赖于第三方插件
1.2实例化一个 Flask 对象
app = Flask(__name__) # 这是实例化一个Flask对象,最基本的写法 # 但是Flask中还有其他参数,以下是可填的参数,及其默认值 def __init__(self, import_name, static_path=None, static_url_path=None, static_folder='static', template_folder='templates', instance_path=None, instance_relative_config=False, root_path=None):
其他参数:
- template_folder:模板所在文件夹的名字
- root_path:可以不用填,会自动找到,当前执行文件,所在目录地址(在return render_template时会将上面两个进行拼接,找到对应的模板地址)
- static_folder:静态文件所在文件的名字,默认是static,可以不用填
- static_url_path:静态文件的地址前缀,写成什么,访问静态文件时,就要在前面加上这个
app = Flask(__name__,template_folder='templates',static_url_path='/xxxxxx')
-
instance_path和instance_relative_config是配合来用的 (这两个参数是用来找配置文件的,当用app.config.from_pyfile('settings.py')这种方式导入配置文件的时候会用到)
-
instance_relative_config:默认为False,当设置为True时,from_pyfile会从instance_path指定的地址下查找文件。
-
instsnce_path:指定from_pyfile查询文件的路径,不设置时,默认寻找和app.run()的执行文件同级目录下的instance文件夹;如果配置了instance_path(注意需要是绝对路径),就会从指定的地址下里面的文件
2. 请求相关
2.1 获取请求数据 & 响应
- Request
request.method #存放 HTTP 请求方式 request.form #存放 FormData 中的数据 request.args #存放 URL 中的参数数据 request.data #存放 原始请求体中数据 因为 Content-type : 不被认可,原始请求体中数据 request.json #存放 Content-type:application/json request.files #存放 FormData 中文件数据 request.path #获取当前访问路径的路由地址(/login)
- Response
HttpResponse #return "字符串" render_template #return render_template("模板名称") 默认存放路径 = templates redirect #return redirect("/login") Flask 特殊 jsonify #return jsonify({"name":1}) # 在响应头中加入 Content-type:application/json - app.config["JSONIFY_MIMETYPE"] send_file #return send_file("文件路径") # 打开并返回文件内容
- session
#存在浏览器上,并且是加密的 # 依赖于:secret_key from flask import Flask,request,render_template,session app.config["SECRET_KEY"] ="aewqweqe" ........ session["user"] = request.form.get("username")
另外: flask中获取URL后面的参数(from urllib.parse import urlencode,quote,unquote)
from urllib.parse import urlencode,quote,unquote def login(): if request.method == 'GET': s1 = request.args s2 = request.args.to_dict() s3 = urlencode(s1) s4 = urlencode(s2) s5 = unquote(s3) s6 = unquote(s4) s7 = quote("胡冲") print('s1',s1) print('s2',s2) print('s3',s3) print('s4',s4) print('s5',s5) print('s6',s6) print('s7',s7) return render_template('login.html') #############结果如下#################### s1 ImmutableMultiDict([('name', "'胡冲'"), ('nid', '2')]) s2 {'name': "'胡冲'", 'nid': '2'} s3 name=%27%E8%83%A1%E5%86%B2%27&nid=2 s4 name=%27%E8%83%A1%E5%86%B2%27&nid=2 s5 name='胡冲'&nid=2 s6 name='胡冲'&nid=2 s7 %E8%83%A1%E5%86%B2
3. Flask中模板语言 jinja2
3.1 jinja2模板语言
- {{ }} 取值 执行
- {% %} 逻辑代码 for if else macro
4. 内置Session
Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪
Session
- Flask中的session是需要secret_key的
# secret_key 实际上是用来加密字符串的,如果在实例化的app中没有 secret_key 那么开启session一定会抛异常的 from flask import session app = Flask(__name__) app.secret_key = "DragonFire"
- session的使用
#session["user"] = USER["username"] 这样用就代表这个请求带上来的session中保存了一个user=name @app.route("/login", methods=["GET", "POST"]) def login(): if request.method == "POST": if request.form["username"] == USER["username"] and request.form["password"] == USER["password"]: session["user"] = USER["username"] return redirect("/student_list") return render_template("login.html", msg="用户名密码错误") return render_template("login.html", msg=None) # 如果前端Jinja2模板中使用了msg,这里就算是传递None也要出现msg
- cookies中的session
#cookies 中 session 存储的是通过 secret_key 加密后的 key , 通过这个 key 从flask程序的内存中找到用户对应的session信息
- 用session进行验证
#进行验证 @app.route("/student_list") def student(): if session.get("user"): return render_template("student_list.html", student=STUDENT_DICT) return redirect("/login")