flask-restful
官网:https://flask-restful.readthedocs.io/en/latest/
https://github.com/flask-restful/flask-restful
中文 http://www.pythondoc.com/Flask-RESTful/quickstart.html
- GET :请求从服务器获取特定资源。举个例子:
GET /classs
(获取所有班级) - POST :在服务器上创建一个新的资源。举个例子:
POST /classs
(创建班级) - PUT :更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:
PUT /classs/12
(更新编号为 12 的班级) - DELETE :从服务器删除特定的资源。举个例子:
DELETE /classs/12
(删除编号为 12 的班级) - PATCH :更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少,这里就不举例子了
讲restful的:https://mp.weixin.qq.com/s/10oSdNPwBDi_yXExt0uDMg
版本:https://developer.github.com/v3/, 有的将版本放在head里
参数规范:下划线命名
url规范:url中不能有动词,只能有名词,且是名词复数
对于参数特别多的,路由可以写成:[Route(“api/orders/{address}/{month}”)],
如:https://example.com/api/orders/beijing/6?order_amount_greater=500&sort=order_amount_desc
返回格式:json 或 xml
==================
https://www.cnblogs.com/sss4/p/8097653.html
https://www.cnblogs.com/Sunzz/category/1474541.html
https://www.cnblogs.com/kaituorensheng/p/4645080.html
https://www.cnblogs.com/pyspark/p/8677750.html
restful api 最佳实践 http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html
=====================
RESTful API就是基于HTTP协议对互联网的内容定义的方式提出的一套互联网应用的架构体系,其中信息以JSON的形式进行存储,对对象的资源、操作、状态
进行定义,RESTful是一种设计模式规范的指南,不是强制性的要求,所以要靠开发者自己遵守
URL基本要求
1.协议:HTTP或HTTPS
2.域名和地址一般格式:http://<域名>/api/<version>
3.域名和地址之后接资源名字统一用复数
DELETE www.baidu.com/api/v1/articles?author=1&category=2 # 标准的restful api 示例 # 动词 DELETE,表示要进行的操作是删除,即状态转移 # 宾语 articles,表示文章这种资源URI,推荐用复数,即表现层 # 定语 author=1&category=2,表示具体是什么资源 # 版本 api/v1,这个能够帮助我们更好的进行版本的升级,同时不影响原有的请求
restful api的特点:
无状态 请求URL = 动作(GET/POST/PUT/DELETE)+ 资源 响应使用精确的状态码和JSON格式数据
写RESTful API步骤
1.想清楚我们的应用里可以抽象出什么样的资源,和他们的层次结构
2.想清楚对对象的基本操作:GET,POST,PUT,DELETE的含义是什么
3.组织接口代码。Spring如何去定义这些路由(URL):URL->Java类方法
4.开始实现
作者:迷路的丸子
链接:https://www.jianshu.com/p/846bb2c9098e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
======================
RESTful API返回的不是HTML,而是机器能直接解析的数据
随着ajax的流行,API返回数据,而不是HTML页面,数据交互量减少,用户体验会好。
前后台分离,后台更多的进行数据处理,前台对数据进行渲染。
如果在普通的网站中,这个插件就显得有些鸡肋了,因为在普通的网页开发中,是需要去渲染HTML代码的,而Flask-Restful在每个请求中都是返回json格式的数据。
@app.route('/post/<path:path>')
# 接收URL链接类型参数 app=Flask(__name__) @app.route('/<path:url>/') #设置url传参数:http://127.0.0.1:5000/http://www.baiu.com/ def first_flask(url): #视图必须有对应接收参数 print(url) return 'Hello World' #response if __name__ == '__main__': app.run() 接收URL链接类型参数
注意如果要给视图函数加装饰器增加新功能,一点要加在路由装饰器下面
设置cookie和响应头
response = make_response(render_template('index.html')) response是flask.wrappers.Response类型 response.delete_cookie('key') response.set_cookie('key', 'value') response.headers['X-Something'] = 'A value' return respons
Flask使用的是Jinja2模板,所以其语法和Django无差别(Django的模板语言参考Jinja2)
1.@app.before_first_request :请求第1次到来执行1次,之后都不执行;
2.@app.before_request:请求到达视图之前执行;(改函数不能有返回值,否则直接在当前返回)
3.@app.after_request:请求 经过视图之后执行;(最下面的先执行)
request.method: 获取请求方法 request.json request.json.get("json_key"):获取json数据 **较常用 request.args.get('name') :获取get请求参数 request.form.get('name') :获取POST请求参数 request.form.getlist('name_list'):获取POST请求参数列表(多个) request.values.get('age') :获取GET和POST请求携带的所有参数(GET/POST通用) request.cookies.get('name'):获取cookies信息 request.headers.get('Host'):获取请求头相关信息 request.path:获取用户访问的url地址,例如(/,/login/,/ index/); request.full_path:获取用户访问的完整url地址+参数 例如(/login/?age=18) request.script_root: 抱歉,暂未理解其含义; request.url:获取访问url地址,例如http://127.0.0.1:5000/?age=18; request.base_url:获取访问url地址,例如 http://127.0.0.1:5000/; request.url_root request.host_url request.host:获取主机地址 request.files:获取用户上传的文件
# 获取一个参数的一个值 http://127.0.0.1:5000/request?username=abcd username = request.args.get("username") # print(username) """打印效果: abcd """ # 获取一个参数的多个值 # http://127.0.0.1:5000/request?username=xiaoming&love=吹牛&love=睡觉 love = request.args.getlist("love") # print(love) """打印效果: ['吹牛', '睡觉']""" # 把传递过来的数据抓换成原生的字典 data = request.args.to_dict() # print(data) """打印效果:{'username': 'xiaoming', 'love': '吹牛'} """
在 Flask 中可以直接使用 jsonify 生成一个 JSON 的响应 from flask import Flask, request, jsonify @app.route("/") def index(): # 也可以响应json格式代码 data = [ {"id":1,"username":"liulaoshi","age":18}, {"id":2,"username":"liulaoshi","age":17}, {"id":3,"username":"liulaoshi","age":16}, {"id":4,"username":"liulaoshi","age":15}, ] return jsonify(data)
Cookie基于域名安全,不同域名的Cookie是不能互相访问的
如访问luffy.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到luffy.com写的Cookie信息
浏览器的同源策略针对cookie也有限制作用.
当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息
注意: Session依赖于Cookie,而且flask中使用session,需要配置SECRET_KEY选项,否则报错. 设置session from flask import session @app.route('/set_session') def set_session(): session['username'] = 'xiaoming' return 'ok!' 获取session @app.route('/get_session') def get_session(): return session.get('username')
before_first_request 在处理第一个请求前执行 before_request 在每次请求前执行 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用.一般可以用来判断权限,或者转换路由参数或者预处理客户端的请求的数据 after_request 如果没有抛出错误,在每次请求后执行.一般可以用于记录会员/管理员的操作历史,浏览历史,清理收尾的工作 接受一个参数:视图函数作出的响应 在此函数中可以对响应值在返回之前做最后一步修改处理 需要将参数中的响应在此参数中进行返回 teardown_request: 在每次请求后执行 接受一个参数:错误信息,如果有相关错误抛出 需要设置flask的配置DEBUG=False,teardown_request才会接受到异常对象。
捕获指定异常类型 @app.errorhandler(ZeroDivisionError) def zero_division_error(e): return '除数不能为0'
application 指的就是当你调用app = Flask(__name__)创建的这个对象app;
request 指的是每次http请求发生时,WSGI server(比如gunicorn)调用Flask.__call__()之后,在Flask对象内部创建的Request对象;
请求上下文对象有:request、session
应用上下文对象有:current_app,g
注意:不同的请求,会有不同的全局变量
- 请求上下文:保存了客户端和服务器交互的数据
- 应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等
通常的做法就是把token值放在header里面。