Flask知识点回顾以及重点内容

1. HTTP通信与Web框架

1.1 流程

客户端将请求打包成HTTP的请求报文(HTTP协议格式的请求数据)

采用TCP传输发送给服务器端

服务器接收到请求报文后按照HTTP协议进行解析

服务器根据解析后获知的客户端请求进行逻辑执行

服务器将执行后的结果封装成HTTP的响应报文(HTTP协议格式的响应数据)

采用刚才的TCP连接将响应报文发送给客户端

客户端按照HTTP协议解析响应报文获取结果数据

1.2 细节

客户端不一定是浏览器,也可以是PC软件、手机APP、程序

根据服务器端的工作,将其分为两部分:

服务器:与客户端进行tcp通信,接收、解析、打包、发送http格式数据

业务程序:根据解析后的请求数据执行逻辑处理,形成要返回的数据交给服务器

服务器与Python业务程序的配合使用WSGI协议

1.3 Web框架

能够被服务器调用起来,根据客户端的不同请求执行不同的逻辑处理形成要返回的数据的 程序

 

核心:实现路由和视图(业务逻辑处理)

 

1.4 框架的轻重

重量级的框架:为方便业务程序的开发,提供了丰富的工具、组件,如Django

 

轻量级的框架:只提供Web框架的核心功能,自由、灵活、高度定制,如FlaskTornado

webpy

 

1.5 明确Web开发的任务

视图开发:根据客户端请求实现业务逻辑(视图)编写

模板、数据库等其他的都是为了帮助视图开发,不是必备的

 

2. 认识Flask

2.1 简介

Flask诞生于2010年,是Armin ronacher(人名)用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。它主要面向需求简单的小应用。

 

Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等。Flask没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL。其 WSGI 工具箱采用 Werkzeug(路由模块) ,模板引擎则使用 Jinja2

 

可以说Flask框架的核心就是WerkzeugJinja2

 

Python最出名的框架要数Django,此外还有FlaskTornado等框架。虽然Flask不是最出名的框架,但是Flask应该算是最灵活的框架之一,这也是Flask受到广大开发者喜爱的原因。

2.2 与Django对比

django提供了:

django-admin快速创建项目工程目录

manage.py 管理项目工程

orm模型(数据库抽象层)

admin后台管理站点

缓存机制

文件存储系统

用户认证系统

 

而这些,flask都没有,都需要扩展包来提供

2.3 Flask扩展包:

Flask-SQLalchemy:操作数据库;

Flask-migrate:管理迁移数据库;

Flask-Mail:邮件;

Flask-WTF:表单;

Flask-script:插入脚本;

Flask-Login:认证用户状态;

Flask-RESTful:开发REST API的工具;

Flask-Bootstrap:集成前端Twitter Bootstrap框架;

Flask-Moment:本地化日期和时间;

2.4 Flask文档

中文文档: http://docs.jinkan.org/docs/flask/

英文文档: http://flask.pocoo.org/docs/0.11/

3. 创建虚拟环境

虚拟环境是一个互相隔离的目录

1. mkvirtualenv flask_py2

2. pip install flask==0.10.1

 

pip freeze > requirements.txt

pip install –r requirements.txt

4. FlaskHello world程序

# coding:utf-8

 

# 导入Flask

from flask import Flask

 

#Flask类接收一个参数__name__

app = Flask(__name__)

 

# 装饰器的作用是将路由映射到视图函数index

@app.route('/')

def index():

    return 'Hello World'

 

# Flask应用程序实例的run方法启动WEB服务器

if __name__ == '__main__':

    app.run()

 

4.1 Flask创建app对象

4.1.1 初始化参数

import_name: 导入路径(寻找静态目录与模板目录位置的参数)

static_url_path:

static_folder: 默认‘static’

template_folder: 默认‘templates’

4.1.2 配置参数

app.config.from_pyfile(“yourconfig.cfg”)

