哇,昨天组里进行总结的时候,小哥哥和小姐姐真是把我给秀到了,跟他们一比,我总结的太垃圾了,嘤嘤嘤。因为我平常不怎么总结,总结的话,有word还有纸质的,现在偏向于纸质,因为可以练练字。个人观点是,掌握了就不需要总结,因为已经会了,总结没什么用。如果需要总结只能说是还不够会。不过总结也有总结的好处,可以把整个过程再重新梳理一遍,如果时间比较充足的话,还是不错的方法。现在还是每天总结一下吧,要不然最后不好看。开始正题flask中的restful

一、关于Restful

  Restful是目前最流行的api设计规范,用于web数据接口的设计

  什么又是api?

  按照我的理解,比如print(),这就是一个api。

def print(self, *args, sep=' ', end='\n', file=None): # known special case of print
"""
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
"""
pass

  可以看到print()并不是一开始就有在终端中输出打印的功能,而是被python的创始人事先已经规范好的一个函数叫print,这个函数里面才有打印的功能

二、Restful基础

  restful定义的api可以是一个接口,这个接口在定义url链接的时候,不能存在动词,一个个进行详细说明

  在flask(因为我学的flask,菜的真实)中有一个视图函数(看我要说的准确一点啦)叫做@app.route,这个函数不能详细说,只需要知道是一个定义路径的就可以,比如我要写一个/index/路径,那么我们就可以是

@app.route('/index/')
def index():
return "hello,world"

  这样就已经完成一个index的路径了。还想要仔细了解话,这个东西是装饰器,装饰器也算一个挺复杂的函数。可以用双手搜下"flask 装饰器",具体理解就只能看个人啦~

状态码:

  200 正常

  3xx 重定向

  4xx 客户端错误

  5xx 服务器错误

http的请求

  get、post、put、head、delete、connect、options、trace这个最好要知道,因为后面会用到,想具体了解到话可以参考一本叫做《图解HTTP》的一本书

三、Restful的动词

  在Restful中有五种请求方式,并且这五种请求方法不像在http里面只是一个请求的方法,这五种请求方法还需要记住,并且按照专业术语的话,它们应称之为“动词”。

  get 读取  

  post 新建

  put 更新

  patch 也是更新,但只是部分更新(比如我只更新一个数据表中的一个参数,那么用patcha就会只更新这个参数,不会更新其他的东西)

  delete 删除

  了解了这五种请求方式之后,按照规范,在RestFul里面链接路由的时候,不能在名词里面加上动词。名词就是开发人员编写的路径名,但是路径名里面不能包含动词。

  比如一个正确的url链接是/index/,这里面是没有动词的。错误的url链接是/get-index/这是一个错误的url链接,因为在get-index里面,包含动词get,在定义路径的时候,python会报错。

  掌握完这些前期知识之后,我们来说下一个简单的Restful api实现

四、简单的hello world

from flask import Flask,redirect,url_for
from flask_restful import Api,Resource,reqparse app = Flask(__name__)
# 先绑定一个api,进行初始化操作
api = Api(app)
class LoginView(Resource):
def get(self):
return {"simple":"hello world"}
api.add_resource(LoginView , '/' ,endpoint= 'login')
if __name__ == '__main__': 
  app.run()

  前面两个from都是进行导入模板的,如果没有的话,需要进行安装。如果想用flask_restful,那么就可以在windows的命令行,或者Pycharm的虚拟终端中输入pip install flask_restful。这样就可以安装了。 

  这里简单说明下两个模板中的作用,from flask中的flask是Python中的一个框架,如果要想用flask框架的话,那么就必须要有这个库。flask_restful这个是restful用的。restful不是python中的内置模板,肯定是要进行导入啦。

  app = Flask(__name__) 这是初始化一个flask模型

  api = Api(app)这是将api和flask绑定到一块

  LoginView继承了一个Resource的类,这个类我也没有仔细的了解,待我了解之后,我再进行补充。先记着,必须要继承Resource的类,才能写api

下面定义的方法比较重要

  def get() 代表了是get方法传输数据,传输的数据都是json(就是一个格式化输出,比较规范的一个字典,不用过多纠结)。如果是def post()就代表了是post方法传输数据。然后根据函数的定义,一个函数要有一个返回值,因为是json的传输格式,所以就要是返回一个字典。

  重要的部分是要把这个api要有一个展示的Url链接呀,那么我们就用api.add_resource()这个函数进行展现。第一个参数是定义的视图名LoginView,第二参数是url的链接是在/,比如是http;//127.0.0.1:5000那么我想访问/页面,就需要是http://127.0.0.1/,endpoint这个参数是后来Url_for反转的时候用到的。这样就能访问了,不要忘记简单但是又核心的main,如果main丢了,程序如何执行呢?嘻嘻

