• Flask--参考以用


    Flask

    简介

           Flask是使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱Jinja2模板引擎。Flask使用BSD协议授权。

           Flask被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入以下功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。

    名词解释:

    Werkzeug是Python的WSGI规范的实用函数库。大概功能有:HTTP头解析与封装、request和response对象、基于浏览器JS调试器、兼容WSGI规范、Py2-3支持、Unicode支持、支持会话及签名Cookie、支持URI和IRI的Unicode使用工具、兼容各浏览器和WSGI服务器实用工具、URL请求路由系统。

    Jinja2是为Python提供的独立的功能齐全模块,Jinja2提供了对unicode的全支持,以及一个可选集成的沙盒运行环境。Jinja2并不属于Django框架,只是Django中模板渲染工具和此类似,Django中没有独立出来的渲染模块,所以以JinJa2来剖析。

    microframework微型框架

    extension/Flask-extension之后补充

    特点

    优势:轻量、扩展性强、第三方组件齐全

    劣势:自带组件只有session,第三方组件繁多导致版本兼容性相对较差。

    pycharm创建flask项目步骤

    https://img2018.cnblogs.com/blog/1614606/201907/1614606-20190710163303172-1516152408.gif

    安装flask会附带安装的依赖包:

    Jinja2     模板语言

    MarkupSafe   处理标签语言,安全

    Werkzeug     德语:工具的意思;作用:app.run本质就是执行Werkzeug里的run,和UWSGI类似

    启动

    创建一个py文件,写入以下内容:

    初级启动

    from flask import Flask

    app = Flask(__name__)              #”__name__”表示在当前文件中

    app.run()

    高级启动:

    from flask import Flask

    app = Flask(__name__)

    @app.route("/")

    def home():

           return "Hello World!"

    app.run()

    导入包

    from flask import Flask, render_template, redirect, jsonify, send_file,session

    导入render_template,默认存放路径templates

    1. 在项目根目录创建templates文件夹
    2. 在Pycharm中右键此文件夹选则Mark Directory as-Template Folder,并且选择模板语言为Jinja2
    3. 在templates文件夹中存放render_template调用的内容

    导入redirect重定向

    @app.route("/index")

    def index():

           return render_template('index.html')

    @app.route("/reback")

    def reback():

           return redirect('/index')              #这里的redirect里是重定向的url,即app.route中的内容

    导入send_file,向客户端发送文件

    作用:打开并返回文件内容、自动识别文件类型、响应头中加入Content-type:文件类型

    注:当浏览器无法识别Content-type时,会下载文件

    导入request请求(重)

    让支持请求需要在装饰器中加入methods=()或者[]@app.route("/login",methods= ['POST', 'GET'])

    Flask中的request是公共变量,全局的,容易覆盖。

    request.method

    请求方式

    request.form---获取Form表单中的数据

    request.form.to_dict()

    以字典形式输出所有数据

    request.form.get(‘key’)

    以键取值

    request.form[‘键’]

    以键取值

     

    request.url

    获取访问路径

    request.args

    获取url中的参数,如/index?id=2中的id=2

    request.path

    获取路由地址

    request.values

    获取Form和args中的数据

    request.environ

    获取请求原始信息

    request.base_url

    获取url头,不包含参数

    request.headers

    获取请求头中的数据

    ***注:标红粗为重点必会***

    ***导入jsonify转化JSON格式(Flask-1.1.1版本之前有用)***

    为响应头中加入 Content-type:application/json

    Flask 1.1.1版本中加入了直接返回字典,可以不再使用jsonify了

    导入Flask中的session(不是三方组件)

    注:Flask中的session存储在Cookies中,是交由客户端保管机制。

    session的序列化

    1. 使用session需要从flask中导入session,以后所有和session相关的操作都是通过这个变量来的
    2. 使用session需要设置app.secret_key,用来作为加密用的;并且这个app.secret_key如果每次服务器启动后都变化的话,那么之前的session就不能通过当前这个SECRET_KEY进行解密了
    3. flask-session内部会创建字典 {username:传的用户名} 接下来 通过secret_key + 时间戳 + 签名加密形成
    4. 当客户端发起请求-request带上Cookie
    5. Flask收到Session加密字符串
    6. 通过secret_key解密session的加密字符串,最终获得 {username:传的用户名}

    session的反序列化

    方法

    添加session:session['username']

    删除:session.pop('username')或者del session[username]

    清除所有session:session.clear()

    获取session:session.get('username')

    装饰器写法(回顾)

    def pd(func):

        def inner(*args, **kwargs):

            if session.get('username'):

                return func()

            else:

                return redirect('/login')

        return inner

    为多个视图函数增加同一个装饰器

           为多个视图函数添加同一个装饰器时,会出现报错:提示定义了多个同名的视图函数,导致调用时出错,不知道调用哪个函数。所以需要用到以下方法解决错误

    方法一:import functools

    在py文件头部引入functools

    然后在装饰器内部@functools.wraps(func)

    例:

    def pd(func):

        @functools.wraps(func)     #括号中写函数名

        def inner(*args, **kwargs):

            if session.get('username'):

                return func()

            else:

                return redirect('/login')

        return inner

    方法二:endpoint=’*’

    示例:

    @app.route('/information',endpoint='information')

    @pd

    def information():

        return render_template('information.html')

    @app.route('/information2',endpoint='information2')

    @pd

    def information2():

        return render_template('information2.html')

    Flask中的路由

    @app.route(‘/index’)

    endpoint映射路由-视图函数__name__=””

    理论是:endpoint Mapping -> “/index”:{“index”:index} 即为映射

           如果endpoint指定了值,则视图函数是endpoint的值;如果没有,则视图函数是当前函数名;通过endpoint可以找到路由。

    methods=[“get”,”post”]

           当前函数支持的请求方式,405报错为请求方式不被允许。如果没有methods

    defaults={“id”:1}

           默认参数;一旦默认参数存在,视图函数中必须有一个形参去接收,形参变量名必须与defaults 中的一.致。

    strict_slashes=True

           是否严格遵循路由匹配规则”/”

    redirect_to=”/login”

           永久重定向 301或308

    路由后加参数

    @app.route("/information/<int:page>/<int:page2>/<int:page3>")

    @pd

    def information():

    print(page,page2,page3)

    return “OK”

    动态参数路由

           /detail/<folder>/<filename>

    FlaskResponse

    render_template(.html)              #返回网页文件

    redirect(“/login”)                 #重定向路由

    “”                                        #返回文本内容

    jsonify                                # content-type : application/json

    Flask 1.1.1 新特性:可以直接返回dict类型-本质上就是在jsonify({key:value})

    send_file                             #自动打开并返回文件内容识别文件类型 content-type:文件类型

    FlaskRequest

    from flask import request   #公共变量LocalProxy对象

    request.POST.get()==request.form.get() -> .to_dict()

    request.GET.get()==request.args.get()-> .to_dict()

    request.json   #请求头中带content-type:application/json

    request.data  #content-type无法被识别或者是没有Form

    request.files.get() 获取文件

    request.method

    request.headers

    request.cookie

    request.path

    request.url

    request.host

    request.host_url

    Flask中的配置

    初始化配置

           app = Flask(__name__)                     # 当前文件下

                  template_folder="templatess"   # 更改模板存放目录;默认值是 templates

                  static_folder="statics"                # 静态文件存放路径

                  static_url_path="/static"            # 静态文件访问路径;默认是 "/"+static_folder

    Config 对象配置

           app.default_config[参数]

                  DEBUG——编码阶段、代码重启、日志输出级别低、页面中会显示错误详情、易被黑客利用。

                  TESTING——测试阶段、日志输出级别较高、无限接近线上环境

           利用类进行配置:

           class DebugSetting(object):

                  DEBUG = True

                  SECRET_KEY = "123456789"

                  SESSION_COOKIE_NAME = "I am just Session"

                  SESSION_TYPE = 'Redis'

                 

           app.config.from_object(DebugSetting)

    Flask 蓝图 Blueprint

           Blueprint是一个不能够被run的Flask对象,蓝图需要注册在 app 实例上的,蓝图中是不存在Config的,起到了一定的应用隔离功能,URL管理

           示例蓝图py文件:

    from flask import Blueprint

    蓝图对象名 = Blueprint("蓝图名",__name__, template_ folder="静态文件夹名", url_prefix="/域名前缀")

           示例主py文件:

    from Modular.蓝图py文件名 import 蓝图对象名              #导入

    app.register_blueprint(蓝图对象名)                              #注册

    Flask 特殊装饰器(可作中间件)

    app.before_request

           在请求进入视图函数之前进行的操作。

           return None  #表示继续执行

           #其他表示阻断

    app.after_request

           在视图函数结束后、响应客户端之前的操作,且倒序执行。

    正常周期: be1 - be2 - be3 – 视图函数 - af3 - af2 - af1

    异常周期: be1 - af3 - af2 - af1

    errorhandler重定义错误信息

    有参数的装饰器errorhandler(监听错误状态码 5xx 4xx Int)

    示例:

    @app.errorhandler(404)            #404为错误状态码,这里只能监听5XX、4XX

    def error404(error_message):   #必须传参error_message

        print(error_message)

        return send_file("linux.mp4")

    CBV

    示例:

    from flask import views

    class Login(views.MethodView):

           # HTTP请求的8种方式:

           # decorators=[a,b,c,d]    #装饰器

           # methods=['get','post'] #允许的请求方式

           def get(self):

                  pass

           def post(self):

                  pass

    app.add_url_rule('/login', endpoint=None, view_func=Login.as_view(name='login'))

    Flask第三方组件

    所有的Flask第三方组件,都是需要app.config,不但吸取配置项、还会更改或者增加配置项

    Flask-Session

           flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如:

           redis:保存数据的一种工具,五大类型。非关系型数据库

           memcached

           filesystem

           mongodb

           sqlalchmey:那数据存到数据库表里面

    示例:

    from flask import Flask, session

    from flask_session import Session

    from redis import Redis

    app = Flask(__name__)

    app.config['SESSION_TYPE']='redis'   #设置session所连接数据库类型为redis

    app.config['SESSION_REDIS']=Redis(host='主机IP',port=端口,db=6) #用于连接redis的配置

    Session(app) #读取config配置,改写APP中的session_interface

    待补充

  • 相关阅读:
    使用 BinToHex() 把 TBytes 转换为十六进制字符串 回复 "梧桐栖凤" 的问题
    ASP.NET中UrlEncode应该用Uri.EscapeDataString()
    抛弃WebService,在.NET4中用 jQuery 调用 WCF
    事实证明Ajax的世界更需要ASP.NET MVC
    tinyMCEPopup.close轻松让IE 9 RC崩溃
    不走寻常路:在WebForm中使用MVC
    关于ASP.NET预编译
    不错的VS2010扩展——JSEnhancements,让js和css也折叠
    VS2010 SP1 Beta与VisualSVN的冲突引起VS2010关闭时重启
    Web应用架构探索笔记 —— 查询
  • 原文地址:https://www.cnblogs.com/jingzu/p/11354749.html
Copyright © 2020-2023  润新知