app.config.from_object()

app.config[“DEBUG”] = True

4.1.3 在视图读取配置参数

app.config.get()  或者 current_app.config.get()

4.1.4 app.run的参数

app.run(host=”0.0.0.0”, port=5000, debug=True)

4.2 路由

4.2.1 app.url_map 查看所有路由

 

4.2.2 同一路由装饰多个视图函数

 

4.2.3 同一视图多个路由装饰器

 

4.2.4 利用methods限制访问方式

@app.route('/sample', methods=['GET', 'POST'])

4.2.5 使用url_for进行反解析

 

4.2.5 动态路由

# 路由传递的参数默认当做string处理,这里指定int,尖括号中冒号后面的内容是动态的

@app.route('/user/<int:id>')

def hello_itcast(id):

    return 'hello itcast %d' %id

 

4.2.5 自定义转换器

from flask import Flask

from werkzeug.routing import BaseConverter

 

class Regex_url(BaseConverter):

    def __init__(self,url_map,*args):

        super(Regex_url,self).__init__(url_map)

        self.regex = args[0]

 

app = Flask(__name__)

app.url_map.converters['re'] = Regex_url

 

@app.route('/user/<re("[a-z]{3}"):id>')

def hello_itcast(id):

    return 'hello %s' %id

4.3 获取请求参数

from flask import request

 

就是 Flask 中表示当前请求的 request 对象,request对象中保存了一次HTTP请求的一切信息。

 

4.3.1 上传文件

已上传的文件存储在内存或是文件系统中一个临时的位置。你可以通过请求对象的 files 属性访问它们。每个上传的文件都会存储在这个字典里。它表现近乎为一个标准的 Python file 对象,但它还有一个 save() 方法,这个方法允许你把文件保存到服务器的文件系统上。这里是一个用它保存文件的例子:

 

from flask import request

 

@app.route('/upload', methods=['GET', 'POST'])

def upload_file():

    if request.method == 'POST':

        f = request.files['the_file']

        f.save('/var/www/uploads/uploaded_file.txt')

    ...

如果你想知道上传前文件在客户端的文件名是什么,你可以访问 filename 属性。但请记住, 永远不要信任这个值,这个值是可以伪造的。如果你要把文件按客户端提供的文件名存储在服务器上,那么请把它传递给 Werkzeug 提供的 secure_filename() 函数:

from flask import request

from werkzeug import secure_filename

 

@app.route('/upload', methods=['GET', 'POST'])

def upload_file():

    if request.method == 'POST':

        f = request.files['the_file']

        f.save('/var/www/uploads/' + secure_filename(f.filename))

    ...

4.4 abort函数与自定义异常处理

4.4.1 abort函数

from flask import abort

abort(404)

4.4.2 自定义异常处理

@app.errorhandler(404)

def error(e):

    return '您请求的页面不存在了,请确认后再次访问!%s'%e

 

4.5 返回的响应数据

4.5.1 元组

可以返回一个元组,这样的元组必须是 (response, status, headers) 的形式,且至少包含一个元素。 status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。[(key, value),()]   {“key”:”value”,…}

 

4.5.2 make_response

resp = make_response(“”)

resp.headers[“sample”] = “value”

resp.status = “404 not found”

 

4.6 使用jsonify返回json数据

json.dumps()  json.loads()

jsonify(key=value, k1=v1)

4.5 重定向

from flask import redirect

 

4.6 设置和读取cookie

resp = make_response()

 

resp.set_cookie(key, value=’’, max_age=None)

 

resp.delete_cookie(key)

 

request.cookies.get()

4.7 session

from flask import session

 

需要设置secret_key

 

session[key] = val

value = session.get(key)

 

4.8 请求上下文与应用上下文

 

请求上下文(request context)  

requestsession都属于请求上下文对象。

 

应用上下文(application context)

current_appg都属于应用上下文对象。

 

current_app:表示当前运行程序文件的程序实例。

