flask的基础知识

安装与基本应用

pip install flask==0.12.4 -i https://pypi.douban.com/simple/

 基本代码

from flask import Flask

# 生成flask对象
app = Flask(__name__)

#定义路由
@app.route('/')
def index():
    """视图函数"""
    return 'Hello World'

if __name__ == '__main__':
    # 运行项目,指定项目的ip端口号以及是否为debug调试模式
    app.run(host="127.0.0.1",port=5000,debug=True)

路由

1.请求方式

在视图函数中添加路由装饰器就可以将一条路由和对应的视图函数绑定在一起,路由装饰器的格式是:falsk对象.route("url",methods=[允许的请求方式]),methods默认是请求方式get

@app.route("/index",methods=["get","post"])
def index():
    return 'index'

 

2.传递参数

在route的url中,可以通过设置传递参数,格式是

@app.route('/user/<int:user_id>')
def user_info(user_id):
    return 'hello %d' % user_id

 

在上面代码中,尖括号里面的内容就是传递参数,用冒号隔开,冒号前面是限定了参数类型必须为int类型,参数后面就是参数的变量名,必须要与视图函数的参数名一致,通过关键字传参的方式传递参数,所以,当有多个参数时,参数的位置不用一一对应

限定参数类型称为转换器,模块自带了几种转换器:

DEFAULT_CONVERTERS = {
    "default": UnicodeConverter,
    "string": UnicodeConverter,
    "any": AnyConverter,
    "path": PathConverter,  # string类型,不支持"/",而path允许参数的值里面有"/"
    "int": IntegerConverter,
    "float": FloatConverter,
    "uuid": UUIDConverter,  # 通用唯一识别码,居于微秒
}

 

此外,可以通过自定义转换器来实现限制参数类型,或者通过转换器实现在路由上面写正则来实现参术都限定

实现步骤分4部,以正则转换器为例

1.导入模块

from werkzeug.routing import BaseConverter

 

2.写转换器类

# 自定义正则转换器
from werkzeug.routing import BaseConverter
class RegexConverter(BaseConverter):
    """必须继承BaseConverter类"""
    def __init__(self,map,*args):
        # 调用父类构造函数
        super().__init__(map)
        # 正则参数
        self.regex = args[0]

 

3.将转换器注册到flask对象中,同时其别名

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

 

4.可以直接在路由中通过re来写正则来限定对应的数据,下面是一个匹配手机号码的示例

@app.route("/<re('1[3-9]\d{9}'):id>/",methods=["post"])
def index(id):
    print(id)
    return "index"

 

http的请求和响应

请求

在flask模块中内置了一个request对象来代表当前请求的对象,通过request对象的属性可以获取本次请求的数据,常用的属性有

属性 说明
data 记录请求体数据,并转换为字符串
form 记录请求中的表单数据
args 记录请求中查询字符串  
cookies 记录请求中cookie信息
headers 记录请求中请求头
method 记录请求使用的http方法
url 记录请求的完整url地址
files 记录请求上传的文件
json 记录请求的json数据

 

 

 

 

 

 

 

响应

当用户请求后需要对请求做出响应,响应有以下几种响应方式

1.直接返回一个字符串,这种字符串内容支持html文本

2.返回一个JSON的响应,通过flask提供的jsonify来响应,如

from flask import Flask, request, jsonify

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

 

3.重定向,通过flask提供的redirect来响应,重定向可以站内跳转和站外跳转,站外跳转需要写http协议,如

from flask import redirecr
# 页面跳转响应
@app.route("/user")
def user():
# 参数1是跳转url,参数2是响应状态码
return redirect("http://www.baidu.com",302)

 

处理写url外,还可以通过内置的方法来重定向到指定视图里面,如果跳转后的视图函数有参数,可以在url_for后面写参数

from flask import redirecr,url_for

@app.route('/')
def index():
    return "首页"

# 重定向
@app.route('/test')
def test():
    # 使用 url_for 生成指定视图函数所对应的 url,url_for的后面参数可以指定跳转视图参数,通过参数名=参数值方式
    return redirect(url_for('index'))

Cookie和Session

cookie

设置是通过response对象.set_cookie来设置,response对象可以通过make_response生成,设置格式是:response对象.set_cookie("键","值",max_age=有效期[单位:s])

from flask imoprt Flask,make_response
@app.route('/set_cookie')
def set_cookie():
    # 生成response对象
    resp = make_response('this is to set cookie')
    # 设置cookie
    resp.set_cookie('username', 'xiaoming', max_age=3600)
    return resp

 

获取可以直接通过request.cookis.get(“键”)获取

from flask import Flask,request
@app.route('/get_cookie')
def resp_cookie():
    resp = request.cookies.get('username')
    return resp

Session

通过flask内置的Session对象来获取和设置session

@app.route('/set_session')
def set_session():
    session['username'] = 'xiaoming'
    return 'ok!'


@app.route('/get_session')
def get_session():
    return session.get('username')

 Blueprint

在实际的项目当中,不能将所有代码都写在一个文件当中,如在django框架中,可以将注册子应用,这样可以实现高内聚低耦合,当某些功能不用时之间屏蔽即可,在flask框架中也可以这样做,flask内置了Blueprint类,通过这个类可以实现子应用的创建,创建并使用子应用,需要以下几个步骤:

1.新建一个新的包,自定义名字如test,并且在__init__.py中实例化Blueprint对象

from flask import Blueprint

# 实例化对象,"test"是包名,此外如果改子应用需要用到template,可以指定template_folder,还有其他参数可以参考Flask对象的创建
blue_obj = Blueprint("test",__name__ )

# 导入视图函数
from .views import *

 2.在同目录下创建一个views.py来写视图函数

from . import blue_obj


@blue_obj.route("/index")
def index():
    return "ok"

 

3.将Blueprint对象注册到Flask对象中

from flask import Flask
from test import blue_obj
app = Flask(__name__)

# url_prefix 是路由,通过这个参数和视图函数的url拼接在一起就是视图函数的路由
app.register_blueprint(blue_obj,url_prefix = "")

if __name__ == '__main__':
    app.run(host="127.0.0.1",port=5000,debug=True)

 

4运行就可以通过"127.0.0.1:5000/index"就可以访问子应用的index视图函数了

 

posted @ 2019-10-15 11:26  mark平  阅读(198)  评论(0编辑  收藏  举报