Flask--参考以用

Posted jingzu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

待补充

以上是关于Flask--参考以用的主要内容,如果未能解决你的问题,请参考以下文章

flask的文件上传和下载

学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码

python3 flask

flask是啥意思

flask怎么获取请求报头信息

Python Flask 快速部署网页demo