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

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

FLASK介绍

Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

“微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。

默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。

pip3 install flask

知识点

1、一个程序基本流程

1、首先,我们导入了 Flask 类。这个类的实例将会是我们的 WSGI 应用程序。

2、接下来,我们创建一个该类的实例,第一个参数是应用模块或者包的名称。 如果你使用单一的模块(如本例),你应该使用 __name__ ,因为模块的名称将会因其作为单独应用启动还是作为模块导入而有不同( 也即是 '__main__' 或实际的导入名)。这是必须的,这样 Flask 才知道到哪去找模板、静态文件等等。详情见 Flask的文档。

3、然后,我们使用 route() 装饰器告诉 Flask 什么样的URL 能触发我们的函数。
这个函数的名字也在生成 URL 时被特定的函数采用,这个函数返回我们想要显示在用户浏览器中的信息。

4、最后我们用 run() 函数来让应用运行在本地服务器上。 其中 if __name__ =='__main__': 确保服务器只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是作为模块导入的时候。

2、外部可访问的服务器

如果你运行了这个服务器,你会发现它只能从你自己的计算机上访问,网络中其它任何的地方都不能访问。在调试模式下,用户可以在你的计算机上执行任意 Python 代码。因此,这个行为是默认的。

如果你禁用了 debug 或信任你所在网络的用户,你可以简单修改调用 run() 的方法使你的服务器公开可用,如下:

app.run(host='0.0.0.0')
这会让操作系统监听所有公网 IP。

3、调试模式

虽然 run() 方法适用于启动本地的开发服务器,但是你每次修改代码后都要手动重启它。
这样并不够优雅,而且 Flask 可以做到更好。
如果你启用了调试支持,服务器会在代码修改后自动重新载入,并在发生错误时提供一个相当有用的调试器。

有两种途径来启用调试模式。一种是直接在应用对象上设置:

app.debug = True
app.run()
另一种是作为 run 方法的一个参数传入:

app.run(debug=True)
两种方法的效果完全相同。

入门小案例

1、程序运行过程

  • 所有Flask程序必须有一个程序实例。
  • 当客户端想要获取资源时,一般会通过浏览器发起HTTP请求。
  • 此时,Web服务器使用WSGI(Web Server Gateway Interface)协议,把来自客户端的所有请求都交给Flask程序实例,程序实例使用Werkzeug来做路由分发(URL请求和视图函数之间的对应关系)。
  • 根据每个URL请求,找到具体的视图函数并进行调用。
    • 在Flask程序中,路由的实现一般是通过程序实例的装饰器实现。
  • Flask调用视图函数后,可以返回两种内容:
    • 字符串内容:将视图函数的返回值作为响应的内容,返回给客户端(浏览器)
    • HTML模版内容:获取到数据后,把数据传入HTML模板文件中,模板引擎负责渲染HTTP响应数据,然后返回响应数据给客户端(浏览器)
# coding:utf8
from flask import Flask

# 创建一个flask应用程序
app = Flask(__name__)

@app.route("/")
def index():
    return "hello"

if __name__ == '__main__':
    # 输出当前应用所有的路由映射
    print (app.url_map)
    # 运行应用程序
    app.run()

在程序运行过程中,程序实例中会使用 url_map 将装饰器路由和视图的对应关系保存起来

如果你运行了这个服务器,你会发现它只能从你自己的计算机上访问,网络中其它任何的地方都不能访问。在调试模式下,用户可以在你的计算机上执行任意 Python 代码。因此,这个行为是默认的。

如果你禁用了 debug 或信任你所在网络的用户,你可以简单修改调用 run() 的方法使你的服务器公开可用,如下:app.run(host='0.0.0.0')

这会让操作系统监听所有公网 IP。

2、路由的定义方式

请求方式限定,使用 methods 参数指定可接受的请求方式,可以是多种,method= ["POST","GET"]

# coding:utf8
from flask import Flask

# 创建一个应用对象
app = Flask(__name__)

@app.route("/", methods=["POST"])
def index():
    return "hello word"

if __name__ == '__main__':
    app.run()

运行程序:

3、路由查找方式

同一路由指向两个不同的函数,在匹配过程中,至上而下依次匹配

from flask import Flask

app = Flask(__name__)

@app.route('/index')
def index1():
    return "hello"

@app.route('/index')
def index2():
    return "hi"

if __name__ == '__main__':
    print (app.url_map)
    app.run(debug=True)

4、给路由传参

