之前半年时间,来到项目的时候,已经有一些东西,大致就是IIS+MYSQL+PHP.
所以接着做,修修补补,Android/iOS与服务器数据库交换用PHP, Web那边则是JS+PHP,也没有前后端之分。本身并不是计算机方向的,所以也没有对这个框架做改动。可能本身没有用PHP的一些框架,总觉得写起来不是很爽快。
 
接下来的项目开始略有变化,因为我先开始做的一块,并不是直接做到C,而是后面可能会与其他部分存在数据交换(主要是从我这边获取数据),基于兴趣,也基于前后端分离的概念,因为后面可能会有有移动端和Web端都需要,所以我决定做一个RESTful的后端。
 
经过简单的学习就直接上手,利用Python Flask+Mysql+SqlAlchemy搭建一个后端(后面根据需要可能加上Redis),目前也还在完善中,写下来笔记先,错漏和理解错误在所难免,继续学习。
 
越来越觉得,Google/Baidu的搜索功能下,很多细节我不太愿意记录。很多时候的问题在于,你想实现一个功能的时候不太会描述你的问题(keyword),当然跨方向可能就是有这个问题,专业词汇不熟悉。所以我努力记录下一些概念,思路和关键词。
 
1.前后端分离
      之前做过的小项目里面,最早时候直接PHP直接对mysql操作,组织混乱(随意在需要的地方增加代码),改了一个地方可能很多地方都受影响:
比如说一张表的结构发生变化,那么可能整个代码里面对于该表有操作的地方,都需要找出来修改,这实在是非常危险的行为,也付出了不少代价。我后来将所有对于Mysql的操作都整理到一个php文件里面来调用稍微缓解了一下这个问题,不过依然不太满意。不过这个本身可能是我php代码现学现用,很多时间都在赶进度造成的问题.
     同时项目开始的时候也没有很统一的异常、错误处理规范,项目本身已经非常小,两三个人做起来沟通都非常麻烦。
     同时这种简单组织的方式,在iOS,Android,和Web同时做起来的时候,也感觉一团乱麻。
     所以最终,在这个机会,我稍微学习(继续学习ing)想对新的这一部分,完全做到前后分离。
     因为目前来讲,项目的并发压力不大,所以决定利用轻量级的Flask搭建一个后端来处理所有数据交互,那么到底用什么样的方式交互呢?
 
2.Why RESTful
     RESTful是一种风格,定义如何利用HTTP本身的方法GET/POST/PUT/DELTE/PATCH等来定义行为(CRUD),而用层级的资源表示(URI)来明确的标明服务器资源之间的关系。客户端无论是iOS/Web/Android, 遵循这个规范对资源进行访问,既保证了安全性同时十分容易管理。
     当然RESTful用什么都可以,比如说Node.js, 虽然我本身有Java经验但是对于js的掌握程度一般,所以没有采用。
                            http://www.scienjus.com/my-restful-api-best-practices/
 
