03-03 flask

Flask 介绍

1 flask 引入

1 Flask 简介

Flask 是一个用Python 编写的Web 应用程序框架。它由 Armin Ronacher 开发,他领导一个名为Pocco的国际Python爱好者团队。Flask基于Werkzeug WSGI工具包和Jinja模板引擎。两者都是Pocco项目。

什么是Web Framework?

web application framework (web应用程序框架),简单的Web Framework(Web框架)表示一个库和模块的集合,使Web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理的低级细节。

WSGI

Web Server Gateway Interface (Web 服务器网关接口)

WSGI已作为Web服务器和Web应用程序之间通用接口的规范。

Werkzeug

它是一个WSGI工具包,它实现了请求,响应对象和实用函数。这使得能够在其上构建web框架。Flask 框架使用werkzeug作为基础之一。

jinja2

jinja2是Python的一个流行的模板引擎。Web模板系统将模板与特定数据源组合以呈现动态网页。

2 flask 安装和简要使用

概述

flask的安装可以通过python最常用的包管理程序pip来安装和卸载。目前推荐使用的flask版本是 1.0和1.1 ,这个很稳定。

1 安装

pip install flask

​ 或者指定版本安装 pip install flask==1.0

2 卸载

pip uninstall flask

代码示例

2 flask的运行(最简单的运行方法---开发者模式)

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
   return 'Hello World’

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

指定flask 服务监听IP和端口

if __name__ ==  "__main__":    
    # 0.0.0.0 是任意地址的意思,访问的时候应该用网络IP地址,例如192.168.2.2    			   
    app.run(debug=False,host='0.0.0.0',port=5010)

flask 的运行模式 生产模式

需要用到Nignx 等支持高并发的web服务

3 Flask项目布局

概述

一个完整的python项目都是一个工程,那么这个工程对于代码的目录结构是有一定要求的。

根据工程的规模,又有小型,中型和大型项目之分,这里说中小型项目的目录布局,也是最常用的目录布局。

代码示例

/data/project/flaskdemo

├── flaskr/
│   ├── __init__.py
│   ├── db.py
│   ├── schema.sql
│   ├── auth.py
│   ├── blog.py
│   ├── templates/
│   │   ├── base.html
│   │   ├── auth/
│   │   │   ├── login.html
│   │   │   └── register.html
│   │   └── blog/
│   │       ├── create.html
│   │       ├── index.html
│   │       └── update.html
│   └── static/
│       └── style.css
├── tests/
│   ├── conftest.py
│   ├── data.sql
│   ├── test_factory.py
│   ├── test_db.py
│   ├── test_auth.py
│   └── test_blog.py
├── venv/
├── setup.py
└── MANIFEST.in
├── requirements.txt
├── README.md

重点关注:

requirements.txt

templates

static

4 flask 的路由

概述

作用: 把url 绑定到函数

代码示例

定义方法一:

##调用application的route装饰器
@app.route("/",methods=["GET","POST"])
def home():    
    return jsonify({"status":0})

定义方法二:

##调用application的add_url_rule方法
def hello_world():    
	return "helloworld"
app.add_url_rule("/testurl","hello",hello_world)

区别:

位置在前 | 位置在后

使用route装饰器 | 使用add_url_rule方法

5 Flask 变量规则

概述

通过向规则参数添加变量部分,可以动态构建URL.此变量部分标记为 .它作为关键字参数传递给与规则相关联的函数。

代码示例

# Flask 变量规则 <variable:name>
@app.route("/variable/<string:getname>", methods=["POST"])
def variable_name(getname):    
    print(getname)    
    return jsonify({"staus": "0",                    
                    "name": str(getname)})

参考:变量规则支持的转换器类型

序号 转换器和描述
0 string**默认字符串
1 int接受整数
2 float对于浮点值
3 path接受用作目录分隔符的斜杠

6 Flask URL 构建

概述

使用url_for()反解析: 即使当路由发生改变时,依然能通过视图函数访问对应的路由

url_for()函数对于动态构建特定函数的URL非常有用。

代码示例

./tempaltes/urlfor.html

<h2> <a href="{{ url_for('index1func',id=1000) }}">home页面--->index{{id}}页面</a></h2>

./app.py

# Flask 知识点 url_for()  视图函数调用
@app.route('/index1/<int:id>/')
def index1func(id):    
    print(id)  # 1    
    return render_template('urlfor.html', id=id)

调试网址

http://127.0.0.1:5010/index1/1000/

运行结果:

home页面--->index1000页面

其他:

在flask 静态文件的知识点中,有url_for()的使用,静态文件的加载。

url_for的源码查看