有时我们需要将同一类URL映射到同一个视图函数处理,比如:使用同一个视图函数 来显示不同用户的个人信息。

路由传递的参数默认当做string处理,也可不指定类型,尖括号中的内容是动态的。指定int等其他的格式,具有限制参数的作用

通过一对尖括号获取传递的参数

app.run(debug=True) 可以实现修改后自动保存的功能

字符串要出现中文的时候加个u“”

return u"接受的参数是 %s" % user_id

在url中传入参数时,如果没有指定参数的类型,会默认为参数是string类型。

# coding:utf8
from flask import Flask

app = Flask(__name__)

@app.route("/user/<user_id>")
def demo(user_id):
    return u"接受的参数是 %s" % user_id

if __name__ == '__main__':
    app.run(debug=True)

运行结构:

@app.route("/num/<int:id>")  限制只能接受数字,接受其他的会报错

# coding:utf8
from flask import Flask

app = Flask(__name__)

@app.route("/num/<int:id>")
def demo1(id):
    return u"接受到的参数是%s" % id

if __name__ == '__main__':
    app.run(debug=True)

5、重定向redirect示例

# coding:utf8

from flask import Flask,redirect

app = Flask(__name__)

@app.route('/')
def deomo():
    return redirect('http://www.baidu.com') #return redirect('跳转的路径')

if __name__ == '__main__':
    app.run(debug=True)

6、返回JSON

from flask import Flask,json

app = Flask(__name__)

@app.route("/")
def do_json():
    strs = {"name":"zhang"}
    return json.dumps(strs)

if __name__ == '__main__':
    app.run(debug=True)

通过查看响应头可以看出,返回的格式并不json的格式。

这时我们可以使用Flask的另一个json模块

from flask import Flask,jsonify

app = Flask(__name__)

@app.route("/")
def do_json():
    strs = {"name": "zhang"}
    return jsonify(strs)

if __name__ == '__main__':
    app.run(debug=True)

运行结果:

7、返回代码示例

在 Python 中返回状态码有两种方式实现:

- 直接return
    - 可以自定义返回状态码,可以实现不符合http协议的状态码,例如:error=666,errmsg='查询数据库异常',其作用是为了实现前后端数据交互的方便
- abort方法
    - 只会抛出符合http协议的异常状态码,用于手动抛出异常
from flask import Flask

app = Flask(__name__)

@app.route('/statecode')
def demo1():
    return 'statecode',666   #通过return返回状态码

if __name__ == '__main__':
    app.run(debug=True)

运行结果:

通过abort方法,只会抛出符合http协议的异常状态码,用于手动抛出异常
from flask import Flask, abort
# 通过abort抛出,手动抛出符合http协议的状态码
app = Flask(__name__)
@app.route('/notfind')
def demo2():
    abort(404)
    return '抛出404的异常'

if __name__ == '__main__':
    app.run(debug=True)

errorhandler 可以捕获http错误的状态码,还可以捕获指定的异常

注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法

使用的方法:

@app.errorhandler(异常的状态码)

只要请求出现捕获到的状态码就会自动执行@app.errorhandler下的函数

# coding:utf8
from flask import Flask,abort

app = Flask(__name__)

# return抛出异常
@app.route('/statecode')
def demo1():
    return 'statecode',666

# 通过abort抛出,手动抛出符合http协议的状态码
@app.route('/notfind')
def demo2():
    abort(404)
    return '抛出404的异常'

# errorhandler 可以捕获http错误的状态码,还可以捕获指定的异常
@app.errorhandler(404)
def page_not_found(e):
    return u"页面不见了 %s" % e

if __name__ == '__main__':
    app.run(debug=True) 

def page_not_found(e)中的e代表的是异常的信息

8、设置cookie

#coding:utf8

from flask import Flask,make_response,request

app = Flask(__name__)

@app.route('/cookie')
def set_cookie():
    response = make_response('cookie设置成功')
    response.set_cookie("name", 'zhang')
    return response

if __name__ == '__main__':
    app.run(debug=True)

9、获取cookie

#coding:utf8

from flask import Flask,make_response,request

app = Flask(__name__)

@app.route('/cookie')
def set_cookie():
    response = make_response('cookie设置成功')
    response.set_cookie("name", 'zhang')
    return response

@app.route('/getcookie')
def get_cookie():
    res = request.cookies.get("name")
    return res

if __name__ == '__main__':
    app.run(debug=True)

