Flask

主要内容:

  • 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_pathinstance_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
View Code

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")
原文地址:https://www.cnblogs.com/wcx666/p/10446956.html