本人学习python也不是很久属于小白级别的,大约就是3个多月技术也不是很到位,如果写的有什么错的地方希望指正。
今天的分享有以下两点:1>restful-API
2>使用flask来设计restful-API
REST:Representational State Transfer 中文名字:表现层状态转换,如果一个架构符合REST原则就趁他为REST架构。表现层状态转换其实说白了就是资源(文件图片等)、客户端对服务端的操作、操作的时候发生的状态变化’;互联网之间的通信是根据HTTP协议来进行通信的,那么可客户端对服务器的操作,通过使用某种手段,让服务器状态发生变化,这些变化是通过资源变化来表现出来的。一般来说数据的格式是json格式的。
REST的特点:1.客户端-服务端:客户端与服务端分离,各自负责各自的事情 2.无状态:从客户端到服务端的每个请求都必须包含理解请求所必需的的信息,每次都得提交。3.可缓存:服务器必须明示客户端请求能否缓存4.分层系统: 客户端和服务器之间的通信应该以一种标准的方式,就是中间层代替服务器做出响应的时候,客户端不需要做任何变动5.统一的接口:服务器和客户端的通信方式必须是统一的。6.编码: 服务器可以提供可执行代码或脚本,为客户端在它们的环境中执行。这个约束是唯一一个是可选的
客户端通过以下方式来改变资源的状态:基于http协议的标准方法
GET:获取资源的信息
POST:提交必要的信息,来创建资源
PUT:更新资源
DELETE:删除资源
还有一些不是很常用的方法例如PATCH、COPY、HEAD方法来操作资源
RESTFUL-API就是基于REST设计的API。
Flask众所周知是一个轻量级的web开发框架,它本身很小,但是他有很多的可以扩展的模块,功能,他的扩展性很强,非常强大,较之于Django框架,他缺一个自带后台。。。Flask框架还是很值得去学习滴。
下面使用flask开发后台的API
#coding:utf-8
from flask import Flask,jsonify,abort,make_response
from flask import request
#初始化app
app = Flask(__name__)
#用户名和密码
users = [
{
'id':1,
'username':"huahua",
'password':123456
},
{
'id':2,
'username':"sunliqin",
'password':5426241
}
]
'''
get 方法的使用
'''
#获取所有用户
@app.route('/api/users',methods=['GET'])
def get_users():
return jsonify({'users':users})
#获取某一个用户
@app.route('/api/users/<int:user_id>',methods=['GET'])
def get_oneuser(user_id):
user = filter(lambda a:a['id']==user_id,users)
if len(user) == 0:
abort(404)
return jsonify({'user':user[0]})
#发生错误的时候
@app.errorhandler(404)
def not_found(error):
return make_response(jsonify({'error':'not be found'}), 404)
'''
post方法的使用,意思是创建一个资源 注意in的用法可以直接在集合set list dict truple 中进行判断
我们可以采用两种方式来提交数据,一种是表单提交使用request.form,另一种方法是使用json格式数据来提交使用request.json形式
'''
# @app.route('/api/users',methods=['POST'])
# def create_user():
# if not request.json or not 'username' in request.json :
# abort(400)
#
# user = {
# 'id':users[-1]['id'] + 1,
# 'username':request.json['username'],
# 'password':request.json['password']
# }
# print type(request.json)
# users.append(user)
# return jsonify({'user':user}), 201
@app.route('/api/users',methods=['POST'])
def create_user():
if not request.form or not 'username' in request.form :
abort(400)
user = {
'id':users[-1]['id'] + 1,
'username':request.form['username'],
'password':request.form['password']
}
print type(request.form)
users.append(user)
return jsonify({'user':user}), 201
'''
put更新用户数据
'''
@app.route('/api/users/<int:user_id>',methods=['PUT'])
def update_user(user_id):
user = filter(lambda a:a['id'] == user_id, users)
if len(user) == 0:
abort(404)
if not request.json:
abort(400)
user[0]['username'] = request.json.get('username',user[0]['username'])
user[0]['password'] = request.json.get('password',user[0]['password'])
return jsonify({'user':user[0]})
'''
delete 删除用户数据
'''
@app.route('/api/users/<int:user_id>',methods=['DELETE'])
def delete_user(user_id):
user = filter(lambda a: a['id'] == user_id, users)
if len(user) == 0:
abort(404)
if not request.json:
abort(400)
users.remove(user[0])
return jsonify({'result':True})
if __name__ == '__main__':
app.run(debug=True)
上边的代码是很基础的设计API的方式,当然了较为安全的是我们会使用认证的方式,我们会对密码进行加密,还有相关令牌的生成认证等
#对密码加密我们有一个专门的库PassLib库
from passlib.apps import custom_app_context as pwd_context
#定义一个哈希密码的的函数:
#定义密码散列,这里密码散列是单向的,原理是由原密码加密以后生成一个字符串,这个字符串不能返回到原密码,这样别人就不能根据你的字符串推出你的密码,安全。
def hash_password(self,password):
self.password_hash = pwd_context.encrypt(password)
#下面是密码验证函数,同样的密码生成同样的字符,比较后验证密码是否一样
#密码验证功能 正确返回true错误返回false
def verify_password(self,password):
return pwd_context.verify(password,self.password_hash)
关于认证这里有一个flask-httpauth 扩展可以帮助实现
from flask.ext.httpauth import HTTPBasicAuth
auth = HTTPBasicAuth()
#get_password 函数是一个回调函数,使用它来获取给定用户的密码,并加以判断
@auth.get_password
def get_password(username):
if username == 'miguel':
return 'python'
return None
#处理未授权的错误
@auth.error_handlerdef unauthorized():
return make_response(jsonify({'error': 'Unauthorized access'}), 401)