拓展一下

  如果是一个详情页面展示呢?就是在url里面是/index/1/ ,/index/2/,/index/3,/index/..../ 这样的结构呢?难道我每次都需要是需要一个api.add_resource(xxx视图,/index/1/),注意仔细观看除了/index/,后面的1,2,3,4.....都是有规律的。如果我们可以把这些1,2,3,4设置为变量就好了,没错,在flask中是可以进行操作的。

我贴代码先看一下

  

from flask import Flask,redirect,url_for
from flask_restful import Api,Resource,reqparse app = Flask(__name__)
# 先绑定一个api,进行初始化操作
api = Api(app) class LoginView(Resource):
def get(self , username):
return {"simple" : 'hello ,world'} api.add_resource(LoginView , '/<username>/' ,endpoint= 'login')
#
@app.route('/login1/')
def login1():
return redirect(url_for('login' ,username = '1')) if __name__ == '__main__':
app.run()

  这里利用了username进行传值,通过视图函数login1来传递username的属性值,进而访问的时候以http://127.0.0.1:5000/1/就可以访问的到了。<username>,代表了这是个可变的路由。可以参考下flask官方文档中对路由的解释   http://docs.jinkan.org/docs/flask/quickstart.html#routing

  下面贴上效果图

  

  这样的话一个稍微不是hello world的hello world,就算完成了。

Restful进阶:

  post提交方法,前面我们已经说过get方法是读取,post方法是新建啦。我们用post方法演示一下,先贴代码

from flask import Flask,redirect,url_for
from flask_restful import Api,Resource,reqparse app = Flask(__name__)
# 先绑定一个api,进行初始化操作
api = Api(app) class LoginView(Resource):
def post(self):
parser = reqparse.RequestParser()
# reqparse 是一个类似于WTforms验证的一个模板,用这个模板的时候,需要先进行引用,然后和WTForms的功能就差不了,就是一个验证用户输入的功能。
        username = parser.add_argument('username' ,type = str , help = 'you xu yao yi ge zheng que de shuzi' ,required = True)