g:处理请求时,用于临时存储的对象,每次请求都会重设这个变量。

 

4.9 请求钩子 hook

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

 

before_first_request:在处理第一个请求前运行。

 

@app.before_first_request

 

before_request:在每次请求前运行。

 

after_request(response):如果没有未处理的异常抛出,在每次请求后运行。

 

teardown_request(response):在每次请求后运行,即使有未处理的异常抛出。

 

5. Flask-Script扩展命令行

pip install Flask-Script

 

runserver –h ip地址 –p端口号

shell

 

from flask import Flask

from flask_script import Manager

 

app = Flask(__name__)

 

manager = Manager(app)

 

@app.route('/')

def index():

    return '床前明月光'

 

if __name__ == "__main__":

    manager.run()    ...

6. Jinja2模板

6.1 基本流程

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Template</title>

</head>

<body>

    <h1>hello {{ name }}</h1>

</body>

</html>

 

@app.route("/")

def index():

    return render_template("index.html", name="python",…)

 

使用flask 中的render_template渲染模板

6.2 变量

<p>{{mydict['key']}}</p>

 

<p>{{mydict.key}}</p>

 

<p>{{mylist[1]}}</p>

 

<p>{{mylist[myvariable]}}</p>


from flask import Flask,render_template

app = Flask(__name__)

 

@app.route('/')

def index():

    mydict = {'key':'silence is gold'}

    mylist = ['Speech', 'is','silver']

    myintvar = 0

 

    return render_template('vars.html',

                           mydict=mydict,

                           mylist=mylist,

                           myintvar=myintvar

                           )

if __name__ == '__main__':

    app.run(debug=True)


6.3 过滤器

6.3.1 字符串过滤器

safe:禁用转义;

  <p>{{ '<em>hello</em>' | safe }}</p>

 

capitalize:把变量值的首字母转成大写,其余字母转小写;

  <p>{{ 'hello' | capitalize }}</p>

 

lower:把值转成小写;

  <p>{{ 'HELLO' | lower }}</p>

 

upper:把值转成大写;

  <p>{{ 'hello' | upper }}</p>

 

title:把值中的每个单词的首字母都转成大写;

  <p>{{ 'hello' | title }}</p>

 

trim:把值的首尾空格去掉;

  <p>{{ ' hello world ' | trim }}</p>

 

reverse:字符串反转;

  <p>{{ 'olleh' | reverse }}</p>

 

format:格式化输出;

  <p>{{ '%s is %d' | format('name',17) }}</p>

 

striptags:渲染之前把值中所有的HTML标签都删掉;

  <p>{{ '<em>hello</em>' | striptags }}</p>

 

6.3.2 支持链式使用过滤器

<p>{{ “ hello world  “ | trim | upper }}</p>

6.3.3 列表过滤器

first:取第一个元素

  <p>{{ [1,2,3,4,5,6] | first }}</p>

 

last:取最后一个元素

  <p>{{ [1,2,3,4,5,6] | last }}</p>

 

length:获取列表长度

  <p>{{ [1,2,3,4,5,6] | length }}</p>

 

sum:列表求和

  <p>{{ [1,2,3,4,5,6] | sum }}</p>

 

sort:列表排序

  <p>{{ [6,2,3,1,5,4] | sort }}</p>

 

6.3.4 自定义过滤器

自定义的过滤器名称如果和内置的过滤器重名,会覆盖内置的过滤器。

 

方式一:

通过 add_template_filter (过滤器函数, 模板中使用的过滤器名字)

def filter_double_sort(ls):

    return ls[::2]

app.add_template_filter(filter_double_sort,'double_2')

 

方式二:

通过装饰器  app.template_filter (模板中使用的装饰器名字)

@app.template_filter('db3')

def filter_double_sort(ls):

    return ls[::-3]

6.4 表单

