0

我正在尝试制作一个可以执行以下操作的程序:

  • 检查 auth_file 是否存在
    • 如果是 -> 读取文件并尝试使用该文件中的数据登录 - 如果数据错误 -> 请求新数据
    • 如果没有 -> 请求一些数据,然后创建文件并用请求的数据填充它

至今:

import json
import getpass
import os
import requests
filename = ".auth_data"
auth_file = os.path.realpath(filename)
url = 'http://example.com/api'
headers = {'content-type': 'application/json'}

def load_auth_file():
    try:
        f = open(auth_file, "r")
        auth_data = f.read()
        r = requests.get(url, auth=auth_data, headers=headers)
        if r.reason == 'OK':
            return auth_data
        else:
            print "Incorrect login..."
            req_auth()
    except IOError:
        f = file(auth_file, "w")
        f.write(req_auth())
        f.close()


def req_auth():
    user = str(raw_input('Username: '))
    password = getpass.getpass('Password: ')
    auth_data = (user, password)
    r = requests.get(url, auth=auth_data, headers=headers)
    if r.reason == 'OK':
        return user, password
    elif r.reason == "FORBIDDEN":
        print "Incorrect login information..."
        req_auth()
    return False

我有以下问题(理解和应用正确的方法):

  • 我找不到将返回的数据从 req_auth() 存储到 auth_file 的正确方法,该格式可以在 load_auth 文件中读取和使用

PS:当然,我是 Python 的初学者,我确定我在这里错过了一些关键元素 :(

4

2 回答 2

1

读写数据,可以使用json:

>>> with open('login.json','w') as f:
        f.write(json.dumps({'user': 'abc', 'pass': '123'}))

>>> with open('login.json','r') as f:
        data=json.loads(f.read())
>>> print data
{u'user': u'abc', u'pass': u'123'}

我建议的一些改进:

  1. 有一个测试登录的功能(参数:用户,密码)并返回真/假
  2. 将数据保存在 req_data 中,因为 req_data 仅在数据不正确/缺失时才会被调用
  3. 向 req_data添加一个可选参数tries=0,并针对它进行最大尝试次数测试

(1):

def check_login(user,pwd):
    r = requests.get(url, auth=(user, pwd), headers=headers)
    return r.reason == 'OK':

对于 (2),您可以使用 json(如上所述)、csv等。这两者都非常简单,尽管 json 可能更有意义,因为您已经在使用它。

对于(3):

def req_auth(tries = 0) #accept an optional argument for no. of tries
    #your existing code here
    if check_login(user, password):
        #Save data here
    else:
        if tries<3: #an exit condition and an error message:
            req_auth(tries+1) #increment no. of tries on every failed attempt
        else:
            print "You have exceeded the number of failed attempts. Exiting..."
于 2012-10-06T03:16:15.967 回答
0

有几件事我会以不同的方式处理,但你已经有了一个好的开始。

我最初不会尝试打开文件,而是检查它是否存在:

if not os.path.isfile(auth_file):

接下来,当您编写输出时,您应该使用上下文管理器:

with open(auth_file, 'w') as fh:
    fh.write(data)

最后,作为一个开放的存储(不是非常安全),将您保存的信息以json格式保存可能会很好:

userdata = dict()
userdata['username'] = raw_input('Username: ')
userdata['password'] = getpass.getpass('Password: ')
# saving
with open(auth_file, 'w') as fho:
    fho.write(josn.dumps(userdata))
# loading
with open(auth_file) as fhi:
    userdata = json.loads(fhi.read())
于 2012-10-06T03:03:17.233 回答