# 定义一个username,说明用户需要传入关于username的一个值()后面的都是参数.括号里面的参数可以先不考虑
password = parser.add_argument('password' , type = str , help = 'you xu yao yi ge zheng que de mima')
# 定义一个password,说明用户需要传入关于password的一个值()后面的都是参数.括号里面的参数可以先不考虑
args = parser.parse_args()
# 对用户传入的参数进行解析,不解析的话,是会报错的
print(args)
return {"username" : "balala"} api.add_resource(LoginView , '/')
if __name__ == '__main__':
app.run()

  运行的结果是,浏览器默认的是get方式提交。而我们定义的是post方式提交

  

  post方式提交(这里用到的是MantraPortable浏览器,个人感觉这款浏览器还是非常方便的。如果好像谷歌的postman的插件也是可以的,或者用burpsuit抓包进行修改,再或者在火狐里面有hackbar(这个目前付费了,emmn ,可以百度去搜下教程,都是一样的,只要能提交post数据就可以)

  这是我们把username和password都进行提交了,如果我们只提交一个password呢?

  咦,可以看到两个结果不一样,这是为什么呢?

username = parser.add_argument('username' ,type = str , help = 'you xu yao yi ge zheng que de shuzi' ,required = True)

password = parser.add_argument('password' , type = str , help = 'you xu yao yi ge zheng que de mima')
       

  因为username里面有个required的参数,这个参数我的理解是username必须要有值,才能回显正确的字段。如果没有值的话,就回显help里面的内容。help就是一个提示的作用,万一用户输入的与我们想象的不一致,那我们可以进行提示下呀。不过这里有个小技巧,如果说help里面提示是中文的话,浏览器会进行转码,至于转码如何解决就只能百度去搜索了.......

补充下参数的内容:

  default:默认值,如果这个字段没有设置值,那么就会使用default参数指定的值

  required:是否必须。默认是false,如果设置为True,那么这个参数就必须提交上来。

  type:这个参数的数据类型,如果指定,那么将使用指定的数据类型来强制转换提交上来的值

  choices:选项。提交上来的值,只有满足这个选项中的值才符合验证通过,否则验证不通过。这个属性是一个列表,使用的时候要注意一下

  help:错误信息,如果验证失败后就将才用这个help里面的内容

  trim:是否去掉前后的空格

  

  目前参考:  https://www.runoob.com/w3cnote/restful-architecture.html

        http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html

  

(待我慢慢写,写精华,不写一般般的帖子)

 

python中的Restful的更多相关文章

  1. [转]Python中urllib与urllib2的区别与联系

    引用文章1:http://my.oschina.net/u/558071/blog/144792 引用文章2:http://zhuoqiang.me/python-urllib2-usage.html ...

  2. Python中使用Flask、MongoDB搭建简易图片服务器

    主要介绍了Python中使用Flask.MongoDB搭建简易图片服务器,本文是一个详细完整的教程,需要的朋友可以参考下 1.前期准备 通过 pip 或 easy_install 安装了 pymong ...

  3. 功能式Python中的探索性数据分析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 这里有一些技巧来处理日志文件提取.假设我们正在查看一些Enterprise Splunk提取.我们可以用Splunk来探索数据.或者我们可以 ...

  4. 如何在python中使用Elasticsearch

    什么是 Elasticsearch ​ 想查数据就免不了搜索,搜索就离不开搜索引擎,百度.谷歌都是一个非常庞大复杂的搜索引擎,他们几乎索引了互联网上开放的所有网页和数据.然而对于我们自己的业务数据来说 ...

  5. [转]Python中的str与unicode处理方法

    早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...

  6. python中的Ellipsis

    ...在python中居然是个常量 print(...) # Ellipsis 看别人怎么装逼 https://www.keakon.net/2014/12/05/Python%E8%A3%85%E9 ...

  7. python中的默认参数

    https://eastlakeside.gitbooks.io/interpy-zh/content/Mutation/ 看下面的代码 def add_to(num, target=[]): tar ...

  8. Python中的类、对象、继承

    类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...

  9. python中的TypeError错误解决办法

    新手在学习python时候,会遇到很多的坑,下面来具体说说其中一个. 在使用python编写面向对象的程序时,新手可能遇到TypeError: this constructor takes no ar ...

随机推荐

  1. kafka生产者数据可靠性保证

    为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到 producer 发送的数据后,都需要向 producer 发送 ack(ackn ...

  2. 如何在所有的mon的损坏情况下将数据恢复如初

    本篇主题 在mon无法启动,或者所有的mon的数据盘都损坏的情况下,如何把所有的数据恢复如初 写本章的缘由 在ceph中国的群里有看到一个技术人员有提到,在一次意外机房掉电后,三台mon的系统盘同时损 ...

  3. Ubuntu12.10 设置默认命令行启动

    在虚拟机当中安装ubuntu12.10的时候默认把图形界面给装上了,由于不需要使用桌面,所以为了省去每次进入到图形界面然后再用ctrl+F1的方式切换到命令行的步骤,希望能够默认进入的是命令行模式,那 ...

  4. txt文件覆盖恢复

    1.txt文件恢复到之前保存的版本 2.电脑未重启 方式:如果你使用系统还原可以用"还原以前的版本"功能来轻松找回. 右击.txt文件-还原以前的版本-选择时间点-还原

  5. Hadoop框架:MapReduce基本原理和入门案例

    本文源码:GitHub·点这里 || GitEE·点这里 一.MapReduce概述 1.基本概念 Hadoop核心组件之一:分布式计算的方案MapReduce,是一种编程模型,用于大规模数据集的并行 ...

  6. 记php多张图片 合并生成竖列 纵向长图(可用于商品详情图合并下载)

    <?php namespace app\mapi\common\image; /** * 拼接多幅图片成为一张图片 * * 参数说明:原图片为文件路径数组,目的图片如果留空,则不保存结果 * * ...

  7. H5系列之常用的语义元素

    H5添加了几个新标签,带有语义化的标签,像我们的div 和 span 标签,你说他两能干嘛呢, 好像他两什么事都能干.举个例子,你家里的房子,有几个房间,如果不分房间的话,是不是你 今天睡这里,明天睡 ...

  8. 【PYTEST】第三章参数化

    知识点: 参数化 1. parametrize() 参数化测试用例 实际工作中,我们不可能就传一组数据,参数化支持多组数据测试,并且每组都会去执行,parametrize(), 第一个参数用逗号开分隔 ...

  9. Mac 上超好用的代码对比工具 beyond compare,对比json差异

    导读 昨天下午,公司业务跑不通,然后开发组长让架构师联系我,给我发一个json和部署到dev上的微服务url,让我去测试下,将发来的json放到json.cn上愣是解析不出来,我就用之前的json请求 ...

  10. mq存储文件

    存储文件 启动broker之后我们可以看到下面这些文件 1.config包含了运行期间一些配置信息,主要包括下列信息. consumerFilter.json:主体消息过滤信息 consumerOff ...