Django项目的简单Python API

Django项目的简单Python API,python,django,Python,Django,我正在开发一个(Django)网站,用户可以上传存储在“受保护”目录中的CSV文件(即不在/media/中,因此用户只能访问自己的文件)。我想编写一个Python包,允许用户从Python脚本中访问他们的文件。做这件事最好的方法是什么 这些要求基本上是:(1)用户使用他们的凭据“登录”,(2)他们可以获得一个字符串形式的文件列表,以及(3)他们可以给出一个文件名并获得一个数据帧作为输出 从用户的角度来看,代码可能如下所示: import my_api # User logs in con =

我正在开发一个(Django)网站,用户可以上传存储在“受保护”目录中的CSV文件(即不在/media/中,因此用户只能访问自己的文件)。我想编写一个Python包,允许用户从Python脚本中访问他们的文件。做这件事最好的方法是什么

这些要求基本上是:(1)用户使用他们的凭据“登录”,(2)他们可以获得一个字符串形式的文件列表,以及(3)他们可以给出一个文件名并获得一个数据帧作为输出

从用户的角度来看,代码可能如下所示:

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
中,则不必每次都重新发送登录凭据