def url_for(endpoint, **values):    
    """Generates a URL to the given endpoint with the method provided.    
    Variable arguments that are unknown to the target endpoint are appended    to the generated URL as query arguments.  If the value of a query argument    is ``None``, the whole pair is skipped.  In case blueprints are active    you can shortcut references to the same blueprint by prefixing the    local endpoint with a dot (``.``).    
    This will reference the index function local to the current blueprint::        
    url_for('.index')

7 Flask HTTP方法

HTTP协议

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。

HTTP协议在OSI七层模型的应用层

img

OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。

下表总结了不同的http方法:

序号 方法与描述
1 GET以未加密的形式将数据发送到服务器。最常见的方法。
2 HEAD和GET方法相同,但没有响应体。
3 POST用于将HTML表单数据发送到服务器。POST方法接收的数据不由服务器缓存。
4 PUT用上传的内容替换目标资源的所有当前表示。
5 DELETE 删除由URL给出的目标资源的所有当前表示。

8 模板

概述:

#  Flask 知识点 模板   方法 : render_template()
@app.route("/hellopage")
def hello_page():    
    return render_template("hello.html")

作用: 主要是提供HTML的页面模板存放目录 (Jinjia2的模板引擎)

上面的代码,当运行hellopage的请求时,会

Jinja2模板引擎使用以下分隔符从HTML转义。

  • {% ... %}用于语句
  • {{ ... }}用于表达式可以打印到模板输出
  • {# ... #}用于未包含在模板输出中的注释
  • # ... ##用于行语句

附注代码目录:

/home/user/Projects/flask-tutorial
├── flaskr/
│   ├── __init__.py
│   ├── templates/
│   │   ├── base.html
│   │   ├── auth/
│   │   │   ├── login.html
│   │   │   └── register.html
│   └── static/
│       └── style.css
├── tests/
│   ├── ...
├── ...
└── MANIFEST.in
└── requirements.txt

9 静态文件

概述

静态文件和web服务器中的静态文件定义一致

目前flask 主要支持的静态文件是 javascript 和css,

存放的位置: static 目录中

代码示例:

./app.py

# Flask 知识点 静态文件
@app.route("/index")def index():    
	return render_template("index.html")

./templates/index.html

<!DOCTYPE html>
<html lang="en">   
    <head>     
        <script type = "text/javascript"         
                src = "{{ url_for('static', filename = 'hello.js') }}" ></script>  
    </head>  
    <body>    
        <input type = "button"              
               onclick = "sayHello()" 
               value = "Say Hello   [Flask 知识点静态文件]" />   
    </body>
</html>

./static/hello.js

function sayHello() 
{   
    alert(Hello World, Good Luck ! Static Files")
          
}

10

Flask 蓝图

Blueprint概念

简单来说,Blueprint是一个存储操作方法的容器,这些操作在这个Blueprint被注册到一个应用之后就可以被调用,Flask可以通过Blueprint来组织URL以及处理。

在Flask中,Blueprint具有的属性:

1 一个应用可以有多个blueprint

2 可以将一个Blueprint注册到任何一个未使用的URL下 比如"/","demo" 或者子域名

3 Blueprint 可以单独具有自己的模板,静态文件 或者其他的通用操作方法

4 在一个应用初始化时,就应该要注册需要使用的Blueprint

初始蓝图

1 蓝图/Blueprint 对象用起来和一个应用 /flask 对象差不多,

区别 : 蓝图对象不能独立使用,必须将它注册到一个应用对象上才能生效

​ 应用 可以独立使用

代码示例

/blog.py

from flask import Blueprint,jsonify

# flask 知识点 蓝图 创建
bdemo = Blueprint('bdemo',__name__)

# flask 知识点 在这个蓝图对象上进行操作,定义路由,
@bdemo.route("/")def home():    
    return jsonify({"status":0,  
                    "url":"/",
                    "message":"这是一个蓝图示例"})
@bdemo.route("/hello")def hello():    
    return jsonify({"status":0,  
                    "url":"/",
                    "message":"这是一个蓝图的第二个实例hello"})

app.py

from blog import bdemo   ##导入蓝图模板

app = Flask(__name__)

# 注册蓝图 关键方法: register_blueprint    
#                   指定蓝图访问的前缀url_prefix 
blueprintapp.register_blueprint(bdemo,url_prefix='/bdemo')

由此看来,蓝图在工程中有多应用 或者多个服务的时候可以大有用处。

知识拓展

创建蓝图的时候,如何指定独立的模板和静态文件呢?

11 Flask扩展

Flask 邮件

Flask WTF

Flask SQLite

Flask SQLAlemy

Flask Sijax

Flask 部署

Flask FastCGI

posted @ 2019-10-23 22:30  小猿取经-林海峰老师  阅读(125)  评论(0编辑  收藏  举报