>  기사  >  백엔드 개발  >  비법을 가르쳐주세요! Python과 Flask로 REST API를 만들어보세요!

비법을 가르쳐주세요! Python과 Flask로 REST API를 만들어보세요!

王林
王林앞으로
2023-04-12 08:13:051473검색

비법을 가르쳐주세요! Python과 Flask로 REST API를 만들어보세요!

비법을 가르쳐주세요! Python과 Flask로 REST API를 만들어보세요!

REST API 소개

이것은 시작점 역할을 하는 REST API에 대한 간략한 소개일 뿐이며 관심 있는 친구는 이 연구의 범위에 포함되지 않습니다. 심층적인 학습을 위해 관련 자료를 확인해보세요. 또한 이 계정은 이 분야의 제출을 ​​허용합니다. 윤두준에게 문의하세요!

비법을 가르쳐주세요! Python과 Flask로 REST API를 만들어보세요!

API

API, 정식 이름은 애플리케이션 프로그래밍 인터페이스(Application Programing Interface) 간단히 말하면 제3자가 시스템 통신을 추가로 개발하고 자사 제품에 적용할 수 있도록 브랜드에서 개발한 인터페이스입니다. 상호 작용.

REST API

REST는 HTTP 프로토콜을 통해 API를 설계하기 위한 아키텍처 스타일입니다. 주요 장점은 뛰어난 유연성입니다. 개발자는 서버에서 웹 애플리케이션이나 사이트 사용자에게 직접 데이터를 제공해야 할 때마다 REST API를 사용합니다.

REST API의 주요 구성 요소:

  • 클라이언트 — 통신을 시작하는 사용자 측(기기에서)에서 시작된 클라이언트 또는 프로그램입니다.
  • 서버 — API를 사용하여 기능과 데이터에 액세스하는 서버입니다.
  • 리소스 — 서버에서 클라이언트로 전송되는 모든 콘텐츠(비디오, 텍스트, 이미지).

REST API는 HTTP 요청을 통해 통신하여 데이터 생성, 읽기, 업데이트 및 삭제 기능을 완료합니다. CRUD 작업이라고도 합니다. REST는 요청된 리소스에 대한 정보를 제공하고 리소스 처리 방법을 설명하는 네 가지 방법을 사용합니다.

    GET — 리소스 가져오기
  • DELETE — 리소스 삭제 자원.
  • RESTful API
  • REST, 전체 이름은 Representational State Transfer(프레젠테이션 레이어 상태 전송)이며, 디자인 스타일이며, RESTful은 명사 평화와 같은 형용사로 변환된 것입니다. RESTful은 이 사양에 따라 설계된 설명 API를 RESTful API라고 합니다.
RESTful API는 주로 세 가지 구성 요소로 구성됩니다.

명사: 리소스의 위치를 ​​정의하는 URL 모든 집에 고유한 주소가 있는 것처럼 각 리소스는 네트워크에서 고유한 위치를 갖습니다.

동사: 리소스에 대해 수행할 작업입니다.

    ontent 유형 리소스 표시 방법: API 리소스는 다양한 방식으로 표시될 수 있으며, 가장 일반적으로 사용되는 것은 가볍고 처리하기 쉬운 JSON입니다.
  • 따라서 RESTful 스타일로 설계된 API를 사용하면 다음과 같은 장점과 한계가 있습니다.
  • 리소스 위치를 나타내는 고유한 URL과 통합된 API 인터페이스가 있습니다. (균일한 인터페이스)

Stateless. (Stateless)

  1. Restful API 애플리케이션 앱을 통합하거나 Restful 웹 서비스와 상호 작용할 수 있습니다. 이제 이는 마이크로서비스 아키텍처에서 구성 요소를 연결하는 가장 일반적인 방법으로 성장하고 있습니다. API의 도움으로 우리는 웹사이트에 데이터를 가져오거나 보낼 수 있고 웹 서비스를 통해 작업을 완료하기 위한 일부 작업을 수행할 수 있습니다. 모든 웹사이트는 주식 시장 거래 웹사이트와 같이 다양한 유형의 API를 사용하며, API의 도움으로 현재 가격과 상승 및 하락 변동을 확인합니다.
  2. 첫 번째 REST API 만들기
마찬가지로 Hello world API도 만듭니다. 즉, get 요청을 하면 JSON 응답을 받게 됩니다. 일반적으로 API는 JSON 형식의 응답을 제공합니다. 다음으로 pip 패키지 관리자를 사용하여 Flask를 설치합니다.

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"
}

通过 Flask RESTApi 理解 HTTP 请求

通过以上内容的学习,相比大家已经对 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。

结果如下

비법을 가르쳐주세요! Python과 Flask로 REST API를 만들어보세요!

비법을 가르쳐주세요! Python과 Flask로 REST API를 만들어보세요!

비법을 가르쳐주세요! Python과 Flask로 REST API를 만들어보세요!

如何在 Flask REST API 中使用装饰器

我们使用带有 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

如何使 Flask API 更安全

当我们设计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运行上述文件时,我们会尝试在没有登录的情况下获取数据,以便给你演示未经授权的访问权限。

비법을 가르쳐주세요! Python과 Flask로 REST API를 만들어보세요!

现在转到授权,并单击Basic authorization。输入用户名和密码,然后点击GET请求以获得所需的结果。

비법을 가르쳐주세요! Python과 Flask로 REST API를 만들어보세요!

这是保护 Flask API 的方法,也是最基本的方法,当然还有更多更高级的方法,这里不做过多的介绍。

如何在 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。尽管如此,我们还需要为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进行单元测试的代码。最常见的情况是执行以下三个基本单元测试。

  • 检查响应码是否为200
  • 检查从API编写的内容是否为应用程序JSON格式
  • 检查我们正在访问的所有键是否都存在于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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제