3. HATEOAS
     除了上面的非常简单的说明,其实RESTful还有个重要的概念叫做 HATEOAS( Hypermedia As The Engine Of Application State ), 大致意思,是客户端与服务器的交互,其实我们平时可以看到,很多公司提供RESTful API, 则会有API文档,详细定义了API的endpoint, 规则等。那么假如修改API,则需要修订API文档,所有利用该API的服务可能都需要修改,所以有时候v1/v2这样子来管理不同版本的API, 但是HATEOAS则推崇利用超本文实现资源的导航,大部分时候不需要去查询文档就能使用API,你只需要知道一个根API.
     GitHub的API就很高程度的实现这种类型的API.(参见: https://api.github.com),是不是不需要文档也基本能找到自己想要的资源在哪里,非常值得参考。
     这样的动态资源获取,当你的API改变的时候,也能减小影响范围。
{
"current_user_url": "https://api.github.com/user",
"current_user_authorizations_html_url": "https://github.com/settings/connections/applications{/client_id}",
"authorizations_url": "https://api.github.com/authorizations",
"code_search_url": "https://api.github.com/search/code?q={query}{&page,per_page,sort,order}",
"commit_search_url": "https://api.github.com/search/commits?q={query}{&page,per_page,sort,order}",
"emails_url": "https://api.github.com/user/emails",
"emojis_url": "https://api.github.com/emojis",
"events_url": "https://api.github.com/events",
"feeds_url": "https://api.github.com/feeds",
"followers_url": "https://api.github.com/user/followers",
"following_url": "https://api.github.com/user/following{/target}",
"gists_url": "https://api.github.com/gists{/gist_id}",
"hub_url": "https://api.github.com/hub",
"issue_search_url": "https://api.github.com/search/issues?q={query}{&page,per_page,sort,order}",
"issues_url": "https://api.github.com/issues",
"keys_url": "https://api.github.com/user/keys",
"notifications_url": "https://api.github.com/notifications",
"organization_repositories_url": "https://api.github.com/orgs/{org}/repos{?type,page,per_page,sort}",
"organization_url": "https://api.github.com/orgs/{org}",
"public_gists_url": "https://api.github.com/gists/public",
"rate_limit_url": "https://api.github.com/rate_limit",
"repository_url": "https://api.github.com/repos/{owner}/{repo}",
"repository_search_url": "https://api.github.com/search/repositories?q={query}{&page,per_page,sort,order}",
"current_user_repositories_url": "https://api.github.com/user/repos{?type,page,per_page,sort}",
"starred_url": "https://api.github.com/user/starred{/owner}{/repo}",
"starred_gists_url": "https://api.github.com/gists/starred",
"team_url": "https://api.github.com/teams",
"user_url": "https://api.github.com/users/{user}",
"user_organizations_url": "https://api.github.com/user/orgs",
"user_repositories_url": "https://api.github.com/users/{user}/repos{?type,page,per_page,sort}",
"user_search_url": "https://api.github.com/search/users?q={query}{&page,per_page,sort,order}"
}
 
     当然,我想这种方式可能对于获取资源特别有用,但是对于更新和创建资源,还是要参考文档的,因为涉及到较多的参数传递。说道参数传递,我看到的基本都用json来进行数据交换。
  
4.SQLAlchemy
     之前利用php mysql对数据库进行直接操作,数据一致性检查和处理对我来讲都不太友好。转到Python后测试SQLalchemy之后简直如发现了新大陆,对数据库的操作和结构修改都容易了很多。虽说有人诟病其效率,但是我目前的项目需求来讲,完全不构成问题。
    SQLAlchemy是ORM( Object Relational Mapper)的数据库操作包,假如你对数据结构的一对多,多对多,一对一等基本关系理解深刻,配合SLQAlchemy使用则如鱼得水,大大简化对数据库的操作和安全检查。
     更多参考: http://www.sqlalchemy.org/
 
5.认证和权限管理
    设计一个API,当然要考虑权限管理保证安全性需要,至于是用户/密码认证还是token, 利用python的decorator都能容易的实现。当然,如果设计到RBAC(Role based access control)来区分用户对于具体资源的操作权限进行限制可能稍微麻烦一些。
 
6.Flask-Restful
    本身利用Flask做restful API也ok, 但是Flask-Restful提供了更好用更简单的框架,让你更加轻易的实现你的Restful API. 官方文档也非常的简短易读。我本身特别喜欢的是其利用Output Fields 对你的资源输出进行管理的方式。
 
 
     
 

Flask RESTful API搭建笔记的更多相关文章

  1. 使用swagger 生成 Flask RESTful API

    使用swagger 生成 Flask RESTful API http://www.voidcn.com/article/p-rcvzjvpf-e.html swagger官网 https://swa ...

  2. 快速创建Flask Restful API项目

    前言 Python必学的两大web框架之一Flask,俗称微框架.它只需要一个文件,几行代码就可以完成一个简单的http请求服务. 但是我们需要用flask来提供中型甚至大型web restful a ...

  3. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)

    写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...

  4. 【Tech】CAS RESTful API使用笔记

    在被maven,cas,tomcat各种贱人就是矫情的虐了好几天之后,终于跑通了demo,哈哈哈哈哈哈哈~ 在这里详细记录一下,给和我一样连maven都不会的小白一点福利,同时欢迎大神指正. 首先上最 ...

  5. RESTful API实战笔记(接口设计及Java后端实现)

    写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...

  6. Flask restful API如何解决跨站请求问题

    如果像下面这样只是在return的response添加header是不行的: response = make_response(jsonify(response=get_articles(ARTICL ...

  7. 【Flask】Flask Restful api

    ### 安装: Flask-Restful需要在Flask 0.8以上的版本,在Python2.6或者Python3.3上运行.通过pip install flask-restful即可安装. ### ...

  8. Restful API学习笔记

    之前关于这个概念在网上看了一些,看完似懂非懂,模模糊糊,发现专业术语或者说书面表达的形式对于理解这种十分抽象的概念还是低效了点. 书面文档方面看了以下几个: 理解本真的REST架构风格 1. 要深入理 ...

  9. flask开发restful api系列(6)-配置文件

    任何一个好的程序,配置文件必不可少,而且非常重要.配置文件里存储了连接数据库,redis的用户密码,不允许有任何闪失.要有灵活性,用户可以自己配置:生产环境和开发环境要分开,最好能简单的修改一个东西, ...

随机推荐

  1. Python爬虫-- selenium库

    selenium库 selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(S ...

  2. Flask:web表单

    客户端发送的所有通过POST发出的请求信息都可以通过request.form获取.但是如果我们要生成表单的HTML代码和验证提交的表单数据那么就需要采用另外的方法.Flask-WTF扩展可以把处理we ...

  3. linux c编程:文件的操作

    在Linux系统中,系统是通过inode来获得这个文件的信息.在Linux系统中,inode的信息都是封装在stat这个结构体中.可以通过man 2 stat来查看stat的具体结构.从中可以看到包含 ...

  4. linux删除目录下所有文件,但是保留文件夹

    删除目录和子目录下所有rpm文件,但是保留文件夹,先cd到想要删除的目录 命令如下 find ./ -name "*.rpm" | xargs rm

  5. XXL-Job集群

    底层已经实现好了 调度中心集群 调度中心支持集群部署,提升调度系统容灾和可用性. 调度中心集群部署时,几点要求和建议: DB配置保持一致: 登陆账号配置保持一致: 群机器时钟保持一致(单机集群忽视): ...

  6. 无法定位程序输入点glPopAttrib于动态连结库OPENGL.dll上

    已经下载glut.lib glut32.lib glut.h glut.dll glut32.dll并放到了相应的文件夹中运行程序时还提示说缺少opengl.dll,我又下载了一个opengl.dll ...

  7. blog首页视图

    声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 django 是如何处理 http 请求 ...

  8. matlab之sum()函数

    sum(A,1):对矩阵A按照列求和: sum(A,2):对矩阵A按照行求和: 默认情况下,是按照列求和的. 举例: A=[1 2 3;1 2 3] sum(A,1)的结果: ans = 2 4 6 ...

  9. 带动画效果的jQuery手风琴

    带动画效果的jQuery特效手风琴是一款带动画效果的手风琴作品,非常实用,可以用在新闻列表.FAQ等模块,默认的是打开第一个选项,查看其它的时候直接点击加号按钮就展开. 源码地址:http://www ...

  10. Vagrant + Vbox实战 【转】

    原文地址:http://www.cnblogs.com/suihui/p/4362233.html 一.软件下载 1.下载Oracle VM VirtualBox https://www.virtua ...