flask-restful

  • 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.argsget('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里面。

原文地址:https://www.cnblogs.com/testzcy/p/11613698.html