FLASK-----基本知识(一)的更多相关文章

  1. 编写一个简单的flask的前后端交互的网页(flask简单知识的讲解)

    实验原理: 1.什么是flask Flask是一个使用Python编写的轻量级Web应用框架,其WSGI工具采用Werkzeng,模板引擎使用Jinja2.Flask与 Django之间的区别就是Dj ...

  2. flask基础知识

    关于flask框架的基础知识 相关基础知识:定义路由,定义参数,获取参数,重定向 简单易懂 ---hello.py # -*- coding: utf-8 -*- # Flask hello worl ...

  3. 基于Python的Flask基础知识

    Flask简介 Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架.Armin Ronacher带领一个名为Pocco的国际Python爱好者团队开发了Flask. 下面我们简单 ...

  4. flask 小知识总结 2018.12.18

    Visual Studio Code 1.自定义python组建,方便某功能和代码的便捷操作 文件--首选项--用户代码片段--python.json--自定义需要的代码和功能 2.自定义快捷键方法 ...

  5. Flask 基础知识一

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  6. Flask——基础知识

    Flask应用程序 一个简单的Flask应用程序 # 导入flask程序 from flask import Flask # 初始化flask对象 app = Flask(__name__) # 装饰 ...

  7. Flask基本知识

    @app.route('/')def hello_world(): return 'Hello World!' #route动态Route,支持字符串.整数.浮点数,/user/<int:id& ...

  8. Flask 知识总结

    阅读目录 第一篇:Flask基础知识介绍 第二篇:Flask扩展小结 第三篇:Flask 配置文件 第四篇:ORM.MySQL数据库连接池 第五篇:单例模式.蓝图Blueprint 第六篇:SQLAL ...

  9. Python框架 Flask 项目实战教程

    本文目的是为了完成一个项目用到的flask基本知识,例子会逐渐加深.最好对着源码,一步一步走.下载源码,运行pip install -r requirements.txt 建立环境python db_ ...

  10. 一个web应用的诞生(1)--初识flask

    基于flask的web应用的诞生 Flask是一个非常优秀的web框架,它最大的特点就是保持一个简单而易于扩展的小核心,其他的都有用户自己掌握,并且方便替换,甚至,你可以在社区看到众多开源的,可直接用 ...

随机推荐

  1. php中加密和解密

    项目要和第三方进行接口对接,所以数据的安全很重要.第一次自己设计并实现,学习记录下 网上查了很多资料,真的很深奥 对称加密: 双方共用一个约定好的密钥进行数据的加密和解密,但是当密匙丢失,数据将有泄露 ...

  2. Maven 命令参数 整理

    命令参数 备注 mvn -v --version 显示版本信息; mvn -V --show-version 显示版本信息后继续执行Maven其他目标; mvn -h --help 显示帮助信息; m ...

  3. Storm中重要对象的生命周期

    Spout方法调用顺势 declareOutputFields()(调用一次) open() (调用一次) activate() (调用一次) nextTuple() (循环调用 ) deactiva ...

  4. 2017-12-15python全栈9期第二天第五节之格式化输出补充之想要在格式化输出中表示单纯的%号就加%

    #!/user/bin/python# -*- coding:utf-8 -*-name = input('姓名:')age = input('年龄:')height = input('身高:')ms ...

  5. Centos 6\7下yum安装R

    在linux下安装软件不如windows方便,在windows下我们一般针对可安装的文件(如R.exe)直接双击运行就可以了.而在linux下我们首先要学会使用安装软件的专门工具如centos下的rp ...

  6. 设计模式---领域规则模式之解析器模式(Interpreter)

    前提:领域规则模式 在特定领域内,某些变化虽然频繁,但可以抽象为某种规则.这时候,结合特定领域,将问题抽象为语法规则,从而给出该领域下的一般性解决方案. 典型模式 解析器模式:Interpreter ...

  7. SNMP支持IPv6

    SNMP Trap 网上好像很少提到ipv6的配置文件格式,这个配置文件的格式应该为:   trap2sink udp6:[fec0::]:: 创建监听的函数入口:netsnmp_udp_transp ...

  8. golang cronexpr定时任务包使用

    包获取 go get -u github.com/gorhill/cronexpr 创建一个定时任务 expr, err = cron.Parse("* * * * *"); 获得 ...

  9. jspdf简单使用

    安装 npm install jspdf --save 英文输出 import jsPDF from 'jspdf-customfonts' let doc = new jsPDF() doc.tex ...

  10. Repeater中使用条件的两种方法

    1.使用三目运算符 display=<%#(Eval("Sex", "{0}") == "01") ? "none" ...