使用Flask-WTF表单扩展,可以帮助进行CSRF验证,帮助我们快速定义表单模板,而且可以帮助我们在视图中验证表的数据

 

pip install Flask-WTF

6.4.1 不使用Flask-WTF扩展时,表单需要自己处理

#模板文件

<form method='post'>

    <input type="text" name="username" placeholder='Username'>

<input type="password" name="password" placeholder='password'>

    <input type="submit">

</form>


from flask import Flask,render_template,request

 

@app.route('/login',methods=['GET','POST'])

def login():

    if request.method == 'POST':

        username = request.form['username']

        password = request.form['password']

        print username,password

     return “success”

else:

return render_template(“login.html”)


6.4.2 使用Flask-WTF扩展

需要设置 SECRET_KEY 的配置参数

 

模板页:

<form method="post">

        #设置csrf_token

        {{ form.csrf_token() }}

        {{ form.us.label }}

        <p>{{ form.us }}</p>

        {{ form.ps.label }}

        <p>{{ form.ps }}</p>

        {{ form.ps2.label }}

        <p>{{ form.ps2 }}</p>

        <p>{{ form.submit() }}</p>

        {% for x in get_flashed_messages() %}

            {{ x }}

        {% endfor %}

 </form>

 

视图函数

#coding=utf-8

from flask import Flask,render_template, redirect,url_for,session,request,flash

 

#导入wtf扩展的表单类

from flask_wtf import FlaskForm

#导入自定义表单需要的字段

from wtforms import SubmitField,StringField,PasswordField

#导入wtf扩展提供的表单验证器

from wtforms.validators import DataRequired,EqualTo

app = Flask(__name__)

app.config['SECRET_KEY']='1'

 

#自定义表单类,文本字段、密码字段、提交按钮

class Login(Flask Form):

    us = StringField(label=u'用户:',validators=[DataRequired()])

    ps = PasswordField(label=u'密码',validators=[DataRequired(),EqualTo('ps2','err')])

    ps2 = PasswordField(label=u'确认密码',validators=[DataRequired()])

    submit = SubmitField(u'提交')

 

#定义根路由视图函数,生成表单对象,获取表单数据,进行表单数据验证

@app.route('/',methods=['GET','POST'])

def index():

    form = Login()

    if form.validate_on_submit():

        name = form.us.data

        pswd = form.ps.data

        pswd2 = form.ps2.data

        print name,pswd,pswd2

        return redirect(url_for('login'))

    else:

        if request.method=='POST':

flash(u'信息有误,请重新输入!')

 

    return render_template('index.html',form=form)

if __name__ == '__main__':

    app.run(debug=True)

 

6.5 控制语句

6.5.1 if语句

{% if %} {% endif %}

6.5.2 for语句

{% for item in samples %} {% endfor %}

 

6.6 宏

类似于python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余。

 

6.6.1 不带参数宏的定义与使用

定义:

{% macro input() %}

  <input type="text"

         name="username"

         value=""

         size="30"/>

{% endmacro %}

 

使用

{{ input() }}

 

6.6.2 带参数宏的定义与使用

定义

{% macro input(name,value='',type='text',size=20) %}

    <input type="{{ type }}"

           name="{{ name }}"

           value="{{ value }}"

           size="{{ size }}"/>

{% endmacro %}

 

使用

{{ input(value='name',type='password',size=40)}}

 

6.6.3 将宏单独封装在html文件中

 

文件名可以自定义macro.html

 

{% macro input() %}

 

    <input type="text" name="username" placeholde="Username">

    <input type="password" name="password" placeholde="Password">

    <input type="submit">

{% endmacro %}

 

在其它模板文件中先导入,再调用

 

{% import 'macro.html' as func %}

{{ func.input() }}

 

6.4 模板继承

extend

6.5 模板包含

include

 

6.6 flask在模板中使用特殊变量和方法

6.6.1 config

 

6.6.2 request

 

6.6.3 url_for

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习回归算法—线性回归及案例分析

