RESTAPI介绍注意这里只是简单介绍一下RESTAPI,起到介绍的作用。更深入的内容不在本次研究范围内。感兴趣的朋友可以查看相关资料进行深入研究。另外,本账号接受该领域的投稿,欢迎联系云多君!APIAPI,全称ApplicationProgrammingInterface(应用程序编程接口),简单来说就是品牌商开发的接口,允许第三方在自己的产品上额外开发和应用系统通信接口。RESTAPIREST是一种通过HTTP协议设计API的架构风格。它的主要优点是具有很大的灵活性。只要需要直接从服务器向Web应用程序或站点的用户提供数据,开发人员就会使用RESTAPI。RESTAPI的主要组件:客户端-客户端或程序在用户端(在他的设备上)发起通信。服务器—使用API访问其功能和数据的服务器。资源——服务器传输给客户端的任何内容(视频、文本、图像)。RESTAPI通过HTTP请求进行通信以完成以下功能-创建、读取、更新和删除数据。它们也称为CRUD操作。REST提供有关请求资源的信息,并使用四种方法来描述如何处理资源:POST-创建资源;GET-获取资源;PUT-更新资源;DELETE-删除资源。RESTfulAPIREST,全称是RepresentationalStateTransfer(具象状态转移)。它是一种设计风格。RESTful只是一个形容词,比如和平。形容词是和平的,RESTful描述的是按照这个规范设计的API,称为RESTfulAPI。RESTfulAPI主要由三个部分组成:名词名词:定义资源位置的URL。每个资源在Internet上都会有一个唯一的位置,就像每个家庭都有一个唯一的地址一样。动词:要对资源执行的操作。OntentTypes资源呈现方式:API资源可以通过多种方式呈现,最常用的是JSON,轻量级,易于处理。因此,采用RESTful风格设计的API具有以下优点和局限性:唯一的URL指示资源位置,统一的API接口。(统一接口)是无状态的。(无状态)RestfulAPI,允许集成应用程序应用程序或与RestfulWeb服务交互。它现在正在成长为连接微服务架构中组件的最常见方式。在API的帮助下,我们能够获取或向网站发送数据并执行一些操作,目的是通过Web服务完成我们的任务。每个网站都使用不同类型的API,例如股票市场交易网站使用API来获取当前价格和涨跌幅。创建第一个RESTAPI类似地,我们创建HelloworldAPI,这意味着如果您向它发出get请求,您将获得JSON响应。通常,API会给出JSON类型的响应。接下来,使用pip包管理器安装Flask:get(self):return{"Hello":"World"}api.add_resource(Helloworld,'/')if__name__=='__main__':app.run(debug=True)ok,至此第一个创建完成一个Restapi看起来很简单,那什么是Flask-Restful呢?Flaskrestful定义了Resource类,其中包含每个HTTP方法的方法。方法名要与其对应的HTTP方法相同,小写,如上代码所示。我们发现这些方法没有路由装饰器,这就是它们基于资源路由的原因。不管定义了什么类,我们都可以使用添加资源的add_resource方法为其定义一个路由,并在对应的路由上调用该类。说明:在上面的代码中,我们首先加载了需要的父类,然后初始化了我们的app和API。在那之后,我们创建了一个程序,我们正在发出一个GET请求,如果有人点击这个程序,那么他将得到Helloworld作为JSON格式的响应。要打开特定的URL,我们使用添加资源方法并将其路由到默认斜杠。要运行此文件,您可以使用POSTMAN工具(一种API维护工具)来创建、测试和管理API。您还可以使用带有以下代码的请求模块测试此API。首先,运行上面的文件,它会给你本地主机URL,然后在另一个命令提示符下,运行以下代码文件:importrequestsurl="http://127.0.0.1:5000/"response=requests.get(url=url)print(response.text){"Hello":"World"}通过FlaskRESTApi理解HTTP请求学习了以上内容,你已经对RESTAPI有了初步的印象。接下来我们将继续探索使用RESTAPI的不同HTTP方法,我们在其中定义一个列表,该列表将以字典(JSON对象)的形式存储从服务器获取的所有数据。这很重要,因为我们在项目中使用与其他地方不同的API来获取数据。首先创建一个API,在这里你创建了3个HTTP方法,分别命名为GET、POST和DELETE,并在其中创建一个自定义URL,在请求POST方法时将Name作为输入,在请求GET方法时,将name返回;在DELETE上,如果名称存在,我们将其删除,再次访问它会返回NULL。创建一个文件并编写以下代码:fromflaskimportFlaskfromflask_restfulimportResource,Apiapp=Flask(__name__)api=Api(app)data=[]classPeople(Resource):defget(self):forxindata:如果x['Data']==name:returnxreturn{'Data':None}defpost(self,name):temp={'Data':name}data.append(temp)returntempdefdelete(self):forind,xinenumerate(data):ifx['Data']==name:temp=data.pop(ind)return{'Note':'Deleted'}api.add_resource(People,'/Name/')if__name__=='__main__':app.run(debug=True)打开POSTMANAPI工具并点击每个HTTP方法请求。首先,当我们使用post请求Name时,它??给了我们一个名字。根据获取请求,我们将返回名称。它在删除时被删除,当你再次取回它时,它会为你返回NULL。结果如下如何在FlaskRESTAPI中使用装饰器我们使用带有API的装饰器来监控IP地址、cookie等。我们将继续学习如何使用带有装饰器的FlaskAPI。装饰器是一个将另一个函数作为参数并返回另一个函数的函数。也可以理解为在现有功能的基础上,不改变或修改现有功能的情况下,提供一些附加功能的功能。这里我们创建一个新文件,我将通过创建两个装饰器来展示它。在第一个文件中,编写返回代码执行时间的外部时间函数。我们从functools模块(高阶python函数的标准模块)导入应用于包装函数的包装装饰器。它通过复制所有参数来更新包装函数。fromflaskimportFlaskfromflask_restfulimportResource,Apiimportdatetimefromflaskimportrequestfromfunctoolsimportwrapsapp=Flask(__name__)api=Api(app)deftime(function=None):@wraps(function)defwrapper(*args,**kwargs):s=datetime.datetime.now()_=function(*args,**kwargs)e=datetime.datetime.now()print("执行时间:{}".format(e-s))返回_returnwrapperclassHelloWorld(Resource):@monitordefget(self):return{"hello":"world"}api.add_resource(HelloWorld,"/")if__name__=="__main__":app.run(debug=True)我们创建第二个装饰器来监视cookie和IP地址,因此创建以下函数。不要向helloworld函数添加时间装饰器,而是添加监视器装饰器并运行代码。defmonitor(function=None):@wraps(function)defwrapper(*args,**kwargs):_=function(*args,**kwargs)print("IpAddress:{}".format(request.remote_user))print("Cookies:{}".format(request.cookies))print(request.user_agent)return_returnwrapper如何让FlaskAPI更安全我们在设计API的时候也要注意安全,因为很多人们将访问它。因为API可能包含一些双方之间的机密数据,所以我们可以指定只有授权的人才能访问API,那怎么办呢?此时可以使用Flask基本认证。当然这时候需要使用pip命令来安装flask模块。pipinstallflask-httpauth我们正在构建一个API并定义用户数据字典,其中包含用户名和密码。在实时用例中工作时,可以通过配置文件或数据库接受用户名和密码。首先,我们创建一个main函数来匹配用户名和密码,并创建一个GET方法,告诉任何人访问这个API,如果没有登录,我们将无法访问数据。fromflaskimportFlaskfromflask_restfulimportResource,Apifromflask_httpauthimportHTTPBasicAuthapp=Flask(__name__)api=Api(app,prefix="/api/v1")auth=HTTPBasicAuth()USER_DATA={"admin":"SuperSecretPwd"}#验证密码的路由@auth.verify_passworddefverify(username,password):ifnot(usernameandpassword):returnFalsereturnUSER_DATA.get(username)==passwordclassPrivateResource(Resource):@auth.login_requireddefget(self):return{"How'stheJosh":"High"}api.add_resource(PrivateResource,'/private')if__name__=='__main__':app.run(debug=True)当我们使用POSTMAN运行上述文件时,我们将尝试在未登录的情况下获取数据,以证明对您的未经授权的访问。现在转到授权并单击基本授权。输入用户名和密码并点击GET请求以获得所需的结果。这是保护FlaskAPI的最基本的方法。当然还有更高级的方法,这里就不过多介绍了。如何在FlaskAPI上启用跟踪到目前为止,我们已经了解了如何保护我们的API免受未经授权的登录,但是如果我们还想知道访问者的位置(纬度和经度点)、IP地址、服务器名称(例如详细信息谁在访问API),我们还可以继续使用RESTAPI配置一个基本的FlaskTrace应用程序。首先,使用PIP命令安装flask-trace包。pipinstallflask-track-usage接下来看程序:fromflaskimportFlask,gapp=Flask(__name__)app.config['TRACK_USAGE_USE_FREEGEOIP']=Falseapp.config['TRACK_USAGE_INCLUDE_OR_EXCLUDE_VIEWS']='include'fromflask_track_usageimportfromTrackUsageflask_track_usage.storage.printer从flask_track_usage.storage.storage.output导入PrintWriter包括@app。route('/')defindex():g.track_var["optional"]="Write_Something"return"Hello"#Runtheapplicationif__name__=="__main__":app.run(debug=True)程序通过导入TrackUsage、Inputwriter和outputwriter以创建跟踪应用程序。将flask应用程序传递到Track包并使用输出编写器,并使用lambda函数以字符串格式写入输出。然后在斜杠上创建一个基本路由,并将跟踪应用程序作为装饰器包含在内。g代表全局,表示数据对于上下文是全局的。因此,创建一个在浏览器中返回“Hello”的基本API,同时在后端获取所有人员的信息。如何为RESTAPI编写单元测试代码现在您已经为您的案例创建了一个很好的RESTAPI。尽管如此,我们还需要为RESTAPI编写单元测试代码,因为从API中识别常见错误并确保生产安全至关重要。下面是新建一个名为run的文件,开发如下简单的API。fromflaskimportFlaskfromflask_restfulimportResource,Apiimportjsonapp=Flask(__name__)api=Api(app)classHelloworld(Resource):def__init__(self):通过defget(self):returnjson.dumps({"Message":"Fine"})api.add_resource(Helloworld,'/')if__name__=='__main__':app.run(debug=True)现在创建另一个名为test的文件,将API测试代码写入其中。最常见的情况是执行以下三个基本单元测试。检查响应码是否为200检查API写入的内容是否为应用JSON格式检查我们访问的所有key是否存在于API数据处理fromrunimportappimportunittestclassFlaskTest(unittest.TestCase):#Checkforresponse200deftest_inde(self):tester=app.test_client(self)#tester对象response=tester.get("/")statuscode=response.status_codeself.assertEqual(statuscode,200)#检查返回的内容是否为applicationJSONdeftest_index_content(self):tester=app.test_client(self)response=tester.get("/")self.assertEqual(response.content_type,"application/json")#检查返回的数据deftest_index_data(self):tester=app.test_client(self)response=tester.get("/")self.assertTrue(b'Message'inresponse.data)if__name__=='__main__':unittest.main()如果你学过网络抓取,你应该知道200响应意味着对特定URL的请求成功并返回了响应。好吧,这就是本文的全部内容。到目前为止,我们已经学会了从头开始创建FlaskRESTAPI并轻松安全地维护它。Flask是Pythonweb领域最著名的轻量级web开发框架。对于致力于web开发的同学来说,掌握基本的Flask技能还是很有必要的。你学会了吗?
