FLASK

浏览器也好
app也好
postman也好
都只是一个访问的交互界面而已,这个界面输入一个服务器的地址,代表访问服务器,然后服务器访问相应的结果到这些界面进行展示。

‘’’
flask: web框架,通过flask提供的装饰器@app.route()将普通函数转换为服务
登录接口,需要传入url,username,passwd
Flask 是一个基于 Werkzeug 的 WSGI 工具包和 Jinja 2 模板引擎的”微框架“。它是一个被设计来开发 RESTful API 的 web 框架。
‘’’
本质上就是把一个本地的函数变成一个服务器化的函数而已,相当于把本地的函数通过flask框架部署到服务器上去了
Flask和Django的区别: 一个最明显的区别就是Django把目录结构都限制好了,开发者只需要创建相应的app,再在这个app下编写相应的models.py, views.py等。而Flask呢,仅仅只是实现了web框架最核心的功能(实际就是一个socket服务器,用户的浏览器就是一个socket客户端),有大量的第三方组件,比如ORM框架既可以选flask-sqlalchemy,也可以选flask-mongoengine,可扩展可定制,这是Flask最大的优点了, 通过这些第三方组件的组合,其实Flask也差不多是Django了。

Django中如果要写Restful API的话,更多的是使用Django Rest Framework,当然不使用也可以,利用json.dumps()和json.loads()也行。
与Django不同的是,Flask原生就对Restful的支持已经做的很好了,JSON目前是Restful API的主流数据传输方式,Flask可以通过jsonify()将python的dict或list转成JSON。

用flask写Restful API
Flask理解
之前一直都是用Django开发,换了新工作后,新的公司都是使用Flask+MongoDB,所以目前算初步入门了Flask。

Flask和Django的区别: 一个最明显的区别就是Django把目录结构都限制好了,开发者只需要创建相应的app,再在这个app下编写相应的models.py, views.py等。而Flask呢,仅仅只是实现了web框架最核心的功能(实际就是一个socket服务器,用户的浏览器就是一个socket客户端),有大量的第三方组件,比如ORM框架既可以选flask-sqlalchemy,也可以选flask-mongoengine,可扩展可定制,这是Flask最大的优点了, 通过这些第三方组件的组合,其实Flask也差不多是Django了。

Flask有两个核心依赖库: werkzeug和jinja。其中werkzeug负责核心的逻辑,比如路由,请求和应答的封装等。jinja是负责模板的渲染,如果开发Restful API, 后端返回给前端的只是JSON数据,所以jinja我完全没去了解。

Flask的使用
安装flask
(venv) incisordeMacBook-Pro:flask-test incisor$ pip3 install flask
复制代码
来一个hello world
app.py文件

from flask import Flask

app = Flask(name) # 创建一个实例

@app.route(’/’)
def hello_world():
return ‘hello world’

if name == ‘main’:
app.run(debug=True)
复制代码
通过python3 app.py启动服务器,这个时候去浏览器输入http://127.0.0.1:5000/后,就会看到hello world了。

用Flask来写一个Restful API
Django中如果要写Restful API的话,更多的是使用Django Rest Framework,当然不使用也可以,利用json.dumps()和json.loads()也行。 与Django不同的是,Flask原生就对Restful的支持已经做的很好了,JSON目前是Restful API的主流数据传输方式,Flask可以通过jsonify()将python的dict或list转成JSON。

直接上代码演示吧:

from flask import Flask, request, jsonify

app = Flask(name)

假设这是数据库存储的数据

USER_LIST = [{‘id’: 1, ‘name’: ‘zws’, ‘age’: 18}, {‘id’: 2, ‘name’: ‘Tom’, ‘age’: 19}]

@app.route(’/user’, methods=[‘GET’])
def get():
# GET请求获取全部的数据
return jsonify({‘code’: 200, ‘msg’: ‘ok’, ‘data’: USER_LIST})

if name == ‘main’:
app.run(debug=True)
复制代码
看到这,Flask已经实现了一个Restful API的GET请求,那POST, PUT, PATCH, DELETE是需要在函数里面通过request.method来判断吗?非也,Flask也是有CBV的,接下来用Flask的CBV来改善这个/user这个API。

Flask的CBV需要继承MethodView类

from flask import Flask, jsonify, request
from flask.views import MethodView

app = Flask(name)

USER_LIST = [{‘id’: 1, ‘name’: ‘zws’, ‘age’: 18}, {‘id’: 2, ‘name’: ‘Tom’, ‘age’: 19}]

class UserView(MethodView):

def get(self):
    return jsonify({'code': 200, 'msg': 'ok', 'data': USER_LIST})

def post(self):
    # get_json()把前端传来的JSON数据转成Python的dict或者list
    json_data = request.get_json()
    new_id = len(USER_LIST) + 1
    USER_LIST.append({'id': new_id, **json_data})
    return jsonify({'code': 204, 'msg': 'ok', 'data': USER_LIST[new_id-1]})

注册路由,name参数就是@app.route(’/’, methods=[‘GET], endpoint=’’)中的endpoint

