Django项目的简单Python API
我正在开发一个(Django)网站,用户可以上传存储在“受保护”目录中的CSV文件(即不在/media/中,因此用户只能访问自己的文件)。我想编写一个Python包,允许用户从Python脚本中访问他们的文件。做这件事最好的方法是什么 这些要求基本上是:(1)用户使用他们的凭据“登录”,(2)他们可以获得一个字符串形式的文件列表,以及(3)他们可以给出一个文件名并获得一个数据帧作为输出 从用户的角度来看,代码可能如下所示:Django项目的简单Python API,python,django,Python,Django,我正在开发一个(Django)网站,用户可以上传存储在“受保护”目录中的CSV文件(即不在/media/中,因此用户只能访问自己的文件)。我想编写一个Python包,允许用户从Python脚本中访问他们的文件。做这件事最好的方法是什么 这些要求基本上是:(1)用户使用他们的凭据“登录”,(2)他们可以获得一个字符串形式的文件列表,以及(3)他们可以给出一个文件名并获得一个数据帧作为输出 从用户的角度来看,代码可能如下所示: import my_api # User logs in con =
import my_api
# User logs in
con = my_api.connect(user="jim", password="password")
# Print list of file names
con.list_data()
# Get pandas dataframe for "File_Name"
df = con.get_data(filename="File_Name")
考虑到我有限的需求,我不知道像Django Rest框架这样的东西是否合适。我只需要登录用户,然后有两个URL /视图,“识别”用户登录并传递所需的数据。 < P>可以考虑使用JWT。一个端点
/api/login/
将在有效负载中使用用户名
和密码
对用户进行身份验证并返回JWT。JWT可以包含用户的pk
(pk
,使其变得简单)(如果需要,还可以包含更多)。其他端点,如/api/list\u data/
、/api/get\u data/
或/api/data/123/
,需要使用带有JWT JWT.from.api\u login
的授权头。它将对JWT进行解码,从它的有效载荷中获取用户pk
,并知道哪个用户在请求。my_api
客户端可能看起来像:
import requests
class MyApi(object):
base_api_url = 'http://myapi.local:8000'
_token = None
def _login(self, token):
self._token = token
@property
def _auth_header(self):
if self._token is None:
raise Exception('fetch the token first!')
return {'Authorization': 'JWT {}'.format(self._token)}
def call_login(self, username, password):
response = requests.post(
'/api/login/', json={
'username': username,
'password': password,
}
)
response.raise_for_status()
self._login(response.json()['token'])
def call_list_data(self):
response = requests.post(
'/api/login/', headers=self._auth_header
)
response.raise_for_status()
return response.json()
这只是我的方法-我不喜欢训练,我喜欢REST和JWT。使用Django REST框架(以及REST框架jwt)可能会有所帮助,但您自己可能会做得很好 这并不像你想象的那么简单。例如,
con
实际上由什么组成?它将如何管理用户的登录状态,并在后续调用中将其发送回?据推测,con将保留用户和密码作为类实例变量,并在每次操作中重新发送它们。我希望我可以通过post请求向每个API的URL/视图提交用户名和密码。因此,con.list_data()
会将用户名和密码发布到www.mysite.com/api/list-data等@JohnGordon-这是正确的。requests
包允许您使用同一会话重复进行http请求。如果将会话对象保存在con
中,则不必每次都重新发送登录凭据