이것은 시작점 역할을 하는 REST API에 대한 간략한 소개일 뿐이며 관심 있는 친구는 이 연구의 범위에 포함되지 않습니다. 심층적인 학습을 위해 관련 자료를 확인해보세요. 또한 이 계정은 이 분야의 제출을 허용합니다. 윤두준에게 문의하세요!
API, 정식 이름은 애플리케이션 프로그래밍 인터페이스(Application Programing Interface) 간단히 말하면 제3자가 시스템 통신을 추가로 개발하고 자사 제품에 적용할 수 있도록 브랜드에서 개발한 인터페이스입니다. 상호 작용.
REST는 HTTP 프로토콜을 통해 API를 설계하기 위한 아키텍처 스타일입니다. 주요 장점은 뛰어난 유연성입니다. 개발자는 서버에서 웹 애플리케이션이나 사이트 사용자에게 직접 데이터를 제공해야 할 때마다 REST API를 사용합니다.
REST API의 주요 구성 요소:
REST API는 HTTP 요청을 통해 통신하여 데이터 생성, 읽기, 업데이트 및 삭제 기능을 완료합니다. CRUD 작업이라고도 합니다. REST는 요청된 리소스에 대한 정보를 제공하고 리소스 처리 방법을 설명하는 네 가지 방법을 사용합니다.
명사: 리소스의 위치를 정의하는 URL 모든 집에 고유한 주소가 있는 것처럼 각 리소스는 네트워크에서 고유한 위치를 갖습니다.
동사: 리소스에 대해 수행할 작업입니다.
Stateless. (Stateless)
pip install flask pip install flask-restful from flask import Flask from flask_restful import Resource, Api app = Flask(__name__) api = Api(app) class Helloworld(Resource): def __init__(self): pass def get(self): return { "Hello": "World" } api.add_resource(Helloworld, '/') if __name__ == '__main__': app.run(debug=True)ok 지금까지 첫 번째 Rest API가 생성되었습니다. 그러면 Flask-Restful이 무엇인가요? Flask Restful은 각 HTTP 메서드에 대한 메서드가 포함된 Resource 클래스를 정의합니다. 메소드 이름은 위 코드와 같이 해당 HTTP 메소드와 동일해야 하며 소문자로 작성되어야 합니다. 우리는 이러한 메서드에 경로 데코레이터가 없다는 것을 발견했습니다. 이는 리소스 라우팅을 기반으로 하기 때문입니다. 어떤 클래스가 정의되어 있든 add_resource 메소드를 사용하여 해당 클래스에 대한 경로를 정의하고 해당 경로에서 클래스를 호출할 수 있습니다. 참고: 위 코드에서는 먼저 필수 상위 클래스를 로드한 다음 앱과 API를 초기화합니다. 그 후, 우리는 프로그램을 만들었고 누군가 이 프로그램을 클릭하면 JSON 형식의 응답으로 Hello world를 받게 된다는 GET 요청을 만듭니다. 특정 URL을 열려면 리소스 추가 메소드를 사용하고 이를 기본 슬래시로 라우팅합니다. 이 파일을 실행하려면 API 유지 관리 도구인 POSTMAN 도구를 사용하여 API를 생성, 테스트 및 관리할 수 있습니다. 요청 모듈을 사용하여 다음 코드를 사용하여 이 API를 테스트할 수도 있습니다. 먼저 위 파일을 실행하면 localhost URL이 제공됩니다. 그런 다음 다른 명령 프롬프트에서 다음 코드 파일을 실행하세요.
import requests url = "http://127.0.0.1:5000/" response = requests.get(url=url) print(response.text) { "Hello": "World" }
通过以上内容的学习,相比大家已经对 REST API 有个初步印象。接下来我们将继续探索使用 REST API 的不同 HTTP 方法,其中我们定义一个列表,该列表将以字典(JSON 对象)的形式存储从服务器获取的所有数据。这是很重要的,因为我们在项目中有不同的api来获取数据,而不是其他地方的数据。
首先创建一个 API,在其中创建 3 个名为 GET、POST 和 DELETE 的 HTTP 方法,并且在其中创建一个自定义 URL,当请求 POST 方法时,它将以 Name 作为输入;在请求 GET 方法时,将名称返回;在DELETE时,如果该名称存在,我们将删除该名称,再次访问它会给我们 NULL。
创建一个文件并编写以下代码:
from flask import Flask from flask_restful import Resource, Api app = Flask(__name__) api = Api(app) data = [] class People(Resource): def get(self): for x in data: if x['Data'] == name: return x return {'Data': None} def post(self, name): temp = {'Data': name} data.append(temp) return temp def delete(self): for ind, x in enumerate(data): if x['Data'] == name: temp = data.pop(ind) return {'Note': 'Deleted'} api.add_resource(People, '/Name/') if __name__ == '__main__': app.run(debug=True)
打开 POSTMAN API 工具并点击每个 HTTP 方法请求。首先,当我们使用 post 请求Name时,它给了我们一个name。在获取请求时,我们将返回name。它在删除时被删除,当再次将其取回时,它会给你返回 NULL。
结果如下
我们使用带有 API 的装饰器来监控 IP 地址、cookie 等。我们将继续学习如何使用带有装饰器的Flask API。装饰器是一个将另一个函数作为参数并返回另一个函数的函数。也可以将其理解为在不改变或修改当前功能的情况下,为现有功能提供一些附加功能的功能。
这里我们创建一个新文件,我将通过创建两个装饰器来展示。在第一个文件中,编写返回代码执行时间的外部时间函数。我们从 functools 模块(用于高阶 python 函数的标准模块)导入应用于 wrapper 函数的 wrap 装饰器 。它通过复制所有参数来更新包装函数。
from flask import Flask from flask_restful import Resource, Api import datetime from flask import request from functools import wraps app = Flask(__name__) api = Api(app) def time(function=None): @wraps(function) def wrapper(*args, **kwargs): s = datetime.datetime.now() _ = function(*args, **kwargs) e = datetime.datetime.now() print("Execution Time : {} ".format(e-s)) return _ return wrapper class HelloWorld(Resource): @monitor def get(self): return {"hello": "world"} api.add_resource(HelloWorld, "/") if __name__ == "__main__": app.run(debug=True)
我们创建第二个装饰器来监视cookie和IP地址,因此创建下面的函数。不是向hello world函数添加时间装饰器,而是添加监视器装饰器并运行代码。
def monitor(function=None): @wraps(function) def wrapper(*args, **kwargs): _ = function(*args, **kwargs) print("Ip Address: {} ".format(request.remote_user)) print("Cookies : {} ".format(request.cookies)) print(request.user_agent) return _ return wrapper
当我们设计API时,我们也应该注意安全性,因为很多人会访问它。因为API可能包含一些双方之间的机密数据,因此我们可以指定只有授权的人可以访问API,那该怎么办?此时可以使用Flask基本身份验证。当然,此时需要使用pip命令安装这个flask模块。
pip install flask-httpauth
我们正在构建一个API并定义User数据字典,其中包含用户名和密码。当在实时用例中工作时,可以通过配置文件或从数据库中接受用户名和密码。首先,我们创建一个主要函数来匹配用户名和密码,并创建一个GET方法,该方法表示任何点击此API的人,如果没有登录,我们就无法访问数据。
from flask import Flask from flask_restful import Resource, Api from flask_httpauth import HTTPBasicAuth app = Flask(__name__) api = Api(app, prefix="/api/v1") auth = HTTPBasicAuth() USER_DATA = { "admin": "SuperSecretPwd" } #route to verify the password @auth.verify_password def verify(username, password): if not(username and password): return False return USER_DATA.get(username) == password class PrivateResource(Resource): @auth.login_required def get(self): return {"How's the Josh": "High"} api.add_resource(PrivateResource, '/private') if __name__ == '__main__': app.run(debug=True)
当我们使用POSTMAN运行上述文件时,我们会尝试在没有登录的情况下获取数据,以便给你演示未经授权的访问权限。
现在转到授权,并单击Basic authorization。输入用户名和密码,然后点击GET请求以获得所需的结果。
这是保护 Flask API 的方法,也是最基本的方法,当然还有更多更高级的方法,这里不做过多的介绍。
至此我们已经了解了如何保护我们的 API,在未经授权的登录禁止访问,但是如果我们还想知道访问者的位置(纬度和经度点)、IP 地址、服务器名称(例如访问API 的人的详细信息),我们还可以继续配置,使用 REST API 的基本flask跟踪应用程序。首先,使用 PIP 命令安装flask跟踪包。
pip install flask-track-usage
接下来看下该程序:
from flask import Flask, g app = Flask(__name__) app.config['TRACK_USAGE_USE_FREEGEOIP'] = False app.config['TRACK_USAGE_INCLUDE_OR_EXCLUDE_VIEWS'] = 'include' from flask_track_usage import TrackUsage from flask_track_usage.storage.printer import PrintWriter from flask_track_usage.storage.output import OutputWriter t = TrackUsage(app, [ PrintWriter(), OutputWriter(transform=lambda s: "OUTPUT: " + str(s)) ]) @t.include @app.route('/') def index(): g.track_var["optional"] = "Write_Something" return "Hello" #Run the application if __name__ == "__main__": app.run(debug=True)
该程序通过导入 Track Usage、Input writer 和 output writer 来创建一个跟踪应用程序。将flask app传递给 Track 包并使用输出编写器,并使用 lambda 函数以字符串格式写入输出。之后在 slash 上创建一个基本路由,并将跟踪应用程序作为装饰器包含在内。g 代表全局,表示数据在上下文中是全局的。因此,创建一个基本 API,它在浏览器返回"Hello",同时在后端获得所有人员的信息。
现在已经为案例创建了一个不错的REST API。尽管如此,我们还需要为REST API编写单元测试代码,因为从API中识别常见错误,并确保生产安全是至关重要的。
如下是创建一个名为run的新文件并开发以下简单API。
from flask import Flask from flask_restful import Resource, Api import json app = Flask(__name__) api = Api(app) class Helloworld(Resource): def __init__(self): pass def get(self): return json.dumps({"Message": "Fine"}) api.add_resource(Helloworld, '/') if __name__ == '__main__': app.run(debug=True)
现在创建另一个名为test的文件,在其中编写用于对API进行单元测试的代码。最常见的情况是执行以下三个基本单元测试。
from run import app import unittest class FlaskTest(unittest.TestCase): #Check for response 200 def test_inde(self): tester = app.test_client(self) #tester object response = tester.get("/") statuscode = response.status_code self.assertEqual(statuscode, 200) #check if the content return is application JSON def test_index_content(self): tester = app.test_client(self) response = tester.get("/") self.assertEqual(response.content_type, "application/json") #check the Data returned def test_index_data(self): tester = app.test_client(self) response = tester.get("/") self.assertTrue(b'Message' in response.data) if __name__ == '__main__': unittest.main()
如果你已经学习过网络爬虫,你应该知道 200 响应意味着对特定 URL 的请求已成功发出,并返回响应。
好了,这就是本文的全部内容。到这里我们已经学会了从头开始创建 Flask REST API ,并轻松安全地对其进行维护。
Flask 作为 Python Web 领域最为著名的轻量级 Web 开发框架,对于致力于 Web 开发的同学来说,掌握基本的 Flask 技能还是非常有必要的,你学会了吗?
위 내용은 비법을 가르쳐주세요! Python과 Flask로 REST API를 만들어보세요!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!