一、回归算法回归是统计学中最有力的工具之一。机器学习监督学习算法分为分类算法和回归算法两种&#xff0c;其实就是根据类别标签分布类型为离散型、连续性而定义的。回归算法用于连续型分布预测&#xff0c;针对的是数值型的样本&#xff0c;使用回归&#xff0c;可以在给定…

LeetCode 1669. 合并两个链表

文章目录1. 题目2. 解题1. 题目 给你两个链表 list1 和 list2 &#xff0c;它们包含的元素分别为 n 个和 m 个。 请你将 list1 中第 a 个节点到第 b 个节点删除&#xff0c;并将list2 接在被删除节点的位置。 下图中蓝色边和节点展示了操作后的结果&#xff1a; 请你返回结果…

机器学习回归算法—性能评估欠拟合与过拟合

机器学习中的泛化&#xff0c;泛化即是&#xff0c;模型学习到的概念在它处于学习的过程中时模型没有遇见过的样本时候的表现。在机器学习领域中&#xff0c;当我们讨论一个机器学习模型学习和泛化的好坏时&#xff0c;我们通常使用术语&#xff1a;过拟合和欠拟合。我们知道模…

Nginx安全配置

nginx本身不能处理PHP&#xff0c;它只是个web服务器&#xff0c;当接收到请求后&#xff0c;如果是php请求&#xff0c;则发给php解释器处理&#xff0c;并把结果返回给客户端。nginx一般是把请求发fastcgi管理进程处理&#xff0c;fastcgi管理进程选择cgi子进程处理结果并返回…

LeetCode 1670. 设计前中后队列(deque)

文章目录1. 题目2. 解题1. 题目 请你设计一个队列&#xff0c;支持在前&#xff0c;中&#xff0c;后三个位置的 push 和 pop 操作。 请你完成 FrontMiddleBack 类&#xff1a; FrontMiddleBack() 初始化队列。 void pushFront(int val) 将 val 添加到队列的 最前面 。 void…

java 1.7 新特性

1.对Java集合&#xff08;Collections&#xff09;的增强支持 在JDK1.7之前的版本中&#xff0c;Java集合容器中存取元素的形式如下&#xff1a; 以List、Set、Map集合容器为例&#xff1a; 在JDK1.7中&#xff0c;摒弃了Java集合接口的实现类&#xff0c;如&#xff1a;ArrayL…

LeetCode 1671. 得到山形数组的最少删除次数(最长上升子序DP nlogn)

文章目录1. 题目2. 解题2.1 n^2 解法2.2 nlogn 解法197 / 1891&#xff0c;前10.4%435 / 6154&#xff0c;前7.07%前三题如下&#xff1a; LeetCode 5557. 最大重复子字符串 LeetCode 5558. 合并两个链表 LeetCode 5560. 设计前中后队列&#xff08;deque&#xff09; 1. 题目…

机器学习Tensorflow基础知识、张量与变量

TensorFlow是一个采用数据流图&#xff08;data flow graphs&#xff09;&#xff0c;用于数值计算的开源软件库。节点&#xff08;Nodes&#xff09;在图中表示数学操作&#xff0c;图中的线&#xff08;edges&#xff09;则表示在节点间相互联系的多维数据数组&#xff0c;即…

LeetCode 1672. 最富有客户的资产总量

文章目录1. 题目2. 解题1. 题目 给你一个 m x n 的整数网格 accounts &#xff0c;其中 accounts[i][j] 是第 i​​​​​​​​​​​​ 位客户在第 j 家银行托管的资产数量。 返回最富有客户所拥有的 资产总量 。 客户的 资产总量 就是他们在各家银行托管的资产数量之和。最…

机器学习Tensorflow基本操作:线程队列图像

