2016-03-15 51 views
0

我正在使用一個(Django)網站,用戶可以上傳存儲在「受保護」目錄中的CSV文件(即不在/ media /中,因此用戶只能訪問自己的文件)。我想寫一個Python包,讓用戶從Python腳本中訪問他們的文件。做這件事的最好方法是什麼? (1)用戶使用他們的憑證「登錄」,(2)他們可以獲得他們的文件列表作爲一個字符串,(3)他們可以給一個文件名並獲得一個文件名熊貓數據幀作爲輸出。Django項目的簡單Python API

但從用戶的角度來看,該代碼可能是這個樣子:

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 /視圖登錄並傳回所需的數據。

+0

這不像你想象的那麼簡單。例如,「con」實際上包含什麼?它將如何管理用戶的登錄狀態,並在隨後的調用中將其發送回去? –

+0

據推測,con會保留用戶和密碼作爲類實例變量,並會爲每個操作重新發送它們。 –

+0

我希望我可以通過向每個API的url/views發佈請求提交用戶名和密碼。因此,'con.list_data()'會將用戶名和密碼發佈到www.mysite.com/api/list-data等。 – Malthus

回答

0

你可以考慮使用智威湯遜。一個端點/api/login/將在有效負載中採取usernamepassword對用戶進行身份驗證並返回JWT。 JWT可以包含用戶的一個pkpk以使其更簡單)(如果需要,還可以包含更多)。其他端點如/api/list_data//api/get_data//api/data/123/需要具有JWT jwt.from.api_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和智威湯遜的。
使用Django REST框架(以及restframework jwt)可能會有所幫助,但您自己可能會很好。