这是视图的名字,看了源码后发现,如果不定义endpoint,默认就是当前视图函数的函数名就是endpoint

app.add_url_rule(’/user’, view_func=UserView.as_view(name=‘user’))

if name == ‘main’:
app.run(debug=True)
复制代码
json_data = request.get_json()这句代码需要注意,在这里出了个错误。我用postman测试POST请求时,忘记设置Content-Type了,导致request.get_json()返回None,一开始没发现是自己忘记设置Content-Type了,所以首先就直接查看了get_json()的源码:

def get_json(self, force=False, silent=False, cache=True):
…省略…
if not (force or self.is_json):
return None
复制代码
self.is_json通过判断头部的Content-Type,如果设置了Content-Type: application/json,self.is_json()会返回True,那么这里会有两种处理方式: --> 请求设置Content-Type: application/json --> 请求可以不设置,而把force设置为True (force or self.is_json)其中一个返回True, 就可以了,但是为了规范,还是建议设置请求头的Content-Type,同时也可以在request.get_json()中设置force=True,做两手准备。

从以上代码可以看到利用MethodView就完全可以写Restful API了,

用flask-restful扩展库来写Restful API
flask-restful的官方文档: flask-restfule

安装
pip3 install flask-restful
复制代码
修改上面的demo:

from flask import Flask, jsonify, request
from flask_restful import Api, Resource

app = Flask(name)
api = Api(app)

USER_LIST = [{‘id’: 1, ‘name’: ‘zws’, ‘age’: 18}, {‘id’: 2, ‘name’: ‘Tom’, ‘age’: 19}]

class UserView(Resource):

def get(self):
    # 这里不用再自己手动调用jsonify()了
    return {'code': 200, 'msg': 'ok', 'data': USER_LIST}

def post(self):
    json_data = request.get_json()
    new_id = len(USER_LIST) + 1
    USER_LIST.append({'id': new_id, **json_data})
    return {'code': 204, 'msg': 'ok', 'data': USER_LIST[new_id-1]}

api.add_resource(UserView, ‘/user’)

if name == ‘main’:
app.run(debug=True)
复制代码
flask-restful的基本使用就是上面这些了,通过继承Resource来实现反射调用get,post这些方法。

打开Resource类,可以看到是继承了MethodView,并且重写了dispatch_request()方法,加入了dict转json的代码,这里就不分析了,因为我也只是大概了看了一下Resource的源码,以后如果详细分析了,再写篇文档吧。

到此,已经可以实现Flask开发Restful API了,经过对比,就能看出比Django轻量多少了,如果学了Django再学Flask,我感觉是分分钟就学完了。
在这里插入图片描述
什么是Web应用
浏览器发送一个HTTP请求,服务器收到请求,生成一个HTML文件,服务器把HTML文档作为HTTP响应的Body发送给浏览器。浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。

什么是WSGI
WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。 WSGI就像是一座桥梁,一边连着web服务器,另一边连着用户的应用。但是呢,这个桥的功能很弱,有时候还需要别的桥来帮忙才能进行处理。WSGI 的作用如图所示:
分析上面代码做了什么: 1. 导入了Flask类,这个类的实例会是我们的WSGI应用程序 2. 创建该类的实例。 3. 使用route()装饰器告诉Flask什么样的URL能出发我们的函数 4. 这个函数的名字也在生成URL时被特定的函数采用,这个函数返回我们想要显示在用户浏览器中的信息 5. 最后用run()函数来让应用运行在本地服务器上
上述运行的服务器只能在自己的计算机上访问,网络中其他的地方都不能访问。在调试模式下,用户可以在你的计算机上执行任意Python代码。因此,这个行为是默认的。 如果禁用了debug或信任所在网络的用户,你可以简单修改调用run()的方法使你的服务器公开可用,如下:

app.run(host=‘0.0.0.0’)
这会让操作系统监听所有公网ip
调试模式
虽然run()方法适用于启动本地的开发服务器,但是每次修改代码后都要手动重启,这样不够优雅,Flask可以做到更好。如果启用了调试支持,服务器会在代码修改后自动重新载入
有两种途径来启用调试模式。
app.debug=True
app.run()
app.run(debug=True)
何为路由
顾名思义就是一条路径,这条路引领 url 从浏览器到WSGI服务器,然后将处理结果返回到Browser。
在 Flask 框架中 ,路由的作用就是为用户请求的URL找出其对应的处理函数 。
route()装饰器把一个函数绑定到对应的URL上在这里插入图片描述
FLASK 中如何获取 GET/POST 请求的参数
一般来说,传递请求参数的方式有两种,一是打包成 JSON 之后再传递,二是直接放进 URL 进行传递 。对于第一种方式,一般用 POST 请求来传递参数,然后用 FLASK 中 request 模块的 get_json() 方法获取参数。而对于第二种方式,一般用 GET 请求传递参数,然后从 request.args 中用 get() 方法获取参数,不过需要说明的是用 POST 请求也可以通过 URL 的方式传递参数,而且获取参数的方式与 GET 请求相同。下面用代码来说明获取参数的过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值