一、线程和队列在使用TensorFlow进行异步计算时&#xff0c;队列是一种强大的机制。为了感受一下队列&#xff0c;让我们来看一个简单的例子。我们先创建一个“先入先出”的队列&#xff08;FIFOQueue&#xff09;&#xff0c;并将其内部所有元素初始化为零。然后&#xff0c;我…

关于使用ModelSim中编写testbench模板问题

对于初学者来说写Testbench测试文件还是比较困难的&#xff0c;但Modelsim和quartus ii都提供了模板&#xff0c;下面就如何使用Modelsim提供的模板进行操作。 Modelsim提供了很多Testbench模板&#xff0c;我们直接拿过来用可以减少工作量。对源文件编译完后&#xff0c;鼠标光…

LeetCode 1673. 找出最具竞争力的子序列(单调栈)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 和一个正整数 k &#xff0c;返回长度为 k 且最具 竞争力 的 nums 子序列。 数组的子序列是从数组中删除一些元素&#xff08;可能不删除元素&#xff09;得到的序列。 在子序列 a 和子序列 b 第一个不相同的位置上&am…

android获取string.xml的值

为什么需要把应用中出现的文字单独存放在string.xml文件中呢&#xff1f; 一&#xff1a;是为了国际化&#xff0c;当需要国际化时&#xff0c;只需要再提供一个string.xml文件,把里面的汉子信息都修改为对应的语言&#xff08;如&#xff0c;English&#xff09;&#xff0c;再…

牛客 怕npy的牛牛(双指针)

文章目录1. 题目2. 解题1. 题目 链接&#xff1a;https://ac.nowcoder.com/acm/contest/9556/B 来源&#xff1a;牛客网 题目描述 牛牛非常怕他的女朋友&#xff0c;怕到了走火入魔的程度&#xff0c;以至于每当他看到一个字符串同时含有n,p,y三个字母他都害怕的不行。 现在…

Flask入门之上传文件到本地服务器

Flask入门之上传文件到服务器今天要做一个简单的页面&#xff0c;可以实现将文件 上传到服务器&#xff08;保存在指定文件夹&#xff09;#Sample.py1 # coding:utf-82 3 from flask import Flask,render_template,request,redirect,url_for4 from werkzeug.utils import secur…

对象的三种状态

来自为知笔记(Wiz)转载于:https://www.cnblogs.com/zmpandzmp/p/3649196.html

Cygwin中如何像在Ubuntu中一样安装软件

cygwin作为windows下模拟Linux环境的的工具&#xff0c;使得我们能在windows下非常方便的使用Linux的命令和工具&#xff0c;下面讲讲怎样在cygwin添加不支持的命令。 1.首先安装cygwin&#xff1a;我们可以到Cygwin的官方网站下载Cygwin的安装程序&#xff0c;地址是&#xff…

LeetCode 321. 拼接最大数(单调栈)*

文章目录1. 题目2. 解题1. 题目 给定长度分别为 m 和 n 的两个数组&#xff0c;其元素由 0-9 构成&#xff0c;表示两个自然数各位上的数字。 现在从这两个数组中选出 k (k < m n) 个数字拼接成一个新的数&#xff0c;要求从同一个数组中取出的数字保持其在原数组中的相对…

pandas数据分析选则接近数值的最接优方案

import numpy as np import pandas as pd# pandas数据分析选则接近数值的最接优方案# 1.准备数据 CHILD_TABLE (720, 750) CHIDL_STOOL (300, 350) CHILD_PLAY_LEN (300, 400) CHILD_TENT (1100, 1300) # 2.遍历循环&#xff0c;添加到列表中 sum_length_lst [] play_lst …

iOS开发者有价值的工具集

转载于&#xff1a;http://www.cocoachina.com/applenews/devnews/2014/0307/7936.html我一直比较推崇聪明地工作要远胜于刻苦地工作。使用正确的工具可以帮你更好地解决问题&#xff0c;直达目标。我们都遇见过一些功能非常强大但又价值不菲的工具&#xff0c;虽然价格贵点&am…