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

待补充

原文地址:https://www.cnblogs.com/jingzu/p/11354749.html

时间: 2024-10-14 03:21:17

Flask--参考以用的相关文章

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

在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> 分三部分,全面介绍如何基于Python微框架Flask进行Web开发.第一部分是Flask简介,介绍使用Flask框架及扩展开发Web程序的必备基础知识.第二部分则给出一个实例,真正带领大家一步步开发完整的博客和社交应用Flasky,从而将前述知识融会贯通,付诸实践.第三部分介绍了发布应用之前必须考虑的事项

#SORA#flask实验

唉,最近熬夜看动漫,早上还测了个蛋疼的数学测验,我也是醉了,今天得早点睡. 实验目的:在flask应用中使用多个http头并借助PUT,POST提交数据 源代码: __author__ = 'hochikong' from flask import Flask,request from flask.ext.restful import Resource,Api,reqparse app = Flask(__name__) api = Api(app) todos = {'task':'get t

python3.6虚拟环境以及flask的安装(常见问题)

准备基于python进行web应用开发 Python3.3以上的版本通过venv模块原生支持虚拟环境,可以代替Python之前的virtualenv. 该venv模块提供了创建轻量级"虚拟环境",提供与系统Python的隔离支持.每一个虚拟环境都有其自己的Python二进制(允许有不同的Python版本创作环境),并且可以拥有自己独立的一套Python包. 需要注意的是,在Python3.3中使用"venv"命令创建的环境不包含"pip",你需要

暂时项目参考

1. App 使用 Ionic2 2. Api 使用python Flask 框架.因为再在树梅派中安装一个node.js感觉麻烦 参考: Flask中使用mysql  框架连接mysql python 有哪些适合写 API 的框架? 选择框架

Flask学习笔记——配置管理

1.硬编码: app = Flask(__name__) # app.config 是flask.config.Config类的实例,继承自内置数据结构dict app.config['DEBUG'] = True 2.参考--flask.config.Config类: class Config(dict): """Works exactly like a dict but provides ways to fill it from files or special dict

微信JS-SDK接口 + FLASK实现图片上传

最近在做一个项目从全球各地采集图片,考虑采用微信JS-SDK来简化开发.图片会首先上传到微信的服务器,返回一个id,然后根据这个id去微信服务器获取图片.微信提供可选择的压缩图片功能.图片首先上传到微信的服务器,可以保障较好的上传稳定性. 详细内容请参考微信的官方文档:微信JS-SDK说明文档 运行页面如下 HTML 在微信demo的基础上修改,见微信JS-SDK DEMO页面 增加图片的多次选择,多次上传,删除等功能 uploadImage.html <!DOCTYPE html> <

数据库大作业--由python+flask

这个是项目一来是数据库大作业,另一方面也算是再对falsk和python熟悉下,好久不用会忘很快. 界面相比上一个项目好看很多,不过因为时间紧加上只有我一个人写,所以有很多地方逻辑写的比较繁琐,如果是想学习flask还是推荐之前的项目,地址:http://www.cnblogs.com/INnoVationv2/p/5837495.html 寒假回去我会重构下代码,然后再po出来. 不知道怎么做数据库大作业的也可以参考: 所有功能: 三类用户模式: 一.管理员 1.查看所有档案 2.修改档案信息

[Python] 运行Flask, 报错:UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xc4 in position 33: ordinal not in range(128)

运行时报错:UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 33: ordinal not in range(128) Python2.7在Windows上一个bug!!! 解决方法: 参考官方patch: http://bugs.python.org/file19332/9291a.patch 如下代码:一,加入from itertools import count: 二,修改 def enum_type

Python 学习参考书目推荐

Python 学习,参考书目推荐 前言 好的技术书籍可以帮助我们快速地成长,大部分人或多或少地受益于经典的技术书籍.在「Python开发者」微信公号后台,我们经常能收到让帮忙推荐书籍的消息.这类的问题在@Python开发者 微博 和 伯乐在线的 Python小组 讨论中也不绝于耳. 7月3日,伯乐在线在「Python开发者」微信公号发起了一个讨论 (注:PC端无法看到大家的评论,需要关注微信公号后,从微信才可以看到),通过这个讨论话题,在评论中分享对自己帮助很大的Python技术书籍.  (Py

[flask实践] 解决qq邮箱/mysql的相关配置问题

笔者经过flask web(Miguel著,封面是一条狗)一书的学习,打算实现一个旅游类网站,在此过程中发现,相对于书中的flasky博客程序,需要作出一些改变: 1. 注册邮箱:国内要使用126,qq等邮箱.默认读者了解过flasky邮件的实现方式,而使用126.qq邮箱的不同之处有: 第一,邮箱端口 ['MAIL_PORT'] = 465 不同于gmail的587端口 第二,使用协议 ['MAIL_USE_SSL'] = True 不同于gmail的TLS协议        第三,用户名