本人学习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)