flask总结01

一:Flask的基本介绍和小案例

01:flask的基本介绍

  
Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。

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

其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。

官网: http://flask.pocoo.org/

官方文档: <http://docs.jinkan.org/docs/flask/>

**Flask常用扩展包:**

- Flask-SQLalchemy:操作数据库,ORM;
- Flask-script:插入脚本;
- Flask-migrate:管理迁移数据库;
- Flask-Session:Session存储方式指定;
- Flask-WTF:表单;
- Flask-Mail:邮件;
- Flask-Bable:提供国际化和本地化支持,翻译;
- Flask-Login:认证用户状态;
- Flask-OpenID:认证;
- Flask-RESTful:开发REST API的工具;
- Flask JSON-RPC:  开发rpc远程服务[过程]调用
- Flask-Bootstrap:集成前端Twitter Bootstrap框架
- Flask-Moment:本地化日期和时间
- Flask-Admin:简单而可扩展的管理接口的框架

可以通过  http://flask.pocoo.org/extensions/ 查看更多flask官方推荐的扩展
View Code

02:安装flask

1.准备虚拟环境

mkvirtualenv flask_demo -p python3

2:安装flask

pip install flask==0.12.4

03:创建flask项目

与django不同,flask不会提供任何的自动操作,所以需要手动创建项目目录,需要手动创建启动项目的管理文件
例如,创建项目目录 flaskdemo,在目录中创建manage.py.在pycharm中打开项目并指定上面创建的虚拟环境

小案例:

from flask import Flask
app=Flask(__name__)

@app.route('/')  ## 也可自定义指定访问路径为 @app.route('/demo1')
def index():
    return 'hello world !'

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

代码分析:

  
# 导入Flask类
from flask import Flask

"""
import_name      Flask程序所在的包(模块),传 __name__ 就可以
                 其可以决定 Flask 在访问静态文件时查找的路径
static_path      静态文件访问路径(不推荐使用,使用 static_url_path 代替)
static_url_path  静态文件访问路径,可以不传,默认为:/ + static_folder
static_folder    静态文件存储的文件夹,可以不传,默认为 static
template_folder  模板文件存储的文件夹,可以不传,默认为 templates
"""
app = Flask(__name__)



# 加载项目配置
# 配置类
class Config(object):
    DEBUG = True


app.config.from_object( Config )


# 指定服务器IP和端口
app.run(host="0.0.0.0", port=5000, debug = True)
View Code

04:flask路由传递参数

1:# 路由传递参数[没有限定类型]

from flask import Flask
app=Flask(__name__)


# 路由传递参数[没有限定类型]
@app.route('/home/<user_id>')
def home(user_id):
    return 'home page,%s'%user_id


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

实现方法:

2:# 路由传递参数[限定类型]

from flask import Flask
app=Flask(__name__)


@app.route('/test/<int:user_id>')
def test_info(user_id):
    return "hello %d "% user_id


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

实现方法:

ps:传递多个参数

# 一个路由中可以接受多个路由参数,并且路由转换器也可以使用多个
@app.route("/user/<re('d{3}'):user_id>/avatar/<re('w{4,8}'):avatar_id>",methods=["get"])
def user2(user_id,avatar_id):
    print(request.method)
    return "用户%s,头像id:%s" % (user_id,avatar_id)

05:路由限定请求方式.需要导入flask的request模块

案例:

from flask import Flask,request   #倒入路由
from settings.dev import DevConfig

app=Flask(__name__)   #注册app


@app .route('/test_re',methods=["GET","POST"])  #限定请求方式
def test_limit():

    return request.method   #

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

案例结果:

二:正则匹配路由

01:正则匹配的路由的实现步骤

在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问

具体实现步骤为:

- 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
- 自定义转换器:自定义类继承于转换器基类
- 添加转换器到默认的转换器字典中
- 使用自定义转换器实现自定义匹配规则

02:代码实现

1:导入转换器基类

from werkzeug.routing import BaseConverter

2:自定义转换器

# 自定义正则转换器
class RegexConverter(BaseConverter):
    def __init__(self, url_map, *args):
        super(RegexConverter, self).__init__(url_map)
        # 将接受的第1个参数当作匹配规则进行保存
        self.regex = args[0]

3:添加转换器到默认的转换器字典中,并指定转换器使用时名字为: re

app = Flask(__name__)

# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re
app.url_map.converters['re'] = RegexConverter

4:使用转换器去实现自定义匹配规则

  ps“当前此处定义的规则是:3位数字

@app.route('/user/<re("[0-9]{3}"):user_id>')
def user_info(user_id):
    return "user_id 为 %s" % user_id

5:运行

运行测试:<http://127.0.0.1:5000/user/123> ,如果访问的url不符合规则,会提示找不到页面

完整的正则路由案例:

from flask import Flask, request
from werkzeug.routing import BaseConverter  # 第一步:倒入转换基类

app = Flask(__name__)
# 第二步:自定义转换器
class RegexConverter(BaseConverter):
    def __init__(self, url_map, *args):
        super(RegexConverter, self).__init__(url_map)
        self.regex = args[0]
# 第三步:将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re
app.url_map.converters['re'] = RegexConverter

# 第四步:使用转换器去实现自定义匹配规则
# @app.route('/user/<re("[0-9]{3}"):user_id>')
@app.route("/user/<re('d{3}'):user_id>",methods=["get"])
def user_info(user_id):
    return "user_id为%s" % user_id


if __name__ == '__main__':
    app.run()
正则路由案例

运行结果:

匹配结果:

 不匹配的结果:

 

03:系统自带转换器

DEFAULT_CONVERTERS = {
    'default':          UnicodeConverter,
    'path':             PathConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter,
}

系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数。

04:http的请求和响应

  01:请求

文档: http://docs.jinkan.org/docs/flask/api.html#flask.request

- **request**:flask中代表当前请求的 `request 对象`
- **作用**:在视图函数中取出本次请求数据
- **导入**:``from flask import request``

常用的属性如下:

02:获取请求中查询字符串

from flask import Flask, request
from settings.dev import DevConfig

app = Flask(__name__)
app.config.from_object(DevConfig)

# http://127.0.0.1:5000/?username=Tom&lve=1&lve=2&lve=3
@app.route('/test03/', methods=["GET", "POST"])   #test03  后面的  /  必须要写  不然会报错
def user_info():
    # 获取单个查询字符串参数
    username=request.args.get("username")
    print("===",username)

    # # 获取所有查询字符串参数, 获取请求地址中的查询字符串并转换为字典格式
    parmas=request.args.to_dict()
    print(">>>",parmas)
    #
    lst=request.args.getlist("lve")
    print("----",lst)

    return "hello %s" % username


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

打印结果:
=== Tom
>>> {'username': 'Tom', 'lve': '1'}
---- ['1', '2', '3']

报错点:

@app.route('/test03/', methods=["GET", "POST"])   #test03  后面的  /  必须要写  不然会报错
原文地址:https://www.cnblogs.com/one-tom/p/10671506.html