之前半年时间,来到项目的时候,已经有一些东西,大致就是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. ajax工作原理(转)

    在写这篇文章之前,曾经写过一篇关于AJAX技术的随笔,不过涉及到的方面很窄,对AJAX技术的背景.原理.优缺点等各个方面都很少涉及null.这次写这篇文章的背景是因为公司需要对内部程序员做一个培训.项 ...

  2. css多余字符显示省略号

    width:300px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; ;

  3. Django 初始化数据库

    django 初始化数据库 刷新数据库guoguos-MacBook-Pro:mysite guoguo$ python manage.py sqlflushBEGIN;SET FOREIGN_KEY ...

  4. 【linux】如何查看进程运行在那颗cpu上

    这里介绍一种方法查看进程运行在哪个cpu上, 首先top 然后按字母:f 按字母:j 回车即可 其中P列表示进程运行在哪个CPU上

  5. Web框架和Django基础

    核心知识点 1.web应用类似于一个socket客户端,用来接收请求 2.HTTP:规定了客户端和服务器之间的通信格式. 3.一个HTTP包含两部分,header和body,body是可选,\r\n分 ...

  6. 在pycharm中执行脚本没有报错但输出显示Redirection is not supported.

    没有新式语法错误,但是输出显示Redirection is not supported.(不支持重定向) 在stockflow中找到是因为从IDE中运行脚本的原因,比如pycharm,所有IDE都提供 ...

  7. UVA - 10305 【全排列】

    题意 要求给出一组 包含 1 - N 的数字的序列 要求这个序列 满足 题给的限制条件 比如 1 2 就是 1 一定要在 2 前面 思路 因为 数据规模较小 可以用 全排列 然后判断每个序列 是否满足 ...

  8. perl之创建临时文件夹遇到同名文件该咋办

    当你在目录下进行一系列操作时,若要创建许多文件或者修改文件,可能会遇到许多麻烦的事.所以呢,新建一个文件夹,然后在这个文件夹下新建文件或者修改文件.假设,你的代码要在一个目录下新建一个文件夹,名为Tm ...

  9. Linux--struct file结构体【转】

    本文转载自:https://www.cnblogs.com/hanxiaoyu/p/5677677.html struct file(file结构体): struct file结构体定义在includ ...

  10. 虚拟化网络之OpenvSwitch

    OpenvSwitch简称OVS,官网(http://openvswitch.org/) OVS是一个高质量.多层的虚拟交换软件,即虚拟交换机. OpenvSwitch的见的相关组件: ovs-vsw ...