来自urllib的Django文件上传

时间:2017-09-20 14:57:41

标签: django authentication

我有一个小型django应用程序,您可以上传PDF文件。

过去只有人类才使用网络应用程序。

将来,脚本应该能够上传文件。

到目前为止,我们使用ModelBackend进行身份验证(settings.AUTHENTICATION_BACKENDS)

目标

脚本应该能够验证和上传文件

我目前的策略

我添加了一个新用户remote-system-foo并给他一个密码。

以某种方式登录django Web应用程序,然后通过脚本上传pdf文件。

我想将请求库用于http客户端脚本。

问题

  • 如何登录django Web应用程序?
  • 我目前的策略是正确的,还是有更好的策略?

3 个答案:

答案 0 :(得分:1)

您可以使用请求库登录任何站点,您当然需要根据您的站点所需的参数来定制POST。如果事情并非微不足道,请在登录您的网站时查看Chrome开发者工具中的帖子数据。以下是我用于登录网站的一些代码,可以轻松扩展以执行您需要的任务。

from bs4 import BeautifulSoup as bs
import requests


data = requests.session.get(page)
soup = bs(data.text, "lxml")

# Grab csrf token
# soup.find(...) or something

# The POST data for authorizing, this may or may not have been a django
# site, so see what your POST needs
data = {
    'user[login]': 'foo' ,
    'user[password]': 'foofoo',
    }

# Act like a computer, and insert token here, not with data!
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) 
           AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 
           Safari/537.36', 'X-CSRF-Token': token
}

requests.session.post('https://www.examplesite.com/users/sign_in', data=data, 
headers=headers)

现在,您的会话已登录,您应该能够上传您的pdf。但我从未试图通过请求上传。看看relevant requests documentation

话虽如此,这感觉就像一个奇怪的解决方案。您可以考虑将文件上载为fixtures或RunSQL,或者更确切地说,将它们的位置(例如AWS桶URL)上载到数据库。但对我来说这是一个新的领域。  希望它有所帮助。

答案 1 :(得分:0)

我们现在使用此库:https://github.com/hirokiky/django-basicauth

通过这种方式,我们将http-basic-auth用于API视图,并将session / cookie auth用于交互式人类。

答案 2 :(得分:0)

由于我找不到匹配的解决方案,我写了并发表了这个:

https://pypi.python.org/pypi/tbzuploader/

  

通用http上传工具。

     

如果http上传成功,则文件将移至“完成”子   。目录

     

如果服务器,tbzuploader认为上传成功   回复,http状态为201创建

     

其他功能:处理文件对。

     

例如,您有四个文件:a.pdf,a.xml,b.pdf,b.xml

     

第一次上传应该是a.pdf和a.xml,第二次上传   b.pdf和b.xml,然后阅读-patterns的文档。