python中的Restful
哇,昨天组里进行总结的时候,小哥哥和小姐姐真是把我给秀到了,跟他们一比,我总结的太垃圾了,嘤嘤嘤。因为我平常不怎么总结,总结的话,有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的更多相关文章
- [转]Python中urllib与urllib2的区别与联系
引用文章1:http://my.oschina.net/u/558071/blog/144792 引用文章2:http://zhuoqiang.me/python-urllib2-usage.html ...
- Python中使用Flask、MongoDB搭建简易图片服务器
主要介绍了Python中使用Flask.MongoDB搭建简易图片服务器,本文是一个详细完整的教程,需要的朋友可以参考下 1.前期准备 通过 pip 或 easy_install 安装了 pymong ...
- 功能式Python中的探索性数据分析
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 这里有一些技巧来处理日志文件提取.假设我们正在查看一些Enterprise Splunk提取.我们可以用Splunk来探索数据.或者我们可以 ...
- 如何在python中使用Elasticsearch
什么是 Elasticsearch 想查数据就免不了搜索,搜索就离不开搜索引擎,百度.谷歌都是一个非常庞大复杂的搜索引擎,他们几乎索引了互联网上开放的所有网页和数据.然而对于我们自己的业务数据来说 ...
- [转]Python中的str与unicode处理方法
早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...
- python中的Ellipsis
...在python中居然是个常量 print(...) # Ellipsis 看别人怎么装逼 https://www.keakon.net/2014/12/05/Python%E8%A3%85%E9 ...
- python中的默认参数
https://eastlakeside.gitbooks.io/interpy-zh/content/Mutation/ 看下面的代码 def add_to(num, target=[]): tar ...
- Python中的类、对象、继承
类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...
- python中的TypeError错误解决办法
新手在学习python时候,会遇到很多的坑,下面来具体说说其中一个. 在使用python编写面向对象的程序时,新手可能遇到TypeError: this constructor takes no ar ...
随机推荐
- WPF应用中一种比较完美的权限控制设计方式
如题近段时间 需要在wpf应用中设计一个权限控制 , 简而言之的说 你懂的 对于IT人员来说都知道的 常见的软件功能 首先要有用户 用户,然后用户属于哪个角色 ,然后各个角色都有自己的可供操作的一堆功 ...
- Java iText+FreeMarker生成PDF(HTML转PDF)
1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等.方便用户查看,下载,打印.目前常用的解决方案是,把相关数据信息,生成对应的pdf文件返回给用户. ...
- 3 jinja2模板
video17 jinja2过滤器 过滤器通过管道符号进行使用.如{{ name | length }}将返回name的长度,过滤器相当于是一个函数. 1 def hello_world(): 2 i ...
- 数论总结——更新ing
数论还是有很多没学完 只是小小的总结 一.同余定理 1.反身性:\(a\equiv a (mod m)\) 2.对称性:若\(a\equiv b(mod m)\),则\(b\equiv a (mod ...
- VMware虚拟机 - 解决主机每次重启后 VMWare 都无法上网的问题
背景 每次重启自己电脑,重新打开 Vmware 虚拟机,再 ping 百度时,又显示无法 ping 通 但明明已经把 Vmware 的虚拟网卡重置了 那到底要如何解决呢? 解决方案 进入服务界面 将 ...
- kafak ack应答机制
ack 应答机制 对于某些不太重要的数据,对数据的可靠性要求不是很高,能够容忍数据的少量丢失, 所以没必要等 ISR 中的 follower 全部接收成功. 所以 Kafka 为用户提供了三种可靠性级 ...
- Dubbo 服务引入-Version2.7.5
1.服务引用原理 Dubbo 服务引用的时机有两个,第一个是在 Spring 容器调用 ReferenceBean 的 afterPropertiesSet 方法时引用服务,第二个是在 Referen ...
- __FUNCTION__
- vue项目中echarts属性总结
<div id="echarts" style="width: 600px;height: 400px;margin-top: 100px;margin-left: ...
- 需要登录才能下载的文件可以用Folx下载吗
用苹果电脑的小伙伴有没有发现,有时候文件即时有下载链接也还是要先登录才能下载,那这样的文件用下载器Folx还能下载码?下面小编将在Mac系统平台上,通过一篇教程教大家利用Folx 5的密码管理来保存网 ...